我正在进行一个涉及Aruco标记和OpenCV的项目。
我已经在项目进展中相当远了。我可以读取旋转向量并使用OpenCV中的rodrigues()将其转换为rodrigues矩阵。
这是我得到的一种rodrigues矩阵示例:
[0,1,0;
1,0,0;
0,0,-1]
我使用以下代码。
我使用预定义的rot2euler将罗德里格斯矩阵转换为欧拉角。 并将接收到的弧度转换为角度。
rot2euler看起来像下面这样。
如果我使用作为示例的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函数的详细解释,那将不胜感激。
顺祝商祺,
Brent Convens
这是我得到的一种rodrigues矩阵示例:
[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将罗德里格斯矩阵转换为欧拉角。 并将接收到的弧度转换为角度。
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函数的详细解释,那将不胜感激。
顺祝商祺,
Brent Convens