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

224 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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。