### 注意:
* 在使用串口发送指令时,底层超过 **1s** 没有接收到上位机的指令,会向上位机返回错误状态码FF (error状态:连接超时),此时用户如果想要重新控制车辆,需要发送Reset命令
* 在调试发送指令时,先发一条Reset命令,然后接着发指令,如:
0x 55 AA 02 02 05 00 FA
0x 55 AA 09 00 01 00 04 00 00 00 00 00 00 F3
0x 55 AA 02 02 05 00 FA
0x 55 AA 09 00 01 00 04 00 00 00 00 00 00 F3
...
#### 串口测试速度指令样例
##### 左转
55 AA 02 02 05 00 FA 55 AA 09 00 01 00 00 00 04 00 00 00 00 F3
##### 右转
55 AA 02 02 05 00 FA 55 AA 09 00 01 00 04 00 00 00 00 00 00 F3
##### 前进
55 AA 02 02 05 00 FA 55 AA 09 00 01 00 04 00 04 00 00 00 00 F7
##### 后退
55 AA 02 02 05 00 FA 55 AA 09 00 01 FF FA FF FA 00 00 00 00 F7
下面列出几个常用的控制指令示例:
# 控制车轮速度指令
假设请求左车轮速度为0.1m/s,传输数据帧内容为:
0x 55 AA 09 00 01 00 04 00 00 00 00 00 00 F3
Header |
Length |
Sequence |
Payload |
Checksum |
MsgID |
PARAM |
55 AA |
09 |
00 |
01 |
00 04 |
00 00 |
00 00 |
00 00 |
F3 |
起始标志位 |
有效数据的长度为9个字节 |
第一个指令 |
控制车轮速度指令 |
左车轮 |
右车轮 |
固定不变为0 |
异或校验码 |
如上文所说,通常我们所说的速度是以m/s为单位的速度,而指令中车轮速度的参数实际上是单位时间内期望编码器的计数,在此需要将指令的速度V(m/s)结合AP1下位机的物理参数进行计算,下面是车轮速度换算方法。
M1下位机物理参数如下表:
名称 | 参数 | 说明
:-------------: | :-------------: | :-------------
wheel_diameter | 0.25 | 车轮直径,单位:米
encoder_resolution | 1600 | 编码器转一圈产生的脉冲数
PID_RATE | 50 | PID调节PWM值的频率
假设我们给M1左轮V=0.1m/s的速度(右轮速度的计算指令与此相同),计算方法如下:
车轮转动一圈,移动的距离为轮子的周长:
distance_one_round
=wheel_diameter*π
=wheel_diameter*3.1415926
=0.25*3.1415926
车轮转动一圈,编码器产生的脉冲数为:
wheel_encoder_resolution
=1*encoder_resolution
=1*1600
=1600
注:编码器与车轮连接在一起,车轮转1圈,编码器转1圈;编码器的脉冲数可以理解为编码器计数,编码器自转一圈计数1600,则车轮转一圈编码器计数为1600。
所以AP1每移动1米产生脉冲数(编码器的计数)为:
ticks_per_meter
=(1/distance_one_round)*wheel_encoder_resolution
=1/(0.25*3.1415926)*1600
=2037.18
又因为PID的频率是1秒钟50次,所以指令的参数计算方法为:
int(V*ticks_per_meter/PID_RATE)
=int(0.1*2037.18/50)
=4
用户可直接使用0.1m/s速度的计算结果来对应自己期望的速度换算成相应的数值,如0.2m/s为8,1m/s为40等。
接着将计算出来的4换算为16进制为:
00 04
则速度指令的PARAM为
00 04 00 00 00 00 00 00
注:如果用户发送的速度超过了最大速度,则会按最大速度行进。
# 获取电池电量指令
0x 55 AA 02 01 02 00 FE
Header |
Length |
Sequence |
Payload |
Checksum |
MsgID |
PARAM |
55 AA |
02 |
01 |
02 |
00 |
FE |
起始标志位 |
有效数据的长度为2个字节 |
第二个指令 |
小车的电量请求 |
参数为00 |
异或校验码 |
# 重置状态指令
当接收到下位机发送的错误状态码FF时,需要将AP1状态重置(Reset),才能重新恢复控制,指令如下:
0x 55 AA 02 02 05 00 FA
Header |
Length |
Sequence |
Payload |
Checksum |
MsgID |
PARAM |
55 AA |
02 |
02 |
05 |
00 |
FA |
起始标志位 |
有效数据的长度为2个字节 |
第三个指令 |
重置状态指令 |
参数为00 |
异或校验码 |
# 清除编码器计数指令
0x 55 AA 02 03 06 00 F8
Header |
Length |
Sequence |
Payload |
Checksum |
MsgID |
PARAM |
55 AA |
02 |
03 |
06 |
00 |
F8 |
起始标志位 |
有效数据的长度为2个字节 |
第四个指令 |
请求清除编码器计数 |
参数为00 |
异或校验码 |