DEEP 56 · 第六辑 · 舵机与执行器 · LEARN NOTES

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

解读 56 · M1–M6:从采集到拟合

解读对象:bam/bam/model.py 的 models 字典 + bam/bam/params/xl330/m1.json…m6.json + microduck-replica/docs/训练参数调整与新动作开发指南.md §11.4
需要的前置:解读 55(数据怎么采)

先纠正一个容易望文生义的读法:M1–M6 不是六个参数,是六档摩擦模型复杂度。bam/bam/model.py 底部的 models 字典写得很清楚,每一档是在前一档上加一个物理项。

六档模型,逐档加东西

档 开关(model.py 构造参数) 物理含义
M1 — 库仑摩擦(基础静摩擦 friction_base)
M2 stribeck=True + Stribeck:近零速摩擦升高,由 friction_stribeck、dtheta_stribeck、alpha 描述
M3 load_dependent=True + 载荷相关:摩擦随齿轮箱受力变化(load_friction_base)
M4 M3 + Stribeck 两者叠加
M5 + directional=True 方向性:电机驱动侧与外力驱动侧分开拟合(load_friction_motor / load_friction_external)
M6 + quadratic=True 再加二次耦合项(load_friction_motor_quad / load_friction_external_quad)

除了摩擦项,每档都同时辨识四个"台架寄生参数":q_offset(台架零位误差,0±0.1)、command_delay(指令延迟,0–0.05 s)、电机 kt 与 R。它们是" nuisance 参数"——不是舵机的荣誉属性,但不辨识出来它们,摩擦就会被算错。

拟合流水线(四条命令)

训练参数调整指南 §11.4 照 BAM 文档给出完整流程:

uv run python -m bam.<厂家>.all_record ...   # 1. 采集原始日志
uv run python -m bam.process --dt 0.005 ...  # 2. 重采样为 5 ms 时间步
uv run python -m bam.fit --model m6 \
    --validation_kp <留出的kP> ...           # 3. 拟合
uv run python -m bam.plot --sim ...          # 4. 实测 vs 仿真对比图

关键纪律是那句"建议 m1~m6 都做并留一个 kP 作验证集":六档全拟合,拿没参与拟合的 P 增益数据当考卷——防止模型只在你采过的工况上好看(过拟合)。

看着真实数据理解"档位"

对比 params/xl330/ 里 m1 与 m6 两份 JSON(同一颗 XL330 的两次拟合):friction_base 从 0.0191(m1)降到 0.0119(m6)——简单模型把载荷相关摩擦"摊"进了基础摩擦;m6 多出 load_friction_motor=0.228、load_friction_external=0.107 这些 m1 根本没有的键。模型越复杂,各物理量分得越开,跨工况外推才越可靠。

产出的 m6.json 就是训练侧要加载的全部:json_path="/绝对路径/params/hl1910/m6.json"(§11.5,HL-1910 路线的写法)——通往 解读 57。

你带走的收获

延伸

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