任务拓展

本章目标:在基础行走之上,实现转向、爬坡、避障三个进阶任务,把一个"只会直走"的鸭子变成"会各种走"的鸭子。

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 从"会走"进阶为"会各种走"。

下一部分进入工程化与开源合规:如何把你的整套工程做成规范、合规、可复现的开源仓库。