ros

mbot添加bumper

Posted on 2020-04-03,5 min read

这里的mbot使用的是古月居课程中创建的mbot,本来也可以用雷达检测碰撞,但是延迟问题我没搞定,看到可以添加bumper来进行碰撞检测,没想到又是一个大坑。

我的问题是 添加了bumper后,即使机器人已经碰撞,但bumper并未输出碰撞信息,我在gazebo answer找到了相似的问题,但由于是Gazebo 7,而我的环境是Gazebo9,添加_collision已经不起作用,只能通过生成sdf来查看base_link的collison name。

以下为对我有帮助的网页连接:

[]: https://answers.ros.org/question/246448/getting-contact-sensorbumper-gazebo-plugin-to-work/
[]: https://answers.gazebosim.org//question/15095/gazebo-contact-sensor-added-to-a-robot-link-in-urdf-file-is-not-working-as-expected/
[]: https://blog.csdn.net/wubaobao1993/article/details/91890839

之后是我的整个操作流程。

操作都是在mbot_description/urdf/xacro/gazebo目录下进行

这里我创建一个mbot_with_bumper_gazebo.xacro来测试bumper能否正常使用。

全部代码为

<?xml version="1.0"?>
<robot name="arm" xmlns:xacro="http://www.ros.org/wiki/xacro">
    <xacro:include filename="$(find mbot_description)/urdf/xacro/gazebo/mbot_base_gazebo.xacro" />
	
  <!-- bumper -->
 
  <joint name="bumper_joint" type="fixed">
    <axis xyz="0 1 0" />
    <origin xyz="0.05 0 0.02" rpy="0 0 0"/>
    <parent link="base_link"/>
    <child link="bump_sensor"/>
  </joint>
 
  <link name="bump_sensor">
    <collision name="bump_sensor_collision">
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="0.05 0.05 0.05"/>
      </geometry>
    </collision>
 
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
         <box size="0.05 0.05 0.05"/>
      </geometry>
    </visual>
 
    <inertial>
      <mass value="1e-5" />
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6" />
    </inertial>
  </link>
 
    <gazebo reference="bump_sensor">
    <sensor name="main_bumper" type="contact">
        <contact>
            <collision>base_footprint_fixed_joint_lump__base_link_collision</collision>
        </contact>
	  <plugin name="gazebo_ros_bumper_controller" filename="libgazebo_ros_bumper.so">
	    <alwaysOn>true</alwaysOn>
	    <updateRate>50</updateRate>
	    <bumperTopicName>bumper_vals</bumperTopicName>
	    <frameName>world</frameName>
	  </plugin>
    </sensor>
    </gazebo>

    <mbot_base_gazebo/>
</robot>

我们在mbot_base_gazebo.xacro中定义了基本的mbot,这里只需要导入并添加bumper即可。

但此时bumper并不一定能正常工作,原因就是

        <contact>
            <collision>base_footprint_fixed_joint_lump__base_link_collision</collision>
        </contact>

collison要关联机器人正确的名称,这里我已经通过生成sdf来找到正确名称了。

接下来是找到名称的步骤:

  1. rosrun xacro xacro.py -o robot.urdf robot.xacro //这里的robot.xacro为你的模型名称,在我们这里是mbot_with_bumper_gazebo.xacro
  2. gz sdf -p robot.urdf > robot.sdf

此时目录下已经有robot.sdf文件,我们打开在其中搜索base_link,因为一般机器人主体我们都用base_link来声明。

可以看到name是一个自动生成的名称,将name复制输入到collision当中

        <contact>
            <collision>base_footprint_fixed_joint_lump__base_link_collision</collision>
        </contact>

我们打开mbot launch文件

  1. rostopic pub -1 /cmd_vel geometry_msgs/Twist -- '[0.1,0,0]' '[0,0,0]' //让机器人运动起来
  2. rostopic echo -n 1 bumper_vals

我们已经可以看到有碰撞信息。

下一篇: turtlebot添加laser→