Eigen中的刚体变换表达

在Eigen中,旋转矩阵、变换矩阵、欧拉角都可以表示为Eigen库中的特定类型的矩阵。

1、旋转矩阵

旋转矩阵通常用于表示三维空间中的旋转操作。在Eigen中,可以使用Eigen::Matrix3d类型来表示三维的旋转矩阵。通常,旋转矩阵是一个正交矩阵,其转置等于逆,因此可以使用Eigen中的Rotation3D模块来创建和操作旋转矩阵。

例如,创建一个绕z轴旋转45度的旋转矩阵可以这样做:

#include <Eigen/Dense>

int main() {
    Eigen::Matrix3d rotation_matrix;
    double angle = M_PI / 4; // 45度转弧度
    rotation_matrix = Eigen::AngleAxisd(angle, Eigen::Vector3d::UnitZ());
    return 0;
}

2、变换矩阵

变换矩阵用于表示在欧几里得空间中的平移、旋转和缩放操作。在三维情况下,通常使用4x4的变换矩阵来表示这些变换。Eigen中可以使用Eigen::Transform模板来创建和操作这样的变换矩阵。

例如,创建一个绕z轴旋转45度并沿x轴平移(1, 2, 3)的变换矩阵可以这样做:

#include <Eigen/Dense>

int main() {
    Eigen::Affine3d transformation_matrix = Eigen::Affine3d::Identity();
    double angle = M_PI / 4; // 45度转弧度
    transformation_matrix.rotate(Eigen::AngleAxisd(angle, Eigen::Vector3d::UnitZ()));
    transformation_matrix.translation() << 1, 2, 3;
    return 0;
}

3、欧拉角转旋转矩阵(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;

4、旋转矩阵转欧拉角

// 使用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;

5、实战案例

#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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/607992.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么需要归档和管理合同

归档和管理合同是非常重要的&#xff0c;主要有以下几个原因&#xff1a; 1. 法律合规性&#xff1a;公司需要遵守法律和监管要求&#xff0c;合同是法律文件&#xff0c;涉及公司的权益和责任。归档和管理合同可以确保公司遵守法律法规&#xff0c;合同的内容和执行过程都符合…

《大数据分析-数据仓库项目实战》学习笔记

目录 基本概念 数据仓库 数据仓库整体技术架构 数据仓库主题 数据集市 数据仓库的血缘关系 数据仓库元数据管理 数据仓库的指标 数据仓库维度概念 HDFS Flume Hadoop Kafka 数据仓库分层模型 Superset 即席查询 Sqoop Atlas元数据管理 项目需求描述 系统目标…

AlibabaCloud微服务下的链路追踪系统实战详解

&#x1f680; 作者 &#xff1a;“二当家-小D” &#x1f680; 博主简介&#xff1a;⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人&#xff0c;8年开发架构经验&#xff0c;精通java,擅长分布式高并发架构,自动化压力测试&#xff0c;微服务容器化k…

拼多多投产比和成交出价哪个好

拼多多推广可以使用3an推客。3an推客&#xff08;CPS模式&#xff09;给商家提供的营销工具&#xff0c;由商家自主设置佣金比例&#xff0c;激励推广者去帮助商家推广商品链接&#xff0c;按最终有效交易金额支付佣金&#xff0c;不成交不扣费。是商家破零、积累基础销量的重要…

2024年大学生三下乡社会实践活动投稿注意事项

随着2024年夏季的热浪一同涌来的,是我校一年一度的“大学生三下乡”社会实践活动。作为一名积极参与其中的大学生,我满怀激情地投身于这项旨在促进农村发展的公益行动中。然而,当活动圆满落幕,轮到我承担起向各大媒体投稿、传播实践成果的重任时,却遭遇了一系列意想不到的挑战,…

拼多多投产比怎么计算?

拼多多投产比&#xff08;ROI&#xff09;的计算公式为&#xff1a;ROI 成交金额 / 花费 100%。也可以简单理解为&#xff1a;ROI 点击量 * 转化率 * 客单价 / (点击量 * 平均点击花费)。 拼多多推广可以使用3an推客。3an推客&#xff08;CPS模式&#xff09;给商家提供的营…

Kubernetes概述及其组件/核心组件

目录 前言&#xff1a; 一、简介 1.Kubernetes 概述 2.为什么要用 K8S? 3.k8s特性 3.1自我修复 3.2弹性伸缩 3.3自动部署和回滚 3.4服务发现和负载均衡 3.5机密和配置管理 3.6存储编排 3.7批量处理 4.Kubernetes 集群架构与组件 4.1核心组件 4.2架构 4.3配置存…

【2024版】最新6款漏洞扫描工具来了!(附下载)看完这一篇就够了

目录 一、Nessus 二、AWVS 三、ZAP 四、w3af 五、北极熊 六、御剑 七、网络安全学习路线 &#xff08;2024最新整理&#xff09; 八、学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明&#xff1a; 渗透测试收集信息完成后&#xf…

Linux-笔记 uboot修改设备树

1. FDT介绍 扁平设备树&#xff08;Flattened Device Tree&#xff0c;FDT&#xff09;&#xff0c;也叫平坦设备树&#xff0c;是设备树的一种二进制表示形式&#xff0c;提高了在嵌入式系统中的传输和解析效率&#xff1b; 2. 在U-Boot中使用FDT 2.1. 进入U-Boot 开发板上…

汽车电子零部件(13):BMS电池管理系统

前言: 电池管理系统(BMS)确保电动汽车(EV)的能量分配安全高效。目前流行电动汽车中使用的有四种主要BMS架构,BMS与充电基础设施互为集成关系。BMS主要管理 的是电池组,电池组由很多电芯组成,比如下图是H/EV电池组的主要部件,显示了电池、连接、控制电路和包装的总体布…

TensorFlow、pytorch和python对应的版本关系

安装深度学习框架的时候需要考虑版本的关系&#xff0c;不然装了用不了就尴尬了。 深度学习首先得问题就是用CPU跑&#xff0c;还是GPU跑。。当然有英伟达显卡的都想用GPU跑&#xff0c;不然买显卡是做啥、、GPU跑得多块&#xff0c;一下就训练完了。但是有的同学没得gpu&…

Capl简单数据类型

Capl简单数据类型&#xff0c;分为三大类&#xff0c;分别是整形、浮点型、字符型。 1.整形 在数据保存到变量中的时候&#xff0c;如果超过了变量存储的范围&#xff0c;会被截断。 在capl语言中&#xff0c;系统会默认给常量分配四个字节的空间。 例如byte a255;其中255是…

EtherCAT总线速度轴控制功能块(COSESYS ST源代码)

测试环境为汇川PLC,型号 AM402-CPU1608TP、伺服驱动器为禾川X3E,具体通信配置可以参考下面文章链接: 1、使能和点动控制 汇川AM400PLC通过EtherCAT总线控制禾川X3E伺服使能和点动控制-CSDN博客文章浏览阅读31次。进行通信之前需要安装禾川X3E的XML文件,具体方法如下:1、汇…

小米SU7智能座舱揭秘:五音区语音交互,智能语音新体验

“小爱同学&#xff0c;打开右后方车门。” “小爱同学&#xff0c;前面的山是什么山&#xff1f;” “小爱同学&#xff0c;有没有离簋街和望京都比较近的川菜馆&#xff1f;” “小爱同学&#xff0c;右后视镜向外调20%&#xff0c;左后视镜往里调10%。” “小爱同学&#xf…

AI电视起风,三星电视打破“隔代飞跃”,在AI纪元再次领跑

作者 | 曾响铃 文 | 响铃说 要说什么是当下最热的话题&#xff0c;刚落下帷幕的北京车展一定是其中之一&#xff0c;除了各类让人眼花缭乱的新车&#xff0c;纷至沓来的各界行业大佬&#xff0c;也让车展话题度被不断拉高。在此之外&#xff0c;此次车展还刮起了一股“旋风”…

C++反汇编,指针和内存分配细节,面试题05

文章目录 20. 指针 vs 引用21. new vs malloc 20. 指针 vs 引用 指针是实体&#xff0c;占用内存空间&#xff0c;逻辑上独立&#xff1b;引用是别名&#xff0c;与变量共享内存空间&#xff0c;逻辑上不独立。指针定义时可以不初始化&#xff1b;引用定义时必须初始化。指针的…

通过MediaPipe+MiDaS实现人脸单目测距

MediaPipe&#xff1a;是Google开发的适用于直播和流媒体的开源、跨平台、可定制的机器学习解决方案。code地址&#xff1a;https://github.com/google/mediapipe &#xff0c;最新发布版本v0.10.11&#xff0c;license为Apache-2.0。MediaPipe Solutions提供了一套库和工具&am…

【Linux网络】HTTPS【上】{运营商劫持/加密方式/数据摘要/https的诞生}

文章目录 1.引入1.1http与https1.2SSL/TLS1.3VPN1.4认识1.5密码学1.6为什么要加密&#xff1f;运营商 1.7常见的加密方式对称加密非对称加密 2.加密与解密3.数据摘要 && 数据指纹MD5 数字 签名理解三者数据摘要&#xff08;Digital Digest&#xff09;&#xff1a;数字…

数据结构与算法之树和二叉树的一些概念和性质

目录 前言 一、树的定义 二、树的若干术语 1.结点的度 2.叶子 3.双亲与孩子 4.兄弟 5.祖先 6.树的度 7.结点的层次 8.树的深度 9.有序树和无序树 10.森林 三、树的逻辑结构 四、树的存储结构 1.顺序存储 2.链式存储 五、二叉树 1.定义 2.二叉树的五种状态 …

美食推荐网站设计

**中文摘要&#xff1a;**在当今信息化、网络化的时代背景下&#xff0c;美食文化正逐渐融入人们的日常生活&#xff0c;而网络平台成为人们获取美食信息、分享美食体验的重要途径。为了满足广大美食爱好者对美食信息的探索和推荐需求&#xff0c;本文提出了一种创新的美食推荐…
最新文章