一、前言
结合 高翔老师的著作《视觉SLAM十四讲:从理论到实践》,加上小白的工程经验共同完成。建议作为笔记功能反复使用。
二、Eigen
Eigen是一个C++开源线性代数库。相比于其他库,Eigen 特殊之处在于,它是一个纯用头文件搭建起来的库。我们在使用时,只需引入Eigen的头文件即可,不需要链接它的库文件(因为它没有库文件)。
Eigen是矩阵的基本数据单元,他是一个模板类。它的前三个参数为:数据类型、行、列。
三、头文件
#include<Eigen/Core> //Eigen部分#include<Eigen/Dense> //稠密矩阵的代数运算
四、函数部分
①. 定义一个旋转矩阵
Eigen::Matrix3d rotation_matrix = Eigen::Matrix3d::Identity(); //Identity()表示单位阵
②. 定义一个旋转向量
Eigen::AngleAxisd rotation_vector (M_PI/4, Eigen::Vector3d (0,0,1));
③. 旋转向量转换成旋转矩阵(两种方式)
//方式一cout.precision(3);cout<<"rotation matrix =\n"<<rotation_vector.matrix()<<endl;//方式二rotation_matrix = rotation_vector.toRotationMatrix();
④. 设定一个位置坐标
Eigen::Vector3d v(1,0,0);
⑤. 使用旋转向量进行坐标变换
Eigen::Vector3d v_rotated = rotation_vector*v;
⑥. 使用旋转向量进行坐标变换
v_rotated = rotation_matrix *v;
⑦. 定义一个欧拉角,并将旋转矩阵直接转换成欧拉角
Eigen::Vector3d euler_angles = rotation_matrix.eulerAngles(2,1,0); //ZYX顺序
⑧. 定义一个欧式变换矩阵
Eigen::Isometry3d T = Eigen::Isometry3d::Identity(); //初始化为单位阵
⑨. 使用 旋转向量 旋转 欧式变换矩阵
T.rotate( rotation_vector );
⑩. 设置欧氏变换矩阵的平移向量
T.pretranslate(Eigen::Vector3d(1,3,4));
①①. 使用欧氏变换矩阵进行坐标变换
Eigen::Vector3d v_transformed = T*v; //相当于 R*V+t
①②. 定义一个四元数,并直接把旋转向量赋值給四元数(反之亦然)
Eigen::Quaterniond q = Eigen::Quaterniond( rotation_vector );
①③. 使用四元数旋转一个向量
v_rotated = q*v;
五、完整程序
#include<iostream>
#include<cmath>
using namespace std;#include <Eigen/Core>
#include <Eigen/Geometry>int main( int argc,char** argy )
{Eigen::Matrix3d rotation_matrix = Eigen::Matrix3d::Identity();Eigen::AngleAxisd rotation_vector (M_PI/4, Eigen::Vector3d (0,0,1));cout.precision(3);cout<<"rotation matrix =\n"<<rotation_vector.matrix()<<endl;rotation_matrix = rotation_vector.toRotationMatrix();Eigen::Vector3d v(1,0,0);Eigen::Vector3d v_rotated = rotation_vector*v; cout<<"(1,0,0) after totation = "<<v_rotated.transpose()<<endl;v_rotated = rotation_matrix *v;cout<<"(1,0,0) after rotation ="<<v_rotated.transpose()<<endl;Eigen::Vector3d euler_angles = rotation_matrix.eulerAngles(2,1,0);cout<<"yaw pitch roll = "<<euler_angles.transpose()<<endl;Eigen::Isometry3d T = Eigen::Isometry3d::Identity();T.rotate( rotation_vector );T.pretranslate(Eigen::Vector3d(1,3,4));cout<<"Transform matrix = \n"<<T.matrix()<<endl;Eigen::Vector3d v_transformed = T*v;cout<<"v tranformed = "<<v_transformed.transpose()<<endl;Eigen::Quaterniond q = Eigen::Quaterniond( rotation_vector );cout<<"quaternion = \n"<<q.coeffs()<<endl;v_rotated = q*v;cout<<"(1,0,0) after rotation = "<<v_rotated.transpose()<<endl;return 0;
}
六、Eigen对上述形式的表达方式总结
- 旋转矩阵(3*3):Eigen::Matrix3d
- 旋转向量(3*1):Eigen::AngleAxisd
- 欧拉角(3*1):Eigen::Vector3d
- 四元数(4*1):Eigen::Quaterniond
- 欧式变换矩阵(4*4):Eigen::Isometry3d
- 仿射变换(4*4):Eigen::Affine3d
- 射影变换(4*4):Eigen::Projective3d
《视觉SLAM十四讲:从理论到实践》 PDF资源
下载链接:Robot_Starscream的资源 仅供各位研究员试读,请购买纸质书籍。