深蓝学院《从零开始手写VIO》作业六
深藍學院《從零開始手寫VIO》作業五
- 深藍學院《從零開始手寫VIO》作業六
- 1. 證明題
- 2. 代碼題
深藍學院《從零開始手寫VIO》作業六
1. 證明題
證明Dy=0Dy=0Dy=0的最優解yyy等于DTDD^TDDTD的最小奇異值對應的奇異值向量
矩陣DTDD^TDDTD的奇異值分解如下:
D?D=∑i=14σi2uiuj?\mathbf{D}^{\top} \mathbf{D}=\sum_{i=1}^{4} \sigma_{i}^{2} \mathbf{u}_{i} \mathbf{u}_{j}^{\top} D?D=i=1∑4?σi2?ui?uj??
回顧我們的原始問題如下:
求解D2n×4y4×1=0D_{2n×4}y_{4×1}=0D2n×4?y4×1?=0,這是一個超定方程,本質上求解得到的是一個最小二乘解,使用如下表示:
min?y∣∣Dy∣∣2=(Dy)T(Dy)=yTDTDy\min _{y} ||Dy||^2 = (Dy)^T(Dy) = y^TD^TDyymin?∣∣Dy∣∣2=(Dy)T(Dy)=yTDTDy
其中∣∣y∣∣=1||y|| = 1∣∣y∣∣=1
yyy可以由DTDD^TDDTD的奇異值向量線性組合得到,也就是可以表示成如下形式
y=∑i=14kiui=kiui+vy = \sum_{i=1}^{4} k_iu_i = k_iu_i+vy=i=1∑4?ki?ui?=ki?ui?+v
其中v=∑j=1,j=?i4kjujv=\sum_{j=1,j\not=i}^{4}k_ju_j v=j=1,j?=i∑4?kj?uj?
ki,kj∈Rk_i,k_j \in Rki?,kj?∈R
容易知道uiu_iui?和vvv正交。
將yyy代入yTDTDyy^TD^TDyyTDTDy得到
min?y∣∣Dy∣∣2=(kiui+v)TDTD(kiui+v)=ki2uiTDTDui+vTDTDv+kiuiTDTDv+kivTDTDui\min _{y} ||Dy||^2 = (k_iu_i+v)^TD^TD(k_iu_i+v) = k_i^2u_i^TD^TDu_i+ v^TD^TDv + k_iu_i^TD^TDv +k_iv^TD^TDu_iymin?∣∣Dy∣∣2=(ki?ui?+v)TDTD(ki?ui?+v)=ki2?uiT?DTDui?+vTDTDv+ki?uiT?DTDv+ki?vTDTDui?
由于uiu_iui?和vvv正交,所以后兩項為0;并且Dui=σiuiDu_i = \sigma_iu_iDui?=σi?ui?,帶入得到
min?y∣∣Dy∣∣2=(kiui+v)TDTD(kiui+v)=ki2uiTDTDui+vTDTDv=ki2σi2∣∣ui∣∣2+vTDTDv>=ki2σi2∣∣ui∣∣2\min _{y} ||Dy||^2 = (k_iu_i+v)^TD^TD(k_iu_i+v) = k_i^2u_i^TD^TDu_i+ v^TD^TDv = k_i^2\sigma_i^2||u_i||^2 + v^TD^TDv >= k_i^2\sigma_i^2||u_i||^2ymin?∣∣Dy∣∣2=(ki?ui?+v)TDTD(ki?ui?+v)=ki2?uiT?DTDui?+vTDTDv=ki2?σi2?∣∣ui?∣∣2+vTDTDv>=ki2?σi2?∣∣ui?∣∣2
當且僅當v=0v=0v=0的時候等號成立。
如果想取得最小值,則σi=σ4\sigma_i=\sigma_4σi?=σ4?,也就是取得最小奇異值的時候,目標函數取得最小值,此時
y=k4u4+v=k4u4y = k_4u_4+v=k_4u_4y=k4?u4?+v=k4?u4?
由于∣∣y∣∣=1||y||=1∣∣y∣∣=1,所以k4=1k_4=1k4?=1,所以
y=u4y = u_4y=u4?
證明完畢。
2. 代碼題
代碼如下:
/// TODO::homework; 請完成三角化估計深度的代碼// 遍歷所有的觀測數據,并三角化Eigen::Vector3d P_est; // 結果保存到這個變量P_est.setZero();/* your code begin */Eigen::MatrixXd matD = ConstructMatrixD(camera_pose);Eigen::BDCSVD<Eigen::MatrixXd> bcdsvd(matD.transpose()*matD, Eigen::ComputeFullV | Eigen::ComputeFullU);auto singular_values = bcdsvd.singularValues();auto matU = bcdsvd.matrixU();auto matV = bcdsvd.matrixV();// result 1auto tmp_y = matU.rightCols(1);auto real_y = tmp_y/tmp_y(3);// result2double s = matD.maxCoeff();Eigen::Matrix4d scale_mat = Eigen::Matrix4d::Identity()/s;auto matD_new = matD*scale_mat;Eigen::BDCSVD<Eigen::MatrixXd> bcdsvd_new(matD_new.transpose()*matD_new, Eigen::ComputeFullV | Eigen::ComputeFullU);auto matU_new = bcdsvd_new.matrixU();auto tmp_y_new = scale_mat*matU_new.rightCols(1); //結果一樣auto real_y_new = tmp_y_new/tmp_y_new(3);/* your code end */結果如下:
ground truth: -2.9477 -0.330799 8.43792 [normal solve] your result1: -2.9477 -0.330799 8.43792 1 [using Scale solve] your result2: -2.9477 -0.330799 8.43792 1總結
以上是生活随笔為你收集整理的深蓝学院《从零开始手写VIO》作业六的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深蓝学院《从零开始手写VIO》作业五
- 下一篇: 深蓝学院《从零开始手写VIO》作业七