欧拉角和旋转矩阵相互转换
生活随笔
收集整理的這篇文章主要介紹了
欧拉角和旋转矩阵相互转换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
1.參考資料?
2.變換矩陣/F/H的svd分解或者旋轉矩陣、平移矩陣求解
3. 歐拉角和旋轉矩陣可同樣表示剛體在三維空間的旋轉,下面分享這兩者互相轉換的方法和核心代碼
1.參考資料?
2.變換矩陣/F/H的svd分解或者旋轉矩陣、平移矩陣求解
- 歐拉角轉旋轉矩陣?
歐拉角通過將剛體繞過原點的軸(i,j,k)旋轉θ,分解成三步,如下圖(藍色是起始坐標系,而紅色的是旋轉之后的坐標系) ,12種方法的其中一種分解示意圖!
?
如果將每一個角度用旋轉矩陣表示如下:?
?
所以,容易得到,歐拉角轉旋轉矩陣如下:?
- 旋轉矩陣轉歐拉角?
將旋轉矩陣表示如下:? - ?
則可以如下表示歐拉角:?
3. 歐拉角和旋轉矩陣可同樣表示剛體在三維空間的旋轉,下面分享這兩者互相轉換的方法和核心代碼
- 歐拉角轉旋轉矩陣
/**
歐拉角計算對應的旋轉矩陣
**/
Mat eulerAnglesToRotationMatrix(Vec3f &theta)
{// 計算旋轉矩陣的X分量Mat R_x = (Mat_<double>(3,3) <<1, ? ? ? 0, ? ? ? ? ? ? ?0,0, ? ? ? cos(theta[0]), ? -sin(theta[0]),0, ? ? ? sin(theta[0]), ? cos(theta[0]));// 計算旋轉矩陣的Y分量Mat R_y = (Mat_<double>(3,3) <<cos(theta[1]), ? ?0, ? ? ?sin(theta[1]),0, ? ? ? ? ? ? ? 1, ? ? ?0,-sin(theta[1]), ? 0, ? ? ?cos(theta[1]));// 計算旋轉矩陣的Z分量Mat R_z = (Mat_<double>(3,3) <<cos(theta[2]), ? ?-sin(theta[2]), ? ? ?0,sin(theta[2]), ? ?cos(theta[2]), ? ? ? 0,0, ? ? ? ? ? ? ? 0, ? ? ? ? ? ? ? ? ?1);// 合并?Mat R = R_z * R_y * R_x;return R;
} - 旋轉矩陣轉歐拉角
/*** 功能: 檢查是否是旋轉矩陣**/
bool isRotationMatrix(Mat &R)
{Mat Rt;transpose(R, Rt);Mat shouldBeIdentity = Rt * R;Mat I = Mat::eye(3,3, shouldBeIdentity.type());return ?norm(I, shouldBeIdentity) < 1e-6; ? ?
}/*** 功能: 通過給定的旋轉矩陣計算對應的歐拉角**/
Vec3f rotationMatrixToEulerAngles(Mat &R)
{assert(isRotationMatrix(R));float sy = sqrt(R.at<double>(0,0) * R.at<double>(0,0) + ?R.at<double>(1,0) * R.at<double>(1,0) );bool singular = sy < 1e-6; // Iffloat x, y, z;if (!singular) {x = atan2(R.at<double>(2,1) , R.at<double>(2,2));y = atan2(-R.at<double>(2,0), sy);z = atan2(R.at<double>(1,0), R.at<double>(0,0));} else {x = atan2(-R.at<double>(1,2), R.at<double>(1,1));y = atan2(-R.at<double>(2,0), sy);z = 0;}return Vec3f(x, y, z); ??
} 程序運行結果展示:
參考?
1.?歐拉角詳解
2. 歐拉角
暫做記錄,后續補充
總結
以上是生活随笔為你收集整理的欧拉角和旋转矩阵相互转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 相声是谁唱的啊?
- 下一篇: 图像特征点检测与匹配评价准则——量化