从零开始学习Slam-旋转矩阵旋转向量四元组(二)

本文参考:计算机视觉life 仅作笔记用
书接上回,上回不清不楚的介绍了旋转矩阵&旋转向量和四元组
现在回顾一下重点:
本着绕谁谁不变的变则
假设绕z轴旋转θ,旋转矩阵为:
在这里插入图片描述
再回顾一下旋转向量的表示以及这个基本记不住的罗德里格斯公式,记不住也没事:
在这里插入图片描述

一个例子

已知旋转矩阵定义是沿着Z轴旋转45°。请按照该定义初始化旋转向量、旋转矩阵、四元数、欧拉角。请编程实现:

1、以上四种表达方式的相互转换关系并输出,并参考给出的结果验证是否正确。

2、假设平移向量为(1,2,3),请输出旋转矩阵和该平移矩阵构成的欧式变换矩阵,并根据欧式变换矩阵提取旋转向量及平移向量。

#include <iostream>
#include <Eigen/Dense>

using namespace Eigen;

int main() {
    // 初始化旋转参数
    double angle = M_PI/4; // 45°转换为弧度
    Vector3d axis = Vector3d::UnitZ(); // Z轴

    // 初始化旋转向量
    Vector3d rotation_vector = angle * axis;

    // 初始化旋转矩阵
    Matrix3d rotation_matrix;
    
    // AngleAxisd(angle, axis) 创建了一个表示绕着给定轴 axis 旋转 angle 弧度的旋转向量。
    //在Eigen库中,AngleAxisd 类表示一个旋转向量,它由一个旋转轴和一个旋转角度组成。
    //它的构造函数可以接受旋转角度和旋转轴作为参数,也可以接受一个旋转矩阵作为参数,并从中提取旋转轴和旋转角度。
    //调用 toRotationMatrix() 方法将该旋转向量转换为对应的旋转矩阵。
    rotation_matrix = AngleAxisd(angle, axis).toRotationMatrix();

    // 初始化四元数
    Quaterniond quaternion(rotation_matrix);

    // 初始化欧拉角
    Vector3d euler_angles = rotation_matrix.eulerAngles(2, 1, 0); // ZYX顺序

    // 输出四种表达方式 
    // 旋转向量
    std::cout << "Rotation Vector: " << rotation_vector.transpose() << std::endl;  
    // .transpose()方法被用于将向量和矩阵输出成为行向量的形式,以方便显示在控制台上。
    // 旋转矩阵
    std::cout << "Rotation Matrix:\n" << rotation_matrix << std::endl;
    // coeffs()方法用于获取四元数对象的系数,返回一个四维向量。
    std::cout << "Quaternion: " << quaternion.coeffs()<< std::endl;
    // 欧拉角
    std::cout << "Euler Angles (ZYX): " << euler_angles.transpose() << std::endl;

    // 假设平移向量为(1,2,3)
    Vector3d translation_vector(1, 2, 3);

    // 构造欧式变换矩阵
    Matrix4d euclidean_transform_matrix = Matrix4d::Identity();  // 创建一个4x4的单位矩阵的静态方法
    // 将旋转矩阵赋值给欧几里德变换矩阵的左上角的3x3子矩阵,即旋转部分
    euclidean_transform_matrix.block<3,3>(0,0) = rotation_matrix;
    // 将平移向量赋值给欧几里德变换矩阵的右上角的3x1子矩阵,即平移部分
    euclidean_transform_matrix.block<3,1>(0,3) = translation_vector;

    /* 在Eigen库中,AngleAxisd()是用于创建一个旋转向量(Angle-Axis)的构造函数。Angle-Axis旋转表示通过一个旋转轴和一个旋转角度来描述旋转。具体来说,AngleAxisd()的使用方法如下
    
    Eigen::AngleAxisd angle_axis(angle, axis);
    
    在这段代码中,AngleAxisd(rotation_matrix)创建了一个AngleAxisd类型的对象,该对象代表了由旋转矩阵rotation_matrix表示的旋转。
    然后,.axis()方法用于获取该旋转向量的旋转轴,而.angle()方法用于获取旋转角度。
    接着,AngleAxisd(rotation_matrix).axis() * AngleAxisd(rotation_matrix).angle()部分将旋转向量的轴乘以旋转角度,这将得到一个旋转向量,其方向由旋转轴决定,大小由旋转角度决定。这个旋转向量被赋值给了extracted_rotation_vector。*/
    
    // 从欧式变换矩阵分解出旋转向量和平移向量
    Vector3d extracted_rotation_vector = AngleAxisd(rotation_matrix).axis() * AngleAxisd(rotation_matrix).angle();
    
    /* block<3,1>(0,3)是Eigen库中的一个函数,用于从矩阵中提取特定的块。在这里,block<3,1>(0,3)
    表示提取了从第0行开始,第3列开始的一个3x1的块,即欧氏变换矩阵的前三个元素(0, 1, 2行,3列),
    这通常是表示平移向量的部分。*/ 
    Vector3d extracted_translation_vector = euclidean_transform_matrix.block<3,1>(0,3);


    // 输出欧式变换矩阵、提取的旋转向量和平移向量
    
    // 欧式变换矩阵
    std::cout << "\nEuclidean Transformation Matrix:\n" << euclidean_transform_matrix << std::endl;
    // 旋转向量
    std::cout << "Extracted Rotation Vector: " << extracted_rotation_vector.transpose() << std::endl;
   // 平移向量
    std::cout << "Extracted Translation Vector: " << extracted_translation_vector.transpose() << std::endl;

    return 0;
}

多看几遍代码,俺就算基本入第一道门了。。。

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

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

相关文章

GEE 10m 全球 LULC 数据集 ESRI Land Cover

土地利用土地覆盖&#xff08;LULC&#xff09;地图在许多行业部门和发展中国家越来越成为决策者的重要工具。这些地图提供的信息有助于通过更好地理解和量化地球过程和人类活动的影响&#xff0c;从而制定政策和土地管理决策。 ESRI Land Cover 数据介绍 ArcGIS Living Atlas …

NIUSHOP多商户V6版预售背后的前端技术革新

随着电子商务的快速发展&#xff0c;多商户电商平台成为了市场上的热门选择。在这个背景下&#xff0c;NIUSHOP多商户V6版的预售活动引发了广泛关注。本文将从前端技术的角度&#xff0c;探讨NIUSHOP多商户V6版在预售背后所蕴含的技术革新和亮点。 一、引言 NIUSHOP多商户系统…

关于Maven环境变量配置的报错The JAVA_HOME environment variable is not defined correctly的解决

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Vue进阶之Vue无代码可视化项目(二)

Vue无代码可视化项目 项目初始化路由子路由错误示范正确示范App.vuerouter/index.tsAboutView.vueAboutAboutview.vuerouter/index.ts项目路由router/index.tsApp.vueActionsView.vueDataSourceView.vueLayoutView.vue路由样式App.vue进一步的App.vue项目初始化 路由 router i…

VLAN的概念及优势

文章目录 VLAN的概念及优势分割广播域 广播域vlanVLAN的优势 VLAN的种类静态VLAN动态VLAN 静态VLAN的配置静态VLAN范围配置静态VLAN的步骤 TRUNK介绍与配置三层交换机转发原理三层交换技术mls基于CEF的MLSCEF是一种基于拓补转发的模型 三层交换机的配置层 VLAN的概念及优势 分…

6. MySQL 查询、去重、别名

文章目录 【 1. 数据表查询 SELECT 】1.1 查询表中所有字段使用 * 查询表的所有字段列出表的所有字段 1.2 查询表中指定的字段 【 2. 去重 DISTINCT 】【 3. 设置别名 AS 】3.1 为表指定别名3.2 为字段指定别名 【 5. 限制查询结果的条数 LIMIT 】5.1 指定初始位置5.2 不指定初…

【详细讲解版】史上最全transformer面试题

史上最全transformer面试题答案 1.Transformer为何使用多头注意力机制&#xff1f;&#xff08;为什么不使用一个头&#xff09;2.Transformer为什么Q和K使用不同的权重矩阵生成&#xff0c;为何不能使用同一个值进行自身的点乘&#xff1f;3.Transformer计算attention的时候为…

Excel 将分组头信息填入组内明细行

Excel由多个纵向的分组表组成&#xff0c;组之间由空白行隔开&#xff0c;每组第1、2行的第2格是分组表头&#xff0c;第3行是列头&#xff0c;第1列和第6列数据是空白的&#xff1a; ABCDEF1ATLANTIC SPIRIT2Looe3VesselSpeciesSizeKgDateLocation4POLLACK22.523/04/20245POL…

内网-win1

一、概述 1、工作组&#xff1a;将不同的计算机按功能(或部门)分别列入不同的工作组 (1)、查看&#xff08;windows&#xff09; 查看当前系统中所有用户组&#xff1a;打开命令行--》net localgroup查看组中用户&#xff1a;打开命令行 --》net localgroup 后接组名查看用户…

进程与线程(一)

进程与线程&#xff08;一&#xff09; 理解什么是并发编程进程的相关概念什么是进程对比进程和程序理解进程是一个独立的可调度的任务理解进程是程序执行和资源管理的最小单位进程状态转换图进程的种类 进程相关命令进程状态标志ps命令-aux:-axj:(可以查看到进程的PPID)pstree…

【通信专题】I2C通信硬件概述

通信协议在组织设备之间通信时扮演着重要角色。它基于系统要求而以不同方式进行设计。此类协议具有明确的、为实现成功通信而协商一致的规则。 I2C历史 I2C,即Inter-Integrated Circuit,是一种常用的串行通信协议。I2C总线创建于1982年,由飞利浦公司设计,旨在利用简单、稳…

APISIX的安装与测试(springboot服务测试)

安装&#xff1a; 1.1安装依赖&#xff1a; curl https://raw.githubusercontent.com/apache/apisix/master/utils/install-dependencies.sh -sL | bash -1.2 安装 OpenResty yum-config-manager --add-repo https://openresty.org/package/centos/openresty.reposudo yum i…

Java关键字详解

文章目录 什么是关键字&#xff1f;数据类型&#xff08;10个&#xff09;byte、char、boolean、short、int、float、long、double、void、enum 流程控制&#xff08;12个&#xff09;if、else、do、while、for 、switch、case、assertbreak&#xff08;跳出循环&#xff09;co…

[有监督学习] 8.详细图解神经网络

神经网络 一直以来&#xff0c;人们都认为神经网络&#xff08;Neural Network&#xff0c;NN&#xff09;是模仿生物体的神经网络设计而成的。神经网络既可以用于回归&#xff0c;也可以用于分类&#xff0c;但在实际应用中常用于分类。基于神经网络的深 度学习因在图像识别和…

五分钟“手撕”栈

实现代码放开头&#xff0c;供大家学习与查阅 目录 一、实现代码 二、什么是栈 三、栈的常见操作 底层实现是链表。 入栈 出栈 四、Stack的使用 五、栈的习题 第一题 第二题 第三题 第四题 第五题 第六题 第七题 六、栈、虚拟机栈、栈帧的区别 目录 一、…

Python的第三方库OS库

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;OS/SHUTIL 的方法描述&#x1f680;OS/SHUTIL…

Streamsets-JDBC模式使用更新时间字段数据同步

StreamSets的开源地址&#xff1a;https://github.com/streamsets/datacollector-oss Streamsets官网地址&#xff1a;https://streamsets.com/ Streamsets文档地址&#xff1a;https://docs.streamsets.com/portal/datacollector/3.16.x/help/index.html 我又来写Streamsets了…

安全测试扫描利器-Burpsuite

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

全自动打包封箱机:解析其在产品质量与安全保障方面的作用

在当今快节奏的生产环境中&#xff0c;全自动打包封箱机以其高效、精准的特点&#xff0c;正逐渐成为生产线上的得力助手。它不仅提升了生产效率&#xff0c;更在产品质量与安全保障方面发挥着举足轻重的作用。星派将详细解析全自动打包封箱机在产品质量与安全保障方面的作用。…

自监督表示学习和神经音频合成实现语音修复

关键词&#xff1a;语音修复、自监督模型、语音合成、语音增强、神经声码器 语音和/或音频修复的目标是增强局部受损的语音和/或音频信号。早期的工作基于信号处理技术&#xff0c;例如线性预测编码、正弦波建模或图模型。最近&#xff0c;语音/音频修复开始使用深度神经网络&a…