舵机与 IMU 标定

本章目标:做三件真机侧的标定工作——舵机零位校准、IMU 六面校准、以及 HD1910 台架数据采集(为第 10 章的 BAM 参数拟合提供实测数据)。

8.1 舵机零位校准

舵机出厂的中位未必与机械零位一致。零位校准流程:

  1. 给舵机发送 0 位置指令;
  2. 手动检查舵盘是否指向机械设计零位;
  3. 若不齐,记录偏移量,写入 configd 的偏移表;
  4. 每个关节独立校准,保存偏移到板端配置。
# 示例:通过配置服务校准单个舵机
configd set-servo-offset --id 1 --offset +12

零位不准会直接导致策略动作落在错误位置,表现为"鸭子歪着站"。这是 Sim2Real 之前必须先解决的硬件前提。

8.2 关节限位标定

每个关节的物理转动范围必须写入仿真(MJCF 的 limits)和板端(舵机目标限制):

  1. 手动缓慢驱动每个关节,记录机械硬限位角度;
  2. 与第 4 章 MJCF 的 limits 对比;
  3. 若仿真范围大于硬件,训练出的策略可能在真机上到达"不可能的角度",造成机械卡死或舵机堵转。

8.3 IMU 六面校准

IMU 零偏漂移是步态不稳定的另一大来源。六面校准法:

  1. 让 IMU 依次朝上、朝下、朝前、朝后、朝左、朝右六个方向静置;
  2. 采集每面加速度计/陀螺仪读数,求零偏;
  3. 写入 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 环境,为训练做准备。