Eigen库的学习使用

news2024/9/29 13:18:26

环境准备

在虚拟机上安装Eigen
sudo apt-get install libeigen3-dev
下载好视觉SLAM十四讲对应的代码后,下载KDevelop,KDevelop位于Ubuntu系统的软件仓库,可以使用apt-get来安装。

1.打开project,选择对应目录下的CMakeLists.txt。

在这里插入图片描述
会生成build目录:
在这里插入图片描述

2.build该工程

在这里插入图片描述
报错1: By not providing “FindPangolin.cmake” in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by “Pangolin”, but CMake did not find one.
没有Pangolin导致(Pangolin是对OpenGL进行封装的轻量级的OpenGL输入/输出和视频显示的库。可以用于3D视觉和3D导航的视觉图,可以输入各种类型的视频、并且可以保留视频和输入数据用于debug。)之前复现ORB_SLAM2的时候因为版本的问题安装这个库搞了很久,所以这次之前复用之前的方法。
step1:安装依赖项

sudo apt-get install libglew-dev libpython2.7-dev

step2:到github官网上下载0.5版本的Pangolin,解压后到该目录下。

cd Pangolin
mkdir build
cd build
cmake ..
make -j16
sudo make install

报错2:
在这里插入图片描述
添加头文件#include <Eigen/Geometry>

编译成功:
在这里插入图片描述

3.执行程序

1.在run-——>Current Launch Configuration中配置选择要执行的文件。
在这里插入图片描述
Executable中选择build目录下生成的可执行文件,最后在Launch Configurations选择要执行的文件,点击界面中的"Execute"即可。
在这里插入图片描述
执行结果:
在这里插入图片描述

编程学习

KDevelop常用的快捷键,可以在setting中的configure shortcuts设置。
win+left 上次访问的上下文
win+right 下次访问的上下文
Ctrl+d 注释
Ctrl+Shift+d 解注释
F9运行程序

使用Eigen的头文件

//Eigen的核心部分
#include<Eigen/Core>
//稠密矩阵的代数运算(逆、特征值等)
#include<Eigen/Dense>
//Eigen的几何模块,提供各种旋转和平移的表示
#include<Eigen/Geometry>

1.动态矩阵和静态矩阵的定义和初始化

//定义并初始化一个2*3的矩阵
Matrix<float,2,3> matrix_23;
matrix_23 << 1,2,3,4,5,6;

//定义一个动态矩阵
MatrixXd matrixXd;
Matrix<double,Dynamic,Dynamic> matrix_dynamic;

//向量的定义,Vector3d实质是Matrix<double,3,1>
Vector3d v_3d;
v_3d<<3,2,1;
Vector4d v_4d;

2.如何访问并操作矩阵中的元素

//访问第2行第1列的元素
cout<<matrix_23(2,1);
//假设m是一个3*3的矩阵并已经初始化,对里面的元素进行操作
m(0, 0) = 1;
m(0, 1) = 2;
m(1, 0) = m(0, 0) + 3;
m(1, 1) = m(0, 0) * m(0, 1);

3.如何使元素类型不同的矩阵相乘(float和double)

//用cast()显示转换
Matrix<double,2,1> result = matrix_23.cast<double>()*v_3d;

4.求矩阵的转置、和、迹、逆、行列式等基本操作

Matrix3d matrix_33 = Matrix3d::Random();//随机数矩阵
Matrix3d matrix_33_other = Matrix3d::Random();//随机数矩阵
cout << "random matrix: \n" << matrix_33 << endl;
cout << "transpose: \n" << matrix_33.transpose() << endl;      // 转置
cout << "sum: " << matrix_33.sum() << endl;            // 各元素和
cout << "trace: " << matrix_33.trace() << endl;          // 迹
cout << "times 10: \n" << 10 * matrix_33 << endl;               // 数乘
cout << "inverse: \n" << matrix_33.inverse() << endl;        // 逆
cout << "det: " << matrix_33.determinant() << endl;    // 行列式
cout << "det: " << matrix_33.conjugate() << endl;    // 共轭矩阵
cout << "det: " << matrix_33.adjoint() << endl;    // 伴随矩阵
cout << "det: " << matrix_33.mincoeff() << endl;    // 最小值
cout << "det: " << matrix_33.maxcoeff() << endl;    // 最大值
cout << "det: " << matrix_33.mean() << endl;    // 平均值
cout << "det: " << matrix_33.prod() << endl;    // 所有元素求积
cout << "det: " << matrix_33.dot(matrix_33_other ) << endl;    // 点乘
cout << "det: " << matrix_33.cross(matrix_33_other ) << endl;    // 叉乘

5.求矩阵的特征值和特征向量

Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver(matrix_33.transpose() * matrix_33);
cout << "Eigen values = \n" << eigen_solver.eigenvalues() << endl;
cout << "Eigen vectors = \n" << eigen_solver.eigenvectors() << endl << endl;

6.解方程

  // 解方程
  // 我们求解 matrix_NN * x = v_Nd 这个方程
  // N的大小在前边的宏里定义,它由随机数生成
  // 直接求逆自然是最直接的,但是求逆运算量大
  Matrix<double, MATRIX_SIZE, MATRIX_SIZE> matrix_NN = MatrixXd::Random(MATRIX_SIZE, MATRIX_SIZE);
  matrix_NN = matrix_NN * matrix_NN.transpose();  // 保证半正定
  Matrix<double, MATRIX_SIZE, 1> v_Nd = MatrixXd::Random(MATRIX_SIZE, 1);
  // 直接求逆
  Matrix<double, MATRIX_SIZE, 1> x = matrix_NN.inverse() * v_Nd;
  cout << "x = " << x.transpose() << endl;
  // 通常用矩阵分解来求,例如QR分解,速度会快很多
  x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
  cout << "x = " << x.transpose() << endl;
  // 对于正定矩阵,还可以用cholesky分解来解方程
  x = matrix_NN.ldlt().solve(v_Nd);
  cout << "x = " << x.transpose() << endl;

7.旋转矩阵、旋转向量、四元数、欧拉角的定义和之间的转换

//1.定义旋转矩阵和旋转向量,将旋转向量转为旋转矩阵
Matrix3d rotation_matrix = Matrix3d::Identity();
AngleAxisd rotation_vector =(M_PI/4,Vector3d(0,0,1));
//.matrix()将旋转向量转为旋转矩阵
cout<<rotation_vector.matrix()<<endl;
//.toRotationMatrix()也可以将旋转向量转为旋转矩阵
rotation_matrix = rotation_vector.toRotationMatrix();

//现在有一个三维向量,利用旋转矩阵、旋转向量、欧式变换矩阵分别对其进行坐标变换
Vector3d v(1,0,0);
//旋转向量进行坐标变换
Vector3d v_rotated = rotation_vector*v;
//旋转矩阵进行坐标变换
v_rotated = rotation_matrix*v;
//用欧式变换矩阵进行坐标变换
Isometry3d T = Isometry3d::Identity();
T.rotate(rotation_vector);
T.pretanslate(Vector3d(1,3,4));
//相当于Rv+t
Vector3d v_tranformed = T*v

//将旋转矩阵转为欧拉角 按ZYX顺序 roll pitch yow
Vector3d enlur_angle = rotation_matrix.enlurAngles(2,1,0);

//把旋转矩阵或旋转向量赋值给四元数
Quaterniond q = Quaterniond(rotation_vector);
q = Quaterniond(rotation_matrix);
//使用四元数旋转一个向量
v_rotated = q*v;
//用四元数和平移向量表示两个坐标系的变换关系,怎么进行坐标转换
Quaterniond q1(0.35, 0.2,0.3,0.1),q2(-0.5,0.4,-0.1,0.2);
q1.normalize();
q2.normalize();
Vector3d t1(0.3,0.1,0.1),t2(-0.1,0.5,0.3);
Vector3d p1(0.5,0,0.2);
//得到机器人坐标系1、2到世界坐标系的变换矩阵
Isometry3d T1w(q1),T2w(q2);
T1w.pretranslate(t1);
T2w.pretranslate(t2);
//将机器人坐标系p1转到机器人坐标系p2
Vector3d p2 = T2w * T1w.inverse() * p1;
cout<<p2.transpose()<<endl;




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

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

相关文章

接口测试--Postman变量

Postman是我们做接口测试的常用工具之一&#xff0c;然而对于刚接触Postman的小伙伴们来说&#xff0c;往往对这款工具支持的各类变量感到迷茫&#xff0c;傻傻分不清这些不同级别的变量都有哪些区别、分别适用于哪些场景。 本次分享将对Postman各类变量的创建&#xff0c;执行…

门店私域流量系统:打开营销新世界的大门

当前&#xff0c;门店私域流量系统已经成为了企业营销的重要利器。通过建立属于自己的私域流量平台&#xff0c;可以让门店更好地了解客户需求&#xff0c;提高营销效果&#xff0c;实现精细化营销闭环。门店私域流量系统有哪些重点功能&#xff1f; 1. 用户画像&#xff1a;通…

【黑产攻防道03】利用JS参数更新检测黑产的协议破解

任何业务在运营一段时间之后都会面临黑产大量的破解。验证码和各种爬虫的关系就像猫和老鼠一样, 会永远持续地进行博弈。极验根据十一年和黑产博弈对抗的经验&#xff0c;将黑产的破解方式分为三类&#xff1a; 1.通过识别出验证码图片答案实现批量破解验证&#xff0c;即图片…

浏览器下载视频插件使用

AIX智能下载器(图片/视频/音乐/文档) - Microsoft Edge Addons软件介绍&#xff1a; AIX智能下载器可高效实现下载管理&#xff0c;网页图片&#xff0c;视频&#xff0c;音频等内容的嗅探和下载&#xff0c;同时扩展集成多个网站的智能脚本&#xff0c;快速提取你想要的内容。…

【zip密码】7-zip分卷压缩方法

想要压缩的文件过大&#xff0c;想要在压缩过程中将文件拆分为几个压缩包并且同时为所有压缩包设置加密应该如何设置&#xff1f; 想要分卷压缩文件并加密一起操作就可以完成了&#xff0c;设置方法如下&#xff1a; 打开7-zip&#xff0c;选中需要压缩的文件&#xff0c;选择…

基于Java的财务管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

毕业论文Word文档中排版各种问题(持续更新中)

目录 封面信息信息对齐 快捷键使用公式公式编号并右对齐 表格续表并自动添加表头和标题 参考文献添加参考文献一篇文献交叉引用多篇文献交叉引用 参考文章链接 这个是在目前正在写论文过程中遇到一些问题&#xff0c;然后边解决边记录的&#xff0c;有些混乱&#xff0c;主要是…

【开源】基于SpringBoot的森林火灾预警系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 系统基础模块2.3 烟雾传感器模块2.4 温度传感器模块2.5 历史记录模块2.6 园区数据模块 三、系统设计3.1 用例设计3.1.1 森林园区基础系统用例设计3.1.2 森林预警数据用例设计 3.2 数据库设计3.2.1 烟雾…

性能测试工具——Jmeter的安装【超详细】

目录 1、性能测试工具&#xff1a;JMeter和LoadRunner对比 2、为什么学习JMeter&#xff1f; 3、JMeter环境搭建 3.1、安装JDK 3.2、下载安装JMeter 3.3、配置环境变量 2.4、启动验证JMeter是否安装成功 4、认识JMeter的目录结构 1&#xff09;bin目录&#xff1a;存放…

接口自动化测试工具,Postman使用详解

一、概念 1、Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件&#xff0c;Postman分为Postman native app和Postman Chrome app两个版本。目前Chrome app已经停止维护&#xff0c;官方也不推荐使用该版本。 2、官网下载地址&#xff1a;http://www.getpostman…

便利连锁:如何增加收益?教你一招轻松搞定!

自动售货机&#xff0c;作为零售行业的一项颠覆性技术&#xff0c;正逐渐改变着我们的购物方式和商业格局。这一创新技术不仅重新定义了零售业务模式&#xff0c;还为企业提供了更多的机会来满足不断演变的消费者需求。 客户案例 便利连锁店 成都某便利连锁店面临一系列挑战&am…

input 输入中文,高频触发 onchange和oninput事件(CompositionEvent API解决)

问题描述&#xff1a; input onchange和oninput 事件输入中文时高频触发。 输入字母&#xff0c;数字&#xff0c;符号都没问题&#xff1a; 输入中文时问题就出来了&#xff1a; 每个拼音字母都触发了change&#xff0c;甚至输入法里的nin’hao 把拼音分开的字符也会触发。…

git clone 遇到了 early EOF index-pack failed 问题

问题 由于仓库包含了很多文件&#xff0c;仓库过大&#xff0c;导致clone的时候一直报错&#xff1a; 解决方案 注意&#xff1a;过程中需要耐心等待&#xff0c;如果遇到失败&#xff0c;可以多尝试几遍。 压缩目标仓库文件 compression 是压缩的意思&#xff0c;从 clo…

javaweb请求

1.给类加上RestController表示该类是请求处理类 2.判断类里面的hello()方法处理哪个请求&#xff0c;需在方法上加上注解RequestMapping("/hello"),表示浏览器请求localhost:8080/hello这个地址时&#xff0c;会调用此方法&#xff0c;

使用boost.mysql来操作mysql 数据库

准备条件 1. visual studio 2019 2. boost库 3. 安装本地的mysql 服务器&#xff0c;boost.mysql对mysql有版本要求最好8.0&#xff0c;具体参考官方文档 安装 使用Nuget安装boost 要安装 openssl&#xff0c;否则的话编译其他项目会产生依赖ssl的错误 安装mysql 省略 …

“数聚瑞安·创新未来”中国·瑞安第四届创新创业大赛圆满举办!

10月26日&#xff0c;“数聚瑞安 创新未来”中国瑞安第四届创新创业大赛决赛在瑞安东新科创园举行。本次大赛旨在挖掘优质的创新创业项目激活本地创新创业氛围&#xff0c;激发创新创业活力&#xff0c;数字科创赛道吸引了来自全国20多个省市自治区的50多个城市的100多家企业和…

IP地址与代理ip在网络安全中的关键作用

目录 前言 一、IP地址在网络安全中的作用 1、网络流量监视和分析 2、网络安全事件响应 3、网络安全检测和防御 二、代理IP在网络安全中的作用 1、流量过滤和清洗 2、匿名访问和保护隐私 3、实现全球化业务 三、IP地址和代理IP在网络安全中的应用案例 1、DDoS攻击 2…

U盘RAW格式无法格式化怎么办?

我们在使用U盘时候&#xff0c;有时会碰到U盘RAW格式无法格式化的情况。当U盘变为RAW格式时&#xff0c;无论是双击还右键选择打开U盘&#xff0c;Windows系统都会提示无法完成格式化。那遇到RAW格式U盘无法格式化怎么办&#xff1f; 什么是RAW格式&#xff1f; 在开始格式化之…

学编程如何提高自己的编程能力

以下是一些建议&#xff0c;帮助你提高编程能力&#xff1a; 掌握基础知识。了解编程语言的基本语法、数据类型、控制结构等基础知识&#xff0c;是提高编程能力的基础。多写代码。编程需要实践&#xff0c;多写代码才能提高编程能力。可以从简单的练习项目开始&#xff0c;逐…

SpringCloudAlibaba实战-nacos集群部署

写在前面&#xff1a;在学习阶段&#xff0c;我们想快速学习SpringCloudAlibaba功能&#xff0c;但总是花费大量时间跟着视频或博客做组件配置。由于版本的更迭&#xff0c;我们学习时的组件版本很可能和作者的不一致&#xff0c;又或者是各自环境不一&#xff0c;只能一坑又一…