4. 域随机化核心原理

在Isaac Sim中构建Sim2Real(仿真到现实)迁移管线时,域随机化(Domain Randomization, DR)是解决“仿真与真实差距”(Reality Gap)最核心且最实用的方法论之一。其基本思想是:与其花费巨大精力去构建一个与真实世界高度逼真的单一仿真环境,不如在训练过程中主动引入大量可控的随机变化,迫使强化学习(RL)策略学习到对环境参数变化不敏感的鲁棒行为。本章将深入拆解域随机化的三个核心问题:随机化什么(对象维度)、随机化多少(程度与策略)、以及随机化如何影响策略的最终泛化能力。我们将结合Isaac Sim的具体操作,给出可落地的参数配置建议与实战案例。

域随机化核心原理与作用链路 视觉随机化 • 光照强度/色温/方向 • 纹理/材质/反照率 • 相机位姿/视场角/噪声 • 遮挡物/背景/景深 • 分辨率/曝光/白平衡 物理随机化 • 质量/质心/惯性张量 • 摩擦系数(静/动) • 弹性/阻尼/刚度 • 表面粗糙度/接触模型 • 重力/空气阻力 动力学随机化 • 关节摩擦/阻尼 • 电机扭矩/转速限制 • 执行器延迟/带宽 • 控制频率/噪声 • 关节限位/齿轮间隙 随机化程度与策略 • 均匀分布 vs 正态分布 • 固定范围 vs 自适应范围 • 课程化随机化(由小到大) • 域随机化 + 域适配 • 随机化频率(每Episode/每Step) • 关键参数优先随机化 策略泛化能力提升 鲁棒性↑ | 迁移成功率↑ | 零样本Sim2Real

4.1 随机化什么:视觉、物理与动力学的三维度拆解

域随机化的第一个核心决策是确定随机化对象。在Isaac Sim中,我们通常将随机化内容划分为三个维度:视觉、物理和动力学。这三个维度分别对应了感知层、状态层和执行层的不确定性。如果遗漏了某个关键维度,策略在真实环境中就可能遭遇“盲区”。

4.1.1 视觉随机化:对抗感知差异

视觉随机化主要作用于渲染管线,目的是让策略在图像输入上不依赖于特定的光照、纹理或相机参数。在Isaac Sim中,可以通过omni.isaac.core.utils.stage.add_reference_to_stage加载不同材质,或通过UsdLuxAPI动态调整光源属性。常见的视觉随机化参数包括:

  • 光照参数:太阳光强度(100-1000 lux)、色温(4000K-7000K)、光源方向(俯仰角±30°)、环境光强度。
  • 纹理与材质:物体表面的反照率(albedo)变化、粗糙度(roughness)变化、是否添加程序化噪声纹理。
  • 相机模型:焦距(±10%)、主点偏移、径向畸变系数、曝光时间、ISO噪声、运动模糊强度。
  • 场景布局:背景物体的随机摆放、桌面纹理替换、随机遮挡物(如树叶、纸箱)的生成。
经验提示:视觉随机化并非越“花哨”越好。对于抓取任务,过度随机化背景纹理可能导致策略忽略物体本身特征。建议优先随机化光照和相机位姿,其次才是纹理和背景。

4.1.2 物理随机化:对抗状态差异

物理随机化关注的是物体在仿真中的质量、摩擦、弹性等属性。这些参数直接影响接触力计算和物体运动状态。在Isaac Sim中,可以通过physxSchema或RigidPrimView的set_masses、set_frictions等方法进行批量设置。关键参数包括:

  • 质量与惯性:物体质量在标称值的±20%范围内随机,惯性张量对角线元素独立扰动。
  • 摩擦系数:静摩擦系数(0.3-1.2)、动摩擦系数(0.2-0.8),两者可独立随机。
  • 弹性与阻尼:恢复系数(0.0-0.5)、接触阻尼(0.1-1.0)。
  • 重力:在9.5-10.5 m/s²范围内微调,模拟不同海拔或传感器误差。

4.1.3 动力学随机化:对抗执行差异

动力学随机化针对机器人本体模型,包括关节驱动器的特性。这是Sim2Real中经常被忽视但极其重要的一环。真实电机存在摩擦力矩、死区、延迟和饱和,而仿真中的理想力矩源往往过于“干净”。在Isaac Sim中,动力学随机化通常通过修改ArticulationView的set_joint_frictions、set_joint_dampings以及添加执行器延迟来实现。

  • 关节摩擦与阻尼:每个关节的库仑摩擦力矩(0.1-0.5 N·m)、粘性阻尼系数(0.01-0.1 N·m·s/rad)。
  • 执行器延迟:在控制指令与力矩输出之间加入1-3个控制周期的延迟。
  • 力矩噪声:在输出力矩上叠加高斯噪声,标准差为最大力矩的1%-3%。
  • 关节限位:对关节角度限位进行±2°的随机偏移,模拟机械装配公差。

4.2 随机化程度与策略:如何设定分布与范围

确定了随机化对象后,下一个关键问题是“随机化到什么程度”。随机化范围过小,策略无法覆盖真实环境的分布;范围过大,则可能导致训练不稳定或策略过于保守(例如不敢移动物体)。我们需要根据参数特性选择合适的分布类型和范围。

4.2.1 分布类型选择

分布类型 适用场景 Isaac Sim实现方式 优缺点
均匀分布 参数真实范围未知,且认为各值等概率出现 np.random.uniform(low, high) 简单直接,覆盖全面;但可能包含极端不真实组合
正态分布 参数围绕标称值波动,有明确中心值 np.random.normal(mu, sigma) 更贴近真实物理世界;但需要合理估计标准差
截断正态分布 需要限制在物理可行范围内 scipy.stats.truncnorm 兼顾正态分布特性与边界约束
对数均匀分布 参数跨越多个数量级(如阻尼系数) np.exp(np.random.uniform(log_low, log_high)) 在小数值区间采样更密集

4.2.2 随机化频率与时机

随机化参数可以在每个Episode开始时重置,也可以在Episode中途动态变化。对于视觉参数(如光照),建议每个Episode随机一次;对于物理参数(如摩擦),可以每个Episode随机一次,但需要保证在一个Episode内参数保持不变,以便策略学习到“当前环境下的最优行为”。对于动力学参数(如关节阻尼),可以每个Episode随机,也可以每隔N个Step随机一次,模拟执行器随温度变化导致的特性漂移。

课程化随机化策略:在训练初期使用较小的随机化范围(例如摩擦系数0.4-0.6),让策略先学会基本任务;随着训练进行(如每5万步),逐步扩大范围(0.2-0.9)。这种“由易到难”的课程化方式能显著提升训练稳定性和最终泛化能力。在Isaac Sim中,可以通过task_phase变量控制当前随机化范围。

4.3 随机化对策略泛化的影响:机制与权衡

域随机化之所以能提升策略的Sim2Real迁移能力,其本质是让策略在参数空间中学习到一个“平坦”的最优区域,而不是一个尖锐的峰值。当真实环境参数落在训练时的随机化范围内时,策略表现不会显著退化。

4.3.1 泛化能力提升的机制

  • 鲁棒性增强:策略被迫适应多种环境,不再过度拟合仿真中的特定参数组合。
  • 特征解耦:视觉随机化迫使策略学习物体的几何形状和相对位置,而非依赖颜色或纹理。
  • 控制保守化:动力学随机化使策略倾向于采用更平滑、更安全的控制指令,避免依赖精确的力矩峰值。

4.3.2 过度随机化的风险

风险警示:随机化范围过大可能导致“泛化失败”。例如,将摩擦系数随机到0.0-2.0,策略可能学会“用极慢速度移动”来应对所有情况,导致任务效率极低。此外,过大的视觉随机化(如完全随机颜色)可能使策略无法识别物体。建议采用“关键参数优先、辅助参数适度”的原则。

4.3.3 评估泛化能力的指标

在Isaac Sim中,我们通常使用“域内评估”和“域外评估”两种方式。域内评估是在训练时的随机化范围内采样多组参数,测试策略的成功率方差;域外评估则是将随机化范围扩大20%-50%,测试策略的鲁棒性边界。如果域外评估成功率下降超过30%,说明策略过拟合于训练分布。

4.4 实战案例:机械臂抓取任务的域随机化配置

我们以Franka Panda机械臂在Isaac Sim中执行桌面物体抓取为例,展示一套完整的域随机化配置方案及其效果。

4.4.1 场景与目标

任务要求机械臂从桌面抓取一个随机放置的立方体并放入目标区域。初始仿真环境使用标准物理参数和固定光照。直接迁移到真实环境时,抓取成功率仅为35%。我们的目标是通过域随机化将成功率提升至80%以上。

4.4.2 初始现象与关键参数

在真实环境中,我们发现以下差异:真实桌面摩擦系数约为0.5,而仿真默认0.8;真实光照强度波动较大,且存在阴影;真实电机存在约5ms的延迟。我们决定针对这三个维度进行随机化。

4.4.3 实施步骤与配置

# 在Isaac Sim中配置域随机化(伪代码示例)
import numpy as np
from omni.isaac.core.utils.stage import add_reference_to_stage

# 1. 视觉随机化:光照强度与色温
def randomize_lighting():
    intensity = np.random.uniform(300, 800)  # lux
    color_temp = np.random.uniform(4000, 6500)  # K
    light_prim.GetAttribute("intensity").Set(intensity)
    light_prim.GetAttribute("colorTemperature").Set(color_temp)

# 2. 物理随机化:摩擦与质量
def randomize_physics():
    friction = np.random.uniform(0.3, 0.9)
    mass = np.random.uniform(0.8, 1.2)  # 标称1.0kg
    cube_prim.GetAttribute("mass").Set(mass)
    table_prim.GetAttribute("staticFriction").Set(friction)
    table_prim.GetAttribute("dynamicFriction").Set(friction * 0.8)

# 3. 动力学随机化:关节阻尼与延迟
def randomize_dynamics():
    joint_damping = np.random.uniform(0.02, 0.08)
    for joint in robot.joints:
        joint.GetAttribute("damping").Set(joint_damping)
    # 在控制循环中人为添加延迟
    control_delay_steps = np.random.randint(1, 4)  # 1-3个控制周期

4.4.4 结果对比与复盘

配置方案 仿真成功率 真实环境成功率 训练步数
无随机化(基线) 98% 35% 200k
仅视觉随机化 95% 58% 250k
视觉+物理随机化 92% 72% 300k
全维度随机化(含动力学) 88% 83% 350k

从结果可以看出,全维度随机化虽然略微降低了仿真内的成功率(从98%降至88%),但显著提升了真实环境的迁移成功率(从35%提升至83%)。值得注意的是,训练步数增加了75%,这是因为策略需要更多样本以适应更广泛的环境分布。在复盘时我们发现,动力学随机化中的执行器延迟是提升真实环境成功率的关键因素——它迫使策略采用更保守的力控策略,避免了因真实电机响应滞后导致的抖动。

案例经验总结:(1)优先随机化对任务影响最大的参数(本案例中为摩擦和延迟);(2)不要追求仿真内的高成功率,而应关注域外评估的稳定性;(3)课程化随机化(先小范围后大范围)可以将训练步数减少约20%,同时保持相同的迁移成功率。

4.5 常见误区与总结复盘

在域随机化的实际应用中,我们总结了以下常见误区,供学习者参考:

  • 误区一:随机化范围越大越好。实际上,过大的范围会导致策略过于保守,甚至无法完成任务。建议从标称值±10%开始,逐步扩大。
  • 误区二:所有参数均匀随机。不同参数对任务的影响权重不同。例如,对于抓取任务,摩擦系数的影响远大于重力加速度。建议使用灵敏度分析确定关键参数。
  • 误区三:忽略参数间的相关性。例如,质量增大时,摩擦系数也应适当增大,否则物体容易滑动。在Isaac Sim中,可以使用np.random.multivariate_normal生成相关随机向量。
  • 误区四:只在训练开始时随机化。对于长训练任务,建议在训练过程中持续注入随机化,避免策略后期过拟合。

总结而言,域随机化的核心在于“在正确的时间、以正确的幅度、随机化正确的对象”。通过视觉、物理、动力学三个维度的协同随机化,并配合课程化策略和合理的分布选择,我们能够在Isaac Sim中训练出具备强大Sim2Real迁移能力的策略。下一阶段,我们将探讨如何通过域适配(Domain Adaptation)技术进一步缩小仿真与真实的差距,敬请期待。