119、MAVLink消息自定义与扩展
飞控算法从入门到精通 · 119 · MAVLink消息自定义与扩展
从一次炸机说起
去年夏天,我在调试一款自研的四旋翼时遇到一个诡异问题:飞控在特定姿态下会突然触发失控保护,但日志里所有标准MAVLink消息都显示传感器数据正常。折腾了两周,最后发现是自定义的“电机温度遥测”消息与标准HEARTBEAT消息的时序冲突——我偷懒把自定义消息塞进了MAVLink协议里未使用的消息ID区间,但那个区间恰好被某个地面站固件用于内部调试。那次炸机让我明白:MAVLink的自定义不是“找个空位填进去”那么简单。
MAVLink消息结构:别被“协议”两个字吓住
MAVLink本质上就是个二进制串行化协议,每条消息由三部分组成:帧头(0xFE或0xFD)、消息ID、载荷。v1.0用0xFE,v2.0用0xFD并增加了签名和兼容性标志。你不需要记住所有字节偏移,但必须理解一个核心概念:消息ID决定了地面站如何解析后面的字节流。
标准消息ID范围是0-255(v1.0)或0-65535(v2.0)。自定义消息通常使用MAV_COMPONENT_MISSIONPLANNER(195)或MAV_COMPONENT_PATHPLANNER(196)等组件ID,但更常见的做法是直接申请一个未使用的消息ID。这里有个坑:不要用0-255之间的ID,即使官方文档说某些ID“保留”,实际地面站和SDK可能已经硬编
