天天看點

視覺SLAM十四講第三章學習與疑問與課後題

視覺SLAM十四講第三章

主要内容有旋轉矩陣,旋轉向量(軸角),歐拉角,四元數。從原理到實踐。四元數沒了解的可以看這個。

個人疑問:

1.外積表示旋轉,但角度為45度和135度時,外積大小和方向都相等,是否有問題?還是說可以表示旋轉但允許不同旋轉同外積。

2.程式中有如下内容

// 特征值
// 實對稱矩陣可以保證對角化成功
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver (matrix33.transpose()*matrix33 ); 
cout << "Eigen values = \n" << eigen_solver.eigenvalues() << endl;
cout << "Eigen vectors = \n" << eigen_solver.eigenvectors() << endl;           

計算得到的特征值和特征向量和手算不一緻。

T1

由于旋轉矩陣的轉置矩陣和其本身相乘為機關矩陣,故旋轉矩陣的轉置矩陣和其逆矩陣相等,是以旋轉矩陣為正交矩陣。之是以旋轉矩陣的轉置矩陣和其本身相乘為機關矩陣,是因為相乘後對角線上都是

視覺SLAM十四講第三章學習與疑問與課後題

的形式,機關向量方向相同乘積為1,非對角線相乘均為方向垂直的機關向量,得數為0。

T3

答案在這裡。我在計算時,在一開始就把虛部展開,是以運算就很複雜,提取完可能為實部構成的因子後,整理就比較簡單了。

T4

書上都有,也可以看這裡。

T5

#include <iostream>
#include <cmath>
using namespace std;

#include <Eigen/Core>
// Eigen 幾何子產品
#include <Eigen/Geometry>
int main(int argc, char **argv) {
    Eigen::Matrix<float, 10, 10> matrix_test;        //聲明一個10*10的float矩陣  
    matrix_test=Eigen::Matrix<float, 10, 10>::Random(); 
    cout << "one:\n" << endl;
    cout << matrix_test << endl;
    for(int i=0;i<3;i++){
	for(int j=0;j<3;j++){
	  if(i==j){matrix_test(i,j)=1;}
	  else    {matrix_test(i,j)=0;}
      }
    }
    cout << "then\n" << endl;
    cout << matrix_test << endl;
    return 0;
}           

T7

#include <iostream>
#include <cmath>

// Eigen 部分
#include <Eigen/Core>
// 稠密矩陣的代數運算(逆,特征值等)
#include <Eigen/Dense>
//Eigen 幾何子產品
#include <Eigen/Geometry>

using namespace std;


int main(int argc, char **argv) {
    Eigen::Quaterniond q1(0.35, 0.2, 0.3, 0.1);
    Eigen::Quaterniond q2(-0.5, 0.4, -0.1, 0.2);
    Eigen::Vector3d t1(0.3, 0.1, 0.1);
    Eigen::Vector3d t2(-0.1, 0.5, 0.3);
    Eigen::Vector3d p1(0.5, 0, 0.2);
    
    Eigen::Quaterniond q1_one = q1.normalized();
    Eigen::Quaterniond q2_one = q2.normalized();
    
    //way1
    
    Eigen::Vector3d v = q1_one.inverse() * (p1 - t1);
    Eigen::Vector3d v2 = q2_one * v + t2;
    cout << "way1 v2 = " << endl << v2 << endl;
  
    //way2  
  
    Eigen::Matrix3d R1 = Eigen::Matrix3d(q1_one);
    Eigen::Matrix3d R2 = Eigen::Matrix3d(q2_one);
    Eigen::Vector3d v_2 = R1.inverse() * (p1 - t1);
    Eigen::Vector3d v_2_2 = R2 * v_2 + t2;
    cout << "way2 v2= " << endl << v_2_2 << endl; 
    return 0;
}           

繼續閱讀