ROS交流群
ROS Group
产品服务
Product Service
开源代码库
Github
官网
Official website
技术交流
Technological exchanges
激光雷达
LIDAR
ROS教程
ROS Tourials
深度学习
Deep Learning
机器视觉
Computer Vision

bw_auto_dock自动充电功能包的使用和实现原理


  • administrators

    点击此处购买自动充电模块套件

    0_1533288491414_自动充电横板横幅.png
    0_1537510216897_各部件介绍图.png

    【使用与实现原理】

    1. 将自动充电模块安装在小车尾部,把充电桩固定好,接好电源。小车充电过程会接触充电桩,因此充电桩需要固定不能左右、前后移动,最好是靠墙放置。充电桩前面需要至少预留1米乘以1.5米的自由活动空间。

    0_1533288521912_充电桩放置示意图.png

    2. 在主机ros catkin工作空间中下载安装自动充电模块的ros驱动包

    如果是已经配置好的小强用户,可以直接跳过本步骤。

    #假设catkin工作空间在~/Documents/ros
    cd  ~/Documents/ros
    cd src/
    git clone https://github.com/BlueWhaleRobot/bw_auto_dock.git
    cd ..
    catkin_make  
    
    

    3.将模块通过usb转串口模块接入主机usb,添加udev规制,将串口号映射为/dev/ttyUSB004,同时根据插入的usb端口号进行端口绑定。参考:这里

    如果是已经配置好的小强用户,可以直接跳过本步骤。

    #先安装串口设置包
    sudo apt-get install setserial
    #将当前计算机用户名添加进dailout用户组,以xiaoqiang为例
    sudo adduser xiaoqiang dialout
    
    #查看串口所在usb端口,即下条命令输出结果中/ttyUSBXXX字符前面的数字例如2-6: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
    

    自动设置充电桩位置:节点启动成功后,先遥控小车到充电桩位置,使小车进入充电状态(模块黄灯亮),等待10秒后bw_auto_dock包会自动记录当前位置为充电桩位置。
    还可以手动设置充电桩位置:节点启动成功后,先遥控小车到充电桩附近,小车可以不用接触上充电桩,保证充电桩已经很接近小车充电部位,现在可以通过运行下列命令手动发布充电桩位置保存指令,这样小车会把当前位置记录为充电桩位置。

    rostopic pub  /bw_auto_dock/dockposition_save   std_msgs/Bool   '{data: true}'  -1
    

    遥控小车到一个随机位置,运行下列命令后,小车会自动进入自动充电模式,然后尝试自动对准充电桩。

    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个红外接收器。通过分析这四个红外接收器接收的红外信号,小车可以确定自己相对充电桩的位置。

    0_1533288551997_自动充电原理介绍.png

    安装在小车上的自动充电模块有充电电压、充电电流检测功能,还有两个碰撞检测开关。
    整个自动充电控制逻辑是这样的:

    a. 设置充电桩位置后,bw_auto_dock会自动设定两个参考点,充电桩位于这两个参考点连线一侧的中间位置。
    b. 每次接收到自动充电指令后,小车会自动在这两个参考点之间循环运动。
    c. 当L1或者R1接收器接收到充电桩的中间位置信号后,小车会判断已经到达充电桩正前方,然后原地旋转使R2、L2接收器正对充电桩。
    d. 小车开始直线后退对准充电桩,期间根据R2、L2接收的信号进行pid对准控制。
    e. 如果侦测到充电电压、电流,就停止移动,开始充电。如果触发了碰撞开关,同时还没有侦测到电压和电流就回到步骤b。


  • administrators

    @yuggy 如果是一样的就不用remap了



  • @weijiz remap from="/odom" to="/xqserial_server/Odom" }改成{remap from="/odom" to=“你的里程计话题名字”
    如果我的里程计的名字也是/odom,还需要加上这一句吗


  • administrators

    @yuggy 之前那位的问题是没有odom数据。你可以看看你的odom数据是不是正常。也可以加入我们的交流群 538456117



  • @leslie 我也遇到了@weijiz 的rostopic pub /bw_auto_dock/dockposition_save std_msgs/Bool ‘{data: true}’ -1
    没有文件生成,是怎么解决的



  • @weijiz 然而并没有啊


  • administrators

    @leslie 你的slamdb 文件夹中应该已经有保存的充电桩位置文件。
    如果有更多的问题话,建议加入交流群,这样能够更加及时的回复。群号: 538456117



  • 这是我启动节点的输出
    2_1537008601941_2018-09-15 18-49-46屏幕截图.png 1_1537008601941_2018-09-15 18-49-29屏幕截图.png 0_1537008601939_2018-09-15 18-49-17屏幕截图.png


  • administrators

    @leslie 仔细看上面教程,你发的命令不是保存充电桩命令,同时浏览前人回复的帖子,检查里程计设置



  • 我运行保存位置节点,这是终端显示,然而并没有保存到slamdb目录中0_1536998231876_1536979275476-wechatimg11.jpeg


  • administrators

    @leslie 应该创建slamdb, 发图片可以点击最右边的上传文件按钮。



  • 怎么发图片啊?我建立了slambd目录,运行命令后不能保存位置




  • administrators

    @kevin 暂时只支持尾部



  • @xiaoqiang 还有个问题:模块一定要装在尾部吗?如果装在头部或者其他位置,应该做什么改变?



  • @xiaoqiang 谢谢!小车可以行走了。


  • administrators

    @kevin 上面launch没有remap那个里程计话题名字,{remap from="/odom" to="/xqserial_server/Odom" }改成{remap from="/odom" to=“你的里程计话题名字” }



  • @xiaoqiang

    <launch>
      <node pkg="bw_auto_dock" type="bw_auto_dock" name="dock_driver">
        <!-- 充电部位到base_link位置的距离,base_link一般位于两个主动轮轴中间-->
        <param name="back_distance" value="0.40"/>
        <!-- 自动充电对准过程中的最大直线速度-->
        <param name="max_linearspeed" value="0.20"/>
        <!-- 自动充电对准过程中的最大旋转速度-->
        <param name="max_rotspeed" value="1.0"/>
        <!-- 自动充电直线运动对准阶段中的pid参数-->
        <param name="back_dock_kp" value="0.20"/>
        <param name="back_dock_ki" value="0.04"/>
        <param name="back_dock_kd" value="0.0"/>
        <!-- 自动充电设备串口号-->
        <param name="port" value="/dev/ttyUSB004"/>
        <!-- 里程计所在坐标系名字-->
        <param name="odom_frame_id" value="odom"/>
        <!-- 里程计话题名字-->
        <remap from="/odom" to="/xqserial_server/Odom" />
        <!-- 保存有充电桩位置的文件名,全路径在"~/slamdb/" -->
        <param name="station_filename" value="dock_station.txt"/>
        <param name="grid_length" value="4.0"/>
      </node>
      <!-- 设为0关闭底盘红外,设为1启动底盘红外-->
      <!-- <node pkg="nav_test" type="barDetectChanger.py" name="dock_barDetectChanger_node">
        <param name="barDetectFlag" value="0"/>
      </node> -->
    </launch>
    

  • administrators

    launch文件贴一下



  • @xiaoqiang 用的是ros_arduino_bridge,默认也是odom


  • administrators

    @kevin launch里面的里程计话题有没有改成自己小车的里程计名字,还有slamdb文件夹创建一下,发布dockposition_save命令后看一下里面是否有一个txt文件dock_station.txt。

    mkdir  ~/slamdb
    

    dock_station.txt文件里面第三行,存储了当前充电桩位置,这行三个数据依次为x、y、角度。