Ubuntu22.04系统的ROS2安装ORB-SLAM3并用电脑摄像头实时运行
一、ORB-SLAM3简介
ORB_SLAM3提供了单目、双目以及RGB-D相机,在针孔和鱼眼模型上的VO、VIO以及多地图SLAM的实现。 其主要创新点是:
- 一种单目和双目视觉惯性SLAM系统,即使在惯性测量单元初始化阶段,也完全依赖于最大后验估计.所提出的初始化方法先前已在[6]中介绍过.这里我们添加了它与ORB-SLAM视觉惯性[4]的集成,扩展至双目惯性SLAM,并在公共数据集进行彻底评估.我们的结果表明,单目和双目视觉惯性系统是极其鲁棒的,并且比其他视觉惯性方法更加精确,甚至在没有循环的序列中也是如此.
- High-recall place recognition.许多最近的视觉SLAM和VO系统使用DBoW2单词库包解决了位置识别问题.DBoW2需要时间一致性,在检查几何一致性之前,将三个连续的关键帧匹配到同一区域,以牺牲召回为代价来提高精度.结果,系统在关闭循环和重用以前的地图方面太慢.我们提出了一种新的位置识别算法,首先检查候选关键帧的几何一致性,然后检查与三个可共视关键帧的局部一致性,这三个关键帧在大多数情况下已经在地图中.这种策略提高了查全率,增加了数据关联度,提高了地图精度,但代价是计算成本稍高.
- ORB-SLAM Atlas 第一个完整的多地图SLAM系统,能够处理视觉和视觉惯性系统,在单目和立体配置.地图集可以表示一组不连续的地图,并在其上平滑地应用所有的制图操作:位置识别、相机重新定位、闭环和精确的无缝地图合并.这允许自动使用和组合在不同时间构建的地图,执行增量多会话SLAM.在原版ORB基础上我们添加了新的地点识别系统,可视化多地图系统及其对公共数据集的评估.
- An abstract camera representation使SLAM与所使用的相机模型无关,并允许通过提供投影、反投影和雅可比函数来添加新模型.我们提供了针孔和鱼眼模型的实现
二、环境配置
2.1、手动配置
第一种方法是按照官方文档进行安装,以下是官方文档链接
https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html
2.2、快捷安装
第二种方法就是使用鱼香肉丝的快捷方式安装ros2
wget http://fishros.com/install -O fishros && . Fishros
输入代码后,终端会显示提示信息,并按提示信息进行选择安装
三、安装并调试ORB-SLAM3
3.1、Eigen3安装
Eigen是一个高层次的C ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。Eigen是一个开源库,从3.1.1版本开始遵从MPL2许可。
#下载
git clone https://github.com/eigenteam/eigen-git-mirror
#编译以及安装
cd eigen-git-mirror
mkdir build
cd build
cmake ..
sudo make install
安装完成后要将安装文件从默认位置移动到符合我们需求的位置
sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include
3.2、Pangolin安装
# 下载
git clone https://github.com/stevenlovegrove/Pangolin
# 安装Pangolin所需依赖项
sudo apt-get install libglew-dev
sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev
# 编译安装
mkdir build
cd build
cmake ..
make -j2 # 可将2替换,或者直接去掉,不加的话是最快的(make -j)
sudo make install
3.3、opencv安装
apt install libopencv-dev
3.4、安装ORB-SLAM3
- 从Git仓库clone源码。
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3
- 下载后进入该RB_SLAM3文件夹,先修改其中两个文件(/ORB_SLAM3/CMakeLists.txt、ORB_SLAM3/Thirdparty/DBoW2/CMakeLists.txt)的pencv版本,改成刚才下载好的版本,然后执行下列命令进行构建。
cd ORB_SLAM3
chmod +x build.sh
./build.sh
- 构建完成后下载安装ros2的message-filters。
sudo apt install ros-foxy-message-filters
- 创建ros2工作空间,并进入该工作空间,之后从https://github.com/zang09/ORB_SLAM3_ROS2下载源码包,将其解压放入ROS2_ORB_SLAM3/src中并重命名为orbslam3_ros2。
- 修改ROS2_ORB_SLAM3/src/orbslam3_ros2/CMakeLists.txt文件
set(ENV{PYTHONPATH} "/opt/ros/foxy/lib/python3.8/site-packages/")
将其改为自己ros2安装的对应路径。
6) 修改ROS2_ORB_SLAM3/src/orbslam3_ros2/CMakeModules/FindORB_SLAM3.cmake中的第8行,改为之前非ROS的ORB_SLAM3的安装路径
set(ORB_SLAM3_ROOT_DIR "~/ORB_SLAM3")
- 在ORB_SLAM3_ROS2文件夹下编译
colcon build
3.5、安装usb相机驱动
sudo apt install ros-foxy-usb-cam
rosdep install --from-paths src --ignore-src -y
四、源码解析
4.1、Tracking
该线程用来处理传感器信息,计算当前帧相对于active map的位姿以及最小化匹配到的地图点的重投影误差。该线程决定何时当前帧被判定为关键帧。在VI模式下,机体的速度以及IMU的bias通过优化惯导残差被估计。当系统追踪丢失后,会触发重定位模式,即当前帧在所有的Altas进行重定位;若重定位成功,当前帧恢复追踪状态;否则,经过一段时间(超过5秒),当前的active map会被存储为non-active map,同时开启新的建图过程。
- 流程图
bool Tracking::Track() {
// 初始化
// 估计初始位姿
// 特征点跟踪
// 优化当前帧位姿
// 更新局部地图
// 检查跟踪质量
}
4.2、localMapping
向active map中新增/删减/优化关键帧以及地图点,上述的操作是通过维护一个靠近当前帧的局部窗口的关键帧进行实现。与此同时,IMU的参数被初始化然后被该线程通过本文提出的最大后验估计技术进行求解。
- 流程图
void LocalMapping::Run() {
while(true) {
// 处理新关键帧
// 插入新的地图点
// 局部BA优化
}
}
4.3、loopAndMapMerging
该线程检测active map与整个Atlas是否有共同的区域,若共同的区域同属于active map,此时进行闭环矫正;若共同的区域属于不同的map,那么这些map就会被融合(融合为1个),并变为active map。BA被一个独立的线程执行(不损害实时性),用来修正地图。
- 流程图
mpLoopCloser = new LoopClosing(mpAtlas, mpKeyFrameDatabase, mpVocabulary, mSensor!=MONOCULAR, activeLC); // mSensor!=MONOCULAR);
mptLoopClosing = new thread(&ORB_SLAM3::LoopClosing::Run, mpLoopCloser);

浙公网安备 33010602011771号