ORB-SLAM3与ORB-SLAM2轨迹对比
由于ORB_SLAM2/Examples/ROS/ORB_SLAM2/src下的ros_stereo.cc中有这两句:
// Stop all threads
SLAM.Shutdown();
// Save camera trajectory
SLAM.SaveKeyFrameTrajectoryTUM("ORB-SLAM2-KeyFrameTrajectory.txt");
SLAM.SaveTrajectoryTUM("ORB-SLAM2-FrameTrajectory.txt");
SLAM.SaveTrajectoryKITTI("FrameTrajectory_KITTI_Format.txt");
说明ORB_SLAM2在ros运行结束后可以保存轨迹。而在github上下的ORB_SLAM3中对应/ROS/ORB_SLAM3/src下的ros_stereo_inertial.cc中却没有这几句,因此需要自己码进去:
// Stop all threads
SLAM.Shutdown();
// Save camera trajectory
SLAM.SaveKeyFrameTrajectoryTUM("ORB-SLAM3-KeyFrameTrajectory.txt");
// Save camera trajectory
SLAM.SaveTrajectoryTUM("ORB-SLAM3-FrameTrajectory.txt");
然后分别对ORB-SLAM3与ORB-SLAM2进行编译:
chmod +x build_ros.sh
./build_ros.sh
打开一个终端运行ros:
roscore
分别在对应的文件夹下运行ORB-SLAM2与ORB-SLAM3:
// 根据自己的路径改一下啊!!!
rosrun ORB_SLAM3 Stereo_Inertial /home/ipsg/1295/ORB_SLAM3/Vocabulary/ORBvoc.txt /home/ipsg/1295/ORB_SLAM3/Examples/Stereo-Inertial/EuRoC.yaml true
接着会出来黑框和白框。
然后打开下载好的EUROC数据集,在数据集对应的文件夹下运行bag文件:
// An highlighted block
rosbag play MH_03_medium.bag
此时就开始运行了。
运行结束后会生成刚才设置的轨迹文件。
最后将轨迹文件与groundth放在一个文件夹进行对比(代码生成的轨迹是txt格式,groundth是csv格式):
evo_ape euroc MH_03.csv ORB-SLAM3-FrameTrajectory.txt -a -p
evo_ape euroc MH_03.csv ORB-SLAM2-FrameTrajectory.txt -a -p
以上对比只是evo的一个功能,想详细了解可以搜索evo。
上结果:
ORB-SLAM2:
max 0.662588
mean 0.194128
median 0.136796
min 0.042975
rmse 0.235405
sse 78.579196
std 0.133154
ORB-SLAM3:
max 0.093307
mean 0.042024
median 0.042101
min 0.003407
rmse 0.046062
sse 2.783682
std 0.018860
由于ORB-SLAM3带了IMU因此更稳定,在MH_03数据集下ORB-SLAM2会有一部分轨迹丢失,而ORB-SLAM3非常稳定。