4. PX4飞控固件准备:了解MAVLink协议

好,咱们开始聊MAVLink协议。

说实话,我第一次接触这个协议的时候,觉得它就是个「黑盒子」——飞控往外吐数据,我这边收数据,至于里面怎么组织的,完全没深究。直到有一次做无人机编队,数据老是丢包,我才老老实实把协议啃了一遍。

嗯,今天咱们就把这个「黑盒子」打开看看。

4.1 MAVLink是什么?

MAVLink,全称Micro Air Vehicle Link,是无人机领域最常用的通信协议。说白了,它就是一套约定好的「数据格式」——飞控和地面站、飞控和机载电脑之间,都靠这个格式来聊天。

我个人习惯把它比作「信封」:你要寄信,总得有个标准信封吧?收件人地址写哪、邮票贴哪、信纸怎么折,都得有规矩。MAVLink就是这套规矩。

核心要点:MAVLink是轻量级的、基于串口的消息传输协议。它不依赖操作系统,在STM32这类单片机上也能跑得很溜。

4.2 消息包结构——拆开信封看看

一个MAVLink消息包,长什么样?我直接给你看结构:

| 起始标志 | 载荷长度 | 包序列号 | 系统ID | 组件ID | 消息ID | 载荷数据 | CRC校验 |
|  0xFE   |   1字节  |  1字节   | 1字节  | 1字节  | 2字节  | 可变长度 | 2字节   |

每个字段都有它的意义:

  • 起始标志(0xFE):告诉接收端「我要开始发消息了」。我见过有人自己写解析程序时,忘了检查这个字节,结果把一堆乱码当有效数据解析,折腾了一下午。
  • 载荷长度:后面跟着的数据有多长。注意,这个长度不包括CRC。
  • 包序列号:每发一条消息,这个数就加1。用来检测丢包。我在做编队时,就靠这个字段发现某个从机每隔10包就丢一包,最后定位是串口缓冲区太小。
  • 系统ID和组件ID:标识是谁发的。比如飞控是系统1,组件1;机载电脑是系统2,组件1。这样地面站就知道数据来源。
  • 消息ID:这条消息是什么类型。比如0表示心跳包,30表示姿态数据。
  • 载荷数据:真正的数据内容,比如GPS坐标、姿态角、电池电压等。
  • CRC校验:两个字节的循环冗余校验,用来检测数据在传输过程中有没有被篡改。

我的小技巧:调试时,如果发现解析出来的数据偶尔跳变,先别怀疑传感器。用逻辑分析仪抓一下串口波形,看看是不是CRC校验没通过导致丢包了。我曾经被这个问题坑过两次。

4.3 CRC校验——数据完整性的守护神

CRC校验,听起来高大上,其实原理很简单:发送端根据数据内容算出一个「指纹」,接收端收到数据后再算一遍,两个指纹一比对,不一样就说明数据坏了。

MAVLink用的是CRC-16-CCITT算法,多项式是0x1021。你不需要自己实现,因为MAVLink库已经帮你封装好了。但有一点要注意:

避坑指南:我曾经在移植MAVLink库时,忘了初始化CRC表,结果所有消息都被判定为校验失败。折腾了两天才发现,原来是少调了一个 mavlink_crc_init() 函数。嗯,这种低级错误,犯过一次就记住了。

4.4 常见消息ID——飞控在说什么?

MAVLink定义了上百种消息类型,但咱们做串口通信,常用的其实就十几种。我列个表给你:

消息ID 消息名称 说明 典型用途
0 HEARTBEAT 心跳包 判断飞控是否在线,每秒1-2次
30 ATTITUDE 姿态数据 横滚、俯仰、偏航角
32 LOCAL_POSITION_NED 局部位置 无人机在NED坐标系下的位置
33 GLOBAL_POSITION_INT 全球位置 经纬度、海拔高度
24 GPS_RAW_INT GPS原始数据 卫星数量、定位类型
74 VFR_HUD 飞行状态 空速、地速、高度

你想想看,飞控每隔几十毫秒就在往外吐这些数据。咱们的树莓派要做的,就是把这些数据收下来,解析成能用的变量。

4.5 PX4如何通过串口发送MAVLink数据?

好,到了实操环节。PX4飞控怎么把MAVLink数据从串口发出来?

其实PX4内部有一个叫 mavlink_main.cpp 的模块,它负责管理MAVLink通信。你只需要在飞控的启动脚本里配置一下就行。

以Pixhawk为例,默认的串口映射是这样的:

  • TELEM1:默认波特率57600,用于连接数传电台
  • TELEM2:默认波特率921600,用于连接机载电脑(咱们就用这个)
  • USB:默认波特率115200,用于连接QGroundControl

在PX4的启动脚本(比如 rc.txt)里,你会看到类似这样的配置:

# 启动MAVLink实例,绑定到TELEM2串口
mavlink start -d /dev/ttyS2 -b 921600 -m onboard

# 设置数据流频率
mavlink stream -d /dev/ttyS2 -s ATTITUDE -r 50
mavlink stream -d /dev/ttyS2 -s LOCAL_POSITION_NED -r 25
mavlink stream -d /dev/ttyS2 -s GLOBAL_POSITION_INT -r 10

解释一下:

  • -d /dev/ttyS2:指定串口设备,TELEM2对应的是ttyS2
  • -b 921600:波特率,我建议用921600,数据量大时不容易丢包
  • -m onboard:模式,onboard表示机载计算机模式,会发送更完整的数据
  • -s ATTITUDE -r 50:订阅姿态消息,每秒发50次

我的经验:波特率别设太低。我见过有人用57600跑机载通信,结果姿态数据一多就丢包。921600是个比较稳妥的选择。如果串口线比较长(超过1米),可以降到460800。

4.6 知识体系总览

说了这么多,咱们用一张图把整个知识体系串起来:

MAVLink协议知识体系 MAVLink协议 消息包结构 起始标志 | 长度 | 序列号 系统ID | 组件ID | 消息ID 载荷数据 | CRC校验 CRC校验 CRC-16-CCITT算法 多项式:0x1021 常见消息ID 0: HEARTBEAT 30: ATTITUDE 33: GLOBAL_POSITION_INT PX4串口配置

这张图把咱们今天讲的内容串起来了。从协议本身出发,分成了四个方向:消息包结构、CRC校验、常见消息ID、以及PX4的串口配置。你照着这个框架去理解,就不会觉得MAVLink是一团乱麻了。

4.7 小结

好了,这一章咱们把MAVLink协议的核心概念捋了一遍。消息包结构就像信封,CRC校验是防伪标签,消息ID是内容分类,而PX4的串口配置就是告诉飞控「往哪发、发多快」。

下一章,咱们就要在树莓派上动手了——装环境、写代码、真正把MAVLink数据收下来。嗯,到时候你会觉得,今天这些理论知识,全都用得上。

课后小作业:打开你的PX4飞控,连上QGroundControl,在MAVLink Inspector里看看,飞控正在发送哪些消息?它们的ID是多少?频率是多少?对照咱们今天讲的表格,认一认。


专注资料整理