mavlink协议详解_MAVLink通讯协议在STM32上移植,并自定义协议

mavlink全称是(Micro Air Vehicle Message Marshalling Library),从名字可以看出,mavlink是主要面向飞控的一种开源通信协议。因此它默认定义了很多适用于飞控的信息格式,比如heartbeat(心跳信号,每隔一两秒主从通信一次,以验证通信是否正常)。

首先要说明的是,mavlink作为一个非常可靠(至少两字节校验)、支持类型丰富(message ID、component ID等)的通信协议,每次通信时,除了payload以外,还要占用至少8个字节的冗余信息,具体的这八个字节都是什么,可以参考别人的详细介绍。因此在使用mavlink之前需要考虑,在硬件资源非常有限的情况下,是否有必要牺牲效率来换取可靠性。

先放一些参考文章

MAVLink除了能够支持ardupilot等无人机通信协议外,最大的特点是可以定制通信协议。前面两篇文章主要在讲MAVLink的主要结构,后面三篇出自同一个人,完整再现了一个如何从自动生成代码并移植到STM32上的过程,本文参考其甚多,但是正如前面所言,这里面没有对如何定制通信协议进行讨论,并且也没有对整个MAVLink的结构有介绍,在移植的过程中总是报错。

定制通信协议

MAVLink的通信协议是根据xml文件自动生成的。

image.png

从官网下载MAVLink的源码后,可以得知定义通信协议的xml文件位于message_definitions/v1.0/下面,其中参考文章3、4和5就利用的common.xml进行自动生成的。

image.png

test.xml是其中最简单的一种协议,test.xml的代码如下所示:

3

Test all field types

char

string

uint8_t

uint16_t

uint32_t

uint64_t

int8_t

int16_t

int32_t

int64_t

float

double

uint8_t_array

uint16_t_array

uint32_t_array

uint64_t_array

int8_t_array

int16_t_array

int32_t_array

int64_t_array

float_array

double_array

里面的定义比较清晰,参考前面1、2文章,相信大多数人是很容易看懂是什么意思的,此处不再赘述。

我们定义我们发送的数据叫pressure,里面只包含一个double型的变量,名叫PP(此处也可以定义更多变量),其定义xml如下:

3

Test all field types

double

message id为0的情况在无人机通信协议中一般代指heartbeat,这里我们直接忽略,就命其为pressure。可以理解为pressure就类似结构体的名字,PP就是里面的成员变量的名字,类型是double。

生成mavlink通信协议的文件

参考文章3,可以用Python根据xml文件自动生成mavlink通信所需的文件。

在mavlink文件夹内执行

python -m mavgenerate

弹出下图所示 MAVink Generator

image.png

XML选择message_definitions/v1.0/下已经定义好的文件Out随便选择一个空文件夹

点击Generate即可在out文件夹内生成所需要的通讯文件,全部都是.h文件,其中带有一个pressure文件夹,这个文件夹的名字和你XML的名字是一样的

image.png

image.png

p

你可能感兴趣的:(mavlink协议详解)