接上篇http://www.reibang.com/p/fb91063a9fd7
rtabmap算法簡(jiǎn)介
rtabmap全名是Real-Time Appearance-Based Mapping, 是一個(gè)基于RGB-D, Stereo和雷達(dá)的Graph-Based SLAM算法,并使用了增長(zhǎng)式閉環(huán)檢測(cè)。具體算法詳解請(qǐng)看:https://blog.csdn.net/xmy306538517/article/details/78771104
其中包括使用詞袋法优烧,SURF特征檢測(cè)等算法。
安裝rtabmap算法
具體步驟可以根據(jù)官方網(wǎng)站:https://github.com/introlab/rtabmap_ros#installation
要在workspace中配置的趋箩,可從"Build from source"開(kāi)始follow。
運(yùn)行官方Demo:
由于官方Demo在google drive,鑒于種種原因加派,已轉(zhuǎn)放在鏈接: https://pan.baidu.com/s/1MgxAjnfi2NYk_v9x7MmR5w 提取碼: 7y9s
$ roslaunch rtabmap_ros demo_robot_mapping.launch
$ rosbag play --clock demo_mapping.bag
運(yùn)行沒(méi)問(wèn)題即安裝完成叫确。
在gazebo世界啟動(dòng)機(jī)器人并運(yùn)行rtabmap建圖
先上視頻連接:http://www.iqiyi.com/w_19s9z71je9.html
先看啟動(dòng)rtabmap算法的launch文件:rgbd_mapping.launch
<launch>
<!-- Choose visualization -->
<arg name="rviz" default="false" />
<arg name="rtabmapviz" default="true" />
<!-- Localization-only mode -->
<arg name="localization" default="false"/>
<!-- Corresponding config files -->
<arg name="rtabmapviz_cfg" default="~/.ros/rtabmap_gui.ini" />
<arg name="rviz_cfg" default="$(find rtabmap_ros)/launch/config/rgbd.rviz" />
<arg name="frame_id" default="base_link"/> <!-- Fixed frame id, you may set "base_link" or "base_footprint" if they are published -->
<arg name="database_path" />
<arg name="rtabmap_args" default=""/>
<arg name="launch_prefix" default=""/> <!-- for debugging purpose, it fills launch-prefix tag of the nodes -->
<arg name="approx_sync" default="true"/> <!-- if timestamps of the input topics are not synchronized -->
<arg name="rgb_topic" default="/rgb/image_raw" />
<arg name="depth_registered_topic" default="/depth/image_raw" />
<arg name="camera_info_topic" default="/rgb/camera_info" />
<arg name="compressed" default="false"/>
<arg name="subscribe_scan" default="true"/> <!-- Assuming 2D scan if set, rtabmap will do 3DoF mapping instead of 6DoF -->
<arg name="scan_topic" default="/robot/laser/scan"/>
<arg name="subscribe_scan_cloud" default="false"/> <!-- Assuming 3D scan if set -->
<arg name="scan_cloud_topic" default="/scan_cloud"/>
<arg name="visual_odometry" default="true"/> <!-- Generate visual odometry -->
<arg name="odom_topic" default="/odom"/> <!-- Odometry topic used if visual_odometry is false -->
<arg name="odom_frame_id" default=""/> <!-- If set, TF is used to get odometry instead of the topic -->
<arg name="namespace" default="rtabmap"/>
<arg name="wait_for_transform" default="0.2"/>
<include file="$(find rtabmap_ros)/launch/rtabmap.launch">
<arg name="rtabmapviz" value="$(arg rtabmapviz)" />
<arg name="rviz" value="$(arg rviz)" />
<arg name="localization" value="$(arg localization)"/>
<arg name="gui_cfg" value="$(arg rtabmapviz_cfg)" />
<arg name="rviz_cfg" value="$(arg rviz_cfg)" />
<arg name="frame_id" value="$(arg frame_id)"/>
<arg name="namespace" value="$(arg namespace)"/>
<arg name="database_path" value="$(arg database_path)"/>
<arg name="wait_for_transform" value="$(arg wait_for_transform)"/>
<arg name="rtabmap_args" value="$(arg rtabmap_args)"/>
<arg name="launch_prefix" value="$(arg launch_prefix)"/>
<arg name="approx_sync" value="$(arg approx_sync)"/>
<arg name="rgb_topic" value="$(arg rgb_topic)" />
<arg name="depth_topic" value="$(arg depth_registered_topic)" />
<arg name="camera_info_topic" value="$(arg camera_info_topic)" />
<arg name="compressed" value="$(arg compressed)"/>
<arg name="subscribe_scan" value="$(arg subscribe_scan)"/>
<arg name="scan_topic" value="$(arg scan_topic)"/>
<arg name="subscribe_scan_cloud" value="$(arg subscribe_scan_cloud)"/>
<arg name="scan_cloud_topic" value="$(arg scan_cloud_topic)"/>
<arg name="visual_odometry" value="$(arg visual_odometry)"/>
<arg name="odom_topic" value="$(arg odom_topic)"/>
<arg name="odom_frame_id" value="$(arg odom_frame_id)"/>
<arg name="odom_args" value="$(arg rtabmap_args)"/>
</include>
</launch>
這里主要是有幾處改動(dòng):
在frame_id屬性,須設(shè)定為機(jī)器人的根節(jié)點(diǎn)(base_link or base_footprint)芍锦,如果只是用相機(jī)竹勉,因?yàn)槭菃我还?jié)點(diǎn),所以只需要設(shè)為所用傳感器的frame_id即可娄琉。database_path是指定要儲(chǔ)存建圖數(shù)據(jù)庫(kù)的存放地址次乓,原本設(shè)定為一個(gè)默認(rèn)路徑,但是鑒于在每次建圖時(shí)孽水,不設(shè)定的話會(huì)進(jìn)行覆蓋檬输,為避免此種情況,盡量手動(dòng)指定路徑匈棘。
這里定義的topic 是對(duì)應(yīng)上gazebo文件中定義的topic名稱。
這里是說(shuō)明是否接受雷達(dá)數(shù)據(jù)析命,因?yàn)樵谏掀恼轮兄魑溃玫臋C(jī)器人文件有使用雷達(dá)插件逃默,因此這里啟用,并定義相應(yīng)的topic 名稱簇搅。
這里是引用了另外的launch文件完域,實(shí)際上是同時(shí)運(yùn)行了rtabmap.launch文件并傳入了參數(shù)。
啟動(dòng)launch文件:
roslaunch rtabmap_ros rgbd_mapping.launch database_path:=~/dev/catkin_ws/rtabmap.db
打開(kāi)后:
完成建圖后瘩将,打開(kāi)建圖數(shù)據(jù)庫(kù):
打開(kāi)3d地圖:
至此吟税,基于gazebo仿真rtabmap算法就完成了。
目前還沒(méi)涉及到建圖結(jié)果和ground truth數(shù)據(jù)的比對(duì)姿现,后續(xù)將會(huì)嘗試記錄為rosbag肠仪,并從中根據(jù)topic導(dǎo)出csv文件,與建圖后的csv文件進(jìn)行比對(duì)备典,評(píng)估建圖效果异旧。
參考連接:http://wiki.ros.org/rtabmap_ros/Tutorials/HandHeldMapping