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,结束。

相关推荐
星火开发设计3 小时前
C++ stack 全面解析与实战指南
java·数据结构·c++·学习·rpc··知识
AI视觉网奇3 小时前
ue 设置骨骼网格体
c++·ue5
编程之路,妙趣横生4 小时前
C++ IO流
c++
fpcc4 小时前
跟我学C++中级篇—std::conjunction手动实现
c++
项目題供诗4 小时前
C语言基础(三)
c语言·c++
1***43804 小时前
C++跨平台开发的核心挑战线程管理等基础功能
开发语言·c++
txinyu的博客5 小时前
C++ 智能指针 (shared_ptr/weak_ptr) 全解析
开发语言·c++
小徐不徐说5 小时前
避坑指南:Qt 中 Lambda 表达式崩溃原因与高效使用实践
数据库·c++·qt·面试
寻星探路5 小时前
【算法进阶】滑动窗口与前缀和:从“和为 K”到“最小覆盖子串”的极限挑战
java·开发语言·c++·人工智能·python·算法·ai