# rc_mjlab 基于 [mjlab](https://github.com/google-deepmind/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. 训练与回放 ```bash # 运行平地基础训练 (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` 目录下: ```bash # 启动 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。