PX4模块设计之四:MAVLink简介

2023-05-16

PX4模块设计之四:MAVLink简介

  • 1. MAVLink(PX4)应用简介
  • 2. MAVLink v2.0新特性
  • 3. MAVLink协议版本
  • 4. MAVLink通信协议帧
    • 4.1 MAVLink v1.0 帧格式
    • 4.2 MAVLink v2.0 帧格式
  • 5. MAVLink 签名报文
    • 5.1 签名报文帧格式
      • 5.1.1 Link IDs (链路ID)
      • 5.1.2 Timestamp (时间戳)
      • 5.1.3 Signature (签名)
    • 5.2 签名报文有效性判断
    • 5.3 非签名报文处理建议
    • 5.4 错误签名报文处理建议
    • 5.5 秘钥管理
  • 6. 参考资料

基于PX4开源软件框架简明简介的框架设计,逐步分析内部模块功能设计。

前面了解了三种消息中间件中的一种uORB消息中间件,接下来看下MAVLink(Micro Air Vehicle Link,微型空中飞行器链路通讯协议)中间件。

1. MAVLink(PX4)应用简介

PX4使用MAVLink与QGroundControl(或者其他地面站软件),并且也用于飞控以外的伴飞电脑和摄像头通信与控制。

目前,MAVLink作为轻量级的通信协议,已被广泛应用与无人机系统。随着应用的拓展,基于该协议定义了一系列标准的消息和微服务用于飞控系统内的数据交互。

PX4开源代码将mavlink作为一个submodule集成到/src/modules/mavlink目录下,并在编译的时候自动生成MAVLink头文件(/build//mavlink/)。

默认使用的是/mavlink/messages/1.0/下的development配置文件development.xml。

注:该默认配置使用/src/modules/mavlink/CMakeLists.txt文件内的变量MAVLINK_DIALECT定义;

34 set(MAVLINK_DIALECT "development") # standard, development, etc

2. MAVLink v2.0新特性

  • 24 bit message ID - 支持2^24=16,777,216个消息定义(MAVLink v1.0仅支持256个)
  • Packet signing - 支持信任签名机制,保证系统的可靠性。
  • Message extensions - 新增字段并兼容支持之前的版本。
  • Empty-byte payload truncation - 在发送之前,必须删除序列化负载末尾的空(零填充)字节(所有字节都在MAVLink 1中发送,而不管内容如何)。
  • Compatibility Flags/Incompatibility Flags - 报文尝试解释和直接丢弃标记功能

3. MAVLink协议版本

  • MAVLink 2.0: 当前/推荐 主要版本,于2017年开始采用。
  • MAVLink v1.0: 广泛应用于2013年,目前仍有大量存量设备采用上述协议。

为确保存量版本v1.0和主流版本v2.0的兼容性,v2.0新增版本协商流程来判断飞控支持的协议版本,v2.0协商逻辑和流程如下:

  1. If the system supports MAVLink 2 and the handshake it will respond with PROTOCOL_VERSION encoded as MAVLink 2 packet.
  2. If it does not support MAVLink 2 it should NACK the command.
  3. The GCS should fall back to a timeout in case the command interface is not implemented properly.

版本协商时序图

4. MAVLink通信协议帧

4.1 MAVLink v1.0 帧格式

![MAVLink 1 Packet Format](https://img-blog.csdnimg.cn/8e7e63e5cff840b9b09c7c33e27b77da.png)

Byte IndexC versionContentValueExplanation
0uint8_t magicPacket start marker0xFEProtocol-specific start-of-text (STX) marker used to indicate the beginning of a new packet. Any system that does not understand protocol version will skip the packet.
1uint8_t lenPayload length0 - 255Indicates length of the following payload section (fixed for a particular message).
2uint8_t seqPacket sequence number0 - 255Used to detect packet loss. Components increment value for each message sent.
3uint8_t sysidSystem ID1 - 255ID of system (vehicle) sending the message. Used to differentiate systems on network. Note that the broadcast address 0 may not be used in this field as it is an invalid source address.
4uint8_t compidComponent ID1 - 255ID of component sending the message. Used to differentiate components in a system (e.g. autopilot and a camera). Use appropriate values in MAV_COMPONENT. Note that the broadcast address MAV_COMP_ID_ALL may not be used in this field as it is an invalid source address.
5uint8_t msgidMessage ID0 - 255ID of message type in payload. Used to decode data back into message object.
5+nuint8_t payload[max 255]Payload dataMessage data. Content depends on message type (i.e. Message ID).
(6+n) to (7+n)uint16_t checksumChecksum (low byte, high byte)CRC-16/MCRF4XX for message (excluding magic byte). Includes CRC_EXTRA byte.
  • 最小包8字节(acknowledgment packets without payload)
  • 最长包263字节

4.2 MAVLink v2.0 帧格式

MAVLink 2 Packet Format

Byte IndexC versionContentValueExplanation
0uint8_t magicPacket start marker0xFDProtocol-specific start-of-text (STX) marker used to indicate the beginning of a new packet. Any system that does not understand protocol version will skip the packet.
1uint8_t lenPayload length0 - 255Indicates length of the following payload section. This may be affected by payload truncation.
2uint8_t incompat_flagsIncompatibility FlagsFlags that must be understood for MAVLink compatibility (implementation discards packet if it does not understand flag).
3uint8_t compat_flagsCompatibility FlagsFlags that can be ignored if not understood (implementation can still handle packet even if it does not understand flag).
4uint8_t seqPacket sequence number0 - 255Used to detect packet loss. Components increment value for each message sent.
5uint8_t sysidSystem ID (sender)1 - 255ID of system (vehicle) sending the message. Used to differentiate systems on network. Note that the broadcast address 0 may not be used in this field as it is an invalid source address.
6uint8_t compidComponent ID (sender)1 - 255ID of component sending the message. Used to differentiate components in a system (e.g. autopilot and a camera). Use appropriate values in MAV_COMPONENT. Note that the broadcast address MAV_COMP_ID_ALL may not be used in this field as it is an invalid source address.
7 to 9uint32_t msgid:24Message ID (low, middle, high bytes)0 - 16777215ID of message type in payload. Used to decode data back into message object.
9+nuint8_t payload[max 255]PayloadMessage data. Depends on message type (i.e. Message ID) and contents.
(10+n) to (11+n)uint16_t checksumChecksum (low byte, high byte)CRC-16/MCRF4XX for message (excluding magic byte). Includes CRC_EXTRA byte.
(n+12) to (n+25)uint8_t signature[13]Signature(Optional) Signature to ensure the link is tamper-proof.
  • 最小包12字节(acknowledgment packets without payload)
  • 最长包280字节(a signed message that uses the whole payload)

5. MAVLink 签名报文

MAVLink 2.0 packet signing proposal
国内下载链接

5.1 签名报文帧格式

带签名的包incompatibility flag field的第一位0x01置位,最后的13 字节签名追加到报文最后面。
signed Message Frame Format

DataDescription
linkID (8 bits)ID of link on which packet is sent. Normally this is the same as the channel.
timestamp (48 bits)Timestamp in 10 microsecond units since 1st January 2015 GMT time. This must monotonically increase for every message on a particular link. Note that means the timestamp may get ahead of the actual time if the packet rate averages more than 100,000 packets per second.
signature (48 bits)A 48 bit signature for the packet, based on the complete packet, timestamp, and secret key.

注:(SystemID,ComponentID,LinkID)组成一个stream流。

5.1.1 Link IDs (链路ID)

8位链路ID主要用于确保签名通信系统内多个链路之间的交叉干扰和冲突。

5.1.2 Timestamp (时间戳)

48位时间戳的单位是10us,计算时间从2015年1月1日(GMT)开始。每个stream流,后到报文必须比前面的报文时间晚, 以确保系统报文的前后顺序。

5.1.3 Signature (签名)

48位签名采用SHA-256 hash,计算方法如下:

signature = sha256_48(secret_key + header + payload + CRC + link-ID + timestamp)

注:32字节的秘钥保存在MAVLink链路的两端设备,用于验证信息的正确性。

5.2 签名报文有效性判断

报文有效除以下条件外:

  • 同一链路内报文时间戳晚于之前报文。
  • 同一链路内报文时间前后相差1分钟 (6,000,000us) 。
  • 48位签名计算值与报文签名不符。

5.3 非签名报文处理建议

非签名报文接收建议(理论上来说只要报文完整,都可以被接收):

  • 通过安全通道的非签名报文可以都接收(比如:有线连接USB,Ethernet )。
  • 根据系统具体参数接收所有非签名报文。
  • RADIO_STATUS报文始终接收。
  • 在非签名报文模式,接收所有非签名报文(也许报文是硬件触发消息,比如:boot按钮)。
  • 无条件接收所有非签名报文直到收到签名报文后,进入严格的签名报文有效性验证。

5.4 错误签名报文处理建议

可以选择性提供错误签名报文的处理,比如:丢失飞机的GPS坐标信息。

5.5 秘钥管理

密钥是32字节的二进制数据,用于创建可由密钥持有人验证的消息签名。密钥应该在网络中的一个系统(通常是地面站系统)上创建,并通过安全通道共享给其他受信任的设备。系统必须具有共享密钥才能进行通信。

密钥应存储在永久存储器中,不得通过任何可公开访问的通信协议公开。特别是,密钥不得暴露在MAVLink参数、MAVLink日志文件或可用于公共日志分析的dataflash日志文件中。

使用SETUP签名消息将密钥共享给其他设备。消息只能通过安全链路(如USB或有线以太网)作为直接消息发送到每个连接的system_id/component_id。必须设置接收系统来处理消息,并将接收到的密钥存储到适当的永久存储器中。

6. 参考资料

【1】MAVLink Messaging
【2】MAVLink官网介绍
【3】MAVLink Git代码

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

PX4模块设计之四:MAVLink简介 的相关文章

  • 【2020-8-9】APM,PX4,GAZEBO,MAVLINK,MAVROS,ROS之间的关系以及科研设备选型

    0 概述 无人机自主飞行平台可以分为四个部分 xff1a 动力平台 xff0c 飞行控制器 xff0c 机载电脑和模拟平台 动力平台 xff1a 负责执行飞行任务 xff0c 包括螺旋桨 电机 机架等 xff0c 用于科研的一般都是F380
  • Ubuntu18.04安装PX4踩坑、报错及解决方案整理

    笔者最近需要跑无人机巡检大坝的仿真 xff0c 于是在自己的Ubuntu2018 04中开始安装PX4 xff0c 问过不少之前已经装过PX4的师兄和同学 xff0c 都曾在PX4安装过程中踩过许多坑 xff0c 耗费了不少时间 xff0c
  • px4 avoidance笔记

    最近在用px4官方的avoidance代码跑硬件避障 xff0c 官方介绍了只要生成符合sensor msgs PointCloud2点云信息就能使用 xff0c 因此为了应用长基线双目 xff0c 没有使用realsense的相机 xff
  • 从Simulink到PX4——Simulink-PX4插件安装与环境搭建

    从Simulink到PX4 Simulink PX4插件安装与环境搭建 前言0 准备工作1 安装WSL2 Setting up the PX4 Toolchain on Windows3 Setting up the PX4 Tool Ch
  • 无人机仿真—PX4编译,gazebo仿真及简单off board控制模式下无人机起飞

    无人机仿真 PX4编译 xff0c gazebo仿真及简单off board控制模式下无人机起飞 前言 在上篇记录中 xff0c 已经对整体的PX4仿真环境有了一定的了解 xff0c 现如今就要开始对无人机进行起飞等仿真环境工作 xff0c
  • PX4模块设计之十六:Hardfault模块

    PX4模块设计之十六 xff1a Hardfault模块 1 Hardfault模块初始化2 Hardfault模块主程序3 Hardfault命令3 1 hardfault check status3 2 hardfault rearm3
  • PX4模块设计之三十:Hysteresis类

    PX4模块设计之三十 xff1a Hysteresis类 1 Hysteresis类简介2 Hysteresis类成员变量介绍3 Hysteresis类迟滞逻辑4 Hysteresis类重要方法4 1 Hysteresis bool ini
  • PX4模块设计之三十三:Sensors模块

    PX4模块设计之三十三 xff1a Sensors模块 1 Sensors模块简介2 模块入口函数2 1 主入口sensors main2 2 自定义子命令custom command2 3 模块状态print status 重载 3 Se
  • PX4模块设计之三十四:ControlAllocator模块

    PX4模块设计之三十四 xff1a ControlAllocator模块 1 ControlAllocator模块简介2 模块入口函数2 1 主入口control allocator main2 2 自定义子命令custom command
  • PX4模块设计之三十六:MulticopterPositionControl模块

    PX4模块设计之三十六 xff1a MulticopterPositionControl模块 1 MulticopterPositionControl模块简介2 模块入口函数2 1 主入口mc pos control main2 2 自定义
  • px4_simple_example和uorb机制

    px4 simple app PX4 Autopilot src exampes px4 simple app xff0c 这个程序是用c语言调用orb API和poll机制订阅和发布通讯数据 xff0c 但是这个例子并不是既有接收又有发送
  • PX4-4-任务调度

    PX4所有的功能都封装在独立的模块中 xff0c uORB是任务间数据交互和同步的工具 xff0c 而管理和调度每个任务 xff0c PX4也提供了一套很好的机制 xff0c 这一篇我们分享PX4的任务调度机制 我们以PX4 1 11 3版
  • 【px4】运行mavsdk中的offboard example

    运行MAVSDK中的offboard例子时无人机不执行 想控制无人机前后左右移动 xff0c 在按照官方教程实现offboard 插件的时候 发现用action插件能正常起飞和降落 但是一旦执行到offboard的插件代码的时候就会自动降落
  • Px4源码框架结构图

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • PX4软件在环仿真注意点

    注 xff1a 最新内容参考PX4 user guide 点击此处 PX4下载指定版本代码和刷固件的三种方式 点击此处 PX4sitl固件编译方法 点击此处 PX4开发指南 点击此处 PX4无人机仿真 Gazebo 点击此处 px4仿真 知
  • MISSION_MAVLINK

    上传航点的mavlink包 MISSION ITEM 39 Message encoding a mission item This message is emitted to announce the presence of a miss
  • PX4飞控的PPM接收机

    xff08 一 xff09 原理图 xff1a PX4飞控的PPM输入捕获由协处理器完成 xff0c 接在A8引脚 xff0c 对应Timer1的通道1 xff08 二 xff09 PPM协议 xff1a PPM的每一帧数据间隔为20ms
  • PX4之常用函数解读

    PX4Firmware 经常有人将Pixhawk PX4 APM还有ArduPilot弄混 这里首先还是简要说明一下 xff1a Pixhawk是飞控硬件平台 xff0c PX4和ArduPilot都是开源的可以烧写到Pixhawk飞控中的
  • mavlink模块中接收offboard模式下的mavlink消息流

  • 四、无人机知识笔记(初级:基本运动原理)

    笔记来源于 沈阳无距科技 工业级无人机的中国名片 编程外星人 目录 一 多旋翼直升机 二 基本飞行姿态 三 多旋翼飞行原理 四 反扭力与偏航运动 五 螺旋桨 六 有刷电机和无刷电机 七 电调与PWM信号 八 动力电池 九 遥控器 十 机架设

随机推荐

  • ESP32+UART+TCP_Client+OTA

    在上一篇博客的基础上添加了OTA空中升级功能 实现的功能是一个WiFi DTU模块 xff0c ESP32板子通过串口与下位机连接 xff0c 我目前使用的下位机为51 xff0c ESP32第一次启动时 xff0c 通过微信小程序连接wi
  • ubuntu 网络编程

    ubuntu的网络编程 网络编程 一般有两种 TCP 和 UDP TCP 是面向连接层的传输协议 是无误的 数据没有丢失的失序 和 数据不会重复到达的 UDP是用户数据协议 是不可靠的无连接的协议 xff0c 但是可以进行高效率的传输 说起
  • 头文件intrins.h的用法

    KEIL 中 头文件 INTRINS H的作用 在 C51 单片机编程中 xff0c 头文件 INTRINS H 的函数使用起来 xff0c 就会让你像在用汇编时一样简便 内部函数 描述 crol 字符循环左移 cror 字符循环右移 ir
  • 4G DTU 透传模块简单使用方法

    不是打广告 xff0c 纯记录用途 最近由于项目需要 xff0c 买了一批4g 透传模块 众所周知 xff0c 两个4g模块一般不能直连 xff0c 需要中间通过搭建服务器来搭桥 卖家把桥搭好了 xff0c 自己简单配置下 xff0c 就可
  • ucos多任务与linux进程、多线程的比较分析

    从最初使用51片机 xff0c 再到avr msp430 xff0c arm7 arm9裸机 xff0c 单片机的处理速度越来越快 xff0c 而产品需求的日新月异 xff0c 在硬件成本 功耗 体积以及开发周期等的限制下 xff0c 开发
  • 【记录】Ubuntu下简单的软件安装-aptitude安装,samba安装,terminator软件

    Ubuntu下安装简单的软件 一 安装aptitude管理软件 sudo apt get install aptitude 这样可以使用aptitude来管理软件 如下命令 xff1a sudo aptitude update 更新软件源
  • freeRTOS开源项目crazyflie

    不小心接触到了开源飞控 xff0c 有一个小四轴的项目 xff1a crazyflie xff0c 有兴趣百度搜 使用的就是freeRTOS内核 xff0c 可以作为学习freeRTOS应用的一个参考 另外freeRTOS官方源码包里面就有
  • ROS serial串口通讯

    目录 ROS serial 串口通讯安装基本使用代码示例 Reference ROS serial 串口通讯 安装 sudo apt get install ros kinetic serial 基本使用 代码示例 include lt r
  • 四轴飞控DIY简明步骤介绍

    新手四轴飞控DIY组装简明步骤介绍 1 什么叫做新手 xff1f 2 新手如何思考 xff1f 3 上手步骤Step1 xff1a 四轴飞控介绍定义运动原理组成 Step2 xff1a 四轴飞控组装视频Step3 xff1a 四轴飞控新手规
  • BetaFlight开源工程结构简明介绍

    BetaFlight开源工程结构简明介绍 Step1 获取开源代码开源代码版本克隆开源代码 Step2 了解工程情况支持模型类型 xff1a 多旋翼 amp 固定翼支持特性 amp 功能安装 amp 文档链接配置工具下载其他介绍 xff08
  • 四轴FPV无人机手动操作简明介绍

    四轴FPV无人机手动操作简明介绍 通常航拍机都是有自稳算法 43 GPS导航 43 辅助功能 避障 的支持 xff0c 从而保证飞手能够相对容易且稳定的操作模型飞机 xff0c 通常通过阅读说明书都能很快上手 xff0c 这里就不在赘述 本
  • BetaFlight模块设计之三十:Cli模块分析

    BetaFlight模块设计之三十 xff1a Cli模块分析 Cli模块Cli接口Cli框架Cli命令结构主要函数分析cliProcess函数processCharacterInteractive函数processCharacter函数
  • PX4开发环境搭建--模拟器编译及QGroundControl & RC遥控模拟配置

    PX4开发环境搭建 模拟器编译 1 PX4开发环境介绍2 PX4开发环境搭建2 1代码下载2 2 国内环境调整2 3 建立ubuntu开发环境2 4 构建jMAVSim仿真2 5 补充版本信息 3 jmavsim仿真环境3 1 仿真命令集3
  • Android中的枚举

    在ARouter源码中发现使用到了枚举 xff0c 说明枚举并不是不常见的 xff0c 刚好枚举在我的视野中处于盲区 xff0c 于是打算周末加班给拿下 xff0c 扩展视野 了解枚举之前首先说一下什么是常量和变量 常量 声明后无法改变的量
  • PX4开源工程结构简明介绍

    PX4开源工程结构简明介绍 Step1 获取开源代码1 1 开源代码版本1 2 克隆开源代码 Step2 了解工程情况2 1 支持模型类型2 2 支持特性 amp 功能2 3 安装 amp 文档链接2 4 配置工具下载2 5 其他介绍 xf
  • PX4开源软件框架简明简介

    PX4开源软件框架简明简介 1 PX4系统构架1 1 飞控 43 地面站 RC控制1 2 飞控 43 伴飞电脑 43 地面站 集成RC控制 2 PX4软件构架2 1 设计概念2 2 软件构架2 1 中间件2 2 飞控代码 3 PX4运行环境
  • PX4模块设计之一:SITL & HITL模拟框架

    PX4模块设计之一 xff1a SITL amp HITL模拟框架 1 模拟框架1 1 SITL模拟框架1 2 HITL模拟框架 2 模拟器类型3 MAVLink API4 总结 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分
  • PX4模块设计之二:uORB消息代理

    PX4模块设计之二 xff1a uORB消息代理 1 uORB模块接口1 1 uORB服务接口1 2 uORB消息注册 去注册接口1 3 uORB消息发布接口1 4 uORB消息订阅 去订阅接口1 5 uORB辅助功能接口2 Hello W
  • PX4模块设计之三:自定义uORB消息

    PX4模块设计之三 xff1a 自定义uORB消息 1 新增自定义uORB消息步骤2 应用ext hello world消息示例3 编译执行结果4 参考资料 基于PX4开源软件框架简明简介和PX4模块设计之二 xff1a uORB消息代理
  • PX4模块设计之四:MAVLink简介

    PX4模块设计之四 xff1a MAVLink简介 1 MAVLink PX4 应用简介2 MAVLink v2 0新特性3 MAVLink协议版本4 MAVLink通信协议帧4 1 MAVLink v1 0 帧格式4 2 MAVLink