做SLAM的硬件要求(不一定是必须的,看包和库的依赖):
(1):差分轮式机器人,可以使用Twist速度指令控制,需要线速度和角速度。
(2):需要激光雷达、深度摄像头等测距设备,可以获取环境深度信息。
(3):最好使用正方形和圆形的机器人,其他外形的机器人虽然可以正常使用,但是效果可能不佳。
机器人的深度信息里面需要包含什么内容。可以通过以下命令来对其进行查看:
rosmsg show sensor_msgs/LaserScan
最上面三行包括序列、时间戳、坐标系。下面的话就是一些关于激光雷达的数据:
angle_min:可检测范围的起始角度。
angle_max:可检测范围的终止角度,与angle_min组成激光雷达的可检测范围。像从-180度到+180度就是360度的范围。
angle_increment:相邻数据帧之间的角度步长。
time_increment:采集到相邻数据帧之间的时间步长,当传感器处于相对运动状态时进行补偿使用。
scan_time:采集一帧数据所需的时间。
range_min:最近可检测深度的阈值。
range_max:最远可检测深度的阈值。
ranges:一帧深度数据的存储数组(深度数据的具体内容)。
最后面的intensities代表的是激光的反光属性,等等的这样一些性质。一般的低成本雷达在强度这一块是用不到的。高端的雷达才会使用它做辅助判断。
除了激光雷达,深度摄像头也是可以采集深度信息的,像kinetic这样的摄像头就可以。在ros里面depthimage_to_laserscan功能包就能把三维点云数据转换成二维的激光雷达数据。但是深度摄像头的精度不高。
机器人里面的里程计信息
你可以通过下面的命令查看一下里程计信息:
rosmsg show nav_msgs/Odometry
里面主要包含两个内容,一个是pose,一个是twist。
pose:机器人当前位置坐标,包括机器人的XYZ三轴位置与方向参数,以及用于校正误差的协防差矩阵。里面有位置信息position和姿态信息orientation。
twist:机器人当前的运动状态,包括XYZ三轴的线速度与角速度,以及用于校正误差的协防差矩阵。
在这里的话,我们主要以仿真环境来演示效果:
代码的包在教学视频的文件里面有,我们打开一个终端运行以下命令:
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
运行成功之后会打开下面这样的一个界面:
接下来我们看一下一些SLAM的功能包:
Gmapping功能包:
基于激光雷达的功能包,采用Rao-Blackwellized粒子滤波算法创建二维栅格地图。调用gmapping功能包的时候需要给它三个信息的输入:(1):深度信息。(2):IMU信息。(3)里程计信息。gmapping的算法来自于OpenSlam的开源算法。输出是nav_msgs/OccupancyGrid这样的栅格地图。
我们可以通过以下方式对其进行安装:
sudo apt-get install ros-kinetic-gmapping
gmapping里面有一个核心的节点,我们要使用gmapping建图的话我们就需要去启动这个核心的节点。启动的方式是使用.launch文件来启动的。因为这里面有很多参数需要去配置。改变这个参数能够改变我们建图的效果。但是如果我们只是为了能够使用建图功能的话,我们可以去参考turtlebot机器人的建图功能就可以了。我们可以去roswiki上面看一下功能包的使用方法。
输入以下命令:
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
roslaunch mbot_navigation gmapping_demo.launch
roslaunch mbot_teleop mbot_teleop.launch
建图完成之后效果如下:
我们可以通过下面这个命令来将地图保存:
rosrun map_server map_saver -f cloister_gmappingg
可能会没有安装功能包,所以我们需要安装功能包:
之后回到工作空间目录下面catkin_make。
可能会需要依赖:
sudo apt-get install ros-kinetic-tf2-sensor-msgs
这种安装方式不会使得你出现以下这种错误:
[rosrun] Couldn't find executable named map_save below /opt/ros/kinetic/share/map_server
保存之后会有两个文件:
第一个是一张图片,第二个是一些说明文件:
第一个是图片的名称,第二个是图片的分辨率,0.05米,origin代表的是机器人的位置,下一次导航的时候可以把机器人放到这个位置。
Hector_slam功能包:
基于激光雷达建图,采用高斯牛顿方法,是二维栅格地图,不需要里程计数据,输出地图话题。可以通过以下命令对其进行安装:
sudo apt-get install ros-kinetic-hector-slam