DEEP 73 · 第八辑 · 通用换舵机方法论 · LEARN NOTES

收进学习手册 · 2026-09-11 · duck.whatled.com

解读 73 · 换舵机决策树:从需求到型号

解读对象:bam/bam/params/(8 个已辨识型号目录)+ bam/bam/actuators.py、model.py 的 load_model
需要的前置:解读 54(BAM 是什么)· 解读 58(为什么必须重训)

"换成其他舵机怎么改"的第一问不是"怎么改",而是"换成谁"。仓库里恰好有
现成的证据库:bam/bam/params/ 下 8 个型号目录,每个存着一条真实舵机上台架辨识出的参数。

1. 型号库里有什么

每个目录放 m1.json 到 m6.json 六档文件——编号越高摩擦模型越完整(m6 = 库仑 + Stribeck
+ 载荷相关 + 方向性 + 二次项,见 解读 56)。加载只有两条路(model.py::load_model):
- 用库里的:load_model(motor_name="xl330", model="m6"),按目录名 + 档位找 json;
- 用自己的:load_model(json_file="params/my_motor/m6.json")——自己辨识的型号走这条路。

有个容易踩的细节:目录名 feetech_sts3215_7_4V,json 里却写着 "actuator": "sts3215"——
json 的 actuator 字段必须是 actuators.py 注册表里的键名,目录名随意,键名不能错。
另外注册表有 10 个键(还有 xl330i、unitree_go1),params 下只有 8 个目录:注册了 ≠ 有已辨识参数。

2. 四道门的决策树

换舵机的判定顺序照 《换舵机重训全流程》(microduck-replica/docs/换舵机重训全流程.md) §1 的四层判定表:
像过海关,第一关没过,后面免谈——

门 判据(以官方 XL330 为基准) 不过怎么办
① 电压 电池窗口落在新舵机额定内?官方 2S 母线 6.6–8.2 V 改电池节数或加降压
② 力矩 堵转力矩 ≥ 0.5 N·m 量级(XL330 官方 0.52 N·m @5V) 腿站不起来,淘汰
③ 尺寸/重量 外形接近 20×34×26 mm、M2 安装、单只 18 g 量级 打印件重画 + 质量预算重算
④ 协议 Dynamixel V2?飞特?厂商私有? 通信层"改常量"或"写新控制器"

四道门全过才谈得上"少改";现实是全兼容的便宜货不存在(选型文档原话),正常路径是逐层适配 + 重训。

3. 八个型号一眼看清

params/ 里 8 个型号的 m6 辨识值(逐个 json 核对,保留三位):

目录 系 kt (N·m/A) R (Ω) armature friction_viscous
xl330 Dynamixel 0.346 2.50 0.0016 0.006
xl320 Dynamixel 1.009 31.59 0.0012 0.007
feetech_sts3215_7_4V 飞特 1.275 2.75 0.0216 0.028
waveshare_st3025 微雪 1.651 3.10 0.0048 0.022
mx64 Dynamixel MX 1.602 2.32 0.0123 0.025
mx106 Dynamixel MX 2.210 2.03 0.0260 0.051
erob80_50 eRob 工业级 4.897 1.07 0.362 1.403
erob80_100 eRob 工业级 9.396 (json 无此字段) 1.135 9.709

kt(力矩常数,1 A 电流出多少 N·m)从 0.35 跨到 9.4,差 27 倍;
armature(转子反射惯量)从 0.0012 跨到 1.14,差近千倍。
同一套训练代码,喂不同的 json,练出来的是完全不同的机器——"换舵机 = 换动力学"不是修辞。

4. 你的型号不在库里怎么办

这正是这个库的元方法论:官方那组 XL330 参数,也是某个人拿着一颗实物 XL330
在单摆台架上摆出来的。你的新舵机走同一条路——解读 63 的六课采数据,
再用 bam fit --logdir <台架日志> --actuator <键名> --model m6 拟合出 json
(默认 10 万次 trial),产出 params/你的型号/m6.json。"换舵机"从此变成流水线问题。

你带走的收获

延伸

什么鸭 WHATDUCK · 复刻学习笔记 ← 全部手册 · 首页