欧拉角的顺序:
Eigen::Vector3d euler_t = rot.eulerAngles(2, 1, 0);//代表xyz顺序,euler_t(0)放的是Z的值
Eigen::AngleAxisd Y(euler(2), Eigen::Vector3d::UnitZ());
Eigen::AngleAxisd P(euler(1), Eigen::Vector3d::UnitY());
Eigen::AngleAxisd R(euler(0), Eigen::Vector3d::UnitX());也代表xyz顺序
最开始的欧拉角存在Vector3d中的顺序是xyz,rot.eulerAngles(2, 1, 0)转换之后在euler_t (0)放的是Z的值。
返回值的范围The returned angles are in the ranges [0:pi]x[-pi:pi]x[-pi:pi]。
因为章动角表示oxy平面转动的夹角,变化范围为0-π,且即使章动角无法大于π,通过其它路径同样可以旋转至任意位置
#include <iostream>
#include <random>
#include <Eigen/Core>
#include <Eigen/Geometry>
int main() {
// 1. 给定欧拉角和旋转矩阵given euler angles and rotation matrix
Eigen::Vector3d euler;
Eigen::Matrix3d rot;
euler << (-176.8486 / 180.0) * M_PI, (89.1405 / 180.0) * M_PI, (4.1774 / 180.0) * M_PI;
{
Eigen::AngleAxisd Y(euler(2), Eigen::Vector3d::UnitZ());
Eigen::AngleAxisd P(euler(1), Eigen::Vector3d::UnitY());
Eigen::AngleAxisd R(euler(0), Eigen::Vector3d::UnitX());
rot = Eigen::Quaterniond(Y*P*R).toRotationMatrix();
}
// 2. 利用由给定旋转矩阵计算的欧拉角生成一个新的旋转矩阵
Eigen::Matrix3d rot_from_euler_mine;
Eigen::Vector3d euler_mine;
euler_mine(0) = std::atan2(rot(2, 1), rot(2, 2));
euler_mine(1) = std::atan2(-rot(2, 0), std::sqrt(rot(2, 1) * rot(2, 1) + rot(2, 2) * rot(2, 2)));
euler_mine(2) = std::atan2(rot(1, 0), rot(0, 0));
{
Eigen::AngleAxisd Y(euler_mine(2), Eigen::Vector3d::UnitZ());
Eigen::AngleAxisd P(euler_mine(1), Eigen::Vector3d::UnitY());
Eigen::AngleAxisd R(euler_mine(0), Eigen::Vector3d::UnitX());
rot_from_euler_mine = Eigen::Quaterniond(Y*P*R).toRotationMatrix();
}
// 3. 利用给定的旋转矩阵,使用eulerAngles()生成新的旋转矩阵
Eigen::Matrix3d rot_from_euler_t;
Eigen::Vector3d euler_t = rot.eulerAngles(2, 1, 0);//代表xyz顺序,euler_t(0)放的是Z的值
{
Eigen::AngleAxisd Y(euler_t(0), Eigen::Vector3d::UnitZ());
Eigen::AngleAxisd P(euler_t(1), Eigen::Vector3d::UnitY());
Eigen::AngleAxisd R(euler_t(2), Eigen::Vector3d::UnitX());
rot_from_euler_t = Eigen::Quaterniond(Y*P*R).toRotationMatrix();
}
std::cout << "=== 1. 给的定欧拉角 =======================================================" << std::endl;
std::cout << euler(0)*180.0/M_PI << ", " << euler(1) *180.0 / M_PI << ", " << euler(2)*180.0 / M_PI << std::endl;
std::cout << "=== 2.给定旋转矩阵的欧拉角 (using eulerAngles()) ==========================" << std::endl;
std::cout << euler_t(2)*180.0 / M_PI << ", " << euler_t(1) *180.0 / M_PI << ", " << euler_t(0) *180.0 / M_PI << std::endl;
std::cout << "=== 3. 给定旋转矩阵的欧拉角 (using my calculation) ========================" << std::endl;
std::cout << euler_mine(0)*180.0 / M_PI << ", " << euler_mine(1) *180.0 / M_PI << ", " << euler_mine(2)*180.0 / M_PI << std::endl;
std::cout << "=== 1. given rotation matrix ===============================================" << std::endl;
std::cout << rot << std::endl;
std::cout << "=== 2. rotation matrix from my calculation =================================" << std::endl;
std::cout << rot_from_euler_mine << std::endl;
std::cout << "=== 3. rotation matrix from eulerAngles() ==================================" << std::endl;
std::cout << rot_from_euler_t << std::endl;
std::cout << "=== !! 这应该是一个单位矩阵 ================================================" << std::endl;
std::cout << rot.inverse() * rot_from_euler_mine << std::endl;
std::cout << "=== !! 这应该是一个单位矩阵 too ============================================" << std::endl;
std::cout << rot.inverse() * rot_from_euler_t << std::endl;
std::cout << std::endl;
return 0;
}
转载自:
https://stackoverflow.com/questions/54125208/eigen-eulerangles-returns-incorrect-values