目录
0.先修知识
1.ORB - SLAM2中的线程
2.ORBSLAM2中的互斥锁示例
0.先修知识
需要了解C++中开辟多线程的方式,了解C++中不同锁的使用方法
学习C++:C++进阶(五)多线程编程原理及多线程编程方法https://blog.csdn.net/qq_41694024/article/details/128937882 对ORB - SLAM2代码熟记于心
ORBSLAM2逐函数解析https://blog.csdn.net/qq_41694024/category_11932292.html 请掌握以下内容之后再做学习本篇博客的内容。
1.ORB - SLAM2中的线程
1.有几个线程:跟踪线程(SLAM系统主线程,在main函数内)、局部建图线程、回环检测线程、可视化界面线程、全局BA线程。
mptLocalMapping = new thread(&ORB_SLAM2::LocalMapping::Run, //这个线程会调用的函数 mpLocalMapper); //这个调用函数的参数
//创建回环检测线程 mptLoopClosing = new thread(&ORB_SLAM2::LoopClosing::Run, //线程的主函数 mpLoopCloser); //该函数的参数
//新建viewer线程 mptViewer = new thread(&Viewer::Run, mpViewer);
2.主线程是什么:跟踪线程
3.线程间如何调度:
从图中看,跟踪线程将关键帧给局部建图线程、局部建图线程将关键帧给回环检测线程。
2.ORBSLAM2中的互斥锁示例
LocalMapping线程内unique_lock<mutex> lock(mMutexNewKFs);
在插入关键帧的时候:
// 插入关键帧,由外部(Tracking)线程调用;这里只是插入到列表中,等待线程主函数对其进行处理 void LocalMapping::InsertKeyFrame(KeyFrame *pKF) { unique_lock<mutex> lock(mMutexNewKFs); // 将关键帧插入到列表中 mlNewKeyFrames.push_back(pKF); mbAbortBA=true; }
LocalMapping要处理的所有关键帧都存储在mlNewKeyFrames中,在插入关键帧的时候要保证这个中数据不被改变,加锁。
线程间的互斥锁mMutexMapUpdate:
///当更新地图时的互斥量.回环检测中和局部BA后更新全局地图的时候会用到这个 std::mutex mMutexMapUpdate;