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实现旋转变换

  1. 三维旋转矩阵:创建一个三维矩阵即可
//例:创建一个三阶单位矩阵
Eigen::Matrix3d rotation_matrix = Eigen::Matrix3d::Identity();
  1. 旋转向量:使用AngleAxis,可以使用这个它乘向量实现旋转操作(因为定义了运算符重载),括号内是旋转向量的角度和旋转轴
//创建一个绕z轴旋转45°的旋转向量
Eigen::AngleAxisd rotation_vector(M_PI/4,Eigen::Vector3d(0,0,1));
  1. 旋转向量转换为三维旋转矩阵
//将rotation_vector这个旋转向量转换为旋转矩阵并打印出来
cout<<"rotation matrix = \n"<<rotation_vector.matrix()<<endl;
//或通过toRotationMatrix转换为旋转矩阵
rotation_matrix = rotation_vector.toRotationMatrix();
  1. 旋转矩阵转换为欧拉角
//将旋转矩阵转换为ZYX顺序的欧拉角,即yaw-pitch-roll
Eigen::Vector3d euler_angles = rotation_matrix.eulerAngles(2,1,0);
cout<<"yaw pitch roll = "<<euler_angles.transpose()<<endl;
  1. 使用旋转向量进行坐标变换:因为对进行了运算符重载,旋转操作直接乘向量即可
//定义一个x方向的向量,用前面定义的旋转向量进行旋转,然后输出旋转后的结果。
Eigen::Vector3d v(1,0,0);
Eigen::Vector3d v_rotated = rotation_vector * v;
cout<<"(1,0,0) after rotation = "<<v_rotated.transpose()<<endl;
  1. 用旋转矩阵进行坐标变换
v_rotated = rotation_matrix * v;
cout<<"(1,0,0) after rotation = "<<v_rotated.transpose()<<endl;
  1. 使用变换矩阵进行坐标变换
//定义一个名为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;
  1. 使用四元数
//创建一个四元数
Eigen::Quaterniond q;
//可以直接把旋转向量赋值给四元数
q = Eigen::Quaterniond(rotation_vector);
//也可以把旋转矩阵赋值给它
q=Eigen::Quaterniond(rotation_matrix);
//使用四元数旋转一个向量
v_rotated = q*v;

【SLAM笔记】如何使用Eigen进行矩阵运算相关推荐

  1. 视觉SLAM笔记(14) Eigen几何模块

    视觉SLAM笔记(14) Eigen几何模块 1. 旋转表达方式 2. 旋转矩阵 3. 欧拉角 3. 仿射和射影变换 4. 四元数 5. 可视化演示 1. 旋转表达方式 之前讲到的各种旋转表达方式 现 ...

  2. 视觉SLAM笔记(9) Eigen

    视觉SLAM笔记(9) Eigen 1. 开源线性代数库 2. 基本操作与运算 2.1. 向量和矩阵 2.2. 内置类型 2.3. 初始化 2.4. 动态大小 2.5. 输入数据 2.6. 输出数据 ...

  3. 视觉SLAM笔记(18) Sophus

    视觉SLAM笔记(18) Sophus 1. Sophus 库 2. SO(3) 运算 3. SE(3) 运算 1. Sophus 库 一个较好的李代数库是 Strasdat 维护的 Sophus 库 ...

  4. 视觉SLAM笔记(65) 简约总结

    视觉SLAM笔记(65) 简约总结 参考: <视觉SLAM十四讲> 视觉SLAM笔记(3) 视觉SLAM框架 视觉SLAM笔记(20) 单目相机模型 视觉SLAM笔记(32) 2D-2D: ...

  5. 视觉SLAM笔记(63) RGB-D 稠密建图

    视觉SLAM笔记(63) RGB-D 稠密建图 1. 建立点云地图 2. 点云地图 3. 其他重建方法 1. 建立点云地图 所谓点云,就是由一组离散的点表示的地图 最基本的点包含 x, y, z 三维 ...

  6. 视觉SLAM笔记(61) 单目稠密建图

    视觉SLAM笔记(61) 单目稠密建图 1. 立体视觉 2. 极线搜索与块匹配 3. 高斯分布的深度滤波器 1. 立体视觉 相机,很久以来被认为是只有角度的传感器(Bearing only) 单个图像 ...

  7. 视觉SLAM笔记(60) 建图

    视觉SLAM笔记(60) 建图 1. 概述 2. 用处 1. 概述 建图(Mapping),本应该是 SLAM 的两大目标之一 因为 SLAM 被称为同时定位与建图 之前讨论的都是定位问题,包括通过特 ...

  8. 视觉SLAM笔记(58) 字典

    视觉SLAM笔记(58) 字典 1. 字典的结构 2. 创建字典 1. 字典的结构 按照前面的介绍,字典由很多单词组成,而每一个单词代表了一个概念 一个单词与一个单独的特征点不同 它不是从单个图像上提 ...

  9. 视觉SLAM笔记(57) 回环检测

    视觉SLAM笔记(57) 回环检测 1. 回环检测的意义 2. 实现方法 3. 准确率和召回率 4. 词袋模型 1. 回环检测的意义 前端提供特征点的提取和轨迹.地图的初值 而后端负责对这所有的数据进 ...

最新文章

  1. 3行代码,Python数据预处理提速6倍!(附链接)
  2. Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
  3. Python3算术运算符
  4. nginx 1.14.0 配置部署 thinkphp 5.1
  5. 使用junit测试用例
  6. host ntrip 千寻rtk_最新测量干货:南方银河1和银河1Plus RTK设备连接千寻cors账号的设置方法...
  7. think in java - 第一章 学习笔记
  8. OPC DA通讯 KEP6.4 DCOM 配置脚本
  9. Sass函数:random()函数
  10. leetcode @python 120. Triangle
  11. 个人的第一个Chrome插件ColorConversion
  12. Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类
  13. 解决Windows环境下PHP连接MySQL很慢的问题
  14. 【Beta阶段项目展示】Time Shaft·时间轴
  15. lin总线可以控制几个节点_[LIN].LIN总线详解
  16. hadoop添加snappy解压缩库
  17. ambari Metrics Collector 无法收集信息
  18. JAVA高考加油,给高考学子加油打气的祝福语
  19. python关键词_Python批量挖掘百度凤巢关键词
  20. 用户触达方式及用户触达渠道选择

热门文章

  1. 人群与网络:社会选择与社会影响
  2. 置换群burnside引理(bzoj 1004: [HNOI2008]Cards)
  3. [Python] 切片函数:silce()
  4. 贺利坚老师汇编课程35笔记:[BX+SI]和[BX+DI]寻址
  5. datepicker 属性设置 以及方法和事件
  6. C#部分类与部分方法
  7. 使用struts2中默认的拦截器以及自定义拦截器
  8. android之wifi开发
  9. webservice wsdl 生成服务
  10. PHP运算符 - 对象的方法或者属性, =数组的元素值