MAVLink总线详解
MAVLink总线
1. MAVLink总线
MAVLink是一个非常轻量化的消息协议,用于无人机之间的通信以及无人机机载设备之间的通信,第一个版本于2009年发布,它的创作者就是 Lorenz Meier,大名鼎鼎的PX4开源组织创始人。现在,依赖于PX4开源社区的强大影响力,MAVLink已经成为了很多小型无人机的标准通信协议,地面站和无人机之间通信用它,无人机与无人机之间通信用它,机载计算机与飞控之间通信还是用它,所以MAVLink是你与这些"机器对话"的标准语言,非常重要,做无人机开发的基础之一。
2. MAVLink版本
MAVLink有两个版本:MAVLink v1和MAVLink v2,基本框架没有什么区别,二者不同点有:
- v2版本能够定义的消息数量更多,有三个字节定义MSG ID,也就是多达2^24=16777216个,而v1版本只有2^8=256个。
- v2版本增加了签名信息。
在 MAVLink 协议中,数据包(Frame)由多个字段组成,主要用于无人机和地面站或其他设备之间的通信。
MAVLink v1 数据包格式:
字节位置 | 字段名称 | 大小(字节) | 描述 |
---|---|---|---|
0 | STX | 1 | 起始字节,固定为 0xFE,标识数据包的开始。 |
1 | LEN | 1 | 数据包的有效载荷长度,最大值为 255 字节。 |
2 | SEQ | 1 | 数据包序号,0~255,序号每次递增,用于检测丢包。 |
3 | SYS ID | 1 | 系统 ID,1~255,标识发送消息的设备系统。 |
4 | COMP ID | 1 | 组件 ID,1~255,标识设备的组件(如飞控、传感器等)。 |
5 | MSG ID | 1 | 消息 ID,表示消息的类型或功能,1~255。 |
6-N | PAYLOAD | N | 有效载荷,最大为 255 字节,包含具体的通信数据。 |
N+1 | CHECKSUM | 2 | 校验和,确保数据包传输的完整性。 |
[STX] [LEN] [SEQ] [SYS ID] [COMP ID] [MSG ID] [PAYLOAD] [CHECKSUM]
MAVLink v2 数据包格式:
MAVLink v2 相比 v1 版本增加了对消息扩展、签名和附加字段的支持。
字节位置 | 字段名称 | 大小(字节) | 描述 |
---|---|---|---|
0 | STX | 1 | 起始字节,固定为 0xFD,标识数据包的开始。 |
1 | LEN | 1 | 数据包的有效载荷长度,最大值为 255 字节。 |
2 | INCOMPAT_FLAGS | 1 | 不兼容标志字节,MAVLink v2 扩展字段(通常为 0x00)。 |
3 | COMPAT_FLAGS | 1 | 兼容标志字节,MAVLink v2 扩展字段(通常为 0x00)。 |
4 | SEQ | 1 | 数据包序号,0~255,序号每次递增,用于检测丢包。 |
5 | SYS ID | 1 | 系统 ID,1~255,标识发送消息的设备系统。 |
6 | COMP ID | 1 | 组件 ID,1~255,标识设备的组件(如飞控、传感器等)。 |
7 | MSG ID | 2 | 消息 ID,2 字节,表示消息的类型或功能,1~65535。 |
9 | PAYLOAD | N | 有效载荷,最大为 255 字节,包含具体的通信数据。 |
N+9 | CRC | 2 | 校验和,确保数据包传输的完整性。 |
N+11 | SIGNATURE | 13 | (可选)用于安全验证的签名字段,仅在启用签名时存在。 |
3. MAVLink v1 和 MAVLink v2 的主要差异
STX 字段
- MAVLink v1 的起始字节为 0xFE。
- MAVLink v2 的起始字节为 0xFD。
消息 ID(MSG ID)
- MAVLink v1 使用 1 字节表示消息类型。(范围 1~255)
- MAVLink v2 使用 2 字节表示消息类型,允许更多的消息类型(最多 65535 个类型)。(范围 1~65535)
不兼容标志(INCOMPAT_FLAGS)和兼容标志(COMPAT_FLAGS)
- MAVLink v1 没有这些字段。
- MAVLink v2 添加了这些字段,用于支持协议的扩展和向后兼容。
消息签名(SIGNATURE)
- MAVLink v1 没有签名字段,不支持消息签名。
- MAVLink v2 支持消息签名(13 字节),用于数据的安全验证(通常需要启用安全扩展)。
长度字段
- MAVLink v1 的 LEN 字段最大为 255 字节。
- MAVLink v2 的 LEN 字段也为 255 字节,但它支持更多扩展特性(如更大的消息 ID)。
校验和
- MAVLink v1 使用简单的 XOR 校验。
- MAVLink v2 使用更强大的 CRC 校验(例如 CRC-16-ANSI)。
4. MAVLink 标准消息结构
MAVLink 协议在官方文档中定义了一系列标准消息结构,每个消息有一个唯一的 Message ID,并且这些消息结构包含了特定的数据字段。
Heartbeat Message (Message ID = 0)
- Purpose: 发送系统的心跳信号,通常用于表示设备的在线状态。
- Fields:
type
(uint8_t): 设备类型(如飞行器、地面站等)。autopilot
(uint8_t): 自动驾驶仪类型(如无、Pixhawk等)。base_mode
(uint8_t): 当前模式,指示飞行器的操作模式(如手动、自动)。custom_mode
(uint32_t): 自定义模式。system_status
(uint8_t): 系统状态(如无故障、预警等)。mavlink_version
(uint8_t): MAVLink 协议的版本。
SysStatus Message (Message ID = 1)
- Purpose: 发送设备的系统状态,包含电池电压、温度、使用的 CPU 等信息。
- Fields:
onboard_control_sensors_present
(uint32_t): 设备传感器状态。onboard_control_sensors_enabled
(uint32_t): 启用的传感器。onboard_control_sensors_health
(uint32_t): 传感器健康状态。load
(uint16_t): CPU 使用率。voltage_battery
(uint16_t): 电池电压(单位为毫伏)。current_battery
(uint16_t): 电池电流(单位为毫安)。
Attitude Message (Message ID = 30)
- Purpose: 发送飞行器的姿态信息(滚转角、俯仰角、偏航角等)。
- Fields:
roll
(float): 飞行器的滚转角,单位为弧度。pitch
(float): 飞行器的俯仰角,单位为弧度。yaw
(float): 飞行器的偏航角,单位为弧度。rollspeed
(float): 滚转角速度,单位为弧度/秒。pitchspeed
(float): 俯仰角速度,单位为弧度/秒。yawspeed
(float): 偏航角速度,单位为弧度/秒。
(4) Global Position (Message ID = 33)
- Purpose: 发送飞行器的全球定位信息(经度、纬度、高度等)。
- Fields:
lat
(int32_t): 纬度,单位为 1E7 度。lon
(int32_t): 经度,单位为 1E7 度。alt
(int32_t): 海拔高度,单位为毫米。relative_alt
(int32_t): 相对高度(相对于启动点),单位为毫米。vx
(int16_t): 飞行器的 x 轴速度,单位为厘米/秒。vy
(int16_t): 飞行器的 y 轴速度,单位为厘米/秒。vz
(int16_t): 飞行器的 z 轴速度,单位为厘米/秒。
(5) MissionItem Message (Message ID = 39)
- Purpose: 发送任务项信息,通常用于控制飞行器执行特定任务。
- Fields:
target_system
(uint8_t): 目标系统的 ID。target_component
(uint8_t): 目标组件的 ID。seq
(uint16_t): 任务项序列号。frame
(uint8_t): 任务项坐标系类型。command
(uint16_t): 任务命令,指示执行的任务类型(如移动、拍照等)。current
(uint8_t): 任务项是否为当前任务。autocontinue
(uint8_t): 是否自动继续执行下一个任务。
(6) RC Channel Data Message (Message ID = 65)
- Purpose: 发送遥控器通道数据,用于接收遥控器的控制信号。
- Fields:
chan1_raw
(uint16_t): 通道 1 原始值。chan2_raw
(uint16_t): 通道 2 原始值。chan3_raw
(uint16_t): 通道 3 原始值。chan4_raw
(uint16_t): 通道 4 原始值。chan5_raw
(uint16_t): 通道 5 原始值。chan6_raw
(uint16_t): 通道 6 原始值。chan7_raw
(uint16_t): 通道 7 原始值。chan8_raw
(uint16_t): 通道 8 原始值。rssi
(uint8_t): 遥控器信号强度。
(7) GpsRawInt Message (Message ID = 24)
- Purpose: 发送原始 GPS 数据。
- Fields:
lat
(int32_t): 纬度,单位为 1E7 度。lon
(int32_t): 经度,单位为 1E7 度。alt
(int32_t): 海拔高度,单位为毫米。eph
(uint16_t): 水平精度。epv
(uint16_t): 垂直精度。vel
(uint16_t): 速度,单位为厘米/秒。cog
(uint16_t): 地面航向,单位为度。
(8) Battery Status Message (Message ID = 147)
- Purpose: 发送电池状态信息。
- Fields:
voltage
(float): 电池电压,单位为伏特。current
(float): 电池电流,单位为安培。battery_remaining
(float): 剩余电量百分比。
MAVLink 协议定义了多种标准消息结构,每种消息通过 Message ID 来标识,并且包含一组预定义的字段。这些字段的类型和含义是固定的,发送端和接收端通过这些约定来进行数据的传输和解析。常见的消息包括 Heartbeat、SysStatus、Attitude、Global Position 等,涵盖了飞行器的状态、控制信息、传感器数据等多个方面。
5. MAVLink 传输示例演示
在 MAVLink 协议中,数据的传输格式是通过 Message ID 和 Payload 来约定的。每个不同类型的消息都有一个唯一的 Message ID,而 Payload 部分包含了实际的数据内容。接收端根据 Message ID 知道该如何解析对应的数据结构。
(1) 定义数据包格式
在发送端和接收端之间约定好数据包的 Message ID 和其对应的 Payload 格式。假设我们定义一个 Message ID = 30 来表示无人机的姿态角,传输格式如下:
- Message ID = 30 表示 "姿态角"(Attitude Angles)消息。
- Payload 包含三个字节,分别对应:
- Roll:飞行器的滚转角(Roll),以 8 位无符号整数表示。
- Pitch:飞行器的俯仰角(Pitch),以 8 位无符号整数表示。
- Yaw:飞行器的偏航角(Yaw),以 8 位无符号整数表示。
因此,Payload 的格式可以是:[0x02, 0x08, 0x0A],分别表示:
- Roll = 0x02(2 度)
- Pitch = 0x08(8 度)
- Yaw = 0x0A(10 度)
(2) 发送端构建数据包
在发送端,MAVLink 协议会将这些信息打包成一个完整的数据包。根据前面的内容,假设构建的 MAVLink v1 数据包如下所示: [STX] [LEN] [SEQ] [SYS ID] [COMP ID] [MSG ID] [PAYLOAD] [CHECKSUM]
- STX = 0xFE(固定的起始字节)
- LEN = 3(Payload 长度为 3 字节)
- SEQ = 1(假设是第一个数据包)
- SYS ID = 1(设备系统 ID)
- COMP ID = 1(设备组件 ID)
- MSG ID = 30(无人机姿态角消息)
- PAYLOAD = [0x02, 0x08, 0x0A](Roll, Pitch, Yaw)
- CHECKSUM = 校验和(CRC 校验)
发送的数据包可能是: [0xFE] [0x03] [0x01] [0x01] [0x1E] [0x02] [0x08] [0x0A] [校验和]
(3) 接收端解析数据包
接收端收到数据包后,它会执行以下步骤:
- 检查 STX 字节:确保数据包的起始标志是正确的 0xFE。
- 检查 LEN 字段:确认数据包的有效负载长度为 3。
- 验证校验和:通过计算校验和并与接收到的数据包中的校验和进行对比,确保数据没有损坏。
- 解析消息 ID:检查 MSG ID 是否为 30。如果是,则接收端知道这是一个关于姿态角的消息。
- 解析 Payload:
- Roll = 0x02(2 度)
- Pitch = 0x08(8 度)
- Yaw = 0x0A(10 度)
(4) 如何理解这些字节
每个字节的值代表了姿态角的不同维度,通常这些值是通过传感器(如陀螺仪和加速度计)计算得到的,单位通常是度数或弧度。在这个例子中:
- Roll(滚转角):0x02,即 2 度
- Pitch(俯仰角):0x08,即 8 度
- Yaw(偏航角):0x0A,即 10 度
(5) 数据类型的约定
在实际应用中,MAVLink 协议允许使用不同的数据类型来表示 Payload 中的内容,常见的数据类型有:
- 整数类型:如 int8_t, int16_t, int32_t 等,表示有符号整数。
- 无符号整数:如 uint8_t, uint16_t, uint32_t 等,表示无符号整数。
- 浮点类型:如 float,表示小数类型,通常用于需要高精度的数据。
在本文中,Roll, Pitch, 和 Yaw 使用的是 8 位无符号整数(uint8_t),每个字节的值代表一定的角度。
(6) 发送端和接收端的约定
在 MAVLink 协议中,数据格式是由发送端和接收端通过 Message ID 来约定的。每个 Message ID 对应一个特定的数据结构。例如:
- Message ID = 30:表示无人机的姿态角(Roll, Pitch, Yaw)。
- Payload 格式:[Roll, Pitch, Yaw],它们是 8 位无符号整数。
通过这种方式,发送端和接收端能够相互理解每个数据包的内容,确保数据的正确传输和解析。
(7) 如何拓展这个格式
如果你想传输更多的数据,比如飞行器的速度、位置等,可以通过增加不同的 Message ID 和 Payload 格式来扩展。例如:
- Message ID = 31:表示飞行器的速度消息,Payload 可能包括三个字节:[速度X, 速度Y, 速度Z]。
- Message ID = 32:表示飞行器的位置消息,Payload 可能包括四个字节:[纬度, 经度, 高度, 时间戳]。
6. MAVLink总线承载的业务
MAVLink 总线承载的业务种类丰富,涵盖飞行控制、传感器数据、任务管理、视频传输等各类操作。
(1)飞行控制命令与执行
- 业务类型:飞行控制命令
- 具体业务:地面控制站(GCS)通过 MAVLink 向飞行器发送各种飞行控制命令,如设置飞行模式、启动/停止任务、设置目标位置等。
例如:SET_POSITION_TARGET_LOCAL_NED
(设置目标位置)SET_MODE
(设置飞行模式)
(2)传感器数据交换
- 业务类型:传感器数据传输
- 具体业务:飞行器上的传感器通过 MAVLink 协议将数据发送到地面控制站。这些数据包括 GPS 数据、气压计、加速度计、陀螺仪等。
例如:GPS_RAW_INT
(原始 GPS 数据)SENSOR_STATUS
(传感器状态)
(3)飞行状态与系统健康监控
- 业务类型:飞行器健康监控、系统状态
- 具体业务:飞行器通过 MAVLink 向地面控制站报告其健康状态和运行状况,包括电池电量、飞行器状态、传感器状态等。
例如:HEARTBEAT
(飞行器心跳消息)BATTERY_STATUS
(电池状态)
(4)目标与航迹追踪
- 业务类型:目标跟踪、航迹规划
- 具体业务:飞行器通过 MAVLink 向地面控制站报告目标位置、航迹信息,以及需要追踪的目标等数据,地面控制站也可以向飞行器发送新的目标位置指令。
例如:SET_TARGET_POSITION
(设置目标位置)TARGET_ATTITUDE
(目标姿态信息)
(5)图像和视频传输
- 业务类型:图像数据、视频流
- 具体业务:飞行器上的相机系统通过 MAVLink 协议将图像或视频数据发送至地面控制站,进行实时图像显示或存储。
例如:CAMERA_FEED
(摄像头视频流)IMAGE_STATUS
(图像捕获状态)
(6)航线规划与任务管理
- 业务类型:航点任务、任务执行
- 具体业务:地面控制站通过 MAVLink 协议向飞行器发送航线或任务列表,飞行器根据这些任务自动飞行或执行操作。
例如:MISSION_ITEM
(航点信息)MISSION_REQUEST
(请求任务信息)
(7)飞行器与地面控制站的命令与反馈
- 业务类型:命令执行与反馈
- 具体业务:飞行器执行任务或命令后,通过 MAVLink 协议将执行结果反馈给地面控制站,地面站则根据反馈调整飞行器的任务或控制指令。
例如:COMMAND_LONG
(长命令消息)COMMAND_ACK
(命令确认消息)
(8)日志和事件数据传输
- 业务类型:日志数据传输、事件记录
- 具体业务:飞行器可以将飞行日志、事件数据通过 MAVLink 协议传输至地面控制站,供后续分析。
例如:LOG_REQUEST_DATA
(日志请求)LOG_ENTRY
(日志条目)
(9)安全和紧急操作
- 业务类型:紧急操作、安全监控
- 具体业务:在遇到飞行异常或紧急情况时,飞行器可以通过 MAVLink 协议通知地面控制站并请求执行紧急操作(如自动返航、紧急着陆等)。
例如:EMERGENCY
(紧急操作指令)
7. MAVLink总线承载的方式
MAVLink 是一种轻量级的通信协议,设计上支持不同的通信介质与设备连接。MAVLink 协议的主要涉及数据如何通过物理网络传输、消息格式、传输协议等。其主要的承载方式有:
(1)通信媒介
- 串行通信(UART/RS-232):MAVLink 通常通过串行接口进行通信,常见的串行通信方式包括 UART(通用异步收发传输)和 RS-232。这些接口常用于连接地面控制站与飞行器之间,或者飞行器内部的各种子系统(如 GPS、IMU、传感器等)。
- 网络通信(TCP/IP、UDP):MAVLink 也支持通过 TCP/IP 或 UDP 网络协议进行通信。这种方式常用于远程地面控制站与飞行器之间的通信,特别是在长距离通信或无人机群体通信中,使用 UDP 协议可提高传输效率。
- 无线通信:MAVLink 支持通过无线电频率(如 Wi-Fi、LTE、卫星通信等)进行数据传输,广泛用于远程飞行控制和任务管理。无线通信通过协议如 Wi-Fi、LoRa 或 ZigBee,也能承载 MAVLink 消息。
- 蓝牙和其他低功耗无线通信:MAVLink 也可以通过蓝牙或其他低功耗无线通信协议在短距离内实现数据交换,常见于一些小型飞行器和任务。
(2)消息格式与结构
MAVLink 的消息是基于 二进制格式 进行编码的,具有固定的 消息头、有效载荷 和 校验和:
- 消息头:包含了消息的类型、长度、序列号、设备 ID 等基本信息。
- 有效载荷:包含了具体的数据,如传感器数据、控制命令、飞行器状态等。
- 校验和:确保消息在传输过程中没有损坏。
(3)多设备通信(多对多)
MAVLink 协议支持 多对多通信,即一个地面控制站(GCS)可以同时与多个飞行器进行通信,多个飞行器也可以彼此交换数据。飞行器可以在同一总线上接收来自多个地面控制站的命令或发送实时数据给多个接收设备。
(4)消息传输模式
- 实时通信:对于飞行控制命令、传感器数据等需要低延迟的消息,MAVLink 提供实时传输模式。
- 非实时通信:对于任务上传、航点列表、日志等非实时性要求的业务,MAVLink 提供批量传输和延迟处理功能。
- 时间同步:MAVLink 协议能够通过 时间戳 实现消息的同步,尤其在多个传感器和设备共同工作时,确保不同设备的时间一致,数据能够按照正确的顺序传输和处理。
8. MAVLink总线设备列表
MAVLink 协议广泛应用于无人机(UAV)和飞行器系统中,支持多种类型的设备接入。
设备类别 | 设备名称 | 接入方式 | 功能描述 |
---|---|---|---|
飞行器控制系统 | 飞行控制器(Flight Controller) | 串行接口(UART)或 网络接口(TCP/UDP) | 主要负责飞行控制、姿态调节、航线规划等,处理来自地面站的控制指令。 |
地面控制站 | 地面控制站(GCS) | 无线(Wi-Fi/LTE)、串行接口(UART/USB) | 用于飞行器的控制与监视,接收传感器数据、发送飞行命令和获取状态反馈。 |
传感器设备 | GPS 接收器 | 串行接口(UART)或 I2C 接口 | 提供飞行器的位置、速度、高度等信息,供飞行控制器使用。 |
IMU(惯性测量单元) | 串行接口(UART)或 I2C 接口 | 提供飞行器的加速度、陀螺仪数据等,用于姿态控制。 | |
气压计(Barometer) | 串行接口(UART)或 I2C 接口 | 测量飞行器的气压数据,用于高度控制和飞行稳定。 | |
摄像设备 | 数字相机(Camera) | 串行接口(UART)或 视频流接口(如 HDMI) | 提供实时图像或视频流,地面控制站或飞行器可使用其进行拍摄、传输或处理。 |
动力系统 | 电池管理系统(BMS) | 串行接口(UART) | 监控电池的电量、电压、温度等状态,确保飞行器在安全电量下运行。 |
通信模块 | 无线电模块(Radio Modem) | 串行接口(UART) | 用于飞行器与地面控制站之间的无线通信,支持长距离通信。 |
数据存储设备 | 存储卡(SD卡、eMMC) | 串行接口(UART)或 SPI 接口 | 存储飞行日志、航点数据、传感器数据等,供后期分析。 |
导航辅助设备 | 超声波传感器(Ultrasonic) | 串行接口(UART)或 I2C 接口 | 用于飞行器的地面距离测量和障碍物检测,尤其适用于低空飞行。 |
飞行器硬件接口 | 电动机控制器(ESC) | 串行接口(UART) | 控制电动机的速度和方向,帮助飞行器实现精确的飞行姿态控制。 |
外部控制设备 | 遥控器(RC Transmitter) | 串行接口(UART)或 PWM 信号接口 | 用于飞行员手动控制飞行器,发送飞行控制指令或紧急停机信号。 |
其他辅助设备 | 激光雷达(LiDAR) | 串行接口(UART)或 I2C 接口 | 提供精确的地面高度和障碍物检测,用于飞行器的避障和精确定位。 |
系统监控设备 | 健康监控模块(Health Monitor) | 串行接口(UART) | 监控飞行器各个硬件设备的健康状况,如电池、传感器、电动机等。 |