舵机与 IMU 标定
本章目标:做三件真机侧的标定工作——舵机零位校准、IMU 六面校准、以及 HD1910 台架数据采集(为第 10 章的 BAM 参数拟合提供实测数据)。
8.1 舵机零位校准
舵机出厂的中位未必与机械零位一致。零位校准流程:
- 给舵机发送 0 位置指令;
- 手动检查舵盘是否指向机械设计零位;
- 若不齐,记录偏移量,写入
configd的偏移表; - 每个关节独立校准,保存偏移到板端配置。
# 示例:通过配置服务校准单个舵机
configd set-servo-offset --id 1 --offset +12
零位不准会直接导致策略动作落在错误位置,表现为"鸭子歪着站"。这是 Sim2Real 之前必须先解决的硬件前提。
8.2 关节限位标定
每个关节的物理转动范围必须写入仿真(MJCF 的 limits)和板端(舵机目标限制):
- 手动缓慢驱动每个关节,记录机械硬限位角度;
- 与第 4 章 MJCF 的
limits对比; - 若仿真范围大于硬件,训练出的策略可能在真机上到达"不可能的角度",造成机械卡死或舵机堵转。
8.3 IMU 六面校准
IMU 零偏漂移是步态不稳定的另一大来源。六面校准法:
- 让 IMU 依次朝上、朝下、朝前、朝后、朝左、朝右六个方向静置;
- 采集每面加速度计/陀螺仪读数,求零偏;
- 写入 IMU 校准参数,消除静态漂移。
# 示例:进入校准模式,依次放置六面
robotd imu-calibrate --faces 6
8.4 HD1910 台架数据采集(核心,供 BAM 拟合)
第 10 章要用实测数据拟合 BAM 模型,需要先做台架实验。把 HD1910 固定到台架,进行四类测试:
8.4.1 阶跃响应测试(拟合带宽)
给舵机输入阶跃位置指令,记录目标位置、实际磁编码位置、时间序列。
t,target_pos,actual_pos,torque,voltage
0.000,0.0,0.001,0.00,7.4
0.002,0.5,0.003,0.01,7.4
0.004,0.5,0.012,0.02,7.4
...
8.4.2 扭矩-转速测试
不同负载/电压下,记录最大持续扭矩与空载转速,用于拟合最大扭矩参数。
8.4.3 摩擦与齿隙测试
- 正反方向慢速转动,测量粘性摩擦与库仑摩擦;
- 来回摆动,测量死区/滞后(齿隙)。
8.4.4 转子惯量
结合阶跃响应与已知负载,反向辨识转子惯量。
8.5 台架数据 → BAM 参数拟合脚本
仓库提供 scripts/calibration/hd1910_bench_data_process.py:
python scripts/calibration/hd1910_bench_data_process.py \
--csv data/hd1910_bench/hd1910_step_response.csv \
--out experiments/exp01_standup/bam_params.json
输出 bam_params.json:
{
"bandwidth_hz": 22.0,
"b_viscous": 0.0018,
"tau_coulomb": 0.009,
"J_rotor": 1.2e-6,
"servo_model": "HD1910",
"voltage": 7.4,
"unit": "SI(kg,m,s,rad)"
}
拟合算法:对简化一阶带宽模型做最小二乘拟合(scipy.optimize.minimize),见第 10 章代码详解。
8.6 消融对比设计(写入书稿实验)
为量化标定的价值,设计对照:
- 方案 A:使用经验估算的 BAM 参数训练;
- 方案 B:使用台架实测拟合的 BAM 参数训练;
- 对比两者在真机上的迁移成功率(站立稳定时长、行走成功率)。
8.7 工程踩坑实录
- IMU 未六面校准:姿态缓慢漂移,鸭子越站越歪。校准后恢复。
- 台架数据采样率不足:阶跃响应太快,采样跟不上,带宽拟合失真。提高采样率(>500Hz)后重采。
8.8 本章小结
完成本章,你已有:
- 校准好的舵机零位与关节限位;
- 校准好的 IMU;
- 一份可用于 BAM 拟合的 HD1910 台架实测数据。
下一章进入仿真世界:搭建 MuJoCo-Warp + mjlab 环境,为训练做准备。