导入新资产#
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中存在自碰撞。
使用 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
使用网格导入器#
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
标志,则资产也不会有任何碰撞器属性,并且将作为视觉资产导入。