木鸢通讯协议概述 - 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都仅仅是一种数据的格式,而不是底层的通讯协议。

致谢

木鸢通讯协议大量参考和借鉴了匿名通讯协议的内容和方式。