eigen旋转矩阵与欧拉角的转换

这篇具有很好参考价值的文章主要介绍了eigen旋转矩阵与欧拉角的转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

欧拉角转旋转矩阵(zyx)

// 使用eigen库,欧拉角转旋转矩阵
	Eigen::Matrix3d rotation_matrix1, rotation_matrix2;
	rotation_matrix1 =
		Eigen::AngleAxisd(euler_angle[2], Eigen::Vector3d::UnitZ()) *
		Eigen::AngleAxisd(euler_angle[1], Eigen::Vector3d::UnitY()) *
		Eigen::AngleAxisd(euler_angle[0], Eigen::Vector3d::UnitX());
	cout << "\nrotation matrix1 =\n" << rotation_matrix1 << endl << endl;

旋转矩阵转欧拉角

// 使用egigen将旋转矩阵转换为欧拉角
Eigen::Vector3d eulerAngle1 = 
	rotation_matrix1.eulerAngles(2, 1, 0); //zyx顺序
cout << "roll_2 pitch_2 yaw_2 = " << eulerAngle1[2] 
	<< " " << eulerAngle1[1]
	<< " " << eulerAngle1[0] << endl << endl;

完整代码

#include<iostream>
#include<Eigen/Core>
#include<Eigen/Geometry>

using namespace std;

Eigen::Matrix3d eulerAnglesToRotationMatrix(Eigen::Vector3d& theta);
bool isRotationMatrix(Eigen::Matrix3d R);
Eigen::Vector3d rotationMatrixToEulerAngles(Eigen::Matrix3d& R);

const double ARC_TO_DEG = 57.29577951308238;
const double DEG_TO_ARC = 0.0174532925199433;

int main()
{
	// 设定车体欧拉角,绕固定轴
	double roll_deg = 0.5; // 绕x轴
	double pitch_deg = 0.8; // 绕y轴
	double yaw_deg = 108.5; // 绕z轴

	// 转换为弧度
	double roll_arc = roll_deg * DEG_TO_ARC;
	double pitch_arc = pitch_deg * DEG_TO_ARC; 
	double yaw_arc = yaw_deg * DEG_TO_ARC; 

	cout << endl;
	cout << "roll_arc = " << roll_arc << endl;
	cout << "pitch_arc = " << pitch_arc << endl;
	cout << "yaw_arc = " << yaw_arc << endl;

	// 初始化欧拉角
	Eigen::Vector3d euler_angle(roll_arc, pitch_arc, yaw_arc);

	// 使用eigen库,欧拉角转旋转矩阵
	Eigen::Matrix3d rotation_matrix1, rotation_matrix2;
	rotation_matrix1 =
		Eigen::AngleAxisd(euler_angle[2], Eigen::Vector3d::UnitZ()) *
		Eigen::AngleAxisd(euler_angle[1], Eigen::Vector3d::UnitY()) *
		Eigen::AngleAxisd(euler_angle[0], Eigen::Vector3d::UnitX());
	cout << "\nrotation matrix1 =\n" << rotation_matrix1 << endl << endl;

	// 使用自定义函数,欧拉角转旋转矩阵
	rotation_matrix2 = eulerAnglesToRotationMatrix(euler_angle);
	cout << "rotation matrix2 = \n" << rotation_matrix2 << endl << endl;

	// 使用egigen将旋转矩阵转换为欧拉角
	Eigen::Vector3d eulerAngle1 = rotation_matrix1.eulerAngles(2, 1, 0); //zyx顺序
	cout << "roll_2 pitch_2 yaw_2 = " << eulerAngle1[2] << " " << eulerAngle1[1]
		<< " " << eulerAngle1[0] << endl << endl;

	// 使用自定义函数将旋转矩阵转换为欧拉角
	Eigen::Vector3d eulerAngle2 = rotationMatrixToEulerAngles(rotation_matrix1);
	cout << "roll_2 pitch_2 yaw_2 = " << eulerAngle2[0] << " " << eulerAngle2[1]
		<< " " << eulerAngle2[2] << endl << endl;

	return 0;
}

Eigen::Matrix3d eulerAnglesToRotationMatrix(Eigen::Vector3d& theta)
{
	Eigen::Matrix3d R_x;
	R_x <<
		1, 0, 0,
	0, cos(theta[0]), -sin(theta[0]),
		0, sin(theta[0]), cos(theta[0]);

	Eigen::Matrix3d R_y;
	R_y <<
		cos(theta[1]), 0, sin(theta[1]),
		0, 1, 0,
		-sin(theta[1]), 0, cos(theta[1]);

	Eigen::Matrix3d R_z;
	R_z <<
		cos(theta[2]), -sin(theta[2]), 0,
		sin(theta[2]), cos(theta[2]), 0,
		0, 0, 1;
	Eigen::Matrix3d R = R_z * R_y * R_x;
	return R;
}


bool isRotationMatrix(Eigen::Matrix3d R)
{
	double err = 1e-6;
	Eigen::Matrix3d shouldIdentity;
	shouldIdentity = R * R.transpose();
	Eigen::Matrix3d I = Eigen::Matrix3d::Identity();
	return (shouldIdentity - I).norm() < err;
}

Eigen::Vector3d rotationMatrixToEulerAngles(Eigen::Matrix3d& R)
{
	assert(isRotationMatrix(R));
	double sy = sqrt(R(0, 0) * R(0, 0) + R(1, 0) * R(1, 0));
	bool singular = sy < 1e-6;
	double x, y, z;
	if (!singular) {
		x = atan2(R(2, 1), R(2, 2));
		y = atan2(-R(2, 0), sy);
		z = atan2(R(1, 0), R(0, 0));
	}
	else {
		x = atan2(-R(1, 2), R(1, 1));
		y = atan2(-R(2, 0), sy);
		z = 0;
	}
	return { x,y,z };
}

结果

roll_arc = 0.00872665
pitch_arc = 0.0139626
yaw_arc = 1.89368

rotation matrix1 =
 -0.317274  -0.948326 0.00384548
  0.948231  -0.317177  0.0160091
-0.0139622 0.00872568   0.999864

rotation matrix2 =
 -0.317274  -0.948326 0.00384548
  0.948231  -0.317177  0.0160091
-0.0139622 0.00872568   0.999864

roll_2 pitch_2 yaw_2 = 0.00872665 0.0139626 1.89368

roll_2 pitch_2 yaw_2 = 0.00872665 0.0139626 1.89368

文章来源地址https://www.toymoban.com/news/detail-512836.html

到了这里,关于eigen旋转矩阵与欧拉角的转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 四元数,欧拉角和旋转矩阵相互转换

    打印输出: 在线转换网站:1、三维在线旋转变换网站 https://www.andre-gaschler.com/rotationconverter/ 2、 Rotation Conversion Tool https://danceswithcode.net/engineeringnotes/quaternions/conversion_tool.html 3、角度、弧度在线转换工具 https://www.osgeo.cn/app/sc210 参考链接:https://www.jianshu.com/p/4fda4c34b829 https://

    2024年02月14日
    浏览(30)
  • 将欧拉角转换为旋转矩阵(手眼标定)python版本

    1、欧拉角版 2、四元数版 3、旋转矩阵版本 4、齐次矩阵

    2024年02月16日
    浏览(33)
  • 史上最简SLAM零基础解读(8.1) - 旋转矩阵、旋转向量、欧拉角推导与相互转换

    本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始   文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证 {color{blue}{文末正下方中心}提供了本人 color{red} 联系方式,color{blue}点击本人照片即可显示WX→官方认证} 文末正下方中心 提供了本人

    2024年02月13日
    浏览(27)
  • 将一个3x3的OpenCV旋转矩阵转换为Eigen的Euler角

    代码将一个3x3的OpenCV旋转矩阵转换为Eigen的Euler角。

    2024年02月13日
    浏览(20)
  • 持之以恒(一)位姿转换:姿态 / 四元数 / 旋转矩阵 / 欧拉角 及 位姿矩阵

    姿态的几种表示形式, 姿态角 、 四元数 、 欧拉角 、 旋转矩阵 、 位姿矩阵 。 姿态 说明 表示形式 Eigen 姿态角 指的是机体坐标系与地理坐标系的夹角,即旋转向量 rx,ry,rz Eigen::Vector3f(Degrees) 四元数 四元素不存在万向节死锁问题、利用球面插值可以获得均匀的转速 w,x,y,z

    2024年02月15日
    浏览(43)
  • 《动手学机器人学》7.2.4姿态之间的互相转换,Python&&C++支持四元数,欧拉角旋转矩阵、轴角

    本系列教程作者:小鱼 公众号:鱼香ROS QQ交流群:139707339 教学视频地址:小鱼的B站 完整文档地址:鱼香ROS官网 版权声明:如非允许禁止转载与商业用途。 上一节小鱼带你一起学习了四种姿态表示方式,这节课我们就利用相关的开源库,来完成姿态的不同表示方式之间的转

    2024年02月02日
    浏览(37)
  • 【数理知识】三维空间旋转矩阵的欧拉角表示法,四元数表示法,两者之间的转换,Matlab 代码实现

    序号 内容 1 【数理知识】自由度 degree of freedom 及自由度的计算方法 2 【数理知识】刚体 rigid body 及刚体的运动 3 【数理知识】刚体基本运动,平动,转动 4 【数理知识】向量数乘,内积,外积,matlab代码实现 5 【数理知识】最小二乘法,从线性回归出发,数值举例并用最小

    2024年02月12日
    浏览(40)
  • ROS系列——使用python的transforms3d、numpy库实现四元数、旋转矩阵、欧拉角、轴角等的相互转换

    pip3 install transforms3d 四元数模块在transforms3d.quaternions里,直接导入即可使用 2.1.1四元数转旋转矩阵 2.1.2 旋转矩阵转四元数 2.2.1 四元数转轴角 2.2.2 轴角转四元数 四元数模块在transforms3d.euler里,直接导入即可使用 3.1.1 固定轴欧拉角转四元数 3.1.2 四元数转固定轴欧拉角 3.2.1 固定

    2024年02月07日
    浏览(81)
  • 欧拉角与旋转矩阵

    我们想描述刚体在现实世界的旋转时,可以用旋转矩阵、旋转向量,四元数等来表示,虽然它们能描述旋转,但对我们人类是非常不直观的。很难说,给你一个旋转矩阵R或者四元数q,我们能想象出他是怎么旋转的。 欧拉角就可以很直观的展现这种旋转的过程。因为他把整个

    2023年04月09日
    浏览(28)
  • 【欧拉角,旋转矩阵】

        内在旋转与外在旋转的转换关系:互换第一次和第三次旋转的位置则两者结果相同。例如Z-Y-X旋转的内部旋转和X-Y-Z旋转的外部旋转的旋转矩阵相同。   一、绕定轴X-Y-Z旋转(RPY角)(外旋)  假设两个坐标系A和B,二者初始时完全重合。   过程如下:B绕A的X轴旋转γ角,

    2024年02月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包