RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (2024)

1. RTAB-Map + EuRoC Datasets

示例代码:rtabmap_ros源代码中test目录下的euroc_datasets.launch:

<launch><!-- Examples: F2M (default VO): $ roslaunch rtabmap_ros euroc_datasets.launch $ rosbag play -.-clock V1_01_easy.bag For MH sequences, we should set MH_seq to true because the ground truth source is different. $ roslaunch rtabmap_ros euroc_datasets.launch MH_seq:=true $ rosbag play -.-clock MH_01_easy.bag MSCKF (VIO): $ roslaunch rtabmap_ros euroc_datasets.launch args:="Odom/Strategy 8" $ rosbag play -.-clock V1_01_easy.bag We need to ignore the first 24 seconds for correct VIO initialization (drone should not move). $ roslaunch rtabmap_ros euroc_datasets.launch args:="Odom/Strategy 8" MH_seq:=true $ rosbag play -.-clock -s 24 MH_01_easy.bag OKVIS (VIO): $ roslaunch rtabmap_ros euroc_datasets.launch args:="Odom/Strategy 6 OdomOKVIS/ConfigPath ~/okvis/config/config_fpga_p2_euroc.yaml" MH_seq:=true raw_images_for_odom:=true $ rosbag play -.-clock MH_01_easy.bag VINS (VIO): $ roslaunch rtabmap_ros euroc_datasets.launch args:="Odom/Strategy 9 OdomVINS/ConfigPath ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml" MH_seq:=true raw_images_for_odom:=true $ rosbag play -.-clock MH_01_easy.bag VINS (VO): $ roslaunch rtabmap_ros euroc_datasets.launch args:="Odom/Strategy 9 OdomVINS/ConfigPath ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml" MH_seq:=true raw_images_for_odom:=true $ rosbag play -.-clock MH_01_easy.bag--><param name="use_sim_time" value="true"/><arg name="feature_type" default="6"/><arg name="gravity_opt" default="false"/> <!-- Rtabmap will use IMU data to add gravity constraints to graph --><arg name="args" default=""/><arg if="$(arg gravity_opt)" name="common_args" default="-d --RGBD/CreateOccupancyGrid false --Odom/FeatureType $(arg feature_type) --Kp/DetectorStrategy $(arg feature_type) --Optimizer/GravitySigma 0.3 $(arg args)"/><arg unless="$(arg gravity_opt)" name="common_args" default="-d --RGBD/CreateOccupancyGrid false --Odom/FeatureType $(arg feature_type) --Kp/DetectorStrategy $(arg feature_type) $(arg args) "/><arg name="cfg" default=""/><arg name="MH_seq" default="false"/> <!-- For MH sequences, the ground truth is coming from a different topic --><arg name="raw_images_for_odom" default="false"/><arg name="record_ground_truth" default="false"/><arg name="rtabmapviz" default="true"/><arg name="rviz" default="false"/><!-- Image rectification and publishing synchronized camera_info--><group ns="stereo_camera"> <node pkg="rtabmap_ros" type="yaml_to_camera_info.py" name="yaml_to_camera_info_left"> <param name="yaml_path" value="$(find rtabmap_ros)/launch/calibration/euroc_left.yaml"/> <remap from="image" to="/cam0/image_raw"/> <remap from="camera_info" to="left/camera_info"/> </node> <node pkg="rtabmap_ros" type="yaml_to_camera_info.py" name="yaml_to_camera_info_right"> <param name="yaml_path" value="$(find rtabmap_ros)/launch/calibration/euroc_right.yaml"/> <param name="frame_id" value="cam1"/> <remap from="image" to="/cam1/image_raw"/> <remap from="camera_info" to="right/camera_info"/> </node> <node unless="$(arg raw_images_for_odom)" pkg="stereo_image_proc" type="stereo_image_proc" name="stereo_image_proc"> <remap from="left/image_raw" to="/cam0/image_raw"/> <remap from="right/image_raw" to="/cam1/image_raw"/> </node></group><!-- TF frames --><node pkg="tf" type="static_transform_publisher" name="imu_base_link" args="0 0 0 3.1415926 -1.570796 0 base_link imu4 5"/><node pkg="tf" type="static_transform_publisher" name="cam0_imu_link" args="-0.021640 -0.064677 0.009811 1.555925 0.025777 0.003757 imu4 cam0 50"/><node pkg="tf" type="static_transform_publisher" name="cam1_imu_link" args="-0.019844 0.045369 0.007862 1.558237 0.025393 0.017907 imu4 cam1 50"/> <!-- For MH sequences, /leica/position doesn't give the orientation, so minimal ground truth error could be as high as 12 cm --><node if="$(arg MH_seq)" pkg="tf" type="static_transform_publisher" name="leica_base_link" args="0.120209 -0.0184772 -0.0748903 0 0 0 leica base_link_gt 100"/> <node unless="$(arg MH_seq)" pkg="tf" type="static_transform_publisher" name="vicon_base_link" args="0.12395 -0.02781 -0.06901 0 0 0 vicon/firefly_sbx/firefly_sbx base_link_gt 100"/><node if="$(arg MH_seq)" pkg="rtabmap_ros" type="point_to_tf.py" name="point_to_tf"> <remap from="point" to="/leica/position"/> <param name="frame_id" value="leica"/> <param name="fixed_frame_id" value="world"/></node><node unless="$(arg MH_seq)" pkg="rtabmap_ros" type="transform_to_tf.py" name="transform_to_tf"> <remap from="transform" to="/vicon/firefly_sbx/firefly_sbx"/> <param name="frame_id" value="world"/> <param name="child_frame_id" value="vicon/firefly_sbx/firefly_sbx"/></node><node pkg="tf" type="static_transform_publisher" name="world_to_map" args="0.0 0.0 0.0 0.0 0.0 0.0 /world /map 100" /><node pkg="imu_complementary_filter" type="complementary_filter_node" name="imu_filter" output="screen"> <remap from="imu/data_raw" to="/imu0"/> <param name="use_mag" value="false"/> <param name="world_frame" value="enu"/> <param name="publish_tf" value="false"/></node> <!-- RTAB-Map --><include file="$(find rtabmap_ros)/launch/rtabmap.launch"> <arg if="$(arg raw_images_for_odom)" name="rtabmap_args" value="$(arg common_args) --Rtabmap/ImagesAlreadyRectified false"/> <arg unless="$(arg raw_images_for_odom)" name="rtabmap_args" value="$(arg common_args)"/> <arg if="$(arg raw_images_for_odom)" name="odom_args" value="--Rtabmap/ImagesAlreadyRectified false"/> <arg if="$(arg raw_images_for_odom)" name="left_image_topic" value="/cam0/image_raw"/> <arg if="$(arg raw_images_for_odom)" name="right_image_topic" value="/cam1/image_raw"/> <arg name="stereo" value="true"/> <arg name="frame_id" value="base_link"/> <arg name="wait_for_transform" value="0.1"/> <arg if="$(arg record_ground_truth)" name="ground_truth_frame_id" value="world"/> <arg if="$(arg record_ground_truth)" name="ground_truth_base_frame_id" value="base_link_gt"/> <arg name="cfg" value="$(arg cfg)"/> <arg name="imu_topic" value="/imu/data"/> <arg name="rtabmapviz" value="$(arg rtabmapviz)"/> <arg name="rviz" value="$(arg rviz)"/> <arg name="wait_imu_to_init" value="true"/></include></launch>

VO (default)

source devel/setup.bashroslaunch rtabmap_ros euroc_datasets.launch MH_seq:=true

在运行rtabmap时,报错:

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (1)

是因为没有安装这个节点,只需要apt-get安装一下即可:

sudo apt-get install ros-melodic-imu-complementary-filter

安装后,再运行一次就可以了,然后播放EuRoC数据集中的MH_easy.bag数据包

rosbag play --clock MH_easy.bag
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (2)
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (3)
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (4)
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (5)

如果是V系列的数据,只需要默认执行即可

roslaunch rtabmap_ros euroc_datasets.launch

2. RTAB-Map 重新编译

若RTAB-Map结合其它视觉里程计,则需要在编译的时候使得支持开源视觉里程计算法,通过下述docker镜像可以看到,RTAB-Map支持VINS Fusion, ORB_SLAM2,MSCKF,OKVIS,LOAM,DVO等算法。

# Clone dependenciesRUN mkdir -p catkin_ws/srcWORKDIR /root/catkin_ws/srcRUN /bin/bash -c '. /opt/ros/${ROS_DISTRO}/setup.bash; catkin_init_workspace'# OPENCV ROSRUN git clone https://github.com/ros-perception/vision_opencv.git && cd vision_opencv && git checkout kinetic# DVORUN git clone https://github.com/tum-vision/dvo_slam.git && cd dvo_slam && git checkout ${ROS_DISTRO}-devel && rm dvo_slam/package.xml && rm dvo_benchmark/package.xml && rm dvo_ros/package.xml# VISO2RUN git clone https://github.com/srv/viso2.git && cd viso2 && git checkout ${ROS_DISTRO}# MSCKF-VIORUN git clone https://github.com/KumarRobotics/msckf_vio.git && cd msckf_vio && git checkout a9386c5 && wget https://gist.githubusercontent.com/matlabbe/f2518d7427e7f6740af2110e540b1f2b/raw/a6d604e730bcbf3dcd7fd8a27302bed4bb94b799/msckf_vio_a9386c5_ros_commented.patch && git apply --ignore-space-change --ignore-whitespace msckf_vio_a9386c5_ros_commented.patch# FOVISRUN git clone https://github.com/srv/libfovis.git && cd libfovis && git checkout 896acc8425e9fd7c5609153b8bad349ae1abbb50# LOAMRUN git clone https://github.com/laboshinl/loam_velodyne.git && cd loam_velodyne && git checkout a4c364a677647f2a35831439032dc5a58378b3fd# VINS-FusionRUN git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git && cd VINS-Fusion && git checkout e72b5f7ae7437e8cf481cc0bcbfb5fe91bd3d640 && wget https://gist.githubusercontent.com/matlabbe/795ab37067367dca58bbadd8201d986c/raw/0657cc30fca6b1b61faeef42be9f3428861d2598/vins-fusion_e72b5f7.patch && git apply --ignore-space-change --ignore-whitespace vins-fusion_e72b5f7.patch# OKVISRUN git clone https://github.com/ethz-asl/okvis.git && cd okvis && git checkout 1dce9129f22dd4d21d944788cd9da3a4341586aa && wget https://gist.githubusercontent.com/matlabbe/383be55b5cb682fea217d45ef9a37ef8/raw/bd4f6886eeba3800f0e5171e77abc5dd6dc8bfd9/okvis_1dce912_marchnative_disabled.patch && git apply --ignore-space-change --ignore-whitespace okvis_1dce912_marchnative_disabled.patch# ORB_SLAM2RUN git clone https://github.com/stevenlovegrove/Pangolin.gitRUN git clone https://github.com/raulmur/ORB_SLAM2.git && cd ORB_SLAM2 && wget https://gist.githubusercontent.com/matlabbe/c10403c5d44af85cc3585c0e1c601a60/raw/48adf04098960d86ddf225f1a8c68af87bfcf56e/orbslam2_f2e6f51_marchnative_disabled.patch && git apply --ignore-space-change --ignore-whitespace orbslam2_f2e6f51_marchnative_disabled.patch

接下来记录重新编译RTAB-Map以支持VINS_Fusion,ORB_SLAM2的过程,并在EuRoC Datasets数据集MH_01_easy.bag上跑通。

2.1 ORB_SLAM2

  • git clone下载ORB_SLAM2:
git clone https://github.com/raulmur/ORB_SLAM2.git
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (6)
  • https://gist.githubusercontent.com/matlabbe/c10403c5d44af85cc3585c0e1c601a60/raw/48adf04098960d86ddf225f1a8c68af87bfcf56e/orbslam2_f2e6f51_marchnative_disabled.patch 下载ORB_SLAM2的补丁
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (7)
  • 打补丁:
git apply --ignore-space-change --ignore-whitespace orbslam2_f2e6f51_marchnative_disabled.patch
  • 编译ORB_SLAM2
cd ORB_SLAM2 && \ cd Thirdparty/DBoW2 && \ mkdir build && \ cd build && \ cmake .. -DCMAKE_BUILD_TYPE=Release && \ make -j8 && \ rm -rf * && \ cd ../../g2o && \ mkdir build && \ cd build && \ cmake .. -DCMAKE_BUILD_TYPE=Release && \ make -j8 && \ rm -rf * && \ cd ../../../ && \ cd Vocabulary && \ tar -xf ORBvoc.txt.tar.gz && \ cd .. && \ mkdir build && \ cd build && \ cmake .. -DCMAKE_BUILD_TYPE=Release && \ make -j8 && \ rm -rf *

可能会报错:

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (8)

只需要打开

/home/clark/Projects/ServiceRobotics/workspaces/ORB_SLAM2/include/System.h

在最前面添加一个#include<unistd.h>,再重新编译一次,就可以了

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (9)
  • 前往Examples/ROS/ORB_SLAM2,新建build目录,编译ROS版本的ORB_SLAM2
cd Examples/ROS/ORB_SLAM2mkdir build && cd buildcmake .. -DROS_BUILD_TYPE=Release

cmake编译的时和会报错:

CMake Error at /opt/ros/melodic/share/ros/core/rosbuild/private.cmake:99 (message): [rosbuild] rospack found package "ORB_SLAM2" at "/home/clark/Workspace/ORB_SLAM2-master/Examples/ROS/ORB_SLAM2", but the current directory is "/home/clark/Projects/ServiceRobotics/workspaces/ORB_SLAM2/Examples/ROS/ORB_SLAM2". You should double-check your ROS_PACKAGE_PATH to ensure that packages are found in the correct precedence order.
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (10)

顾名思义,就是需要在~/.bashrc中给ROS_PACKAGE_PATH指定ROS接口的ORB_SLAM2的路径。

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (11)

重新cmake就可以成功了

  • make编译的过程
make -j8

也会报一个错:

undefined reference to symbol '_ZN5boost6system15system_categoryEv'

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (12)

打开ROS/ORB_SLAM2下的CMakeLists.txt文件

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (13)

在其中LIBS部分添加-lboost_sysytem即可

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (14)
  • 在编译完成后,在~/.bashrc中还需要在LD_LIBRARY_PATH中添加ORBSLAM2的几个lib目录,以及PATH,并设置ORB_SLAM_ROOT_DIR
source /opt/ros/melodic/setup.bashexport ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/clark/Projects/ServiceRobotics/workspaces/ORB_SLAM2/Examples/ROS:export LD_LIBRARY_PATH=/home/clark/Projects/ServiceRobotics/workspaces/ORB_SLAM2/Thirdparty/DBoW2/lib:/home/clark/Projects/ServiceRobotics/workspaces/ORB_SLAM2/Thirdparty/g2o/lib:/home/clark/Projects/ServiceRobotics/workspaces/ORB_SLAM2/lib:/home/clark/Projects/ServiceRobotics/workspaces/catkin_ws_rtabmap_dependencies/devel/lib:/opt/ros/melodic/lib:$LD_LIBRARY_PATHsource /home/clark/Projects/ServiceRobotics/workspaces/catkin_ws_rtabmap_dependencies/devel/setup.bashexport ORB_SLAM_ROOT_DIR=/home/clark/Projects/ServiceRobotics/workspaces/ORB_SLAM2
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (15)
  • 克隆下载一个rtabmap
git clone https://github.com/introlab/rtabmap.git
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (16)
  • 因为ORB_SLAM2使用的G2O版本是自带的与标准G2O存在差异,因此rtabmap编译的时候,为了大部分其它模型,将rtabmap源码拷贝复制一个rtabmap_orbslam2,专门用于ORBSLAM2的编译,
cp -r rtabmap rtabmap_orbslam2
  • 进入rtabmap_orbslam2目录中,新建一个build目录,输入下面cmake编译命令禁用系统的g2o,仅使用ORBSLAM2自带的
cmake -DWITH_G2O=OFF ..

编译rtabmap_orbslam2后可以看到能够检测到orbslam2

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (17)
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (18)
  • 接下来直接make编译
make -j8

报错!

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (19)

也是顾名思义,修改rtabmap_orbslam2/corelib中的源文件OdometryORBSLAM.cpp

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (20)

ORB_SLAM2::Tracker::Reset(true)改为ORB_SLAM2::Tracker::Reset()

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (21)

再次make就可以成功了

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (22)
  • sudo make install安装到系统中

再前往catkin_ws_rtabmap_ros目录中,重新catkin_make编译一下

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (23)
  • 新开一个终端
source devel/setup.bashroslaunch rtabmap_ros euroc_datasets.launch args:="Odom/Strategy 5 OdomORBSLAM2/VocPath /home/clark/Projects/ServiceRobotics/workspaces/ORB_SLAM2/Vocabulary/ORBvoc.txt" MH_seq:=true raw_images_for_odom:=true

ORBSLAM2是Strategy 5,VINS_Fusion是Strategy 9

  • 再开一个终端,播放MH_01_easy.bag数据包
rosbag play --clock MH_01_easy.bag
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (24)
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (25)
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (26)
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (27)
  • 数据集播放结束后,会将建好的图以及轨迹都保存在~/.ros/rtabmap.db数据文件中

使用rtabmap-databaseViewer查看

rtabmap-databaseViewer ~/.ros/rtabmap.db
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (28)


2.2 VINS_Fusion

遵照上述dockerfile中的过程,在本地新建一个catkin_ws/src,将vin_fusion克隆下来,并切换到e72b5f7分支

git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git cd VINS-Fusion git checkout e72b5f7ae7437e8cf481cc0bcbfb5fe91bd3d640
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (29)

https://gist.githubusercontent.com/matlabbe/795ab37067367dca58bbadd8201d986c

下载pacth补丁文件:vins-fusion_e72b5f7.patch

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (30)

然后在vins_fusion的根目录下执行git apply命令打一下补丁:

git apply --ignore-space-change --ignore-whitespace vins-fusion_e72b5f7.patch
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (31)
WORKDIR /root# OKVISRUN git clone https://github.com/ethz-asl/okvis.git && cd okvis && git checkout 1dce9129f22dd4d21d944788cd9da3a4341586aa && wget https://gist.githubusercontent.com/matlabbe/383be55b5cb682fea217d45ef9a37ef8/raw/bd4f6886eeba3800f0e5171e77abc5dd6dc8bfd9/okvis_1dce912_marchnative_disabled.patch && git apply --ignore-space-change --ignore-whitespace okvis_1dce912_marchnative_disabled.patch# ORB_SLAM2RUN git clone https://github.com/stevenlovegrove/Pangolin.gitRUN git clone https://github.com/raulmur/ORB_SLAM2.git && cd ORB_SLAM2 && wget https://gist.githubusercontent.com/matlabbe/c10403c5d44af85cc3585c0e1c601a60/raw/48adf04098960d86ddf225f1a8c68af87bfcf56e/orbslam2_f2e6f51_marchnative_disabled.patch && git apply --ignore-space-change --ignore-whitespace orbslam2_f2e6f51_marchnative_disabled.patchRUN git clone https://github.com/introlab/rtabmap.git

RTAB_Map + VINS_Fusion(VO)

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (32)
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (33)

2.3 okvis

退回到workspaces目录,克隆下载okvis并切换到分支

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (34)

下载okvis的补丁,git apply打补丁

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (35)

2.4 MSCKF

里程计选择策略 8 就是MSCKF了

roslaunch rtabmap_ros euroc_datasets.launch args:="Odom/Strategy 8" MH_seq:=truerosbag play --clock -s 24 MH_01_easy.bag
git clone https://github.com/KumarRobotics/msckf_vio.git
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (36)
cd msckf_vio/ && git checkout a9386c5
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (37)

2.4 demo_stereo_outdoor 双目户外数据集

跑另一个数据集demo_stereo_outdoor.launch,stereo_outdoorA.bag数据包可以去rtabmap_ros的ros wiki中下载http://wiki.ros.org/rtabmap_ros

roslaunch rtabmap_ros demo_stereo_outdoor.launch rtabmapviz:=true rviz:=truerosbag play --clock stereo_outdoorA.bag
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (38)
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (39)


rtabmapviz

RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (40)
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (41)
RTAB-Map + VINS Fusion/ORB SLAM2 + EuRoC Datasets (2024)
Top Articles
Latest Posts
Article information

Author: Catherine Tremblay

Last Updated:

Views: 5839

Rating: 4.7 / 5 (67 voted)

Reviews: 82% of readers found this page helpful

Author information

Name: Catherine Tremblay

Birthday: 1999-09-23

Address: Suite 461 73643 Sherril Loaf, Dickinsonland, AZ 47941-2379

Phone: +2678139151039

Job: International Administration Supervisor

Hobby: Dowsing, Snowboarding, Rowing, Beekeeping, Calligraphy, Shooting, Air sports

Introduction: My name is Catherine Tremblay, I am a precious, perfect, tasty, enthusiastic, inexpensive, vast, kind person who loves writing and wants to share my knowledge and understanding with you.