kobuki node和kobuki 底盘framwork通信通过串口/dev/kobuki(默认情况下),分析下kobuki驱动通信的规范,就可以清楚的明白kobuki地盘framwork做了什么工作。再结合kobuki node订阅和发布的topics,就可以清楚知道kobuki node做了什么工作。
通信分成两种:命令(node->framwork)和反馈(node<-framwork);
通信方式serial.write("/dev/kobuki",xxxxxxx);和serial.read("/dev/kobuki",xxxxxxx);
先简单介绍下通信数据结构:命令和反馈的结构是一样的
Name | Header 0 | Header 1 | Length | Payload | Checksum |
---|---|---|---|---|---|
Size | 1 Byte | 1 Byte | 1 Byte | N Bytes | 1 Byte |
Description | 0xAA (Fixed) |
0x55 (Fixed) |
Size of payload in bytes | Described below | XOR'ed value of every bytes of bytesream except headers |
Payload | ||||
Sub-Payload 0 | Sub-Payload 1 | Sub-Payload 2 | ... | Sub-Payload N-1 |
Sub-Payload:
Name | Header | Length | Data |
---|---|---|---|
Size | 1 Byte | 1 Byte | N Byte(s) |
Description | Predefined Identifier | Size of data in byte(s) | Described below |
Checksum:校验位
总览:
Headers | Length | Payload | Checksum | |||||
Header 0 | Header 1 | Sub-Payload 0 | Sub-Payload 1 | Sub-Payload 2 | ... | Sub-Payload N-1 |
1.命令格式:
命令ID
ID | Name | Description |
---|---|---|
1 | Base Control | 控制轮胎电机 |
2 | Reserved | |
3 | Sound | 播放用户自定义声音 |
4 | Sound Sequence | 播放预定义的声音 |
5 | Reserved | |
6 | Reserved | |
7 | Reserved | |
8 | Reserved | |
9 | Request Extra | 请求额外的信息 |
10 | Reserved | |
11 | Reserved | |
12 | General Purpose Output | 控制一般用途的输出 |
13 | Set Controller Gain | 设置轮胎速度控制器的PID增益 |
14 | Get Controller Gain | 请求当前轮胎速度控制器的PID增益 |
1.1 Base Control
向固件传递的是两个值:速度和半径,格式如下:
Name | Size | Value | Value in Hex | Description | |
---|---|---|---|---|---|
Header | Identifier | 1 | 1 | 0x01 | Fixed |
Length | Size of data field | 1 | 4 | 0x04 | Fixed |
Data | Speed | 2 | in mm/s | ||
Radius | 2 | in mm |
其中速度和半径的计算公式:
Motion | Speed(mm/s) | Radius(mm) |
---|---|---|
Pure Translation | v | 0 |
Pure Rotation | wi) * bii) / 2 | 1 |
Translation + Rotation | (radius + bii) / 2)× wi), if radius > 1 (radius - bii) / 2)* wi) , if radius < -1 |
v/w |
v:传入kobuki driver的线速度
w:传入kobuki driver的的旋转角速度 单位:每秒多少弧度,rad/s
b:轴距
举例说明:w为弧度每秒,根据数学公式,弧长 = 弧度×半径,(不明白的去百度上搜,我以前把w当成角度/s,结果怎么看公式都看不明白,后来当成弧度/s,这才看明白)
弧长/s = v(速度) = w(弧度/s)×半径 ->randius = v/w -> v = randius * w
以下图为例,robot往左前方运动,radius为左轮到原点的距离,而传入的speed为轴中心的速度。轴中心距左轮的距离为b/2,所以轴中心距园点的半径实际为(radius+b/2),
故,轴中心的速度为(radius+b/2)×w
1.2 Sound
播放自定义声音,在固件中实现,在kobuki driver中没有实现
Name | Size | Value | Value in Hex | Description | |
---|---|---|---|---|---|
Header |