Files
RC_WheelLeg/05_software/train/rc_mjlab/README.md
T

14 KiB
Raw Blame History

rc_mjlab

基于 mjlab 框架的四轮腿混合机器人强化学习训练与部署部署项目,面向机器人竞赛场景(如越障、匍匐、斜坡、台阶等复合任务)。

本目录对应 v0.6.0:比赛使用的最终训练架构。它在前两版训练代码上重新平衡随机化强度,引入分轴速度奖励、自适应命令课程、障碍逐步释放、楼梯稳定约束和训练诊断指标。当前目录中的 model_rough.pt 是早期参考权重;比赛最终使用的 model_6800.onnx 将随最终部署版本归档。


🛠️ 项目简介

本项目针对一台 4 腿 × 3 关节 + 4 驱动轮(轮腿混合) 的移动机器人,在 MuJoCo 物理引擎中利用 PPO 算法进行多任务运动控制策略训练。

系统设计特点包括:

  1. 高保真动力学步进:物理仿真计算步长设为 2ms (0.002s),为碰撞、地面力学传递提供极高的解算频宽与稳定性。
  2. 50Hz 控制决策循环:通过在环境中设置 decimation = 10,策略决策周期为 20ms (0.002\text{s} \times 10 = 0.02\text{s}),即控制决策频率为 50Hz,完全对齐真机控制周期。
  3. 混合滤波执行器
    • 腿部 12 个位置控制关节采用位置 PD 伺服($K_p=40, K_d=1$),并叠加截止频率为 5Hz 的低通滤波器进行动作平滑,减小高频机械抖动。
    • 轮部 4 个速度驱动关节采用阻尼速度伺服($K_d=0.5$),叠加截止频率为 15Hz 的低通速度滤波器,保证转速响应的灵敏度。
  4. 大规模并行加速:利用 GPU 并行(通过 Warp 和 MuJoCo GPU 物理管线),支持最多 4096 环境同时训练,并包含对动作变化率、关节加速度的惩罚项以平抑噪声。

📦 项目结构

rc_mjlab/
├── src/robot/                    # RL 训练任务包(主体代码)
│   ├── __init__.py               # 任务注册(Robot-Flat-v0 / Robot-Rough-v0 / Robot-Crawl-v0
│   ├── robot_cfg.py              # 机器人物理参数(PD 增益、执行器上限、碰撞属性)
│   ├── config/
│   │   ├── env_cfgs.py           # 三套环境完整配置(观测、奖励、事件、地形、终止条件)
│   │   └── rl_cfg.py             # PPO 超参数(网络结构、学习率、折扣因子等)
│   ├── mdp/
│   │   ├── rewards.py            # 自定义奖励函数(速度追踪、姿态约束、接触、越障反射惩罚等)
│   │   ├── curriculums.py        # 地形关卡课程(严格速度约束版)+ 自适应速度范围
│   │   ├── lowpass_actions.py    # 低通滤波动作包装(腿 5 Hz / 轮 15 Hz IIR 滤波)
│   │   ├── disturbances.py       # 持续外力扰动(一阶低通滤波平滑随机外力/扭矩)
│   │   ├── mode_command.py       # 离散步态模式命令(保留扩展用)
│   │   └── only_positive_rewards.py  # HIMLoco 风格:每步总奖励截断为 ≥ 0,防止消极逃避
│   └── terrains/
│       └── competition_terrains.py   # 竞赛自定义地形(高墙障碍、低杆障碍)
├── sim2sim/                      # Sim2Sim 物理部署与高精度交互回放工具
│   ├── nav_sim2sim.py            # 主程序:2D Pygame 交互面板 + 全自动多地形导航追踪
│   ├── sim2sim.py                # 简易版键盘调试工具
│   ├── interface/
│   │   └── mujoco_io.py          # MuJoCo 输入输出与传感器、低通滤波器接口
│   ├── tools/
│   │   └── math_utils.py         # 姿态重力等数学转换
│   ├── policy/                   # 保存的 pt 策略权重
│   └── terrain/
│       └── scene_terrain.xml     # 完整越障比赛场地的物理 XML 定义
├── mjcf/
│   ├── wheelleg.xml              # 机器人 MuJoCo 模型(含网格引用)
│   ├── scene.xml                 # mjlab 场景入口文件
│   └── meshes/                   # STL/OBJ 碰撞与外观网格
├── model_rough.pt                # 本阶段用于回放和 Sim2Sim 的 Rough 策略
├── pyproject.toml                # 项目依赖(uv 管理,含清华镜像源加速)
└── uv.lock                       # 精确依赖锁定文件

🚀 常用命令

1. 训练与回放

# 运行平地基础训练 (Robot-Flat-v0)
uv run train Robot-Flat-v0

# 运行多障碍复杂地形训练 (Robot-Rough-v0),可从 Flat 的Checkpoint热启动
uv run train Robot-Rough-v0 --agent.resume True --agent.experiment-name robot_flat

# 运行爬坡与匍匐限高任务 (Robot-Crawl-v0)
uv run train Robot-Crawl-v0

# 使用默认 20 个并行环境回放最新 checkpoint 效果
uv run play Robot-Rough-v0

2. 交互式 Sim2Sim 自动导航仪表盘

我们提供了一个强大的 GUI 交互和全自动障碍赛追踪平台,位于 sim2sim 目录下:

# 启动 2D 交互导航平台
cd sim2sim
uv run python nav_sim2sim.py

🖥️ 交互式自动导航平台 (sim2sim/nav_sim2sim.py)

该平台包含一个 Pygame 2D HUD 监控面板 和一个 实时 MuJoCo 3D 渲染器,支持对仿真参数和任务执行的精细控制。

1. 按钮面板分区与布局

面板在垂直方向进行了高紧凑性排版,避免控件重叠,并在底端留有安全间距:

  • 【预设任务列表】(按物理穿越顺序排列):
    • S形绕杆 (Slalom):绕过红蓝两色障碍杆路径。
    • 限高下蹲 (Crawl):降低机身高度穿过低杆障碍。
    • 砂砾碎石 (Gravel):平稳低速通过多颗粒非结构碎石坑。
    • 高墙越障 (Wall):高速度冲向障碍高墙,利用前轮攀爬反射爬越。
    • 台阶攀爬 (Stairs):攀越分段式台阶。
    • 斜坡木桥 (Bridge):穿过A坡并稳健从B坡落地。
    • 障碍赛大满贯 (Grand)科技紫圆角高亮按钮。点击后,机器人将以顺时针方向,自动、连贯且闭环地一次性穿越上述全部 6 个核心比赛障碍,并在木桥落地后,通过安全通道直角返航至起终点。
  • 【系统与视图控制】
    • 清除与停止 (Stop):一键紧急停止并重置当前目标航点。
    • 视角居中 (Center):一键锁定相机随机器人机身移动。
    • 物理流速三联排 (倍速- / 标准 / 倍速+):在不破坏物理计算数值稳定性的前提下,实现对仿真总体时间的平滑加速与慢放(支持 0.2x ~ 5.0x,可随时点击“标准”一键归位 1.0x)。
  • 【目标微调与命令终端】
    • 拥有高精度航点微调发令键。
    • 底部命令行支持输入 speed <倍率> 更改仿真速度,或者输入 grand 直接开启大满贯。

📊 机器人系统规格参数

1. 机器人本体参数

参数项 基准数值 说明
物理步长 (dt_{physics}) 0.002s (2ms) 底层 MuJoCo 求解器步长,物理精度极高
控制决策频率 (Freq_{ctrl}) 50Hz (20ms) $decimation = 10$,环境每 10 个子步进行一次交互决策
单轮仿真时长 30.0s 最大决策步数上限为 30.0 / 0.02 = 1500
腿部控制 位置 PD 伺服 目标关节角限幅 ±0.25 rad,叠加 5Hz 低通滤波器
轮部控制 阻尼速度伺服 目标速度限幅 ±10.0 rad/s,叠加 15Hz 低通滤波器
结构形式 4腿 × 3关节 + 4轮 腿:hip abduction, hip pitch, knee;轮半径 0.1m,左右轮距 0.32m
关节扭矩上限 17.0 Nm 关节最大输出力矩(训练时含 80%~100% 随机缩放)
最大关节角速度 13.0 rad/s 关节最大运动速度限制

2. 状态观测空间 (Actor Obs, 53维)

网络输入包含 6 步历史数据,并在训练时注入均匀高斯噪声以提升泛化能力:

观测项目 维度 缩放比例 噪声范围
基座角速度 (ang_vel) 3 0.25 [-0.2, 0.2] rad/s
投影重力向量 (projected_gravity) 3 1.0 [-0.05, 0.05]
指令速度 (vx, vy, wz/heading) 3 1.0
腿部关节相对角度 (joint_pos_rel) 12 1.0 [-0.01, 0.01] rad
腿部关节角速度 (joint_vel) 12 0.05 [-1.5, 1.5] rad/s
轮子角速度 (wheel_vel) 4 0.05 [-1.0, 1.0] rad/s
上一步动作缓存 (last_actions) 16 1.0

Critic 附加观测:包含高精度基座物理线速度、轮地实际接触状态、以及 1.6\text{m} \times 1.0\text{m} 分辨率为 0.08\text{m} 的高度雷达扫描网格,提供大范围越障感知。


⚖️ 奖惩体系设计 (Robot-Rough-v0)

复杂地形任务采用 “仅正奖励截断” 机制(即每步累加的总奖励若小于0则强制截断为0),防止机器人在困难关卡早期选择倒下自杀来规避负惩罚。

1. 运动追踪与状态惩罚

奖励/惩罚项 权重 (Weight) 适用函数 / 物理意义
track_lin_vel +4.5 L1 范数水平线速度跟踪奖励,平缓高速漂移
track_ang_vel +2.0 偏航角速度指数跟踪奖励
stand_still -2.0 当速度指令为 0 时,严厉惩罚关节多余晃动,保持稳立
joint_pos_penalty -0.8 当速度指令为 0 时,惩罚关节角度偏离初始对齐姿态,维持高刚度
roll_penalty -1.0 机身横滚角 (Roll) 倾斜惩罚,抑制左右倾倒抖动
pitch_penalty -1.5 俯仰角 (Pitch) 死区惩罚,限制仰角不超过 29 度,抑制越障瞬间前轮翘头和后翻
base_height_l2 -0.5 机身高度偏离 0.36m 惩罚(基于高度扫描均值,允许自适应高低)

2. 能量正则与平滑惩罚 (平抑高频抖动)

奖励/惩罚项 权重 (Weight) 适用函数 / 物理意义
action_rate_curriculum -0.005 动作变化率 L2 惩罚,迫使连续两个决策步的输出动作变化平滑
joint_torques -1.0e-4 关节输出扭矩 L2 正则,降低电机总发热和冲击性载荷
leg_joint_acc_l2 -2.5e-7 限制腿部 12 关节角加速度,直接抑制关节高频电磁和机械震荡
wheel_joint_acc_l2 -2.5e-9 限制 4 个驱动轮的角加速度,平缓轮速切换,降低打滑振荡
joint_pos_limits -0.2 极度接近关节极限限位阻挡时的硬惩罚

3. 接触反射与安全约束

奖励/惩罚项 权重 (Weight) 适用函数 / 物理意义
feet_contact_without_cmd +0.1 当速度指令为 0 时,鼓励四轮保持稳定接地的正向收益
body_collision -1.0 腿部连杆(大腿、小腿)触地碰撞惩罚,迫使抬腿跨越障碍
base_collision -5.0 机身/底盘硬撞障碍物时的严厉惩罚,逼迫机器人学会抬起前轮支撑攀爬
is_terminated 0.0 关闭越障任务的提早终止,允许机器人跌倒后自行挣扎起立,提高生存极限

🌀 域随机化 (Domain Randomization)

为了使训练的控制策略具有卓越的零样本真机部署能力,在环境重置及仿真运行中注入了高强度的域随机化参数:

随机化项目 扰动操作 随机范围
机身质心偏移 (base_com) 加法 X, Y, Z 三轴分别随机偏置 [-0.05, 0.05]
角度传感器零偏 (encoder_bias) 加法 关节传感器绝对偏置 [-0.015, 0.015] rad (约 \pm 0.85^{\circ})
几何表面摩擦力 (body_friction) 绝对值 地面及机器人碰撞几何体摩擦力在 [0.3, 1.2] 均匀随机
关节摩擦阻尼 (joint_friction) 乘法 所有旋转轴关节运动阻尼摩擦在原值的 [0.7, 1.3] 倍间随机
关节传动刚度 (actuator_stiffness) 乘法 Kp 刚度系数在原值的 [0.9, 1.1] 对数均匀范围内随机缩放
关节传动阻尼 (actuator_damping) 乘法 Kd 阻尼系数在原值的 [0.9, 1.1] 对数均匀范围内随机缩放
力矩输出上限 (actuator_effort_limit) 乘法 最大输出扭矩极限随机在原值的 [0.8, 1.0] 倍均匀缩放
负载质量 (payload_mass) 加法 在机身处添加载荷质量,扰动范围在 [-1.0, 3.0] kg
瞬时侧向推撞 (push_robot) 脉冲 每隔 [5.0, 10.0] 秒,瞬间施加 X/Y 轴 [-0.5, 0.5] m/s 冲击速度
一阶低通持续风阻 (continuous_disturbance) 连续 机身持续叠加随机外力(±15N)与力矩(±10Nm),低通周期 0.5s

🏆 多地形关卡难度控制 (Robot-Rough-v0)

共有 8 种子地形按照比例混合,通过自适应升级距离控制关卡难度的推进:

地形名称 混合比例 (Proportion) 最大配置难度
平地 (flat) 5% 作为初始安定性恢复区域
金字塔台阶 (pyramid_stairs) 25% 最大阶梯高度上限 0.30 米,级宽 0.30m
倒金字塔台阶 (pyramid_stairs_inv) 10% 最大倒台阶高度上限 0.30 米,级宽 0.30m
随机高度网格 (random_grid) 10% 最大网格方块起伏上限 0.30
随机粗糙地形 (random_rough) 5% 地表最大颗粒随机噪声起伏 0.06
柏林噪声地形 (perlin_noise) 5% 大范围高平缓起伏最大高度 0.06
越障高墙地形 (rc_wall) 25% 自定义跳跃垂直高墙,最大墙高上限 0.45
平台斜坡地形 (sloped_terrain) 15% 最大坡度限制 0.325 (约 18.5^{\circ})

地形升级规则:当机器人朝指令方向行进距离超过当前地块的一半(4米),且实际行进距离大于速度指令对应期望距离的 45% 时,该环境关卡等级 +1。
地形降级规则:当指令速度大于 0.1m/s 但实际行进距离小于期望距离的 25%,或者实际移动不足 2.0米时,环境难度等级 -1。