Skip to content
Published on

Sim-to-Real — 把仿真中学到的东西带入现实

分享
Authors

引言

要让机器人做强化学习,需要几十万到几百万次的试错。要在真实机器人上积累这么多经验,时间、磨损和安全性的问题都会大到难以承受。因此许多研究选择这样的策略:先在仿真中快速、安全地积累大量经验,再把学到的策略迁移到真实机器人上。这就是 sim-to-real 迁移。

但这里存在一个根本性的难题。无论仿真做得多精细,都不是现实的完美复制品。摩擦、接触、传感器噪声、执行器延迟等因素都会有细微差异。这些细微差异累积起来,常常导致在仿真中表现完美的策略,一到现实中就惨遭失败。这种差距被称为现实差距(reality gap)。

本文将探讨现实差距为何产生,以及缩小它的代表性技术:域随机化、域适应、系统辨识、数字孪生,还有触觉这类特别难以复现的物理因素。为了准确起见,关于特定物理引擎或系统的细节规格,本文只提及确凿可靠的部分,不确定之处则做一般化描述。

什么是现实差距

现实差距泛指仿真与现实之间的一切不一致,它由多种原因造成。

              现实差距(Reality Gap)的原因
              ─────────────────────────────

   ┌─────────────────────┐        ┌─────────────────────┐
   │        仿真          │        │       现实           │
   │                     │        │                     │
   │ - 近似的物理         │  ≠     │ - 真实的物理          │
   │ - 理想化的摩擦模型   │ ──差距─▶│ - 复杂的摩擦与磨损     │
   │ - 完美的传感器       │        │ - 有噪声的传感器      │
   │ - 即时响应的执行器   │        │ - 延迟与背隙          │
   │ - 简化的接触模型     │        │ - 形变与打滑          │
   └─────────────────────┘        └─────────────────────┘

   如果策略学会了利用仿真的"漏洞"
   到了现实中漏洞消失,策略就会崩溃。

现实差距的成因大致可归纳如下。

  • 动力学不一致:仿真器所用的物理近似,与真实物体的质量、惯量、摩擦力存在细微差异。
  • 接触与摩擦:物体相互接触瞬间的力、打滑、形变,恰恰是物理引擎最难精确复现的部分。
  • 传感器差异:仿真中的相机图像或深度传感器数值,无法完全还原真实传感器的噪声、镜头畸变和光照变化。
  • 执行器差异:真实电机存在延迟、背隙(齿轮间隙)、力矩上限和磨损,而仿真往往把这些理想化掉了。

域随机化

缩小现实差距最广为人知的技术是域随机化(Domain Randomization)。这个想法带点悖论意味:不是让仿真更贴近现实,而是每一轮训练都让仿真的多个参数大幅随机波动。

核心直觉是这样的:如果在训练时让摩擦、质量、光照、颜色、传感器噪声等因素大范围变化,策略就不会过拟合到某一个固定设定,而是学会"这个范围内的波动是常态"。经过这样训练的策略,眼中的现实世界不过是又一次随机变形而已。

        域随机化的直觉
        ───────────────────

   [ 单一仿真 ]
   ●   ← 只针对一个狭窄的设定优化 → 在现实(○)中失败
        现实 ○  (在训练分布之外)

   [ 域随机化 ]
   ● ● ● ● ● ● ● ● ●   ← 对大范围变化都保持稳健
     现实 ○           (现实已包含在训练分布之内)

随机化对象大致可分为两类。

  • 视觉随机化:扰动纹理、颜色、光照、相机位置、背景等,使视觉策略更稳健。
  • 动力学随机化:扰动质量、摩擦系数、执行器延迟、关节阻尼等物理参数,使控制策略更稳健。
# 动力学随机化配置示例(概念性)
domain_randomization:
  friction:
    distribution: uniform
    low: 0.5
    high: 1.5
  mass_scale:
    distribution: uniform
    low: 0.8
    high: 1.2
  actuator_delay_ms:
    distribution: uniform
    low: 0
    high: 20
  observation_noise_std: 0.02
  gravity_scale:
    low: 0.98
    high: 1.02

域随机化的局限也很明显。随机化范围设得太宽,任务本身会变得太难,策略什么也学不到;设得太窄,又覆盖不了现实。把这个范围调到合适,本身就需要相当大的调参投入。

系统辨识

系统辨识(System Identification)是与域随机化互补的方法。它不靠随机扰动,而是用从真实机器人测得的数据,把仿真器的参数尽量校准到贴近现实。

举例来说,让真实机械臂沿多条轨迹运动,测量关节的响应,再优化摩擦系数、惯量、延迟等参数,使测量值与仿真结果一致。这样校准过的仿真器会更接近现实,从而缩小差距。

        系统辨识的循环
        ─────────────────

   真实机器人 ──▶ 采集测量数据
             与仿真结果比较
        调整仿真参数以减小误差
                     └────▶ (反复迭代,使仿真逼近现实)

实务中通常把域随机化和系统辨识结合使用:先用系统辨识把仿真器校准到接近现实,再用域随机化在其周围大范围扰动,把剩余的差距用稳健性来吸收。

观测历史与隐式适应

域随机化训练出的策略之所以能较好地迁移到现实,一个有趣的机制在于:策略会从过去观测的流动中,隐式地估计当前环境的特性。

只看某一瞬间的观测,无法判断此刻摩擦是大是小。但如果看最近几步中,机器人在给定命令下实际是如何运动的,就能在一定程度上推断出环境的物理特性。也就是说,如果策略以观测历史作为输入,它就有余地自行察觉"现在这是什么样的环境",并据此调整行为。

   通过观测历史隐式估计环境
   ──────────────────────────────────

   单帧:     观测 o_t         ──▶ 环境特性未知

   历史:     o_(t-k) ... o_t  ──▶ 从"命令与响应之间的关系"
             (过去的流动)          隐式估计摩擦、质量等
                                  ──▶ 据此调整行为

从这个角度看,大范围的域随机化不只是让策略变得迟钝,而更应理解为训练它区分不同环境并分别适应的能力。这也是为什么循环神经网络这类处理时间信息的结构,对这种隐式适应更有优势。

域适应

域适应(Domain Adaptation)着眼于把策略或感知模型从仿真域移植到现实域。典型场景是在视觉感知中,让仿真图像与现实图像的特征分布对齐,使仿真中学到的表征在现实图像上也能生效。

具体方法多种多样:把仿真图像转换成看起来像现实的样子、让特征空间对齐以至于两个域无法区分、用少量现实数据微调最后一个阶段等。核心目标是一致的——把仿真中学到的知识迁移到现实,同时把所需现实数据的量降到最低。

数字孪生与物理引擎

sim-to-real 归根结底依赖仿真器的品质。近来,把真实机器人和作业环境精确复制到虚拟空间的数字孪生(Digital Twin)概念频繁出现。其思路是:如果在尽可能反映真实工作单元几何形状、物体、光照的虚拟环境中训练策略,就能缩小现实差距。

在物理引擎方面,利用 GPU 同时并行仿真成千上万个环境的工具,极大加速了机器人强化学习。NVIDIA 的 Isaac 系列仿真工具常被提及,此外还有多种物理引擎也用于机器人研究。不过各工具的具体功能和性能可能因版本而异,细节建议以官方文档为准。

        GPU 并行仿真的优势
        ──────────────────────────

   单一环境:   [env] ──▶ 数据采集缓慢

   并行环境:   [env][env][env] ... [env]   (成千上万个同时运行)
                  │    │    │        │
                  └────┴────┴────────┘
              短时间内采集大量经验
              ──▶ 强化学习变得切实可行

难以复现的物理 — 触觉与摩擦

sim-to-real 中特别棘手的领域是接触密集操作(contact-rich manipulation)。抓取、插入、擦拭这类动作高度依赖细微的摩擦力和接触力,而这恰恰是物理引擎最难精确复现的地方。

  • 摩擦:静摩擦与动摩擦之间的切换、随表面状态发生的变化,很难用一个简单的系数来概括。
  • 形变:柔软物体或布料这类会改变形状的对象,无法用刚体假设来表示。
  • 触觉传感器:检测指尖压力分布或打滑的触觉传感器,在仿真中尤其难以复现。

由于这些原因,像精密装配这类高度依赖触觉的任务,单靠纯仿真学习局限很大,往往更需要现实数据或在现实中做微调。

zero-shot 迁移的可能性与局限

理想目标是 zero-shot 迁移,也就是在现实中完全不做额外学习或调整,仿真中学到的策略就能直接在现实中运行。在广泛应用域随机化的移动机器人步态等部分任务上,已有令人印象深刻的 zero-shot 结果被报告过。

但并非所有任务都是如此。像接触密集的精密操作这类现实差距较大的任务,往往仍需要在现实中做 few-shot 微调(few-shot fine-tuning)。因此在实务中,把它理解为一个光谱更为现实。

   迁移的光谱
   ───────────────

   zero-shot          few-shot           full real training
   (无需现实调整)      (少量现实数据)       (在现实中大量学习)
      │                   │                     │
   差距较小的任务        差距中等的任务         差距非常大的任务
   (例如:某些步态)      (多数操作任务)        (极限精密、柔性物体)

观测差距与动力学差距

处理现实差距时,把它分成两类来思考会更有帮助:观测差距和动力学差距。

观测差距是机器人"看"世界方式上的差异,比如仿真的相机图像与现实图像看起来不同,或者深度传感器的噪声特性不一致。动力学差距是世界实际运动方式上的差异,比如施加同样的力,物体在仿真和现实中的反应不同。

   两类差距
   ──────────────

   观测差距                       动力学差距
   ┌──────────────┐            ┌──────────────┐
   │ 感知世界      │            │ 世界运动      │
   │ 方式的差异    │            │ 方式的差异    │
   │              │            │              │
   │ 例:图像质感  │            │ 例:摩擦、惯量 │
   │     传感器噪声│            │     延迟、接触 │
   └──────┬───────┘            └──────┬───────┘
          │                           │
          ▼                           ▼
   主要靠视觉随机化、             主要靠动力学随机化、
   域适应来应对                   系统辨识来应对

这种区分之所以有用,是因为出问题的是哪一种差距,决定了要开出什么样的处方。如果视觉感知不稳,需要视觉随机化或域适应;如果控制不稳,则应把精力集中在动力学随机化或系统辨识上。如果把两种差距混为一谈,很容易把力气用错地方。

特权信息与教师-学生学习

sim-to-real 中常用的一个强大技术,是利用特权信息(privileged information)的教师-学生(teacher-student)学习。

思路是这样的:在仿真中,可以获取现实中无法得到的完美信息,比如物体的精确质量、地形的精确高度、摩擦系数等数值。直接接收这类特权信息的教师策略,学习起来非常容易、效果也非常好。问题在于,现实中的机器人并没有这些信息。

因此把过程拆成两个阶段。首先在仿真中训练拥有特权信息的教师策略;然后只用现实中实际能获取的观测(相机、关节传感器等),训练一个模仿教师行为的学生策略。学生在没有特权信息的情况下,学会了表现得和教师相似,最终把这个学生策略部署到现实中。

   教师-学生学习(利用特权信息)
   ────────────────────────────────

   [教师]  特权信息(完美的物理数值) ──▶ 轻松学到好策略
              │  以教师的行为为目标
   [学生]  只使用现实中可获得的观测 ──▶ 学习模仿教师
   现实部署:学生策略(无需特权信息)

这种方法在地形信息至关重要的任务中特别有效,比如多足步行。在仿真中可以精确知道地形高度,但在现实中做不到,因此让学生学会从过去观测的流动中隐式估计地形。

从案例看差距的大小

再具体地看一下前面提到的迁移光谱。一个任务落在哪个位置,大致由两个因素决定:接触的复杂度和精度要求。

  • 接触少、余量大的任务:开阔空间中的移动,或大致推动大型物体这类任务,现实差距相对较小,通常仅凭大范围域随机化就能实现良好迁移。
  • 接触多但仍有余量的任务:拾取并搬运物体这类常见操作,差距处于中等水平,在随机化基础上加上少量现实数据微调会有帮助。
  • 接触多且精度要求极高的任务:以微小间隙插装零件或处理布料等作业,差距非常大,需要大幅提高现实数据的比重。
   决定任务位置的两个轴
   ────────────────────────

   精度
   要求
   高 ┤ 精密装配          极限柔性物体
      │ (大量现实数据)     (几乎靠现实训练)
      │ 大致推动          一般操作
   低 ┤ (接近 zero-shot)   (few-shot)
      └────────────────────────────▶
        低        接触复杂度        高

这张地图并非绝对,每个任务都可能有例外,但它能给出一个大致的直觉,帮你判断"自己的任务是多难的一次迁移"。

实务工作流

将 sim-to-real 实际应用时的大致流程如下。

   sim-to-real 实务流水线
   ────────────────────────────

   [1] 数字孪生/环境建模
   [2] 通过系统辨识校准仿真参数
   [3] 设定域随机化范围,进行仿真训练
   [4] 在现实中做小规模评估
        ├── 性能足够 ──▶ 部署
        └── 发现差距 ──▶ 重新调整随机化范围/辨识 (回到 [2]/[3])

执行器与延迟建模

现实差距中占比意外地大的一项,是执行器的非理想性。仿真常常假设"命令的力矩会立即原样输出",但真实电机并非如此。

  • 延迟(Latency):从下达命令到实际输出力,需要时间。控制周期越快,这种延迟的相对影响就越大。
  • 背隙(Backlash,齿轮间隙):齿轮存在间隙,换向时会有短暂一段力无法传递。
  • 力矩上限与饱和:电机能输出的力有上限,在接近上限时,响应不再按命令行事。
  • 摩擦与磨损:关节摩擦会随时间变化,并且每个机器人个体之间也存在细微差异。
   理想 vs 真实执行器
   ──────────────────────────

   理想:  命令力矩 ──即时──▶ 输出力矩 (完全一致)

   真实:  命令力矩 ──延迟──▶ ──背隙──▶ ──饱和──▶ 输出力矩
                    (耗时)   (间隙)   (上限)   (不完全)

   ▶ 如果策略依赖理想化假设,在现实中就会出现振荡或失败。

应对方法包括把这些非理想性反映进仿真,或者用一个从数据中学到的独立模型来替代执行器的响应本身。特别是把延迟也纳入随机化对象,对控制策略的稳健性有很大帮助。

Real-to-Sim — 反方向的桥梁

到目前为止讨论的都是从仿真到现实的方向,但反方向的流动同样重要,即通过观测现实来构建或改进仿真的 real-to-sim。

如果用 3D 扫描或重建技术,把现实场景搬进虚拟环境,就能得到一个与真实作业空间一模一样的仿真。在这样构建出的仿真中学到的策略,再迁移回那个空间就会容易得多。循环往复地重复 real-to-sim 与 sim-to-real,就能形成仿真与现实相互改进的良性循环。

   real-to-sim ↔ sim-to-real 的循环
   ────────────────────────────────

   现实观测 ──(real-to-sim)──▶ 构建精确仿真
        ▲                              │
        │                              ▼
        │                       在仿真中训练策略
        │                              │
        └──(sim-to-real)◀── 在现实中验证/采集数据

从案例看 sim-to-real

为了获得具体的感觉,不妨对比两类任务。真实系统的具体数值因实现而异,这里只描述一般性的趋势。

第一,四足与双足机器人的步态。这类任务把域随机化和基于特权信息的教师-学生学习结合起来,已有若干相对成功的 sim-to-real 案例被报告过。做法是先在仿真中训练出对多样地形和外部扰动都稳健的策略,再应用到现实中的行走。

第二,指尖精密操作。用多个手指旋转或重新摆放物体的任务,通过广泛的域随机化取得过令人印象深刻的结果。不过这类任务的接触极为复杂,设定随机化范围和训练本身都需要相当大的工程投入。

这两个案例共同的教训是:成功的 sim-to-real 不是某一种魔法技巧,而是多种技术(随机化、辨识、教师-学生、审慎评估)组合与反复调优的产物。

现实部署时的安全机制

无论在仿真中验证得多么充分,当学习到的策略第一次装到真实机器人上时,都可能出现意料之外的行为。因此在实际部署阶段设置多重安全机制,是标准做法。

  • 力矩/速度限制:无论策略下达多大的命令,都在硬件层面阻止其超出安全极限。
  • 工作空间边界:一旦机械臂离开指定的安全区域,立即使其停止。
  • 紧急停止:设置人可以随时介入、停止机器人的物理开关和软件开关。
  • 渐进式部署:先从低速、窄范围开始,随着信任逐渐积累再逐步放宽条件。
   现实部署的安全层级
   ─────────────────────

   策略输出
   [力矩/速度限制] ──▶ 阻止超出硬件极限
   [工作空间边界] ──▶ 离开安全区域即停止
   [紧急停止待命] ──▶ 人可随时介入
   实际机器人动作(在安全范围内)

这些机制本身不会提升 sim-to-real 的性能,但它们是防止差距导致的意外失败演变成事故的最后一道防线,对于在人身边工作的机器人尤其不可或缺。

量化差距

在 sim-to-real 的研究与实务中,判断"差距有多大"很重要。为此,通常会在仿真和现实中运行同一个策略,比较二者的性能或轨迹相差多少。

  • 性能差距:仿真中的成功率与现实中的成功率之差。这个差值越大,说明迁移越失败。
  • 轨迹差距:面对相同命令,机器人在仿真和现实中的状态随时间的演化有多大差异。
   仿真-现实的轨迹差距
   ────────────────────

   仿真:   s0 ─▶ s1 ─▶ s2 ─▶ s3 ─▶ ...
   现实:   s0 ─▶ s1'─▶ s2'─▶ s3'─▶ ...
                  ↑     ↑     ↑
                逐渐拉大的差距

   ▶ 如果一开始就大幅拉开,应怀疑动力学差距;
     如果只在特定情形下拉开,应怀疑该情形下的物理复现。

这类量化能告诉你该修什么。如果轨迹从一开始就出现偏离,需要做基础的动力学校准;如果只在特定瞬间(例如发生接触时)才出现偏离,则需要改进那部分物理的复现。

陷阱与注意事项

  • 过度随机化:盲目扩大随机化范围,会导致训练完全无法收敛,或者得到一个过度保守的策略。
  • 利用仿真漏洞:策略可能会利用仿真器的物理错误,以不切实际的方式获取奖励。这类只在仿真中管用的策略,一到现实中就会崩溃。
  • 评估偏差:不能因为仿真性能好,就对现实性能盲目乐观,必须在现实中充分验证。
  • 传感器对齐:如果仿真和现实之间的传感器坐标系、延迟、尺度出现偏差,策略会立刻失败。这种对齐经常被忽视,却非常重要。

结语

sim-to-real 迁移是让机器人学习变得切实可行的关键桥梁。域随机化用稳健性吸收差距,系统辨识和数字孪生把仿真器拉近现实,域适应则把学到的知识移植到现实中。这些技术并不互相排斥,实务中往往组合使用。

不过在触觉、精密接触等物理难以复现的领域,仍然需要现实数据,zero-shot 迁移并非万能。与其说 sim-to-real 是一个已经完成的解决方案,不如说它更接近一个持续不断、一点点缩小现实差距的工程过程。

参考资料