任务拓展
本章目标:在基础行走之上,实现转向、爬坡、避障三个进阶任务,把一个"只会直走"的鸭子变成"会各种走"的鸭子。
16.1 转向步态
在基础行走任务上,把奖励从"x 方向前进"改为"绕 yaw 角速度"驱动:
yaw_rate = obs[:, yaw_vel_idx] # 绕垂直轴角速度
turn_reward = clip(target_yaw_speed * yaw_rate, 0, 1.0)
# 抑制横向滑移
lateral_penalty = -torch.abs(obs[:, yaw_vel_idx_side])
reward = turn_reward + lateral_penalty + stance_rewards
真机验证:鸭子原地转向指定角度,不倾倒、不滑移。
16.2 斜面爬坡
16.2.1 斜面环境搭建
在 MuJoCo 中把地面改为斜面,或在 MJCF 里增加斜面 geom:
<geom type="box" size="..." pos="..." quat="..."/>
<!-- 或用 ground 加倾斜 -->
16.2.2 爬坡奖励
爬坡的难点是沿斜面的投影前进 + 保持稳定:
slope_forward = obs[:, proj_along_slope_idx]
reward = clip(slope_forward * 1.0, 0, 1.0) + stability_terms
配合课程学习:先平地,再小坡度(5°),逐步到 15°(见第 11 章)。
16.2.3 真机验证
在垫木块或斜面垫上测试爬坡,观察是否打滑、后仰。地面摩擦域随机化在此场景尤其关键。
16.3 避障(进阶)
16.3.1 视觉感知接入思路
RK3566 算力有限(1GB),无法同时跑高分辨率视觉 + RL 策略。推荐降级方案:
- 用 YOLO 轻量版(如 YOLOv5-nano / YOLO11-nano)做障碍物检测;
- 只输出"前方有无障碍、距离"的低维信息,并入观测向量;
- 或者分时处理:视觉低频(如 5Hz),RL 控制高频(50Hz)。
16.3.2 避障奖励
if obstacle_detected:
reward += turn_away_reward # 鼓励转向避开
else:
reward += forward_reward # 无障碍时前进
16.3.3 局限性说明
- 视觉闭环是本书进阶拓展,涉及相机选型、标定、vLA/感知策略集成,工作量较大;
- 本书主链路完成"本体平衡 + 行走/转向/爬坡",视觉避障作为可选延伸。
16.4 多任务合并训练
把转向、爬坡合并进第 12 章的多任务 one-hot 编码,一个 ONNX 支持全部动作:
| 编码 | 任务 |
|---|---|
[0,1,0,0,0,0] | 向前行走 |
[0,0,1,0,0,0] | 左转 |
[0,0,0,1,0,0] | 右转 |
[0,0,0,0,1,0] | 摔倒自恢复 |
[0,0,0,0,0,1] | 爬坡 |
16.5 工程踩坑实录
- 爬坡后仰:奖励只奖励前进,没奖励重心稳定,鸭子爬坡时后仰摔倒。加重心投影奖励。
- 转向滑移:地面摩擦太小,转向时横向滑移。增强地面摩擦域随机化,训练更鲁棒转向。
16.6 本章小结
你已实现转向、爬坡、避障(进阶)三个拓展任务,MicroDuck 从"会走"进阶为"会各种走"。
下一部分进入工程化与开源合规:如何把你的整套工程做成规范、合规、可复现的开源仓库。