Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

7.1.1 常见仿真引擎(MuJoCo、Isaac Gym、Gazebo 等)

【建议插图】图 7-1:三个典型仿真平台界面截图对比(MuJoCo 操作任务、Gazebo 移动机器人场景、Isaac Gym 并行训练示意),帮助读者直观认识它们的风格与定位。

在具身智能和强化学习中,“仿真引擎 = 虚拟世界中的物理定律 + 传感器 + 机器人模型”。选择什么仿真平台,直接决定你能多快收集数据、物理是否可信、和实际机器人接口是否顺滑。

这里重点介绍三个在机器人和 RL 社区使用非常广泛的引擎 / 框架:MuJoCo、Gazebo 和 Isaac Gym(及其后继者)。


7.1.1.1 MuJoCo

MuJoCo(Multi-Joint dynamics with Contact)是 Google DeepMind 维护的开源物理引擎,专门面向机器人学、生物力学和机器学习。(mujoco.org) 它的特点可以概括为:高精度刚体动力学 + 强力接触模型 + 良好数学结构

  1. 定位与典型用途
    • 主要用于:机械臂操作、腿足机器人、各类连续控制基准环境(如 Gymnasium/MuJoCo 里的半倒立摆、Hopper、Walker2d、Humanoid 等)。(The Farama Foundation)
    • 在强化学习社区非常流行,很多 RL 算法(DQN 之后的一大批连续控制算法)都是先在 MuJoCo 环境上做基准实验。(arXiv)
  2. 建模方式与文件格式

这使得 MuJoCo 非常适合严肃的动力学研究与机器人控制算法验证。

  • MuJoCo 支持自有的 MJCF(XML)模型格式,也支持从 URDF 导入机器人模型。
  • 在 MJCF 中可以精细指定:
    • 刚体的质量、惯量张量、几何形状;
    • 关节类型(转动、滑动、球铰等)和限制;
    • 摩擦参数(滑动、滚动、扭转摩擦);
    • 执行器(电机、力控制、位置控制等)。(mujoco.org)
  1. 数值特点:快速而稳定
    • MuJoCo 使用基于约束优化的接触求解与高效的隐式积分方法,能在保持较高精度的同时支持较大的时间步长。(arXiv)
    • 对 RL 来说,这意味着:在不牺牲太多物理精度的前提下,能以较快的仿真速度收集大量交互数据。
  2. MuJoCo + GPU:MJX 的出现
    • 在新版本中,MuJoCo 提供了 MJX 模块,基于 XLA 在 GPU/TPU 上对一大批并行环境进行向量化仿真,专门为大规模强化学习优化。(mujoco.readthedocs.io)
    • 适用场景:需要像 Isaac Gym 那样同时跑成百上千个环境,但希望保持 MuJoCo 的接触精度和建模灵活性。
  3. 适合什么读者 / 项目?
    • 如果你:
      • 更关心单个机器人动作的精细动力学(例如操作、腿足);
      • 主要在 Python + RL 框架(Gymnasium、Stable-Baselines3 等)中工作;
      • 不太需要复杂、精美的 3D 渲染和多机器人城市级场景;
    • 那么 MuJoCo 通常是一个非常合适的仿真“底座”。

7.1.1.2 Gazebo

Gazebo 是由 Open Robotics 社区维护的开源 3D 机器人模拟器,是 ROS/ROS2 生态中事实上的“官方”仿真标准之一。(gazebosim.org)

  1. Gazebo Classic 与 Gazebo Sim 的演化
    • 早期版本被称为 Gazebo Classic,集成了 ODE 等物理引擎、OpenGL 渲染以及丰富的传感器模型。(classic.gazebosim.org)
    • 之后社区推出了模块化的 Ignition Gazebo,后来由于商标问题又统一改名为 ** Gazebo(Gazebo Sim)**,而原先旧版本则称为 Gazebo Classic。(维基百科)
    • 当前推荐在 ROS2 + Ubuntu 新版本上使用的是现代的 Gazebo Sim。(PX4 文档)
  2. Gazebo 的核心能力
    • 复杂场景建模:室内、室外、城市级别环境,支持多机器人、多传感器、天气和光照等。(gazebosim.org)
    • 多物理引擎支持:可以切换 ODE、Bullet、DART 等物理后端(不同引擎在接触、稳定性和速度上表现略有不同)。(classic.gazebosim.org)
    • 丰富传感器:RGB/深度相机、激光雷达、IMU、GPS 等,都有内置插件和噪声建模。(theconstruct.ai)
    • 与 ROS 深度集成:Gazebo 中的机器人通常通过 ROS topic/service/action 对接到控制和感知节点,是实验室中调试移动机器人、无人机的标准工具链。(gazebosim.org)
  3. 典型使用场景
    • 移动机器人导航、SLAM、编队控制;
    • 服务机器人在家庭、仓储、工厂等环境中的任务验证;
    • 将真实系统的 ROS 节点“直接接到仿真上”,实现软硬件在环(HIL)测试。
  4. 优势与局限
    • 优点:
      • 场景、传感器、ROS 接口非常成熟,适合**“真实机器人系统”级** 的仿真;
      • 图形界面友好,新手易上手。(theconstruct.ai)
    • 局限:
      • 主要在 CPU 上运行,在需要百万级时间步的强化学习训练时,速度往往远不如 GPU 并行仿真框架;
      • 物理精度足以满足多数工程应用,但在细致接触建模上不如 MuJoCo 等专门引擎灵活。

7.1.1.3 Isaac Gym(及 Isaac Sim / Isaac Lab)

Isaac Gym 是 NVIDIA 发布的一款面向强化学习的 GPU 加速仿真框架,可将物理仿真 + RL 计算 都放在 GPU 上执行,从而获得 2–3 个数量级的加速。(Medium)

  1. 核心思想:端到端 GPU 仿真
    • 传统做法:仿真在 CPU,神经网络在 GPU,中间需要大量数据在 CPU/GPU 间来回拷贝。
    • Isaac Gym:仿真由 GPU 驱动,物理结果直接以 Torch/Tensor 形式保存在显存中,RL 的状态、奖励计算也在 GPU 完成。(docs.robotsfan.com)
    • 实际效果:在典型连续控制任务上能比传统 CPU 仿真 + GPU 学习快 100–1000 倍。(Medium)
  2. 与 PhysX / Isaac Sim / Isaac Lab 的关系
    • Isaac Gym 使用 NVIDIA PhysX 作为物理后端,与基于 Omniverse 的 ** Isaac Sim** 在物理实现上逐渐对齐,以便未来迁移策略到 Isaac Sim。(NVIDIA Developer)
    • 目前 Isaac Gym 已被官方标记为 deprecated(不再维护),推荐迁移到基于 Isaac Sim 的开源框架 ** Isaac Lab**。(NVIDIA Developer Forums)
    • Isaac Lab 延续了 Isaac Gym 的 GPU-native 并行仿真思路,但利用 Omniverse/Isaac Sim 提供的高保真渲染、USD 场景描述等能力,用于大规模多模态学习。(arXiv)
  3. 典型使用方式
    • 编写 Python 环境(IsaacGymEnvs / Isaac Lab),一次性创建上千个并行环境;
    • 每次仿真 step,返回 GPU 上的张量:观测、奖励、done 标志等;
    • 直接在同一块 GPU 上运行 RL 算法(如 PPO/SAC),实现极高吞吐量的数据收集。(docs.robotsfan.com)
  4. 趋势:统一物理引擎与开源生态
    • NVIDIA、Google DeepMind 等机构正在联合开发新的开源物理引擎 Newton,使其可与 MuJoCo、Isaac Lab 等框架配合使用,目标是统一高精度物理仿真与机器人学习生态。(NVIDIA Developer)

对初学者来说:如果你计划做大量仿真-强化学习实验,而实验室已有 NVIDIA GPU 硬件,那么学习 Isaac Sim / Isaac Lab 的工作流会是非常现实的选择;而理论上讲,MuJoCo + MJX 也在向类似方向发展。


7.1.2 物理仿真中的关键参数(摩擦、接触、时间步长)

【建议插图】图 7-2:一个方块在桌面上被推动的示意图,分别标注法向力、摩擦力、接触点和时间离散步长,帮助读者把抽象参数与直觉联系起来。

物理引擎的任务是数值求解“机器人 + 环境”的动力学方程。对于具身智能来说,三类参数尤为关键:

  • 摩擦(决定“滑不滑”)
  • 接触模型(决定“撞上去是弹开、卡住,还是穿透”)
  • 时间步长(决定“算得稳不稳、快不快”)

理解这些参数的意义与调节方法,是从“会跑 demo”走向“能做严肃仿真研究”的第一步。


7.1.2.1 摩擦系数

在简化模型中,摩擦力大小通常近似为

\[ F_{\text{friction}} = \mu F_N \]

其中 \((F_N)\) 是法向支撑力,\(\mu\) 是摩擦系数(无量纲)。

  1. 静摩擦 vs 动摩擦
    • 静摩擦系数 \(\mu_s\):物体刚要滑动前的摩擦,决定“起滑难度”。
    • 动摩擦系数 \(\mu_k\):物体已经滑动时的摩擦,一般略小于静摩擦。
    • 许多仿真引擎用统一的“滑动摩擦系数”来近似上述效果,也有引擎提供更细致区分。(arXiv)
  2. 摩擦在机器人任务中的影响
    • 抓取:摩擦过小,物体一夹就滑走;摩擦过大,仿真中可以“粘”住物体,现实中却会掉落。
    • 推动:摩擦决定推手与物体之间的“咬合”程度,直接影响最优策略(推还是抬)。
    • 行走:腿足机器人或轮式机器人需要足够摩擦才能产生牵引力,摩擦过小仿真中会频繁打滑。
  3. 实际建模建议
    • 从真实材料参数起步:查表或测量典型材料组合(橡胶-木板、金属-塑料等)的摩擦系数范围,在仿真中设定相近值。(科学直通车)
    • 仿真-现实对齐:在真实平台上做简单实验(推箱子、抓取同一物体),调整摩擦参数直到仿真和现实的行为相似。
    • 避免极端取值:\(\mu\) 过大可能导致数值不稳定或不自然“粘连”;过小则动作普遍打滑,策略学习难度急剧上升。

7.1.2.2 接触模型

现实世界中,物体接触本质上是弹性变形、微观粗糙度和材料内部结构的复杂结果。仿真中通常用简化模型来近似:

  1. 接触检测(collision detection)
    • 判断两个几何体是否相交,并找出接触点、接触法向量和穿透深度。
    • 不同引擎支持的几何体种类不同(球、盒、圆柱、网格等),复杂网格模型虽然真实但会增加计算成本。(classic.gazebosim.org)
  2. 接触响应(contact resolution) 常见的两大类方法:

典型参数包括:

  • 惩罚法(penalty method) 将穿透看作弹簧压缩,引入法向弹簧刚度 \(\displaystyle k\) 和阻尼 \(\displaystyle d\),产生恢复力和阻尼力;再叠加摩擦模型。
    • 优点:实现简单、计算快;
    • 缺点:刚度过大时数值刚性强,容易发散,只能用很小的时间步长。
  • 约束法(constraint-based) 通过求解线性互补问题(LCP)或二次规划(QP),显式施加“不能穿透”约束,对法向力和切向摩擦进行联合求解。MuJoCo、某些 PhysX 配置属于这一类。(arXiv)
  • 法向刚度 / 阻尼:决定“撞上去”是软弹还是硬碰;
  • 恢复系数(restitution):决定反弹高度(0 代表完全不弹,1 接近完美弹性);
  • 最大摩擦力 / 摩擦锥近似的细节。
  1. 数值问题与调参
    • 接触参数不合理时,仿真中常见“物体抖动”“轻微穿透”“叠放物体慢慢滑走”等现象;
    • 在 PhysX/Isaac 中,还可以调整 rest_offsetcontact_offset 这类参数控制接触启发式,平衡精度和稳定性。(NVIDIA Developer)
    • 建议做“小测试场景”:两个盒子叠放、物体落地弹跳等,用于观察接触参数改变的效果。

7.1.2.3 时间步长(time step)

时间步长 \(\Delta t\) 是离散化仿真时间的粒度:每一步仿真实际代表 \(\Delta t\) 秒的物理过程。

  1. 时间步长与数值稳定性
    • 多数引擎使用显式或半隐式积分方法,时间步长过大时,刚体和接触系统会变得不稳定——表现为速度爆炸、关节乱飞。(arXiv)
    • 接触越“刚”(刚度越高)、系统频率越高,所需时间步长越小 。这和数值分析中的稳定性界限是一致的。
  2. 仿真频率、控制频率与渲染频率
    • 仿真频率:\(f_{\text{sim}} = 1/\Delta t\),例如 \(\Delta t = 0.001s\) 对应 1000 Hz。
    • 控制频率:机器人策略输出动作的频率(可以是仿真每步都控制,也可以每 N 步控制一次)。
    • 渲染频率:画面刷新的频率,一般远低于仿真频率。 在 RL 任务中常用的配置是:仿真以 500–1000 Hz 运行,每 10–20 步向策略暴露一次状态,相当于 25–100 Hz 的控制频率。
  3. 速度与精度的权衡
    • 较小的 \(\Delta t\):
      • 优点:接触更稳定、轨迹更平滑;
      • 缺点:同样的物理时间会有更多步,计算负担加重。
    • 较大的 \(\Delta t\):
      • 优点:计算更快;
      • 缺点:需要更激进的数值技巧与接触调参,否则容易出现物体穿透、机器人行为不自然。

在后续的 Sim2Real 中(见 7.1.4 节),时间步长的选择也会影响策略迁移:仿真中如果用了远大于控制周期的步长,策略学到的“微分方程”可能和真实机器人不一致。


7.1.3 仿真场景搭建与任务脚本编写

【建议插图】图 7-3:从“模型文件(URDF/MJCF/USD)→ 仿真场景(机器人 + 环境 + 传感器)→ 任务脚本(reset/step/reward)”的流程图。

从 VLA 模型的角度看,一个“仿真任务”至少包括:

  • 世界:机器人、物体、障碍和相机等组成的场景;
  • 接口:如何从仿真中读出状态(观测),向仿真写入动作;
  • 协议:任务的开始、结束和评测方式。

7.1.3.1 场景搭建

无论是 MuJoCo、Gazebo 还是 Isaac 系列,场景搭建的核心思路是相似的。

  1. 机器人模型导入
    • 使用 URDF / SDF / MJCF / USD 等格式描述机器人结构:连杆、关节、惯量、关节限制。(mujoco.org)
    • 检查:
      • 单位是否统一(米 / 千克 / 牛顿);
      • 关节方向和零位是否符合真实机器人;
      • 关节上下界与真实硬件一致。
  2. 环境与物体建模
    • 地面(ground plane)、桌面、货架等静态几何体,可简化为平面 / 盒子 / 圆柱等基本形状;
    • 目标物体:尽量用简单但形状接近的碰撞几何体(如用盒子近似复杂物体的碰撞体),视觉网格可以更精细;(gazebosim.org)
    • 设置物体的质量和摩擦参数,使其在仿真中表现与现实近似(例如同样的推力下移动距离相近)。
  3. 传感器配置
    • 相机:位置、朝向、分辨率、视场角、更新频率和噪声模型;
    • 深度相机 / LiDAR:射线数量、最大测距、噪声;
    • 关节传感器:是否存在测量噪声、延迟。(theconstruct.ai)
  4. 坐标系与标定
    • 明确世界坐标系(world)、机器人基座坐标系(base)、末端执行器坐标系(ee)、相机坐标系(camera);
    • 在仿真场景中,保证这些变换与真实系统(手眼标定等)一致,方便后续 Sim2Real。

7.1.3.2 任务脚本

场景只是“静态世界”;要让机器人“活起来”,需要任务脚本来定义交互逻辑。一般需要明确以下元素:

  1. 环境接口设计 典型的 RL / 控制任务接口可以写成类似 Gym 的风格:

MuJoCo、Gazebo 和 Isaac Gym / Isaac Lab都提供 Python/C++ API,用于在脚本中驱动物理步进和读写状态。(mujoco.org)

  • reset():重置环境到初始状态(放置物体、随机扰动姿态、清零累计奖励等);
  • step(action):执行一个动作步长,返回
    • 观测 obs(视觉、关节状态、语言上下文等);
    • 标量奖励 reward
    • 是否结束 done
    • 额外信息 info
  1. 重置与随机化
    • 重置时可以对物体初始位置、姿态、材质、光照、摄像机位置等进行随机化,为后续的域随机化和泛化打基础;(Xue Bin Peng)
    • 注意重置逻辑要确定且可重复,使用固定随机种子方便实验复现。
  2. 奖励函数与终止条件
    • 奖励函数应与任务成功定义对应,例如:
      • 抓取任务:抓取成功 +1,碰撞或超时 −1,其余为 0 或小的 shaping 奖励;
      • 导航任务:每前进一步给少量负奖励,逼近目标给正奖励,撞墙大负奖励。
    • 终止条件:达到目标、失败(跌倒、掉落)或超时。 这些设计与第 5 章中的 RL 设置一一对应,只是现在在具体仿真环境中实现。
  3. 任务复杂度与课程设计
    • 初学者可从“单物体、静态场景、无干扰”做起,逐渐引入多物体、移动障碍、随机初始状态等难度,形成“仿真课程学习”。

7.1.3.3 自动化评测

一旦任务脚本搭建完成,就需要自动化评测来判断算法或 VLA 模型的好坏。

  1. 批量运行与指标统计
    • 多次运行环境(如 100 或 1000 回合),统计:
      • 任务成功率;
      • 平均完成时间 / 步数;
      • 平均奖励、最差奖励等。
    • 对于并行仿真框架(MuJoCo MJX、Isaac Gym/Isaac Lab),可以一次性在 GPU 上同时评测大量环境,加速统计。(mujoco.readthedocs.io)
  2. 日志与可视化
    • 记录每步的状态、动作、奖励到日志文件(如 Python pickle、HDF5、ROS bag 等),方便之后做离线分析;(gazebosim.org)
    • 保存关键回合的渲染视频或截图,便于定性检查策略行为是否合理。
  3. 基准化与消融实验
    • 对同一环境,使用不同算法 / 模型结构 / 超参数进行对比;
    • 设计消融实验(移除某个模块或训练阶段)观察性能变化,为后续论文写作提供可靠证据。

7.1.4 仿真–现实差距的来源与缓解方法

【建议插图】图 7-4:“仿真世界”和“真实世界”两个气泡,中间标注各种差异(视觉、摩擦、延迟等),并标出几种典型弥补方法(域随机化、实机微调等)。

在第 5.4.2 节我们已经从强化学习角度讨论过 Sim2Real 的困难与策略,这里从仿真平台和物理建模 的角度,系统梳理一下“仿真–现实差距”(reality gap)的主要来源及缓解手段。


7.1.4.1 传感器差异

  1. 视觉传感器 仿真渲染通常是“完美”的:

现实中的视觉传感器则充满各种非理想因素,使得“同一场景”的图像在仿真和现实之间分布差异巨大(domain shift),从而导致 VLA 模型在实际相机图像上表现显著变差。

  • 不存在真实相机中的噪声、模糊、曝光不均、白平衡漂移;
  • 深度相机在仿真中往往没有“测不出”的洞、反射、红外干扰;
  • 视角、畸变等也常常被设为理想值。(theconstruct.ai)
  1. 其他传感器
    • 力 / 力矩传感器:现实中存在非线性、漂移和噪声,仿真常常给的是“干净数值”;
    • 关节编码器:现实中会有量化误差、背隙、延迟等;
    • IMU:现实的陀螺仪 / 加速度计具有偏置和随机游走,仿真若不建模这些噪声,则会低估算法对噪声的敏感性。
  2. 缓解思路(传感器侧)
    • 域随机化(Domain Randomization):在仿真中随机改变纹理、光照、相机姿态、噪声等,使模型学到对这些变化不敏感。(Xue Bin Peng)
    • 真实感渲染 + 噪声建模:使用 Isaac Sim 等提供的物理化渲染(PBR)、相机噪声模型,尽量逼近实际摄像机特性。(NVIDIA Developer)
    • Real-to-Sim 校准:根据真实相机标定和采集的图像统计特性(噪声分布、伽马、失真参数)调整仿真渲染管线。

7.1.4.2 动力学差异

物理引擎做的是某种“理想模型”的数值求解,而真实机器人系统充满各种非理想性。

  1. 未建模 / 误建模的物理因素
    • 质量、惯量估计不准;
    • 关节摩擦、刚度、阻尼设置与真实系统不符;
    • 马达和驱动链路(齿轮间隙、柔性连杆、电机饱和和延迟等)未建模或严重简化。(科学直通车)
  2. 接触与摩擦的不确定性
    • 地面材质不均匀、灰尘和磨损使摩擦系数随时间变化;
    • 物体边缘细节、变形、微小不规则都难以用刚体接触模型捕捉。 这些都会导致在仿真中学到的“最优动作”在真实环境下效果不佳甚至失败。
  3. 缓解思路(动力学侧)
    • 系统辨识 + 参数调优:利用真实机器人数据(例如手动施加已知力矩,测量响应)来拟合质量、摩擦等参数,然后在 MuJoCo、PhysX 等仿真器中调整模型,使“仿真响应曲线 ≈ 实机响应”。(科学直通车)
    • 动力学域随机化:在训练时随机扰动物理参数(质量、摩擦系数、关节阻尼等),使策略对这些参数变化更加鲁棒。(arXiv)

7.1.4.3 差距缓解:综合策略

现实中往往需要多种方法联合使用,才能将仿真-现实差距控制在可接受范围内。

  1. 域随机化(Domain Randomization)
    • 在仿真训练中同时随机化:
      • 视觉域:材质、颜色、光照、相机姿态、噪声;
      • 动力学域:质量、摩擦、关节阻尼、控制延迟;
      • 场景布置:物体位置、数量、尺寸。(Xue Bin Peng)
    • 理论与实践均表明,在一定条件下,域随机化可以理论上保证策略对真实世界的泛化上界。(arXiv)
  2. Sim-Real 协同训练与离线域优化
    • 利用少量真实机器人轨迹来微调 策略或奖励模型,以“修正”纯仿真训练中的偏差;(科学直通车)
    • 或者像 DROPO 这类方法一样,用有限的真实数据来优化域随机化的分布,使仿真域更贴近真实域。(科学直通车)
  3. Real-to-Sim:用真实数据改善仿真器
    • 通过真实数据来校准渲染、传感器噪声和动力学参数,使仿真世界“更像现实”;
    • 一部分工作在此基础上构建世界模型(world model),在模型内部做规划,再在现实中验证。(arXiv)
  4. 抽象与层次化控制
    • 将低层连续控制抽象为更高层的技能或离散动作(例如“抓取”“放置”“移动到桌子左侧”),让策略主要在更抽象、对物理细节不那么敏感的层面上做决策;
    • 低层则采用传统控制(PID、轨迹跟踪)和安全约束来屏蔽部分动力学差异。(arXiv)

从本书整体结构看,本节更多聚焦在“仿真器和物理参数”这一环,而第 5 章、9 章则分别从 强化学习算法 和 ** 训练范式 / 数据工程** 的角度继续展开。掌握这一节的内容,你就已经从“会用仿真跑 demo”迈向了“能用仿真认真做具身智能研究”的台阶。