实验内容

实验的内容就是利用turtlebot2机器人,在新建的仿真环境当中进行建图和导航,还是非常简单的。

创建仿真环境

(1)利用gazebo的Building Editor创建一个简单的仿真环境。

在这里插入图片描述

(2)打开rviz,加入机器人模型、点云和雷达信息。rviz中的白线为雷达信息。

在这里插入图片描述

(3)随着机器人的移动,点云信息和雷达信息也随之更新。

在这里插入图片描述
然而,这里的激光雷达信息并不是真正的雷达扫描到的信息,而是由kinect相机转换而来的,从图中也可以看到,只有相机能够探测到的位置才会有激光雷达的信息。光靠kinect相机来实现SLAM效果并不理想,在建图过程中很容易发生漂移。

SLAM建图

(1)打开建图的仿真环境,初始位置如下图所示

从图中可以看出kinect相机在走廊中能探测到的位置非常有限,且只有前方,因此转换成的激光雷达信息也只有前方,这对于SLAM建图来说是远远不够的。
在这里插入图片描述

(2)运行teleop控制节点,使机器人移动进行建图,在运动过程中地图发生漂移:

在这里插入图片描述

(3)添加激光雷达

为了解决以上地图漂移的问题,在turtlebot2上加入一个rplidar A2二维激光雷达,如下图所示,加在了最上方。
在这里插入图片描述

(4)rplidar.xacro的代码如下:

<?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>

(5)再次打开仿真环境和rviz,加入机器人模型、点云和雷达信息

如下图所示可以明显看到rplidar雷达的信息(两条很长的红线)
在这里插入图片描述

(6)打开gmapping建图的仿真环境

如下图,现在的机器人能够同时探测到前方和后方的信息,并且距离更远。
在这里插入图片描述

(7)控制机器人移动,开始建图,在建图过程中没有发生漂移。

在这里插入图片描述

(8)建好的地图如图所示,使用map_server功能包保存地图:

在这里插入图片描述

AMCL导航

(1)打开导航的仿真环境

利用rviz中的2D Nav Goal设置目标点,之后全局规划器会在地图上生成一个轨迹,如下图中的绿线:
在这里插入图片描述

(2)机器人到达目标点:

在这里插入图片描述

更复杂的环境

(1)在以上的基础上,可以把turtlebot2加到更复杂的环境当中

例如中科院软件博物馆仿真环境,但是需要修改一些参数。在rviz中可以看到kinect相机的信息和机器人周围的雷达信息。
在这里插入图片描述

(2)使用gmapping算法建图:

在这里插入图片描述

(3)建好的地图:

在这里插入图片描述

(4)AMCL导航

打开AMCL导航仿真环境,设置目标点后,全局规划器在地图上生成轨迹(绿色线)
在这里插入图片描述

(5)机器人到达目标点:

在这里插入图片描述

实验心得

(1)gmapping

在这里插入图片描述
其中的深度信息就是kinect相机和rplidar雷达的信息,在没加入rplidar之前之所以地图会发生漂移,就是因为深度信息采集的不够,不足以估计机器人的当前位姿。

(2)AMCL

AMCL定位过程如下图所示,可以估计机器人在地图坐标系/map下的位姿信息,提供/base、/odom、/map之间的TF变换;
在这里插入图片描述

(3)move_base

move_base中的全局规划和本地规划如下图所示,全局规划器和本地规划器可以保证机器人在沿着全局路径移动过程中实时避障。
在这里插入图片描述

(4)总结

本实验过程中涉及到非常多的参数,需要有耐心,尤其是将turtlebot2加到中科院软件博物馆仿真环境,存在很多细节。有时候终端里出现的错误很可能就是某一个参数没有调试好,所以本次实验也为今后的学习提供了许多经验。