MLPnP 3D点到切平面的投影过程
这个残差函数是MLPnP算法的核心几何约束。它巧妙地绕开了传统PnP算法必须求解深度(尺度)这一难题,将3D-2D的匹配关系转化为了纯粹的方向一致性约束。
下面,我把这个约束从几何直觉到数学推导,再到代码落地,完整地拆解给你看。
5. 代码中的直观对应(ORB-SLAM3)
在MLPnPsolver.cc的高斯-牛顿迭代中,你看到的代码正是这个公式的直接翻译:
cpp
// 1. 变换到相机坐标系 Vector3d p_cam = R * p_i + t; // 2. 构造切平面投影矩阵 W = I - v*v^T Matrix3d W = Matrix3d::Identity() - v * v.transpose(); // 3. 计算残差:将点投影到切平面 Vector3d error = W * p_cam;
💎 几何本质总结
这个残差函数在几何上测量的是:“当前估计的3D点位置,偏离观测光线(Bearing Vector)的垂直距离”。
它把复杂的“透视投影”问题,简化为了“将点投影到平面,使误差最小化”的线性代数问题。正因如此,MLPnP才能在不依赖特定相机模型(针孔、鱼眼、全景)的情况下,仅凭方向向量 vivi 就能鲁棒地求解位姿。😊