Mavlink协议(第二版)

2023-05-16

文章目录

    • 协议简介
      • 一、Mavlink协议
        • 主要特点
      • 二、数据结构
        • 不兼容标志 (MAVLink 2)
        • 兼容性标志 (MAVLink 2)
        • 有效载荷格式
        • MAVLink 2 的数据包格式
      • 三、航点协议
      • 四、参数的读写
      • 五、增加新的mavlink消息
      • 六、消息的发送与解析
      • 七、通用的Mavlink消息
    • 参考资料

协议简介

不整理了,官方给出了新版本很清晰了已经。

官方中文文档:

https://github.com/mavlink/mavlink-devguide/tree/master/zh
https://github.com/mavlink/mavlink-devguide/tree/master/zh/guide

MavLink官网:https://mavlink.io/

MAVLink通讯协议是一个为微型飞行器设计的非常轻巧的、只由头文件构成的信息编组库。它可以通过串口非常高效地封装C结构数据,并将这些数据包发送至地面控制站。该协议被PX4, PIXHAWK, APM和Parrot AR.Drone平台所广泛测试并在以上的项目中作为MCU/IMU间以及Linux进程和地面站链路通信间的主干通信协议。

一、Mavlink协议

MAVLink 是一种非常轻量级的消息传递协议,用于与无人机(以及机载无人机组件之间)进行通信。
MAVLink 遵循现代混合发布-订阅和点对点设计模式:数据流作为主题发送/发布,而任务协议或参数协议等配置子协议是点对点重传。
消息在 XML 文件中定义。每个 XML 文件都定义了特定 MAVLink 系统支持的消息集,也称为“方言”。大多数地面控制站和自动驾驶仪实施的参考消息集在common.xml 中定义(大多数方言建立在此定义之上)。
代码生成器根据这些 XML 消息定义为特定编程语言创建软件库,然后无人机、地面控制站和其他 MAVLink 系统可以使用这些软件库进行通信。生成的库通常是 MIT 许可的,因此可以在任何闭源应用程序中不受限制地使用,而无需发布闭源应用程序的源代码。

主要特点

  • 非常有效率。MAVLink 1 每个数据包只有 8 个字节的开销,包括开始标志和数据包丢弃检测。MAVLink 2 只有 14 字节的开销(但它是一个更安全和可扩展的协议)。由于 MAVLink 不需要任何额外的成帧,因此非常适合通信带宽非常有限的应用。
  • 非常可靠。自 2009 年以来,MAVLink 已被用于在许多不同的车辆、地面站(和其他节点)之间通过各种且具有挑战性的通信渠道(高延迟/噪声)进行通信。它提供了检测数据包丢失、损坏和数据包身份验证的方法。
  • 可以使用多种不同的编程语言,在众多微控制器/操作系统(包括 ARM7、ATMega、dsPic、STM32 和 Windows、Linux、MacOS、Android 和 iOS)上运行。
  • 网络上最多允许 255 个并发系统(车辆、地面站等)
  • 启用机外和机载通信(例如 GCS 和无人机之间,以及无人机自动驾驶仪和启用 MAVLink 的无人机相机之间)。

MAVLink于2009年初由Lorenz Meier首次发布, 目前为止,已拥有数量可观的贡献者。
基于C封装的MAVLink库,是一个 header-only库, 其针对资源受限系统有限的ram 和闪存,进行了高度优化。 这种库,已经过现场验证, 并部署在许多产品中, 充当不同厂家组件之间的交互性接口。

MAVLink 2的主要新特性是:

24 位消息 ID(指令类型) - 允许方言中超过 1600 万个唯一消息定义(MAVLink 1 限制为 256)
数据包签名- 验证消息是由受信任的系统发送的。
消息扩展- 向现有 MAVLink 消息定义添加新字段,而不会破坏尚未更新的接收器的二进制兼容性。
空字节有效负载截断- 序列化有效负载末尾的空(零填充)字节必须在发送之前删除(所有字节都在MAVLink 1中发送,无论内容如何)。
Compatibility Flags / Incompatibility Flags - 通过指示必须以特殊/非标准方式处理的帧来允许协议的向后兼容演变(具有兼容性标志的数据包仍可以以标准方式处理,而具有不兼容标志的数据包必须是如果不支持该标志,则丢弃)。

二、数据结构

MAVLink 是一种二进制遥测协议,专为资源受限系统和带宽受限链接而设计。MAVLink 部署在两个主要版本中:v1.0 和 v2.0,它们向后兼容(v2.0 实现可以解析和发送 v1.0 数据包)。遥测数据流以多播设计发送,而改变系统配置和需要保证交付(如任务协议或参数协议)的协议方面是点对点重传。

Mavlink传输时基本单位是消息帧,消息帧的结构如下:

mavlink-structMavLink数据结构

字节索引名称C版本内容含义
0STXuint8_t magic数据包起始标志0xFD协议特定的文本开始(STX)标记,用于指示新数据包的开始。
1LENuint8_t len有效载荷长度0 - 255标识该消息包中负载长度
2INC FLAGSuint8_t incompat_flags不兼容标志-为实现MAVLink兼容性必须理解的标志(若实现不理解标志,则丢弃数据包)。
3CMP FLAGSuint8_t compat_flags兼容性标志-如果不理解,则可以忽略的标志(即使不理解标志,实现仍然可以处理数据包)。
4SEQuint8_t seq包序列号0 - 255消息发送序列号,用于检测数据包的丢失
5SYS IDuint8_t sysid系统 ID (发送者)1 - 255发送信息的系统(车辆)的ID。用于区分网络上的系统.
6COMP IDuint8_t compid组件ID (发送者)1 - 255发送消息的组件的ID。用于区分系统中的组件(例如自动驾驶仪和摄像头)
7 to 9MSG IDuint32_t msgid:24消息IDID (low, middle, high bytes)0 - 16777215有效负载中消息类型的ID。用于将数据解码回消息对象。
For n-byte payload:n=0: NA, n=1: 10, n>=2: 10 to (9+n)PAYLOADuint8_t payload[max 255]消息载荷-消息内部的负载信息
(n+10) to (n+11)CHECKSUMuint16_t checksumChecksum (low byte, high byte)-CRC-16/MCRF4XX for message (excluding magic byte). Includes CRC_EXTRA byte.
(n+12) to (n+25)SIGNATUREuint8_t signature[13]签名信息-(可选) 签名以确保链接是防篡改的.
  • 对于没有有效负载的确认数据包,最小数据包长度为12字节。
  • 对于使用整个有效负载的签名消息,最大数据包长度为280字节。

注意:校验码由crc16算法得到,算法从消息包的1~n+6字节(不包含STX),还要额外加上个MAVLINK_CRC_EXTRA进行计算得到一个16位的校验码。每个消息的头文件里都包含MAVLINK_CRC_EXTRA,这个MAVLINK_CRC_EXTRA是由生成mavlink代码的xml文件生成的,加入这个额外的东西是为了当飞行器和地面站使用不同版本的mavlink协议时,双方计算得到的校验码会不同,这样不同版本间的mavlink协议就不会在一起正常工作,避免了由于不同版本间通讯时带来的重大潜在问题。

不兼容标志 (MAVLink 2)

不兼容标志用于指示 MAVLink 库必须支持才能处理数据包的功能。这包括影响数据包格式/排序的任何功能。

如果 MAVLink 实现不理解字段中的任何标志,则它必须丢弃数据包incompat_flags。

支持的不兼容标志包括(在撰写本文时):

旗帜C旗特征
0x01MAVLINK_IFLAG_SIGNED数据包已签名(签名已附加到数据包)。

兼容性标志 (MAVLink 2)

兼容性标志用于指示功能不会阻止 MAVLink 库处理数据包(即使该功能不被理解)。例如,这可能包括一个标志,用于指示应将数据包视为“高优先级”(此类消息可由任何 MAVLink 实现处理,因为数据包格式和结构不受影响)。
MAVLink 实现可以安全地忽略它在该compat_flags领域不理解的标志。

有效载荷格式

MAVLink 在有效载荷本身中不包含有关消息结构的信息(为了减少开销)!相反,发送方和接收方必须对在线格式的消息字段的含义、顺序和大小有共同的理解。

消息在 MAVLink 数据包中编码:

  • msgid(消息id)字段标识数据包中编码的特定消息,所有MavLink指令消息和应答消息都使用此标识标记类型
  • 有效负载字段包含消息数据:
    • MAVLink为有线传输重新排序有效负载中的消息字段(根据原始XML消息定义中的顺序)。
    • 在发送消息之前,MAVLink 2会截断有效负载末尾的任何零填充字节,并适当设置数据包长度字段(MAVLink 1始终发送所有字节)。
  • len字段包含有效负载数据的长度。
  • A CRC_EXTRA byte is added to the message checksum. 接收者可以使用它来确认它与有效负载消息格式/定义兼容。

A MAVLink library should notify a bad CRC during decoding if a message specification is incompatible (e.g. the C library mavlink_parse_char() gives a status MAVLINK_FRAMING_BAD_CRC).

MAVLink 2 的数据包格式

以下为在链路上传输的 MAVLink v2 数据包格式。 内存中的表示方式可能会有所不同。

uint8_t magic;              ///< protocol magic marker
uint8_t len;                ///< Length of payload
uint8_t incompat_flags;     ///< flags that must be understood
uint8_t compat_flags;       ///< flags that can be ignored if not understood
uint8_t seq;                ///< Sequence of packet
uint8_t sysid;              ///< ID of message sender system/aircraft
uint8_t compid;             ///< ID of the message sender component
uint8_t msgid 0:7;          ///< first 8 bits of the ID of the message
uint8_t msgid 8:15;         ///< middle 8 bits of the ID of the message
uint8_t msgid 16:23;        ///< last 8 bits of the ID of the message
uint8_t payload[max 255];   ///< A maximum of 255 payload bytes
uint16_t checksum;          ///< CRC-16/MCRF4XX
uint8_t signature[13];      ///< 保证正确连接的签名(可选)

三、航点协议

四、参数的读写

五、增加新的mavlink消息

六、消息的发送与解析

七、通用的Mavlink消息

参考资料

1.Mavlink协议
2.Mavlink协议第一版介绍

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mavlink协议(第二版) 的相关文章

  • Matlab调整子图位置及大小

    为了绘制多个子图的MATLAB图 xff0c 但是使用导出设置时无法将子图全屏铺满整个屏幕 xff0c 因此本文对设置MATLAB子图位置进行了研究 xff0c 达到如下的效果 1 首先 xff0c 明确其中每个变量的含义 xff0c 从M
  • excel计算出均方根值(RMS)+ 均方根误差(RMSE)+标准差(Standard Deviation)

    首先弄明白这几者的区别 xff0c 方差 标准差和均方根误差的区别总结 均方根值 xff08 RMS xff09 43 均方根误差 xff08 RMSE xff09 43 标准差 xff08 Standard Deviation xff09
  • Matlab画图和点标记

    从csv中导出数据 xff0c 然后需要在MATLAB图中进行标记个别点 xff0c 但是利用MTALB自身标记的比较丑 xff0c 因此搜了一下别的方法 xff0c 具体效果如下 xff0c 其中的 可以改成O或者其他的自定义的符号 xf
  • word因导入mathtype不能使用复制粘贴快捷键的解决方法

    经查阅有两种解决方式 xff1a 1 直接删除你安装的原office中的MathType Commands 2016 dotm这个文件 2 是更换为mathtype里面的文件 xff0c 具体过程如下两个参考 xff1a 官网给出的解决办法
  • 强力推荐90个优秀外国英文网站

    一 大陆可访问的优秀英文信息源 1 英国 经济学家 http www economist com 2 美联社 http wire ap org GoToAP cgi 3 英国BBC http news bbc co uk 4 纽约时报 ht
  • 学习笔记(01):MFC上位机与STM32下位机通讯精讲-STM32串口实战1之串口发送1(串口初始化实践)...

    立即学习 https edu csdn net course play 6375 122556 1 GPIO PinAFConfig 函数复用功能 xff0c 将GPIO和USART连接起来
  • 单片机模拟输出PPM信号

    PPM信号就是将多个PWM信号放在一起传输 xff0c 一个PPM的周期为20ms 其中一个通道信号的范围为1 2ms 所以一个PPM信号 xff0c 最多可以传输10个通道的PWM信号 PPM信号以0 5ms的低电平信号代表一个通道的起始
  • linux在线模拟器

    我们项目部在开发过程中运用了自动化发布系统 xff0c 而且发布过程比较严格和规范 xff0c 写完代码只需要提交svn xff0c 填写发布文档 xff0c 测试通过之后有运维组发布到线上 这就导致很少有接触linux系统的机会 xff0
  • ROS订阅者程序

    include lt ros ros h gt include lt turtlesim Pose h gt include lt iomanip gt void poseMessageReceived const turtlesim Po
  • 吴恩达 ML作业提交:Grader sent no response

    目录 文章目录 目录前言正文解决方案 前言 最近在补习吴恩达machinelearning 的课程 xff0c 上完了课 xff0c 肯定是要做作业的 xff0c 做作业没有问题 xff0c 但在提交作业时遇到了问题 xff0c 记录如下
  • Docker容器通过独立IP暴露给局域网的方法

    Docker容器非常轻量 xff0c 系统开销非常少 xff0c 比VMware或者VirtualBox用起来方便 xff0c 部署起来也非常容易 官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用 一
  • CCS v6.1下完成TI-RTOS配置

    TI RTOS 是实时操作系统的TI微控制器 TI RTOS实现更快的发展不再需要开发人员编写和维护的系统软件 xff0c 如调度程序 xff0c 协议栈和驱动程序 它结合了实时多任务内核与其他中间件组件 xff0c 包括TCP IP和US
  • 【USRPx310系列(NI USRP2940-2955)+ srsRAN】环境搭建与应用

    x1f4e3 x1f973 x1f973 x1f973 x1f4e3 Hello 如果这篇 文章 对你有帮助 x1f604 xff0c 希望可以给博主点个赞 x1f44d 鼓励一下 x1f618 x1f4e3 x1f973 x1f973 x
  • 单相全桥逆变原理及仿真实验

    前言 一 单相全桥逆变器组成原理 1 全桥逆变电路拓扑结构 2 单相逆变器的SPWM调制方式 二 单相全桥逆变器仿真 1 SPWM调制波仿真 2 全桥逆变仿真 三 SPWM单片机程序实现 1 CubeMX配置 2 SPWM正弦表数据生成 3
  • STM32系列(HAL库)——使用ESP8266-01S物联网模块连接Onenet云平台上报DHT11温湿度

    前言 本篇主要讲解如何使用ESP8266 01S物联网模块连接Onenet云平台 xff0c 并上报DHT11模块的温湿度数据 本文单片机主控采用STM32F405RGT6 xff0c 使用其他主控的话基本要求有2个串口 xff0c 一个串
  • 使用cmake混编c和c++

    由于项目的需求 xff0c 需要将c和c 43 43 混编 xff0c 项目采用cmake 直接上代码 xff1a project main CXX C 这里可以不写CXX和C xff0c 但不能只写一个 xff0c 否则只会编译指定语言
  • 关于Hyper-V设置了本地桥接网络后 宿主机网络变慢的问题

    本机系统 xff1a WIN10专业版 1903 启用了Hyper V虚拟机 由于要玩docker xff0c 就在虚拟机里装了个Center OS7 设置了一个外部网络 这时候宿主机就和这个CenterOS 是同一IP段了 这时候看下面的
  • 记录 docker 安装mssql 2017

    系统环境 xff1a 阿里云 CentOS 7 4G内存 参考 xff1a https docs microsoft com zh cn sql linux quickstart install connect docker view 61
  • docker mysql 5.7 -v挂载目录 笔记

    本文记录两个环境中docker 安装mysql xff0c 主是要记录挂载目录遇到的问题 注意 xff1a mysql 5 7这个版本目录挂载有问题 xff0c 要用mysql 5 7 16以上版本 xff0c 5 7版本在windows
  • win10 升级到21H1 后Thinkpad X系列本本 音频驱动 没有声音

    前景 1 重装了几次系统 xff0c win10 64位系统 xff0c 装的过程中 xff0c 设置语言之类的界面时 xff0c 有声音 xff0c xff0c xff0c 进入系统后无声音 2 安装联想驱动管理 驱动 都装好了 xff0

随机推荐

  • Java Steam.filter() 过滤 通过Predicate&lt;T&gt;实现 多条件动态 or and 过滤

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • mysql 判断字段否存在,如果存在就修改字段

    先建一个存储过程 xff0c 再执行存储过程 xff0c 然后删掉存储过程 DROP PROCEDURE IF EXISTS proc tempPro CREATE PROCEDURE proc tempPro BEGIN SELECT c
  • mysql 常用脚本整理

    MySQL 来自各种资源 及部分自己实践 添加字段 ALTER TABLE 表名 ADD COLUMN 列名 类型 comment 39 说明 39 ALTER TABLE User ADD COLUMN shorName varchar
  • Docker Center OS7笔记--删除镜像(httpd)

    删除镜像 xff08 httpd xff09 1 docker stop docker ps a q 停止所有容器 2 docker ps a 查看容器 3 docker rm 容器ID 删除容器 删除后 xff0c 就没有容器了 4 do
  • SqlServer 2008R2 10.50.1600.1 升级到 SqlServer 2016

    要从sql server 2008 R2 企业版 直接升级到 2016 企业版 要先把R2升级到SP3这个版本 xff08 注意 xff1a 不是sp1 sp2 sp3的安全更新 坑 xff09 然后去下载2016 去itellyou下载
  • C#委托与事件

    1 什么是委托 委托是C 中的一个引用类型 它允许捕捉对方法的引用 xff0c 并像传递其他对象那样传递该引用 xff0c 也可以像调用其他方法一样调用被捕捉的方法 声明委托需要使用delegate关键字 xff1a span class
  • 数据分发服务 (DDS)及Fast DDS环境搭建

    1 数据分发服务 DDS 数据分发服务 DDS 是一种以 数据为中心的通信协议 xff0c 用于分布式软件应用程序通信 它描述了支持数据提供者和数据消费者之间通信的通信应用程序编程接口 API 和通信语义 由于它是一个以数据为中心的发布订阅
  • Docker管理工具Web UI:DockerUI & Shipyard /portainer

    docker针对于系统工程师或者开发人员来说操作比较简单 一般我们习惯了对着黑黑的屏幕敲命令 xff0c docker pull xff0c docker push xff0c docker run xff0c docker logs xf
  • BeautifulSoup+pandas 爬取新浪国内新闻

    xff08 1 xff09 使用技术 python 3 5 2 sqlite3 pandas requests jupyter notebook xff08 2 xff09 详细代码 新浪国内新闻首页 xff1a http news sin
  • android8.1客制化修改文档

    1 去除设置 系统 关于手机 硬件信息去掉 vendor mediatek proprietary packages apps MtkSettings res xml device info settings xml中删除布局文件 xff0
  • C/C++总结笔记——指针1:野指针、空指针(NULL和nullptr)、悬空指针、智能指针

    C C 43 43 中有几种指针相关的概念 xff0c 只知道有这样的概念 xff0c 但HR一问就露馅 xff0c 这里进行总结方便复习 1 野指针 1 指针定义时未被初始化 xff1a 指针在被定义的时候 xff0c 如果程序不对其进行
  • ARM汇编的编程模式和工作模式

    ARM采用32位架构 ARM 约定 Byte 8bitsHalfword 16bits 2byteWord 32 bits 4bytes ARM core 的指令集 ARM指令集 32 bitThumb指令集 xff08 沙姆 xff09
  • 嵌入式开发内存节约方法(笔记)

    1 不要在 h文件中定义变量 xff0c 可以声明一个extern全局变量 xff0c 定义在某一个 c文件中进行 其他 c文件即可共用 在源文件中引入头文件相当于直接把头文件的内容拷贝到原文件中 xff0c 如果引入这个头文件后 xff0
  • Linux内核进程上下文切换深入理解

    我们知道操作系统的一个重要功能就是进行进程管理 xff0c 而进程管理就是在合适的时机选择合适的进程来执行 xff0c 在单个cpu运行队列上各个进程宏观并行微观串行执行 xff0c 多个cpu运行队列上的各个进程之间完全的并行执行 进程管
  • 尚医通开发笔记(结尾含部分bug修复方法)

    目录 项目简介 xff1a 包含系统 项目架构 前端开发流程 xff1a common模块 swagger2 Result xff08 全局统一返回结果 xff09 YyghException xff08 自定义全局异常 xff09 Glo
  • 树莓派上的软件安装和卸载命令汇总

    基础命令 安装软件 apt get install softname1 softname2 softname3 卸载软件 apt get remove softname1 softname2 softname3 卸载并清除配置 apt ge
  • ubuntu安装KDE桌面环境

    ubuntu安装KDE桌面环境 打开shell环境 xff0c 执行sudo apt get install kubuntu desktop xff0c 然后会提示一大堆的软件包要安装 xff0c 注意安装好之后有1G多 lxc 64 lx
  • 游戏开发书籍推荐

    游戏开发书籍推荐 xff08 1 3 1 Windows游戏编程大师技巧 xff08 第二版 xff09 原名 xff1a Tricks of the Windows Game Programming Gurus 2nd 作者 xff1a
  • ROS实战之ROS组网的搭建

    搭建ROS组网 工具 xff1a 台式机 xff08 Ubuntu xff09 xff1a 192 168 2 101 笔记本 xff08 虚拟机 xff09 xff1a 192 168 2 106 步骤 xff08 此处以在笔记本中运行r
  • Mavlink协议(第二版)

    文章目录 协议简介一 Mavlink协议主要特点 二 数据结构不兼容标志 MAVLink 2 兼容性标志 MAVLink 2 有效载荷格式MAVLink 2 的数据包格式 三 航点协议四 参数的读写五 增加新的mavlink消息六 消息的发