GAZEBO探索――给机器人加上bumper

匿名 (未验证) 提交于 2019-12-02 23:42:01
版权声明: https://blog.csdn.net/wubaobao1993/article/details/91890839

写在前面

最近在做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中也会在该名字前面加上前缀,所以这个名字是不能显式知道的

下面先给出解决方法,之后会有一个例子进行讲解:

  1. 使用如下ROS命令将xacro文件转为model.urdf文件,当然如果你的文件就是urdf,那么不需要这一步
rosrun xacro xacro model.xacro > model.urdf 
  1. 使用GAZEBO的命令将urdf转换为sdf
gz sdf -p model.urdf> model.sdf 
  1. 在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,这就是我们最终要找的东西。

文章来源: https://blog.csdn.net/wubaobao1993/article/details/91890839
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!