MAVLink协议通信分析——(二)消息结构


消息结构

(一)  消息包结构

消息包结构定义了消息包在发送、接收、初次解析中所需信息的存储规则。


在MavLink 1.0版本中,消息包结构如下图表所示。首部由STX段引导,具体含义可在表中查询,其中校验位标记为自动,表示应由软件根据包数据自动计算生成。


(长度单位为byte)

区域

名称

索引

长度

含义

取值

STX

起始标识

0

1

标识新消息的开始,用于消息识别、解析

254

LEN

负载长度

1

1

记录负载信息的长度

N

SEQ

序列码

2

1

消息发送序列码,用于通信可靠性检验

0-255

SYS

系统ID

3

1

发送该消息系统的系统ID

0-255

COMP

组件ID

4

1

发送该消息系统组件的组件ID

0-255

MSG

消息ID

5

1

标识该消息的种类

0-255

PAYLOAD

负载信息

6

1

消息内部负载信息

 

CKA

校验位A

N+6

N

CRC校验位

自动

CKB

校验位B

N+7

1

CRC校验位

自动

 

(二)  消息包封装过程

以上各区域信息存在关联,当使用MavLink协议提供的方法封装消息包时,会根据所使用的MSG获取到该类别MSG消息的LEN信息,同时软件(地面站或飞行控制软件)会根据自身状态信息填写SYS、COMP。信息填写完毕生成数据包时,封装方法会自动添加STX,并在上一次发送消息包所使用的SEQ上加1作为本次发送的SEQ写入,当SEQ超过255时,会回到0并重新开始计数。CKA、CKB会在PAYLOAD信息写入后、封装完成之前,根据CRC[Fe1] (CyclicRedundancy Check)循环冗余校验码算法计算得出并自动写入包内。

也就是说,设定SYSCOMP并且正确调用MavLink所提供方法后,整个消息包的生成过程中仅有MSGPAYLOAD两项内容需要用户关心,消息包封装过程如活动图所示。



(三)  消息包示例

本文开始提到MavLink使用消息库的形式定义传输规则,用户可以在在源码中查阅消息库的内容,此处使用Java语言下的消息库作为实例,以便更清晰地展示包结构(MavLink源码自带了多语言的生成器,可从源码中的xml文件转换为对应C,C++,Java等语言的MavLink协议包)。以下表格中,SEQ为计算得出,数值不固定,故用X代替,SYS,COMP两项为笔者使用的Mission Planner地面站设定的系统ID和组件ID,MSG项0代表HEARTBEAT消息的ID,PAYLOAD内存储详细信息,下一章节再介绍,最后的CKA CKB为封包后计算得出,以Y代替。

 

msg_heartbeat:最基本的心跳信号包,周期性发送,用于确认地面站与无人机之间的连接是否有效。

STX

LEN

SEQ

SYS

COMP

MSG

PAYLOAD

CKA B

254

9

X

255

190

0

……

Y

 

msg_request_data_stream:数据流请求包,地面站使用该消息包向飞行控制软件提交数据流申请,飞行控制软件收到该消息后将按照设定的参数周期性返回消息包。

STX

LEN

SEQ

SYS

COMP

MSG

PAYLOAD

CKA B

254

6

X

255

190

66

……

Y

 


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值