1.机器人必备条件

a.硬件要求

1).差分轮式机器人,可使用Twist速度指令控制

  • linear:XYZ方向上的线速度,单位是m/s
  • angular:XYZ方向上的角速度,单位是rad/s

2).机器人必须安装激光雷达等测距设备,可以获取环境深度信息

3).最好使用正方形和圆形的机器人,其他外形的机器人虽然可以正常使用,但是效果很可能不佳

b.深度信息

  • angle_min:可检测范围的起始角度
  • angle_max:可检测范围的终止角度,与angle_min组成激光雷达的可检测范围
  • angle_increment:相邻数据帧之间的角度步长
  • time_increment:采集到相邻数据帧之间的时间步长,当传感器处于相对运动状态时进行补偿使用
  • scan_time:采集一帧数据所需要的时间
  • range_min:最近可检测深度的阈值
  • range_max:最远可检测深度的阈值
  • ranges:一帧深度数据的存储数组

Kinect等RGB-D摄像头,也可以通过红外摄像头获取周围环境的深度信息

c.里程计信息

  • pose:机器人当前位置坐标,包括机器人的XYZ三轴位置与方向参数,以及用于校正误差的协方差矩阵
  • twist:机器人当前的运动状态,包括XYZ三轴的线速度与角速度,以及用于校正误差的协方差矩阵

坐标系方向(右手坐标系)

d.仿真环境

roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
使用Building Editor创建仿真环境cloister.world

2.SLAM功能包的应用

gmapping功能包

  • 1).基于激光雷达
  • 2).Rao-Blackwellized粒子滤波算法
  • 3).二维栅格地图
  • 4).需要机器人提供里程计信息
  • 5).OpenSlam开源算法
  • 6).输出地图话题:nav_msgs/OccupancyGrid
gmapping功能包的总体框架

安装gmapping功能包

sudo apt-get install ros-kinetic-gmapping

gmapping功能包中的话题和服务

gmapping功能包中的TF变换

  • 致命障碍:栅格值为254,障碍物与机器人的中心重合,此时机器人必然与障碍物发生碰撞
  • 内切障碍:栅格值为253,障碍物处于机器人轮廓的内切圆内,此时机器人也必然与障碍物发生碰撞
  • 外切障碍:栅格值为252~128,障碍物处于机器人的轮廓的外切圆内,此时机器人与障碍物临界接触,不一定发生碰撞
  • 非自由空间:栅格值为128~0,障碍物附近区域,一旦机器人进入该区域,将有较大概率发生碰撞,属于危险警戒区,机器人应该尽量避免进入
  • 自由区域:栅格值为0,此处没有障碍物,机器人可以自由通过
  • 未知区域:栅格值为255,此处还没有探知是否有障碍物,机器人可以前往继续建图
栅格地图取值原理

配置gmapping节点 mbot_navigation/launch/gmapping.launch

启动gmapping演示(激光雷达)

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_gmapping

启动gmapping演示(Kinect)

roslaunch mbot_gazebo mbot_kinect_nav_gazebo.launch
roslaunch mbot_navigation gmapping_demo.launch
roslaunch mbot_teleop mbot_teleop.launch

真实机器人gmapping建图示例

roslaunch mbot_bringup mbot_with_laser.launch (机器人端)
roslaunch mbot_navigation gmapping_demo.launch(PC端)
roslaunch mbot_teleop mbot_teleop.launch	  (PC端)

hector_slam功能包

  • 1).基于激光雷达
  • 2).高斯牛顿方法
  • 3).二维栅格地图
  • 4).不需要里程计数据
  • 5).输出地图话题 nav_msgs/OccupancyGrid
hector_slam功能包整体框架

安装hector_slam功能包

sudo apt-get install ros-kinect-hector-slam

hector-slam功能包中的话题和服务

hector-slam功能包中的TF变换

配置hector_mapping节点 mbot_navigation/launch/hector.launch

启动hector_slam演示

roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
roslaunch mbot_navigation hector_demo.launch
roslaunch mbot_teleop mbot_teleop.launch

真实机器人hector_slam建图示例

roslaunch mbot_bringup mbot_with_laser.launch  (机器人端)
roslaunch mbot_navigation hector_demo.launch		(PC端)
roslaunch mbot_teleop mbot_teleop.launch	  		(PC端)

cartographer功能包

  • 1).2016年10月5日 Google开源的
  • 2).基于图网络的优化方法
  • 3).二维或三维条件下的定位及建图功能
  • 4).设计目的是在计算资源有限的情况下,实时获取相对较高精度的2D地图
  • 5).主要基于激光雷达
  • 6).后续会支持更多传感器和机器人平台,同时不断添加新的功能

a、安装工具:

sudo apt-get update
sudo apt-get install -y python-wstool python-rosdep ninja-build

b、初始化工作空间

cd catkin_google_ws
wstool init src 

c、设置下载地址

wstool merge -t src https://raw.githubusercontent.com/googlecartographer/cartographer_ros/master/cartographer_ros.rosinstall
wstool update -t src

d、下载功能包

rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y

e、编译功能包

catkin_make_isolated --install --use-ninja 
source install_isolated/setup.bash

可能会出现的问题

  • 1).网络连接问题 修改src/.rosinstall文件中ceres-solver功能包源码的下载地址
  • 2).protobuf版本问题 下载protobuf最新版源码,编译安装:

启动2D slam demo演示

wget -p ~/Downloads https://storage.googleapis.com/cartographr-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag
roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=~/Downloads/cartographer_paper_deutsches_museum.bag

启动3D slam demo演示

wget -p ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_3d/b3-2016-04-05-14-14-00.bag
roslaunch cartographer_ros demo_backpack_3d.launch bag_filename:=~/Downloads/b3-2016-04-05-14-14-00.bag

启动Revo LDS demo演示

wget -p ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/revo_lds/cartographer_paper_revo_lds.bag
roslaunch cartographer_ros demo_revo_lds.launch bag_filename:=~/Downloads/cartographer_paper_revo_lds.bag

启动PR2 demo演示

wget -p ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/pr2/2011-09-15-08-32-46.bag
roslaunch cartographer_ros demo_pr2.launch bag_filename:=~/Downloads/2011-09-15-08-32-46.bag
配置cartographer节点

启动cartographer仿真

catkin_make_isolated --install --use-ninja
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
roslaunch cartographer_ros cartographer_demo_rplidar.launch
roslaunch mbot_teleop mbot_teleop.launch

真实机器人cartographer建图

roslaunch mbot_bringup mbot_with_laser.launch				(机器人端)
roslaunch cartographer_ros cartographer_demo_rplidar.launch (PC端)
roslaunch mbot_teleop mbot_teleop.launch				 	(PC端)

ORB_SLAM功能包

1).基于特征点的实时单目SLAM系统
2).实时解算摄像机的移动轨迹
3).构建三维点云地图
4).不仅适用于手持设备获取的一组连续图像,也可以应用于汽车行驶过程中获取的连续图像
5).2015年发表在IEEE Transactions on Robotics上

项目主页

a、安装工具下载源码

sudo apt-get install libboost-all-dev libblas-dev liblapack-dev
git clone raulmur/ORB_SLAM2

b、安装eigen3.1

解压源码包,并进入目录

mkdir build 
cd build
cmake ..
make
sudo make install

c、编译g2o

cd ORB_SLAM-master/Thirdparty/g2o/
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make

d、编译DBoW2

cd ORB_SLAM-master/Thirdparty/DBoW2/
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make

e、编译ORB_SLAM

cd ORB_SLAM
mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release
make

f、编译功能包

export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:ORB_SLAM_PATH/ORB_SLAM2/Examples/ROS
chmod +x build_ros.sh
./build_ros.sh
source ORB_SLAM2/Examples/ROS/ORB_SLAM2/build/devel/setup.bash

3.ROS中的导航框架

sudo apt-get install ros-kinetic-navigation

导航框架move_base

1).全局路径规划(global planner)

  • a.全局最优路径规划
  • b.Dijkstra或A*算法

2).本地实时规划(local planner)

  • a.规划机器人每个周期内的线速度、角速度,使之尽量符合全局最优路径
  • b.实时避障
  • c.Trajectory Rollout和Dynamic Window Approaches算法
  • d.搜索躲避和行进的多条路径,综合各评价标准选取最优路径

move_base功能包中的话题和服务

配置move_base节点 mbot_navigation/launch/move_base.launch

导航框架amcl

  • 1).蒙特卡罗定位方法
  • 2).二维环境定位
  • 3).针对已有地图使用粒子滤波跟踪一个机器人的姿态

amcl功能包中的话题和服务

  • 里程计定位:只通过里程计的数据来处理/base和/odom之间的TF转换
  • amcl定位:可以估算机器人在地图坐标系/map下的位姿信息,提供/base、/odom、/map之间的TF变换

配置amcl节点 mbot_navigation/launch/amcl.launch

4.导航框架的应用

导航示例

roslaunch rbx1_bringup fake_turtlebot.launch
roslaunch rbx1_nav fake_move_base_map_with_obstacles.launch
rosrun rviz rviz -d `rospack find rbx1_nav` /nav_obstacles.rviz
rosrun rbx1_nav move_base_square.py

仿真导航

roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
roslaunch mbot_navigation nav_cloister_demo.launch

导航SLAM仿真

roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
roslaunch mbot_navigation exploring_slam_demo.launch

自主探索SLAM仿真

roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
roslaunch mbot_navigation exploring_slam_demo.launch
rosrun mbot_navigation exploring_slam.py