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

2024-06-01 08:04

本文主要是介绍从零开始学习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;
}

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

这篇关于从零开始学习Slam-旋转矩阵旋转向量四元组(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020432

相关文章

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学