在 ORB-SLAM3 的优化代码中,e->setInformation(Info) 这行看似简单,却决定了每条边在优化中的权重,并直接关系到马氏距离计算与卡方离群点检验。下面把它拆开讲透。
1. 它设置的是什么?

2. 代码中的具体赋值
以单目边为例:
cpp
const float invSigma2 = pFrame->mvInvLevelSigma2[kpUn.octave];
Eigen::Matrix2d Info = Eigen::Matrix2d::Identity() * invSigma2;
e->setInformation(Info);

3. 为什么这样设计?
ORB-SLAM 在提取特征点时,为每个金字塔层级预设了一个尺度因子 scaleFactor,层级越高,图像被缩得越小,特征点定位的像素误差会相应放大。

这样,高层(粗尺度)的边因为噪声大,信息矩阵的值就小,在优化中的权重自动降低;低层(精细尺度)的边权重更高。这是多尺度特征融合优化的标准做法。
4. 在优化中的作用
点------这完全是基于信息矩阵正确设置了噪声水平的前提。
c. 与鲁棒核协作
Huber 核的阈值 δ 也是基于加权误差(马氏距离)设定的。如果信息矩阵不准确,整个鲁棒框架都会失效。
5. 各向同性假设是否合理?
ORB-SLAM 假设像素两个方向的噪声独立且方差相等,这是一个强假设,但在大多数情况下足够好。如果需要处理更复杂的噪声模型(如仿射噪声),信息矩阵将不再是对角矩阵,需要传入完整的协方差。MLPnP 部分就是考虑完整协方差的例子。
一句话总结 :setInformation(Info) 为边赋予了基于金字塔层级的噪声权重,使优化器能够按传感器精度合理分配各观测的贡献,并使得卡方检验和鲁棒核正常工作。这是 ORB-SLAM 维持高精度与鲁棒性的基础细节之一。
