From 1da290fcacdc7b29aed798b6aa0e0f5b2d5040b8 Mon Sep 17 00:00:00 2001 From: "zhenghaonan@autolabor.com.cn" Date: Wed, 6 Dec 2023 17:51:27 +0800 Subject: [PATCH] 1 --- .DS_Store | Bin 6148 -> 6148 bytes car/.DS_Store | Bin 6148 -> 8196 bytes car/ChassisM2.md | 242 +++++++++++++++++++++++++++--------- car/doc/CanBusMessage.md | 16 +++ car/doc/CanBusService.md | 11 ++ car/doc/ChassisM2.md | 204 ++++++++++++++++++++++++++++++ car/doc/ControlPrinciple.md | 23 ++++ 7 files changed, 439 insertions(+), 57 deletions(-) create mode 100644 car/doc/CanBusMessage.md create mode 100644 car/doc/CanBusService.md create mode 100644 car/doc/ChassisM2.md create mode 100644 car/doc/ControlPrinciple.md diff --git a/.DS_Store b/.DS_Store index 44b772d66ae10c15e6b0e96cf3be02703bf51c06..2ea5890103dbe7e4db367011cf14042601265c80 100644 GIT binary patch delta 70 zcmZoMXffEZpM`PfW)t1KQAhtnmEhmSlvc7dte0EN5 YUViuF2v&KJrt}Mn;A@3P$FJwK@vbmPQ6T3MQ5owY8iaqRRT#LGjr+ Zxq10rlOtK>8M`-Evi31;X5;wB4*=!A4ToZP(p?#U6X^7TCkgL2Xh zgOl@f3&4g$2&fgg`7SO{D>yFq9P_cAaMTf@FE>90k8D8(E>p{bi}E;f^7GPxMlnuq zVXQvK;A6K@tt`xzli5#e;y7FV90^O LpJ8)6&m3j|XZd6< delta 171 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{Mvv5r;6q~50$jGxXU^g=(&tx6}Ehfh9$rb{E zlUan!7v1mw+6{usNP* G4l@852O{tQ diff --git a/car/ChassisM2.md b/car/ChassisM2.md index 3238def..1bba479 100644 --- a/car/ChassisM2.md +++ b/car/ChassisM2.md @@ -1,23 +1,26 @@ -# Autolabor M2 ROS 驱动模块 +# Autolabor ROS 驱动模块 ## 1. 介绍 -Autolabor ROS驱动模块包含**CANBus驱动**和**Autolabor M2底盘驱动**,其主要功能包括与Autolabor_CANbus模块通信,并通过线速度和角速度控制Autolabor M2底盘行驶。 +Autolabor ROS驱动模块包含**CANBus驱动**和**Autolabor CAN系列(PM1/M2) 底盘驱动**,其主要功能包括与Autolabor_CANbus模块通信,并通过线速度和角速度控制Autolabor Can系列底盘行驶。 #### 特性 - 可直接获取CANBus网络内数据,并通过CAN指令控制车辆 - - 获取动力轮编码器原始数值(角速度) - - 获取转向轮编码器原始数值(角速度) - - 分别控制动力轮的转速(角速度) + - 获取动力轮编码器原始数值 + - 获取转向轮编码器原始数值 + - 分别控制动力轮的转速 - 控制转向轮的绝对转向角度 -- 可通过线速度与角速度控制移动底盘,无需单独控制前轮转向 +- 可通过线速度与角速度控制移动底盘,无需单独控制后轮转向 - 提供实时机器人底盘位置信息,方便闭环控制 - 双动力轮电子差速控制,保证机器人在行驶过程中始终满足阿克曼原理 -- 根据前轮转向优化车辆运动速度,在保证车辆在行驶精度前提下,确保车辆行驶的流畅性 +- 根据后轮转向优化车辆运动速度,在保证车辆在行驶精度前提下,确保车辆行驶的流畅性 ## 2. 节点 +大多数情况下,不需要修改驱动参数,只配置底盘所链接的串口即可,可直接按照 章节 3 ROS 使用说明即可 + ### 2.1 canbus_driver + 该节点提供与底层AutoCan的通讯,将CAN网络中的数据进行解析并发布至canbus_msg话题中,并开启canbus_server服务,提供其他节点调用,用以发送CAN指令到CAN网络中。 该节点的结构如图所示: @@ -30,13 +33,13 @@ Autolabor ROS驱动模块包含**CANBus驱动**和**Autolabor M2底盘驱动** 无 #### 2.1.2 发布话题 -/canbus_msg ([autolabor_canbus_driver/CanBusMessage](doc/CanBusMessage.md)) +/canbus_msg ([autolabor_canbus_driver/CanBusMessage](doc/CanBusMessage)) ~~~ 将底层CAN网络中的数据发布在ROS话题中,提供其他节点读取 ~~~ #### 2.1.3 服务 -/canbus_server ([autolabor_canbus_driver/CanBusService](doc/CanBusService.md)) +/canbus_server ([autolabor_canbus_driver/CanBusService](doc/CanBusService)) ~~~ 提供其他节点调用,用于往底层CAN网络中发布指令 ~~~ @@ -58,7 +61,7 @@ CANBus串口波特率 数据解析器从串口获取新数据的频率 ~~~ -### 2.2 M2_driver +### 2.2 M2底盘驱动 此节点主要用于接收用户发送的速度信息,控制转向轮转动,并根据后轮当前角度结合阿克曼模型优化求解动力轮的转动速度,控制移动底盘进行移动,同时根据动力轮编码器的反馈,输出轮速里程计信息。 @@ -76,7 +79,7 @@ CANBus串口波特率 外部节点发送的速度信息 ``` -/canbus_msg ([autolabor_canbus_driver/CanBusMessage](doc/CanBusMessage.md)) +/canbus_msg ([autolabor_canbus_driver/CanBusMessage](doc/CanBusMessage)) ``` 由canbus_driver发送的底层CANBus消息,其中包含转向轮当前绝对编码器以及动力轮的编码器信息 @@ -93,7 +96,7 @@ CANBus串口波特率 /wheel_angle ([std_msgs/Float64](http://docs.ros.org/api/std_msgs/html/msg/Float64.html)) ``` -前阿克曼转向轮实时绝对转角,单位rad +转向轮实时绝对转角,单位rad ``` #### 2.2.3 服务 @@ -104,6 +107,8 @@ CANBus串口波特率 里程计清零,将里程计的原点放置在执行指令的位置 ~~~ + + #### 2.2.4 参数 ~odom_frame (str, default: odom) @@ -118,10 +123,82 @@ CANBus串口波特率 移动底盘坐标系名称 ``` -~poller_rate_hz (int, default: 20) +~ecu_left_id (int, default: 0) ``` -查询底盘参数的频率,单位 Hz +左侧动力单元的CAN节点编号(出厂已设置好,无需修改) +``` + +~ecu_right_id (int, default: 1) + +``` +右侧动力单元的CAN节点编号(出厂已设置好,无需修改) +``` + +~tcu_id (int, default: 0) + +``` +转向单元的CAN节点编号(出厂已设置好,无需修改) +``` + +~rate (int, default: 10) + +``` +速度控制以及里程计更新频率,单位 Hz +``` + +~reduction_ratio (double, default: 20.0) + +``` +动力单元编码器与车轮转速比例(和机械结构相关,无需修改) +``` + +~encoder_resolution (double, default: 1600.0) + +``` +动力单元编码器转动一圈产生的脉冲数(与编码器参数相关,无需修改) +``` + +~wheel_diameter (double, default: 0.211) + +``` +动力轮车轮直径,单位 m +``` + +~wheel_spacing (double, default: 0.412) + +``` +动力轮轮间距(两个动力轮中心之间的距离),单位 m +``` + +~shaft_spacing (double, default: 0.324) + +``` +前后轮轴间距(转向轮中心到动力轮连线的距离),单位 m +``` + +~max_speed (double, default: 2.0) + +``` +机器人底盘直线行驶最大速度,单位 m/s +``` + +~twist_timeout (double, default: 1.0) + +``` +速度控制超时时间,底盘的保护策略,最近一次的速度控制信息距当前时间超过这个时间,则强制移动底盘停止,单位 s +``` + +~optimize_limit (double, default: 0.785) + +``` +底盘行驶控制优化参数,用于设置底盘控制流畅程度,可设置范围为[0,PI/2],值越小表示执行越精确,但行驶流畅程度越低;值越大表示执行流畅程度越高,但精确度越低(如果没有特殊需求,一般保持默认值) +``` + +~smooth_coefficient (double, default: 0.1) + +``` +底盘行驶控制平滑参数,用于设置底盘速度变化平滑程度,可设置范围为(0,1],其中值越小表示速度变化越平缓;反之速度变化越剧烈。值为1时,表示对速度信息不进行平滑处理 ``` ~publish_tf (bool, default: true) @@ -142,7 +219,7 @@ odom -> base_link ### 3.1 底盘连接 -将M2的串口线插入笔记本电脑或工控机,打开底盘电源和急停开关 +将PM1的串口线插入笔记本电脑或工控机,打开底盘电源和急停开关 打开Terminal输入 @@ -153,52 +230,103 @@ ll /dev/ttyUSB* ### 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 -``` -定位 -``` - -``` -将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]' +sudo apt-get install python3-catkin-tools ``` -此时车轮会开始转动,如果想要停止的话,必须在执行命令的terminal中执行Ctrl+C,停止发送。 \ No newline at end of file +引入ROS环境变量 +``` +source /opt/ros/noetic/setup.bash +``` + +将源代码复制到工作空间 src 目录下 + +包含两个目录 + +autolabor_m2_ros_driver + +autolabor_keyboard_control + +进入工作空间源代码目录 + + + +修改 launch 文件(autolabor_canbus_driver/launch/m2keyboard.launch )中的底盘串口地址 + +将 port_name 项的值,修改为您的底盘串口地址。 + +可通过 ls /dev/ttyUSB* 查找。 + +建议您设定 udev 规则,将其设定成固定名字,以防止串口地址变化 + +关于串口 udev 规则的修改,可参考 + +http://www.autolabor.com.cn/usedoc/navigationKit2/common/q_a/doc1#1 + +章节 7. (接上问)“ 我就想换台计算机,然后把设备用起来,那我该怎么办?” + + + +确保您的串口已经增加了当前用户的操作权限,可通过以下命令实现。 + + + +``` +sudo chmod 666 /dev/ttyUSB0 +``` + + + +``` + + + + + + + + + + + + + + + + + + + +``` + + + +cd ~/catkin_ws/src + + +编译源代码 +``` +catkin build +``` + +引入环境变量 + +``` +source ~/catkin_ws/devel/setup.bash +``` + +启动底盘键盘控制 + +注意需要在桌面环境下的控制台运行,远程 SSH 没有桌面环境会因无法找到 X11Server 报错 + +``` +roslaunch autolabor_canbus_driver m2keyboard.launch + +``` \ No newline at end of file diff --git a/car/doc/CanBusMessage.md b/car/doc/CanBusMessage.md new file mode 100644 index 0000000..f6b3ff3 --- /dev/null +++ b/car/doc/CanBusMessage.md @@ -0,0 +1,16 @@ +# autolabor_canbus_driver/CanBusMessage Message +## Raw Message Definition +~~~ +uint8 node_type # 节点类型 +uint8 node_seq # 节点序号 +uint8 msg_type # CAN消息类型 +uint8[] payload # CAN消息内容(指令数据时为空) +~~~ + +## Compact Message Definition +~~~ +uint8 node_type +uint8 node_seq +uint8 msg_type +uint8[] payload +~~~ diff --git a/car/doc/CanBusService.md b/car/doc/CanBusService.md new file mode 100644 index 0000000..505c367 --- /dev/null +++ b/car/doc/CanBusService.md @@ -0,0 +1,11 @@ +# autolabor_canbus_driver/CanBusService Message +## Raw Message Definition +``` +autolabor_canbus_driver/CanBusMessage[] requests # CANBus指令列表 +--- +``` +## Compact Message Definition +~~~ +autolabor_canbus_driver/CanBusMessage[] requests +--- +~~~ \ No newline at end of file diff --git a/car/doc/ChassisM2.md b/car/doc/ChassisM2.md new file mode 100644 index 0000000..fb8da57 --- /dev/null +++ b/car/doc/ChassisM2.md @@ -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网络中。 + +该节点的结构如图所示: +
+ +
+ +#### 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 pm1_driver + +此节点主要用于接收用户发送的速度信息,控制转向轮转动,并根据后轮当前角度结合阿克曼模型优化求解动力轮的转动速度,控制移动底盘进行移动,同时根据动力轮编码器的反馈,输出轮速里程计信息。 + +该节点结构如下: + +
+ +
+ +#### 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 autolabor_m2_ros_driver/ +catkin_make +``` +加载环境变量 + +``` +source devel/setup.bash +``` +修改launch文件参数 + +``` +gedit src/autolabor_canbus_driver/launch/m2_driver.launch +``` +定位 +``` + +``` +将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,停止发送。 \ No newline at end of file diff --git a/car/doc/ControlPrinciple.md b/car/doc/ControlPrinciple.md new file mode 100644 index 0000000..8724677 --- /dev/null +++ b/car/doc/ControlPrinciple.md @@ -0,0 +1,23 @@ +# AUTOLABOR PM1 底盘控制原理 + +Autolabor PM1机器人底盘采用动力转向驱动方式,车辆的前侧由两个动力单元组成,其给机器人地盘提供行进动力,后侧由一个转向单元组成,控制车辆的转向半径。动力转向相比与其他转向方式,其更具有大的优势: + +| | 动力转向 | 两轮差速 | 四轮差速 | 舵机转向 | +| :--------: | :------: | :------: | :------: | :------: | +| 越障能力 | ★★ | ★ | ★★★ | ★★ | +| 控制精度 | ★★★ | ★★★ | ★★ | ★★★ | +| 能源利用率 | ★★★ | ★★★ | ★ | ★★★ | +| 灵活性 | ★★★ | ★★★ | ★★★ | ★ | + +动力转向需要同时控制转向单元和动力单元的运动,在运动的过程中,这两部分还需要满足阿克曼模型的约束,所以对底盘的控制相对其他转向形式会稍微复杂一些,下文详细介绍一下如何控制动力转向底盘。 + +## 1 两轮差速 + +### 1.1 两轮差速介绍 + +动力转向模型可以由两轮差速模型推导而来,所以首先先介绍一下两轮差速模型,两轮差速顾名思义就是由两个轮提供动力实现前进以及转向。通常为了保证底盘的稳定性,装有若干偏心万向轮用于提供支撑。 + +万向轮如果选择过小,会导致整个机器人底盘的越障能力较弱,其只能用于平整的地面;万向轮过大,移动底盘在控制过程中会受到万向轮惯性的影响,影响控制精度。 + + +