Pixhawk原生固件PX4之MAVLink协议解析

2023-05-16

欢迎交流~ 个人 Gitter 交流平台,点击直达:Gitter


1

3

4

5

PX4 对Mavlink 协议提供了良好的原生支持。该协议既可以用于地面站(Ground ControlStation, GCS) 对无人机(UAV) 的控制,也可用于对地面站的信息反馈。其飞控场景一般是这样的:

也就是说,如果你想要实现地面站控制飞行,那么由你的地面站使用Mavlink 协议,通过射频信道(或wifi 等)给无人机发送控制指令就可以了。如果你想实现无人机自主飞行,那么就由你自己写的应用(运行在无人机系统上)使用Mavlink 协议给无人机发送本地的控制指令就可以了。

在PX4 中,并不鼓励开发者在自定义飞控程序中直接使用Mavlink ,而是鼓励开发者使用uORB微对象请求代理器消息机制。

在uORB 机制中,交换的消息被称之为主题(topic) ,一个主题仅包含一种消息类型(即数据结构)。每个进程(或驱动模块)均可“订阅”或“发布”多个主题,一个主题可以存在多个发布者,而且一个订阅者可也订阅多个主题。

6

7

Mavlink传输时的基本单位是消息帧。

协议设计的目标是传输速度和安全性。它允许消息内容检查、消息丢失检测,每个数据包需要6 字节报头。

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

COMP是例如相机、舵机0-13,IMU123之类的

8

9

10

11

在mavlink消息帧里最重要的两个东西,一个是msgid;一个是payload,前者是payload中内容的编号,后者则存放了消息。

消息有许多种类型,在官网的网页中中以蓝色的“#”加数字的方式来表示消息的编号如 “#0”(这样的表示方法应该是为了方便在网页中查找相应编号消息的定义)。

在官网介绍网页里往下拉,大概拉到二分之一的位置处,开始出现“MAVLink Messages”的介绍,往下看是各种消息的数据组成说明。

先以 #0 消息为例,这个消息叫心跳包(heartbeat)。
它一般用来表明发出该消息的设备是活跃的,飞行器和地面站都会发出这个信号(一般以1Hz发送),地面站和飞行器会根据是否及时收到了心跳包来判断是否和飞行器或地面站失去了联系。

12

MAVLINK的一包数据由FE开头的,一包数据由FE开头到下一个FE出现为截止。

FE为包开头 09为数据包长度(LEN) MavLink的长度是固定的

94消息序号 01硬件系统序号 01设备号(Pixhawk刷PX4固件默认都是01)

第五位是消息类型序号 括号里面是有效数据载荷(长度为9)

最后两位是数据校验位。

我们通过消息类型序号可以看到这是0号消息,0号消息是心跳包消息。

并不是所有的MAVLink消息都是在向外发送消息的,左边是直接从QGC地面站观察得到的当前活动的MAVLink消息

右边是使用串口调试助手记录的mavlink数据

Firmware1.5之前的版本,都是采用拔掉SD卡进NSH的方式进行调试

新版固件无论是否存在SD卡,MAVLink都在不停的往外吐数,十分影响调试

可以通过修改rcS启动脚本解决问题。

13

14

15

16

模式是8 个状态开关的各种组合方式。各个标识之间,可以使用“或逻辑”组合起来,共同表示飞控/飞行器的当前状态。

以多轴为例。它分为主模式(main mode)和子模式(sub mode),两种模式组合在一起成为最终的模式,主模式分为3种,手动(manual),辅助assist),自动(auto)。在辅助模式中,又分为高度控制模式(altctl)和位置控制模式(posctl)两个子模式。。自动模式里又分为3个子模式,任务模式(mission),留待模式(loiter),返航模式(return),任务模式就是执行设定好的航点任务,留待模式就是gps悬停模式,返航模式就是直线返回home点并自动降落。

以上是心跳包的分析,还有很多其他的数据包的分析类似,请自行翻阅官方指导文件。

17

18

19

20

21

因为我们在使用基于这套飞控开发的过程中,会有很多自定义的数据要求,比如我们添加一个新的传感器(在飞控中添加一个自定义传感器),我们会把新的传感器数据发送回来和地面站交互,这时候就会涉及到自定义一个MAVLINK的消息包,自定义消息包的数据,发送给地面站来解析显示。

对于MAVLINK这套系统,有对应的工具,来自动生成MAVLINK的库函数,只要约定好消息包的结构体,我们就可以用相应的MAVLINK工具,来生成MAVLINK库的头文件和功能接口函数。

22

23

APM,amtrixpilot这类文件夹里是各个飞控自己定义的mavlink消息类型,
原始的mavlink消息放在common文件夹里(大部分消息都在common文件夹中)。

Checksum.h中存放的是计算校验码的代码。

Mavlink_helper.h里面是将各个消息包补充完整(调用checksum.h中的函数计算检验码并补上消息帧的头,比如sysid和compid等)成为mavlink消息帧再发送。以及逐字解包函数。最主要的功能集中在这两个文件中。

Mavlink_conversions.h里面是dcm,欧拉角,四元数三种姿态表示方法之间的转换代码

24

25

MAVLink消息以XML格式定义,然后转换为C / C ++,C#或Python代码(存在多个生成器)。

生成自定义的消息包

26

重要的就是两个消息发送和消息编码函数,在具体的调用函数里面就是调用这个消息发送函数把mavlink的消息发送出去,这些都是,mavlink函数自动生成的函数,我们在用的时候调用即可。

Send函数的功能是将传入的各个参数按照对应的格式放到xxx对应的消息包中(即打包),此时还未形成mavlink包。

还需要_mav_finalize_message_chan_send用于更新消息帧的编号(seq每发送一帧加1),并将消息帧的头和计算校验码,使得成为一个完整的mavlink消息帧。

最后调用串口发送函数进行消息帧的发送

27

mavlink_main.cpp是mavlink的主函数

mavlink_messages.cpp是所有的mavlink消息的消息类,比如心跳包消息类,系统数据消息类,姿态数据消息类等等,如果我们要自定义自己的消息并且通过mavlink协议发送出去,我们就要添加自己自定义的消息类,然后把这个消息类实例化,就可以使用了。

mavlink_receiver.cpp这个是飞控接收,地面站发来的消息指令用的。分析这个函数,就可以实现通过地面站来控制飞控。

28

最终我们要追加一个我们自定义的mavlink 数据流类到StreamListItem 数据流链表里面,这个数据流链表在MAVLINK_messages.cpp 里面,在MAVLINK 模块的主函数中会不断轮询这个StreamListItem 数据流链表,并且执行链表里面的数据发送函数来实现MAVLINK 消息的不断发送,我们添加了自己定义的函数,那么我们就要把我们自己定义的类也添加到这个链表里面。

29

30

按道理我们自定义好的MAVLINK 消息,就可以在地面站里面显示了,前提是地面站的mavlink包能够解析这个你自定义的数据,一般来讲通过MAVLINK generator 生成器生成的mavlink 库,和地面站的mavlink 库是同一套库,就没问题可以保证解析到。

比较偷懒的做法是把自己要发生的消息,通过mavlink 原有的包发送出去,地面站解析这个原有的包即可。比如用debug MAVLINk 消息包。


                                          By Fantasy

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

Pixhawk原生固件PX4之MAVLink协议解析 的相关文章

随机推荐

  • HttpClient学习研究---第四章:HTTP authenticationHTTP身份验证

    第四章 HTTP authentication HTTP身份验证 HttpClient provides full support for authentication schemes defined by the HTTP standar
  • Linux系统下常用的3个网络测试工具!

    在Linux系统中 xff0c 有很多用于管理和监测网络连接的命令 xff0c 其中ping traceroute和nslookup是比较常用的网络命令 xff0c 可以用来测试网络 诊断网络故障等等 xff0c 以下是详细的内容 xff1
  • TCP.02.SELECT模型

    文章目录 SELECT模型简介SELECT模型流程SELECT原理SELECT代码实现fd set 数组及基本操作SELECT函数参数2 xff08 重点 xff09 参数3参数4 关闭所有SOCKET句柄处理控制台窗口关闭事件整体代码思考
  • Node.js http 模块详解:request 对象

    前言 前文介绍了 http 模块的基本用法 xff0c 主要就是调用 createServer 和 listen 方法来创建和启动服务 要处理具体的 HTTP 请求 xff0c 就要在 createServer 方法中写点什么 本文来介绍处
  • 如何确认串口波特率

    文章目录 1 盲扫一遍2 示波器测量1bit时间3 逻辑分析仪确认 背景 xff1a 手上有一个模块使用串口通信但是不知道其波特率 xff0c 如何确认它的波特率呢 xff1f 1 盲扫一遍 波特率有常用的配置9600 115200 230
  • curl命令常用参数

    curl命令常用参数 curl简介常用方法将远程文件下载到本地 o并指定名称指定请求方式 X显示响应结果 v携带用户名 密码 u携带请求头 H查看服务端响应头 i只显示http response的头信息 I自动跳转 L模拟dns解析 res
  • 学习ZLmediaKit流媒体服务器时候遇到的问题

    照zlmediakit的源码 自己复制了一份 然后有的地方编译不过修改了部分 测试的时候发现有两个问题 第一是 ffmpeg的ffplay 能播放 vlc不能播放 第二个问题是directProxy设置为0的时候 推流的时候 然后用ffpl
  • 如何在C/C++中使用pi (π) 值

    在math h有一个宏定义M PI if defined USE MATH DEFINES amp amp defined MATH DEFINES DEFINED define MATH DEFINES DEFINED Definitio
  • 关于#include<bits/stdc++.h>

    偶然发现 span class hljs preprocessor include lt bits stdc 43 43 h gt span 包括了C 43 43 几乎所有的头文件 xff0c 感觉以后可以返璞归真了 回顾自己不长的竞赛历程
  • 单片机STM32直连电调控制航模涵道电机的方法总结

    单片机STM32直连电调控制航模涵道电机的方法总结 文章目录 单片机STM32直连电调控制航模涵道电机的方法总结前言一 硬件情况二 涵道电机两种常见的驱动方式1 有线控制方式2 无线控制方案 解决方案 前言 由于项目需要 xff0c 我需要
  • PX4之常用函数解读

    PX4Firmware 经常有人将Pixhawk PX4 APM还有ArduPilot弄混 这里首先还是简要说明一下 xff1a Pixhawk是飞控硬件平台 xff0c PX4和ArduPilot都是开源的可以烧写到Pixhawk飞控中的
  • PX4项目学习::(七)飞控栈:commander

    PX4的飞行控制程序通过模块来实现 xff0c 与飞控相关的模块主要有commander xff0c navigator xff0c pos control xff0c att control这几个 xff0c 分别可以在src modul
  • PX4项目学习::(五)模块代码启动流程

    54条消息 PX4 模块代码启动流程 zhao23333的博客 CSDN博客
  • TX2指南(一)TX2接显示器的问题

    TX2开发板一定要适配HDMI显示器 xff0c 使用转接头在VGA显示器会显示 input signal out of range xff01 所以目前来看手上的这套TX2只能适配HDMI显示器 xff0c 目前还不清楚是不是所有的TX2
  • 推荐定位信息(GPRMC)

    推荐定位信息 GPRMC GPRMC lt 1 gt lt 2 gt lt 3 gt lt 4 gt lt 5 gt lt 6 gt lt 7 gt lt 8 gt lt 9 gt lt 10 gt lt 11 gt lt 12 gt hh
  • linux中使用shell命令打开指定文件夹(Nautilus@GNOME)

    在GNOME中是Nautilus 鹦鹉螺 xff0c 而KDE中是Konqueror nautilus 图形化桌面包括了一个叫做 Nautilus 的文件管理器 它给你提供了系统和个人文件的图形化显示 然而 xff0c Nautilus 不
  • 在ubuntu20.4下安装ardupilot 4.3.6

    这次重新安装真的是遇到了好多坑啊 xff01 从github上靠过来按照之前的那篇文章流程做完之后 xff0c 还会有一些别的问题 首先是module里面的包都没有拷过来 xff0c 所以需要用git add将文件都添加过来 之后进行编译时
  • Visual Studio 2022 搭建GLFW OpenGL开发环境

    最近工作需要 需要写一个全景的视频播放器 网上搜了下大概解决方案是 ffmpeg 43 opengl b站有很多视频 按照视频 搭建了OpenGL的开发环境 先去GLFW的网站下载 windows平台的库文件 为什么使用GLFW 因为GLF
  • Pixhawk原生固件PX4之自定义MAVLink消息

    欢迎交流 个人 Gitter 交流平台 xff0c 点击直达 xff1a 本着想在PX4基础上加点什么东西的我又开始折腾了 xff0c 先尝试用串口加传感器通过QGC查看 xff0c 要是能在原固件上加点内容就棒哉了 先立Flag 自定义u
  • Pixhawk原生固件PX4之MAVLink协议解析

    欢迎交流 个人 Gitter 交流平台 xff0c 点击直达 xff1a PX4 对Mavlink 协议提供了良好的原生支持 该协议既可以用于地面站 Ground ControlStation GCS 对无人机 UAV 的控制 xff0c