eigen 的欧拉角表示顺序

 欧拉角的顺序:

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

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Eigen是一个C++的线性代数库,它提供了许多数学工具和函数来进行矩阵和向量的运算。Eigen库中也提供了四元数与欧拉角的转换函数。 四元数是一种扩展了复数概念的数学工具,用来表示三维空间中的旋转。它由一个实部和三个虚部组成,可以表达旋转的角度和轴向。 欧拉角是一种常见的旋转表示方法,它将旋转分解为绕三个坐标轴(通常是X、Y、Z轴)的旋转角度。 在Eigen库中,我们可以使用Quaternion类来表示四元数,并使用AngleAxis类来表示旋转角度和轴向。要将四元数转换为欧拉角,可以使用toRotationMatrix函数将四元数转换为旋转矩阵,然后使用matrix()函数提取旋转矩阵中的欧拉角。 具体的代码示例如下: ```cpp #include <Eigen/Geometry> int main() { Eigen::Quaterniond quat(0.707, 0, 0.707, 0); // 示例四元数 Eigen::Matrix3d rotation_matrix = quat.toRotationMatrix(); // 将四元数转换为旋转矩阵 Eigen::Vector3d euler_angles = rotation_matrix.eulerAngles(2, 1, 0); // 获取旋转矩阵中的欧拉角 return 0; } ``` 在上述代码中,我们首先定义了一个示例的四元数,然后使用toRotationMatrix函数将其转换为旋转矩阵。最后,使用eulerAngles函数从旋转矩阵中提取出欧拉角。这里的eulerAngles函数的三个参数分别表示在Z轴、Y轴和X轴旋转的顺序。 通过上述代码,我们可以得到四元数转换为欧拉角的结果。注意,在具体应用中,可能还需要考虑一些余弦函数的特殊情况处理以及单位转换等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值