Eigen库学习笔记,矩阵运算,欧拉角四元数转换

在学习SLAM时,一定会需要Eigen库,它是一个高层次的C ++开源库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。为了更有效的阅读代码,更深刻的理解程序逻辑,对Eigen库进行专项学习和训练。根据大佬们的博客教程进行学习,并记录一些重点。

1 编译环境

VMware 16虚拟机安装Ubuntu 20.04

Ubuntu 20.04安装Eigen库

使用Visual Studion Code作为编译IDE

注意:

  • Ubuntu系统需要cmake和gcc,正常情况下,学习了解到这个程度,Ubuntu系统上的包基本全了,可以输入一下命令,查看cmake和gcc是否安装,以及安装版本。
cmake --versioin
gcc -v

2 创建CMake工程

1、在想要存放代码的文件夹位置,新建一个空文件夹

2、建立VS Code对文件夹的管理

打开VS Code,文件—>打开文件夹—>选择刚才新建的文件夹

3、创建源文件和CMakeLists.txt文件

查看—>命令面板(快捷键Ctrl+Shift+P)—>搜索并运行 CMake: Quick Start 命令—>选择高版本编译器GCC 9.4—>输入一个英文工程名(对应CMakeLists.txt中project名字)—>回车确认—>选择创建执行文件(Executable)。

生成的主代码文件和CMakeLists.txt文件如图所示,main.cpp名称可以更改,和CMakeLists.txt里的相应位置对应即可。

 4、点击图中右上方编译图标,对模板代码进行编译,软件下方切换到“终端”,若出现老传统语句“Hello, world!”就说明编译器没问题,并且成功创建工程,可以开始Eigen库编程练习了!

注意:

  • 如果成功编译了,就不要乱七八糟的改配置文件,赶紧开始主要工作,进行编程练习。

3 Eigen头文件使用

注意:

  • 通常添加#include <eigen3/Eigen/Eigen>就够了,注意eigen3

4 Eigen库使用及练习

可以根据以下博客的代码敲一遍,并且思考用法,学着变通。

Eigen库学习教程(全)_hongge_smile的博客-CSDN博客_eigen教程

注意:

  1. 注重向量和矩阵的初始化,即命名和初始赋值。
  2. 复习数组和矩阵的基本运算
  3. 复习矩阵转置,共轭,共轭转置
  4. 矩阵的基础运算,求和,平均值,求迹,求范数等
  5. 几何模块(Geometry)很重要,用来表达空间的旋转、平移等变换,包括欧拉角,旋转矩阵,变换矩阵,四元数等

5 四元数和欧拉角转换代码

注意:

  • 以下代码中,欧拉角转换四元数后,还可以转换回来原欧拉角。
  • 但是,四元数转换欧拉角后,不能转换回原来的四元数。
#include <iostream>
#include <eigen3/Eigen/Eigen>
 
using namespace std;
using namespace Eigen;
 
int main() {

    
    //欧拉角转换四元数,还可以转换回来欧拉角
    Vector3d eulerangle(5,5,5);                                                //初始化欧拉角
    Quaterniond Quaternion(0,1,1,1);                                           //初始化四元数
    cout << "eulerangle  :" << eulerangle.transpose() <<endl;                  //输出原始欧拉角
    cout << "Quaterniond :" << Quaternion.coeffs().transpose() <<endl;         //输出原始四元数

    AngleAxisd roll(AngleAxisd(eulerangle(2),Vector3d::UnitX()));              //欧拉角转旋转向量
    AngleAxisd pitch(AngleAxisd(eulerangle(1),Vector3d::UnitY()));
    AngleAxisd yaw(AngleAxisd(eulerangle(0),Vector3d::UnitZ()));

    Quaternion =roll * pitch *yaw;                                             //欧拉角转化四元数
    cout << "toquaternion : \n" << Quaternion.coeffs().transpose() <<endl;     //输出 原始欧拉角 转换的 四元数

    Vector3d eulerangle2 =Quaternion.toRotationMatrix().eulerAngles(2,1,0);     //按照210的顺序将得到的四元数转换为欧拉角
    cout << "toeuler: \n" << eulerangle.transpose() <<endl;                     //输出转换后的欧拉角

   //四元数转欧拉角,证明,四元数转欧拉角不唯一
    // Vector3d eulerangle(5,5,5);                                                //初始化欧拉角
    // Quaterniond Quaternion(0,1,1,1);                                           //初始化四元数
    // Vector3d eulerangle3 = Quaternion.toRotationMatrix().eulerAngles(2,1,0);
    // cout << "toeuler: \n" << eulerangle3.transpose() <<endl; 

    // AngleAxisd roll(AngleAxisd(eulerangle3(2),Vector3d::UnitX()));              //欧拉角转旋转向量
    // AngleAxisd pitch(AngleAxisd(eulerangle3(1),Vector3d::UnitY()));
    // AngleAxisd yaw(AngleAxisd(eulerangle3(0),Vector3d::UnitZ()));

    // Quaternion =roll * pitch *yaw;
    // cout << "toquaternion : \n" << Quaternion.coeffs().transpose() <<endl; 

return 0;
}

输出结果:

eulerangle  :5 5 5
Quaterniond :0 0 0 1
toquaternion : 
0.0971733  0.671063 0.0971733 -0.728553
toeuler: 
5 5 5

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可见一班

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值