基于MSP的无人机通信协议开发设计

2018-01-03 07:05赵旭彭克勤北京信息科技大学计算机学院
数码世界 2017年12期
关键词:数据类型飞控通信协议

赵旭 彭克勤 北京信息科技大学计算机学院

基于MSP的无人机通信协议开发设计

赵旭 彭克勤 北京信息科技大学计算机学院

在无人机应用趋向广泛的今天,无人机发展已成为一股潮流,随之而来的是大量爱好者的涌入,以及开源飞控的热门。本文从基于Multiwii飞控的通信协议的讲解,说明MSP(Multiwii Serial Protocol)的开发设计模式。

无人机 开源飞控 Multiwii 通信协议

1 MSP的简介

MSP(Multiwii Serial Protocol)是用于上位机与基于Multiwii飞控通讯的协议。使用MSP可使操作端更轻便,更具有通用性(例如使用GUI,OSD,遥控或是自制遥控装置控制无人机或从无人机中获取信息);MSP具有以下特征:

(1).效率更高:传输数据为2进制代码

(2).更安全:数据传输伴随校验和,避免无人机被劫持

(3).对代码升级依赖更少:代码升级对GUI等控制端影响更小

使用MSP将大大拓展与无人机的通讯方式,而不仅仅局限于2.4G信号(大多数移动设备,或是PC都没有配备2.4G模块),也就大大拓宽了无人机上位机开发的方向。

注:1.无人机专指基于Multiwii飞控的无人机。

2.Multiwii版本在 2.3 之后(包含 2.3)无需在 config.h中选择RCSERIAL(RC Serial)预编译选项。

2 MSP的工作流程

串口通讯均有TX,RX两端口,其中TX用于发送数据,RX用于接收数据。在实际应用时只需把相应传输模块(wifi,蓝牙)TX端与飞控板的RX连接,RX端与飞控板的TX连接,若是蓝牙模块,需设置传输波特率为115200。上位机连接上传输模块后,编写符合传输格式的指令计算指令,即可接收或是发送数据。

3 MSP的传输格式及数据类型

MSP的数据传输格式包含:数据头(header),方向(direction)大小(size),类型(type),数据包(data),校验和(checksum)。一条MSP消息中,每一个元素都是使用byte类型来存储数据。

(1)header:数据头,包含两个byte,$,M,表示这条数据是一条Multiwii传输用数据,所有指令必须包含这一部分。

(2)direction:方向,包含一个byte,<或>。向飞控发送指令时,direction为<;从飞控获取信息时,direction为>。

(3)size:数据大小,包含一个byte,用来描述data的个数,例如,data有4个字符,那size就为0x04,但是注意数据的总长度不能超过64。

type:类型,标明这条指令的目的,填入内容根据MSP官方文档中的message_id来定义

例:如需获取无人机身份信息,message_id查表可知为100,则type为ASCII码为100的byte(或用十六进制表示为0x64(数据类型为byte))。

注:官方文档链接 http://www.multiwii.com/wiki/index.php?title=Multiwii_Serial_Protocol

(4)data:传输数据,包含n个byte类型数据(数量根据MSP文档中不同Command所需要传输的数据个数来定)。当传输是8-bit数据时,可直接将8-bit数据加入数据链中,若传输数据为16-bit或是32-bit数据时,需要将数据拆分为2个8-bit或四个8-bit数据,且低八位在前,高八位在后,例如:

传输的data中的一个int型16-bit数据为1192,十六进制表示为0x4A8,在加入数据链之前需拆分为两个8-bit数据:0x04(高八位),0xA8(低八位),然后加入顺序为0xA8(低八位),0x04(高八位)。

32-bit数据亦然,拆分后,最先加入数据链的是位级最低的八位数据,越后加入,位级越高。

(5)checksum(crc):校验和,包含一个byte数据,用来保证通信中数据的完整性和准确性。算法:初始化一个校验和为零后,依次从数据链中从size开始的每一个元素与0xff作与运算的结果作异或运算,直至data中的最后一个元素,与0xff作或运算保证了每一个元素的二进制数据的一致性。

例如:初始化校验和(checksum)为0x00后,与size(假设为0x04)作与运算表示为

checksum ^= (size&0xff)

若只需从FC获取信息,data即为空,size为0,所以校验和command一致,如下图。

4 具体实现

发送消息:

MSP消息中比较固定的信息可以使用一个类中的静态变量(数据类型为byte)来表示,例如:MSP消息中的header,direction,和type部分。

data部分若添加8-bit数据时,直接向data链中添加byte类型数据即可,若为16-bit需将数据拆分为两个8-byte数据,

具体方法:

拆分目标:int target = 0x4A8,二进制表示:0000 0100,1010 1000

拆分时高八位为byte lower_byte = (byte)(target>>8)

低八位为byte upper_byte = (byte)target

根据Multiwii源码决定,MSP消息中,如遇到需发送16-bit数据时,低八位在前,后八位在后。

拆分原理:java语言中高位数据向低位数类型转换时仅会保留高位数据的低位数,例如16-bit向8-bit数据转换时,16-bit数据保留低八位,赋值给8-bit数据,且最高位保存为符号位。数据右移时,低位数据被高位数据占据,原本高位数据变为0,右移后可将原本在高位的数据移到低位。结合以上两点,使用高位数据向低位数据转换可获得高位数据的低位部分,使用移位后,再配合类型转换即可获取高位数据的高位部分。

校验和(checksum):根据MSP规定的校验和算法,需要初始话一个byte类型,初值为0的数据,先与size,type分别作异或运算,随后再逐一与data里的数据作异或运算(^=)直到data的最后一位(包含最后一位)。

接收到的消息格式如下

验证数据:接收到消息后因为header和direction是固定部分,所以我们开始从size开始分析。在使用这条消息之前,需验证数据是否有丢失情况,具体方法:计算这条消息的校验和,然后再判断是否与消息自带的校验和相等。若相等,说明数据无丢失,可以使用;若不想等则丢弃数据,重新发起请求。

使用数据:可以根据type来确定MSP消息的目的,从而确定MSP的功能,再根据MSP用列表去分析data中的数据。

图中的message_id为MSP消息中的type;direction中FC->说明消息来自飞控。->FC说明消息发往飞控。图中type说明接收到的数据类型。comment为对数据的解释。UINT 8:8-bit int型数据。UINT 16:16-bit int型数据类型。UINT 32:32-bit int型数据类型。

当接收到的data为8-bit(图中的UINT 8)时,每个数据即为接收到的消息的data链中的一个byte,如果为16-bit(32-bit),每个数据就由data数据链中的两个byte(四个byte)组成,与发送时的规则一致,两个(四个)组成元素中,前面的是低数据位,后面的是高数据位,获取到组成元素之后先将高位数据赋值给目标数据,再将目标数据左移,再将低位数据加到目标数据上。

例:发送 0x24 0x4D 0x3C 0x00 0x64 0x64(对应图中MSP_IDENT:获取飞控信息)后

接收到的消息为:0x24 0x4D 0x3E 0x07 0x64 0xE6 0x03 0x00 0x00 0x00 0x00 0x00 0x86

将消息分解后 0x24 0x4D(header)

0x3 E(direction)

0x07 (size)

0x64 (type)

0xE6 0x03 0x00 0x00 0x00 0x00 0x00(data)

0 x86(checksum)

有MSP样例表(上图)可知,data部分包含四个数据:VERSION(UINT 8),MULTITYPE(UINT 8),MSP_VERSION(UINT 8), capability(UINT 32)

根据规则:

VERSION(UINT 8) = 0xE6 = 230(版本为 2.3)

MULTITYPE(UINT 8) = 0x03 = 3(QUAD X)

MSP_VERSION(UINT 8)= 0x00

Capability(UINT 32) 为了区分,四个部分分别改为 :0x01 0x02 0x03 0x04拼装后:0x4321 = 17185

5 结语

完成了对MSP的设计,就可以和Multiwii无人机进行通讯,也就可以对无人机进行开发。使用串口通讯控制无人机除了距离不如2.4Ghz,其他方面都与2.4Ghz无异。而且使用串口通讯之后,就可以使用掌上设备来控制无人机,就可以使无人机的应用大大拓宽。

[1]MWC飞控V2.3串口通信协议——new Multiwii Serial Protocol:http://www.cnblogs.com/2cats/p/3501033.html

[2]Multiwii serial protocol 官方文档http://www.multiwii.com/wiki/index.php?title=Multiwii_Serial_Protocol

[3]与0xff作与运算的目的http://www.cnblogs.com/think-injava/p/5527389.html

[4] MSP - The Multiwii serial protocol http://www.stefanocottafavi.com/msp-the-multiwii-serial-protocol/

[5]Java中byte,int的转换http://freewind886.blog.163.com/blog/static/661924642011810236100/

赵旭,男,本科,北京信息科技大学计算机学院。彭克勤,女,硕士,副教授,北京信息科技大学计算机学院。

猜你喜欢
数据类型飞控通信协议
如何理解数据结构中的抽象数据类型
民用飞机飞控通电自检测安全性研究
车载网络通信协议标准化问题研究
中小型太阳能无人机航电系统设计
基于SeisBase模型的地震勘探成果数据管理系统设计
电动汽车充电接口及通信协议新国标发布
线上众筹产品的特征分析与研究
相似度计算及其在数据挖掘中的应用
基于R8C的汽车OBD通用故障诊断仪设计
SIP协议系统模型的形式化研究