导入新资产#

NVIDIA Omniverse 依赖于通用场景描述(USD)文件格式来导入和导出资产。USD 是由皮克斯动画工作室开发的开源文件格式。这是一种针对大规模、复杂数据集进行优化的场景描述格式。虽然这种格式在电影和动画行业广泛使用,但在机器人社区中并不常见。

为此,NVIDIA 开发了各种导入器,允许您将其他文件格式的资产导入到 USD 中。这些导入器作为 Omniverse Kit 的扩展可用:

  • URDF 导入器 - 从 URDF 文件导入资产。

  • MJCF 导入器 - 从 MJCF 文件导入资产。

  • 资产导入器 - 从各种文件格式(包括 OBJ、FBX、STL 和 glTF)导入资产。

NVIDIA 建议的工作流程是使用上述导入器将资产转换为其 USD 表示形式。一旦资产以 USD 格式存在,您可以使用 Omniverse Kit 对资产进行编辑,并将其导出到其他文件格式。

用于大规模仿真中使用资产的重要注意事项是确保它们是 实例化 格式。这允许资产有效地加载到内存中,并在场景中多次使用。否则,资产将多次加载到内存中,可能导致性能问题。有关实例化资产的更多详细信息,请查看 Isaac Sim 文档

使用 URDF 导入器#

Isaac Sim 默认包含 URDF 和 MJCF 导入器。这些导入器支持将资产导入为实例化资产的选项。通过选择此选项,导入器将创建两个 USD 文件:一个用于所有网格数据,一个用于所有非网格数据(例如关节、刚体等)。网格数据文件中的 prims 在非网格数据文件中被引用。这样,网格数据(通常很庞大)只需加载到内存中一次,并在场景中多次使用。

要从 GUI 使用这些导入器,请分别查看 MJCF 导入器URDF 导入器 的文档。

要从 Python 脚本中使用 URDF 导入器,我们包含了一个名为 convert_urdf.py 的实用工具。在内部,此脚本创建了一个 UrdfConverterCfg 的实例,然后将其传递给 UrdfConverter 类。配置类指定了导入器的默认值。重要的设置包括 :

  • fix_base - 是否修正机器人的基座。这取决于您是否拥有浮动基座还是固定基座的机器人。

  • make_instanceable - 是否创建实例化资产。通常情况下,应该将其设置为 True

  • merge_fixed_joints - 是否合并固定关节。通常情况下,应将其设置为 True 以减少资产复杂性。

  • default_drive_type - 关节的驱动类型。我们建议始终设置为 "none" 。这允许使用执行器模型更改驱动配置。

  • default_drive_stiffness - 关节的驱动刚度。我们建议始终设置为 0.0 。这允许使用执行器模型更改驱动配置。

  • default_drive_damping - 关节的驱动阻尼。类似于刚度,我们建议始终将其设置为 0.0

示例用法#

在此示例中,我们使用了 ANYmal-D 机器人的经过处理的 URDF 文件。要检查经过处理的 URDF,请查看文件 anymal.urdf 。经过处理的 URDF 与原始 URDF 之间的主要区别在于:

  • 我们从 URDF 中移除了 <gazebo> 标记。此标记不受 URDF 导入器支持。

  • 我们从 URDF 中移除了 <transmission> 标记。此标记不受 URDF 导入器支持。

  • 我们从 URDF 中移除了各种碰撞体,以减少资产的复杂性。

  • 我们将所有关节的阻尼和摩擦参数改为 0.0 。这确保在没有 PhysX 添加额外阻尼的情况下,我们可以对关节进行努力控制。

  • 我们向固定关节添加了 <dont_collapse> 标记。这确保导入器不会合并这些固定关节。

以下显示了克隆存储库并运行转换器的步骤:

# create a directory to clone
mkdir ~/git && cd ~/git
# clone a repository with URDF files
git clone git@github.com:isaac-orbit/anymal_d_simple_description.git

# go to top of the repository
cd IsaacLab
# run the converter
./isaaclab.sh -p source/standalone/tools/convert_urdf.py \
  ~/git/anymal_d_simple_description/urdf/anymal.urdf \
  source/extensions/omni.isaac.lab_assets/data/Robots/ANYbotics/anymal_d.usd \
  --merge-joints \
  --make-instanceable

执行上述脚本将在 source/extensions/omni.isaac.lab_assets/data/Robots/ANYbotics/ 目录内创建两个 USD 文件:

  • anymal_d.usd - 这是主资产文件。它包含所有非网格数据。

  • Props/instanceable_assets.usd - 这是网格数据文件。

备注

自 Isaac Sim 2023.1.1 起,URDF 导入器的行为已更改,它将网格数据存储在主资产文件中,即使设置了 --make-instanceable 标志。这意味着 Props/instanceable_assets.usd 文件已创建,但不再使用。

您可以在打开的窗口上按播放按钮来查看场景中的资产。如果一切正常,资产应该 “折叠” 。如果发生爆炸,那可能是由于 URDF 中存在自我碰撞。

要以无头模式运行脚本,可以添加 --headless 标志。这将不会打开 GUI,并在完成转换后退出脚本。

使用网格导入器#

Omniverse Kit 包括使用 ASSIMP 库导入各种网格格式的资产的网格转换器工具(例如 OBJ、FBX、STL、glTF 等)。资产转换器工具作为 Omniverse Kit 的扩展提供。请查看 资产转换器 文档了解更多详细信息。然而,与 Isaac Sim 的 URDF 和 MJCF 导入器不同,资产转换器工具不支持创建实例化资产。这意味着如果在场景中多次使用资产,则资产将多次加载到内存中。

因此,我们包含一个名为 convert_mesh.py 的实用工具,它使用资产转换器工具导入资产,然后将其转换为实例化资产。在内部,此脚本创建了一个 MeshConverterCfg 的实例,然后将其传递给 MeshConverter 类。由于网格文件不包含任何物理信息,配置类接受不同的物理属性(如质量、碰撞形状等)作为输入。请查看 MeshConverterCfg 的文档了解更多详细信息。

示例用法#

我们使用一个立方体的 OBJ 文件来演示网格转换器的用法。以下显示了克隆存储库并运行转换器的步骤:

# create a directory to clone
mkdir ~/git && cd ~/git
# clone a repository with URDF files
git clone git@github.com:NVIDIA-Omniverse/IsaacGymEnvs.git

# go to top of the repository
cd IsaacLab
# run the converter
./isaaclab.sh -p source/standalone/tools/convert_mesh.py \
  ~/git/IsaacGymEnvs/assets/trifinger/objects/meshes/cube_multicolor.obj \
  source/extensions/omni.isaac.lab_assets/data/Props/CubeMultiColor/cube_multicolor.usd \
  --make-instanceable \
  --collision-approximation convexDecomposition \
  --mass 1.0

与 URDF 转换器类似,执行上述脚本将在 source/extensions/omni.isaac.lab_assets/data/Props/CubeMultiColor/ 目录内创建两个 USD 文件。此外,如果您在打开的窗口上按播放按钮,您应该能看到资产在重力的影响下落下。

  • 如果您不设置 --mass 标志,则不会向资产添加刚体属性。它将作为静态资产导入。

  • 如果您还未设置 --collision-approximation 标志,则资产也不会有任何碰撞器属性,并且将作为视觉资产导入。