TurtleBot3激光SLAM自主导航ROS仿真
本文开发环境为Ubuntu 16.04,ROS版本为Kinetic
一、理论基础
1. 移动机器人导航基础
机器人实现自主导航至少需要以下几点:
① 地图
② 测量或估计机器人的姿态的功能
③ 识别障碍物,如墙壁和物体的功能
④ 能够计算出最优路线并行驶的功能
2. 地图
SLAM(Simultaneous localization and mapping)是在机器人移动到未知空间时通过探测周围环境来估计当前位置并同时绘制地图的方法。
在ROS中,地图信息以*.pgm文件格式(portable graymap format)存储和使用。它还包含一个*.yaml文件,它也包含地图信息。yaml文件如下所示。image是地图的文件名,而resolution是地图的分辨率,单位是meters/pixel。
image: map.pgm
resolution: 0.050000
origin: [-10.000000, -10.000000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196
也就是说,每个像素意味着5厘米。origin是地图的原点,origin的每个数字代表x、y和yaw。地图的左下角是x = -10m,y = -10m。negate会反转黑白。每个像素的颜色如下确定:由当占用概率超过占用阈值(occupied_thresh)时表示为黑色的占用区域,而当占用概率小于自由阈值(free_thresh)时表示为白色的自由区域(free area)。
3. 测量或估计机器人姿态的功能
当前的室内机器人用的最多的是导航推测(dead reckoning)。它的缺点是只能估算相对位置,但因为仅用廉价的传感器就能实现,且已有较长时间的研究进展,因此可以得到一定水平的位置估计值,因此被广泛使用。导航推测技术用机器人的车轮的旋转量来估计机器人本身的移动量。但车轮的旋转量具有不少的误差。
4. 识别障碍物,如墙壁和物体
此时用到距离传感器、视觉传感器等多种传感器。其中距离传感器有基于雷达的距离传感器(常用的是LDS、LRF和LiDAR)、超声波传感器和红外距离传感器等,而视觉传感器包括立体相机、单镜相机、360度相机,以及经常用作深度摄像头的RealSense、Kinect和Xtion也都用于识别障碍物。
5. 计算最优路径和行驶功能
导航(Navigation)功能是计算到达目的地的最优路径,并且驱动机器人按照最优路径到达目的地的功能。实现这个功能的算法有很多种:称为路径搜索和规划的A*算法、势场算法、粒子过滤算法和RRT(Rapidly-exploring Random Tree)算法等。
二、实际应用
1. 准备工作
安装相关依赖包
sudo apt-get install ros-kinetic-joy ros-kinetic-teleop-twist-joy ros-kinetic-teleop-twist-keyboard ros-kinetic-laser-proc ros-kinetic-rgbd-launch ros-kinetic-depthimage-to-laserscan ros-kinetic-rosserial-arduino ros-kinetic-rosserial-python ros-kinetic-rosserial-server ros-kinetic-rosserial-client ros-kinetic-rosserial-msgs ros-kinetic-amcl ros-kinetic-map-server ros-kinetic-move-base ros-kinetic-urdf ros-kinetic-xacro ros-kinetic-compressed-image-transport ros-kinetic-rqt-image-view ros-kinetic-gmapping ros-kinetic-navigation
安装turtlebot3相关ROS包
cd ~/catkin_ws/src/
git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
cd ~/catkin_ws && catkin_make
2. 建图
打开一个终端,运行现有的环境节点
roslaunch turtlebot3_gazebo turtlebot3_stage_1.launch
打开第二个终端,运行键盘控制节点,建图时切换到改终端用键盘控制turtlebot3运动
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
打开第三个终端,运行slam节点
roslaunch turtlebot3_slam turtlebot3_slam.launch
这里重要的是不要过快改变机器人的速度,也不要以过快的速度前进、后退或旋转。移动机器人时,机器人必须扫描要测量的环境的每个角落。这需要经验和技巧,因此需要在大量的SLAM实验中积累经验。
建图后要保存地图文件.pgm和.yaml
mkdir -p ~/maps
rosrun map_server map_saver -f ~/maps/yourmap #yourmap为要保存的文件名
3. 导航
用刚才保存的地图进行turtlebot3的自主导航仿真实验
roslaunch turtlebot3_gazebo
turtlebot3_house.launch
roslaunch turtlebot3_navigation
turtlebot3_navigation.launch
map_file:=/home/user/maps/yourmap.yaml
当在RViz的菜单中按下[2D Pose Estimate]时,会出现一个非常大的绿色箭头。将其移动到机器人在给定的地图中所在的位置,并按住鼠标键的同时,拖动绿色箭头使其指向机器人的前方。这是一种在初期为了估计机器人位置的命令。然后用turtlebot3_teleop_keyboard节点等来回移动机器人,搜集周围的环境信息,找出机器人当前位于地图上的位置。经过了这个过程后,机器人将绿色箭头指定的位置和方向作为初始位置,推定自己的位置和方向。
一切准备就绪后,下面下达移动命令。如果在RViz的菜单中按[2D Nav Goal],会出现一个非常大的绿色箭头。该绿色箭头是指定机器人的目的地的标记,箭头的起点是机器人的x、y位置,箭头方向是机器人的i方向。将此箭头移动到机器人的目的地,然后拖动,以设置方向。机器人将根据创建的地图躲避障碍物,移动到目的地,过程如下图所示: