已知:若干个关键帧中,某些像素点对应了同一个新路标点(换言之,某一个路标点被若干个关键帧观测到)(像素点之间的对应关系或关联,可以通过光流跟踪、特征匹配等得到)。
将该已知数学化:已知第kkk帧上该像素的归一化平面坐标为Pck=[uk,vk,1]T,(k=1,2,⋯ ,n)P_{c_k}=[u_k,v_k,1]^T,(k=1,2,\cdots,n)Pck=[uk,vk,1]T,(k=1,2,⋯,n),且已知第kkk帧(相对于世界坐标系的)位姿Tk=[Rk,tk]3×4T_k=[R_k,t_k]_{3\times 4}Tk=[Rk,tk]3×4,求该新路标点的世界坐标系下的坐标Pw=[X,Y,Z,1]TP_w=[X,Y,Z,1]^TPw=[X,Y,Z,1]T(取齐次坐标)。
【注意】此处得位姿是TcwT_{cw}Tcw,我们知道在【VINS课件及代码】中位姿得定义是TwcT_{wc}Twc,因此需要一步转换!!Rcw=RwcT,tcw=−RwcTtwcR_{cw}=R^T_{wc},t_{cw}=-R^T_{wc}t_{wc}Rcw=RwcT,tcw=−RwcTtwc
根据投影关系:
λkPck=TkPw,(k=1,2,⋯ ,n)\lambda_kP_{c_k}=T_kP_w, \quad(k=1,2,\cdots,n)λkPck=TkPw,(k=1,2,⋯,n)
式中,λk\lambda_kλk为第kkk帧坐标系下新路标点的深度值,是未知量(但同时我们不关心,应该消去该未知量)。
展开:
λk[ukvk1]=[Tk,11Tk,12Tk,13Tk,14Tk,21Tk,22Tk,23Tk,24Tk,31Tk,32Tk,33Tk,34]Pw[λkukλkvkλk]=[Tk,1TTk,2TTk,3T]Pw\begin{aligned}
\lambda_k \begin{bmatrix} u_k \\ v_k \\1
\end{bmatrix} &= \begin{bmatrix} T_{k,11} & T_{k,12} & T_{k,13} & T_{k,14} \\
T_{k,21} & T_{k,22} & T_{k,23} & T_{k,24}\\
T_{k,31} & T_{k,32} & T_{k,33} & T_{k,34}\\
\end{bmatrix}P_w \\
\begin{bmatrix} \lambda_k u_k \\ \lambda_k v_k \\ \lambda_k
\end{bmatrix} &= \begin{bmatrix} T^T_{k,1}\\ T^T_{k,2}\\ T^T_{k,3}\\
\end{bmatrix} P_w
\end{aligned}λk⎣⎡ukvk1⎦⎤⎣⎡λkukλkvkλk⎦⎤=⎣⎡Tk,11Tk,21Tk,31Tk,12Tk,22Tk,32Tk,13Tk,23Tk,33Tk,14Tk,24Tk,34⎦⎤Pw=⎣⎡Tk,1TTk,2TTk,3T⎦⎤Pw
消去λk\lambda_kλk得:
[ukTk,3TyvkTk,3Ty]=[Tk,1TTk,2T]Pw[ukTk,3T−Tk,1TvkTk,3T−Tk,2T]Pw=0\begin{aligned}
\begin{bmatrix} u_k T^T_{k,3}y \\ v_k T^T_{k,3} y
\end{bmatrix} &= \begin{bmatrix} T^T_{k,1}\\ T^T_{k,2}
\end{bmatrix} P_w \\
\begin{bmatrix} u_k T^T_{k,3} - T^T_{k,1} \\ v_k T^T_{k,3} - T^T_{k,2}
\end{bmatrix} P_w&= 0
\end{aligned}[ukTk,3TyvkTk,3Ty][ukTk,3T−Tk,1TvkTk,3T−Tk,2T]Pw=[Tk,1TTk,2T]Pw=0
每一帧可以贡献上述两个方程,将nnn帧都罗列出来,如下:
[u1T1,3T−T1,1Tv1T1,3T−T1,2Tu2T2,3T−T2,1Tv2T2,3T−T2,2T⋯⋯unTn,3T−Tn,1TvnTn,3T−Tn,2T]Pw=0DPw=0\begin{aligned}
\begin{bmatrix} u_1 T^T_{1,3} - T^T_{1,1} \\ v_1 T^T_{1,3} - T^T_{1,2} \\
u_2 T^T_{2,3} - T^T_{2,1} \\ v_2 T^T_{2,3} - T^T_{2,2} \\
\cdots \\ \cdots \\
u_n T^T_{n,3} - T^T_{n,1} \\ v_n T^T_{n,3} - T^T_{n,2} \\
\end{bmatrix} P_w &= 0 \\
D P_w &=0
\end{aligned}⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡u1T1,3T−T1,1Tv1T1,3T−T1,2Tu2T2,3T−T2,1Tv2T2,3T−T2,2T⋯⋯unTn,3T−Tn,1TvnTn,3T−Tn,2T⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤PwDPw=0=0
解上述线性方程即可求得新路标点得齐次坐标PwP_wPw。
【注】:因为我们确定有非零解,故应该有rank(D)=3rank(D)=3rank(D)=3;在非常理想情况下(即观测无噪声、位姿估计准确)或许可以实现。但是!! 实际情况却是观测有噪声,位姿估计有误差,故一般情况下是rank(D)=4rank(D)=4rank(D)=4,此时去求解该齐次方程,只能得到零解!!
那么,如何才能从含有一定“噪声”的方程组DPw=0DP_w=0DPw=0中,求解得到非零解P_w呢?
【转化】为寻找最小二乘解:
miny∥Dy∥22,s.t.∥y∥=1\min_{y} \| Dy \|^2_2, \quad s.t. \| y\|=1ymin∥Dy∥22,s.t.∥y∥=1
该式的含义为,寻找使得DyDyDy的二范数取得最小值得yyy,且这个yyy得模长为1(该条件主要是为了规避yyy为零解得情况)。
此处直接给出结论:y=U4y=U_4y=U4即为该最小二乘问题得解。
其中U4U_4U4为对DTDD^TDDTD进行奇异值分解得到的奇异值σ4\sigma_4σ4对应的向量(或酉矩阵第4列)。
取得y=U4y=U_4y=U4,只需同除以第四个元素,转化为齐次坐标即可。
【对奇异值得一些理解】
每个矩阵AAA都可以表示为一系列秩为1的“小”矩阵的和,而奇异值则是“小”矩阵前的权重,衡量了某个“小”矩阵对于AAA的权重。
奇异值分解和特征值分解的区别:
所有的矩阵都可以进行奇异值分解,而只有方阵才可以进行特征值分解。
当所给的矩阵是对称的方阵时,AT=AA^T=AAT=A,奇异值分解和特征值分解的结果是相同的。即,对称矩阵的特征值分解是所有奇异值分解的一个特例。但是二者还是存在一些小的差异,奇异值分解需要对奇异值从大到小的排序,且奇异值均大于等于零。
Matlab代码:
对于特征值分解 [v,d] = eig(A) , 即 A = v*d*inv(v);
对于奇异值分解,其分解的基本形式为 [u,s,v] = svd(C), C = u*s*v'.
若C阵为对称的方阵, 则有 u = v; 所以有 C = v*s*v'。

929

被折叠的 条评论
为什么被折叠?



