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部落格