解读 201 · 案例精读(上):把 XL330 换成 HD-1910,他们改了什么
解读对象:HD-1910 迁移训练审计报告(另一台机器
/home/july工作区的适配总结,代码事实快照 2026-09-19;原文已归档docs/research/hd1910迁移站立行走PPO训练.html,未公开传播)
需要的前置:解读 73(换舵机方法论)、解读 79(五落点);最好先读过解读 61–72 的 HL-2915 换装专辑
0. 这是什么案例,先说清边界
有人在另一台机器的工作区里,把 Microduck 的执行器从 XL330 整体换成 HD-1910,注册了独立任务 Mjlab-Velocity-Flat-HD1910-MicroDuck,跑通了 smoke、8 小时长训练、ONNX 导出和回放评测,并留下一份完整审计报告。注意边界:训练日志、checkpoint 在那台机器上,我们没有原始产物——本文所有数字都是报告陈述,不是我们复现的结果。报告自己也说得很清楚:"仿真链路已跑通,真机仍需台架验证"。
这与我们高度相关:HD-1910 与我们购入的 HL-1910 同族(飞特磁编码、规格书同源),与我们已到货 2 只的 HL-2915 同厂。它是一次比我们早出发的换舵机实战,方法论和教训都值得精读。
1. 系统观:换舵机只动"后两层"
把整个系统拆成三层,换舵机的工作量立刻清晰:
┌─────────────────────────────────────────────┐
│ PPO:学习方法(网络/超参/损失) → 不动 │
├─────────────────────────────────────────────┤
│ 物理模型:质量/惯量/执行器/延迟 → 全部要改 │
├─────────────────────────────────────────────┤
│ 运行时:把动作准确发给真机 → 换协议栈 │
└─────────────────────────────────────────────┘
报告最有价值的立场是:PPO 不需要针对新舵机重新调参——整个 RL 配置就一行深拷贝:
MicroduckHd1910RlCfg = deepcopy(MicroduckRlCfg)
experiment_name = "velocity_hd1910"
run_name = "velocity_hd1910_preliminary"
但要准确理解:这不是"旧策略直接能用",而是同一套学习方法,在新的动力学模型上重新学一套权重。算法不变,学出来的东西全变。
2. 适配五原则(报告的原话,值得抄)
- 最大复用:直接调用现有
make_microduck_velocity_env_cfg,不复制奖励、观测、课程或 PPO 主体; - 策略契约不变:关节名、顺序、HOME 位、14 动作、61 维观测、ONNX 接口全部冻结;
- 差异下沉到物理层:重量、电气参数、固件控制律、延迟,全放在 robot/actuator 配置里;
- 未知量用随机化包络:辨识前扩大摩擦和 armature 的随机范围,而不是凭空改奖励;
- 默认平台不受影响:运行时总线默认仍是 dynamixel2,新协议由配置显式选择。
这五条与我们解读 79 的"五落点"完全同构——两个独立实践收敛到同一结构,这本身就是验证。
3. 物理层改动(一):质量与惯量
HD-1910 单只 21 g(XL330 18 g),15 只共增重 45 g。补丁遍历 MuJoCo spec,只统计 meshname == "xl330" 且 group == 2 的可视舵机网格——不按所有 mesh 计数,因为全碰撞模型还有 group 3 的重复碰撞网格,会一次舵机增重两次;计数不为 15 直接抛错。惯量按质量比整体缩放:new_inertia = old × new_mass / old_mass,质心不动。
这是"相似质量分布"的近似——保持张量正定,但没描述新舵机的质心偏移和外壳差异。报告明确说最终应由带 HD 装配的 CAD 导出,不应长期依赖缩放。这个诚实态度比技巧本身更值得学。
4. 物理层改动(二):执行器初版参数
HD 尚无摆锤辨识,先用手册值拼了初版 m1 模型(preliminary_m1.json),复用 BAM 的 STS3215 固件控制器:
| 字段 | 值 | 来源 |
|---|---|---|
| kt | 0.73575 N·m/A | 堵转 1.47 N·m ÷ 2 A |
| R | 3.7 Ω | 7.4 V ÷ 2 A |
| armature | 0.00224 | 估计值,未辨识 |
| friction_base / viscous | 0.015 / 0.005 | 估计 |
| max_velocity | 11.833 rad/s | 113 RPM 换算 |
| 固件 P 映射 | 运行时 200 × 0.16 = STS P 32 | 控制律换算 |
| 命令延迟 | 2–6 ticks | 初始包络,未实测 |
| vin | 6.6–8.2 V | 下界比 XL330 略提高 |
对比 XL330 的 m6(含负载相关、方向相关、Stribeck 项),m1 只有基础电机 + 库仑/黏性摩擦。报告用加粗字体承认:扩大随机化只能覆盖不确定性,不能替代真实辨识——这正是我们解读 55–57 单摆台架流程要补的课。
5. 运行时改动:同一个 trait,另一个协议栈
真机侧新增 FeetechIo 实现既有 RobotIo trait,启动时按配置在 DynamixelIo/FeetechIo 之间二选一;选完后,策略、观测拼装、安全状态机、跌倒检测共用同一套代码,不产生 HD 专用分叉。配置层面三件事:protocol = "feetech-sts" 显式选择;feetech_p_scale = 0.16(运行时 Kp 200 映射 STS P 32,limp 50 → 8,最后 clamp 到 1–254);feetech_direction 恰好 15 项 ±1,顺序严格对齐关节名——代码不会猜方向。
你带走的收获
- 换舵机 = 换"物理模型 + 协议栈"两层,PPO 作为学习方法原封不动——但要重新训练权重。
- 独立任务 ID + 独立参数目录,而不是复制整套训练代码:新旧路线并存,互不污染。
- 质量补丁要按可视网格计数并断言数量,防止碰撞网格造成双重计重。
- "配置里写了"和"训练时实际启用了"是两回事——下篇有一个现成的反面案例。
- 估计参数 + 扩大随机化是合法的初版策略,但报告从头到尾没有把估计值说成实测值。