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找不到世界坐标,就定位不了自身的位置,从而报错。)