扰动的意义
在视觉SLAM和机器人学里,“扰动”就是你给当前状态(比如相机位姿)加的一个微小的虚拟“推力”或“拧动”。
它不是真实发生的运动,而是你在数学上假想它动了一点点,目的是为了观测“状态动一下,误差会变多少”,从而算出优化的方向。
为了让你透彻理解,我们从三个层面拆解:
1. 为什么非要用“扰动”?(数学上的无奈)
在优化位姿时,我们需要求误差对位姿的导数(雅可比矩阵)。
对于平移 t,很简单:t+Δt,直接加个微小位移就行。
但对于旋转矩阵 R,问题来了:R+ΔR 是非法的!因为两个旋转矩阵相加的结果不再是正交矩阵,会破坏旋转的数学结构。
解决办法:我们不在旋转矩阵本身上加,而是跑到它的“切空间”(即李代数 so(3))里加一个微小向量 ϕ,然后再通过指数映射 exp([ϕ]×) 变回合法的旋转。这个在切空间里加的微小向量 ϕ,就是我们说的“扰动”。
2. 物理直觉上,它是什么?(拧动)
假设相机当前姿态是 RR。
左扰动exp([ϕ]×)⋅R:意思是在相机坐标系下,给相机绕 X/Y/Z 轴分别拧动 ϕ1,ϕ2,ϕ3 这么小的角度。
右扰动R⋅exp([ϕ]×):意思是在世界自身坐标系下拧动它。
ORB-SLAM3的MLPnP采用的是左扰动模型。这个 ϕ=(ϕ1,ϕ2,ϕ3) 就是扰动量,它的方向是旋转轴,大小是旋转弧度。
3. 在优化(高斯-牛顿)中,它扮演什么角色?(试探工具)
在迭代优化中,扰动是试探步长。整个流程是:
计算当前误差:算出当前位姿下的重投影误差 e。
施加虚拟扰动:假想给位姿加了一个微小扰动 ϕ(还有平移扰动 ρ)。
预测变化:用雅可比矩阵 JJ 算出“如果加了扰动,误差会变成 e+J⋅δ”。
求最优步长:解方程 HΔx=b,算出一个最优的扰动增量Δx=(ϕ∗,ρ∗)。
真正“吸收”扰动:把这个最优扰动左乘到当前位姿上(R←exp([ϕ∗]×)R,t←t+ρ∗)。
💎 一句话总结代码中的对应
你之前看到的-skew(R * p_i)(即 −(Rpi)×),就是在问这样一个问题:
“如果我在相机坐标系下,给相机施加一个微小的旋转扰动 ϕ,那么空间中的3D点 pi 在相机坐标系下的位置会变动多少?”
它的数学答案就是:Rpi 这个向量被扰动 ϕ 叉积后的反方向(即 -ϕ×(Rpi) 的线性化形式)。
把这个搞透,你对整个视觉SLAM后端优化的理解就打通了80%
