gazebo环境中怎么添加障碍物

写在前面 最近在做GAZEBO的时候,遇到了给机器人添加bumper的问题,着实踩了很多坑,而且在google上查到的答案很多都不对,仅仅有一个方法给出了本质,这里特别记录一下,希望可以帮助更多的小伙伴。 GAZEBO与ROS不一样 首先这里必须要说清楚的一个事情就是,

写在前面

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

知秋君
上一篇 2024-08-18 20:36
下一篇 2024-08-18 20:02

相关推荐