先弄清楚「归零」归的是什么
复刻鸭一上电就倒,多数人第一反应是策略迁移失败,实际最常见的原因是零位。程序启动的顺序是:打开舵机扭矩、平滑地把身体拉回它认为的 neutral pose、再读输入、再加载 walk.onnx。也就是说它开始走之前会先强行回一次零位,如果这个零位和你这台机器的实际装配对不上,它一回中位就已经把自己推歪了,后面怎么调步态都是倒。
offset 就是「程序认为的零位」与「机械实际的零位」之间的差值。装配时螺丝孔位差一点、舵盘装偏一齿、镜像件装反,这个值就不对。校准不是最后补的一道手续,它决定后面所有排障有没有意义。
十五颗舵机逐颗设 ID 与中位
下面顺序取自国内完整开源方案的公开装配指南,每一步都写了预期结果。改 ID 时一次只接一颗舵机,断电再换下一颗——十五颗同时挂在总线上改 ID,撞号是必然的。
- 断电、只接一颗、进入 Servo setup 扫描。预期结果:扫描结果里只有一个设备。若出现多个,说明总线上还挂着别的舵机或残留供电,先断电重来,不要继续写参数。
- 改 ID 并重新扫描确认。选中设备、填入计划 ID、点击写入,再扫一次并从新 ID 读回参数。预期结果:新 ID 能稳定读回。读不回就查线序、共地与供电,别急着认定舵机损坏。
- 写中位值。公开装配指南给的是 Move to 2047;飞特线的复刻记录用零位 2048 表述。两者来自不同仓库与不同舵机体系,按自己跟的那套文档取值,不要混用。预期结果:舵机转到机械中心且卸力时能用手动摆到中位。
- 写增益并保留分组差异。装配指南里腿部与头部的 KP、KD 会保留;嘴部那颗有单独的临时增益逻辑,不能把嘴的参数套到运动关节上。预期结果:十五颗参数各自写入成功,嘴部参数独立。
- 退出、断电、贴 ID 标签,重复十五次。预期结果:每颗舵机都有可见标签,装配时不用靠猜。标签与装配表对不上就当场更正,装完外壳再查代价很大。
- 装配后进 Calibration 页做整机零位。所有舵机会自动卸力,逐个把关节摆到机械中心,点 Set center 并 hold,让当前关节保持、其余关节继续卸力,全部完成后退出并卸力。预期结果:默认姿态下各关节在合理范围,没有一上扭矩就撞限位的关节。
- 分级首次上电:先确认页面显示 Servos online 15/15 与 IMU online;保持 Inference only 检查策略输出;再试 Default pose;最后才启用 Walk 与 get up。预期结果:每一级都无异常才进下一级。拾取、翻滚、踢球不是第一步验收项目。
两套舵机 ID 表不能混用
这是中文资料里最容易踩的坑:不同复刻仓库的 ID 分配完全不同,而搜索引擎把它们混在同一批结果里。照 A 仓库的 BOM 装好、按 B 教程写 ID,典型表现就是「它想抬左腿结果抬了右腿,一走就侧翻」。
| 路线 | 腿部分配 | 头颈与嘴 | 出处口径 |
|---|---|---|---|
| 国内完整开源方案 | 左腿 10 到 14,右腿 20 到 24 | 颈头 30 到 33,嘴 34 | 官方运行时配套网页的 Servo setup 分配 |
| 简化教学路线 | 右腿 1 到 5,左腿 6 到 10 | 另有头颈与嘴部编号 | 中文调试专栏的排查口径 |
| 官方策略接口 | 十四个策略动作按左腿、头颈、右腿排列 | 嘴部不在策略动作中,但占十五槽目标数组的一个槽位 | 官方训练仓 61 维观测与 14 维动作契约 |
第三行还藏着一个更隐蔽的错误:策略输出是十四个动作,运行时要把它插进含嘴部槽位的十五元目标数组。若把 action 9 直接写给十五槽数组的第 9 位,就会把右髋命令写到嘴上、整条右腿错位,而网络推理本身完全正常、形状也对。这类问题不会报错,只会表现为动作诡异。
IMU 水平校准与坐标系对齐
IMU 是这只鸭子的内耳。官方策略的观测里,躯干角速度与投影重力方向排在 61 维向量的最前面;装反了,它以为的「上」和你看到的「上」不是一回事,会努力把自己「扶正」到一个歪姿态。中文调试专栏给过一个具体检查点:代码里的 IMU 安装四元数对应绕 Y 轴旋转 90 度,模块上下贴倒或前后转方向,重力投影向量会直接反向。
核对方法不复杂:用 make imu 一类工具读实时姿态,把机身手动摆到水平、前倾、后仰、左倾四个姿态,逐次记录各轴读数的符号与量级;再把一帧仿真状态与一帧实物状态并排打印,人工对比量级和方向是否一致。预期结果:水平时读数稳定、前后倾时对应轴符号相反、实物与仿真的单位一致。仿真里常用弧度,真机编码器给的是原始位置值,忘记换算就会「站起来一秒就往前栽」。
社区排错顺序也把这件事放在前面:先看 IMU 水平校准,再微调舵机零位。反过来先猛调零位,往往越调越乱。
一走就后摔:按现象分层查
下表把「倒」拆成六种可区分的现象,按先分层、再定位的顺序排。查之前先做一次手扶测试:扶着能走、松手就倒,问题在平衡或标定;扶着也乱动、关节方向明显不对,问题在 ID 或方向。手扶测试做完,后面能少瞎试大半。
| 现象 | 高概率原因 | 第一项解法 |
|---|---|---|
| 扶着能走,松手就倒 | 平衡或标定未收敛 | 先做 IMU 水平校准,再微调舵机零位;不要用增大力度掩盖装配错误 |
| 想抬左腿却抬了右腿,一走侧翻 | 左右腿 ID 装反或方向反了 | 断电重扫 ID,对照自己那份装配表逐颗核;混用两套 ID 表是常见根因 |
| 一通电回中位就歪、撞限位 | offset 与装配孔位不符 | 重新执行 Set center 并 hold,检查舵盘装齿与镜像件方向 |
| 上电往一个方向猛冲 | IMU 坐标系或单位不一致 | 打印一帧仿真与实物状态对比量级、符号;确认弧度与编码器值的换算 |
| 站得住,迈步就掉电重启 | 供电瞬态与母线压降 | 复刻记录里把供电从约 7.4V 调到约 8.0V 后十秒全程最低 7.6V;另有在总进电口并联 1000µF 缓冲电容的做法,但电容不能代替足够输出能力的电池与线材 |
| 走几秒动作变慢、关节发热 | 主控过热降频或零位偏差 | 复刻记录里 CPU 被压到 408MHz 时控制周期从 20ms 拖到约 25ms,而策略按 50Hz 训练;先散热并看时序日志,再查无负载电流与目标实测误差 |
四类都排除后,还有两个纯物理因素:电池电压不足导致扭矩不够,以及地面太滑脚掌抓不住。这两个不查,程序算得再对也白搭。
几条安全禁令
- 第一次运行一定用手扶住,且不在桌边或高处测试;程序回中位那一下幅度难以预判,先摔的往往是脚掌与舵机输出轴。
- 低电压时不要长时间运行,舵机为维持位置会持续吃大电流,发热堵转最后烧的是舵机。
- 扭矩开着时不要用手硬掰关节,被掰的是电机齿轮;要摆姿势先停程序。搬动抓躯干,别抓腿和脚掌。
- 不要直接断电,先执行安全关机命令或用手柄组合键关机,等十到十五秒再关电源开关;系统还在写卡时断电离坏卡不远。
- 上电前检查短路、极性与焊点绝缘;自制线材反接一次可能带走一块板子。
边界与下一步
本页步骤与数值整理自公开的社区装配指南、调试专栏与复刻记录,属于各自仓库的口径,不是本站真机实测,也不是官方标准硬件流程;中位值、ID 表、供电电压都必须按自己跟的那套仓库版本核对。官方策略契约与导出要求见《Microduck 行走策略量化与部署》。校准通过后仍有步态或通信异常,按《Microduck 常见问题与故障排查》的「运动异常」与「通信异常」两类继续反查。