木鸢通讯协议概述 - Ligcox/BTP_DM GitHub Wiki
概述
木鸢Birdiebot使用BTP&DM(Birdiebot Target Preception And Decision Making Framework,Birdiebot目标感知与决策框架)对赛场复杂的环境进行感知与决策。为了适应Robomaster赛场多种数据类型的传输,保证高效的通信效率,所有在BTP&DM数据的通信,均需要遵守BCP(Birdiebot Communication Protocol,木鸢通讯协议)格式。BCP在确保通信高效、源码简单、可移植性高的基础上,实现数据正确性判断,有效避免数据传输过程中出现的错误数据的错误解析。BCP提供对超过9种不同的对象和7种不同类型功能的操作,能够在X86、aarch64架构下稳定运行,实现每秒1000帧的数据传输和解析需求。通过木鸢上位机,也能够快速查看机器人状态和视觉信息,参赛队伍仅需编写相应的下位机程序接收BCP数据,即可实现对不同种类机器人的控制。
目前,BCP封装了对外接口,参赛队伍能够搭配BTP&DM快速进行开发和调试。BCP包含了python实现和C++实现两个版本,目前,C++ BCP及技术文档已全面停止更新和维护(参见性能分析),仅开发文档供各参赛队伍简易使用。因此强烈建议使用python版本BCP,此外还建议您参与到BTP&DM和BCP建设和维护当中。
通讯帧基本格式
帧头 | 目标地址 | 功能码 | 数据长度 | 数据内容 | 和校验 | 附加校验 | |
---|---|---|---|---|---|---|---|
长度 | 1 | 1 | 1 | 1 | N | 1 | 1 |
名称 | HEAD | D_ADDR | ID | LEN | DATA | SC | AC |
说明 | 固定值0XFF | 本帧数据发送的接收机器人,参考硬件地址定义 | 机器人实现的目标位置 | 表示数据内容字段的长 度 | 具体数据内容,N=数据长度 | 和校验 | 附加校验 |
为了提高数据传输的效率,当有浮点数类型数据需要传输时,根据数据类型的特点,适当截取小数点后固定几位,将浮点数转化成整数类型进行传输,可缩短数据长度,并且避免浮点数传输时发生异常,解析成非法浮点数。类似数据会在协议中标注,如 A*100,就代表将数据 A 只保留两位小数,乘以100进行传输,下位机使用时将收到的数据除以100即可。
- 和校验
sumcheck
计算方法:从帧头0xFF字节开始,一直到DATA
区结束,对每一字节进行累加操作,只取低 8 位 - 附加校验
addcheck
计算方法: 计算和校验时,每进行一字节的加法运算,同时进行一次SUM_CHECK
的累加操作,只取低 8 位。 - 校验计算示例: 假设数据帧缓存为
INFO
数组,0xFF存放于数组起始位置,那么INFO["LEN"]
存放的是数据长度,校验程序如下:
def sumcheck_cal(self):
sumcheck = 0
addcheck = 0
for i in [(k, v) for k, v in self.INFO.items()][:-3]:
sumcheck += i[1]
addcheck += sumcheck
for i in self.INFO["DATA"]:
sumcheck += i
addcheck += sumcheck
self.INFO["SUM_CHECK"] = int(sumcheck) & 0XFF
self.INFO["ADD_CHECK"] = int(addcheck) & 0XFF
关键数据帧
木鸢通讯协议实现了RoboMaster赛场机器人多种关键类型的功能帧。此外,通过配合BTPDM还可以定义和使用用户自定义的数据帧 功能帧种类繁多,BCP用户手册有较为详细的介绍,此wiki页仅列出影响设备运行的两类数据帧:心跳帧和设备异常帧,其他功能帧不再全部列出
心跳数据
为保证上位机与下位机正常通讯,在BTPDM开始工作时,会始终向下位机发送心跳数据。心跳数据默认每隔50ms发送,数据内容为0/1交替发送。当下位机一段时间无法收到心跳数据时,说明BTP&DM与下位机连接以断开,应执行相应操作。
帧头 | 目标地址 | 功能码 | 数据长度 | 数据内容 | 和校验 | 附加校验 | |
---|---|---|---|---|---|---|---|
名称 | HEAD | D_ADDR | ID | LEN | DATA | SC | AC |
数据内容 | 0xFF | 机器人编号 | 0xAA | 2 | 格式如下 | 程序计算 | 程序计算 |
数据类型 | 数据内容 |
---|---|
UINT8 | 0/1交替发送 |
设备故障
BTPDM是一个基于多线程并行的框架,不同线程的任务出错可能导致框架整体的异常。在实际使用BTPDM的过程中,BCP实现了对不同功能组件的异常信息收集,可以在MCU上配合蜂鸣器、LED灯等设备快速显示出出现问题的设备。当由于设备故障导致BTPDM无法正常运行时,应尽快排查问题,保证程序的正常运行。
帧头 | 目标地址 | 功能码 | 数据长度 | 数据内容 | 和校验 | 附加校验 | |
---|---|---|---|---|---|---|---|
名称 | HEAD | D_ADDR | ID | LEN | DATA | SC | AC |
数据内容 | 0xFF | 机器人编号 | 0x70 | 2 | 格式如下 | 程序计算 | 程序计算 |
数据类型 | 数据内容 |
---|---|
UINT8 | 设备编号 |
木鸢通讯协议的本质是什么?
在系统框架概述中我们提到过,BCP位于BRS/RM的会话层。但实际上,BCP不是一个通讯底层的协议,仅仅是对OSI/RM应用层之间数据格式的一种规定。
BCP数据帧的本质实际上是一串十六进制的数据流,在BTPDM中,BCP数据帧是一个dict类型的数据;在USART链路中,BCP数据帧是一写由高低电平组成的信号。
BCP仅仅是对数据内容的一种封装,这一点非常重要。在不同上位机、MCU甚至转化为CAN总线上的内容,BCP都仅仅是一种数据的格式,而不是底层的通讯协议。
致谢
木鸢通讯协议大量参考和借鉴了匿名通讯协议的内容和方式。