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

相关推荐
REDcker9 小时前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式
basketball6169 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
想唱rap10 小时前
IO多路转接之poll
服务器·开发语言·数据库·c++
落羽的落羽11 小时前
【算法札记】练习 | Week4
linux·服务器·数据结构·c++·人工智能·算法·动态规划
goodesocket11 小时前
芯片HAST测试:通电工作下如何精准模拟极端环境挑战?
c++
特种加菲猫12 小时前
从零开始手撕AVL树:详解插入、平衡因子更新与四种旋转
开发语言·c++
萑澈12 小时前
算法竞赛入门:C++ STL核心用法与时空复杂度速查手册
数据结构·c++·算法·stl
江屿风13 小时前
C++OJ题经验总结(竞赛)1
开发语言·c++·笔记·算法
运筹vivo@13 小时前
LeetCode 2405. 子字符串的最优划分
c++·算法·leetcode·职场和发展·哈希表
有点。14 小时前
C++(枚举法一练习题)
开发语言·c++·算法