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) 它的特点可以概括为:高精度刚体动力学 + 强力接触模型 + 良好数学结构 。
- 定位与典型用途
- 主要用于:机械臂操作、腿足机器人、各类连续控制基准环境(如 Gymnasium/MuJoCo 里的半倒立摆、Hopper、Walker2d、Humanoid 等)。(The Farama Foundation)
- 在强化学习社区非常流行,很多 RL 算法(DQN 之后的一大批连续控制算法)都是先在 MuJoCo 环境上做基准实验。(arXiv)
- 建模方式与文件格式
这使得 MuJoCo 非常适合严肃的动力学研究与机器人控制算法验证。
- MuJoCo 支持自有的 MJCF(XML)模型格式,也支持从 URDF 导入机器人模型。
- 在 MJCF 中可以精细指定:
- 刚体的质量、惯量张量、几何形状;
- 关节类型(转动、滑动、球铰等)和限制;
- 摩擦参数(滑动、滚动、扭转摩擦);
- 执行器(电机、力控制、位置控制等)。(mujoco.org)
- 数值特点:快速而稳定
- MuJoCo 使用基于约束优化的接触求解与高效的隐式积分方法,能在保持较高精度的同时支持较大的时间步长。(arXiv)
- 对 RL 来说,这意味着:在不牺牲太多物理精度的前提下,能以较快的仿真速度收集大量交互数据。
- MuJoCo + GPU:MJX 的出现
- 在新版本中,MuJoCo 提供了 MJX 模块,基于 XLA 在 GPU/TPU 上对一大批并行环境进行向量化仿真,专门为大规模强化学习优化。(mujoco.readthedocs.io)
- 适用场景:需要像 Isaac Gym 那样同时跑成百上千个环境,但希望保持 MuJoCo 的接触精度和建模灵活性。
- 适合什么读者 / 项目?
- 如果你:
- 更关心单个机器人动作的精细动力学(例如操作、腿足);
- 主要在 Python + RL 框架(Gymnasium、Stable-Baselines3 等)中工作;
- 不太需要复杂、精美的 3D 渲染和多机器人城市级场景;
- 那么 MuJoCo 通常是一个非常合适的仿真“底座”。
- 如果你:
7.1.1.2 Gazebo
Gazebo 是由 Open Robotics 社区维护的开源 3D 机器人模拟器,是 ROS/ROS2 生态中事实上的“官方”仿真标准之一。(gazebosim.org)
- Gazebo Classic 与 Gazebo Sim 的演化
- 早期版本被称为 Gazebo Classic,集成了 ODE 等物理引擎、OpenGL 渲染以及丰富的传感器模型。(classic.gazebosim.org)
- 之后社区推出了模块化的 Ignition Gazebo,后来由于商标问题又统一改名为 ** Gazebo(Gazebo Sim)**,而原先旧版本则称为 Gazebo Classic。(维基百科)
- 当前推荐在 ROS2 + Ubuntu 新版本上使用的是现代的 Gazebo Sim。(PX4 文档)
- Gazebo 的核心能力
- 复杂场景建模:室内、室外、城市级别环境,支持多机器人、多传感器、天气和光照等。(gazebosim.org)
- 多物理引擎支持:可以切换 ODE、Bullet、DART 等物理后端(不同引擎在接触、稳定性和速度上表现略有不同)。(classic.gazebosim.org)
- 丰富传感器:RGB/深度相机、激光雷达、IMU、GPS 等,都有内置插件和噪声建模。(theconstruct.ai)
- 与 ROS 深度集成:Gazebo 中的机器人通常通过 ROS topic/service/action 对接到控制和感知节点,是实验室中调试移动机器人、无人机的标准工具链。(gazebosim.org)
- 典型使用场景
- 移动机器人导航、SLAM、编队控制;
- 服务机器人在家庭、仓储、工厂等环境中的任务验证;
- 将真实系统的 ROS 节点“直接接到仿真上”,实现软硬件在环(HIL)测试。
- 优势与局限
- 优点:
- 场景、传感器、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)
- 核心思想:端到端 GPU 仿真
- 传统做法:仿真在 CPU,神经网络在 GPU,中间需要大量数据在 CPU/GPU 间来回拷贝。
- Isaac Gym:仿真由 GPU 驱动,物理结果直接以 Torch/Tensor 形式保存在显存中,RL 的状态、奖励计算也在 GPU 完成。(docs.robotsfan.com)
- 实际效果:在典型连续控制任务上能比传统 CPU 仿真 + GPU 学习快 100–1000 倍。(Medium)
- 与 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)
- 典型使用方式
- 编写 Python 环境(IsaacGymEnvs / Isaac Lab),一次性创建上千个并行环境;
- 每次仿真 step,返回 GPU 上的张量:观测、奖励、done 标志等;
- 直接在同一块 GPU 上运行 RL 算法(如 PPO/SAC),实现极高吞吐量的数据收集。(docs.robotsfan.com)
- 趋势:统一物理引擎与开源生态
- 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\) 是摩擦系数(无量纲)。
- 静摩擦 vs 动摩擦
- 静摩擦系数 \(\mu_s\):物体刚要滑动前的摩擦,决定“起滑难度”。
- 动摩擦系数 \(\mu_k\):物体已经滑动时的摩擦,一般略小于静摩擦。
- 许多仿真引擎用统一的“滑动摩擦系数”来近似上述效果,也有引擎提供更细致区分。(arXiv)
- 摩擦在机器人任务中的影响
- 抓取:摩擦过小,物体一夹就滑走;摩擦过大,仿真中可以“粘”住物体,现实中却会掉落。
- 推动:摩擦决定推手与物体之间的“咬合”程度,直接影响最优策略(推还是抬)。
- 行走:腿足机器人或轮式机器人需要足够摩擦才能产生牵引力,摩擦过小仿真中会频繁打滑。
- 实际建模建议
- 从真实材料参数起步:查表或测量典型材料组合(橡胶-木板、金属-塑料等)的摩擦系数范围,在仿真中设定相近值。(科学直通车)
- 仿真-现实对齐:在真实平台上做简单实验(推箱子、抓取同一物体),调整摩擦参数直到仿真和现实的行为相似。
- 避免极端取值:\(\mu\) 过大可能导致数值不稳定或不自然“粘连”;过小则动作普遍打滑,策略学习难度急剧上升。
7.1.2.2 接触模型
现实世界中,物体接触本质上是弹性变形、微观粗糙度和材料内部结构的复杂结果。仿真中通常用简化模型来近似:
- 接触检测(collision detection)
- 判断两个几何体是否相交,并找出接触点、接触法向量和穿透深度。
- 不同引擎支持的几何体种类不同(球、盒、圆柱、网格等),复杂网格模型虽然真实但会增加计算成本。(classic.gazebosim.org)
- 接触响应(contact resolution) 常见的两大类方法:
典型参数包括:
- 惩罚法(penalty method)
将穿透看作弹簧压缩,引入法向弹簧刚度 \(\displaystyle k\) 和阻尼 \(\displaystyle d\),产生恢复力和阻尼力;再叠加摩擦模型。
- 优点:实现简单、计算快;
- 缺点:刚度过大时数值刚性强,容易发散,只能用很小的时间步长。
- 约束法(constraint-based) 通过求解线性互补问题(LCP)或二次规划(QP),显式施加“不能穿透”约束,对法向力和切向摩擦进行联合求解。MuJoCo、某些 PhysX 配置属于这一类。(arXiv)
- 法向刚度 / 阻尼:决定“撞上去”是软弹还是硬碰;
- 恢复系数(restitution):决定反弹高度(0 代表完全不弹,1 接近完美弹性);
- 最大摩擦力 / 摩擦锥近似的细节。
- 数值问题与调参
- 接触参数不合理时,仿真中常见“物体抖动”“轻微穿透”“叠放物体慢慢滑走”等现象;
- 在 PhysX/Isaac 中,还可以调整
rest_offset和contact_offset这类参数控制接触启发式,平衡精度和稳定性。(NVIDIA Developer) - 建议做“小测试场景”:两个盒子叠放、物体落地弹跳等,用于观察接触参数改变的效果。
7.1.2.3 时间步长(time step)
时间步长 \(\Delta t\) 是离散化仿真时间的粒度:每一步仿真实际代表 \(\Delta t\) 秒的物理过程。
- 时间步长与数值稳定性
- 多数引擎使用显式或半隐式积分方法,时间步长过大时,刚体和接触系统会变得不稳定——表现为速度爆炸、关节乱飞。(arXiv)
- 接触越“刚”(刚度越高)、系统频率越高,所需时间步长越小 。这和数值分析中的稳定性界限是一致的。
- 仿真频率、控制频率与渲染频率
- 仿真频率:\(f_{\text{sim}} = 1/\Delta t\),例如 \(\Delta t = 0.001s\) 对应 1000 Hz。
- 控制频率:机器人策略输出动作的频率(可以是仿真每步都控制,也可以每 N 步控制一次)。
- 渲染频率:画面刷新的频率,一般远低于仿真频率。 在 RL 任务中常用的配置是:仿真以 500–1000 Hz 运行,每 10–20 步向策略暴露一次状态,相当于 25–100 Hz 的控制频率。
- 速度与精度的权衡
- 较小的 \(\Delta t\):
- 优点:接触更稳定、轨迹更平滑;
- 缺点:同样的物理时间会有更多步,计算负担加重。
- 较大的 \(\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 系列,场景搭建的核心思路是相似的。
- 机器人模型导入
- 使用 URDF / SDF / MJCF / USD 等格式描述机器人结构:连杆、关节、惯量、关节限制。(mujoco.org)
- 检查:
- 单位是否统一(米 / 千克 / 牛顿);
- 关节方向和零位是否符合真实机器人;
- 关节上下界与真实硬件一致。
- 环境与物体建模
- 地面(ground plane)、桌面、货架等静态几何体,可简化为平面 / 盒子 / 圆柱等基本形状;
- 目标物体:尽量用简单但形状接近的碰撞几何体(如用盒子近似复杂物体的碰撞体),视觉网格可以更精细;(gazebosim.org)
- 设置物体的质量和摩擦参数,使其在仿真中表现与现实近似(例如同样的推力下移动距离相近)。
- 传感器配置
- 相机:位置、朝向、分辨率、视场角、更新频率和噪声模型;
- 深度相机 / LiDAR:射线数量、最大测距、噪声;
- 关节传感器:是否存在测量噪声、延迟。(theconstruct.ai)
- 坐标系与标定
- 明确世界坐标系(world)、机器人基座坐标系(base)、末端执行器坐标系(ee)、相机坐标系(camera);
- 在仿真场景中,保证这些变换与真实系统(手眼标定等)一致,方便后续 Sim2Real。
7.1.3.2 任务脚本
场景只是“静态世界”;要让机器人“活起来”,需要任务脚本来定义交互逻辑。一般需要明确以下元素:
- 环境接口设计 典型的 RL / 控制任务接口可以写成类似 Gym 的风格:
MuJoCo、Gazebo 和 Isaac Gym / Isaac Lab都提供 Python/C++ API,用于在脚本中驱动物理步进和读写状态。(mujoco.org)
reset():重置环境到初始状态(放置物体、随机扰动姿态、清零累计奖励等);step(action):执行一个动作步长,返回- 观测
obs(视觉、关节状态、语言上下文等); - 标量奖励
reward; - 是否结束
done; - 额外信息
info。
- 观测
- 重置与随机化
- 重置时可以对物体初始位置、姿态、材质、光照、摄像机位置等进行随机化,为后续的域随机化和泛化打基础;(Xue Bin Peng)
- 注意重置逻辑要确定且可重复,使用固定随机种子方便实验复现。
- 奖励函数与终止条件
- 奖励函数应与任务成功定义对应,例如:
- 抓取任务:抓取成功 +1,碰撞或超时 −1,其余为 0 或小的 shaping 奖励;
- 导航任务:每前进一步给少量负奖励,逼近目标给正奖励,撞墙大负奖励。
- 终止条件:达到目标、失败(跌倒、掉落)或超时。 这些设计与第 5 章中的 RL 设置一一对应,只是现在在具体仿真环境中实现。
- 奖励函数应与任务成功定义对应,例如:
- 任务复杂度与课程设计
- 初学者可从“单物体、静态场景、无干扰”做起,逐渐引入多物体、移动障碍、随机初始状态等难度,形成“仿真课程学习”。
7.1.3.3 自动化评测
一旦任务脚本搭建完成,就需要自动化评测来判断算法或 VLA 模型的好坏。
- 批量运行与指标统计
- 多次运行环境(如 100 或 1000 回合),统计:
- 任务成功率;
- 平均完成时间 / 步数;
- 平均奖励、最差奖励等。
- 对于并行仿真框架(MuJoCo MJX、Isaac Gym/Isaac Lab),可以一次性在 GPU 上同时评测大量环境,加速统计。(mujoco.readthedocs.io)
- 多次运行环境(如 100 或 1000 回合),统计:
- 日志与可视化
- 记录每步的状态、动作、奖励到日志文件(如 Python pickle、HDF5、ROS bag 等),方便之后做离线分析;(gazebosim.org)
- 保存关键回合的渲染视频或截图,便于定性检查策略行为是否合理。
- 基准化与消融实验
- 对同一环境,使用不同算法 / 模型结构 / 超参数进行对比;
- 设计消融实验(移除某个模块或训练阶段)观察性能变化,为后续论文写作提供可靠证据。
7.1.4 仿真–现实差距的来源与缓解方法
【建议插图】图 7-4:“仿真世界”和“真实世界”两个气泡,中间标注各种差异(视觉、摩擦、延迟等),并标出几种典型弥补方法(域随机化、实机微调等)。
在第 5.4.2 节我们已经从强化学习角度讨论过 Sim2Real 的困难与策略,这里从仿真平台和物理建模 的角度,系统梳理一下“仿真–现实差距”(reality gap)的主要来源及缓解手段。
7.1.4.1 传感器差异
- 视觉传感器 仿真渲染通常是“完美”的:
现实中的视觉传感器则充满各种非理想因素,使得“同一场景”的图像在仿真和现实之间分布差异巨大(domain shift),从而导致 VLA 模型在实际相机图像上表现显著变差。
- 不存在真实相机中的噪声、模糊、曝光不均、白平衡漂移;
- 深度相机在仿真中往往没有“测不出”的洞、反射、红外干扰;
- 视角、畸变等也常常被设为理想值。(theconstruct.ai)
- 其他传感器
- 力 / 力矩传感器:现实中存在非线性、漂移和噪声,仿真常常给的是“干净数值”;
- 关节编码器:现实中会有量化误差、背隙、延迟等;
- IMU:现实的陀螺仪 / 加速度计具有偏置和随机游走,仿真若不建模这些噪声,则会低估算法对噪声的敏感性。
- 缓解思路(传感器侧)
- 域随机化(Domain Randomization):在仿真中随机改变纹理、光照、相机姿态、噪声等,使模型学到对这些变化不敏感。(Xue Bin Peng)
- 真实感渲染 + 噪声建模:使用 Isaac Sim 等提供的物理化渲染(PBR)、相机噪声模型,尽量逼近实际摄像机特性。(NVIDIA Developer)
- Real-to-Sim 校准:根据真实相机标定和采集的图像统计特性(噪声分布、伽马、失真参数)调整仿真渲染管线。
7.1.4.2 动力学差异
物理引擎做的是某种“理想模型”的数值求解,而真实机器人系统充满各种非理想性。
- 未建模 / 误建模的物理因素
- 质量、惯量估计不准;
- 关节摩擦、刚度、阻尼设置与真实系统不符;
- 马达和驱动链路(齿轮间隙、柔性连杆、电机饱和和延迟等)未建模或严重简化。(科学直通车)
- 接触与摩擦的不确定性
- 地面材质不均匀、灰尘和磨损使摩擦系数随时间变化;
- 物体边缘细节、变形、微小不规则都难以用刚体接触模型捕捉。 这些都会导致在仿真中学到的“最优动作”在真实环境下效果不佳甚至失败。
- 缓解思路(动力学侧)
7.1.4.3 差距缓解:综合策略
现实中往往需要多种方法联合使用,才能将仿真-现实差距控制在可接受范围内。
- 域随机化(Domain Randomization)
- 在仿真训练中同时随机化:
- 视觉域:材质、颜色、光照、相机姿态、噪声;
- 动力学域:质量、摩擦、关节阻尼、控制延迟;
- 场景布置:物体位置、数量、尺寸。(Xue Bin Peng)
- 理论与实践均表明,在一定条件下,域随机化可以理论上保证策略对真实世界的泛化上界。(arXiv)
- 在仿真训练中同时随机化:
- Sim-Real 协同训练与离线域优化
- Real-to-Sim:用真实数据改善仿真器
- 通过真实数据来校准渲染、传感器噪声和动力学参数,使仿真世界“更像现实”;
- 一部分工作在此基础上构建世界模型(world model),在模型内部做规划,再在现实中验证。(arXiv)
- 抽象与层次化控制
- 将低层连续控制抽象为更高层的技能或离散动作(例如“抓取”“放置”“移动到桌子左侧”),让策略主要在更抽象、对物理细节不那么敏感的层面上做决策;
- 低层则采用传统控制(PID、轨迹跟踪)和安全约束来屏蔽部分动力学差异。(arXiv)
从本书整体结构看,本节更多聚焦在“仿真器和物理参数”这一环,而第 5 章、9 章则分别从 强化学习算法 和 ** 训练范式 / 数据工程** 的角度继续展开。掌握这一节的内容,你就已经从“会用仿真跑 demo”迈向了“能用仿真认真做具身智能研究”的台阶。