解读 43 · imu_to_dxl:这块自绘板要解决什么
解读对象:
microduck-replica/docs/imu_to_dxl-设计包/设计规格.md+microduck-replica/hardware/imu_to_dxl/README.md(自绘,未打样)
需要的前置:解读 41(为什么 IMU 要挂在舵机总线上)。
使命一句话:让 IMU 伪装成一个舵机
Dynamixel Protocol V2 是舵机的串行通信协议,每台设备有个 ID。自绘板做的事:把 LSM6DSV16X 姿态芯片的数据打包,让它对外表现得像 ID 200 的"舵机"。于是主控不需要第二条总线、不需要新驱动——用读舵机寄存器的方式要姿态。
设计规格.md 把主机侧预期写成验收标准,全部标注源码行号:
| 项 | 值 | 出处 |
|---|---|---|
| 总线 ID | 200 | model.rs L78 |
| 波特率/格式 | 1 Mbps, 8N1 | model.rs L80 |
| 读地址/长度 | 124 / 12 字节 | bus.rs L27–28 |
| 主机超时 | 30 ms | bus.rs L49 |
12 字节里装什么
| 字节 | 内容 |
|---|---|
| 0..6 | 陀螺 x/y/z,i16 小端原始计数,量程 ±500 dps(主机按 17.5 mdps/LSB 换算) |
| 6..12 | 姿态四元数 x/y/z,IEEE fp16 半精度 |
两个省带宽的巧思:姿态解算交给芯片——LSM6DSV16X 片上有 SFLP 硬件融合块,直接输出四元数,主控不跑融合算法;四元数本来有 4 个分量,但单位四元数满足 w=√(1−x²−y²−z²),只传 x/y/z,主机自己补 w,12 字节刚好一次读完。另有 20 字节诊断块(原始加计、采样计数、状态标志),主机只读前 12。
板上三样东西
MCU(STM32G031F8P6,本仓选型;官方用什么无从还原)收包组包 + 读 IMU;LSM6DSV16X 出数据;SN74LVC2G241 双缓冲做单线半双工收发。供电直接从总线取。元件少、协议公开,这是整个项目里最值得自己画的一块板。
为什么装躯干、朝向写死
策略观测里的角速度和投影重力,只取决于 IMU 固连刚体的姿态。头挂在脖子三个串联关节之后,装头里读到的是头的姿态——仿真把传感器绑在 trunk_base,实物装头上就是 sim-to-real 失配。固件里 DEFAULT_MOUNT = [√½, 0, √½, 0] 把芯片读数旋到躯干系(trunk = [+raw_z, +raw_y, −raw_x],绕 Y +90°)。位置在躯干内可自由选,朝向必须确定并已知。
你带走的收获
- 协议伪装(设备虚拟化):只要在总线上表现得像个标准从机,主机不关心里面是什么芯片——新传感器可以"借壳"旧协议接入。
- 数学性质能省字节:单位四元数少传一个分量,是"利用约束换带宽"的通用手法。
- 能下沉的算力就下沉:片上融合块把姿态解算从主控挪进传感器,主循环里少一段代码就少一个出错点。
- 验收标准先于设计:先把主机怎么读(地址、长度、超时、字节序)钉死,固件照着实现,联调才有仲裁依据。