第 9 章 Sim-to-Real 与 ROS 2 桥接¶
仿真里训好的策略,凭什么能在真机上不炸?靠的是把"仿真与真机的差距"显式建模进训练,让策略在训练期就见过足够宽的扰动,真机落差落进它见过的分布里。本章讲 sim-to-real 的三件套(延迟、感知噪声、系统辨识)如何落到第 6 章的事件与观测项,再到把策略接进机器人中间件(ROS 2)与真机最小部署链路。ROS 2 桥接的扩展名目与话题映射在 Isaac Sim 侧,本章讲映射关系与部署链路的形态。
1. 迁移三件套¶
真机与仿真的系统性差距集中在三处,逐一都要在训练里建模:
- 延迟(delay):真机的"感知→推理→下发→执行器响应"有滞后,仿真默认零延迟。不建模,策略会学出依赖即时反馈的高频动作,真机上失稳。
- 感知噪声(sensing noise):真机编码器、IMU、相机有噪声、量化、偏置;仿真观测常是干净真值。策略若拟合了这些"免费精度",真机观测一噪就退化。
- 系统辨识(system identification):真机的质量、惯量、摩擦、PD 增益与 URDF 标称值有偏差。先量出真机参数,把仿真参数校到真值附近,再用域随机化覆盖残余不确定。
三件的建模方式不同:延迟要按分布建模(均值加长尾,固定延迟覆盖不了偶发卡顿),随机范围取真机延迟的 p99 而不是最大值,否则策略会学成过度保守;感知噪声按传感器手册的噪声密度与量化步长生成,不是随手加高斯;系统辨识只求把参数校到与真机同一数量级,残余偏差交给域随机化——辨识到小数点后三位既做不到,也没必要。
三者的分工是:系统辨识缩小均值差、域随机化覆盖残余方差、延迟与噪声建模把动态落差也铺进分布。只靠"一次域随机化即可上真机"是不成立的——不加延迟与感知噪声建模,策略会对真机的时序与观测退化毫无免疫。
2. 用事件与观测项落地三件套¶
三件套不是新机制,而是第 6 章 event/observation manager 的具体配法:
- 感知噪声 →
ObsTerm的噪声配置字段(UniformNoiseCfg/GaussianNoiseCfg)与modifiers。训练期开、评估期关(第 8 章play_mode),逼策略从带噪观测里提取稳定量。 - 参数不确定 →
EventTermCfg(func=mdp.randomize_rigid_body_mass / randomize_joint_parameters / randomize_rigid_body_material / randomize_actuator_gains, …),把区间中心放在系统辨识得到的真值上、用区间宽度覆盖误差带。这正是域随机化的事件表达(第 6 章)。 - 延迟 → 两条常见做法:把动作/执行延迟建模为一段状态滞后(如给动作目标加一阶惯性
actuator的tau,或用decimation/动作平滑把有效带宽压低),或对观测施加时滞。注意后端边界(第 6 章:Newton 单一摩擦系数),随机化字段要确认被当前后端消费。
配合第 6 章的 ADR(DifficultyScheduler + modify_term_cfg 按成功率推噪声/扰动区间),可让"策略越强、真机扰动越接近上界",把鲁棒性顶到部署所需水平。
3. ROS 2 桥接与话题映射¶
把仿真接进机器人中间件靠 Isaac Sim 侧的 ROS 2 Bridge 扩展:它把仿真里的传感器输出发布成 ROS 2 话题、把 ROS 2 命令话题回灌给执行器,使下游控制/感知节点无需感知"这是仿真"。架构上这与 ROS2-note 第 9 章的 ros_gz 桥 同构——都是"仿真内部消息 ↔ ROS 2 话题"的双向映射表;
与 ROS2-note 第 6 章 ros2_control 的关系则是:仿真的 hardware_interface 用物理引擎的 read/write 顶替真机的串口/CAN 通信层。
时钟一致性是关键一环:仿真按自己的步长发 /clock,下游节点设 use_sim_time 从 /clock 取时间戳,TF、规划、状态估计才不会与仿真脱拍(同 ros_gz 的 /clock 机制)。
一条边界要说清:ROS 2 发布逻辑不在 Isaac Lab 核心包里——use_sim_time、话题命名与映射表都在 Isaac Sim 的 ROS 2 Bridge 扩展侧,扩展名目随 Isaac Sim 版本变化,以对应版本的 ROS 2 Bridge 文档为准。启用的前置是完整 Isaac Sim 运行环境加 ROS 2 发行版;两侧话题通过扩展的映射配置对齐,回引关系以 ROS2-note 为准。
坑:ROS 2 发布逻辑不在 Isaac Lab 核心包
use_sim_time、话题命名与映射表都在 Isaac Sim 的 ROS 2 Bridge 扩展侧,扩展名目随版本变化;启用前置是完整 Isaac Sim 环境加 ROS 2 发行版。
4. 策略上真机的最小部署链路¶
把第 8 章导出的 policy.onnx/policy.pt 放到真机侧,最小链路只有三段:
- 读本体观测:按训练期
policy观测组的同一顺序与尺度拼观测向量(少一维、错一位、量纲不符都会让策略失灵——这是最常见的翻车点)。 - 推理:加载出的 TorchScript/ONNX 每控制步前向一次。第 8 章给了单步时延判据(CPU 约 8.8 µs),远小于典型 50–500 Hz 控制周期,推理不是瓶颈;瓶颈在观测拼装与通信。
- 下发:把动作按第 3 章
scale/use_default_offset的同一映射写成关节目标,交给真机控制器(走 ros2_control 或直连驱动)。
Isaac Lab 侧的部署抽象在 isaaclab.envs.leapp_deployment_env(StateInputSpec/CommandInputSpec/WriteOutputSpec 把"状态输入/指令输入/输出写回"形式化,配合第 8 章的 LEAPP 图);端到端运行由 Isaac Sim 的部署环境承接,本节链路描述以导出产物与观测/动作映射约定为主。
判据级闭环检查:上真机前,先用"同一段仿真但注入第 2 节的延迟与噪声"做硬件在环式的对照——若仿真加了延迟/噪声后成功率仍稳,真机落差的概率才显著下降。
部署侧还要把策略版本与观测契约一起登记:同一个 checkpoint 配错 mean/std 就是另一个策略,回滚时若只认权重文件名,现场跑的是哪一版无从追溯。
仿真侧桥接与真机侧部署的两条链路:
flowchart LR
obs["读本体观测<br/>与训练期同一顺序、同一尺度"] --> pol["policy.onnx / .pt<br/>每控制步前向一次"]
pol --> act["动作按 scale / use_default_offset<br/>映射为关节目标"]
act --> ctl["真机控制器<br/>ros2_control 或直连驱动"]
sim["Isaac Sim + ROS 2 Bridge<br/>同一话题契约与 /clock"] -.->|"硬件在环对照:注入延迟与噪声"| obs
判据:上真机前先做带噪声的仿真对照
在同一段仿真里注入延迟与噪声,成功率仍稳,真机落差的概率才显著下降;直接上真机等于把两类误差混在一起排。
4.1 观测与动作的契约比对¶
第 1 段说的"同一顺序与尺度"可用一个线性策略量化:观测 6 维(底座角速度 3 + 关节位置 2 + 上一步动作 1)、动作 2 维,训练期契约是先按维归一化再前向。
| 拼装方式 | 与契约解的动作偏差 |
|---|---|
| 契约一致 | 0.000 |
| 顺序错位(两组维度整体调换) | 0.569 |
| 少一维(上一步动作置零) | 0.056 |
| 未归一化(直接喂原始物理量) | 0.205 |
z = (obs - mean) / std # 训练期契约:维度顺序、mean、std 三者一起固定
a = z @ w + b # 真机侧复用同一组 mean/std/w/b,不重算不重排
判据:把训练期的观测顺序、mean/std、动作 scale 与 default offset 纳入导出产物,真机侧用一组录制的仿真观测做逐位比对——同一 obs 在仿真与真机侧前向的输出应在浮点误差内一致,不一致即契约已被破坏,先修契约再谈域随机化。
5. 要点¶
- sim-to-real 靠三件套:延迟、感知噪声、系统辨识;"一次域随机化即可上真机"不成立,缺延迟与噪声建模会让策略对时序与观测退化无免疫。
- 三件套落到第 6 章的机制上:感知噪声进
ObsTerm.noise、参数不确定进随机化 event(中心放辨识真值)、延迟进执行器惯性/decimation/动作平滑;ADR 把扰动上界随成功率顶高。 - ROS 2 桥接是 Isaac Sim 侧扩展的双向话题映射,与 ros_gz 同构、与 ros2_control 是"仿真 hardware_interface 顶替真机通信层"的关系;
/clock+use_sim_time保时钟一致;扩展名目与话题映射随 Isaac Sim 版本变化。 - 真机最小链路:观测按训练序拼 → 导出的 TorchScript/ONNX 每步前向(第 8 章 CPU 8.8 µs,非瓶颈)→ 按
scale/offset同一映射下发;leapp_deployment_env为部署抽象(属外部路径)。 - 观测顺序/尺度错位是最常见翻车点;上真机前先做"带延迟与噪声的仿真对照"作闭环判据。
参考文献与延伸阅读¶
- Tobin, J., Fong, R., Ray, A., et al. Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World. IROS, 2017. arXiv
- Zhao, W., Queralta, J. P., & Westerlund, T. Sim-to-Real Transfer in Deep Reinforcement Learning for Robotics: A Survey. SSCI, 2020. arXiv
- Isaac Sim. 文档入口. 文档