天天看點

視覺SLAM ch3 代碼總結(一)

useGeometry

代碼分别用幾種旋轉方式如 angle axis 、matrix 、變換矩陣、四元數旋轉一個向量v(1,0,0)

最後得出的結果就是旋轉以後的 v丶坐标 。不過變換矩陣的結果加入了平移向量。

在書中不懂的地方自己進行了注釋

1.定義

(1)三維空間坐标定義

Vector3d v(1,0,0)
           

(2)旋轉向量定義

AngleAxisd rotation_vector((M_PI / 4,Vector3d(0,0,1))

//沿Z軸旋轉45度
//使用AngleAxisd定義,AngleAxisd(旋轉角度,旋轉軸機關向量Vector3d) 
//AngleAxisd的底層不直接是Matrix,但由于重載了運算符,是以仍可以當做矩陣運算
           

注意:AngleAxisd不能用cout輸出,以該定義為例,要用rotation_vector.matrix()轉換成矩陣形式才能輸出,但轉換後不再是旋轉向量形式,而是3x3的旋轉矩陣形式。

(3)歐拉角定義

//使用三維縱向量Vector3d定義
Vector3d eulerangles(0,0,0);

           

(4)歐式變換矩陣定義(4x4矩陣)

Isometry3d T = Isometry3d::Identity();

//使用四元數初始化歐式矩陣
Isometry3d T(q)
           

注意:歐氏變換矩陣不能直接用cout輸出,以該定義為例,要使用T.matrix()轉換為矩陣形式輸出,轉換後仍為4x4的歐氏變換矩陣

(5)四元數定義(使用前要歸一化  )

  歸一化方法為:

q.normalize();
           
//使用Vector4d定義,定義格式為(x,y,z,w)   w是實部 
Quaterniond q(Vector4d(1,2,3,4))

//直接指派,定義格式為(w,x,y,z)
Quaterniond q((1,2,3,4));
           

注意:四元數不能直接用cout輸出,以該定義為例,輸出格式為

cout << q.coeffs() << endl;  
//輸出格式為(x,y,z,w)  w是實部 
           

2. 各種表達形式之間的轉換

(1)旋轉向量與旋轉矩陣的轉換

rotation_matrix = rotation_vector.toRotationMatrix();
或者
rotation_matrix = rotation_vector.matrix();    //用matrix轉換成矩陣
           

(2)旋轉矩陣與歐拉角的轉換

eulerangles = rotation_matrix.eulerAngles(2,1,0);
//參數(2,1,0)表示這是ZYX順序
           

(3)歐式變換矩陣按照旋轉矩陣和旋轉向量 旋轉

T.rotate(rotation_matrix);  //按照旋轉矩陣進行旋轉,
T.rotate(rotation_vector);  //按照旋轉向量進行旋轉
           

(4)四元數與旋轉矩陣和旋轉向量的轉換

q = Quaterniond(rotation_matrix);
q = Quaterniond(rotation_vector);
           

3.坐标變換

Vector3d v(1,0,0); //定義初始坐标v
Vector3d v_rotated; //定義坐标轉換後坐标v_rotated
           

(1)使用旋轉矩陣

v_rotated = rotation_matrix * v;
           

(2)使用旋轉向量

v_rotated = rotation_vector * v
           

( 3)使用變換矩陣

Vector3d v_tranformed = T * v;

//相當于 R * v + t   
//使用變換矩陣得出的坐标中加入了平移向量
           

(4)使用四元數

v_rotated = q*v; 

//這裡的乘法是重載過的
//數學上是 q v q{-1}
           

參考

第三講第六節-Eigen幾何子產品_我隻是一隻自動小青蛙的部落格-CSDN部落格

繼續閱讀