在学习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教程
注意:
- 注重向量和矩阵的初始化,即命名和初始赋值。
- 复习数组和矩阵的基本运算
- 复习矩阵转置,共轭,共轭转置
- 矩阵的基础运算,求和,平均值,求迹,求范数等
- 几何模块(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