【SLAM笔记】如何使用Eigen进行矩阵运算
SLAM笔记专栏:https://blog.csdn.net/weixin_44543463/category_10925276.html
本文目录
- 一、Eigen库的介绍与安装
- 1.1 Eigen是什么
- 1.2 Eigen的安装
- 二、Eigen库的基本使用
- 2.1 Eigen库的引用
- 2.2 Eigen的基本语法
- 2.3 使用Eigen实现旋转变换
一、Eigen库的介绍与安装
1.1 Eigen是什么
Eigen是一个C++开源的线性代数库,提供了快速的矩阵线性代数运算,解方程等功能。许多上层软件库也使用Eigen进行矩阵运算。
Eigen是一个纯用头文件搭建起来的库,因此使用的时候,只需要引用它的头文件即可,不需要链接库文件。
1.2 Eigen的安装
如果你的电脑上没有安装Eigen,可以输入下面的命令进行安装。
sudo apt-get install libeigen3-dev
二、Eigen库的基本使用
2.1 Eigen库的引用
在cpp文件的开头插入如下两个头文件
#include <Eigen/Core>
#include <Eigen/Dense>
在CMakeLists.txt内指定Eigen的头文件目录(如果把Eigen安装在了不同位址,就必须修改这里的头文件目录)
include_directories("/usr/include/eigen3")
2.2 Eigen的基本语法
功能 | 语法 |
---|---|
声明一个m行n列的 float 矩阵 |
eigen Eigen::Matrix<float,m,n> matrix_name;
|
声明一个三维列向量 |
Eigen::Vector3d vector_name;
|
声明一个三阶方阵 |
Eigen::Matrix3d matrix_name;
|
动态大小矩阵 |
Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> matrix_name;
|
初始化矩阵为零矩阵 |
Eigen::Matrix3d matrix_name = Eigen::Matrix3d::Zero();
|
输入数据 |
matrix_name << 1,2,3,4,5,6;
|
输出数据 |
cout << matrix_name << endl;
|
数据类型转换 |
matrix_name.cast<double>()
|
矩阵乘法 |
matrix_name1 * matrix_name2
|
转置 |
matrix_name.transpose();
|
各元素和 |
matrix_name.sum()
|
迹 |
matrix_name.trace()
|
逆 |
matrix_name.inverse()
|
行列式 |
matrix_name.determinant()
|
共轭矩阵 |
matrix_name.conjugate()
|
伴随矩阵 |
matrix_adjoint()
|
求特征值 |
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigenSolver(matrix3d);
|
特征值 |
eigenSolver.eigenvalues()
|
特征向量 |
eigenSolver.eigenvectors()
|
2.3 使用Eigen实现旋转变换
- 三维旋转矩阵:创建一个三维矩阵即可
//例:创建一个三阶单位矩阵
Eigen::Matrix3d rotation_matrix = Eigen::Matrix3d::Identity();
- 旋转向量:使用AngleAxis,可以使用这个它乘向量实现旋转操作(因为定义了运算符重载),括号内是旋转向量的角度和旋转轴
//创建一个绕z轴旋转45°的旋转向量
Eigen::AngleAxisd rotation_vector(M_PI/4,Eigen::Vector3d(0,0,1));
- 旋转向量转换为三维旋转矩阵
//将rotation_vector这个旋转向量转换为旋转矩阵并打印出来
cout<<"rotation matrix = \n"<<rotation_vector.matrix()<<endl;
//或通过toRotationMatrix转换为旋转矩阵
rotation_matrix = rotation_vector.toRotationMatrix();
- 旋转矩阵转换为欧拉角
//将旋转矩阵转换为ZYX顺序的欧拉角,即yaw-pitch-roll
Eigen::Vector3d euler_angles = rotation_matrix.eulerAngles(2,1,0);
cout<<"yaw pitch roll = "<<euler_angles.transpose()<<endl;
- 使用旋转向量进行坐标变换:因为对进行了运算符重载,旋转操作直接乘向量即可
//定义一个x方向的向量,用前面定义的旋转向量进行旋转,然后输出旋转后的结果。
Eigen::Vector3d v(1,0,0);
Eigen::Vector3d v_rotated = rotation_vector * v;
cout<<"(1,0,0) after rotation = "<<v_rotated.transpose()<<endl;
- 用旋转矩阵进行坐标变换
v_rotated = rotation_matrix * v;
cout<<"(1,0,0) after rotation = "<<v_rotated.transpose()<<endl;
- 使用变换矩阵进行坐标变换
//定义一个名为T的变换矩阵,虽说是3d,但实际是4x4矩阵,Identity说明旋转是0,平移也是0
Eigen::Isometry3d T=Eigen::Isometry3d::Identity();
//将左上角的旋转矩阵设为按旋转向量rotation_vector旋转
T.rotate(rotation_vector);
//设置右上角的平移矩阵为[1,3,4](旋转前平移)
T.pretranslate(Eigen::Vector3d(1,3,4));
//因为运算符重载,变换矩阵可以直接乘三维向量
Eigen::Vector3d v_transformed = T*v;
- 使用四元数
//创建一个四元数
Eigen::Quaterniond q;
//可以直接把旋转向量赋值给四元数
q = Eigen::Quaterniond(rotation_vector);
//也可以把旋转矩阵赋值给它
q=Eigen::Quaterniond(rotation_matrix);
//使用四元数旋转一个向量
v_rotated = q*v;
【SLAM笔记】如何使用Eigen进行矩阵运算相关推荐
- 视觉SLAM笔记(14) Eigen几何模块
视觉SLAM笔记(14) Eigen几何模块 1. 旋转表达方式 2. 旋转矩阵 3. 欧拉角 3. 仿射和射影变换 4. 四元数 5. 可视化演示 1. 旋转表达方式 之前讲到的各种旋转表达方式 现 ...
- 视觉SLAM笔记(9) Eigen
视觉SLAM笔记(9) Eigen 1. 开源线性代数库 2. 基本操作与运算 2.1. 向量和矩阵 2.2. 内置类型 2.3. 初始化 2.4. 动态大小 2.5. 输入数据 2.6. 输出数据 ...
- 视觉SLAM笔记(18) Sophus
视觉SLAM笔记(18) Sophus 1. Sophus 库 2. SO(3) 运算 3. SE(3) 运算 1. Sophus 库 一个较好的李代数库是 Strasdat 维护的 Sophus 库 ...
- 视觉SLAM笔记(65) 简约总结
视觉SLAM笔记(65) 简约总结 参考: <视觉SLAM十四讲> 视觉SLAM笔记(3) 视觉SLAM框架 视觉SLAM笔记(20) 单目相机模型 视觉SLAM笔记(32) 2D-2D: ...
- 视觉SLAM笔记(63) RGB-D 稠密建图
视觉SLAM笔记(63) RGB-D 稠密建图 1. 建立点云地图 2. 点云地图 3. 其他重建方法 1. 建立点云地图 所谓点云,就是由一组离散的点表示的地图 最基本的点包含 x, y, z 三维 ...
- 视觉SLAM笔记(61) 单目稠密建图
视觉SLAM笔记(61) 单目稠密建图 1. 立体视觉 2. 极线搜索与块匹配 3. 高斯分布的深度滤波器 1. 立体视觉 相机,很久以来被认为是只有角度的传感器(Bearing only) 单个图像 ...
- 视觉SLAM笔记(60) 建图
视觉SLAM笔记(60) 建图 1. 概述 2. 用处 1. 概述 建图(Mapping),本应该是 SLAM 的两大目标之一 因为 SLAM 被称为同时定位与建图 之前讨论的都是定位问题,包括通过特 ...
- 视觉SLAM笔记(58) 字典
视觉SLAM笔记(58) 字典 1. 字典的结构 2. 创建字典 1. 字典的结构 按照前面的介绍,字典由很多单词组成,而每一个单词代表了一个概念 一个单词与一个单独的特征点不同 它不是从单个图像上提 ...
- 视觉SLAM笔记(57) 回环检测
视觉SLAM笔记(57) 回环检测 1. 回环检测的意义 2. 实现方法 3. 准确率和召回率 4. 词袋模型 1. 回环检测的意义 前端提供特征点的提取和轨迹.地图的初值 而后端负责对这所有的数据进 ...
最新文章
- 3行代码,Python数据预处理提速6倍!(附链接)
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
- Python3算术运算符
- nginx 1.14.0 配置部署 thinkphp 5.1
- 使用junit测试用例
- host ntrip 千寻rtk_最新测量干货:南方银河1和银河1Plus RTK设备连接千寻cors账号的设置方法...
- think in java - 第一章 学习笔记
- OPC DA通讯 KEP6.4 DCOM 配置脚本
- Sass函数:random()函数
- leetcode @python 120. Triangle
- 个人的第一个Chrome插件ColorConversion
- Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类
- 解决Windows环境下PHP连接MySQL很慢的问题
- 【Beta阶段项目展示】Time Shaft·时间轴
- lin总线可以控制几个节点_[LIN].LIN总线详解
- hadoop添加snappy解压缩库
- ambari Metrics Collector 无法收集信息
- JAVA高考加油,给高考学子加油打气的祝福语
- python关键词_Python批量挖掘百度凤巢关键词
- 用户触达方式及用户触达渠道选择
热门文章
- 人群与网络:社会选择与社会影响
- 置换群burnside引理(bzoj 1004: [HNOI2008]Cards)
- [Python] 切片函数:silce()
- 贺利坚老师汇编课程35笔记:[BX+SI]和[BX+DI]寻址
- datepicker 属性设置 以及方法和事件
- C#部分类与部分方法
- 使用struts2中默认的拦截器以及自定义拦截器
- android之wifi开发
- webservice wsdl 生成服务
- PHP运算符 - 对象的方法或者属性, =数组的元素值