轴角与旋转矩阵、欧拉角与旋转矩阵、四元数与旋转矩阵的转换

news2024/11/24 10:58:26

一、轴角转换成旋转矩阵 

C++实现

#include <iostream>
#include <Eigen/Dense>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

int main()
{
	double theta = M_PI/2;//90度
	Eigen::Vector3d xyz(1, 0, 0);//x轴
	Eigen::AngleAxisd rotation_vector(theta, xyz);
	//Eigen::Matrix3d rotation_matrix = rotation_vector.matrix();
	Eigen::Matrix3d rotation_matrix = rotation_vector.toRotationMatrix();
	cout.setf(ios_base::fixed, ios_base::floatfield);	//使用定点计数法,精度指的是小数点后面的位数,而不是总位数
	cout.setf(ios_base::showpoint);		//显示小数点后面的0	
	cout.precision(2);	//使用定点计数法,显示小数点后面位数精度
	cout << rotation_matrix << endl;
	
}

结果:

二、旋转矩阵转换成轴角

C++实现

#include <iostream>
#include <Eigen/Dense>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

int main()
{

	Eigen::Matrix3d rotation_matrix;
	rotation_matrix << 1, 0, 0, 0, 0, -1, 0, 1, 0;
	/*Eigen::AngleAxisd v2;
	v2.fromRotationMatrix(rotation_matrix);*/
	/*Eigen::AngleAxisd v2;
	v2 = rotation_matrix;*/
	Eigen::AngleAxisd v2(rotation_matrix);
	cout.setf(ios_base::fixed, ios_base::floatfield);	//使用定点计数法,精度指的是小数点后面的位数,而不是总位数
	cout.setf(ios_base::showpoint);		//显示小数点后面的0	
	cout.precision(2);	//使用定点计数法,显示小数点后面位数精度
	cout << "轴角的角度:" << endl << (v2.angle() * 180 / M_PI) <<"度" << endl << "轴:" << endl << v2.axis() << endl;


}

结果:

三、旋转矩阵转换成欧拉角

C++实现

#include <iostream>
#include <Eigen/Dense>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

int main()
{
	Eigen::Matrix3d rotation_matrix;
	rotation_matrix << 1, 0, 0, 0, 0, -1, 0, 1, 0;//这是x旋转90度的旋转矩阵
	Eigen::Vector3d eulerAngle = rotation_matrix.eulerAngles(2, 1, 0);//算出来的都是弧度制,指定顺序ZYX
	cout.setf(ios_base::fixed, ios_base::floatfield);	//使用定点计数法,精度指的是小数点后面的位数,而不是总位数
	cout.setf(ios_base::showpoint);		//显示小数点后面的0	
	cout.precision(2);	//使用定点计数法,显示小数点后面位数精度
	cout << eulerAngle*180/M_PI <<  endl;//转换成角度
}

结果:

四、欧拉角转换成旋转矩阵

C++实现

#include <iostream>
#include <Eigen/Dense>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

int main()
{
	Eigen::Vector3d eulerAngle;
	eulerAngle << 0, 0, 1.57;//90度的弧度值
	Eigen::Matrix3d rotation_matrix;
	rotation_matrix  = Eigen::AngleAxisd(eulerAngle[0], Eigen::Vector3d::UnitZ()) * Eigen::AngleAxisd(eulerAngle[1], Eigen::Vector3d::UnitY()) * Eigen::AngleAxisd(eulerAngle[2], Eigen::Vector3d::UnitX());
	cout.setf(ios_base::fixed, ios_base::floatfield);	//使用定点计数法,精度指的是小数点后面的位数,而不是总位数
	cout.setf(ios_base::showpoint);		//显示小数点后面的0	
	cout.precision(2);	//使用定点计数法,显示小数点后面位数精度
	cout << rotation_matrix << endl;
}

结果:

五、四元数转换成旋转矩阵

C++实现

#include <iostream>
#include <Eigen/Dense>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

int main()
{
	Eigen::Matrix3d rotation_matrix;
	Eigen::Vector4d quat(0.707, 0.707, 0, 0);//x轴90度,输入时第一个为实部,输出时最后一个为实部
	Eigen::Quaterniond quaternion(quat[0], quat[1], quat[2], quat[3]);
	//rotation_matrix = quaternion.matrix()
	rotation_matrix = quaternion.toRotationMatrix();
	cout.setf(ios_base::fixed, ios_base::floatfield);	//使用定点计数法,精度指的是小数点后面的位数,而不是总位数
	cout.setf(ios_base::showpoint);		//显示小数点后面的0	
	cout.precision(3);	//使用定点计数法,显示小数点后面位数精度
	cout << rotation_matrix << endl;

}

结果:

六、 旋转矩阵转换成四元数

C++实现

#include <iostream>
#include <Eigen/Dense>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

int main()
{
	Eigen::Matrix3d rotation_matrix;
	rotation_matrix << 1, 0, 0, 0, 0, -1, 0, 1, 0;
	Eigen::Quaterniond quaternion(rotation_matrix);
	cout.setf(ios_base::fixed, ios_base::floatfield);	//使用定点计数法,精度指的是小数点后面的位数,而不是总位数
	cout.setf(ios_base::showpoint);		//显示小数点后面的0	
	cout.precision(3);	//使用定点计数法,显示小数点后面位数精度
	cout << quaternion << endl;
}

结果:

七、轴角转换成四元数 

C++实现

#include <iostream>
#include <Eigen/Dense>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

int main()
{
	double theta = M_PI/2;
	Eigen::Vector3d xyz(1, 0, 0);
	Eigen::AngleAxisd rotation_vector(theta, xyz);
	Eigen::Quaterniond quaternion(rotation_vector);
	cout.setf(ios_base::fixed, ios_base::floatfield);	//使用定点计数法,精度指的是小数点后面的位数,而不是总位数
	cout.setf(ios_base::showpoint);		//显示小数点后面的0	
	cout.precision(3);	//使用定点计数法,显示小数点后面位数精度
	cout << quaternion << endl;

}

结果:

八、四元数转换成轴角

C++实现

#include <iostream>
#include <Eigen/Dense>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

int main()
{
	Eigen::Matrix3d rotation_matrix;
	Eigen::Vector4d quat(0.707, 0.707, 0, 0);//x轴90度,输入时第一个为实部,输出时最后一个为实部
	Eigen::Quaterniond quaternion(quat[0], quat[1], quat[2], quat[3]);
	Eigen::AngleAxisd v2(quaternion);
	cout.setf(ios_base::fixed, ios_base::floatfield);	//使用定点计数法,精度指的是小数点后面的位数,而不是总位数
	cout.setf(ios_base::showpoint);		//显示小数点后面的0	
	cout.precision(3);	//使用定点计数法,显示小数点后面位数精度
	cout << "轴角的角度:" << endl << (v2.angle() * 180 / M_PI) <<"度" << endl << "轴:" << endl << v2.axis() << endl;

}

结果:

九、 轴角转换成欧拉角

C++实现

#include <iostream>
#include <Eigen/Dense>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

int main()
{
	double theta = M_PI/2;
	Eigen::Vector3d xyz(1, 0, 0);
	Eigen::AngleAxisd rotation_vector(theta, xyz);
	Eigen::Vector3d eulerAngle = rotation_vector.matrix().eulerAngles(2, 1, 0);//zyx
	cout.setf(ios_base::fixed, ios_base::floatfield);	//使用定点计数法,精度指的是小数点后面的位数,而不是总位数
	cout.setf(ios_base::showpoint);		//显示小数点后面的0	
	cout.precision(3);	//使用定点计数法,显示小数点后面位数精度
	cout << eulerAngle << endl;
}

 结果:

十、欧拉角转换成轴角

C++实现

#include <iostream>
#include <Eigen/Dense>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

int main()
{
	Eigen::Vector3d eulerAngle;
	eulerAngle << 0, 0, 1.57;
	Eigen::Matrix3d rotation_matrix;
	Eigen::AngleAxisd rollAngle(Eigen::AngleAxisd(eulerAngle[2], Eigen::Vector3d::UnitX()));
	Eigen::AngleAxisd pitchAngle(Eigen::AngleAxisd(eulerAngle[1], Eigen::Vector3d::UnitY()));
	Eigen::AngleAxisd yawAngle(Eigen::AngleAxisd(eulerAngle[0], Eigen::Vector3d::UnitZ()));
	Eigen::AngleAxisd v2;
	v2 = yawAngle * pitchAngle * rollAngle;
	cout.setf(ios_base::fixed, ios_base::floatfield);	//使用定点计数法,精度指的是小数点后面的位数,而不是总位数
	cout.setf(ios_base::showpoint);		//显示小数点后面的0	
	cout.precision(0);	//使用定点计数法,显示小数点后面位数精度
	cout << "轴角的角度:" << endl << (v2.angle() * 180 / M_PI) <<"度" << endl << "轴:" << endl << v2.axis() << endl;
}

 结果:

十一、 欧拉角转换成四元数

C++实现

#include <iostream>
#include <Eigen/Dense>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

int main()
{

	Eigen::Vector3d eulerAngle;
	eulerAngle << 0, 0, 1.57;
	Eigen::Quaterniond quaternion;
	quaternion = Eigen::AngleAxisd(eulerAngle[0], Eigen::Vector3d::UnitZ()) * Eigen::AngleAxisd(eulerAngle[1], Eigen::Vector3d::UnitY()) * Eigen::AngleAxisd(eulerAngle[2], Eigen::Vector3d::UnitX());
	cout.setf(ios_base::fixed, ios_base::floatfield);	//使用定点计数法,精度指的是小数点后面的位数,而不是总位数
	cout.setf(ios_base::showpoint);		//显示小数点后面的0	
	cout.precision(3);	//使用定点计数法,显示小数点后面位数精度
	cout << quaternion << endl;
}

 结果:

十二、 欧拉角转换成四元数

C++实现

#include <iostream>
#include <Eigen/Dense>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

int main()
{

	Eigen::Matrix3d rotation_matrix;
	Eigen::Vector4d quat(0.707, 0.707, 0, 0);//x轴90度,输入时第一个为实部,输出时最后一个为实部
	Eigen::Quaterniond quaternion(quat[0], quat[1], quat[2], quat[3]);
	Eigen::Vector3d eulerAngle = quaternion.matrix().eulerAngles(2, 1, 0);
	cout.setf(ios_base::fixed, ios_base::floatfield);	//使用定点计数法,精度指的是小数点后面的位数,而不是总位数
	cout.setf(ios_base::showpoint);		//显示小数点后面的0	
	cout.precision(3);	//使用定点计数法,显示小数点后面位数精度
	cout << eulerAngle << endl;

}

 结果:

十三、空间变换案例

 C++实现

#include <iostream>
#include <Eigen/Dense>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;

int main()
{
	//将T初始化为单位阵,再做其他操作。
	//虽然称为3D,实质上为4*4矩阵。
	Eigen::Isometry3d T = Eigen::Isometry3d::Identity();
	//设置旋转向量V
	double theta = M_PI/2;
	Eigen::Vector3d xyz(1, 0, 0);
	Eigen::AngleAxisd V(theta, xyz);
	//设置平移向量
	Eigen::Vector3d translation(1, 3, 4);
	T.rotate(V);
	T.translate(translation);
	//translate右乘,先旋转后平移
	//结果为 1	0	0	1
	//      0	1	0	3
	//      0	0	1	4
	//      0	0	0	1
	// 
	//以及	1	0	0	0
	//		0	0	-1	0
	//		0	1	0	0
	//		0	0	0	1
	//第一个矩阵右乘第二个矩阵
	//pretranslate左乘,先平移后旋转
	/*T.rotate(V);
	T.pretranslate(translation);*/
	cout.setf(ios_base::fixed, ios_base::floatfield);	//使用定点计数法,精度指的是小数点后面的位数,而不是总位数
	cout.setf(ios_base::showpoint);		//显示小数点后面的0	
	cout.precision(3);	//使用定点计数法,显示小数点后面位数精度
	cout << endl << T.matrix() << endl;
}

 结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux nohup命令和

参考资料 linux后台运行nohup命令的使用及2>&1字符详解 目录 前期准备一. 基本语法二. 执行时不指定日志文件三. 执行后不想要日志文件四. nohup命令的执行与kill4.1 执行4.2 kill 前期准备 &#x1f4c4;handle_file.sh #!/bin/bashecho "文件复制开始..."…

精读《js 模块化发展》

1 引言 如今&#xff0c;Javascript 模块化规范非常方便、自然&#xff0c;但这个新规范仅执行了 2 年&#xff0c;就在 4 年前&#xff0c;js 的模块化还停留在运行时支持&#xff0c;10 年前&#xff0c;通过后端模版定义、注释定义模块依赖。对经历过来的人来说&#xff0c;…

[VulnHub靶机渗透] WestWild 1.1

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

摩尔斯电码

1.介绍 摩尔斯电码是一种用来交流的系统&#xff0c;通过点和划来传递编码信息。 摩尔斯电码由两种不同的信号单位组成&#xff1a;点和划。在摩斯电码的官方术语&#xff0c;点通常读作“滴”。划通常读作“嗒”。 2.摩尔斯电码表 3.节奏和停顿 滴发短促的单音节音&#x…

免费数据恢复软件哪个好?适用于 Windows的顶级免费数据恢复软件推荐

终于要说到Windows 11了&#xff0c;有太多令人惊叹的功能&#xff0c;让人跃跃欲试。但是&#xff0c;在升级到 Windows 11 或使用 Windows 11 时&#xff0c;人们可能会因计算机问题而导致文件被删除或丢失。这就是为什么需要 Windows 11 的免费文件恢复的原因。这是适用于 W…

无人机遥感技术应用分析,无人机遥感系统测绘技术详解

由于无人机具有机动快速、使用成本低、维护操作简单等技术特点,因此被作为一种理想的飞行平台广泛应用于军事和民用各个领域。尤其是进入二十一世纪以后,许多国家将无人机系统的研究、开发、应用置于优先发展的地位,体积小、重量轻、探测精度高的新型传感器的不断问世,也使无人…

精品springboot疫苗发布和接种预约系统

《[含文档PPT源码等]精品基于springboot疫苗发布和接种预约系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#xff1a;…

推荐系统|行为序列_用户行为序列建模、Din模型和SIM模型

文章目录 用户行为序列建模Din模型Din模型的缺点 用户行为序列建模 物品ID通过Embedding将会得到一个向量&#xff0c;性质差不多的向量在空间中也会处于差不多的位置&#xff0c;可以用取平均方式得到一个综合所有向量的向量。 取平均后可以作为代表用户的一个特征。 以上的…

使用 Windows 11/10 上的最佳 PDF 转 Word 转换器释放 PDF 的潜力

毫无疑问&#xff0c;PDF 是最好的文档格式之一&#xff0c;但就像其他格式一样&#xff0c;有时它们确实会带来一些限制。例如&#xff0c;在某些情况下&#xff0c;您可能想要将 PDF 转换为 Word。在这种情况下&#xff0c;您始终可以借助 PDF 到 Word 转换器的帮助。 为了说…

通过Dynamo删除Revit中族参数探究

起因是这样的&#xff0c;有位同事想在项目中直接删除revit族的参数&#xff0c;而不打开族&#xff0c;避免因为重载族&#xff0c;造成一些管件连接断开&#xff0c;于是就有了下面这些研究&#xff0c;当然是因为我没办法实现这个想法&#xff0c;所以这次可以分享下研究的过…

阿里云带宽计费模式怎么选?如何收费的?

阿里云服务器带宽计费模式分为“按固定带宽”和“按使用流量”&#xff0c;有什么区别&#xff1f;按固定带宽是指直接购买多少M带宽&#xff0c;比如1M、5M、10M、100M等&#xff0c;阿里云直接分配用户所购买的带宽值&#xff0c;根据带宽大小先付费再使用&#xff1b;按使用…

电磁兼容故障整改-辐射发射超标

设备的辐射于扰发射超标有两种可能:一种是设备外壳的屏蔽性能不完善;另一种是射频干扰经由电源线和其他线缆逸出。判断方法是拔掉不必要的电线和电源插头&#xff0c;或者将电缆长度减小至最短&#xff0c;继续做试验&#xff0c;如果没有任何改善迹象&#xff0c;则应怀疑是设…

从github上拉取项目到pycharm中

有两种方法&#xff0c;方法一较为简单&#xff0c;方法二用到了git bash&#xff0c;推荐方法一 目录 有两种方法&#xff0c;方法一较为简单&#xff0c;方法二用到了git bash&#xff0c;推荐方法一方法一&#xff1a;方法二&#xff1a; 方法一&#xff1a; 在github上复制…

css的布局(BFC)

一、css中常规的定位方案 1、普通流 元素按照其在HTML中的先后位置自上而下布局。 行内元素水平排列&#xff0c;当行被占满后换行&#xff1b;块级元素则会被渲染为完整的一行。 所有元素默认都是普通流定位。 2、浮动 元素首先按照普通流的位置出现&#xff0c; 然后根据浮动…

车载电子电器架构 —— 网络拓扑开发概述

车载电子电器架构 —— 网络拓扑开发概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

【Java从入门到精通】Java变量类型

Java 变量类型 在 Java 语言中&#xff0c;所有的变量在使用前必须声明。 声明变量的基本格式如下&#xff1a; type identifier [ value][, identifier [ value] ...] ; 格式说明&#xff1a; type -- 数据类型。identifier -- 是变量名&#xff0c;可以使用逗号 , 隔开…

Github 2024-02-08 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-02-08统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Ruby项目1HTML项目1Python项目1Scala项目1PLpgSQL项目1Rust项目1NASL项目1C项目1TypeScript项目1非开发语言项目…

AI:126-基于深度学习的人体情绪识别与分析

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

Java实现教学资源共享平台 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

leetcode链表相关题目

文章目录 1.移除链表元素方法1&#xff1a;方法2 2.合并两个有序链表3.链表的中间节点方法1方法2 4.反转单链表方法1方法2 5.分割链表6.链表中的倒数第k个节点方法1&#xff1a;方法2: 7.环形链表的约瑟夫问题8.链表的回文结构9.相交链表方法1方法2&#xff1a; 10.环形链表11.…