本文主要是介绍SVD求解Ax=0,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
源于计算机视觉life的LiDAR+视觉+IMU多传感器融合SLAM:原理推导+源码逐行详解+项目实战
SVD求解Ax=0
首先,我们需要了解四元数的基本概念。四元数是由三个虚部和一个实部组成的复数扩展,可以用来表示三维空间中的旋转。四元数的乘法规则如下:
q 1 ⊗ q 2 = [ q 1 ] L q 2 = [ q 2 ] R q 1 q_1 \otimes q_2 = [q_1]_L q_2 = [q_2]_R q_1 q1⊗q2=[q1]Lq2=[q2]Rq1
其中,
- [ q 1 ] L [q_1]_L [q1]L 是左乘矩阵:
[ p w − p x − p y − p z p x p w − p z p y p y p z p w − p x p z − p y p x p w ] \begin{bmatrix}p_w & -p_x & -p_y & -p_z\\p_x & p_w & -p_z & p_y\\p_y & p_z & p_w & -p_x\\p_z & -p_y & p_x & p_w\end{bmatrix} pwpxpypz−pxpwpz−py−py−pzpwpx−pzpy−pxpw - [ q 1 ] R [q_1]_R [q1]R 是右乘矩阵:
[ q w − q x − q y − q z q x q w − q z q y q y q z q w − q x q z − q y q x q w ] \begin{bmatrix}q_w & -q_x & -q_y & -q_z\\q_x & q_w & -q_z & q_y\\q_y & q_z & q_w & -q_x\\q_z & -q_y & q_x & q_w\end{bmatrix} qwqxqyqz−qxqwqz−qy−qy−qzqwqx−qzqy−qxqw
化简一下,即:
- [ q 1 ] L = q w I + [ 0 − q v → q v → [ q v → ] × ] [q_1]_L = q_w I + \begin{bmatrix}0 & -\overrightarrow{q_v}\\ \overrightarrow{q_v} & [\overrightarrow{q_v}]_{\times}\end{bmatrix} [q1]L=qwI+[0qv−qv[qv]×],
- [ q 1 ] R = q w I + [ 0 − q v → q v → − [ q v → ] × ] [q_1]_R = q_w I + \begin{bmatrix}0 & -\overrightarrow{q_v}\\ \overrightarrow{q_v} & -[\overrightarrow{q_v}]_{\times}\end{bmatrix} [q1]R=qwI+[0qv−qv−[qv]×]
其中,
- [ a ] × ≜ [ 0 − a z a y a z 0 − a x − a y a x 0 ] [\mathbf{a}]_{\times} \triangleq \begin{bmatrix}0 & -a_z & a_y\\a_z & 0 & -a_x\\-a_y & a_x & 0\end{bmatrix} [a]×≜ 0az−ay−az0axay−ax0
对于SVD求解Ax=0,举个例子,如lidar和IMU的外参标定,有以下关系
Q b h + 1 b k L q i l = Q l h + 1 l i R q l b Q^{b_k L}_{b_h+1} q^l_i = Q^{l_i R}_{l_{h+1}} q^b_l Qbh+1bkLqil=Qlh+1liRqlb
合并之后为:
( Q b h + 1 b k L − Q l h + 1 l i R ) q l b = 0 (Q^{b_k L}_{b_h+1} - Q^{l_i R}_{l_{h+1}}) q^b_l = 0 (Qbh+1bkL−Qlh+1liR)qlb=0
通常来说,我们会收集若干个IMU和lidar的相对旋转和平移,则可以联立如下:
[ Q b n − 1 b n L − Q l n − 1 l n R Q b n − 2 b n − 1 L − Q l n − 2 l n − 1 R ⋮ Q b 0 b 1 L − Q l 0 l 1 R ] q l b = A 4 n × 4 q l b = 0 (1) \begin{bmatrix} Q^{b_n L}_{b_{n-1}} - Q^{l_n R}_{l_{n-1}} \\ Q^{b_{n-1} L}_{b_{n-2}} - Q^{l_{n-1} R}_{l_{n-2}} \\ \vdots \\ Q^{b_1 L}_{b_0} - Q^{l_1 R}_{l_0} \end{bmatrix} q^b_l = A_{4n\times 4} q^b_l = 0 \tag{1} Qbn−1bnL−Qln−1lnRQbn−2bn−1L−Qln−2ln−1R⋮Qb0b1L−Ql0l1R qlb=A4n×4qlb=0(1)
相当于已知一个 4 n × 4 4n\times 4 4n×4的小矩阵,求出一个 4 × 1 4\times 1 4×1向量的最优解,通常 n > 4 n > 4 n>4,因此,这是一个基本的超定方程组求解问题,通常使用SVD方法求解。
即将A矩阵进行SVD分解,得
U D V T x = 0 UDV^T x = 0 UDVTx=0
这里U矩阵和V矩阵都是正交矩阵(类比旋转矩阵,不改变大小),D是奇异值由大到小的对角矩阵,因此等价求解
D V T x = 0 DV^T x = 0 DVTx=0
然后,我们令 V T x = y V^T x = y VTx=y,y仍然是一个四元数,所以 ∣ ∣ y ∣ ∣ = 1 ||y||=1 ∣∣y∣∣=1
当仅当 y = [ 0 , 0 , 0 , 1 ] T y=[0,0,0,1]^T y=[0,0,0,1]T时, D y Dy Dy取得最小值,则 x = V ∗ [ 0 , 0 , 0 , 1 ] T x=V*[0,0,0,1]^T x=V∗[0,0,0,1]T
此时对应的 x x x即为V矩阵中最小奇异值对应的列向量,然后将其转换成四元数即为所求的旋转。
这篇关于SVD求解Ax=0的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!