写在前面
最近在做GAZEBO的时候,遇到了给机器人添加bumper的问题,着实踩了很多坑,而且在google上查到的答案很多都不对,仅仅有一个方法给出了本质,这里特别记录一下,希望可以帮助更多的小伙伴。
GAZEBO与ROS不一样
首先这里必须要说清楚的一个事情就是,我们在学习ROS的时候,使用urdf文件或者xacro文件表示我们的机器人,并且ROS提供了urdf相关的一些包来可视化我们的模型,但是,对于GAZEBO而言,并不认识urdf或者xacro文件,它只认识sdf文件,这也是在GAZEBO官网上只能看到教sdf文件的教程的原因,我们能在ROS中直接启动GAZEBO并在其中模拟机器人的运动,是因为中间GAZEBO将urdf文件转为了sdf文件,之后能被GAZEBO识别。
给机器人添加bumper
之所以说了上述的东西,主要的原因是因为sdf文件中其实多了很多urdf中没有的东西(多数是一些tag的attribution),比如我们在写visual标签的时候,一般都是不写name这个attribution的,但是在GAZEBO做转换的时候,会添加name这个属性,这个属性我们是不能从urdf文件中推断出来的!!!
举个例子,假如我们要给机器人添加一个bumper,那么我们需要在urdf文件中添加如下代码:
<gazebo reference="bumper">
<sensor name="bumper_bumper_sensor" type="contact">
<visualize>true</visualize>
<always_on>true</always_on>
<update_rate>50.0</update_rate>
<contact>
<collision>joint_name</collision>
</contact>
<plugin name="gazebo_ros_bumper_controller" filename="libgazebo_ros_bumper.so">
<robotNamespace>/robot</robotNamespace>
<bumperTopicName>bumper_states</bumperTopicName>
<frameName>bumper</frameName>
</plugin>
</sensor>
<material>Gazebo/Red</material>
<mu1>0.1</mu1>
<mu2>0.1</mu2>
<gravity>true</gravity>
<selfCollide>false</selfCollide>
</gazebo>
我们要想把这个GAZEBO的传感器关联到机器人上,只需要在<collision>属性中写入你的bumper的<collision>标签名。
那接下来的任务就很简单了,找到这个<collision>标签名就可以了,但是正常情况下,我们在写<collision>标签的内容时候,一般是不管名字的,其实即使为<collision>附上名字,sdf中也会在该名字前面加上前缀,所以这个名字是不能显式知道的。
下面先给出解决方法,之后会有一个例子进行讲解:
- 使用如下ROS命令将xacro文件转为model.urdf文件,当然如果你的文件就是urdf,那么不需要这一步
rosrun xacro xacro model.xacro > model.urdf
- 使用GAZEBO的命令将urdf转换为sdf
gz sdf -p model.urdf> model.sdf
- 在sdf中查找所有的<collision>,找到包含bumper零件的<collision>名字的<collision>标签,该标签的名字就是我们要找的东西。
举个例子:
比如我的bumper定义如下(必须要提醒的是尽量在<collision>中写上name,方便在sdf文件中查找):
<xacro:macro name="bumper" params="link_name radius length x y w">
<link name="${link_name}">
<inertial>
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
<mass value="0.01"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
<visual>
<origin xyz="0.0 0.0 0.0" rpy="0.0 ${PI/2.0} 0"/>
<geometry>
<cylinder radius="${radius}" length="${length}"/>
</geometry>
<material name="red">
<color rgba="1.0 0.0 0.0 1.0"/>
</material>
</visual>
<collision name="bumper">
<origin xyz="0.0 0.0 0.0" rpy="0.0 ${PI/2.0} 0"/>
<geometry>
<cylinder radius="${radius}" length="${length}"/>
</geometry>
</collision>
</link>
<joint name="base_${link_name}_joint" type="fixed">
<origin xyz="${x} ${y} 0" rpy="0.0 0.0 ${w}"/>
<parent link="base_link"/>
<child link="${link_name}"/>
</joint>
</xacro:macro>
之后使用上面的两个命令,之后打开sdf,在base_link中搜索“collision”(这里假设你的bumper是安装在base_link上的,如果是和其他的link安装在一起的话就在那个link下寻找),个人的结果如下:
可以看到,名字中包含我们给bumper collision名字的就是base_link_fixed_joint_lump__bumper_collision_2,这就是我们最终要找的东西。