实验的内容就是利用turtlebot2机器人,在新建的仿真环境当中进行建图和导航,还是非常简单的。
然而,这里的激光雷达信息并不是真正的雷达扫描到的信息,而是由kinect相机转换而来的,从图中也可以看到,只有相机能够探测到的位置才会有激光雷达的信息。光靠kinect相机来实现SLAM效果并不理想,在建图过程中很容易发生漂移。
从图中可以看出kinect相机在走廊中能探测到的位置非常有限,且只有前方,因此转换成的激光雷达信息也只有前方,这对于SLAM建图来说是远远不够的。
为了解决以上地图漂移的问题,在turtlebot2上加入一个rplidar A2二维激光雷达,如下图所示,加在了最上方。
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="laser">
<xacro:property name="rplidar_offset_x" value="0"/>
<xacro:property name="rplidar_offset_y" value="0"/>
<xacro:property name="rplidar_offset_z" value="0.028"/>
<xacro:macro name="rplidar" params="parent">
<!-- Create laser reference frame -->
<joint name="rplidar_joint" type="fixed">
<origin xyz="${rplidar_offset_x} ${rplidar_offset_y} ${rplidar_offset_z}" rpy="0 0 0"/>
<parent link="${parent}"/>
<child link="laser_link"/>
</joint>
<link name="laser_link">
<inertial>
<mass value="0.1" />
<origin xyz="0 0 0" />
<inertia ixx="0.01" ixy="0.0" ixz="0.0"
iyy="0.01" iyz="0.0"
izz="0.01" />
</inertial>
<visual>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<material name="black"/>
</visual>
<collision>
<origin xyz="0.0 0.0 0.0" rpy="0 0 0" />
<geometry>
<cylinder length="0.06" radius="0.05"/>
</geometry>
</collision>
</link>
<gazebo reference="laser_link">
<material>Gazebo/Black</material>
</gazebo>
<gazebo reference="laser_link">
<sensor type="ray" name="rplidar">
<pose>0 0 0 0 0 0</pose>
<visualize>false</visualize>
<update_rate>5.5</update_rate>
<ray>
<scan>
<horizontal>
<samples>360</samples>
<resolution>1</resolution>
<min_angle>-3</min_angle>
<max_angle>3</max_angle>
</horizontal>
</scan>
<range>
<min>0.10</min>
<max>6.0</max>
<resolution>0.01</resolution>
</range>
<noise>
<type>gaussian</type>
<mean>0.0</mean>
<stddev>0.01</stddev>
</noise>
</ray>
<plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so">
<topicName>/scan</topicName>
<frameName>laser_link</frameName>
</plugin>
</sensor>
</gazebo>
</xacro:macro>
</robot>
对robots/kobuki_hexagons_kinect.urdf.xacro文件进行修改
<?xml version="1.0"?>
<!--
- Base : kobuki
- Stacks : hexagons
- 3d Sensor : kinect
-->
<robot name="turtlebot" xmlns:xacro="http://ros.org/wiki/xacro">
<xacro:include filename="$(find turtlebot_description)/urdf/turtlebot_common_library.urdf.xacro" />
<xacro:include filename="$(find kobuki_description)/urdf/kobuki.urdf.xacro" />
<xacro:include filename="$(find turtlebot_description)/urdf/stacks/hexagons.urdf.xacro"/>
<xacro:include filename="$(find turtlebot_description)/urdf/sensors/kinect.urdf.xacro"/>
<xacro:include filename="$(find turtlebot_description)/urdf/sensors/rplidar.xacro"/>
<kobuki/>
<stack_hexagons parent="base_link"/>
<sensor_kinect parent="base_link"/>
<rplidar parent="plate_top_link"/>
</robot>
如下图所示可以明显看到rplidar雷达的信息(两条很长的红线)
如下图,现在的机器人能够同时探测到前方和后方的信息,并且距离更远。
利用rviz中的2D Nav Goal设置目标点,之后全局规划器会在地图上生成一个轨迹,如下图中的绿线:
例如中科院软件博物馆仿真环境,但是需要修改一些参数。在rviz中可以看到kinect相机的信息和机器人周围的雷达信息。
打开AMCL导航仿真环境,设置目标点后,全局规划器在地图上生成轨迹(绿色线)
其中的深度信息就是kinect相机和rplidar雷达的信息,在没加入rplidar之前之所以地图会发生漂移,就是因为深度信息采集的不够,不足以估计机器人的当前位姿。
AMCL定位过程如下图所示,可以估计机器人在地图坐标系/map下的位姿信息,提供/base、/odom、/map之间的TF变换;
move_base中的全局规划和本地规划如下图所示,全局规划器和本地规划器可以保证机器人在沿着全局路径移动过程中实时避障。
本实验过程中涉及到非常多的参数,需要有耐心,尤其是将turtlebot2加到中科院软件博物馆仿真环境,存在很多细节。有时候终端里出现的错误很可能就是某一个参数没有调试好,所以本次实验也为今后的学习提供了许多经验。