NVIDIA USD (Universal Scene Description) 在机器人仿真中的深度技术调研
NVIDIA USD (Universal Scene Description) 在机器人仿真中的深度技术调研
一、USD 概述与核心概念
Universal Scene Description(USD)最初由 Pixar 开发,2016 年开源,现在是 Linux Foundation 旗下的 Academy Software Foundation(ASWF)项目。USD 是一个高性能的 3D 场景描述、合成和交换框架,在机器人仿真领域,它提供了统一的资产表示层,贯穿从 CAD 导入 -> 场景组装 -> 物理仿真 -> ROS 2 集成的全链路。
1.1 核心抽象概念
| 概念 | 定义 | API 路径 | 关键方法 |
|---|---|---|---|
| Prim(Primitive) | USD 场景图的基本节点,类似文件系统中的目录 | pxr.Usd.Prim |
UsdStage.DefinePrim(path), prim.GetChildren(), prim.GetParent() |
| Layer(图层) | 携带场景描述的容器,支持非破坏性叠加 | pxr.Sdf.Layer |
Sdf.Layer.FindOrOpen(path), stage.GetRootLayer(), layer.Export(path) |
| Stage(舞台) | 由多层图层组合成的最终场景 | pxr.Usd.Stage |
Usd.Stage.CreateNew(path), Usd.Stage.Open(path), stage.SetStartTimeCode() |
| Attribute(属性) | Prim 上的具名数据值,可随时间变化 | pxr.Usd.Attribute |
prim.CreateAttribute(name, type), attr.Get(time), attr.Set(value, time) |
| Relationship(关系) | Prim 间的定向引用连接 | pxr.Usd.Relationship |
prim.CreateRelationship(name), rel.AddTarget(path), rel.GetTargets() |
| Variant(变体) | VariantSet 中的具名备选方案 | pxr.Usd.VariantSet |
variantSet.AppendVariant(name), variantSet.SetVariantSelection(name) |
| VariantSet(变体集) | 组合弧,用于打包离散替代方案 | pxr.Usd.VariantSets |
prim.GetVariantSets(), variantSets.AppendVariantSet(name) |
| Payload(载荷) | 延迟加载的引用弧,用于按需加载 | pxr.Usd.Payloads |
prim.GetPayloads().Add(layerPath), payload.GetAssetPath() |
| Composition Arc(组合弧) | 描述图层间关系的元数据 | 内置于 Layer/Stage | references, payloads, inherits, specializes, variantSets |
1.2 USD 文件格式
| 格式 | 扩展名 | 特点 | 使用场景 |
|---|---|---|---|
| USDA | .usda |
纯文本格式,人类可读可编辑,UTF-8 编码 | 手动编辑、版本控制差异比较、Schema 定义 |
| USDC | .usdc |
二进制格式,CRCs 校验,紧凑高效 | 运行时加载、大规模场景生产环境 |
| USD | .usd |
任意格式封装器,自动检测 USDA/USDC | 通用资产分发 |
USDA 示例 — 定义机器人关节:
1 | #usda 1.0 |
1.3 USD 值类型(Sdf Value Types)
1 | from pxr import Sdf |
1.4 USD 坐标系统
- 右手坐标系(Y-up vs Z-up:USD 使用 Y-up,但 Isaac Sim 使用 Z-up)
- 单位:厘米(default,可在 Stage metadata 中覆盖)
- 时间编码:帧(default 24 fps),可通过
stage.SetTimeCodesPerSecond()调整
二、Isaac Sim 中的 USD 机器人描述模式
2.1 URDF Importer 扩展
扩展名称: omni.isaac.urdf
Python 包路径: omni.isaac.urdf
扩展 ID: omni.isaac.urdf-<version>
导入 API
1 | from omni.isaac.urdf import URDFImporter |
URDF → USD 转换参数表
| URDF 元素 | USD 对应 Schema | 说明 |
|---|---|---|
<link> |
Xform + Mesh |
渲染几何体 + 碰撞几何体 |
<link><inertial> |
PhysicsMassAPI, PhysicsCenterOfMassAPI |
质量、质心、惯性张量 |
<joint type="revolute"> |
PhysicsRevoluteJoint |
旋转关节 |
<joint type="prismatic"> |
PhysicsPrismaticJoint |
滑动关节 |
<joint type="fixed"> |
PhysicsFixedJoint |
固定关节 |
<joint type="continuous"> |
PhysicsRevoluteJoint(无 limit) |
连续旋转关节 |
<joint><limit> |
physics:lowerLimit, physics:upperLimit |
关节限位 |
<joint><origin> |
physics:localPos0/1, physics:localRot0/1 |
关节坐标系变换 |
<joint><axis> |
physics:axis |
关节旋转/滑动轴 |
<transmission> |
PhysicsJointAPI 上的驱动参数 |
传动比、电机参数 |
<material> |
Material prim + Shader |
材质颜色/纹理 |
URDF Import 配置 JSON
1 | { |
2.2 机器人 USD Schema(Articulation Schema)
Isaac Sim 使用基于 USD Physics + PhysX Schema 的 Articulation 系统来定义机器人运动链。
核心 Schema 路径
1 | # PhysX Articulation 核心 Schema |
重要 API Schema
| Schema 名称 | 导入路径 | 用途 |
|---|---|---|
PhysicsArticulationRootAPI |
pxr.UsdPhysics.PhysicsArticulationRootAPI |
标记 Articulation 根节点 |
PhysicsJointAPI |
pxr.UsdPhysics.PhysicsJointAPI |
关节基础属性 |
PhysicsRevoluteJoint |
pxr.UsdPhysics.PhysicsRevoluteJoint |
旋转关节 |
PhysicsPrismaticJoint |
pxr.UsdPhysics.PhysicsPrismaticJoint |
滑动关节 |
PhysicsFixedJoint |
pxr.UsdPhysics.PhysicsFixedJoint |
固定关节 |
PhysicsSphericalJoint |
pxr.UsdPhysics.PhysicsSphericalJoint |
球关节 |
PhysicsCollisionAPI |
pxr.UsdPhysics.PhysicsCollisionAPI |
碰撞体标记 |
PhysicsMassAPI |
pxr.UsdPhysics.PhysicsMassAPI |
质量属性 |
PhysicsRigidBodyAPI |
pxr.UsdPhysics.PhysicsRigidBodyAPI |
刚体标记 |
PhysicsDriveAPI |
pxr.UsdPhysics.PhysicsDriveAPI |
关节驱动参数 |
PhysicsDistanceJoint |
pxr.UsdPhysics.PhysicsDistanceJoint |
距离约束关节 |
PhysicsD6Joint |
pxr.UsdPhysics.PhysicsD6Joint |
6自由度关节(通用) |
Articulation 关节属性参数
1 | from pxr import UsdPhysics, Gf |
2.3 Isaac Sim Robotics API 核心类
1 | # Python API 导入路径概览 |
SingleArticulation API 参考
1 | from isaacsim.core.prims import SingleArticulation |
2.4 完整的 URDF → USD → Isaac Sim 工作流
1 | """完整的 URDF 导入和机器人仿真流水线""" |
2.5 机器人资产目录结构(最佳实践)
1 | robot_name_v1/ |
2.6 Robot Inspector WIndow
Isaac Sim 的 Robot Inspector 窗口可用于调试 USD 机器人结构:
- 位置: Window → Robot Inspector
- 功能: 查看关节树、齿轮传动关系、碰撞体层级
- 输出: 导出 USD 关节/碰撞体分析报告
三、NVIDIA Robot Description Schema
3.1 官方 Robot Schema 概述
NVIDIA 定义了以下 USD Schema 用于机器人描述:
| Schema 文件 | 扩展 ID | 用途 |
|---|---|---|
omni.isaac.robot_schema |
Robot Schema | 定义机器人组件类型(关节、连杆、传感器) |
omni.isaac.sensor_schema |
Sensor Schema | 定义传感器类型(相机、Lidar、IMU) |
omni.isaac.articulation_schema |
Articulation Schema | 定义运动链关节类型和驱动模式 |
3.2 Robot Schema API 层
1 | # USD 场景中的机器人 prim 通过 apiSchemas 元数据标记 |
3.3 Joint Drive 类型与参数
| 驱动类型 | token 值 | 控制方式 | 适用场景 |
|---|---|---|---|
| Force | "force" |
直接施加力/力矩 | 一般力矩控制 |
| Acceleration | "acceleration" |
设定加速度 | 末端执行器控制 |
| Velocity | "velocity" |
设定速度 PD 控制 | 轨迹跟踪 |
驱动参数 XML(URDF 导入配置等价):
1 | { |
3.4 PhysX Articulation 参数
1 | from pxr import PhysxSchema |
四、USD Composer 工作流
4.1 USD Composer(原 Omniverse Composer)
USD Composer 是 NVIDIA Omniverse 平台中用于场景组装和 USD 编辑的核心应用。在机器人工作流中:
关键扩展:
| 扩展 ID | 功能 |
|---|---|
omni.kit.window.stage |
Stage 窗口 - 场景图层次浏览 |
omni.kit.window.viewport |
视口 - 3D 场景实时预览 |
omni.kit.window.property |
属性编辑器 - 编辑 prim 属性 |
omni.kit.window.content_browser |
内容浏览器 - 资产面板 |
omni.usd.schema |
USD Schema 管理 |
omni.graph |
OmniGraph 可视化编程 |
4.2 机器人场景组装流程
1 | ┌─────────────────────────────────────────────────────────┐ |
4.3 USD Composer Python 脚本自动化
1 | # 通过 Python 脚本在 USD Composer 中操作 |
五、USD 与 ROS 2 的集成
5.1 isaac_ros_essentials 概述
仓库地址: https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_common
ROS 2 包: 包含在 isaac_ros_essentials 中
| ROS 2 包 | 功能 | 依赖 |
|---|---|---|
isaac_ros_visual_slam |
视觉 SLAM | Isaac Elbrus GPU 加速 |
isaac_ros_dnn_encoders |
DNN 视觉编码器 | TensorRT |
isaac_ros_apex |
点云处理加速 | CUDA |
isaac_ros_nitros |
类型桥接 (NITROS) | NVIDIA 传输优化 |
isaac_ros_occupancy_grid_localizer |
占据网格定位 | GPU 加速 |
isaac_ros_bi3d |
立体深度估计 | 双目相机 |
5.2 Isaac Sim ROS 2 Bridge
扩展名称: omni.isaac.ros2_bridge
扩展 ID: omni.isaac.ros2_bridge
导入路径: omni.isaac.ros2_bridge
支持的 ROS 2 话题
| ROS 2 话题类型 | 方向 | Isaac Sim 配置方式 |
|---|---|---|
/joint_states (sensor_msgs/JointState) |
发布 | ArticulationController 自动发布 |
/joint_commands (std_msgs/Float64MultiArray) |
订阅 | ROS2JointControl Omnigraph 节点 |
/tf / /tf_static (tf2_msgs/TFMessage) |
发布 | ROS2TransformTree 节点 |
/odom (nav_msgs/Odometry) |
发布 | ROS2Odometry 节点 |
/scan (sensor_msgs/LaserScan) |
发布 | ROS2LidarScan 节点 |
/camera_info / /image_raw (sensor_msgs) |
发布 | ROS2Camera 节点 |
/clock (rosgraph_msgs/Clock) |
发布 | ROS2Clock 节点 |
/cmd_vel (geometry_msgs/Twist) |
订阅 | ROS2AckermannControl / ROS2DiffDriveControl |
ROS 2 Bridge 配置 YAML
1 | # ros2_bridge_config.yaml |
5.3 OmniGraph ROS 2 节点
OmniGraph 是 Isaac Sim 的可视化编程系统。ROS 2 集成通过 ROS 2 OmniGraph 节点实现:
核心 ROS 2 OmniGraph 节点:
1 | ROS2SubscribeJointState # 订阅关节状态 |
Python 方式配置 ROS 2 OmniGraph
1 | from omni.isaac.ros2_bridge import omni_graph_ros2 |
5.4 ROS 2 + Isaac Sim 仿真控制架构
1 | ┌────────────────────────────────────────────────────────────┐ |
5.5 URDF TurtleBot 导入 + ROS 2 控制示例
1 | """ |
六、USD 机器人大规模仿真架构
6.1 多机器人场景 USD 结构
1 | # 加载多个机器人的推荐方式 |
6.2 ArticulationView(批量控制)
1 | from isaacsim.core.prims import ArticulationView |
6.3 USD Payload 延迟加载
1 | # 使用 Payload 实现大规模场景的按需加载 |
七、USD Composer 与开发者工具链
7.1 关键扩展与工具
| 工具 | 扩展 ID | 用途 |
|---|---|---|
| USD Composer | omni.create |
主场景编辑器 |
| USD View | usdview |
USD 快速预览(命令行) |
| Kit SDK | omni.kit |
自定义扩展 SDK |
| Script Editor | omni.kit.window.script_editor |
内嵌 Python 编辑器 |
| USD Inspector | omni.kit.window.inspector |
USD 场景图调试器 |
7.2 命令行工具
1 | # usdview - 预览 USD 文件 |
7.3 USD 格式转换工作流
1 | ┌──────────┐ |
7.4 USD Physics / PhysX Debugging
1 | # 在 Isaac Sim 中查看物理调试可视化 |
八、参数汇总表
8.1 机器人 USD Schema 核心参数表
| 参数 | 类型 | 默认值 | Schema | 单位/说明 |
|---|---|---|---|---|
physics:mass |
float | 0.0 | PhysicsMassAPI | kg |
physics:density |
float | 0.0 | PhysicsMassAPI | kg/m³ |
physics:centerOfMass |
point3f | (0,0,0) | PhysicsCenterOfMassAPI | 局部坐标系 |
physics:inertiaTensor |
matrix3d | diag(1) | PhysicsMassAPI | 惯性张量 |
physics:lowerLimit |
float | -1e10 | PhysicsJointAPI | rad (旋转) / m (滑动) |
physics:upperLimit |
float | 1e10 | PhysicsJointAPI | rad / m |
physics:axis |
float3 | (0,0,0) | PhysicsJointAPI | 归一化轴方向 |
physics:localPos0 |
point3f | (0,0,0) | PhysicsJointAPI | 父体局部位置 |
physics:localPos1 |
point3f | (0,0,0) | PhysicsJointAPI | 子体局部位置 |
physics:breakForce |
float | FLT_MAX | PhysicsJointAPI | 断裂力阈值 |
physics:breakTorque |
float | FLT_MAX | PhysicsJointAPI | 断裂力矩阈值 |
drive:stiffness |
float | 0.0 | PhysicsDriveAPI | 弹簧刚度 |
drive:damping |
float | 0.0 | PhysicsDriveAPI | 阻尼系数 |
drive:maxForce |
float | FLT_MAX | PhysicsDriveAPI | 最大驱动力 |
drive:targetPosition |
float | 0.0 | PhysicsDriveAPI | 目标位置 |
drive:targetVelocity |
float | 0.0 | PhysicsDriveAPI | 目标速度 |
8.2 URDF 与 USD 关节类型映射
| URDF 关节类型 | USD Joint Schema | drive token | 关节自由度 | 备注 |
|---|---|---|---|---|
revolute |
PhysicsRevoluteJoint |
angular |
1 (旋转) | +/-限位 |
continuous |
PhysicsRevoluteJoint |
angular |
1 (旋转) | 无限制旋转 |
prismatic |
PhysicsPrismaticJoint |
linear |
1 (滑动) | +/-限位 |
fixed |
PhysicsFixedJoint |
- | 0 | 刚连接 |
floating |
PhysicsD6Joint |
6 entries | 6 | 自由6DOF |
planar |
PhysicsPrismaticJoint x2 |
linear x2 |
2 | XY平面运动 |
spherical |
PhysicsSphericalJoint |
angular x3 |
3 | 球旋转 |
8.3 ROS 2 Isaac Sim Bridge 包
| 仓库 | 描述 | ROS 2 版本 |
|---|---|---|
isaac_ros_common |
基础工具和启动文件 | Humble / Iron / Rolling |
isaac_ros_nitros |
NVIDIA 传输优化系统 | Humble |
isaac_ros_visual_slam |
GPU 加速视觉 SLAM | Humble |
isaac_ros_dnn_encoders |
DNN 视觉编码器 | Humble |
isaac_ros_apex |
点云处理 | Humble |
isaac_ros_occupancy_grid_localizer |
占据网格定位 | Humble |
九、故障排查指南
9.1 常见问题
| 问题 | 可能原因 | 排查方法 |
|---|---|---|
| URDF 导入后机器人不动 | 未应用 ArticulationRootAPI |
检查 prim metadata |
| 关节反向旋转 | 轴方向错误 | 检查 physics:axis 符号 |
| 关节超限碎裂 | 碰撞体参数错误 | 检查碰撞体包围盒 + shrink factor |
| 机器人飘在空中 | 质心错误 / 重力未启用 | 检查 physics:centerOfMass + physics:mass |
| ROS 2 无数据 | Bridge 未启动 / 命名空间不匹配 | 检查 ros2_bridge 扩展状态 |
| 性能卡顿 | 碰撞体过于精细 | 使用凸包近似 (physics:approximation = "convexHull") |
9.2 调试命令
1 | # 打印完整的 USD 场景图 |
十、参考资源
10.1 官方文档
- OpenUSD 官方: https://openusd.org/
- USD API 参考 (Python/C++): https://openusd.org/release/api_ref.html
- Isaac Sim 文档: https://docs.omniverse.nvidia.com/isaacsim/latest/index.html
- Isaac ROS 文档: https://nvidia-isaac-ros.github.io/
10.2 开源项目
- Isaac Sim (GitHub): https://github.com/NVIDIA-Omniverse/IsaacSim
- Isaac ROS: https://github.com/NVIDIA-ISAAC-ROS
- USD Physics: Pixar OpenUSD + PhysX Schema
- Work-R Labs Robots: https://github.com/work-r-labs/robots (工业机器人 USD 资产库)
10.3 关键 Python 包导入路径
1 | # 核心 USD |