写在前面
最近在做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,这就是我们最终要找的东西。