Isaac Sim 9 物理(1)

news2025/1/23 10:32:39

使用Python USD API 来实现 Physics 。

以下内容中,大部分 Python 代码可以在 Physics Python 演示脚本文件中找到,本文仅作为个人学习笔记。

一.设置 USD Stage 和物理场景

        Setting up a USD Stage and a Physics Scene

        USD Stage不知道怎么翻译,就是放置USD文件的地方,Isaac Sim软件和官方文档全英文,就算翻译了官方文档回去使用软件也全是英文...英语菜狗,啃的累死我了...

from pxr import Usd, UsdGeom, UsdPhysics, UsdShade, Sdf, Gf, Tf

# Set up a USD Stage to define what is the up axis and set up the units,
# which is crucial, as some default simulation parameters are derived
# from the MetersPerUnit value
# 单位0.01m
stage = omni.usd.get_context().get_stage()
UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.z)
UsdGeom.SetStageMetersPerUnit(stage, 0.01)

# Physics scene definition
scene = UsdPhysics.Scene.Define(stage, "/physicsScene")

# setup gravity
# note that gravity has to respect the selected units, if we are using cm, the gravity has to respect that
# 重力方向,下;重力大小,9.81m/s^2
scene.CreateGravityDirectionAttr().Set(Gf.Vec3f(0.0, 0.0, -1.0))
scene.CreateGravityMagnitudeAttr().Set(981.0)

二.创建碰撞体

        Creating Colliders 

# Cube path
cubeActorPath = "/cubeActor"

# Cube parameters like size, position, orientation
# 这个500测试发现实在太高了,第一次做的时候转一圈都没找到Cube,自己用设置10,50之类的就行
size = 25.0
position = Gf.Vec3f(0.0, 0.0, 500.0)
orientation = Gf.Quatf(1.0)
color = Gf.Vec3f(71.0 / 255.0, 105.0 / 255.0, 1.0)

# define the cube geom(几何)
cubeGeom = UsdGeom.Cube.Define(stage, cubeActorPath)
cubeGeom.CreateSizeAttr(size)
cubeGeom.AddTranslateOp().Set(position)
cubeGeom.AddOrientOp().Set(orientation)
cubeGeom.AddScaleOp().Set(Gf.Vec3f(1.0))
cubeGeom.CreateDisplayColorAttr().Set([color])

# get the prim
cubePrim = stage.GetPrimAtPath(cubeActorPath)

# setup collision, so that the cube does collider
UsdPhysics.CollisionAPI.Apply(cubePrim)

三.不同的碰撞体和渲染表现 

        Different Collision and Rendering Representations 

        必须创建两个不同的几何体,其中一个用于碰撞,另一个用于渲染(这里也可以理解为展示,一个作为碰撞箱隐藏,一个可以观察)。两个几何体的父 xform 应该设置为刚体,使它们能够一起移动。

# Top level actor, contains rigid body
rigidCompoundPath = "/compoundRigid"
rigidXform = UsdGeom.Xform.Define(stage, rigidCompoundPath)
rigidPrim = stage.GetPrimAtPath(rigidCompoundPath)

# Rigid body transform
rigidCompoundPos = Gf.Vec3f(0.0, 0.0, 10.0)
rigidXform.AddTranslateOp().Set(rigidCompoundPos)
rigidXform.AddOrientOp().Set(Gf.Quatf(1.0, 0.0, 0.0, 0.0))

physicsAPI = UsdPhysics.RigidBodyAPI.Apply(rigidPrim)

# Collision shape
collisionShape = rigidCompoundPath + "/physicsBoxShape"

size = 25.0
shapePos = Gf.Vec3f(0.0)
shapeQuat = Gf.Quatf(1.0)

cubeGeom = UsdGeom.Cube.Define(stage, collisionShape)
cubePrim = stage.GetPrimAtPath(collisionShape)
cubeGeom.CreateSizeAttr(size)
cubeGeom.AddTranslateOp().Set(shapePos)
cubeGeom.AddOrientOp().Set(shapeQuat)

# set it as collision
UsdPhysics.CollisionAPI.Apply(cubePrim)

# hide it from rendering
cubeGeom.CreatePurposeAttr(UsdGeom.Tokens.guide)

# rendering shape
renderSphere = rigidCompoundPath + "/renderingSphere"

sphereGeom = UsdGeom.Sphere.Define(stage, renderSphere)
#sphereGeom.CreateSizeAttr(20.0)
sphereGeom.AddTranslateOp().Set(shapePos)
sphereGeom.AddOrientOp().Set(shapeQuat)

四.物理材料 

        Physics Materials

        每个碰撞器都可以分配不同的物理材料。UsdPhysicsMaterialAPI 可以应用于任何其他材料,并且此 API 添加了物理材料属性,如静态/动态摩擦。要将材料分配给碰撞器,请使用具有“物理”目的的材料绑定。

# define physics material
materialPath = "/material"
mu = 1.0
UsdShade.Material.Define(stage, materialPath)
material = UsdPhysics.MaterialAPI.Apply(stage.GetPrimAtPath(materialPath))
material.CreateStaticFrictionAttr().Set(mu)
material.CreateDynamicFrictionAttr().Set(mu)
material.CreateRestitutionAttr().Set(0.0)
material.CreateDensityAttr().Set(1000.0)

collisionAPI = UsdPhysics.CollisionAPI.Get(stage, collisionShape)

# add the material to the collider
bindingAPI = UsdShade.MaterialBindingAPI.Apply(collisionAPI.GetPrim())
materialPrim = material.GetPrim()
material = UsdShade.Material(materialPrim)
bindingAPI.Bind(material, UsdShade.Tokens.weakerThanDescendants, "physics")

五.使用凸网格进行圆柱和圆锥碰撞

        Using Convex Mesh for Cylinder and Cone Collision

        UsdGeom.Cylinder 和 UsdGeom.Cone prims 的碰撞默认近似为自定义几何体,以获得更高的精度。但是,您可以通过在碰撞部分下的物理设置中禁用相应的切换来将它们设置为使用凸网格。

        注意:您还可以使用 Omniverse Create 内置的圆锥和圆柱网格几何体进行凸近似。这允许您细粒度控制是否应使用凸近似或自定义几何体碰撞器模拟单个几何体。

        原文:

        UsdGeom.Cylinder and UsdGeom.Cone prims’ collision is by default approximated as custom geometry for higher precision. However, you can set them to use convex mesh instead by disabling the corresponding toggles in the Physics settings under the collision section.

        Note: you can also use the Omniverse Create built-in cone and cylinder mesh geometries for convex approximation. This allows you to fine grain control whether individual geometry should be simulated with a convex approximation or custom geometry collider.

        我想应该可以对单个物体模块进行精细修改...还没试呢,晚上找个时间弄弄看。

六.刚体

         Rigid Bodies

        刚体在 Physics 架构中表示为应用于 xformable Prim 的 UsdPhysicsRigidBodyAPI 架构。

# Cube path
cubeActorPath = "/cubeActorRigid"

# Cube parameters like size, position, orientation
size = 25.0
position = Gf.Vec3f(0.0, 0.0, 500.0)
orientation = Gf.Quatf(1.0)
color = Gf.Vec3f(71.0 / 255.0, 105.0 / 255.0, 1.0)

# initial velocities
linVelocity = Gf.Vec3f(2.0, 1.0, 2.0)
angularVelocity = Gf.Vec3f(1.0, 0.0, 0.0)

# define the cube geom
cubeGeom = UsdGeom.Cube.Define(stage, cubeActorPath)
cubeGeom.CreateSizeAttr(size)
cubeGeom.AddTranslateOp().Set(position)
cubeGeom.AddOrientOp().Set(orientation)
cubeGeom.AddScaleOp().Set(Gf.Vec3f(1.0))
cubeGeom.CreateDisplayColorAttr().Set([color])

# get the prim
cubePrim = stage.GetPrimAtPath(cubeActorPath)

# setup collision, so that the cube does collider
UsdPhysics.CollisionAPI.Apply(cubePrim)

# setup physics - rigid body
rigidBodyAPI = UsdPhysics.RigidBodyAPI.Apply(cubePrim)

# apply initial velocities
rigidBodyAPI.CreateVelocityAttr().Set(linVelocity)
rigidBodyAPI.CreateAngularVelocityAttr().Set(angularVelocity)

在仿真过程中,如果要更改刚体的线速度,则必须更改 UsdPhysicsRigidBodyAPI 的速度属性:

rigidBodyAPI.CreateVelocityAttr().Set(newVelocity)

6.1 刚体质量属性

        Rigid Body Mass Properties

        UsdPhysicsMassAPI 定义了刚体的质量属性。UsdPhysicsMassAPI 可以应用于具有 UsdPhysicsRigidBodyAPI 或 USdPhysicsCollisionAPI 的 Prim。它提供了多种定义刚体质量属性的方法:

        physics:mass:质量属性。注意,任何子 Prim 在应用 UsdPhysicsMassAPI 时也可以具有质量属性。在这种情况下,优先规则是“父级质量属性覆盖子级的质量属性”。这可能有些反直觉,因为质量是一个计算得到的量,通常不是累积的。例如,如果父级的质量为 10,而两个子级中的一个质量为 20,允许子级的质量覆盖父级的质量将导致另一个子级的质量为 -10。

        physics:density:密度属性。在刚体物理学的背景下,密度间接地通过公式(质量 = 密度 × 对象的体积)来设置质量。在同时指定密度和质量的情况下,质量具有优先权。与质量不同,子级 Prim 的密度将覆盖父级 Prim 的密度。注意,collisionAPI 的密度也可以通过 physicsMaterial 关系来设置。材料密度在密度定义中具有最弱的优先级。注意,密度遵循单位。因此,对于单位为 1 的水密度为 1000,对于单位为 0.01,水密度为 0.001。

        physics:centerOfMass:Prim 本地空间中的质心。

        physics:diagonalInertia:未旋转状态下对角化惯性张量。

        physics:principalAxes:惯性张量主轴的方向(四元数表示),在 Prim 的本地空间中。

        解析代码会收集每个碰撞形状的质量属性,并使用计算出的惯性张量来计算体的最终质量属性。如果未找到任何 massAPI,则使用默认密度 1000 来确定最终的质量。

# Cube path
cubeActorPath = "/cubeActorRigidMass"

# Cube parameters like size, position, orientation
size = 25.0
position = Gf.Vec3f(0.0, 0.0, 500.0)
orientation = Gf.Quatf(1.0)
color = Gf.Vec3f(71.0 / 255.0, 105.0 / 255.0, 1.0)

# define the cube geom
cubeGeom = UsdGeom.Cube.Define(stage, cubeActorPath)
cubeGeom.CreateSizeAttr(size)
cubeGeom.AddTranslateOp().Set(position)
cubeGeom.AddOrientOp().Set(orientation)
cubeGeom.AddScaleOp().Set(Gf.Vec3f(1.0))
cubeGeom.CreateDisplayColorAttr().Set([color])

# get the prim
cubePrim = stage.GetPrimAtPath(cubeActorPath)

# setup collision, so that the cube does collider
UsdPhysics.CollisionAPI.Apply(cubePrim)

# setup physics - rigid body, so that cube does simulate as a rigid body
UsdPhysics.RigidBodyAPI.Apply(cubePrim)

# custom center of mass
massAPI = UsdPhysics.MassAPI.Apply(cubePrim)
massAPI.CreateCenterOfMassAttr().Set(Gf.Vec3f(0.0, 0.0, 10.0))

七.静态体和动态体的区别

        Difference Between a Static Body and a Dynamic Body

        如果找到具有 UsdPhysicsCollisionAPI 的 Geom Prim,则它可以属于静态实体或动态实体。决定的逻辑是这样的:

  • 如果层次结构中的 prim 或任何父 Prim 上没有应用 UsdPhysicsRigidBodyAPI,则具有 UsdPhysicsCollisionAPI 的几何体将被视为静态实体。

  • 还:

    1. 如果 physics:rigidBodyEnabled 属性为 true(默认值),则几何属于动态实体。

    2. 否则,Geom 属于静态实体。

八.运动体

        Kinematic Body

        如果需要通过动画或用户定义的目标位置来驱动身体,则应将 UsdPhysicsRigidBodyAPI 上的 physics:kinematicEnabled 属性设置为 true。

九.CPU 与 GPU 刚体动力学

        CPU vs GPU Rigid Body Dynamics

        默认情况下,在 GPU 上执行刚体仿真。可以在 Physics Debug 窗口中或使用场景属性覆盖管道。 为了使用 CPU 仿真,请在 UsdPhysicsScene prim 中添加一个 PhysxSceneAPI 并设置以下属性:

  • physxScene:broadphaseType - MBP

  • physxScene:enableGPUDynamics - 错误

对于 GPU 模拟,第一个设置为 GPU,第二个设置为 True。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1869377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开放式耳机怎么选?2024全价位段机型推荐,真人实测不踩雷

作为一位深度测评耳机的专家,我深知对于音乐制作人员而言,优选一副适宜的耳机是至关重要的。我的一位朋友,身为音乐编辑,常常需长时间戴着耳机进行音频编辑与混音。他尝试了众多开放式耳机后,仍未找到完美契合的款式。…

使用 go-control-plane 自定义服务网格控制面

写在前面 阅读本文需要最起码了解envoy相关的概念 本文只是一个类似于demo的测试,只为了学习istio,更好的理解istio中的控制面和数据面(pilot -> proxy)是如何交互的,下图的蓝色虚线 先说go-control-plane是什么…

安宝特方案 | AR术者培养:AR眼镜如何帮助医生从“看”到“做”?

每一种新药品的上市都需要通过大量的临床试验,而每一种新的手术工具在普及使用之前也需要经过反复的实践和验证。医疗器械公司都面临着这样的挑战:如何促使保守谨慎的医生从仅仅观察新工具在手术中的应用,转变为在实际手术中实操这项工具。安…

简化收支记录,只留关键日期! 一键掌握财务流动,高效管理您的每一笔收支

在繁忙的生活中,管理个人或家庭的财务收支变得尤为重要。然而,传统的记账方式往往繁琐且复杂,让人望而却步。今天,我们为您推荐一款简洁易用的记账神器——晨曦记账本,让您轻松记录收支,只显示日期&#xf…

三种三相交流电动机正反转互锁电路的分析

PLC和固态继电器应用都很普及了,常规电磁继电器还有用武之地吗?答案是:有用武之地的。因为微处理器的应用使逻辑控制发生了变革,极大地发挥了开关功能的特性,但在应用中,它还是无法承受较大的负载,因此还要…

PyTorch的环境配置和安装

PyTorch环境配置及安装 初步机器学习,这里记录下一些学习经过,之后以便于自己查看,同时欢迎各位大佬点评,本节是机器计算的一个包的安装和简单验证。 安装、使用环境 Windows环境下:CUDA官网使用IDM下载就很快乐&am…

3 滑动窗口

滑动窗口是一种常用的数据结构和算法思想,广泛应用于处理数组或序列中的连续片段问题。它的核心特点是窗口的大小可以动态调整,但总保持一个固定大小,通过在序列上“滑动”来检查不同的子序列。以下是滑动窗口的一些典型应用场景:…

帝国cms未审核文章可视化预览效果

有时候为了让编辑更加清楚的看到别人审核之后的效果,同时文章有需要下一级审核才能在前端展示出来,今天就来展示一个未审核文章预览审核后的效果 这次给某出版社开发的时候,他们需要实现编辑能够预览自己发布之后的审核效果,所以就…

想学gis开发,java和c++那个比较好?

ava与C的应用场景不同,究竟选择谁,应该由开发者的兴趣方向来决定。 你选择Java,意味着以后的业务方向就是偏后台服务开发,如果你非得说我用java也可以写界面,对不起,别人不会。 刚好我有一些资料&#xf…

从源码到上线:直播带货系统与短视频商城APP开发全流程

很多人问小编,一个完整的直播带货系统和短视频商城APP是如何从源码开发到最终上线的呢?今天,笔者将详细介绍这一全过程。 一、需求分析与规划 1.市场调研与需求分析:首先需要进行市场调研,了解当前市场的需求和竞争情…

移动端 UI 风格,书写华丽篇章

移动端 UI 风格,书写华丽篇章

电阻代码的谐音助记口诀

整理电子信息的课设,发现当时的笔记,记录一下,时间过得真快啊。 01234黑棕红橙黄 56789绿蓝紫灰白 银色和金色代表误差, 银色百分之十 金色百分之五 可以这么理解,运动会奖牌,金牌比银牌等级高&#xff…

简过网:考公务员报班和不报班的区别大吗?

备考公务员,究竟是报班还是不报班呢?一篇文章让你看看两者之间的区别! 报不报班,其实这是很多考生都会纠结的地方,其实小编还是建议报个班的,这不仅仅是因为我是做这个行业的,更是因为这么长时…

用Microsoft.Extensions.Hosting 管理WPF项目.

首先引入必要的包: <ItemGroup><PackageReference Include"CommunityToolkit.Mvvm" Version"8.2.2" /><PackageReference Include"Microsoft.Extensions.Hosting" Version"8.0.0" /><PackageReference Include&q…

工商银行:低息差下的挣扎

时隔四年&#xff0c;市值再度超越贵州茅台成为A股“股王”。 今天要说的就是“宇宙行”——中国工商银行 虽然茅台的信仰开始崩塌&#xff0c;但各大银行股巨头们今年也不好过。2024年一季度六大行业绩集体受挫&#xff0c;息差普遍收窄超过20个基点。其中&#xff0c;包括工…

grpc学习golang版(六、服务器流式传输)

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 文章目录 一、前言二、定义proto文件三、拷贝任意文件进项目四、编写server服务端五、编写client客户端六、测试六、示…

LLM RAG with Agent

题意&#xff1a;基于代理的LLM检索增强生成 问题背景&#xff1a; I was trying the application code in the link. 我正在尝试链接中的应用程序代码。 I am using the following Llang Chain version 我正在使用以下Llang Chain版本 langchain 0.0.327 langchain-commun…

UE学习笔记--UE项目,IDE提示项目被卸载的解决方案

前言 我用的 IDE 是 Rider。 我不小心把 Intertmediate 文件夹给删掉了。 然后进入 Rider&#xff0c;报了一些错&#xff0c;然后编译也有问题。启动不了 UE。 解决办法 右键你的 uproject&#xff0c;点击 Generate visual studio project files。 让它重新生成对应的文件…

Windows11+CUDA12.0+RTX4090如何配置安装Tensorflow2-GPU环境?

1 引言 电脑配置 Windows 11 cuda 12.0 RTX4090 由于tensorflow2官网已经不支持cuda11以上的版本了&#xff0c;配置cuda和tensorflow可以通过以下步骤配置实现。 2 步骤 &#xff08;1&#xff09;创建conda环境并安装cuda和cudnn&#xff0c;以及安装tensorflow2.10 con…

ManageEngine连续荣登Gartner 2024年安全信息和事件管理魔力象限

我们很高兴地宣布&#xff0c;ManageEngine再次在Gartner的安全信息和事件管理&#xff08;SIEM&#xff09;魔力象限中榜上有名&#xff0c;这是我们连续第七年获得这一认可。 Gartner ManageEngine Log360是一款全面的SIEM解决方案&#xff0c;旨在帮助组织有效处理日志数据…