一 相机位姿优化问题背景概述
在SLAM系统或者自动驾驶系统中有一个很重要的模块,就是定位模块。基于视觉的定位基本思路就是采用将地图中的特征重投影到相机的UV平面,使相同特征之间的重投影误差最小。
例如,自动驾驶中,高精度地图车道线如下左图所示,车载相机看到的车道线如下右图所示,求解车辆位姿就是将下左图的车道线根据相机位姿和外参投影到相机的UV平面,是它和下游图的线完全重合。
二 相机位姿优化问题解决思路
高精度地图根据估计位姿可以投影到相机UV平面,然后求出每个相机UV观测的点到高精度地图的点线距离。那么每个点就可以观测到一个误差E。
dEdV=J
\frac {dE}{dV} = J
dVdE=J
其中 J 是 雅克比矩阵,V 是位姿误差矢量。
ΔV=(JTJ)−1∗JT∗ΔE
\Delta V = (J^T J)^{-1}*J^T*\Delta E
ΔV=(JTJ)−1∗JT∗ΔE
设定位姿初值,然后多次迭代,即可以使重投影误差最小。那么最困难的问题是求出E对V 的雅克比。
三 相机位姿优化雅克比矩阵分步求解
3.1 符号约定
位姿表达式:姿态的等效旋转矢量和位置矢量
θ=[θ1θ2θ3]Rmr=toRotate(θ)tmr=[xyz]V=[θtmr]′
\theta = [\theta1 \quad \theta2 \quad \theta3] \newline
R_{mr} = toRotate(\theta) \newline
t_{mr} = [x \quad y \quad z]\newline
V = [\theta \quad t_{mr}]'
θ=[θ1θ2θ3]Rmr=toRotate(θ)tmr=[xyz]V=[θtmr]′
地图上的点:
Pm=[mxmymz]
P_m = [m_x \quad m_y \quad m_z]
Pm=[mxmymz]
车辆载体系下的点:
Pr=[rxryrz]
P_r = [r_x \quad r_y \quad r_z]
Pr=[rxryrz]
转到相机坐标系下的点:
Pc=[cxcycz]
P_c = [c_x \quad c_y \quad c_z]
Pc=[cxcycz]
转到相机UV平面的点
Pmuv=[umvm]
P_{muv} = [u_m \quad v_m]
Pmuv=[umvm]
相机观测到的UV平面的点
Pcuv=[ucvc]
P_{cuv} = [u_c \quad v_c]
Pcuv=[ucvc]
3.2 分步求解
Pm=Rmr∗Pr+tmrPr=Rmr′(Pm−tmr)Pc=Rcr∗Pr+tcrPmuv=[cxczcycz]′E=Pcuv−Pmuv
P_m = R_{mr}*P_r + t_{mr} \newline
P_r = R_{mr}'(P_m - t_{mr})
\newline
P_c = R_{cr}*P_r + t_{cr} \newline
\newline
P_{muv} =
\begin{matrix}[
\frac {c_x}{c_z} \quad
\frac {c_y}{c_z}
\end{matrix}] '
\newline
E = P_{cuv} - P_{muv}
Pm=Rmr∗Pr+tmrPr=Rmr′(Pm−tmr)Pc=Rcr∗Pr+tcrPmuv=[czcxczcy]′E=Pcuv−Pmuv
于是方向逐级求雅克比:
J1=dEdPmuv=−1
J1 = \frac {d E}{d P_{muv}} = -1 \newline
J1=dPmuvdE=−1
J2=dPmuvdPc=[1cz0−cxcz201cz−cycz2]
J2 = \frac {d P_{muv}} {d P_c} =
\begin{bmatrix}
\frac{1}{c_z} & 0 & -\frac{c_x}{c_z^2} \\
0 & \frac{1}{c_z} & -\frac{c_y}{c_z^2}
\end{bmatrix}
J2=dPcdPmuv=[cz100cz1−cz2cx−cz2cy]
J3=dPcdPr=Rcr
J3 = \frac {d P_c}{d P_r} = R_{cr}
J3=dPrdPc=Rcr
J4=dPrdV=[dPrdθdPrdtmr]′dPrdtmr=−Rmr′dPrdθ=?????
J4 = \frac{d P_r}{d V} = [\frac{d P_r}{d \theta} \quad \frac{d P_r}{d t_{mr}} ] '\newline
\frac{d P_r}{d t_{mr}} = -R_{mr}'\newline
\frac{d P_r}{d \theta} = ?????
J4=dVdPr=[dθdPrdtmrdPr]′dtmrdPr=−Rmr′dθdPr=?????
问号处求导见第六篇文章。
J=J1∗J2∗J3∗J4=dEdPmuv∗dPmuvdPc∗dPcdPr∗dPrdV
J = J1*J2*J3*J4 = \frac {d E}{d P_{muv}} * \frac {d P_{muv}} {d P_c} * \frac {d P_c}{d P_r} * \frac{d P_r}{d V}
J=J1∗J2∗J3∗J4=dPmuvdE∗dPcdPmuv∗dPrdPc∗dVdPr
求出误差函数相对于状态量的雅克比后,运用本章最前面的方法求出状态量的误差量,并减去误差量后,重新计算。反复迭代N次收敛。此方法为高斯牛顿法。
还有一个问题没有解决,就是 J4 中求出相对于等效旋转矢量的雅克比如何求?待后续分解。