Turtlebot3的github地址是https://github.com/ROBOTIS-GIT/turtlebot3,其中激光雷达默认的最远测距是3.5m。

当把3.5m修改为3.5m以上的数时,前方的激光发射会存在问题,如下图所示。总之会有许多测距的异常值,大概在0.1~0.2左右。(请无视我小车和车轮的颜色,这是我之后自己改过的,在这里我用的小车的型号是waffle)

事先声明,这个问题应该是一个bug,但是我暂时不清楚是Gazebo的bug还是turtlebot3的bug,总之发现了在使用的时候该如何避免这个问题。

事情是这样的,首先发现了激光雷达的插件位于turtlebot3_ws/src/turtlebot3/turtlebot3_description/urdf文件夹下,turtlebot3_waffle.gazebo.xacro文件。该文件113行到144行的内容如下(扫描线和角度是我调整过的,跟这个无关):

<gazebo reference="base_scan">
    <material>Gazebo/FlatBlack</material>
    <sensor type="ray" name="lds_lfcd_sensor">
      <pose>0 0 0 0 0 0</pose>
      <visualize>$(arg laser_visual)</visualize>
      <update_rate>50</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>512</samples>
            <resolution>0.703</resolution>
            <min_angle>-1.57</min_angle>
            <max_angle>1.57</max_angle>
          </horizontal>
        </scan>
        <range>
          <min>0.120</min>
          <max>3.5</max>
          <resolution>0.015</resolution>
        </range>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.01</stddev>
        </noise>
      </ray>
      <plugin name="gazebo_ros_lds_lfcd_controller" filename="libgazebo_ros_laser.so">
        <topicName>scan</topicName>
        <frameName>base_scan</frameName>
      </plugin>
    </sensor>
  </gazebo>

其中,当修改<max>3.5</max>中的3.5的时候,激光雷达之后测距就会发生问题,即出现我开头的那张图片。

这个问题很隐蔽,当你不去检查激光的返回值或者不把<xacro:arg name="laser_visual"  default="true"/>改成可视化的情况的话,根本发现不了这个问题,进而导致后续算法出现问题,百思不得其解。

检查了接近一天,最后试出了一个不能算解决方式,只能算“逃避”方式的办法:

打开同一文件夹下的turtlebot3_waffle.urdf.xacro文件,其中162到166行:

<joint name="scan_joint" type="fixed">
    <parent link="base_link"/>
    <child link="base_scan"/>
    <origin xyz="-0.064 0 0.122" rpy="0 0 0"/>
  </joint>

把<origin xyz="-0.064 0 0.122" rpy="0 0 0"/>中的z值调大即可。如果测距从3.5米改成了8米,那么0.122就应该改成0.142。

修改之后的结果如下,可以看出显示和测距都正常了。

此外要注意:

1.这个问题看起来好像是被前面的相机给挡住了,但是如果激光雷达测距最远距离对应增大,仍然会出现同样的问题。因此还需要再次往高更改joint的z值,可见不是被遮挡了。

不知道这个问题会不会修复。今天跟师弟调了一下午发现了这个让人无语的问题,最后歪打正着凑合着找到了一个解决方法,特此记录。

2.rviz不能订阅这个激光雷达的topic。(直接rostopic echo是可以看到的)

这个需要把fixed_frame从map改为base_scan,之后global states里面会显示错误,但是Laserscan则是正常的,在rviz里也可以看到激光数据了。(这是因为世界坐标定义成map,单独运行sensor 节点不会生成世界坐标,而传感器坐标laser找不到世界坐标,就定位不了自身的位置,从而报错。)