4. 机器人建模与导入

在 Isaac Lab 中做强化学习,第一步不是写策略网络,而是把机器人“搬进”仿真世界。Isaac Lab 基于 NVIDIA Isaac Sim,其原生资产格式是 USD(Universal Scene Description),而机器人社区最常用的描述文件是 URDF(ROS 生态)和 MJCF(MuJoCo 生态)。因此,机器人建模与导入的核心任务可以概括为:把 URDF/MJCF 正确转换为 USD,并在转换后补齐关节、碰撞体、执行器与传感器这四类关键配置。本节围绕这条主线展开。

本节主线:源格式(URDF/MJCF)→ 转换器(URDF/MJCF Importer)→ USD 资产 → 关节配置 → 碰撞体设置 → 执行器挂载 → 传感器挂载 → 可训练 Articulation。

一、核心原理:三种格式的定位与转换关系

URDF 是 XML 描述的树状运动学结构,擅长表达连杆、关节、惯性、视觉与碰撞几何,但缺乏场景组合与高效实例化能力;MJCF 同样是 XML,但对接触、执行器、传感器有更紧凑的表达;USD 则是分层、可组合、可引用的场景描述格式,支持大规模并行仿真与 PhysX 物理后端。Isaac Lab 的转换本质是“语义映射”:把 URDF/MJCF 的 link/joint 映射为 USD 的 Xform 层级与 PhysicsJoint,把 visual/collision 映射为 Mesh 与 CollisionAPI,把 transmission/actuator 映射为 Actuator 配置。

URDF / MJCF → USD 转换与 Isaac Lab 配置链路 URDF link / joint / mesh ROS 生态常用 MJCF body / joint / geom MuJoCo 生态常用 Importer 转换器 语义映射 / 单位换算 坐标系对齐 / 网格合并 生成 PhysicsJoint USD 资产 Xform 层级 PhysicsJoint CollisionAPI 关节配置 drive / limit 碰撞体设置 collision / filter 执行器挂载 ActuatorCfg 传感器挂载 Camera / IMU 转换后必须校验的四类信息 ① 关节轴向与零位:axis 方向、joint origin、初始角度是否与真机一致 ② 碰撞体:是否使用凸包/简化几何,避免凹网格导致物理不稳定 ③ 执行器:刚度、阻尼、力矩上限、传动比是否匹配真实电机 ④ 传感器:安装位姿、更新频率、噪声模型是否与训练目标一致

二、方法流程:从文件到可训练 Articulation

Isaac Lab 提供了 UrdfConverter 与 MjcfConverter,也可在 Isaac Sim GUI 中使用 Importer 扩展。典型流程如下:

  1. 准备源文件:确保 URDF/MJCF 的 mesh 路径为相对路径,单位统一为米,避免绝对路径导致导入失败。
  2. 执行转换:调用转换器生成 USD,并指定 merge_fixed_joints、fix_base、joint_drive 等参数。
  3. 检查层级:在 USD Composer 中确认 ArticulationRoot、PhysicsJoint、CollisionAPI 是否正确挂载。
  4. 编写配置类:在 Isaac Lab 中继承 ArticulationCfg,填写 prim_path、actuators、init_state。
  5. 挂载传感器:通过 CameraCfg、ImuCfg、ContactSensorCfg 等添加到场景配置。
  6. 仿真验证:运行空场景,检查关节是否可动、碰撞是否穿透、传感器是否出数。
from isaaclab.actuators import ImplicitActuatorCfg
from isaaclab.assets import ArticulationCfg

ROBOT_CFG = ArticulationCfg(
    prim_path="/World/Robot",
    spawn=None,  # 已转换为 USD,直接引用
    actuators={
        "arm": ImplicitActuatorCfg(
            joint_names_expr=["joint[1-6]"],
            stiffness=80.0,
            damping=4.0,
            effort_limit=120.0,
        ),
        "gripper": ImplicitActuatorCfg(
            joint_names_expr=["finger.*"],
            stiffness=20.0,
            damping=1.0,
        ),
    },
    init_state=ArticulationCfg.InitialStateCfg(
        pos=(0.0, 0.0, 0.8),
        joint_pos={"joint.*": 0.0},
    ),
)

三、关节配置与碰撞体设置要点

关节配置决定机器人“怎么动”。需要关注三类参数:驱动参数(stiffness、damping、effort_limit、velocity_limit)、运动学参数(axis、limit、joint origin)、初始状态(joint_pos、joint_vel)。Isaac Lab 支持按正则表达式批量匹配关节,例如 joint_names_expr=["joint[1-6]"],避免逐个手写。

碰撞体设置决定机器人“怎么碰”。常见误区是直接使用视觉网格作为碰撞体,导致三角面过多、物理不稳定。正确做法是:为每个 link 指定简化碰撞几何(box、capsule、convex hull),并通过 CollisionAPI 与 PhysicsMaterialAPI 设置摩擦、恢复系数。对于自碰撞,需要配置 collision_filter 或 self_collision 开关。

配置项 作用 典型取值/建议
stiffness 关节位置刚度 位置控制 40~200,力控可设 0
damping 关节速度阻尼 通常为 stiffness 的 1/20~1/10
effort_limit 关节最大力矩 按真实电机额定值填写
collision geometry 碰撞体形状 优先 capsule / convex hull
self_collision 自碰撞开关 训练初期可关闭以提速
sensor update period 传感器更新周期 相机 1/30s,IMU 1/200s

四、执行器与传感器挂载案例

以一个六轴机械臂为例:转换 USD 后,在 ArticulationCfg 中定义 arm 与 gripper 两组执行器,分别匹配 joint[1-6] 与 finger.*。随后在场景配置中添加腕部相机与关节力矩传感器:

from isaaclab.sensors import CameraCfg, ContactSensorCfg

camera_cfg = CameraCfg(
    prim_path="/World/Robot/wrist_link/camera",
    update_period=1/30,
    height=240, width=320,
    data_types=["rgb", "depth"],
)

contact_cfg = ContactSensorCfg(
    prim_path="/World/Robot/finger.*",
    update_period=1/100,
    history_length=3,
)
建议先做“最小可动验证”:只加载机器人、不加传感器,运行 100 步仿真,确认关节能按目标位置运动、无穿模、无爆炸,再逐步加入传感器与随机化。

五、常见误区与复盘

  • 单位不一致:URDF 常用米,但部分模型用厘米,转换后机器人尺寸放大 100 倍。转换前务必检查 mesh scale 与 joint origin。
  • 关节轴向错误:URDF 的 axis 与 USD 的 local rotation 不一致,导致关节绕错误轴旋转。需在 USD 中核对 PhysicsJoint 的 local pose。
  • 碰撞体缺失:只导入 visual 未导入 collision,机器人会直接穿过地面。检查每个 link 是否挂载 CollisionAPI。
  • 执行器参数照搬:直接使用默认 stiffness/damping,导致关节过软或抖动。应根据真实电机参数与仿真步长调整。
  • 传感器频率过高:相机以 200Hz 更新会严重拖慢训练。按任务需求设置 update_period。
转换后的 USD 资产建议纳入版本管理,并在配置类中固定 prim_path。若后续重新转换,务必回归验证关节零位、碰撞体与执行器参数,避免“资产更新导致训练崩溃”。

总结来说,机器人建模与导入不是一次性的文件转换,而是“转换—校验—配置—验证”的闭环工程。只有把关节、碰撞体、执行器、传感器四类配置都对齐真实物理语义,Isaac Lab 中的强化学习训练才有可靠的基础。