我正在研究涉及Aruco標記和opencv的項目。 我在項目進展中相當遙遠。我可以讀取旋轉矢量,並使用opencv中的rodrigues()將它們轉換爲rodrigues矩陣。旋轉矩陣與歐拉角與opencv
這是一個Rodrigues的矩陣I得到的一個例子:
[0,1,0;
1,0,0;
0,0,-1]
我使用下面的代碼。
Mat m33(3, 3, CV_64F);
Mat measured_eulers(3, 1, CV_64F);
Rodrigues(rotationVectors, m33);
measured_eulers = rot2euler(m33);
Degree_euler = measured_eulers * 180/CV_PI;
我使用預定義的rot2euler從rodrigues矩陣轉換爲歐拉角。 我將接收到的弧度轉換爲度數。
rot2euler看起來像下面這樣。
Mat rot2euler(const Mat & rotationMatrix)
{
Mat euler(3, 1, CV_64F);
double m00 = rotationMatrix.at<double>(0, 0);
double m02 = rotationMatrix.at<double>(0, 2);
double m10 = rotationMatrix.at<double>(1, 0);
double m11 = rotationMatrix.at<double>(1, 1);
double m12 = rotationMatrix.at<double>(1, 2);
double m20 = rotationMatrix.at<double>(2, 0);
double m22 = rotationMatrix.at<double>(2, 2);
double x, y, z;
// Assuming the angles are in radians.
if (m10 > 0.998) { // singularity at north pole
x = 0;
y = CV_PI/2;
z = atan2(m02, m22);
}
else if (m10 < -0.998) { // singularity at south pole
x = 0;
y = -CV_PI/2;
z = atan2(m02, m22);
}
else
{
x = atan2(-m12, m11);
y = asin(m10);
z = atan2(-m20, m00);
}
euler.at<double>(0) = x;
euler.at<double>(1) = y;
euler.at<double>(2) = z;
return euler;
}
如果我使用rodrigues矩陣,我給出了一個例子,我得到了下面的歐拉角。
[0; 90; -180]
但我想獲得以下內容。
[-180; 0; 90]
當是使用此工具http://danceswithcode.net/engineeringnotes/rotations_in_3d/demo3D/rotations_in_3d_tool.html
可以看到,[0; 90; -180]不匹配rodrigues矩陣,但[-180; 0; 90]。 (我知道這個工具與ZYX座標一起工作的事實)
所以問題是我得到正確的值,但以錯誤的順序。
另一個問題是,情況並非總是如此。 例如rodrigues矩陣:
[1,0,0;
0,-1,0;
0,0,-1]
爲我提供了正確的歐拉角度。
如果有人知道問題的解決方案,或者可以向我提供一個解釋rot2euler函數如何正確工作的解釋。它將受到高度讚賞。
親切的問候
布倫特Convens
兩個不同的euler旋轉可以表示相同的旋轉。使用逆轉換得到3x3矩陣 – hiroki
似乎你是在奇點的情況下據我所知,使用旋轉矩陣來表示90或180度的角度是不方便的(如果它們是正的,負面的),因爲你有奇點的風險,看起來公式是錯誤的...... [看看這篇論文](http://web.mit.edu/2.05/www/Handout/HO 2.PDF) – marcoresk