仿真调试与诊断

本章目标:学会用 TensorBoard 观察训练,掌握训练失败(不收敛、抖动、动作发散)的定位方法,并判断问题是出在奖励函数、动力学还是观测空间。

13.1 用 TensorBoard 观察训练

训练过程记录奖励曲线、损失、动作分布、观测统计:

tensorboard --logdir experiments/exp02_walk_flat/tensorboard

关键指标:

  • reward:是否整体上升、有无平台期;
  • action std:动作是否收敛(不发散);
  • value loss / policy loss:是否震荡。

13.2 常见训练失败定位

现象1:训练不收敛 / 奖励平台期

排查顺序:

  1. 奖励函数:奖励是否过于稀疏?是否信号太小?
  2. 观测:关键状态(高度、速度)是否进入观测?
  3. 学习率:是否过大导致震荡,过小导致太慢?

现象2:动作抖动 / 发散

排查顺序:

  1. 动作惩罚缺失:加 action_penalty 与 smooth_penalty(见 12.3);
  2. 奖励函数有高频波动:抑制剧烈动作;
  3. 执行器带宽过低:仿真舵机跟不上(见第 10 章)。

现象3:总是摔倒

排查顺序:

  1. 动力学错误:MJCF 重心/惯性参数错误(回第 4 章复核);
  2. 域随机化过强:训练太困难,降低强度或配合课程学习;
  3. 奖励不鼓励站立:增加站立奖励、高度奖励。

13.3 仿真与真机差异定位框架

当"仿真完美、真机乱走",按优先级排查:

优先级检查项工具/章节
1观测空间一致性check_obs_act_space.py(RK3566 镜像与固件)
2关节限位对齐MJCF limits vs 硬件(HD1910 CAD 模型解析 / 舵机与 IMU 标定)
3IMU 零偏/安装六面校准(舵机与 IMU 标定)
4BAM 参数精度台架拟合(BAM 执行器建模与辨识)
5整机质量/重心称重对比 CAD(3D 打印、装配与公差)

这个框架是本书反复强调的核心:Sim2Real gap 不是单一原因,而是从观测、动力学、执行器到传感器的一整条链路,必须逐层排查。

13.4 仿真自检脚本

每次修改代码,先跑环境自检,把错误挡在训练前:

python scripts/validation/test_env.py
python scripts/validation/validate_mjcf.py --mjcf software/training/assets/robots/microduck_feetech.xml

13.5 工程踩坑实录

  • MJCF 单位错误:Onshape 用毫米导出未转米,模型放大 1000 倍,仿真崩溃(见第 4 章)。
  • 奖励被噪声淹没:奖励信号幅度远小于 action_penalty,策略"摆烂"只输出极小动作。调整奖励权重。

13.6 本章小结

你已掌握训练失败的定位框架,以及"仿真好、真机差"的逐层排查方法。

下一章进入部署:把 ONNX 策略送到 RK3566 板端,跑通真机控制环。