MavLink消息协议

文章目录

  • MavLink协议
    • 1.消息帧组成
      • [1.1.1 起始标记(STX)](#1.1.1 起始标记(STX))
      • [1.1.2 有效载荷字节长度(LEN)](#1.1.2 有效载荷字节长度(LEN))
      • [1.1.3 消息帧序列号(SEQ)](#1.1.3 消息帧序列号(SEQ))
      • [1.1.4 消息帧设备系统编号(SYS)](#1.1.4 消息帧设备系统编号(SYS))
      • [1.1.5 消息帧的设备的单元编号(COMP)](#1.1.5 消息帧的设备的单元编号(COMP))
      • [1.1.6 消息编号(MSG)](#1.1.6 消息编号(MSG))
      • [1.1.7 效验位(CKA和CKB)](#1.1.7 效验位(CKA和CKB))
  • 小结

MavLink协议

MAVLink 协议是由苏黎世联邦理工学院计算机视觉和集合实验室的 Lorenz

Meier 在 2009 年发布的,遵守 LGPL 的开源协议。MAVLink 协议是在串口通讯基础上的一种更高层的开源通讯协议,主要应用在微型飞行器的通讯上,它为小型飞行器和地面站(或者其他飞行器)通讯时常常用到的那些数据制定一种

发送和接收的规则并加入了 16 位的 CRC 校验。协议以消息库的形式定义了参数传输的规则。 MAVLink 协议支持无人固定翼飞行器、无人旋翼飞行器、无人车辆等多种类型的无人机。MAVLink 协议是在 CAN 总线和 SAE AS-4 标准的基础上设计形成的。

1.消息帧组成

┌────┬──────┬─────┬──────┬────────┬───────┬──────┐

│ STX│ LEN │ SEQ │ SYSID│ COMPID │ MSGID │ DATA │

│1B │ 1B │ 1B │ 1B │ 1B │ 1B │ nB │

└────┴──────┴─────┴──────┴────────┴───────┴──────┘

CRC (2 bytes)

具体含义如下图:

字段 字节 含义
STX 1 起始符 = 0xFE
LEN 1 数据长度 (0~255)
SEQ 1 包序号(0~255循环)
SYSID 1 系统ID(飞机1,地面站255...)
COMPID 1 组件ID(飞控=1,云台=154...)
MSGID 1 消息类型
PAYLOAD N 数据
CRC_L 1 CRC低字节
CRC_H 1 CRC高字节

1.1.1 起始标记(STX)

在 V1.0:0xFE ,V0.9:0x55。该标志位标志消息的开始,在消息识别和解析中会用到。

1.1.2 有效载荷字节长度(LEN)

记录了有效载荷 PAYLOAD 的字节长度,取值范围是 0 到 255 。在 MAVLink 的接受端可以用来将它和实际接受到的有效载荷长度进行对比,以验证消息是否正确。

1.1.3 消息帧序列号(SEQ)

每次发完一个消息,这个字节的内容会加 1,加到 255 后会从 0 重新开始。用于 MAVLink 消息帧接收端计算消息丢失比例,相当于信号强度。

1.1.4 消息帧设备系统编号(SYS)

用于 MAVLink 消息帧接收端识别是哪个设备发来的消息,使用 PIXHAWK刷 PX4 固件时默认的系统编号为 1。

1.1.5 消息帧的设备的单元编号(COMP)

用于 MAVLink 消息帧接收端识别是设备的哪个单元发来的消息, 使用PIXHAWK 刷 PX4 固件时默认的单元编号为 50。

1.1.6 消息编号(MSG)

标识消息的种类, MAVLink 消息帧接收端要根据这个编号来确定有效载荷里到底放了什么消息包并根据编号选择对应的方式来处理有效载荷里的信息包。

1.1.7 效验位(CKA和CKB)

CKB 是高八位,CKA 是低八位。校验码由 CRC16 算法得到,算法将整个消息(从起始位开始到有效载荷结束,还要额外加上个 MAVLINK_CRC_EXTRA 字节)进行 CRC16 计算,得出一个 16 位的校验码。之前提到的每种有效载荷里信息包(由消息包编号来表明是哪种消息包)会对应一个MAVLINK_CRC_EXTRA,这个 MAVLINK_CRC_EXTRA 是由生成 MAVLink 代码的xml 文件生成的,加入这个额外的东西是为了当飞行器和地面站使用不同版本的 MAVLink 协议时,双方计算得到的校验码会不同,这样不同版本间的MAVLink 协议就不会在一起正常工作,避免了由于不同版本间通讯时带来的重大潜在问题。

小结

这一节主要梳理了MavLink协议,最近在看无人机,看看是不是写一个地面站的模块;地面站用到的协议就是MavLink协议,先把这个写了,有了前置的知识;后边就轻松了。这些都是用C++写的,有兴趣,可以去这里学学。OK,结束。

相关推荐
Bella的成长园地8 小时前
面试中关于 c++ async 的高频面试问题有哪些?
c++·面试
彷徨而立8 小时前
【C/C++】什么是 运行时库?运行时库 /MT 和 /MD 的区别?
c语言·c++
qq_417129258 小时前
C++中的桥接模式变体
开发语言·c++·算法
No0d1es10 小时前
电子学会青少年软件编程(C语言)等级考试试卷(三级)2025年12月
c语言·c++·青少年编程·电子学会·三级
bjxiaxueliang11 小时前
一文掌握C/C++命名规范:风格、规则与实践详解
c语言·开发语言·c++
xu_yule12 小时前
网络和Linux网络-13(高级IO+多路转接)五种IO模型+select编程
linux·网络·c++·select·i/o
2301_7657031412 小时前
C++与自动驾驶系统
开发语言·c++·算法
轩情吖12 小时前
Qt的窗口(三)
c++·qt
热爱编程的小刘12 小时前
Lesson04---类与对象(下篇)
开发语言·c++·算法
郝学胜-神的一滴13 小时前
Linux网络编程之listen函数:深入解析与应用实践
linux·服务器·开发语言·网络·c++·程序人生