日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深蓝学院《从零开始手写VIO》作业六

發布時間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深蓝学院《从零开始手写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=14?σ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?Dy2=(Dy)T(Dy)=yTDTDy
其中∣∣y∣∣=1||y|| = 1y=1

yyy可以由DTDD^TDDTD的奇異值向量線性組合得到,也就是可以表示成如下形式
y=∑i=14kiui=kiui+vy = \sum_{i=1}^{4} k_iu_i = k_iu_i+vy=i=14?ki?ui?=ki?ui?+v
其中v=∑j=1,j=?i4kjujv=\sum_{j=1,j\not=i}^{4}k_ju_j v=j=1,j?=i4?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?Dy2=(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?Dy2=(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||=1y=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》作业六的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。