这里的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来找到正确名称了。
接下来是找到名称的步骤:
- rosrun xacro xacro.py -o robot.urdf robot.xacro //这里的robot.xacro为你的模型名称,在我们这里是mbot_with_bumper_gazebo.xacro
- 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文件
- rostopic pub -1 /cmd_vel geometry_msgs/Twist -- '[0.1,0,0]' '[0,0,0]' //让机器人运动起来
- rostopic echo -n 1 bumper_vals
我们已经可以看到有碰撞信息。