视觉SLAM实战--第2篇: ORB_SLAM2环境配置与多数据集测试

四足机器人 SLAM 导航实战

从零实现 Unitree Go2 的 SLAM 建图与 ROS2 导航,手把手集成 slam_toolbox

1. 从零开始:搭建你的ORB_SLAM2实验台

嘿,朋友们,咱们又见面了。上一回聊了视觉SLAM的概览,是不是觉得这东西挺酷,但又有点无从下手?别急,今天咱们就来点硬核的——手把手带你配置好ORB_SLAM2的环境,并且用几个经典数据集跑起来看看效果。我敢说,只要你跟着步骤走,哪怕之前没怎么碰过Linux和C++,也能在自己的电脑上看到那个神奇的3D地图一点点构建出来。ORB_SLAM2可以说是SLAM领域的“老将”了,虽然现在有更多新算法,但它结构清晰、代码经典,绝对是入门和理解SLAM系统工作原理的最佳选择。咱们今天的任务,就是把这个“老将”请到你的电脑里,让它动起来。

首先,你得知道咱们需要准备些什么。ORB_SLAM2就像一个精密的机械,它需要几个核心的“零部件”才能运转。这些零部件就是各种依赖库。最主要的几个是:OpenCVEigen3Pangolin,以及可选的ROS。OpenCV是处理图像的“万能工具箱”,没有它,系统就“看”不懂图片;Eigen3是一个高效的线性代数库,SLAM里大量的矩阵运算都得靠它;Pangolin则是一个轻量级的3D可视化工具,咱们最终看到的那炫酷的相机轨迹和稀疏点云地图,就是由它来绘制的。至于ROS,它是一个机器人操作系统,如果你想让ORB_SLAM2实时处理来自真实相机或者数据包的数据流,用ROS版本会方便很多。不过别担心,咱们先从基础的非ROS版本开始,一步步来。

我建议的操作系统是Ubuntu 18.04或20.04,这是最兼容、社区支持最广的环境。如果你是Windows用户,强烈建议在虚拟机或者WSL2里安装一个Ubuntu,这会省去你未来无数个调试的夜晚。好了,废话不多说,咱们卷起袖子,开始安装这些依赖库。打开你的终端,咱们一起敲命令。

1.1 安装核心依赖库:打好地基

安装依赖库就像盖房子前打地基,地基稳了,后面编译才顺利。咱们一个一个来,我还会告诉你每个命令是干嘛的,这样以后你自己也能举一反三。

首先是更新一下软件源列表,确保我们能下载到最新的软件包:

sudo apt-get update

接下来安装OpenCV。ORB_SLAM2对OpenCV版本要求不算苛刻,高于2.4.3就行,但咱们直接用Ubuntu仓库里提供的稳定版,省心。安装开发包和核心库:

sudo apt-get install libopencv-dev

这个命令会安装OpenCV的头文件和链接库。安装完成后,可以简单验证一下:pkg-config --modversion opencv,如果输出版本号(比如3.2.0或4.2.0),就说明安装成功了。

然后是Eigen3。它是一个只有头文件的模板库,安装起来特别简单:

sudo apt-get install libeigen3-dev

安装后,头文件通常位于 /usr/include/eigen3。ORB_SLAM2在查找时可能需要一点帮助,如果后续编译找不到Eigen,我们可以手动指定路径,这个后面遇到了再说。

第三个是Pangolin。它是一个专门为SLAM和3D视觉设计的可视化库,比用OpenCV的窗口显示3D内容方便太多了。咱们需要从源码编译安装,这样才能确保功能完整。先安装Pangolin自己需要的一些依赖:

sudo apt-get install libglew-dev libboost-dev libboost-thread-dev libboost-filesystem-dev

然后,咱们去Pangolin的GitHub仓库把源码克隆下来,编译安装:

cd ~
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build && cd build
cmake ..
make -j4  # -j4表示用4个线程并行编译,速度更快,数字可以根据你CPU的核心数调整
sudo make install

这几步走完,Pangolin就安装到系统目录了。cmake .. 是生成编译规则,make 是执行编译,sudo make install 是把编译好的库文件和头文件安装到系统路径(通常是 /usr/local/lib/usr/local/include),这样其他程序就能找到了。

最后是ROS。如果你打算运行ROS版本的ORB_SLAM2,或者想用ROS的rosbag工具播放数据集,那么需要安装ROS。这里以ROS Noetic(对应Ubuntu 20.04)为例,安装桌面完整版:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt-get update
sudo apt-get install ros-noetic-desktop-full
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

安装ROS稍微耗时一些,因为它包含了很多工具和库。安装完成后,记得初始化rosdep,这是管理ROS依赖的工具:

sudo rosdep init
rosdep update

好了,到这里,所有的基础依赖就准备齐全了。咱们可以进入下一步,去获取ORB_SLAM2的源码并开始编译了。

1.2 获取源码与编译:让机器转起来

现在,咱们去把ORB_SLAM2的“蓝图”拿过来。我习惯在用户主目录下创建一个Projects文件夹来存放这些代码项目,这样管理起来清晰。

cd ~
mkdir -p Projects
cd Projects
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2

克隆完成后,进入ORB_SLAM2目录,你会看到它的结构。里面有几个关键的文件夹:Thirdparty里包含了DBoW2和g2o这两个库(作者已经贴心地放在里面了,我们不需要单独安装),Examples里是各种运行示例,Vocabulary里是ORB特征词典文件,这个文件非常重要,是系统进行特征匹配和回环检测的基础。

编译分为两步:先编译非ROS版本,再编译ROS版本(如果你安装了ROS)。编译脚本作者已经写好了,咱们直接运行就行,但记得先给脚本加上可执行权限:

cd ORB_SLAM2
chmod +x build.sh
./build.sh

这个build.sh脚本会依次编译Thirdparty下的DBoW2和g2o,最后编译ORB_SLAM2主库。编译过程可能会花上几分钟,屏幕上会滚动很多编译信息。如果一切顺利,最后你会看到类似[100%] Built target ORB_SLAM2的输出,并且在lib文件夹下生成libORB_SLAM2.so这个动态库文件,在Examples的子文件夹下生成各种可执行文件(如mono_euroc, stereo_euroc等)。

接下来,如果你安装了ROS,还需要编译ROS版本的接口。在编译之前,需要设置一个环境变量ROS_PACKAGE_PATH,告诉ROS去哪里找我们的ORB_SLAM2包。编辑你的~/.bashrc文件:

gedit ~/.bashrc

在文件的最后,添加一行(请将/home/你的用户名/Projects替换成你实际的路径):

export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/你的用户名/Projects/ORB_SLAM2/Examples/ROS

保存并关闭文件,然后让这个配置立即生效:

source ~/.bashrc

现在,可以编译ROS版本了:

chmod +x build_ros.sh
./build_ros.sh

这个脚本会在Examples/ROS/ORB_SLAM2目录下编译,生成ROS节点(如Mono, Stereo, RGBD等)。编译成功后,你就可以在ROS环境中使用rosrun命令来启动ORB_SLAM2了。到这里,编译工作就完成了。不过,根据我的经验,90%的朋友都会在这里遇到一两个经典的“坑”。别担心,下一章我就专门讲讲这些常见问题以及我的解决方案,保证让你顺利过关。

2. 避坑指南:搞定编译中的“拦路虎”

编译过程很少有一帆风顺的,尤其是在不同电脑环境上。我当年第一次编译ORB_SLAM2时,也被几个错误折腾得够呛。下面我就把最常见的两个问题及其解决方案详细说一下,你如果遇到了,直接按图索骥就行;如果没遇到,那恭喜你,运气不错!但了解一下也没坏处,以后遇到类似链接库的问题就知道怎么排查了。

2.1 经典问题一:cv_bridge缺失

这个问题通常出现在编译ROS版本(./build_ros.sh)的时候。错误信息大概长这样:

[rospack] Error: package 'ORB_SLAM2' depends on non-existent package 'cv_bridge' and rosdep claims that it is not a system dependency. Check the ROS_PACKAGE_PATH or try calling 'rosdep update'

问题根源cv_bridge是ROS中的一个功能包,它的作用是在ROS的图像消息(sensor_msgs/Image)和OpenCV的图像矩阵(cv::Mat)之间进行转换。ORB_SLAM2的ROS节点需要从ROS话题中订阅图像数据,所以依赖这个包。错误提示说找不到这个包,是因为你的ROS完整安装可能缺少这个组件,或者rosdep(ROS依赖工具)没有正确初始化。

解决方案:很简单,直接用apt安装ROS版本的cv_bridge即可。请根据你安装的ROS版本(Kinetic, Melodic, Noetic)替换下面命令中的noetic

sudo apt-get install ros-noetic-cv-bridge

安装完成后,重新运行./build_ros.sh,这个问题就应该解决了。这属于ROS环境配置不完整,不是ORB_SLAM2代码本身的问题。

2.2 经典问题二:Boost库链接错误

这个问题非常普遍,错误信息看起来有点吓人,满屏的undefined referenceDSO missing

/usr/bin/ld: CMakeFiles/RGBD.dir/src/ros_rgbd.cc.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/lib/x86_64-linux-gnu/libboost_system.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

问题根源:这是一个C/C++项目编译中典型的“链接器错误”。简单来说,我们的程序(ORB_SLAM2的ROS节点)使用到了Boost库(一个强大的C++准标准库)里的system模块的功能,但是在最终把所有代码“粘合”成可执行文件(链接)的时候,链接器被告知的依赖库列表里,漏掉了libboost_system.so这个库文件。所以它抱怨说“找不到符号”。

解决方案:我们需要手动修改编译配置文件,把这个缺失的库明确加进去。找到ORB_SLAM2项目中的这个文件:Examples/ROS/ORB_SLAM2/CMakeLists.txt。用文本编辑器打开它:

gedit ~/Projects/ORB_SLAM2/Examples/ROS/ORB_SLAM2/CMakeLists.txt

在文件中找到类似下面这样的一行(大概在第30行左右),它定义了链接库的变量LIBS

set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
)

我们需要在最后加上 -lboost_system。修改后的样子如下:

set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
-lboost_system
)

注意,-lboost_system前面的减号和l是小写字母L,这是链接器指定库的语法。保存文件,然后重新运行 ./build_ros.sh。这次,链接器就能找到Boost的system库,编译应该可以顺利完成了。

我遇到过好几次这个错误,有时候不仅是boost_system,还可能缺少boost_filesystemboost_thread。如果遇到类似的关于Boost其他模块的未定义引用错误,同理,在LIBS变量里加上对应的-lboost_filesystem-lboost_thread即可。搞定这两个问题,你的ORB_SLAM2编译之旅基本就畅通无阻了。环境搭建好,接下来就是最激动人心的部分——跑数据集,看结果!

3. 实战演练:在多数据集上运行ORB_SLAM2

编译成功只是万里长征第一步,让ORB_SLAM2真正“跑”起来,处理真实数据,看到地图和轨迹,那成就感才是满满的。这一章,咱们就用几个学术界公认的标杆数据集来测试一下。我会分别演示非ROS版本和ROS版本的运行方法,并对比一下单目、双目、RGB-D这几种不同传感器模式的效果差异。你需要提前从官网下载好数据集,比如EuRoC MAV(微型飞行器数据集)、TUM RGB-D(室内场景数据集)和KITTI(自动驾驶场景数据集)。把它们解压到一个好找的目录,比如~/Datasets

3.1 非ROS版本运行:简单直接

非ROS版本的运行方式非常直接,就是调用我们编译好的可执行文件,传入词典、配置文件、数据路径等参数。咱们以EuRoC数据集的单目模式为例。

首先,进入ORB_SLAM2目录,并准备好词典文件(这个文件比较大,但项目里已经提供了):

cd ~/Projects/ORB_SLAM2

运行单目EuRoC示例的命令格式如下:

./Examples/Monocular/mono_euroc Vocabulary/ORBvoc.txt Examples/Monocular/EuRoC.yaml [数据集路径]/mav0/cam0/data Examples/Monocular/EuRoC_TimeStamps/MH01.txt

你需要修改 [数据集路径] 为你电脑上EuRoC数据集的实际位置。例如,我的数据放在~/Datasets/EuRoC/MH_01_easy,那么命令就是:

./Examples/Monocular/mono_euroc Vocabulary/ORBvoc.txt Examples/Monocular/EuRoC.yaml ~/Datasets/EuRoC/MH_01_easy/mav0/cam0/data Examples/Monocular/EuRoC_TimeStamps/MH01.txt

解释一下这几个参数:

  1. ./Examples/Monocular/mono_euroc:编译生成的可执行程序。
  2. Vocabulary/ORBvoc.txt:ORB特征词典,用于加速特征匹配和回环检测。
  3. Examples/Monocular/EuRoC.yaml:相机配置文件,里面包含了相机的内参(焦距、主点)和畸变系数。非常重要,如果参数不对,系统无法正确初始化。
  4. ~/Datasets/.../cam0/data:图像序列所在的文件夹。
  5. .../MH01.txt:时间戳文件,告诉程序按什么顺序读取哪些图像。

敲下回车,如果一切正常,你会先看到一个黑屏的Pangolin窗口,然后随着程序读取图像,窗口中会逐渐出现绿色的特征点(地图点)和红色的相机位置(关键帧),它们共同构成一个稀疏的3D地图。同时,终端里会输出跟踪状态、帧率等信息。

双目模式的运行也很类似,只是需要提供左右相机的图像路径:

./Examples/Stereo/stereo_euroc Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml [左目图像路径] [右目图像路径] Examples/Stereo/EuRoC_TimeStamps/MH01.txt

双目模式因为有直接的深度信息,初始化更快,地图尺度也是真实的,稳定性比单目好很多。

对于TUM RGB-D数据集,运行前需要一个额外的步骤:关联RGB图像和深度图像的时间戳。因为RGB相机和深度相机的时间可能不完全同步。在数据集目录下,使用ORB_SLAM2提供的Python脚本:

cd [你的TUM数据集目录,例如 rgbd_dataset_freiburg1_desk]
python [ORB_SLAM2路径]/Examples/RGB-D/associate.py rgb.txt depth.txt > associations.txt

这个脚本会生成一个associations.txt文件。然后运行RGB-D程序:

./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml [数据集路径] [关联文件路径]

KITTI数据集的运行最为简单,因为它已经提供了矫正好的双目图像,且序列规整:

./Examples/Stereo/stereo_kitti Vocabulary/ORBvoc.txt Examples/Stereo/KITTI00-02.yaml [KITTI序列路径,如 .../sequences/00]

非ROS版本的优势是依赖简单,启动快,非常适合快速测试和算法理解。接下来,我们看看如何用ROS版本,这更贴近真实的机器人应用场景。

3.2 ROS版本运行:贴近真实应用

ROS版本的核心思想是“订阅”和“发布”。ORB_SLAM2的ROS节点会订阅一个图像话题(比如/camera/image_raw),然后处理图像,同时将相机位姿、地图点等信息发布到其他话题上。我们用rosbag(一种记录ROS话题数据的文件)来模拟一个实时图像流。

首先,需要启动ROS的核心节点roscore,打开一个新的终端:

roscore

然后,在另一个终端,播放EuRoC数据集的rosbag。注意,ORB_SLAM2默认订阅的话题名可能与bag文件中记录的不一致,我们需要在播放时进行话题重映射。假设我们的bag文件是V1_01_easy.bag,ORB_SLAM2单目节点订阅的话题是/camera/image_raw,而bag里左目图像的话题是/cam0/image_raw,那么播放命令如下:

rosbag play --pause V1_01_easy.bag /cam0/image_raw:=/camera/image_raw

--pause参数让bag在播放前暂停,给我们时间启动SLAM节点。接着,在第三个终端,启动ORB_SLAM2的单目ROS节点:

rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/Monocular/EuRoC.yaml

节点启动后,回到播放bag的终端,按空格键开始播放。此时,你应该能看到和非ROS版本类似的Pangolin窗口弹出,并开始建图。

双目ROS版本需要重映射左右两个话题:

rosbag play --pause V1_01_easy.bag /cam0/image_raw:=/camera/left/image_raw /cam1/image_raw:=/camera/right/image_raw
rosrun ORB_SLAM2 Stereo Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml true

最后一个参数true表示使用双目模式进行回环检测。

ROS版本的优势在于其模块化易集成性。你可以很方便地将这个SLAM节点与你自己的相机驱动节点、导航节点连接起来,构建一个完整的机器人系统。数据通过话题流动,松耦合,扩展性强。

3.3 运行结果观察与对比

跑起来之后,别光看热闹,要学会观察。在Pangolin窗口里,你可以用鼠标拖拽旋转视角,用滚轮缩放。注意看:

  • 地图点:绿色的点是系统认为稳定的三维地图点。它们会随着相机移动而增多。如果点云很稀疏或者很快消失,可能是特征提取或跟踪有问题。
  • 相机轨迹:红色的线代表相机走过的路径(关键帧位姿)。一条平滑、连续的轨迹说明跟踪稳定。
  • 当前帧特征点:图像窗口中会显示当前帧提取的ORB特征点(通常用圆圈或十字标出)。

你可以明显感觉到,双目RGB-D模式几乎瞬间就能完成初始化(因为深度已知),轨迹和地图非常稳定。而单目模式需要一定的平移运动才能初始化成功(三角化计算深度),初期尺度不确定,且容易在纯旋转时跟丢。在EuRoC数据集上,双目模式通常能跑出非常漂亮、闭合的轨迹(说明回环检测成功了),而单目模式可能会有明显的尺度漂移。

终端里输出的信息也值得关注,比如“Tracking lost!”意味着跟踪失败,需要移动相机重新初始化;“Loop detected!”则是一个令人兴奋的消息,说明系统发现了曾经到过的地方,并准备进行闭环校正,这能极大地消除累积误差。

4. 深入理解:不同模式与数据集的适配与调优

成功运行默认配置只是开始。要想让ORB_SLAM2在你的特定场景下表现更好,或者理解它为什么在某个数据集上效果不佳,就需要深入配置文件,甚至动一动代码。这一章,咱们就来聊聊如何根据传感器类型和数据集特点进行适配和初步调优。

4.1 相机配置文件:算法的“眼睛”

YAML配置文件是ORB_SLAM2的“指挥中心”。以Examples/Monocular/EuRoC.yaml为例,我们打开看看:

%YAML:1.0

# 相机参数
Camera.fx: 435.2046959714599
Camera.fy: 435.2046959714599
Camera.cx: 367.4517211914062
Camera.cy: 252.2008514404297
Camera.k1: -0.28340811
Camera.k2: 0.07395907
Camera.p1: 0.00019359
Camera.p2: 1.76187114e-05

# 图像尺寸
Camera.width: 752
Camera.height: 480

# 帧率 (仅用于可视化)
Camera.fps: 20.0

# ORB特征参数
ORBextractor.nFeatures: 1200
ORBextractor.scaleFactor: 1.2
ORBextractor.nLevels: 8
ORBextractor.iniThFAST: 20
ORBextractor.minThFAST: 7

# 其他SLAM参数
Viewer.KeyFrameSize: 0.05
Viewer.KeyFrameLineWidth: 1
Viewer.GraphLineWidth: 0.9
Viewer.PointSize: 2
Viewer.CameraSize: 0.08
Viewer.CameraLineWidth: 3
Viewer.ViewpointX: 0
Viewer.ViewpointY: -0.7
Viewer.ViewpointZ: -1.8
Viewer.ViewpointF: 500

关键参数解读

  • Camera.fx, fy, cx, cy, k1, k2, p1, p2:这是相机的内参和畸变系数。这些参数必须与你使用的相机或数据集标定结果严格一致! 用错了参数,就像给人戴了度数不匹配的眼镜,看到的世界是扭曲的,SLAM系统必然失败。EuRoC、TUM、KITTI官网都提供了每个数据集的准确相机参数。
  • ORBextractor.nFeatures:每帧图像提取的最大ORB特征数量。增加这个值会让特征更密集,可能提高跟踪鲁棒性,但也会增加计算量。对于纹理丰富的场景,1000-1200通常足够;对于纹理较少的场景,可以适当提高到2000。
  • ORBextractor.scaleFactornLevels:这是构建图像金字塔的参数,用于实现尺度不变性。scaleFactor是相邻层之间的缩放系数(通常1.2),nLevels是金字塔层数(通常8)。这些参数一般不需要改动。
  • iniThFASTminThFAST:FAST角点检测的阈值。初始阈值和最小阈值。如果发现特征点太少,可以适当降低这两个值(比如分别调到15和5)。

当你换用自己的相机时,第一步就是用棋盘格等工具进行相机标定,获得准确的参数,然后修改这个配置文件。这是让SLAM正常工作的前提。

4.2 不同传感器模式的本质差异

为什么单目、双目、RGB-D的运行命令和结果差异这么大?我们来简单剖析一下:

  • 单目 (Monocular):只有一张图像,没有直接的深度信息。深度的获取依赖于运动(三角化)。这带来了两个核心问题:1) 尺度不确定性:只能恢复出相机运动的轨迹和地图的相对尺度,真实尺度是未知的。2) 初始化要求:需要足够的平移运动才能成功三角化出初始地图点。在代码中,单目模式有一个专门的Initializer类来处理这个棘手的初始化过程。
  • 双目 (Stereo):两个相机,通过极线约束可以匹配左右图的特征点,并直接计算每个点的深度(视差)。因此,它一上来就有真实的尺度,初始化瞬间完成,稳定性极高。ORB_SLAM2的双目模式,在Frame类里会为每个特征点计算一个mvuRight(右图横坐标)和mDepth(深度值)。
  • RGB-D:通过红外结构光或飞行时间法直接获取深度图像。其优势是深度信息稠密且相对准确(在有效范围内)。ORB_SLAM2的RGB-D模式会利用深度图,将2D特征点反投影成3D点,本质上拥有了和双目类似的已知深度信息。但它需要处理深度图与RGB图的对齐问题(通常已由硬件或驱动完成),以及深度图中的无效值(NaN)。

在源码中,这三种模式的差异主要体现在Tracking.cc文件的GrabImageMonocular, GrabImageStereo, GrabImageRGBD这几个函数里,它们负责以不同的方式将原始数据封装成Frame对象。理解了这个,你就明白了为什么配置文件不能混用,以及为什么运行命令的格式不同。

4.3 针对特定数据集的微调建议

  • EuRoC (MAV):这个数据集图像分辨率不高,但运动剧烈,有快速旋转和晃动。如果跟踪容易丢失,可以尝试:1) 增加nFeatures(如1500),确保在模糊帧中也能提取足够特征。2) 检查时间戳文件是否匹配你运行的序列(MH01, MH02,...)。
  • TUM RGB-D:室内场景,纹理有时比较弱(比如白墙)。可以尝试降低FAST阈值(iniThFAST, minThFAST)来在弱纹理区域提取更多角点。另外,注意深度图的测量范围(通常0.5m-8m),太近或太远的深度值会被过滤掉,这个阈值在代码Frame.cc的构造函数里可以调整。
  • KITTI:户外场景,图像分辨率高,场景大。默认的1200个特征可能对于宽阔的街道显得稀疏。可以显著增加nFeatures(如3000)。同时,KITTI数据集提供了里程计真值,你可以将ORB_SLAM2输出的轨迹(CameraTrajectory.txt)保存下来,与真值对比,计算绝对轨迹误差(ATE),这是量化SLAM性能的常用方法。ORB_SLAM2源码中其实有保存轨迹的代码,在System.ccShutdown()函数里,默认是开启的。

调优是一个需要耐心和实验的过程。我的建议是,先用默认参数跑通,有一个基准感受。然后,针对你遇到的问题(比如跟踪丢失、地图点太少),再有目的地去调整相关的一两个参数,并观察变化。每次只改一个参数,这样才能理清因果关系。好了,关于ORB_SLAM2的环境配置和基础测试,咱们已经聊得相当深入了。从依赖安装、编译避坑,到多数据集运行,再到参数初探,这一套流程走下来,你应该已经从一个旁观者变成了一个能够上手操作的实践者。SLAM的魅力在于理论与实践的结合,接下来不妨试试用你自己的摄像头,或者从网上下载更多有趣的数据集,去探索这个奇妙的视觉世界吧。记住,遇到问题就去查Issues、读源码,这才是成长最快的方式。

四足机器人 SLAM 导航实战

从零实现 Unitree Go2 的 SLAM 建图与 ROS2 导航,手把手集成 slam_toolbox

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值