小强ROS机器人教程(27)___bw_auto_dock自动充电功能包的使用和实现原理
点击此处购买自动充电模块套件
尺寸图: (尾部两个4mm通孔用于固定小车底板尾部,5.5mmDC头接车载电池)
自动充电模块串口通信协议v1.2.pdf,2020年新版
自动充电模块串口通信协议V1.0.pdf,2020年之前老版本
ROS驱动包
【使用与实现原理】
2018年12月之后购买的用户,充电模块全部升级到了2代,2代相比一代使用超声波替换了碰撞开关,减少了模块机械损坏机率。2代支持同时测量电池电压和充电输入电压,1代只支持测量充电电压。电压测量值以ros话题形式发布,具体请看驱动包readme文件。
1. 将自动充电模块安装在小车尾部,把充电桩固定好,接好电源。小车充电过程会接触充电桩,因此充电桩需要固定不能左右、前后移动,最好是靠墙放置。充电桩前面需要至少预留1米乘以1.5米的自由活动空间。
2. 在主机ros catkin工作空间中下载安装自动充电模块的ros驱动包
如果是已经配置好的小强用户,可以直接跳过本步骤。
#假设catkin工作空间在~/Documents/ros
cd ~/Documents/ros
cd src/
git clone https://gitee.com/BlueWhaleRobot/bw_auto_dock.git
#切换到对应分支,1代切换到master,2代切换到version2分支,如果ros版本是melodic以上版本用noetic-version2分支
git checkout version2 #语法“git checkout 分支名字”
cd ..
catkin_make
3.将模块通过usb转串口模块接入主机usb,添加udev规制,将串口号映射为/dev/ttyUSB004,同时根据插入的usb端口号进行端口绑定。参考:这里
如果是已经配置好的小强用户,可以直接跳过本步骤。
#先安装串口设置包
sudo apt-get install setserial
#将当前计算机用户名添加进dailout用户组,以xiaoqiang为例
sudo adduser xiaoqiang dialout
#查看串口所在usb端口,即下条命令输出结果中/ttyUSBXXX字符前面的数字例如2-2:1.0,/ttyUSBXXX需要替换成实际端口号
udevadm info --name=/dev/ttyUSBXXX --attribute-walk
#根据这个端口号和映射信息/dev/ttyUSB004建立udev规则文件/etc/udev/rules.d/95-persistent-serial.rules,下面内容可供参考。对于非小强用户,xiaoqiang需要更换成自己的计算机用户名
ACTION!="add", GOTO="persistent_serial_end"
SUBSYSTEM!="tty", GOTO="persistent_serial_end"
KERNEL!="ttyUSB[0-9]*", GOTO="persistent_serial_end"
# This is old 11.10 style: IMPORT="usb_id --export %p"
IMPORT{builtin}="path_id"
KERNELS=="2-2:1.0" ,SYMLINK+="ttyUSB004" , OWNER="xiaoqiang" ,RUN+="/bin/setserial /dev/ttyUSB004 low_latency"
LABEL="persistent_serial_end"
#最后重新加载udev规则
udevadm control --reload-rules
#重新插拔u转串模块 如果 ls /dev可以看到ttyUSB004设备,说明操作成功。
4.启动ros驱动节点,开始测试自动充电功能
对于小强用户,可以直接启动xiaoqiang_local.launch进行测试。 对于其它平台的用户,请根据xiaoqiang_local.launch里面的参数注释,把里程计和安装参数修改一下。
roslaunch bw_auto_dock xiaoqiang_local.launch
手动设置充电桩位置:节点启动成功后,先遥控小车到充电桩附近,小车可以不用接触上充电桩,保证充电桩已经很接近小车充电部位(相差10cm左右),现在可以通过运行下列命令手动发布充电桩位置保存指令,这样小车会把当前位置记录为充电桩位置。
rostopic pub /bw_auto_dock/dockposition_save std_msgs/Bool '{data: true}' -1
#保存成功后会在launch文件设置的目录里面生成一个文件,里面有位置数据。
#只有在红外传感器收到数据而且里程计消息有效时才会保存数据
遥控小车到一个随机位置,运行下列命令后,小车会自动进入自动充电模式,然后尝试自动对准充电桩。
rostopic pub /bw_auto_dock/EnableCharge std_msgs/Bool '{data: true}' -1
运行下列命令可以使小车退出自动充电模式,现在又可以返回到上一步,继续发布自动充电命令。
rostopic pub /bw_auto_dock/EnableCharge std_msgs/Bool '{data: false}' -1
5.自动充电原理介绍
充电桩会广播一组红外信号,小车上的自动充电模块有4个红外接收器。通过分析这四个红外接收器接收的红外信号,小车可以确定自己相对充电桩的位置。
安装在小车上的自动充电模块有充电电压、充电电流检测功能,还有两个碰撞检测开关。 整个自动充电控制逻辑是这样的:
a. 设置充电桩位置后,bw_auto_dock会自动设定两个参考点,充电桩位于这两个参考点连线一侧的中间位置。 b. 每次接收到自动充电指令后,小车会自动在这两个参考点之间循环运动。 c. 当L1或者R1接收器接收到充电桩的中间位置信号后,小车会判断已经到达充电桩正前方,会先后退一段距离(back_distance长度),然后原地旋转使R2、L2接收器正对充电桩。 d. 小车开始直线后退对准充电桩,期间根据R2、L2接收的信号进行pid对准控制。 e. 如果侦测到充电电压、电流,就停止移动,开始充电。如果触发了碰撞开关,同时还没有侦测到电压和电流就回到步骤b。
6.常见问题
a.back_distance该如何设置?
back_distance对应的是超声波模块到base_link的距离,这个距离决定了上文5.c步骤小车后退距离。如果发现小车每次5.c旋转后都没有正对充电桩,说明这个参数设置的过大或过小,手动调一下back_distance参数(一般是减去过调的距离)。
b.在步骤5.e中机器人经常没有碰到充电桩就不后退了反而立即离开,即crash_distance该如何设置?
crash_distance是一个碰撞检测阈值,在5.e步骤中,如果超声波探测的值小于crash_distance就认为是触发了碰撞开关。
如果5.e中机器人经常没有碰到充电桩就不后退了反而立即离开,说明crash_distance值设置的太大了,尝试把它改小一些(每次减少10)。
如果5.e中机器人已经碰到墙了,还在不断后退,说明crash_distance值设置的太小了,尝试把它改大一些(每次增加10)。
在rqt_console里面打开dock_driver节点的debug输出,可以查看超声波模块的当前测量值。
7.升级控制算法
xq5分支代码是控制算法升级后的版本(ros melodic以上版本需要用noetic分支代码),同时整合提供了service和action接口,还支持手动对接充电,具体请阅读代码了解。
#编译xq5分支代码(或者noetic分支),所依赖的ros包从这里git clone下载后catkin_make编译
https://gitee.com/BluewhaleRobot/galileo_serial_server.git
https://gitee.com/BluewhaleRobot/galileo_msg.git