已知问题#

注意

请参阅 Omniverse Isaac Sim documentation 以查看已知问题和解决方法。

重置环境后数据值变旧#

重置环境时,某些资产和传感器的数据字段未更新。这些包括关节链中链接的姿势、摄像头图像、接触传感器读数和激光雷达点云。这是一个已知问题,与 Omniverse 中 PhysX 和渲染引擎的工作方式有关。

许多物理引擎将模拟步骤作为两级调用处理: forward()simulate() ,分别更新关节链中的运动学和动态状态。不幸的是,PhysX 只有一个 step() 调用,其中两个操作合并起来。由于通过 GPU 内核计算,它们无法简单地将这些操作拆分开来。因此,目前无法设置根和/或关节状态并进行向前调用以更新链接的运动学状态。这既影响初始化,也影响周期性重置。

对于与 RTX 渲染相关的传感器(如摄像头),在设置传感器状态后,传感器数据不会立即更新。渲染引擎更新与模拟器的 step() 调用捆绑在一起,仅在模拟向前步进时才会调用。这意味着传感器数据在重置后不会立即更新,它将保留过时的值。

虽然上述是错误的,但目前没有直接的解决方法。根据我们在使用 IsaacGym 时的经验,重置值对代理学习的影响取决于环境终止的频率。如果代理成功学习,这个数字会下降并且不会对性能有显著影响。

我们已向相应的 Omniverse 团队提出了一个功能请求,以完全控制模拟应用的不同部分的步进。然而,目前尚未确定此功能请求的时间表。

物理仿真中的非确定性#

由于 GPU 工作调度,运行时对仿真参数的更改有可能改变操作执行顺序。这是因为当 GPU 忙于其他任务时,环境更新可能会发生。由于浮点数存储的固有性质,对执行顺序的任何修改可能会导致输出数据中最不重要的位的微小变化。这些变化可能会导致在模拟数千个环境和仿真帧的过程中执行发散。

此问题的一个示例是观察对象物理材料的运行时域随机化。由于这些参数是通过低级 API 从 CPU 传递到 GPU 的方式,这个过程可能会导致确定性和仿真问题,因此强烈建议仅在设置时间执行此操作,然后才开始环境步进。

要了解更多信息,请参阅 PhysX Determinism documentation

此外,由于浮点精度的原因,在仿真中不同环境中的状态在应用相同的一组动作到相同的初始状态时可能是非确定性的。这是因为环境被放置在世界原点 (0, 0, 0) 附近。由于演员被放置在世界中不同的原点,浮点错误可能会积累,并导致结果略有不同,即使从相同的初始状态开始。这个问题的一个可能解决方法是将所有演员/环境放置在世界原点 (0, 0, 0) 并且过滤掉环境之间的碰撞。请注意,这可能会导致性能下降约15-50%,具体取决于演员和环境的复杂性。

摄像头前的空白初始帧#

在独立脚本中使用 Camera 传感器时,前几帧可能会是空白的。这是一个已知问题,模拟器需要一些步骤来正确加载材质纹理并填充渲染目标。

解决此问题的一个方法是在初始化摄像头传感器并设置姿势后添加以下内容:

from omni.isaac.lab.sim import SimulationContext

sim = SimulationContext.instance()

# note: the number of steps might vary depending on how complicated the scene is.
for _ in range(12):
    sim.render()

使用实例化资产作为标记对象#

使用 instanceable assets 作为标记对象时,标记对象不起作用,因为 Omniverse 在使用 PointInstancer 模式时不支持实例化资产。这是一个已知问题,将在将来的版本中修复。

如果使用实例化资产作为标记对象,则标记对象类会删除资产的所有物理属性。这会在相同资产的其他引用上复制,因为实例化资产的物理属性存储在实例化资产的 USD 文件中,而不是在其场景引用的 USD 文件中。

退出进程#

当使用 Ctrl+C 退出进程时,偶尔会出现以下错误:

[Error] [omni.physx.plugin] Subscribtion cannot be changed during the event call.

这是因为终止发生在物理事件调用中间,不应影响 Isaac Lab 的功能。可以安全地忽略错误消息并继续终止进程。在 Windows 系统上,请使用 Ctrl+BreakCtrl+fn+B 来终止进程。