上传m2文档
parent
cb8ba80bec
commit
61b17063d9
|
@ -1 +1,7 @@
|
||||||
本工程为M2文档
|
# 本工程为M2文档
|
||||||
|
## 目录
|
||||||
|
### 产品概述
|
||||||
|
### 产品参数
|
||||||
|
### 控制方式
|
||||||
|
### 串口协议
|
||||||
|
### ROS驱动
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,204 @@
|
||||||
|
# Autolabor M2 ROS 驱动模块
|
||||||
|
|
||||||
|
## 1. 介绍
|
||||||
|
Autolabor ROS驱动模块包含**CANBus驱动**和**Autolabor M2底盘驱动**,其主要功能包括与Autolabor_CANbus模块通信,并通过线速度和角速度控制Autolabor M2底盘行驶。
|
||||||
|
|
||||||
|
#### 特性
|
||||||
|
|
||||||
|
- 可直接获取CANBus网络内数据,并通过CAN指令控制车辆
|
||||||
|
- 获取动力轮编码器原始数值(角速度)
|
||||||
|
- 获取转向轮编码器原始数值(角速度)
|
||||||
|
- 分别控制动力轮的转速(角速度)
|
||||||
|
- 控制转向轮的绝对转向角度
|
||||||
|
- 可通过线速度与角速度控制移动底盘,无需单独控制前轮转向
|
||||||
|
- 提供实时机器人底盘位置信息,方便闭环控制
|
||||||
|
- 双动力轮电子差速控制,保证机器人在行驶过程中始终满足阿克曼原理
|
||||||
|
- 根据前轮转向优化车辆运动速度,在保证车辆在行驶精度前提下,确保车辆行驶的流畅性
|
||||||
|
|
||||||
|
## 2. 节点
|
||||||
|
|
||||||
|
### 2.1 canbus_driver
|
||||||
|
该节点提供与底层AutoCan的通讯,将CAN网络中的数据进行解析并发布至canbus_msg话题中,并开启canbus_server服务,提供其他节点调用,用以发送CAN指令到CAN网络中。
|
||||||
|
|
||||||
|
该节点的结构如图所示:
|
||||||
|
<div align=left>
|
||||||
|
<img src="img/canbus_driver.png" width = 70% height = 70% />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
#### 2.1.1 订阅话题
|
||||||
|
|
||||||
|
无
|
||||||
|
|
||||||
|
#### 2.1.2 发布话题
|
||||||
|
/canbus_msg ([autolabor_canbus_driver/CanBusMessage](doc/CanBusMessage.md))
|
||||||
|
~~~
|
||||||
|
将底层CAN网络中的数据发布在ROS话题中,提供其他节点读取
|
||||||
|
~~~
|
||||||
|
|
||||||
|
#### 2.1.3 服务
|
||||||
|
/canbus_server ([autolabor_canbus_driver/CanBusService](doc/CanBusService.md))
|
||||||
|
~~~
|
||||||
|
提供其他节点调用,用于往底层CAN网络中发布指令
|
||||||
|
~~~
|
||||||
|
|
||||||
|
#### 2.1.4 参数
|
||||||
|
~port_name (str, default: /dev/ttyUSB0)
|
||||||
|
|
||||||
|
~~~
|
||||||
|
CANBus串口端口名
|
||||||
|
~~~
|
||||||
|
|
||||||
|
~baud_rate (int, default: 115200)
|
||||||
|
~~~
|
||||||
|
CANBus串口波特率
|
||||||
|
~~~
|
||||||
|
|
||||||
|
~parse_rate (int, default: 100)
|
||||||
|
~~~
|
||||||
|
数据解析器从串口获取新数据的频率
|
||||||
|
~~~
|
||||||
|
|
||||||
|
### 2.2 M2_driver
|
||||||
|
|
||||||
|
此节点主要用于接收用户发送的速度信息,控制转向轮转动,并根据后轮当前角度结合阿克曼模型优化求解动力轮的转动速度,控制移动底盘进行移动,同时根据动力轮编码器的反馈,输出轮速里程计信息。
|
||||||
|
|
||||||
|
该节点结构如下:
|
||||||
|
|
||||||
|
<div align=left>
|
||||||
|
<img src="img/pm1_driver.png" width = 70% height = 70% />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
#### 2.2.1 订阅话题
|
||||||
|
|
||||||
|
/cmd_vel ([geometry_msgs/Twist](http://docs.ros.org/api/geometry_msgs/html/msg/Twist.html))
|
||||||
|
|
||||||
|
```
|
||||||
|
外部节点发送的速度信息
|
||||||
|
```
|
||||||
|
|
||||||
|
/canbus_msg ([autolabor_canbus_driver/CanBusMessage](doc/CanBusMessage.md))
|
||||||
|
|
||||||
|
```
|
||||||
|
由canbus_driver发送的底层CANBus消息,其中包含转向轮当前绝对编码器以及动力轮的编码器信息
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2.2.2 发布话题
|
||||||
|
|
||||||
|
/odom ([nav_msgs/Odometry](http://docs.ros.org/api/nav_msgs/html/msg/Odometry.html))
|
||||||
|
|
||||||
|
```
|
||||||
|
根据动力轮以及转向轮的编码器信息,依据车辆运动模型,计算出的轮速里程计信息
|
||||||
|
```
|
||||||
|
|
||||||
|
/wheel_angle ([std_msgs/Float64](http://docs.ros.org/api/std_msgs/html/msg/Float64.html))
|
||||||
|
|
||||||
|
```
|
||||||
|
前阿克曼转向轮实时绝对转角,单位rad
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2.2.3 服务
|
||||||
|
|
||||||
|
/reset_odom ([std_srvs::Empty](http://docs.ros.org/api/std_srvs/html/srv/Empty.html))
|
||||||
|
|
||||||
|
~~~
|
||||||
|
里程计清零,将里程计的原点放置在执行指令的位置
|
||||||
|
~~~
|
||||||
|
|
||||||
|
#### 2.2.4 参数
|
||||||
|
|
||||||
|
~odom_frame (str, default: odom)
|
||||||
|
|
||||||
|
```
|
||||||
|
里程计坐标系名称
|
||||||
|
```
|
||||||
|
|
||||||
|
~base_frame (str, default: base_link)
|
||||||
|
|
||||||
|
```
|
||||||
|
移动底盘坐标系名称
|
||||||
|
```
|
||||||
|
|
||||||
|
~poller_rate_hz (int, default: 20)
|
||||||
|
|
||||||
|
```
|
||||||
|
查询底盘参数的频率,单位 Hz
|
||||||
|
```
|
||||||
|
|
||||||
|
~publish_tf (bool, default: true)
|
||||||
|
|
||||||
|
```
|
||||||
|
设置是否发布odom->base_link的TF转换
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2.2.5 TF转换信息
|
||||||
|
|
||||||
|
odom -> base_link
|
||||||
|
|
||||||
|
```
|
||||||
|
提供车体坐标系与里程计坐标系间转换关系
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3 ROS使用说明
|
||||||
|
|
||||||
|
### 3.1 底盘连接
|
||||||
|
|
||||||
|
将M2的串口线插入笔记本电脑或工控机,打开底盘电源和急停开关
|
||||||
|
|
||||||
|
打开Terminal输入
|
||||||
|
|
||||||
|
```
|
||||||
|
ll /dev/ttyUSB*
|
||||||
|
```
|
||||||
|
查看是否有设备列表,如果没有设备,请检查底盘与电脑的连接情况,如果设备多于一个,请通过拔插其他传感器设备,确定底盘的对应的设备节点名,假设节点名为 /dev/ttyUSB0。
|
||||||
|
|
||||||
|
### 3.2 源码编译与执行
|
||||||
|
|
||||||
|
下载源码
|
||||||
|
|
||||||
|
```
|
||||||
|
mkdir ~/github_ws
|
||||||
|
cd ~/github_ws
|
||||||
|
git clone http://git.autolabor.com.cn/Autolabor/autolabor_m2_ros_driver.git
|
||||||
|
```
|
||||||
|
编译源码
|
||||||
|
|
||||||
|
```
|
||||||
|
cd m2_driver_ros/
|
||||||
|
catkin_make
|
||||||
|
```
|
||||||
|
加载环境变量
|
||||||
|
|
||||||
|
```
|
||||||
|
source devel/setup.bash
|
||||||
|
```
|
||||||
|
修改launch文件参数
|
||||||
|
|
||||||
|
```
|
||||||
|
gedit src/autolabor_canbus_driver/launch/m2_driver.launch
|
||||||
|
```
|
||||||
|
定位
|
||||||
|
```
|
||||||
|
<param name="port_name" value="/dev/ttyUSB0" />
|
||||||
|
```
|
||||||
|
将value值改为之前查看的车底盘的设备节点名,修改后保存并关闭
|
||||||
|
|
||||||
|
执行launch文件
|
||||||
|
|
||||||
|
```
|
||||||
|
roslaunch autolabor_canbus_driver m2_driver.launch
|
||||||
|
```
|
||||||
|
如果成功执行到这一步,并且没有发现任何错误,则车底层驱动就已经启动完毕,这个时候只要启动相应的控制节点就可以控制车底盘行走了。
|
||||||
|
|
||||||
|
### 3.3 控制向前直行
|
||||||
|
|
||||||
|
打开一个terminal
|
||||||
|
|
||||||
|
执行 rostopic list 查看有无/cmd_vel 话题
|
||||||
|
|
||||||
|
如果有的话,执行:
|
||||||
|
|
||||||
|
```
|
||||||
|
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist -- '[1.0,0.0,0.0]' '[0.0,0.0,0]'
|
||||||
|
```
|
||||||
|
|
||||||
|
此时车轮会开始转动,如果想要停止的话,必须在执行命令的terminal中执行Ctrl+C,停止发送。
|
|
@ -0,0 +1,168 @@
|
||||||
|
# AutolaborM2串口通讯协议
|
||||||
|
|
||||||
|
AutolaborM2采用串口通讯,通讯波特率为***115200***。通讯消息分为无数据域和有数据域两种类型。其中无数据域类型主要用于查询指令。
|
||||||
|
|
||||||
|
串口连接成功后,能收到机器人上报的里程计消息和车辆速度、转角消息,可依此作为机器人连接的判断。当前车辆上报得到左轮轮速和右轮轮速是直接从编码器给出的***角速度***,单位为rad。如果需要知道车轮线速度,则需要查询车辆轮半径,根据轮半径计算出车轮线速度。比如,角速度10rad/s,车轮半径0.15m,则线速度v = 10 * 0.15 = 1.5m/s
|
||||||
|
|
||||||
|
机器人有三种急停方式:硬件开关急停、手柄远程急停、软件消息急停。三种急停均可使得车辆立即停止。其中***硬件急停优先级最高***,直接切断电机供电。在发送急停消息后,可根据查询机器人状态信息来判断是否成功进入急停。如果发现机器人进入急停状态,可根据查询消息,判定急停触发的来源。
|
||||||
|
|
||||||
|
车辆的运动控制采用两轮自行车模型,控制量为***前轮转角和后轮转速***。其中转速为***相对速度***,需要用户根据查询到的车辆最大速度,计算出相对速度大小。比如,查询到车辆最大速度为2m/s,想要让车辆按照1m/s的速度运行,则需要发送 v = 1/2 = 0.5。
|
||||||
|
|
||||||
|
## 1、两种数据消息
|
||||||
|
|
||||||
|
* 无数据域消息
|
||||||
|
* 长度:6字节(1字节帧头0xFE + 4字节消息类型 + CRC8校验)
|
||||||
|
|
||||||
|
* 有数据域消息
|
||||||
|
* 长度:14字节(1字节帧头0xFE + 4字节消息类型 + 8字节数据 + CRC8校验)
|
||||||
|
|
||||||
|
## 2、查询指令
|
||||||
|
|
||||||
|
* 查询指令:
|
||||||
|
* 4字节消息类型:0x0D,0x00,消息ID,0x00
|
||||||
|
* 反馈指令:
|
||||||
|
* 4字节消息类型:0x2D,0x00,消息ID,0x00
|
||||||
|
* 8个字节的数据字节解析参考下面的表格,不同消息ID解析方式不同。
|
||||||
|
* 针对不同指令,只有第三位消息ID不同。
|
||||||
|
|
||||||
|
|
||||||
|
| 消息ID | 内容 | 格式| 读/写|备注|
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| 0x80 | 状态 |无数据域<br>[0]运行状态[1]-[7]保留|写<br>读|0x10:正常运行 0xff:急停状态|
|
||||||
|
| 0x02 | 重置里程计 |无数据域|写|里程计的方向清零,即车辆朝向清零|
|
||||||
|
| 0x11 | 剩余容量百分比 |无数据域<br>[0] uint8 [1]-[7]保留|写<br>读|<br>[0,100]% (采样频率=1Hz)|
|
||||||
|
| 0x12 | 剩余可用时间 |无数据域<br>[0][1][2][3] uint32 [4]-[7]保留|写<br>读|<br>[0,360000]s (采样频率=1Hz)|
|
||||||
|
| 0x13 | 剩余容量 |无数据域<br>[0][1][2][3] uint32 [4]-[7]保留|写<br>读|<br>[0,5000000]mAh (采样频率=1Hz)|
|
||||||
|
| 0x14 | 电池电压 |无数据域<br>[0][1] uint16 [2]-[7]保留|写<br>读|<br>[0,500000]mV (采样频率=1Hz)|
|
||||||
|
| 0x15 | 电池电流 |无数据域<br>[0][1][2][3] uint32 [4]-[7]保留|写<br>读|<br>[-750000,750000]mA 正:电池充电,负:电池放电(采样频率=1Hz)|
|
||||||
|
| 0x16 | 手柄数据 | 无数据域<br>[0]-[7]详见 [手柄消息结构定义](#gamepad-struct) |写<br>读| |
|
||||||
|
| 0x17 | 急停开关 | 无数据域<br>[0]bool[1]-[7]保留|写<br>读| <br> 0:正常 1:急停 |
|
||||||
|
| 0x18 | 查询软急停 | 无数据域<br>[0]bool[1]-[7]保留|写<br>读| <br> 0:正常 1:急停 |
|
||||||
|
| 0x19 | 查询手柄急停 | 无数据域<br>[0]bool[1]-[7]保留|写<br>读| <br> 0:正常 1:急停 |
|
||||||
|
| 0x1a | 查询最大线速度 | 无数据域<br>[0]-[3]float [4]-[7]保留 |写<br>读| 根据车轮大小计算出的最大线速度(m/s) |
|
||||||
|
| 0x1b | 查询最大转角 | 无数据域<br>[0]-[3]float [4]-[7]保留 |写<br>读| 根据机械结构得到的最大转角(rad) |
|
||||||
|
| 0x1c | 查询车辆宽度 | 无数据域<br>[0]-[3]float [4]-[7]保留 |写<br>读| 根据机械结构得到的车宽(m) |
|
||||||
|
| 0x1d | 查询车辆长度 | 无数据域<br>[0]-[3]float [4]-[7]保留 |写<br>读| 根据机械结构得到的车长(m) |
|
||||||
|
| 0x1e | 查询轮半径 | 无数据域<br>[0]-[3]float [4]-[7]保留 |写<br>读| 根据机械结构得到的车轮半径(m) |
|
||||||
|
|
||||||
|
***范例***
|
||||||
|
|
||||||
|
| 指令 | 单位| 写字节流 | 反馈字节流 |含义 |
|
||||||
|
| ------------- | ------------- | ------------- | ------------- | ------------- |
|
||||||
|
|状态查询||0xFE,0x0D,0x00,0x80,0x00,0xB2|0xFE,0x2D,0x00,0x80,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09| 状态正常 |
|
||||||
|
|重置编码器||0xFE,0x0D,0x00,0x02,0x00,0x0C||
|
||||||
|
|剩余容量百分比||0xFE,0x0D,0x00,0x11,0x00,0xB5|0xFE,0x2D,0x00,0x11,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79|容量100%|
|
||||||
|
|剩余可用时间|秒|0xFE,0x0D,0x00,0x12,0x00,0xE0|0xFE,0x2D,0x00,0x12,0x00,0x50,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0xCC|剩余50000s|
|
||||||
|
|剩余容量|mAh|0xFE,0x0D,0x00,0x13,0x00,0x24|0xFE,0x2D,0x00,0x13,0x00,0x50,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0x02|剩余50000mAh|
|
||||||
|
|电池电压|10mV|0xFE,0x0D,0x00,0x14,0x00,0x4A|0xFE,0x2D,0x00,0x14,0x00,0x7D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x99|1.25V|
|
||||||
|
|电池电流|1mA|0xFE,0x0D,0x00,0x15,0x00,0x8E|0xFE,0x2D,0x00,0x15,0x00,0x4D,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x5A|2.125A|
|
||||||
|
|急停开关||0xFE,0x0D,0x00,0x17,0x00,0x1F|0xFE,0x2D,0x00,0x17,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58|急停开关按下|
|
||||||
|
|查询软急停||0xFE,0x0D,0x00,0x18,0x00,0x07|0xFE,0x2D,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26|软急停触发|
|
||||||
|
|查询手柄急停||0xFE,0x0D,0x00,0x19,0x00,0xC3|0xFE,0x2D,0x00,0x19,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE8|手柄急停按下|
|
||||||
|
|查询最大线速度|m/s|0xFE,0x0D,0x00,0x1A,0x00,0x96|0xFE,0x2D,0x00,0x1A,0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x00,0x00,0x94|最大线速度1.5m/s|
|
||||||
|
|查询最大转角|rad|0xFE,0x0D,0x00,0x1B,0x00,0x52|0xFE,0x2D,0x00,0x1B,0x00,0x92,0x0A,0x06,0x3F,0x00,0x00,0x00,0x00,0xBC|最大转角:0.523Rad(30度)|
|
||||||
|
|查询车辆宽度|m|0xFE,0x0D,0x00,0x1C,0x00,0x3C|0xFE,0x2D,0x00,0x1C,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x9D| 0.5m|
|
||||||
|
|查询车辆长度|m|0xFE,0x0D,0x00,0x1D,0x00,0xF8|0xFE,0x2D,0x00,0x1D,0x00,0x66,0x66,0x26,0x3F,0x00,0x00,0x00,0x00,0x83| 0.65m|
|
||||||
|
|查询轮半径|m|0xFE,0x0D,0x00,0x1E,0x00,0xAD|0xFE,0x2D,0x00,0x1E,0x00,0x9A,0x99,0x19,0x3E,0x00,0x00,0x00,0x00,0xD2| 0.15m|
|
||||||
|
|
||||||
|
## 3、控制指令(有数据域消息类型)
|
||||||
|
|
||||||
|
* 运动控制(v,theta)
|
||||||
|
* 运动控制具有超时机制,需要在200ms内发送一帧数据,否则会认为数据超时,车辆停止运动。
|
||||||
|
* v: 车辆最大速度的百分比,取值范围[-1,-1],对应从倒退最大速度到前进最大速度。
|
||||||
|
* theta: 前轮转角,单位rad,弧度制。车辆向左转为正。
|
||||||
|
* 4字节消息:0x2D,0x00,0x01,0x00
|
||||||
|
* 8字节数据:前4字节表示v,后4字节表示theta
|
||||||
|
* 数据类型:float
|
||||||
|
* 范例:0xFE,0x2D,0x00,0x01,0x00,0xCD,0xCC,0xCC,0x3D,0xCD,0xCC,0x4C,0x3E,0x82
|
||||||
|
* 指令含义:v:0.1相对速度,theta:0.2rad
|
||||||
|
|
||||||
|
* 紧急停止指令(Emergency)
|
||||||
|
* 急停触发:0xFE,0x2F,0xFF,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDA
|
||||||
|
* 急停解除:0xFE,0x2F,0xFF,0xFF,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x53
|
||||||
|
* 该消息可以直接关停底盘的电机输出。
|
||||||
|
|
||||||
|
|
||||||
|
## 4、反馈消息
|
||||||
|
|
||||||
|
反馈消息将持续发送,40ms间隔。可以使用反馈消息作为车辆连接的依据。
|
||||||
|
|
||||||
|
* 里程计xy坐标
|
||||||
|
* 车辆上电后的位置,为里程计原点,车头方向为x,车左侧为y。
|
||||||
|
* 4字节消息类型:0x2D,0x00,0x21,0x00
|
||||||
|
* 8字节数据内容:前4个字节为x坐标,单位m。后字节为y坐标,单位m。
|
||||||
|
* 数据类型为float
|
||||||
|
* 范例:0xFE,0x2D,0x00,0x21,0x00,0xCD,0xCC,0xCC,0x3D,0xCD,0xCC,0x4C,0x3E,0x1A
|
||||||
|
* 说明:x:0.1m y:0.2m
|
||||||
|
|
||||||
|
* 里程计朝向
|
||||||
|
* 车辆上电后的朝向,为0方向,逆时针为正。
|
||||||
|
* 4字节消息类型:0x2D,0x00,0x22,0x00
|
||||||
|
* 8字节数据内容:前4个字节为朝向角,单位为rad。
|
||||||
|
* 数据类型为float
|
||||||
|
* 范例:0xFE,0x2D,0x00,0x22,0x00,0x9A,0x99,0x99,0x3E,0x00,0x00,0x00,0x00,0xD9
|
||||||
|
* 说明:0.3rad
|
||||||
|
|
||||||
|
* 左电机速度
|
||||||
|
* 4字节消息类型:0x2D,0x11,0x11,0x00
|
||||||
|
* 8字节数据内容:前4个字节为速度,单位rad/s
|
||||||
|
* 数据类型:float
|
||||||
|
* 范例:0xFE,0x2D,0x11,0x11,0x00,0xCD,0xCC,0xCC,0x3D,0x00,0x00,0x00,0x00,0xC5
|
||||||
|
* 含义:0.1rad/s,如果要转换为m/s,需要乘以车轮半径
|
||||||
|
|
||||||
|
* 右电机速度:
|
||||||
|
* 4字节消息类型:0x2D,0x10,0x11,0x00
|
||||||
|
* 8字节数据内容:前4个字节为速度,单位rad/s
|
||||||
|
* 数据类型:float
|
||||||
|
* 范例:0xFE,0x2D,0x10,0x11,0x00,0xCD,0xCC,0x4C,0x3E,0x00,0x00,0x00,0x00,0xB4
|
||||||
|
* 含义:0.2rad/s,如果要转换为m/s,需要乘以车轮半径
|
||||||
|
|
||||||
|
* 转向角度:
|
||||||
|
* 4字节消息类型:0x2D,0x20,0x11,0x00
|
||||||
|
* 8字节数据内容:前4个字节为角度,单位rad
|
||||||
|
* 数据类型:float
|
||||||
|
范例:0xFE,0x2D,0x20,0x11,0x00,0xCD,0xCC,0xCC,0x3D,0x00,0x00,0x00,0x00,0x26
|
||||||
|
* 含义:0.1rad,正方向为向左转
|
||||||
|
|
||||||
|
|
||||||
|
## 5、CRC8校验
|
||||||
|
|
||||||
|
* 使用CRC-8/MAXIM方式计算
|
||||||
|
|
||||||
|
* 示例:在线计算crc8
|
||||||
|
|
||||||
|
![img](img/crc8-maxim.png)
|
||||||
|
|
||||||
|
<span id = "crc8-table"></span>
|
||||||
|
|
||||||
|
* 查表法计算crc8
|
||||||
|
|
||||||
|
```
|
||||||
|
const uint8_t CRC8Table[]={
|
||||||
|
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
|
||||||
|
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
|
||||||
|
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
|
||||||
|
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
|
||||||
|
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
|
||||||
|
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
|
||||||
|
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
|
||||||
|
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
|
||||||
|
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
|
||||||
|
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
|
||||||
|
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
|
||||||
|
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
|
||||||
|
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
|
||||||
|
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
|
||||||
|
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
|
||||||
|
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53 };
|
||||||
|
|
||||||
|
uint8_t can_crc8_calculate(uint8_t *p, uint8_t counter)
|
||||||
|
{
|
||||||
|
uint8_t crc8 = 0;
|
||||||
|
for( ; counter > 0; counter--){
|
||||||
|
crc8 = CRC8Table[crc8^*p];
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
return(crc8);
|
||||||
|
}
|
||||||
|
```
|
|
@ -0,0 +1,66 @@
|
||||||
|
{
|
||||||
|
"_readme": [
|
||||||
|
"注:uri 必须保障唯一性,若有重复引用,请使用 rewrite 注册新的 uri",
|
||||||
|
"由于设计缺陷,rewrite 时只能自定义最后一级路径",
|
||||||
|
"uri 格式 1 - 相对文档:a/b/c",
|
||||||
|
"uri 格式 2 - 相对站内:/usedoc/ap1/a/b/c",
|
||||||
|
"uri 格式 3 - 绝对地址:https://www.baidu.com",
|
||||||
|
"_readme 本身并没有什么软用"
|
||||||
|
],
|
||||||
|
"index": "receipt",
|
||||||
|
"rewrite": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"plugin": {
|
||||||
|
"emoji": false,
|
||||||
|
"taskList": true,
|
||||||
|
"tex": true,
|
||||||
|
"flowChart": true,
|
||||||
|
"sequenceDiagram": true
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"toc": {
|
||||||
|
"startLevel": "1",
|
||||||
|
"overLevel": "1"
|
||||||
|
},
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"name": "Autolabor M2 ",
|
||||||
|
"uri": "/usedoc/navigationKit2/version_two/user_guide/quick_start/receipt"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "Autolabor M2底盘",
|
||||||
|
"isOpen": true,
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"name": "产品概述",
|
||||||
|
"uri": "overview"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "产品参数",
|
||||||
|
"uri": "intro"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "控制方式",
|
||||||
|
"uri": "use"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "串口协议",
|
||||||
|
"uri": "CustomAutocan"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "ROS驱动",
|
||||||
|
"uri": "ChassisM2"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 180 KiB |
Binary file not shown.
After Width: | Height: | Size: 369 KiB |
Binary file not shown.
After Width: | Height: | Size: 40 KiB |
Binary file not shown.
After Width: | Height: | Size: 77 KiB |
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
|
@ -0,0 +1,108 @@
|
||||||
|
# 产品参数
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td width="20%">尺寸</td>
|
||||||
|
<td>1040 mm*700mm *430 mm
</td>
|
||||||
|
<td>驱动形式</td>
|
||||||
|
<td>双轮独立驱动
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>轴距</td>
|
||||||
|
<td>650mm</td>
|
||||||
|
<td>转向形式</td>
|
||||||
|
<td>阿卡曼转向</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>轮距</td>
|
||||||
|
<td>600mm</td>
|
||||||
|
<td>悬挂形式</td>
|
||||||
|
<td>四轮双叉臂式独立悬挂</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>最大速度</td>
|
||||||
|
<td>10km/h</td>
|
||||||
|
<td>电池参数</td>
|
||||||
|
<td>磷酸铁锂 90AH 24V</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>总质量</td>
|
||||||
|
<td>80kg</td>
|
||||||
|
<td>续航时间</td>
|
||||||
|
<td>12小时</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>最小转弯半径</td>
|
||||||
|
<td>1.2m</td>
|
||||||
|
<td>续航里程</td>
|
||||||
|
<td>80公里</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>最大爬坡度</td>
|
||||||
|
<td>30°</td>
|
||||||
|
<td>编码器</td>
|
||||||
|
<td>4096线</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>离地高度</td>
|
||||||
|
<td>110mm</td>
|
||||||
|
<td>对外通信接口</td>
|
||||||
|
<td>RS232</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>驻车</td>
|
||||||
|
<td>电子驻车</td>
|
||||||
|
<td>防护等级</td>
|
||||||
|
<td> IP54</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>驱动电机</td>
|
||||||
|
<td>500W</td>
|
||||||
|
<td>对外供电</td>
|
||||||
|
<td>24V</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>转向电机</td>
|
||||||
|
<td>250W</td>
|
||||||
|
<td>遥控距离</td>
|
||||||
|
<td>50M</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
# 产品尺寸
|
||||||
|
<div style="width:80%;">
|
||||||
|
|
||||||
|
![1.png](img/1.png)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 控制手柄参数
|
||||||
|
该手柄有自动休眠功能,长时间不操作,省电模块被激活后自动进入休眠模式,按下开机键即可唤醒手柄。
|
||||||
|
|
||||||
|
参数名称 | 参数内容
|
||||||
|
:-------------: | :-------------:
|
||||||
|
使用时间 | 约10小时
|
||||||
|
无线频率 | 2.4GHz
|
||||||
|
接收范围 | 50m
|
||||||
|
|
||||||
|
|
||||||
|
* * *
|
||||||
|
|
||||||
|
# 控制面板
|
||||||
|
|
||||||
|
|
||||||
|
控制面板清单:
|
||||||
|
|
||||||
|
名称 | 个数 | 说明
|
||||||
|
:-------------: | :-------------: | :-------------:
|
||||||
|
紧急停止 | 1 | 在紧急情况下请按下该紧急停止按钮
|
||||||
|
电源 | 1 | 电源开启关闭按钮
|
||||||
|
充电接口(IN) | 1 | 为内置电池充电
|
||||||
|
电量显示 | 1 | 以百分比的形式显示AP1电池电量
|
||||||
|
手柄接收 | 1 | 手柄接收器插口
|
||||||
|
RS232串口 | 1 | 使用串口数据线连接下位机与上位机,进行通信
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
# 产品概述
|
||||||
|
Autolabor M2采用前转向的阿克曼结构,四轮双叉臂式独立悬挂,具有100公斤强大负载能力。80公里续航里程。轻松应对各种复杂路况。车规级零部件,稳定可靠,防护等级IP54。配合高精度编码器可以实现高速运动和精准转向,有效提升稳定性和精度。
|
||||||
|
|
||||||
|
* * *
|
||||||
|
|
||||||
|
# 主要特性
|
||||||
|
* 可靠耐用,操作简单,无需组装,开机直接使用
|
||||||
|
* 高通过性,爬坡能力十足,续航能力强
|
||||||
|
* 高精度工业级编码器,定位精准
|
||||||
|
* 高负载,负重可达100KG
|
||||||
|
* 适应场景广泛,轻松应对各种复杂路况
|
||||||
|
* 兼容多个系统,支持多种开发平台、控制方式
|
||||||
|
* 支持ROS开发,提供ROS驱动包与运动模型
|
||||||
|
* 雷达、摄像头、惯导等多种传感器随意组合搭配,拆装方便
|
||||||
|
* 使用文档齐全,配备后续用户支持,并不断更新开发教程
|
||||||
|
|
||||||
|
* * *
|
||||||
|
|
||||||
|
|
||||||
|
# 产品清单
|
||||||
|
|
||||||
|
名称 | 数量 | 备注
|
||||||
|
:---:|:---:|---
|
||||||
|
M2移动平台 | 1辆 |
|
||||||
|
M2充电器 | 1个 |
|
||||||
|
M2控制手柄| 1套 |
|
||||||
|
串口数据线 | 1根 |
|
||||||
|
配套工具 | 1套 |
|
||||||
|
|
||||||
|
* * *
|
||||||
|
|
||||||
|
# 使用提醒
|
||||||
|
|
||||||
|
* 产品边缘锋利,请小心接触,避免划伤
|
||||||
|
* 产品表面为金属材质,请勿与电路板直接接触
* 操控平台时避免速度过快,引起碰撞
* 搬运时以及设置作业时,请勿落下或倒置
|
||||||
|
* 非专业人员,请不要私自拆卸
* 不使用非原厂标配的电池、电源、充电座
* 运行时请勿用手触碰
|
||||||
|
* 不要在有水的地方,存在腐蚀性、易燃性气体的环境内和靠近可燃性物质的地方使用
* 不要放置在加热器或者大型卷线电阻器等发热体周围
|
||||||
|
* 切勿将电机直接与商用电源连接
|
||||||
|
|
||||||
|
* * *
|
||||||
|
|
||||||
|
# 电池安全
|
||||||
|
* 请在有人看护的状态下充电,若人员离开请拔掉充电插头
|
||||||
|
* 充电器在充电工作时,会向外界散发一定的热量,充电器与产品应放在通风干燥的环境中使用
* 正常充电时,充电指示灯为红色,当转为绿色时为充满
|
||||||
|
* 停止充电时,应先拔下插头,然后取下电池端插头
|
||||||
|
* 产品长期不用,需三个月至半年补充一次电
|
||||||
|
* 产品电池不可将电完全用完,否则会严重受损,容易造成不可修复
|
||||||
|
|
||||||
|
* * *
|
|
@ -0,0 +1,119 @@
|
||||||
|
# 控制方式
|
||||||
|
M2可以使用手柄控制和上位机控制两种方式来控制,手柄控制权限高于上位机控制,下面将分别概述这两种控制方式。
|
||||||
|
|
||||||
|
## 手柄控制
|
||||||
|
|
||||||
|
### 概述
|
||||||
|
|
||||||
|
我们配送一个控制手柄用于控制M2移动。
|
||||||
|
|
||||||
|
![2.png](img/2.png)
|
||||||
|
|
||||||
|
### 使用说明
|
||||||
|
|
||||||
|
#### 手柄操作步骤
|
||||||
|
|
||||||
|
1. 长按手柄HOME键,灯光亮起,自动匹配。
|
||||||
|
2. 匹配成功后,手柄会震动一下,跑马灯最左侧与最右侧灯常亮。
|
||||||
|
3. 同时按下顶部L、LZ、R、RZ四键,手柄解锁。
|
||||||
|
4. 在遥控底盘运动、调整线速度、调整角速度的时候需要长按L、LZ、R、RZ四键中任意一键。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### 手柄按键说明
|
||||||
|
|
||||||
|
我们对于M2的手柄控制设计有几种速度档位,如下表。
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr align="center">
|
||||||
|
<th>档位</th>
|
||||||
|
<td>0档</td>
|
||||||
|
<td>1档</td>
|
||||||
|
<td>2档</td>
|
||||||
|
<td>3档</td>
|
||||||
|
<td>4档</td>
|
||||||
|
<td>5档</td>
|
||||||
|
</tr>
|
||||||
|
<tr align="center">
|
||||||
|
<th>速度</th>
|
||||||
|
<td>16%</td>
|
||||||
|
<td>33%</td>
|
||||||
|
<td>50%</td>
|
||||||
|
<td>66%</td>
|
||||||
|
<td>83%</td>
|
||||||
|
<td>100%</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th>按键</th>
|
||||||
|
<th>功能</th>
|
||||||
|
<th width="50%">备注</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>左侧摇杆键</td>
|
||||||
|
<td>控制M2前进与后退</td>
|
||||||
|
<td>控制摇杆推动的力度控制速度,轻推低速移动,推到底为当前档位最高速</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>右侧摇杆键</td>
|
||||||
|
<td>控制M2左右转向</td>
|
||||||
|
<td>控制摇杆推动的力度控制角度,轻推小角度转向,推到底为最大角转向,松开自动回正</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>中区“—”键</td>
|
||||||
|
<td>速度减档</td>
|
||||||
|
<td>每按一下,速度降低一档,最低不得高于最底档,如0档</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>中区“+”键</td>
|
||||||
|
<td>速度加档</td>
|
||||||
|
<td>每按一下,速度提高一档,最高不得高于最高档,如5档</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>左区4控制键</td>
|
||||||
|
<td>前/后/左/右控制运动方向</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>右区4控制键</td>
|
||||||
|
<td>前/后/左/右控制运动方向</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>HOME键</td>
|
||||||
|
<td>开机/急停</td>
|
||||||
|
<td>紧急情况下,可按HOME键,M2会紧急刹车</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>顶部4控制键</td>
|
||||||
|
<td>解锁/防误触</td>
|
||||||
|
<td>手柄连接成功后,需同时按下4键解锁,控制时需长按任意一键,行驶过程中松开,M2会缓刹</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
* * *
|
||||||
|
|
||||||
|
## 上位机控制
|
||||||
|
### 概述
|
||||||
|
使用M2配送的串口数据线与上位机相连,按照预定义的**协议规则**,向下位机(底层硬件平台)发送指令,控制移动平台。
|
||||||
|
|
||||||
|
### 使用说明
|
||||||
|
使用接口线将下位机与上位机连接起来,向下位机发送指令。
|
||||||
|
|
||||||
|
### 指令发送方式
|
||||||
|
用户可按照自己的开发场景,选择不同的方式发送指令:
|
||||||
|
|
||||||
|
* 使用**串口调试助手**直接向下位机发送指令
|
||||||
|
* 基于ROS开发可使用我们提供的**ROS驱动包**与下位机通信发送接收指令
|
||||||
|
|
||||||
|
|
Reference in New Issue