orb-slam3的优化函数

本文详细解析了ORB-SLAM3中的各种优化函数,包括单帧位姿优化、结合IMU的优化、局部和全局地图调整,以及Sim3和地图回环的优化。这些函数在处理视觉和惯性数据时发挥关键作用,确保地图的精确性和一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

orb-slam3的优化函数

ORB-SLAM3中Optimizer.cc中定义的优化函数包括:
ORB-SLAM3的优化函数
ORB-SLAM2中Optimizer.cc中定义的优化函数包括:
ORB-SLAM2的优化函数

单帧优化

1. PoseOptimization

int PoseOptimization(Frame *pFrame)

  • 位姿优化,纯视觉时使用。优化目标:单帧的位姿
    • 3D-2D 最小化重投影误差 e = (u,v) - project(Tcw*Pw) \n
    • 只优化Frame的Tcw,不优化MapPoints的坐标
  • IO
    • [in] pFrame 待优化的帧
    • 返回内点数目
  • 用于:Tracking线程中局部地图运动跟踪。IMU未初始化,或间隔太短时。

2. PoseInertialOptimizationLastKeyFrame

int PoseInertialOptimizationLastKeyFrame(Frame *pFrame, bool bRecInit)

  • 使用上一关键帧+当前帧的视觉信息和IMU信息,联合优化当前帧位姿
    • Step 1:创建g2o优化器,初始化顶点和边
    • Step 2:启动多轮优化,剔除外点
    • Step 3:更新当前帧位姿、速度、IMU偏置
    • Step 4:记录当前帧的优化状态,包括参数信息和对应的海森矩阵
  • I/O
    • [in] pFrame 当前帧,也是待优化的帧
    • [in] bRecInit 调用这个函数的位置并没有传这个参数,因此它的值默认为false
    • 返回优化后的内点数
  • 用于:局部地图跟踪,当局部地图更新时:1. 回环或融合; 2. 局部地图LocalBundleAdjustment. 3. IMU三阶段的初始化

3. PoseInertialOptimizationLastFrame

int PoseInertialOptimizationLastFrame(Frame *pFrame, bool bRecInit)

  • 使用上一帧+当前帧的视觉信息和IMU信息,优化当前帧位姿
  • 可分为以下几个步骤
    • Step 1:创建g2o优化器,初始化顶点和边
    • Step 2:启动多轮优化,剔除外点
    • Step 3:更新当前帧位姿、速度、IMU偏置
    • Step 4:记录当前帧的优化状态,包括参数信息和边缘化后的海森矩阵
  • I/O
    • [in] pFrame 当前帧,也是待优化的帧
    • [in] bRecInit 调用这个函数的位置并没有传这个参数,因此它的值默认为false
    • 返回优化后的内点数
  • 用于: 第二阶段跟踪,当局部地图未更新时:

4. Marginalize

Eigen::MatrixXd Marginalize(const Eigen::MatrixXd &H, const int &start, const int &end)

  • PoseInertialOptimizationLastFrame 中使用 Marginalize(H, 0, 14);
  • 使用舒尔补的方式边缘化海森矩阵,边缘化。
  • I/O
    • H 30*30的海森矩阵
    • start 开始位置
    • end 结束位置
    • 返回H矩阵,大小(6,3,3,3,6,3,3,3)^2

局部地图优化

5. LocalBundleAdjustment

void LocalBundleAdjustment(KeyFrame *pKF, bool *pbStopFlag, Map *pMap, int &num_fixedKF, int &num_OptKF, int &num_MPs, int &num_edges)

  • Local Bundle Adjustment ,对当前关键帧及其相邻关键帧进行局部地图优化。获得关键帧位姿、地图点
  • LocalMapping::Run()使用,纯视觉。不是IMU模式,或者当前关键帧所在的地图还未完成IMU初始化。
  • IO
    • p
### ORB-SLAM3 后端优化技术及其实现细节 ORB-SLAM3 是一种基于特征点的视觉 SLAM 系统,其后端主要负责全局地图优化以及闭环检测后的重定位和校正。以下是关于 ORB-SLAM3 后端优化部分的技术分析: #### 1. 图优化 (Graph Optimization) ORB-SLAM3后端采用图优化方法来最小化误差函数,从而提高位姿估计精度。具体来说,它构建了一种稀疏束调整(Sparse Bundle Adjustment, SBA)[^4]模型,其中节点表示相机的关键帧(Keyframes),边则代表关键帧之间的相对约束关系。 - **能量函数定义**: 能量函数通常由 reprojection error 和 odometry constraint 组成。通过最小化该目标函数可以得到最优的状态变量集合。 \[ E(\mathbf{X},\{\mathbf{T}_i\})=\sum_{ij} e_r (\mathbf{x}_{ij};\mathbf{T}_i,\mathbf{T}_j)^T \Sigma^{-1}_{r} e_r (\mathbf{x}_{ij};\mathbf{T}_i,\mathbf{T}_j)+\lambda \|\Delta \mathbf{T}\|^2 \] 这里 \(e_r\) 表示重投影误差项,而第二项用于平滑运动变化[^5]。 - **求解器选择**: Ceres Solver 或 g2o 库被广泛应用于此类非线性最优化问题中。这些工具能够高效处理大规模稀疏矩阵运算,并支持多种损失函数配置以增强鲁棒性[^6]。 #### 2. 关键帧管理与回环闭合 (Keyframe Management & Loop Closure) 为了减少计算复杂度并保持实时性能,ORB-SLAM3 实现了动态关键帧选取机制。只有当当前帧满足一定条件(如距离上一关键帧较远或者视角改变较大时)才会被标记为新的关键帧加入到全局地图结构当中[^7]。 另外,在识别到潜在循环路径之后,系统会启动专门模块执行局部地图修正操作(Local Map Correction),并通过 ICP 算法进一步精调姿态转换参数[^8]。 #### 3. 多传感器融合策略 (Multi-Sensor Fusion Strategy) 对于扩展版本——即包含 IMU 数据输入的情况而言,还需要考虑如何将惯性测量单元的信息融入整体框架之内。一般做法是在原有状态向量基础上增加角速度偏差(bias_gyro)及加速度计偏移量(bias_accel)作为待估测未知数;与此同时引入额外的动力学方程组描述刚体动力学特性[^9]。 ```cpp // Example Code Snippet Showing How To Add Bias Terms In State Vector For Multi Sensor Fusion Case. struct State { SE3 pose; Vec3 velocity; Vec3 bias_gyro; // Gyroscope biases added here. Vec3 bias_accelerometer;// Accelerometer biases also included now. }; ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值