当前位置: 代码迷 >> 综合 >> 「 SLAM lesson-3.8 」使用Eigen表示矩阵、向量及相关计算
  详细解决方案

「 SLAM lesson-3.8 」使用Eigen表示矩阵、向量及相关计算

热度:32   发布时间:2023-12-15 10:38:00.0

一、前言

        结合 高翔老师的著作《视觉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的资源  仅供各位研究员试读,请购买纸质书籍。

  相关解决方案