1、背景
在 orbslam3
中创建好地图后,切换为纯定位模式(即勾选 Localization Mode 选项
,如上图),实测可以节省 5-10% 的 cpu,且可以避免 SLAM 模式
长时间运行内存占用缓慢上涨的问题(如下图)。
2、问题
但是如果在纯定位模式画面跳变(比如遮住镜头几秒)后暂时跟踪失败,根据官方代码的逻辑是无法重定位(Relocalization
)成功的,还会直接导致位姿乱飞(如下图),且让纯定位模式难以在工程中使用以节省 cpu 和内存占用。
3、解决
在 Tracking.cc 文件中找到以下代码(根据这篇博客记录时最新的官方代码,是在 2038 行)
// Localization Mode: Local Mapping is deactivated (TODO Not available in inertial mode)
if (mState == LOST) {
if (mSensor == System::IMU_MONOCULAR || mSensor == System::IMU_STEREO || mSensor == System::IMU_RGBD)
Verbose::PrintMess("IMU. State LOST", Verbose::VERBOSITY_NORMAL);
bOK = Relocalization();
}
修改为
// Localization Mode: Local Mapping is deactivated (TODO Not available in inertial mode)
// if (mState == LOST) {
if (mState == RECENTLY_LOST && !bOK) {
if (mSensor == System::IMU_MONOCULAR || mSensor == System::IMU_STEREO || mSensor == System::IMU_RGBD)
Verbose::PrintMess("IMU. State LOST", Verbose::VERBOSITY_NORMAL);
bOK = Relocalization();
}
实测修改后,纯定位模式下如果画面跳变后,orbslam3
仍然可以快速重定位到地图中的正确位姿。
4、参考信息
https://github.com/UltiFix/ORB_SLAM3/commit/3e3f9ee095dd8cfc0bb7562dcf2eef4b4839ca06