基于ORB_SLAM2的原理,对ORB_SLAM2进行了完全重写。
- 去掉了
ORB_SLAM2中,对单目相机的支持,仅支持双目和深度相机; - 实现了算法和
ROS2进行了兼容,可以快速融入到基于ROS2的项目中去; - 使用智能指针代替普通指针,提高内存管理的安全性,但增加了额外的时间开销,与原来
ORB-SLAM2系统相比,精度保持一致,但存在20%的额外时间开销; - 基于目前主流的三方库,保证了依赖的主流兼容性;
- 基于多线程和输入输出流和
Protobuf,实现了高效的地图的保存和加载功能,与字符串实现相比,时间开销降低78%,地图存储开销降低50%; 10000+行代码的工作量,使用cloc工具统计代码C++代码行数如下。
C++17OpenCV 4.2DBoW3g2o 20241228Pangolin 0.9.3- Sophus 1.24.6
- ROS2 humble
Eigen3cv_bridgeProtobuf
针对DBoW3、g2o、Pangolin、Sophus和ROS2,需要去上述给定的地址下载源码,编译安装。
对于没有指定地址的三方库,可以使用如下命令安装:
sudo apt update
sudo apt install libeigen3-dev
sudo apt install ros-humble-cv-bridge
sudo apt install protobuf-compilergit clone https://github.com/sunshanlu/ORB_SLAM2_ROS2.git
cd ORB_SLAM2_ROS2
colcon build根据需求,创建配置文件,并运行,配置文件的示例在config文件夹中。其中,值得注意的是,在配置文件中有如下选项需要根据文件路径进行修改:
Path.Vocabulary: "词袋文件路径,可以是ORB_SLAM2官网的词袋文件,需要解压为txt文件后使用"
Path.BriefTemplate: "BRIEF 描述子模版文件路径,就是confg文件夹下的brief_template.txt文件"
Path.Map: "地图的保存和加载路径,需要提前创建文件夹,指定保存的文件夹路径即可"除此之外,相机的畸变参数信息也需要注意,这里仅支持4参数畸变模型和5参数畸变模型。若要是4畸变参数模型,需要修改的配置文件选项为:
Camera.k1: 0.0
Camera.k2: 0.0
Camera.p1: 0.0
Camera.p2: 0.0若要是5畸变参数模型,需要修改的配置文件选项为:
Camera.k1: 0.0
Camera.k2: 0.0
Camera.p1: 0.0
Camera.p2: 0.0
Camera.k3: 0.0source ./install/setup.bash
./install/orb_slam2/lib/orb_slam2/kitti_example kitti_data_seq kitti_config_pathkitti_data_seq,为数据集路径信息,例如xxx/KITTI/sequences/00kitti_config_path,为配置文件路径信息,例如xxx/config/KITTI_config.yaml,在config文件夹下有对应00数据序列的配置文件示例。
source ./install/setup.bash
./install/orb_slam2/lib/orb_slam2/tum_example tum_data_seq tum_config_path association_pathtum_data_seq,为数据集路径信息,例如xxx/dataset/TUM/rgbd_dataset_freiburg2_desktum_config_path,为配置文件路径信息,例如xxx/config/TUM_config.yaml,在config文件夹下有对应rgbd_dataset_freiburg2_desk数据序列的配置文件示例。association_path, 这是基于TUM的RGBD数据集的工具制作的RGB图和深度图的关系文件
需要在./src/ORB_SLAM2/example/ROS2/ROSExample.cc中,将全局变量ConfigPath更改为实际的配置文件路径即可。
source ./install/setup.bash
ros2 run orb_slam2 ros2_example --ros-args -p ConfigPath:=xxx/config/config.yamlORB_SLAM2/Camera: 使用的是orb_slam2_interfaces中的Camera消息类型,当ROS系统接收到此消息后,就会进行跟踪。- 对于双目相机来讲,
Camera.image0代表的是左图,Camera.image1代表的是右图 - 对于深度相机来讲,
Camera.image0代表的是RGB图,Camera.image1代表的是深度图
- 对于双目相机来讲,
ORB_SLAM2/Pose: 使用的是geometry_msgs中的PoseStamped消息类型,当系统完成跟踪后,会向这个话题发布位姿信息。ORB_SLAM2/Lost: 使用的是orb_slam2_interfaces中的LostFlag消息类型,当系统跟踪丢失后,会向这个话题发布丢失信息。
