木鸢通讯协议
目录
修改日志
日期 |
版本 |
维护者 |
修改记录 |
---|---|---|---|
2021.3.15 |
V1.0 |
Ligcox |
首次发布 |
2021.11.7 |
V2.0 |
Ligcox |
针对的BCP for ROS2进行修改 |
2022.8.15 |
V2.1 |
Ligcox |
移植木鸢通讯手册pdf文档至reStructuredText |
声明
木鸢通讯协议是一个针对RMU定制的上下位机通讯协议, 木鸢通讯协议包含在BTPDM、Bubble等开源项目中,鼓励在尊重著作权基础上对木鸢通讯协议进行使用、修改和二次发布。
1 前言
为了适应Robomaster赛场多种数据类型的传输,保证高效的通信效率,MCU与上位机之间的数据传输遵守BCP(Birdiebot Communication Protocol,Birdiebot通讯协议)格式。 BCP在确保通信高效、源码简单、可移植性高的基础上,实现数据正确性判断,有效避免数据传输过程中出现的错误数据的错误解析。 BCP提供对RMU机器人多种类型功能的操作,能够在不同架构下稳定运行,实现RMU赛场的数据传输和解析需求。
木鸢通讯协议在实现过程中参考了 匿名通讯协议 和 RoboMaster裁判系统串口协议 。 通过木鸢上位机和其他拓展工具,能够快速查看机器人状态和交互信息,仅需编写相应的下位机程序接收BCP数据,即可实现对不同种类机器人的控制。
2 通讯协议介绍
2.1 通讯帧基本格式
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
|
---|---|---|---|---|---|---|---|
HEAD |
D_ADDR |
ID |
LEN |
DATA |
SC |
AC |
|
数据长度 |
1 |
1 |
1 |
1 |
N |
1 |
1 |
备注 |
固定值0xFF |
数据发送的接收机器人 参考硬件地址定义 |
操作功能码 |
数据内容字段的长度 |
具体数据内容, N=数据长度 |
计算方法附后 |
|
DATA 数据内容中的数据,采用小端模式,低字节在前,高字节在后。
为了提高数据传输的效率,当有浮点数类型数据需要传输时,根据数据类型的特点,适当截取小数点后固定几位,将浮点数转化成整数类型进行传输,可缩短数据长度,并且避免浮点数传输时发生异常,解析成非法浮点数。类似数据会在协议中标注,如 A*100,就代表将数据 A 只保留两位小数,乘以100进行传输,下位机使用时将收到的数据除以100即可。
和校验
SUM_CHECK
计算方法:从帧头0xFF字节开始,一直到 DATA 区结束,对每一字节进行累加操作,只取低8位。附加校验
ADD_CHECK
计算方法: 计算和校验时,每进行一字节的加法运算,同时进行一次SUM_CHECK
的累加操作,只取低8位。校验计算示例: 假设数据帧缓存为
data_buf
数组,0xFF存放于数组起始位置,那么data_buf[3]
存放的是数据长度,校验程序如下:
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
2.2 基本配置
2.2.1 COM设置
在Manifold2-G Ubuntu18.04条件下,UART0在系统内核中对应的设备是ttyS0,UART1对应的设备是ttyTHS2。Manifold2-G推荐使用UART1作为BCP配置的COM口。 Jetson开发套件推荐使用40pin引脚的6、8口配置的ttyTHS0作为BCP配置的COM口
2.2.2 波特率配置
在使用BCP时,需要将波特率调整为与MCU配置相同,默认为921600,但推荐不应小于115200。
3 数据帧介绍
3.1 心跳数据
为保证上位机与下位机正常通讯,在BCP开始工作时,会始终向下位机发送心跳数据。心跳数据默认每隔50ms发送,数据内容为0/1交替发送。
当下位机一段时间无法收到心跳数据时,说明MCU与上位机连接以断开,应执行相应操作。
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
---|---|---|---|---|---|---|
0xFF |
机器人编号 |
0xF0 |
1 |
格式如下 |
程序计算 |
程序计算 |
心跳数据定义如下:
数据域 |
|
---|---|
数据类型 |
UINT8 |
数据内容 |
交替发送0/1 |
3.2 底盘数据
底盘数据提供了上位机与MCU需要控制的信息。
3.2.1 速度方式控制
当上位机发送至MUC时,MUC应设置底盘x,y方向速度及底盘朝向。
当MUC发送至上位机时,表示当前机器人x,y方向速度及底盘朝向。
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
---|---|---|---|---|---|---|
0xFF |
机器人编号 |
0x10 |
6 |
格式如下 |
程序计算 |
程序计算 |
速度方式控制数据定义如下:
数据域 |
|
|
|
---|---|---|---|
数据类型 |
INT8 |
INT8 |
INT32 |
数据内容 |
底盘x轴速度 |
底盘y轴速度 |
底盘朝向位置,放大100倍发送,4长度 |
3.2.2 里程计方式控制
当上位机发送至MUC时,MUC应设置底盘期望的x,y坐标及底盘朝向。
当MUC发送至上位机时,表示当前机器人的x,y坐标及底盘朝向。
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
---|---|---|---|---|---|---|
0xFF |
机器人编号 |
0x11 |
28 |
格式如下 |
程序计算 |
程序计算 |
里程计方式控制数据,均放大10000倍,4长度,定义如下:
数据域 |
|
|
|
|
|
|
|
---|---|---|---|---|---|---|---|
数据类型 |
INT32 |
INT32 |
INT32 |
INT32 |
INT32 |
INT32 |
INT32 |
数据内容 |
底盘x坐标 |
底盘y坐标 |
底盘z坐标 |
底盘朝向四元数x |
底盘朝向四元数y |
底盘朝向四元数z |
底盘朝向四元数w |
3.2.3 角/线速度方式控制
当MUC发送至上位机时,表示当前机器人的x,y,z方向的线速度及x,y,z轴的角速度。
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
---|---|---|---|---|---|---|
0xFF |
机器人编号 |
0x12 |
24 |
格式如下 |
程序计算 |
程序计算 |
角/线速度方式控制数据,均放大10000倍,4长度,定义如下:
数据域 |
|
|
|
|
|
|
---|---|---|---|---|---|---|
数据类型 |
INT32 |
INT32 |
INT32 |
INT32 |
INT32 |
INT32 |
数据内容 |
底盘x方向线速度 |
底盘y方向线速度 |
底盘z方向线速度 |
底盘x轴角速度 |
底盘y轴角速度 |
底盘z轴角速度 |
3.3 云台数据
云台数据提供了上位机与MCU需要的云台控制信息。
3.3.1 欧拉角rpy方式控制
当上位机发送至MUC时,MUC应控制云台偏转到相应的角度。
当MUC发送至上位机时,表示当前机器人云台朝向。
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
---|---|---|---|---|---|---|
0xFF |
机器人编号 |
0x20 |
13 |
格式如下 |
程序计算 |
程序计算 |
欧拉角rpy方式控制数据定义如下:
数据域 |
|
|
|
|
---|---|---|---|---|
数据类型 |
INT8 |
INT32 |
INT32 |
INT32 |
数据内容 |
控制方式 |
云台yaw偏转角度 |
云台pitch偏转角度 |
云台roll偏转角度 |
备注 |
0为绝对角度控制 |
放大1000倍发送,4长度 |
放大1000倍发送,4长度 |
放大1000倍发送,4长度 |
1为相对角度控制 |
3.3.2 四元数方式控制
TODO
3.4 裁判系统数据
裁判系统数据主要由裁判系统发送至MUC,MUC通过BCP转发至上位机,裁判系统详细数据定义参考 RoboMaster裁判系统串口协议。
3.4.1 比赛类型数据
该数据帧为当前比赛状态数据。
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
---|---|---|---|---|---|---|
0xFF |
机器人编号 |
0x30 |
9 |
格式如下 |
程序计算 |
程序计算 |
比赛状态数据定义如下:
数据域 |
|
|
|
---|---|---|---|
数据类型 |
INT8 |
INT8 |
INT16 |
数据内容 |
比赛类型 |
当前比赛阶段 |
当前阶段剩余时间 |
备注 |
放大100倍发送,2长度 |
3.4.2 机器人血量数据
该数据帧为当前比赛机器人血量数据。
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
---|---|---|---|---|---|---|
0xFF |
机器人编号 |
0x31 |
36 |
格式如下 |
程序计算 |
程序计算 |
血量数据定义如下:
数据域 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
数据类型 |
INT16 |
INT16 |
INT16 |
INT16 |
INT16 |
INT16 |
INT16 |
INT16 |
INT16 |
INT16 |
INT16 |
INT16 |
INT16 |
INT16 |
INT16 |
INT16 |
数据内容 |
红1英雄机器人血量 |
红2工程机器人血量 |
红3步兵机器人血量 |
红4步兵机器人血量 |
红5步兵机器人血量 |
红7哨兵机器人血量 |
红方前哨战血量 |
红方基地血量 |
蓝1英雄机器人血量 |
蓝2工程机器人血量 |
蓝3步兵机器人血量 |
蓝4步兵机器人血量 |
蓝5步兵机器人血量 |
蓝7哨兵机器人血量 |
蓝方前哨站血量 |
蓝方基地血量 |
3.4.3 增益区数据
该数据帧为ICRA人工智能挑战赛加成与惩罚区状态。
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
---|---|---|---|---|---|---|
0xFF |
机器人编号 |
0x32 |
16 |
格式如下 |
程序计算 |
程序计算 |
增益区数据定义如下:
数据域 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
数据类型 |
INT8 |
INT8 |
INT8 |
INT8 |
INT8 |
INT8 |
INT8 |
INT8 |
INT8 |
INT8 |
INT8 |
INT8 |
INT8 |
INT8 |
INT8 |
INT8 |
数据内容 |
F1激活状态 |
F2激活状态 |
F3激活状态 |
F4激活状态 |
F5激活状态 |
F6激活状态 |
F1状态信息 |
F2状态信息 |
F3状态信息 |
F4状态信息 |
F5状态信息 |
F6状态信息 |
红方1号剩余弹量 |
红方2号剩余弹量 |
蓝方1号剩余弹量 |
蓝方2号剩余弹量 |
3.4.4 机器人颜色数据
该数据帧为当前机器人的颜色信息。
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
---|---|---|---|---|---|---|
0xFF |
机器人编号 |
0x33 |
1 |
格式如下 |
程序计算 |
程序计算 |
机器人颜色数据定义如下:
数据域 |
|
---|---|
数据类型 |
INT8 |
数据内容 |
当前机器人颜色信息,蓝色方为0,红色方为1,未定义为2 |
3.4.5 当前机器人位置信息
该数据帧裁判系统下发至MUC的信息,通过BCP转发。
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
---|---|---|---|---|---|---|
0xFF |
机器人编号 |
0x34 |
15 |
格式如下 |
程序计算 |
程序计算 |
机器人位置信息数据定义如下:
数据域 |
|
|
|
|
|
---|---|---|---|---|---|
数据类型 |
INT32 |
INT32 |
INT32 |
UINT8 |
UINT16 |
数据内容 |
目标x位置坐标 |
目标y位置坐标 |
目标z位置坐标 |
发送指令时,云台手按下的键盘信息 |
要作用的目标机器人ID |
3.4.6 雷达发送目标位置信息
该数据帧通过上位机发至MUC,MUC转发至裁判系统,通过BCP转发。
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
---|---|---|---|---|---|---|
0xFF |
0x08 |
0x35 |
10 |
格式如下 |
程序计算 |
程序计算 |
雷达发送目标位置信息数据定义如下:
数据域 |
|
|
|
---|---|---|---|
数据类型 |
UINT16 |
INT32 |
INT32 |
数据内容 |
目标机器人ID |
目标x位置坐标 |
目标y位置坐标 |
3.5 发射机构数据
该数据帧为当前发射机构数据。
当上位机发送至MUC时,MCU应控制发射机构按照射速进行发射。
当MCU发送至上位机时,表示当前机器人是否发射、发射的射速信息及剩余发弹量。
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
---|---|---|---|---|---|---|
0xFF |
机器人编号 |
0x40 |
7 |
格式如下 |
程序计算 |
程序计算 |
比赛状态数据定义如下:
数据域 |
|
|
|
---|---|---|---|
数据类型 |
UINT8 |
INT32 |
INT16 |
数据内容 |
发射机构是否发射 |
弹丸发射速度 |
剩余发弹量 |
3.6 模式控制
3.6.1 控制模式
该数据帧为当前上位机执行的任务模式控制。
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
---|---|---|---|---|---|---|
0xFF |
机器人编号 |
0x50 |
1 |
格式如下 |
程序计算 |
程序计算 |
控制模式数据定义如下:
数据域 |
|
---|---|
数据类型 |
UINT8 |
数据内容 |
当前控制模式,空任务为0,自瞄模式为1,能量机关模式为2 |
3.7 故障信息
Attention
在后续的Bubble版本中,可能对机器人状态发布的BCP部分发生小范围的改动
该数据帧为当上位机模块发生异常时,应该向MUC发送的当前错误信息。
帧头 |
目标地址 |
功能码 |
数据长度 |
数据内容 |
和校验 |
附加校验 |
---|---|---|---|---|---|---|
0xFF |
机器人编号 |
0xE0 |
3 |
格式如下 |
程序计算 |
程序计算 |
故障信息数据定义如下:
数据域 |
|
|
|
---|---|---|---|
数据类型 |
UINT8 |
UINT8 |
UINT8 |
数据内容 |
故障等级 |
故障模组 |
故障码 |
附录I 目标地址表
目标地址字段 |
目标地址名称 |
目标地址 |
---|---|---|
|
广播 |
0x00 |
|
上位机 |
0x01 |
|
哨兵机器人上云台 |
0x02 |
|
哨兵机器人下云台 |
0x03 |
|
步兵机器人 |
0x04 |
|
工程机器人 |
0x05 |
|
英雄机器人 |
0x06 |
|
空中机器人 |
0x07 |
|
雷达站 |
0x08 |
|
视觉采集台 |
0x09 |
|
AI机器人/全自动步兵机器人 |
0x10 |
附录II 功能码表
功能码字段 |
功能码名称 |
功能码 |
---|---|---|
|
速度方式控制 |
0x10 |
|
里程计方式控制 |
0x11 |
|
角/线速度方式控制 |
0x12 |
|
欧拉角rpy方式控制 |
0x20 |
|
比赛类型数据 |
0x30 |
|
机器人血量数据 |
0x31 |
|
增益区数据 |
0x32 |
|
机器人颜色数据 |
0x33 |
|
机器人位置信息 |
0x34 |
|
雷达发送目标位置信息 |
0x35 |
|
发射机构数据 |
0x40 |
|
控制模式 |
0x50 |
|
模式控制 |
0x60 |
|
故障信息 |
0xE0 |
|
心跳数据 |
0xF0 |