做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
可能会没有安装功能包,所以我们需要安装功能包:
git clone https://github.com/ros-planning/navigation.git
之后回到工作空间目录下面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
接下来我们来启动演示一下:
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch roslaunch mbot_navigation hector_demo.launch roslaunch mbot_teleop mbot_teleop.launch
效果如下:
但是这种方法如果机器人运动的速度过大的话就会使得建图出现偏差。建图过程中特征点比较多的话,建图效果会比较好。
Cartographer功能包:
这个功能包是2016年10月5日谷歌开源的基于图网络的优化方法,是一种二维或三维条件下的定位及建图功能,设计的目的是在计算资源有限的情况下,实时获取相对较高精度的2D地图,主要是基于激光雷达,后面会支持更多传感器和机器人平台,同时不断增加新的功能。 安装: 安装工具:
sudo apt-get update sudo apt-get install -y python-wstool python-rosdep ninja-build
创建一个名字为google_ws的文件夹作为我们的工作空间:
wstool init src
wstool merge -t src https://raw.githubusercontent.com/googlecartographer/cartographer_ros/master/cartographer_ros.rosinstall
wstool update -t src
上面第二步可能会有网络问题,我们可以到src目录下面ctrl+h打开隐藏文件夹,修改里面第三个包的下载地址: https://github.com/ceres-solver/ceres-solver.git
下载功能包:
src/cartographer/scripts/install_proto3.sh
lsb_release -a
查看自己的ubuntu版本号:
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y --os=ubuntu:xenial
这里我之前由于没有加后面这个os报错如下,加了之后就没有了:
ERROR: the following packages/stacks could not have their rosdep keys resolved to system dependencies: cartographer: No definition of [eigen] for OS version [] ceres-solver: No definition of [eigen] for OS version []
编译功能包:
catkin_make_isolated --install --use-ninja
source install_isolated/setup.bash #当前终端有效
接下来我们可以演示一下效果: 下载 2D SLAM Demo:
wget -P ~/Downloads https://storage.useso.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag
启动 2D SLAM Demo:
roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag
下载 3D SLAM Demo:
wget -P ~/Downloads https://storage.useso.com/cartographer-public-data/bags/backpack_3d/with_intensities/b3-2016-04-05-14-14-00.bag
启动 3D SLAM Demo:
roslaunch cartographer_ros demo_backpack_3d.launch bag_filename:=${HOME}/Downloads/b3-2016-04-05-14-14-00.bag
下载PR2 Demo:
wget -P ~/Downloads https://storage.useso.com/cartographer-public-data/bags/pr2/2011-09-15-08-32-46.bag
启动PR2 :
roslaunch cartographer_ros demo_pr2.launch bag_filename:=~/Downloads/
2011-09-15-08-32-46.bag
ORB_SLAM功能包 基于特征点的实时单目SLAM系统,实时解算摄像机的移动轨迹,构建三维点云地图,不仅适用与手持设备获取的一组连续图像,也可以应用于汽车行驶过程中获取的连续图像。 安装: 安装工具&下载源码:
sudo apt-get install libboost-all-dev libblas-dev liblapack-dev git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
安装eigen3.2 去官网下载:http://eigen.tuxfamily.org/index.php?title=Main_Page 解压源码包,并进入目录:
mkdir build cd build cmake .. make sudo make install
编译安装Pangolin
sudo apt-get install libglew-dev sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev git clone https://github.com/stevenlovegrove/Pangolin.git cd Pangolin mkdir build cd build cmake .. cmake –build .
编译g2o:
cd ~/ORB_SLAM2/Thirdparty/g2o/ mkdir build cd build cmake .. -DCMAKE_BUILD_TYPE=Release make
编译DBoW2:
cd ~/ORB_SLAM2/Thirdparty/DBoW2/ mkdir build cd build cmake .. -DCMAKE_BUILD_TYPE=Release make
编译ORM_SLAM:
cd ~/ORB_SLAM2 chmod +x build.sh ./build.sh
在make -j4这一步的时候,如果你遇到了error: ‘usleep’ was not declared in this scope,这种问题的话,你需要找到出错的文件,添加头文件:
#include <unistd.h>
Examples/Monocular/mono_euroc.cc
Examples/Monocular/mono_kitti.cc
Examples/Monocular/mono_tum.cc
Examples/RGB-D/rgbd_tum.cc
Examples/Stereo/stereo_euroc.cc
Examples/Stereo/stereo_kitti.cc
src/LocalMapping.cc
src/LoopClosing.cc
src/System.cc
src/Tracking.cc
src/Viewer.cc
爆炸,我之前装的是opencv3,装不上去,不想卸载,也不想装两个版本opencv,以后再说。 https://github.com/raulmur/ORB_SLAM2 我的微信公众号名称:深度学习与先进智能决策 微信公众号ID:MultiAgent1024 公众号介绍:主要研究强化学习、计算机视觉、深度学习、机器学习等相关内容,分享学习过程中的学习笔记和心得!期待您的关注,欢迎一起学习交流进步!