解读 59 · 舵机 ID 分配与控制模式
解读对象:
microduck-replica/docs/硬件规格速查.md§「舵机 ID 分配」,交叉引用docs/macOS舵机调试与图纸查看指南.md§4 与duck-control/src/model.rs
需要的前置:解读 53(ID 在协议里的位置)
15 个舵机共享一根线,靠 ID(门牌号)分清"这句话是喊谁的"。ID 表是硬件与代码之间的契约——部署代码按 ID 找关节,"表混了 = 左腿当成右腿 = 一上电就劈叉"(macOS 指南原文)。
官方 ID 表:按身体部位分段
左腿 20 21 22 23 24 hip_yaw / hip_roll / hip_pitch / knee / ankle
颈头嘴 30 31 32 33 34 neck_pitch / head_pitch / head_yaw / head_roll / mouth
右腿 10 11 12 13 14 (左腿镜像)
IMU 板 200
(出处:硬件规格速查.md,与 bus.rs 的 ids = [200, 20..24, 30..34, 10..14] 一致。)分段留了空隙:腿 10/20 起、头颈 30 起——以后加设备不用重排。第 15 个舵机是嘴(ID 34,索引 9),不进策略的 14 维动作,由上层逻辑控制。这套分配与 Open Duck Mini v2 完全一致(20-24 / 30-33 / 10-14),只是多了 34(硬件方案逆向:血统印证)。对照:平价教程路线用 ID 1–15,两套表绝不能混用。
设 ID 的两条铁律
XL330 和飞特舵机出厂都是 ID=1。两只出厂舵机一起挂总线,双双应答,总线瘫痪。所以 macOS 指南 §4 的铁律:总线上同时只允许一只未设 ID 的舵机;每设好一只,断电、贴标签,再接下一只。 15 只大约一个傍晚设完。ID 写在 EEPROM 里,改完要回读确认。
XL330 每只要改的寄存器(macOS 指南 §4.2):ID(寄存器 3)改成目标值;Baud Rate(4)出厂 57600 → 1000000;Return Delay Time(5)出厂 250 → 0(16 台设备各 500 µs = 8 ms/tick,40% 预算);Shutdown(18)去掉电压错误触发,防电池带载波动误停机。飞特侧轻松些:出厂即 1 Mbps、Return Delay 已是 0,主要就是改 ID(macOS 指南 §4.4)。
控制模式:位置环是共同语言
官方运行时用位置控制模式——台架脚本 testbench_sim2real.py 的 rollout_real() 里写得明白:ctrl.write_operating_mode(motor_id, 3) 注释 # position control,随后写 position_p_gain 并回读确认(固件会静默钳位越界值)。HD-1910 的模式表更丰富:0 角度伺服 / 1 恒速 / 2 恒流 / 3 PWM 开环 / 4 纯位置 PD(Sim2Real,出厂默认)——"正是强化学习落地要用的那个,XL330 无对应模式"(硬件方案逆向)。
模式差异也是重训输入的一部分:换舵机后 kp_fw 要按新舵机真实运行增益重定(训练参数调整指南 §11.5)。
你带走的收获
- ID 表是代码契约不是建议:
JOINT_IDS的顺序、嘴的索引 9 被跳过,都是部署与训练对齐的一部分。 - 出厂 ID 全是 1:一次一只、设好贴标签,是总线舵机装机的前置仪式。
- 新舵机上电必查三个默认值:波特率、Return Delay、保护(Shutdown)——它们决定总线和安全。
- 控制模式决定"你发的数是什么":位置模式下发目标角度,HD-1910 的模式 4 与 RL 场景天生对口。
- 分段编号(10/20/30)留扩展空隙,抄作业时连这个习惯一起抄。