导入新资产#

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

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

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

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

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

NVIDIA 建议的工作流程是使用上述导入器将资产转换为其 USD 表示形式。一旦资产以 USD 格式存在,您可以使用 Omniverse Kit 对资产进行编辑,并将其导出到其他文件格式。Isaac Sim 默认包含这些导入程序。它们也可以在 Omniverse Kit 中手动启用。

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

使用 URDF 导入器#

要在GUI中使用URDF导入器,请查阅 URDF 导入器 的文档。要在Python脚本中使用URDF导入器,我们提供了一个名为 convert_urdf.py 的实用工具。这个脚本创建了 UrdfConverterCfg 的一个实例,然后将其传递给 UrdfConverter 类。

URDF 导入器具有各种配置参数,可以设置来控制导入器的行为。导入器的配置参数的默认值在 UrdfConverterCfg 类中指定,并列在下方。我们将一些常修改的设置作为命令行参数在调用 convert_urdf.py 时可用,并在列表中用 * 标记。要获取配置参数的详细列表,请查看 URDF 导入器 的文档。

  • fix_base* - 是否固定机器人的基座。这取决于你是否有浮动基座或固定基座的机器人。命令行标志是 --fix-base ,设置时,导入器将固定机器人的基座,否则它将默认为浮动基座。

  • make_instanceable* - 是否创建可实例化资产。通常,这应该设置为 True 。命令行标志是 --make-instanceable ,当设置时,导入器将创建可实例化资产,否则将默认为非可实例化。

  • merge_fixed_joints* - 是否合并固定关节。通常应将此设置为 True 以减少实体的复杂性。命令行标志是 --merge-joints ,设置时,导入器将合并固定关节,否则将默认不合并固定关节。

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

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

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

请注意,当选择了可实例化选项时,导入器将创建两个USD文件: 一个存储所有网格数据,另一个存储所有非网格数据(如关节、刚体等)。网格数据文件中的基元在非网格数据文件中被引用。这使得网格数据(通常体积庞大)只需要加载一次并在场景中多次使用。

示例用法#

在此示例中,我们使用了 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 Isaac Lab 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 文件已创建,但不再使用。

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

您可以在打开的窗口上按播放按钮来查看场景中的资产。资产应该受重力影响下落。如果它爆炸了,那可能是因为URDF中存在自碰撞。

convert_urdf.py 的结果

使用 MJCF 导入器#

与URDF导入器类似,MJCF导入器也有一个GUI界面。请查看 MJCF导入器 中的文档获取更多详细信息。要在Python脚本中使用MJCF导入器,我们提供了一个名为 convert_mjcf.py 的实用工具。该脚本创建了一个 MjcfConverterCfg 的实例,然后将其传递给 MjcfConverter 类。

导入器配置参数的默认值在 MjcfConverterCfg 类中指定。配置参数如下所示。我们对一些常见修改的设置进行了调整,使其在调用 convert_mjcf.py 时可以作为命令行参数使用,并在列表中用 * 标记。有关配置参数的全面列表,请查看 MJCF importer 处的文档。

  • fix_base* - 是否固定机器人的基座。这取决于您的机器人是浮动基座还是固定基座。命令行标志是 --fix-base ,设置时,导入器将固定机器人的基座,否则将默认为浮动基座。

  • make_instanceable* - 是否创建可实例化资产。通常,应该设置为 True 。命令行标志是 --make-instanceable ,设置为此值时,导入器将创建可实例化资产,否则将默认为不可实例化。

  • import_sites* - 是否解析MJCF中的<site>标签。通常应设置为 True 。命令行标志是 --import-sites ,当设置时,导入器将解析 <site> 标签,否则将默认不解析 <site> 标签。

示例用法#

在这个例子中,我们使用Unitree的H1人形机器人在 mujoco_menagerie 中的MuJoCo模型。

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

# create a directory to clone
mkdir ~/git && cd ~/git
# clone a repository with URDF files
git clone git@github.com:git@github.com:google-deepmind/mujoco_menagerie.git

# go to top of the Isaac Lab repository
cd IsaacLab
# run the converter
./isaaclab.sh -p source/standalone/tools/convert_mjcf.py \
  ~/git/mujoco_menagerie/unitree_h1/h1.xml \
  source/extensions/omni.isaac.lab_assets/data/Robots/Unitree/h1.usd \
  --import-sites \
  --make-instanceable
convert_mjcf.py 的结果

使用网格导入器#

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 Isaac Lab 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

你可能需要在导入后按下 ‘F’ 键来放大资产。

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

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

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

convert_mjcf.py 的结果