4. 域随机化核心原理
在Isaac Sim中构建Sim2Real(仿真到现实)迁移管线时,域随机化(Domain Randomization, DR)是解决“仿真与真实差距”(Reality Gap)最核心且最实用的方法论之一。其基本思想是:与其花费巨大精力去构建一个与真实世界高度逼真的单一仿真环境,不如在训练过程中主动引入大量可控的随机变化,迫使强化学习(RL)策略学习到对环境参数变化不敏感的鲁棒行为。本章将深入拆解域随机化的三个核心问题:随机化什么(对象维度)、随机化多少(程度与策略)、以及随机化如何影响策略的最终泛化能力。我们将结合Isaac Sim的具体操作,给出可落地的参数配置建议与实战案例。
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随机一次,模拟执行器随温度变化导致的特性漂移。
task_phase变量控制当前随机化范围。
4.3 随机化对策略泛化的影响:机制与权衡
域随机化之所以能提升策略的Sim2Real迁移能力,其本质是让策略在参数空间中学习到一个“平坦”的最优区域,而不是一个尖锐的峰值。当真实环境参数落在训练时的随机化范围内时,策略表现不会显著退化。
4.3.1 泛化能力提升的机制
- 鲁棒性增强:策略被迫适应多种环境,不再过度拟合仿真中的特定参数组合。
- 特征解耦:视觉随机化迫使策略学习物体的几何形状和相对位置,而非依赖颜色或纹理。
- 控制保守化:动力学随机化使策略倾向于采用更平滑、更安全的控制指令,避免依赖精确的力矩峰值。
4.3.2 过度随机化的风险
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%,这是因为策略需要更多样本以适应更广泛的环境分布。在复盘时我们发现,动力学随机化中的执行器延迟是提升真实环境成功率的关键因素——它迫使策略采用更保守的力控策略,避免了因真实电机响应滞后导致的抖动。
4.5 常见误区与总结复盘
在域随机化的实际应用中,我们总结了以下常见误区,供学习者参考:
- 误区一:随机化范围越大越好。实际上,过大的范围会导致策略过于保守,甚至无法完成任务。建议从标称值±10%开始,逐步扩大。
- 误区二:所有参数均匀随机。不同参数对任务的影响权重不同。例如,对于抓取任务,摩擦系数的影响远大于重力加速度。建议使用灵敏度分析确定关键参数。
- 误区三:忽略参数间的相关性。例如,质量增大时,摩擦系数也应适当增大,否则物体容易滑动。在Isaac Sim中,可以使用
np.random.multivariate_normal生成相关随机向量。 - 误区四:只在训练开始时随机化。对于长训练任务,建议在训练过程中持续注入随机化,避免策略后期过拟合。
总结而言,域随机化的核心在于“在正确的时间、以正确的幅度、随机化正确的对象”。通过视觉、物理、动力学三个维度的协同随机化,并配合课程化策略和合理的分布选择,我们能够在Isaac Sim中训练出具备强大Sim2Real迁移能力的策略。下一阶段,我们将探讨如何通过域适配(Domain Adaptation)技术进一步缩小仿真与真实的差距,敬请期待。