假设我有一个三维框架,旋转滚动= 0,俯仰= 0,偏航= 0分别关于x,y和z轴。
我希望框架围绕x轴旋转3.14159(Pi)或roll = Pi。
以下是上述情况的代码。
问题是,当我想将旋转矩阵转换回滚动,俯仰和偏航时,代码会给出不同的答案。
而不是roll = Pi,结果是roll = 0,pitch = pi,yaw = pi。
我认为Peter Corke在Matlab上提供的RVC工具箱给出了正确答案。
使用我的程序或Eigen的eulerAngles可能有些不合适的东西吗?请帮忙。
代码:
#include <iostream>
#include <Eigen/Dense>
const double PI = 3.14159265359;
int main()
{
using ::Eigen::AngleAxisd;
using ::Eigen::Matrix3d;
using ::Eigen::Vector3d;
using ::std::cout;
using ::std::endl;
Matrix3d R,Rx;
R = AngleAxisd(PI, Vector3d::UnitX())
* AngleAxisd(0, Vector3d::UnitY())
* AngleAxisd(0, Vector3d::UnitZ());
Rx = AngleAxisd(PI, Vector3d::UnitX());
cout << R << endl << endl;
cout << Rx << endl << endl;
Vector3d ea = R.eulerAngles(0,1,2);
Vector3d eax = Rx.eulerAngles(0,1,2);
cout << ea << endl << endl;
cout << eax << endl << endl;
std::cin.ignore();
return 0;
}
输出(我将数字太小到零):
1 0 0
0 -1 0
0 0 -1
1 0 0
0 -1 0
0 0 -1
0
3.14159
3.14159
0
3.14159
3.14159
答案 0 :(得分:1)
欧拉的角度并不是唯一的。在您的XYZ约定中,(0, pi, pi)
和(pi,0,0)
表示相同的旋转,并且两者都是正确的。 Eigen::eulerAngles
方法始终选择最小化第一个角度。
答案 1 :(得分:1)
请参阅Eigen:eulerAngles
的{{3}}。有关欧拉角的各种惯例的详细信息已在documentation和Wikipedia中详细记录。
编辑:
如果您使用内部定义的M_PI
而不是PI的截断值,您将获得准确的结果。
欧拉角表示具有奇点。您要比较的测试用例是一个独特的位置。
如果您希望克服奇点,可能需要使用四元数或轴角表示。
答案 2 :(得分:-1)
不同的订单欧拉角(roll1,pitch1,yaw1或pitch2,yaw2,roll2,...)可以产生相同的旋转矩阵。
实际上,Eigen文件给出了答案。
更仔细地阅读Eigen document的函数声明,您将得到答案。
Matrix< typename MatrixBase< Derived >::Scalar, 3, 1 > Eigen::MatrixBase< Derived >::eulerAngles ( Index a0,
Index a1,
Index a2
) const
三个参数a0,a1,a2中的每一个将相应的旋转轴表示为{0,1,2}中的整数。例如,在:
Vector3f ea = mat.eulerAngles(2, 0, 2);
“2”表示z轴,“0”表示x轴等