You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ORB-SLAM3集成自定义应用时KeyFrame::GetImuPosition()段错误排查

问题

将ORB-SLAM3与自定义应用集成运行时,出现Segmentation fault问题。生成核心转储并查看堆栈跟踪后,发现问题出在KeyFrame::GetImuPosition()中,且存在空指针访问(this@entry=0x0)。

堆栈跟踪信息如下:

Program terminated with signal SIGSEGV, Segmentation fault.
#0  __GI___pthread_mutex_lock (mutex=0x1100) at ../nptl/pthread_mutex_lock.c:67
67  ../nptl/pthread_mutex_lock.c: No such file or directory.
[Current thread is 1 (Thread 0x7f5c317fc700 (LWP 1926529))]
(gdb) bt
#0  __GI___pthread_mutex_lock (mutex=0x1100) at ../nptl/pthread_mutex_lock.c:67
#1  0x00007f5ce49502df in __gthread_mutex_lock (__mutex=0x1100) at /usr/include/x86_64-linux-gnu/c++/9/bits/gthr-default.h:749
#2  std::mutex::lock() (this=0x1100) at /usr/include/c++/9/bits/std_mutex.h:100
#3  std::unique_lock<std::mutex>::lock() (this=<synthetic pointer>, this=<synthetic pointer>) at /usr/include/c++/9/bits/unique_lock.h:141
#4  std::unique_lock<std::mutex>::unique_lock(std::mutex&) (__m=..., this=<synthetic pointer>) at /usr/include/c++/9/bits/unique_lock.h:71
#5  ORB_SLAM3::KeyFrame::GetImuPosition() (this=this@entry=0x0) at /home/my-user/workspace/my-project/ORBSlam3/src/KeyFrame.cc:150
#6  0x00007f5ce4a56e44 in ORB_SLAM3::ImuCamPose::ImuCamPose(ORB_SLAM3::KeyFrame*) (this=0x7f5c317b0380, pKF=0x0) at /home/my-user/workspace/my-project/ORBSlam3/src/G2oTypes.cc:28
#7  0x00007f5ce49a559a in ORB_SLAM3::VertexPose::VertexPose(ORB_SLAM3::KeyFrame*) (this=0x7f5bec463c40, pKF=0x0) at /home/my-user/workspace/my-project/ORBSlam3/include/G2oTypes.h:136
#8  0x00007f5ce499140e in ORB_SLAM3::Optimizer::PoseInertialOptimizationLastKeyFrame(ORB_SLAM3::Frame*, bool) (pFrame=pFrame@entry=0x7f5c66729240, bRecInit=bRecInit@entry=false)
    at /usr/include/eigen3/Eigen/src/Core/util/Memory.h:212
#9  0x00007f5ce48fcb09 in ORB_SLAM3::Tracking::TrackLocalMap() (this=0x7f5c66729230) at /home/my-user/workspace/my-project/ORBSlam3/src/Tracking.cc:3155
#10 0x00007f5ce49027f0 in ORB_SLAM3::Tracking::Track() (this=0x7f5c66729230) at /home/my-user/workspace/my-project/ORBSlam3/src/Tracking.cc:2292
... project specific stack frames ..

应用和SLAM跟踪在运行数分钟、处理1000+帧后才出现该段错误,请问可能的原因是什么?


可能的原因分析

  • 空指针传入优化模块:从堆栈可见,VertexPose构造函数接收的pKF=0x0,说明PoseInertialOptimizationLastKeyFrame尝试获取上一关键帧时得到空指针。运行数分钟后出现该问题,排除未初始化的情况,更可能是关键帧被提前释放或多线程下指针失效。
  • 关键帧生命周期管理错误:ORB-SLAM3的关键帧由跟踪、局部建图、闭环检测多线程共享。若自定义应用手动释放关键帧,或多线程同步时未正确保护关键帧指针,会导致某线程访问已销毁的关键帧(指针变为空或野指针)。比如局部建图线程删除关键帧后,跟踪线程仍持有旧指针并尝试访问。
  • 多线程同步缺陷:KeyFrame::GetImuPosition()需锁定互斥量,但堆栈显示尝试锁定的mutex=0x1100为非法地址,结合this=0x0,说明调用该方法时KeyFrame对象已不存在。这是多线程下未保证关键帧指针有效性导致的:比如跟踪线程使用指针前未做空指针检查,或局部建图线程已删除关键帧,但跟踪线程逻辑未处理该场景。
  • 重初始化的边界逻辑疏漏:若运行中出现跟踪丢失后重新初始化,可能存在上一关键帧未正确设置的情况,导致PoseInertialOptimizationLastKeyFrame获取到空关键帧指针。需检查跟踪模块重初始化后的关键帧衔接逻辑。
  • 自定义集成的逻辑错误:若自定义应用修改了ORB-SLAM3的关键帧生成、存储逻辑,比如错误清空关键帧列表,或传递关键帧指针时未正确保留引用计数(ORB-SLAM3用智能指针管理关键帧),会导致关键帧被提前销毁,进而引发空指针访问。

内容的提问来源于stack exchange,提问作者MsA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 09:35:01