Nvidia Isaac Sim 入门教程 2024
版权信息
Copyright 2023-2024 Herman Ye@Auromix. All rights reserved.
This course and all of its associated content, including but not limited to text,
images, videos, and any other materials, are protected by copyright law.
The author holds all rights to this course and its contents.
Any unauthorized use, reproduction, distribution, or modification of this course
or its contents is strictly prohibited and may result in legal action.
This includes, but is not limited to:
Copying or distributing course materials without express written permission.
Reposting, sharing, or distributing course content on any platform without proper attribution and permission.
Creating derivative works based on this course without permission.
Permissions and Inquiries
If you wish to use or reproduce any part of this course for purposes other than personal learning,
please contact the author to request permission.
The course content is provided for educational purposes, and the author makes no warranties or representations
regarding the accuracy, completeness, or suitability of the course content for any specific purpose.
The author shall not be held liable for any damages, losses,
or other consequences resulting from the use or misuse of this course.
Please be aware that this course may contain materials or images obtained from third-party sources.
The author and course creator diligently endeavor to ensure that these materials
are used in full compliance with copyright and fair use regulations.
If you have concerns about any specific content in this regard,
please contact the author for clarification or resolution.
By enrolling in this course, you agree to abide by the terms and conditions outlined in this copyright notice.
学习目标
- 熟悉Isaac Sim中物理场景的创建与处理
- 熟悉Isaac Sim中仿真对象的创建与处理
- 熟悉Isaac Sim中USD文件的创建与处理
难度级别
初级 | 中级 | 高级 |
---|---|---|
√ |
预计耗时
50 mins
学习前提
对象 | 类型 | 状态 |
---|---|---|
Ubuntu22.04操作系统 | 软件 | 已确认 |
Isaac Sim环境 | 软件 | 已配置 |
Isaac Sim基本概念 | 知识 | 已了解 |
Isaac Sim基本使用 | 知识 | 已了解 |
在进行机器人仿真时,搭建一个相对真实的仿真环境是很重要的。一个完整的仿真环境不仅能提高仿真的精确度,还能提供更为直观的可视化效果。
接下来,我们将讨论如何创建这样一个场景。
物理环境
添加物理场景
在仿真中,物体通常受到各种物理力,时间也在不断地流逝,通常来说,世界需要一般的物理模拟属性,例如重力和物理时间的步进,依次点击Create
->Physics
->Physics scene
来添加物理场景
随后,在Property
->Physics
里修改这个物理环境的基本属性,因为这是简单的测试,所以不需要GPU的强大能力,取消选中Enable GPU Dynamics
,并将Broadphase Type改为MBP
注意:如果你对这些概念感到疑惑,可以参考相关知识章节。
添加地面
与其他仿真软件类似,Isaac Sim 也需要在仿真场景中添加地面。即使设置了重力等物理环境参数,并在开始仿真前将物体置于合适的位置,如果场景中缺乏地面,物体将会穿过地平面持续坠落。
依次点击Create
->Physics
->Ground Plane
来添加一个地面
可以看到地面被添加了,通过鼠标中间
缩放,发现地面只有一部分,这是因为超出范围的地面不需要渲染,以此减少性能开销,但即使是在不可视的地面,依然会有碰撞属性,物体在坠落到地面时不会再继续向下坠落。
添加光照
每个Stage都带有默认的环境光照(defaultLight),否则看不见东西。
此时我们来尝试添加另一个光照,来感受光照对于环境和物体的影响。
依次选择Create
->Light
->Dome Light
来添加一个均匀环境光
DomeLight 模拟了从所有方向照射到场景中的均匀光源,类似于天空光。
DomeLight 通常用于创建自然的、全方位的环境照明效果,以提升场景的真实感。
因为默认光照较强,此时在属性面板中将新添加的均匀环境光的颜色更改为浅绿色,这样可以使得测试对比更清晰明了。
仿真对象
添加仿真物体
在菜单中创建一个普通的立方体(Cube Mesh)作为搭建仿真环境中的测试仿真对象。
再添加一些其他的物体,并且将这些物体随意放置,可以让其中一些悬空,方便观察在重力作用下从初始位置坠落到地面,和地面发生接触的过程。
添加刚体和碰撞体属性
尝试点击Isaac Sim左侧的工具栏中的Play来使仿真开始步进。
令人疑惑的是,这些物体并没有按预料中的方式下坠,这是因为虽然设置了物理环境,但并没有设置仿真物体自身的物理属性,因此它们并不遵循物理规律。
接下来,为这些物体添加带有预设碰撞体配置的刚体属性(Rigid Body with Colliders Preset)
在Stage
中批量选中物体,并添加Physics
里的Rigid Body with Colliders Preset
。
观察添加完刚体和碰撞体的方块的属性面板,在Physics
下能够发现新增的RigidBody
和Collider
属性,可以发现刚体属性所带来的一些更细的如角速度、线速度的新属性,以及以Covex Hull
(凸包)等方式进行碰撞体近似的碰撞体属性。
依次选中GUI界面中的眼睛
->Show By Type
->Physics
->Colliders
->All
来在视口Viewport中启用碰撞体可见模式,观察绿色线条,这是Isaac Sim对于仿真对象的碰撞体的可视化。
此时再次点击Isaac Sim左边的Play按钮,将会观察到悬空的物体在时间开始流动时不断下坠,直到撞击地面。
添加物理材质
对于需要涉及到摩擦力等的问题,例如箱子在斜坡上滑动,机器人夹爪夹取物体,仿真器给定的物理材质在其中起到了重要的作用。
依次点击Create
->Physics
->Physics Material
来创建一个物理材质
在添加物理材质时会提示不同类型材质的选项,"rigid body material"
、"deformable body material"
和"PBD Particle Material"
是可选的三种类型。
-
Rigid Body Material(刚体材质)
- 刚体材质用于模拟刚性物体,这些物体不会发生形变,其形状在运动过程中保持不变。
- 刚体通常用于模拟硬物体,如石头、金属、木头等。
- 物体之间的碰撞会产生弹性反应,而且刚体通常不会发生变形。
-
Deformable Body Material(可变形材质)
- 可变形材质用于模拟具有弹性的物体,它们可以发生形变,如橡胶、布料、软泥等。
- 这些物体在受到外部力或碰撞时可以发生形状的变化,通常会遵循弹性和塑性行为。
- 通常需要更复杂的物理模型来模拟可变形物体的行为,如有限元分析。
-
PBD Particle Material(基于粒子的动力学材质)
- PBD(Position-Based Dynamics)是一种用于模拟可变形和弹性物体的方法,通常用于模拟细粒度的物体,如液体、布料等。
- PBD通过在模拟中使用一组粒子来表示物体,并应用基于位置的动力学来模拟其行为,可以处理大变形和复杂物体。
- PBD通常比传统的有限元分析更高效,但也可能缺少精确性。
在这里,方块等物体被视作普通的刚体,因此在PhysicsMaterial
的资产中选择Rigid Body Material
。
在新引入的PhysicsMaterial
的Property
面板里的Physics
里将会发现刚体材料相关的一些属性,例如动摩擦力、静摩擦力等,这些属性可以被设置。
随后我们将新引入的PhysicsMaterial
赋予给方块Cube
,找到方块Cube
的属性面板Physics
下的Physics Materials on selected models
,并选中新引入的PhysicsMaterial
,这样,方块就具备了刚体的物理材质属性。
添加外观材质
除了物理材质,物体也可以添加用于外观展示的材质
依次选中Create
->Material
->OmniPBR
来添加一个OmniPBR材质,可以理解为普通的外观材质。
注意:类似OmniPBR材质的术语,将在相关知识章节部分补充
OmniPBR材质的Property里有海量的可调选项,此处就以简单地修改颜色为例。
选中OmniPBR
->Property
->Albedo
->Albedo color
修改为你喜欢的颜色。
随后将Stage
中这个材质拖动到场景物体或者通过选中物体并在属性面板的Materials on selected models
中选择材质,即可赋予外观的材质。
同理,你可以利用MDL语言或者现有的Omniverse材质包,为物体添加更为真实的外观材质。
文件的保存与使用
保存/打开USD文件
在菜单的File
->Save
可以保存和打开USD文件,现在试试保存刚才所创建的仿真场景。
保存地址可以放在诸如本地Nucleus服务器上或者本机的其他位置。
对于使用了多个外部素材的USD文件,建议将它所涉及的素材全部打包到一个文件夹内
通过右键USD文件并选中Collect Asset
来收集相关素材并打包,以免在迁移时发生部分素材的缺失,这方便了在其他机器环境下使用情况。
使用USD文件
在Nvidia Isaac Sim中,官方提供了许多USD资产,将其他USD文件作为引用的步骤如下图所示:
- 选择菜单栏中的
File
。 - 在下拉菜单中选择
Add Reference
选项
一旦加载完成,引用的USD文件将以与文件名相同的Prim名称加载到舞台上。这意味着整个USD文件的内容,包括PhysicsScene、defaultLight和GroundPlane等内容,都会被加载到新的舞台上。
使用 Reference 的主要优势在于文件的可复用性和场景的模块化管理。多个场景可以引用同一个 USD 文件,当引用的 USD 文件被更新时,所有引用它的场景都会自动反映这些变化。
注意: 这可能导致混淆,特别是当您需要加载多个USD引用时,每个引用包含自己的PhysicsScenes和defaultLights。由于这些内容是通过
Add Reference
加载的,被视作是一个整体,您不能直接在新的Stage
上删除它们。同时,在原始USD文件中删除PhysicsScene、defaultLight和GroundPlane等内容也不是一个理想的解决方案,因为这可能会导致在创建USD文件时更加复杂。
为了更好地管理加载的USD文件和避免加载原始世界的环境内容,USD中存在名为defaultPrim
的概念,在一个USD文件被其他USD文件引用时,只有defaultPrim
部分会被拉取。
因此,在制作USD时,可以考虑当它被引用时,您希望它的哪些内容被引出(例如机器人本体),哪些内容不被引出(例如测试机器人本体时所用的周遭环境),具体的步骤类似:
- 创建一个名为
my_robot
的新Xform
,用于容纳机器人的相关组件。 - 将所需的机器人的所有组件拖动到
my_robot
这个Xform
下。 - 在舞台中点击对象,右键将
my_robot
设置为新的defaultPrim
。
这样,当您在其他舞台上将机器人作为引用导入时,只会导入机器人的主体,而不会包含原始世界的环境内容。这一步确保了您只加载了所需的机器人部分,而不会混淆或加载多余的内容。
结尾语
恭喜你,已经学习了Isaac Sim的仿真场景的相关内容,了解了如何创造一个带有物理环境、材质、光照之类的更加真实的世界,并能够自主搭建一个简单的物理仿真场景。
在下一章节,你将学习Isaac Sim的机器人和传感器组装。
本章在后面的部分还提供了可选的个人练习和相关知识小章节,如果你希望更深入地掌握本章节学习的内容,请查看后面的内容。
如需企业内训定制、项目开发合作或个人学习支持,请联系:hermanye233@icloud.com
个人练习(可选的)
练习目标
制作出一个简单的两轮机器人,由一个Cube
通过拉伸操作得到身体,两个Cylinder
作为左右轮,并为这个机器人制作出简单的测试环境,并将他们保存作为USD文件
练习参考
相关知识(可选的)
注意: 限于作者所涉及的领域,以下内容可能存在不准确或者谬误,仅供参考,欢迎指正。
-
Rigid Body 刚体
刚体(Rigid Body)在物理学和工程学中,是指一种理想化的物体,其内部任意两点之间的距离无论受到什么外力都保持不变。换句话说,刚体不会变形,不会弯曲、拉伸或压缩。刚体是经典力学中的一个基本概念,用于描述和分析物体的运动和力学行为。
刚体可以由无数个质点组成,每个质点的位置相对于刚体的质心都是固定的,它的运动可以分解为平移运动和旋转运动。平移运动是刚体的所有点都以相同的速度和方向移动;旋转运动是刚体绕着某个固定轴旋转。它的惯性矩描述了其对旋转运动的抵抗能力,取决于刚体的质量分布和旋转轴的位置。
在游戏引擎中,如Unity或Unreal Engine或者仿真器中,将刚体属性添加到对象,可以使其具备一些物理性质。
-
Collider 碰撞体
碰撞体(Collider)是一种用于物理模拟的组件,它定义了物体的形状和物理特性,使物体在模拟环境中能够发生碰撞和相互作用。Collider通常用于确保虚拟物体不会互相穿透,并能产生现实中的物理行为,如碰撞、反弹等。
碰撞体预设(Colliders preset)是预定义的碰撞体配置,包含了常用形状和物理参数设置。使用碰撞体预设可以简化碰撞体的创建过程,让用户快速应用常见的碰撞体类型,比如Box Collider(盒子碰撞体)、Sphere Collider(球形碰撞体)、Mesh Collider(网格碰撞体)等。
-
Collsion Approximation 碰撞体近似
碰撞体近似指的是使用简化的几何形状来近似物体的实际形状,以便于更高效地进行碰撞检测和物理模拟。直接使用Mesh计算碰撞虽然精度高,但是对于复杂物体开销非常大,碰撞体近似方法通过减少计算复杂度,提高模拟的性能,同时保持合理的物理行为。
-
Convex Hull 凸包近似法
Convex Hull(凸包)是计算几何中的一个基本概念。它是指一个给定点集的最小凸多边形或多面体,包含了点集中所有的点,并且任何两点之间的连线都在这个凸多边形或多面体的内部或边界上。
凸形状的碰撞检测算法简单高效,比非凸形状快得多,并且在物理模拟中有较小的误差积累。但凸包仅能提供一个粗略的外部近似,对于复杂形状或内部凹陷较多的物体,精度较低,比如机器人的夹爪,可能会被试做一团夹爪,从而在精细灵巧操作上表现不佳。
想象一下你有一堆钉子随机地插在平面上的一个木板上,每个钉子代表一个点。然后你用一根橡皮筋围绕这些钉子,把橡皮筋拉紧,使其尽可能地包住所有的钉子。橡皮筋最终形成的形状就是这个点集的凸包。
在三维空间中,凸包就像是你用一张伸展的薄膜包裹住一堆散落的球(代表点)。薄膜在各个方向上紧紧包住这些球,形成的就是三维点集的凸包。
-
Convex Decomposition 凸分解近似法
Convex Decomposition (凸分解)是一种将复杂的几何形状分解成一组较小的凸形状的方法。通过将一个复杂的非凸形状分解成多个凸多边形或凸多面体,可以更高效地进行物理模拟和碰撞检测。
将复杂形状分解为多个凸形状,凸形状的碰撞检测算法简单且高效。
但对于非常复杂或高度不规则的形状,凸分解可能仍然无法完美近似。
想象一下你有一块形状复杂的大饼干(复杂的非凸形状),上面有许多凹陷和凸起,它不是一个典型的整体的适合用粗略的凸包解决的三维结构。
于是你使用小刀持续切割,直到把整个大饼干分解成许多小块,并且使得每一块都是规则的形状(凸形状),这些均为小块凸形状的饼干块能够近似地代表大饼干的复杂形状。
-
SDF 符号距离场近似法
SDF Mesh的近似方法(Signed Distance Function Mesh Approximation)是一种用于表示复杂几何形状的方法,主要在计算机图形学、物理模拟和碰撞检测中使用。SDF Mesh通过符号距离函数(Signed Distance Function, SDF)来描述几何体的表面和体积信息,使得在处理复杂形状时能够获得更高的精度和效率。
SDF Mesh可以精确描述复杂几何体的表面和体积,但生成和优化SDF网格需要大量的预处理时间和计算资源,在使用时也有较大的内存占用。
符号距离函数是一个数学函数,对于三维空间中的每一个点,该函数返回该点到最近表面的有符号距离,通过正/负/零值来代表点在表面的外部/内部/表面上。
-
PCM 碰撞系统算法
PCM(Persistent Contact Manifold)是一种基于接触持久化的算法,它在物体碰撞时,通过保持接触信息来提高后续碰撞检测的效率。它保留了物体之间的接触信息,后续的碰撞检测可以利用这些信息,从而减少计算量。对于持续接触的物体,如堆叠的物体或滑动接触,能够提供更加稳定的模拟结果。
-
SAT 碰撞系统算法
SAT(Separating Axis Theorem)是一种基于分离轴的碰撞检测算法,通过检查可能的分离轴来确定两个凸多边形是否发生碰撞。算法相对简单且直观,适合处理凸形物体的碰撞检测。对于复杂场景或非凸多边形,SAT 可能需要更多的计算资源。
-
TGS 求解算法
TGS(Timewarp Gauss-Seidel)求解器是一种改进的Gauss-Seidel方法,它在处理动力学系统中的时间步进时更为稳定和高效。TGS求解器的核心思想是通过时间扭曲(timewarp)技术来处理时间步长,从而减少数值误差和模拟不稳定性。它适用于需要高精度和高稳定性的模拟,如复杂的刚体动力学系统。它适用于需要高度稳定性和精度的模拟场景,如高精度物理引擎和复杂机械系统的仿真。
-
PGS 求解算法
PGS(Projected Gauss-Seidel)求解器是一种迭代方法,用于解决带有不等式约束的线性互补问题(LCP)。在刚体动力学中,PGS求解器常用于处理碰撞、摩擦和关节约束等问题。PGS求解器通过迭代逐步逼近解,并在每一步中投影到可行域内,从而满足约束条件。它的优点是简单易实现,且在大多数情况下收敛速度较快。它常用于实时应用和游戏引擎中,因其计算效率较高且实现简单,适合处理大量的碰撞和约束。
-
CCD 连续碰撞检测
连续碰撞检测(Continuous Collision Detection)是一种方法,用于在仿真中精确检测物体在连续时间步长内是否发生碰撞,而不仅仅是在离散的时间步长上进行检测。这样可以避免快速运动的物体"穿越"其他物体的问题,提供更精确和真实的模拟效果。启用CCD可以大幅提高碰撞检测的准确性,但也可能增加计算开销。
-
Broad Phase 粗略阶段
在物理引擎和碰撞检测系统中,Broad Phase(粗略阶段)是碰撞检测过程的第一个阶段。其主要目的是快速筛选出可能发生碰撞的物体对,抛弃不可能发生碰撞的情况,减少后续需要进行详细碰撞检测的物体对数量,从而提高整体碰撞检测的效率,这对于处理大量物体的仿真非常重要,因为详细碰撞检测是计算密集型的操作。
Broad Phase的任务是识别可能碰撞的物体,而不是确认它们是否确实碰撞。
Broad Phase常见的方法包括基于空间分区的算法(如网格法)、层次包围体法(如八叉树或四叉树)、基于排序和剔除的算法(如 Sweep and Prune)等。
举例来说,如果你想模拟整个世界的人口,就需要检查每个代表人的对象是否与其他人发生碰撞。但显然,伦敦的人不可能与北京的人发生碰撞,因此没有必要检查这两个城市的所有人之间的碰撞。Broad Phase阶段会尝试将世界分成离散的区域,其中我们知道这些区域不会重叠,因此区域内的物体也不会发生碰撞。这样可以大大减少需要进行详细碰撞检测的对象数量,从而提高性能。
具体细节可参考Nvidia physX 中的说明。
对于Broad Phase更深入的理解可参考Newcastle University相关研究。
-
Narrow Phase 精细阶段
Narrow Phase(精细阶段)是碰撞检测过程的第二个阶段,紧随 Broad Phase(粗略阶段)之后。在 Narrow Phase 中,对在粗略阶段筛选出的可能发生碰撞的物体对进行精确的碰撞检测。其主要目的是计算物体之间的实际接触点、碰撞深度和碰撞响应,由于Broadphase已经大大减少了需要检测的物体对的数量,这一步通常较为高效。
Narrow Phase使用更复杂和精细的算法,如 GJK(Gilbert-Johnson-Keerthi)算法、EPA(Expanding Polytope Algorithm)、SAT(Separating Axis Theorem)等。
-
GPU 粗略阶段算法
PhysX 中 GPU 加速的 Broad Phase 算法通常采用的是基于栅格化的策略。这种算法的核心思想是将整个场景划分成多个小的栅格单元,然后在每个栅格单元内进行碰撞检测。
更细地说,它将三维空间划分成一系列小的栅格单元。每个单元包含一定数量的物体,物体的位置决定了它们被分配到哪个栅格,随后将所有物体根据其位置分配到对应的栅格单元中,并在每个栅格单元内,进行细粒度的碰撞检测。
对于跨越栅格边界的物体,这些物体可能与多个栅格单元中的物体发生碰撞。需要对这些物体进行额外的检测以确保碰撞检测的准确性。
-
MBP 粗略阶段算法
MBP (Multi Box Pruning)是一种基于轴对齐包围盒(AABB)的碰撞检测算法,通过多重剔除法进行 Broadphase 处理。
MBP 将物理世界划分为多个轴对齐的包围盒(AABB,Axis-Aligned Bounding Boxes),并对这些包围盒进行管理和检测。
它在常规场景中表现良好,特别是在动态场景中,能够快速剔除不可能碰撞的物体。但在极大规模的场景中,例如成百上千机器人与刚体的场景,可能不如 GPU 加速效果好。
-
SAP 粗略阶段算法
SAP(Sweep and Prune)是一种常用的 Broadphase 碰撞检测算法,通过在各个坐标轴上排序和检查重叠来进行碰撞检测。
SAP将所有物体的轴对齐包围盒(AABB)的起始和结束点(即最小和最大坐标)分别投影到某个坐标轴上。随后对这些投影点进行排序,通常按 X 轴进行排序。可以对每个轴进行排序以提高精度,但通常一个轴就足够了。然后依次检查排序后的投影点,找出所有重叠区间。
它在物体移动不频繁或物体分布较为均匀的场景中表现良好。但在物体频繁移动的动态场景中,性能可能不如 MBP 或 GPU。
-
Omni PBR材质
Omni PBR材质是一种基于物理的渲染(Physically-Based Rendering,PBR)材质,用于实现更逼真的图形渲染效果。PBR是一种图形渲染技术,旨在模拟光线如何与物体表面交互以产生更真实的视觉效果。这种技术考虑了光的物理特性,包括漫反射、镜面反射、折射等,以在虚拟环境中模拟材质的外观和光照交互。