上篇博客:ROS中给turtlebot加两个传感器:kinect+hokuyo,进行gazebo仿真

      只是搭建了模型,后来发现激光传感器数据无法查看,并没有正常运行。而且,激光传感器只是一个正方体代替,昨天我仔细查看官网:http://gazebosim.org/tutorials?tut=ros_gzplugins&cat=connect_ros

       完善了代码,并在一位陌生人的帮助下,实现了我当初想要的功能。其实,这几天我一直在想,究竟要怎么改才能达到我的要求,中途有几次,差点放弃,好在坚持下来里。现在已经完成了kinect数据和hokuyo数据分别查看的效果,对他们可以进行单独的数据处理,然后在进行融合,当然,这也是我接下来的工作。现在说说怎么完善的吧,首先秀图,(*^__^*) 嘻嘻……

       对了,还有一个小技巧,要告诉大家,gazebo的截图文件夹(~/.gazebo/pictures/)很难照着,每次截图都找不到图片,那是因为隐藏了!这也是陌生人告诉的,在主文件下,按ctrl+H就能看到隐藏文件了!!!

下面我只说改动部分,如有不便,还望大家见谅,谢谢!

1、在上篇博客步骤4(在路径turtlebot_description/urdf/sensors/下建立hokuyo.urdf.xacro urdf文件,配置位置信息。)中,对hokuyo.urdf.xacro urdf文件进行更改。(注意红色代码!!!)

<?xml version="1.0"?>  
    <!-- script_version=1.1 -->  
    <robot name="sensor_hokuyo" xmlns:xacro="http://ros.org/wiki/xacro">  
      <xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_gazebo.urdf.xacro"/>  
      <xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_properties.urdf.xacro"/>  
      
      <!-- RPLidar 2D LIDAR -->  
      <xacro:macro name="sensor_hokuyo" params="parent">  
        <joint name="laser" type="fixed">  
          <origin xyz="0.10 0 0.435" rpy="0 0.0 0.0" />  
          <parent link="base_link" />  
            <child link="hokuyo_link" />
        </joint>  

        <!-- Hokuyo Laser -->
       <link name="hokuyo_link">
         <collision>
           <origin xyz="0 0 0" rpy="0 0 0"/>
           <geometry>
         <box size="0.1 0.1 0.1"/>
           </geometry>
         </collision>

       <visual>
           <origin xyz="0 0 0" rpy="0 0 0"/>
         <geometry>
        <mesh filename="package://turtlebot_description/meshes/sensors/hokuyo.dae"/>
         </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>

        <!-- Set up laser gazebo details -->  
        <turtlebot_sim_2dsensor/>
      </xacro:macro>  
</robot>  

        代码中<mesh filename="package://turtlebot_description/meshes/sensors/hokuyo.dae"/>提到,hokuyo.dae文件,这个文件要自己下载,可先下载模型包,找到hokuyo的模型包,再把包里的hokuyo.dae文件复制到上述路径。模型包下载方法见:

   http://www.ncnynl.com/archives/201610/914.html      

2、在上篇博客步骤5(在turtlebot_description/urdf/turtlebot_gazebo.urdf.xacro文件下添加配置laser在gazebo下的属性值插件配置)中,修改turtlebot_gazebo.urdf.xacro文件中的激光代码部分。(注意红色代码!!!)

<xacro:macro name="turtlebot_sim_2dsensor">
 <gazebo reference="hokuyo_link">
        <sensor type="ray" name="head_hokuyo_sensor">
          <pose>0 0 0 0 0 0</pose>
          <visualize>false</visualize>
          <update_rate>40</update_rate>
          <ray>
            <scan>
              <horizontal>
                <samples>720</samples>
                <resolution>1</resolution>
                <min_angle>-1.570796</min_angle>
                <max_angle>1.570796</max_angle>
              </horizontal>
            </scan>
            <range>
              <min>0.10</min>
              <max>30.0</max>
              <resolution>0.01</resolution>
            </range>
            <noise>
              <type>gaussian</type>
            
               <mean>0.0</mean>
              <stddev>0.01</stddev>
            </noise>
          </ray>
            <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_laser.so">
            <topicName>/turtlebot/laser/scan</topicName>
            <frameName>hokuyo_link</frameName>
        </plugin>
        </sensor>
      </gazebo>
  </xacro:macro>

         此处注意hokuyo_link部件名称和步骤1处hokuyo_link对应,才能仿真处实际传感器数据。此处数据发布在<topicName>/turtlebot/laser/scan</topicName>中的/turtlebot/laser/scan主题上,和kinect发布数据的/scan主题不同。

        利用下述命令可以看到数据,同样用rostopic list可以看到两个主题, /scan和/turtlebot/laser/scan。

$    rostopic echo /scan

$   rostopic echo /turtlebot/laser/scan

3、到此,所有代码修改完毕。