首页 > 【SLAM建图和导航仿真实例】(三)- 使用RTAB-MAP进行SLAM建图和导航

【SLAM建图和导航仿真实例】(三)- 使用RTAB-MAP进行SLAM建图和导航

引言

在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是

  • (一)模型构建
  • (二)根据已知地图进行定位和导航
  • (三)使用RTAB-MAP进行建图和导航

该项目的slam_bot已经上传我的Github。

这是第三部分,完成效果如下

在这里插入图片描述

图1 建图和导航

三、使用RTAB-Map进行建图和导航

1. rtabmap_ros介绍

之前在GraphSLAM博客中我提到了RTAB-Map。

RTAB-Map是具有实时约束的RGB-D SLAM方法,它是一种基于增量基于外观的闭环检测器的RGB-D,基于立体声和激光雷达图的SLAM方法。闭环检测器使用词袋方法来确定新图像来自先前位置或新位置的可能性。当接受循环闭合假设时,新约束将添加到地图的图形中,然后图形优化器将地图中的错误最小化。使用内存管理方法来限制用于闭环检测和图形优化的位置数量,以便始终遵守对大型环境的实时约束。

代码库:

https://github.com/introlab/rtabmap_ros.git

http://introlab.github.io/rtabmap

节点:

所有sensor_msgs/Image话题使用image_transport.

rtabmap

这是核心节点,是RTAB-Map核心库的封装,这是在检测到循环闭合时增量构建和优化地图的图形。

节点的在线输出是具有地图上最新添加数据的本地图。

默认RTAB-Map 数据库的位置是 “~/.ros/rtabmap.db”,工作空间也设置为 “~/.ros”

通过订阅cloud_map话题获取3D点云图, grid_map or proj_map话题获取2D网格图

rtabmapviz

RTAB-Map的可视化接口,是 RTAB-Map GUI图形库的封装,类似rviz但有针对RTAB-Map的可选项

2.rtabmap_ros安装

安装kinetic版本:

$ sudo apt-get install ros-kinetic-rtabmap-ros

必要的依赖安装 (Qt, PCL, VTK, OpenCV, …):

$ sudo apt-get install ros-kinetic-rtabmap ros-kinetic-rtabmap-ros
$ sudo apt-get remove ros-kinetic-rtabmap ros-kinetic-rtabmap-ros

下载安装RTAB-Map

源码安装rtabmap

$ cd ~
$ git clone https://github.com/introlab/rtabmap.git rtabmap
$ cd rtabmap/build
$ cmake -DCMAKE_INSTALL_PREFIX=~/catkin_ws/devel ..
$ make -j4
$ make install

源码安装rtabmap_ros

$ cd ~/catkin_ws
$ git clone https://github.com/introlab/rtabmap_ros.git src/rtabmap_ros
$ catkin_make -j1 

内存太小的话,使用-j1 ,内存大可以去掉。

3.创建启动文件

根据ROS wiki的建议,我们可以用类似以下的方式搭建mapping的启动文件。

在这里插入图片描述

图3-1 Kinect + Odometry + 2D laser
<launch><arg name="database_path"     default="rtabmap.db"/><arg name="rgb_topic"   default="/camera/rgb/image_raw"/><arg name="depth_topic" default="/camera/depth/image_raw"/><arg name="camera_info_topic" default="/camera/rgb/camera_info"/>  <group ns="rtabmap"><node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="--delete_db_on_start"><param name="database_path"       type="string" value="$(arg database_path)"/><param name="frame_id"            type="string" value="base_footprint"/><param name="odom_frame_id"       type="string" value="/odom"/><param name="subscribe_depth"     type="bool"   value="true"/><param name="subscribe_scan"      type="bool"   value="true"/><remap from="scan"            to="/slam_bot/laser/scan"/><remap from="rgb/image"       to="$(arg rgb_topic)"/><remap from="depth/image"     to="$(arg depth_topic)"/><remap from="rgb/camera_info" to="$(arg camera_info_topic)"/><remap from="grid_map" to="/map"/><param name="Rtabmap/DetectionRate" type="string" value="1"/> <param name="Reg/Force3DoF" type="string" value="true"/>  <param name="Reg/Strategy" type="string" value="0"/>  <param name="Kp/DetectorStrategy" type="string" value="0"/> <param name="Kp/MaxFeatures" type="string" value="400"/>  <param name="SURF/HessianThreshold" type="string" value="100"/><param name="Vis/MinInliers" type="string" value="15"/> <param name="Mem/NotLinkedNodesKept" type="string" value="false"/>node> group>
launch>

让我们分解一下这个启动文件:

      <param name="database_path"       type="string" value="$(arg database_path)"/>

参数---delete_db_on_start将使rtabmap在启动时删除数据库(默认位于~/.ros/rtabmap.db)。如果想让机器人继续从之前的映射会话中进行映射,应该删除 --delete_db_on_start


      <param name="database_path"       type="string" value="$(arg database_path)"/><param name="frame_id"            type="string" value="base_footprint"/><param name="odom_frame_id"       type="string" value="/odom"/>

设置database_path,fixed frame和odom。


      <param name="subscribe_depth"     type="bool"   value="true"/><param name="subscribe_scan"      type="bool"   value="true"/>

默认情况下, subscribe_depth为true。但是,在这个设置中,我们将使用RGB-D图像输入,所以将subscribe_depth设置为false,将subscribe_rgbd设置为true。因为我们有一个2D lidar,所以将 subscribe_scan 设置为 true。如果我们有一个3D lidar发布sensor_msgs/PointCloud2消息,则将sensemble_scan_cloud设置为true,并重映射相应的scan_cloud主题而不是scan。

  • 当 subscribe_rgbd=true时,应设置 rgbd_image 输入主题。
  • 当 subscribe_scan=true时,需要设置扫描输入主题。

      <remap from="scan"            to="/slam_bot/laser/scan"/><remap from="rgb/image"       to="$(arg rgb_topic)"/><remap from="depth/image"     to="$(arg depth_topic)"/><remap from="rgb/camera_info" to="$(arg camera_info_topic)"/>

设置所需的输入主题。若话题没有/,则意味着在其命名空间中订阅了相应话题,例如“rgbd_image” 订阅/rtabmap/rgbd_image。


      <param name="Reg/Force3DoF" type="string" value="true"/>  <param name="Reg/Strategy" type="string" value="0"/>
  • Reg/Force3DoF:强制3DoF配准,不会估计roll、pitch和z。

  • Reg/Strategy:使用ICP来细化使用激光扫描发现的ICP的全局闭环。


以下是mapping.launch中没有提到的参数的简要概述。


<param name="RGBD/NeighborLinkRefining" type="string" value="true"/>
<param name="RGBD/ProximityBySpace"     type="string" value="true"/>
<param name="RGBD/AngularUpdate"        type="string" value="0.01"/>
<param name="RGBD/LinearUpdate"         type="string" value="0.01"/>
<param name="RGBD/OptimizeFromGraphEnd" type="string" value="false"/>
<param name="Grid/FromDepth"            type="string" value="false"/> 
<param name="Icp/VoxelSize"                 type="string" value="0.05"/>
<param name="Icp/MaxCorrespondenceDistance" type="string" value="0.1"/>
  • RGBD/NeighborLinkRefining:使用ICP对输入lidar主题进行正确的里程测量。

  • RGBD/ProximityBySpace:根据机器人在地图中的位置,寻找局部环形闭合。这在机器人朝反方向回来时非常有用。由于摄像头朝后,无法找到全局环形闭

更多相关:

  • 引言 在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是 (一)模型构建(二)根据已知地图进行定位和导航(三)使用RTAB-MAP进行建图和导航 该项目的slam_bot已经上传我的Github。 由于之前的虚拟机性能限制,我在这个项目中使用了新的ubantu 16.04环境,虚拟机配置 内存 8GCPU...

  • [{name:1},{name:2}].forEach((v,i,ar) => {console.log(v,i,ar)});//基础遍历[{name:1},{name:2}].map((v) => v.name);//[1,2]返回对象数组中指定字段值的一位数组(不改变原始数组)[{name:1},{name:2},{name:3}...

  • 体验内容 使用gmapping方法利用turtlebot底盘移动信息和激光雷达数据进行建图。 1. 安装一些依赖包 sudo apt-get install ros-melodic-move-base* sudo apt-get install ros-melodic-map-server* sudo apt-get insta...

  • 前言 我们知道Java/Python这种语言能够很好得 支持反射。反射机制 就是一种用户输入的字符串到对应实现方法的映射,比如http接口中 用户传入了url,我们需要调用该url对应的方法/函数对象 从而做出对应的操作。 而C++ 并没有友好得支持这样的操作,而最近工作中需要通过C++实现http接口,这个过程想要代码实现得优雅...

  •   测试用prototxt   name: "CIFAR10_quick"layer {name: "data" type: "MemoryData" top: "data" top: "label" memory_data_param {batch_size: 1     #样本个数 channels: 3 height: 32 w...

  •    话说每到吃完的时间就发愁,真的不知道该吃什么,然后就想到做一个生成吃什么的小软件,既然这个软件如此的简单,就打算用wpf开发吧,也不用数据库了,直接保存在xml中就可以了  程序整体结构如下图  首先我写了一个xml的帮助类,主要是写了个常用的增加方法 主程序界面也很简单,一共就两个页面 对应的两处代码也粘上 pr...

  •  翻页器

  •     在src/main/resources/springmvc-servlet.xml中加入

  • 本篇仅仅是一个记录 MergeOperator 的使用方式。 Rocksdb 使用MergeOperator 来代替Update 场景中的读改写操作,即用户的一个Update 操作需要调用rocksdb的 Get + Put 接口才能完成。 而这种情况下会引入一些额外的读写放大,对于支持SQL这种update 频繁的场景来说实在是不划...

  • 看了很多人写的好几个去重方法,我在这里精简组合下,适用于已排序与未排序的数组。 废话不多说,上代码。 数组去重