50_高级精读
第43章:高级精读——视觉SLAM与VIO系统(第44周)¶
教学目标:精读两大视觉SLAM/VIO系统——ORB-SLAM3(特征法+g2o+三线程)和VINS-Mono(光流法+Ceres+滑窗优化),理解视觉前端(OpenCV使用)和后端优化器(g2o vs Ceres)的完整工程实现。
精读项目:
- ORB-SLAM3(⭐8.3k,C++14)——特征法SLAM的集大成者。精读路线:
System.cc——三线程创建(mpTracker/mpLocalMapper/mpLoopCloser各一个std::thread)+Atlas多地图管理(shared_ptr<Atlas>)ORBextractor.cc——ORB特征提取的完整定制化改造:双阈值FAST(先iniThFAST=20,失败降至minThFAST=7)→ IC_Angle方向计算(半径15的强度质心法)→ 硬编码256×4坐标对的旋转BRIEF描述子 → 四叉树递归均匀化DistributeOctTree()。OpenCV核心调用:cv::FAST()/cv::resize()/cv::GaussianBlur(7,7,σ=2)/cv::copyMakeBorder(BORDER_REFLECT_101, 19)Optimizer.cc——g2o BA的完整使用:g2o::OptimizationAlgorithmLevenberg求解器 +g2o::VertexSE3Expmap位姿顶点 +g2o::EdgeSE3ProjectXYZ重投影边 +g2o::RobustKernelHuber鲁棒核。位姿估计使用自研EPnP/MLPnP(不调用cv::solvePnP)-
Atlas.h——shared_ptr<Map>/shared_ptr<KeyFrame>/shared_ptr<MapPoint>的复杂所有权关系,weak_ptr打破MapPoint↔KeyFrame循环引用 -
VINS-Mono(⭐5.8k,C++11)——Ceres自定义因子+光流前端的教科书。精读路线:
feature_tracker.cpp——完整光流流水线:cv::calcOpticalFlowPyrLK(cur_img, forw_img, cur_pts, forw_pts, status, err, cv::Size(21,21), 3)→setMask()按track_cnt降序排列+cv::circle(mask, pt, MIN_DIST, 0, -1)特征均匀化 →cv::goodFeaturesToTrack(forw_img, n_pts, MAX_CNT-forw_pts.size(), 0.01, MIN_DIST, mask)补充新特征 →rejectWithF()用cv::findFundamentalMat(FM_RANSAC)剔除外点。注意:VINS-Mono未实现前向-反向光流一致性检查factor/目录——三大Ceres自定义CostFunction:ProjectionFactor(视觉重投影误差,继承SizedCostFunction<2,7,7,7,1>)、IMUFactor(IMU预积分因子——15维残差)、MarginalizationFactor(手动实现Schur complement边缘化——这是VINS最难理解的部分,但也是理解滑窗优化的关键)PoseLocalParameterization——四元数流形参数化(ceres::LocalParameterization子类),确保优化过程中四元数始终保持单位范数