slam学习之Eigen库的简单总结

Posted wang-cheng-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了slam学习之Eigen库的简单总结相关的知识,希望对你有一定的参考价值。

1、一句话简述Eigen

  Eigen是一个C++开源线性代数库,slam中使用Eigen库进行矩阵、向量乃至旋转矩阵与变换矩阵的表示和计算

2Eigenubuntu中的安装

  Eigen库在ubuntu软件源中提供,所以可以直接在终端输入以下命令进行安装:


sudo apt-get install libeigen3-dev


3Eigenubuntu中的简单应用

  一般而言,库是由头文件和库文件组成,在编译时不仅在可执行程序中声明库的头文件,而且要将可执行文件与库文件链接,而Eigen是一个由只用头文件搭建起来的库,在使用时只需引入Eigen的头文件即可,不需要链接库文件。Eigen库的头文件默认在“/usr/include/eigen3”中,如果不确定可以输入以下命令查找:

 

sudo updatedb

locate eigen3



  下面引入一段简单代码来表达Eigen的使用:

  #include <iostream>
  using namespace std;
  #include <ctime>
  #include <Eigen/Core>
  #include <Eigen/Dense>

  int main( int argc, char** argv )
{    
    //声明矩阵:一个名为m_23的单精度2行3列矩阵,Eigen::Matrix为声明矩阵的一个模板类,前三个参数为:数据类型,行,列。
    Eigen::Matrix<float, 2, 3> m_23;


    //基于Eigen::Matrix,有一些内置的类型比如Eigen::Vector3f,指的是:Eigen::Matrix<float,3,1>,表示一个三维向量。其中f表示单精度,d表示双精度。
    Eigen::Vector3d v_3d;  //声明一个三维向量v_3d


    //类似地,Matrix3d 实质上是 Eigen::Matrix<double, 3, 3>
    Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero();  //声明一个三维矩阵并初始化为零
    
    //输入数据
    m_23 << 1,2,3,4,5,6;
    //输出
    cout<<m_23<<endl;

    // 用for语句访问矩阵中的元素
       for (int i=0; i<2; i++)
     {
            for (int j=0; j<3; j++)
                cout<<m_23(i,j)<<" ";
             cout<<endl;
     }

    //矩阵和向量相乘
    v_3d << 1, 2, 3;
    //要保证输出数据类型跟输入数据类型一致,m_23前面声明为单精度,故用cast()显式转换为双精度。
    Eigen::Matrix<double, 2, 1> result = m_23.cast<double>() * v_3d;
    cout << result << endl;


    //矩阵运算比较简单
    matrix_33 << 1,2,3,4,5,6,7,9,9;      // 声明一个矩阵(可以多试几种矩阵,看下面的计算输出什么结果)
    cout << matrix_33 << endl;

    cout << matrix_33.transpose() << endl;      // 转置
    cout << matrix_33.sum() << endl;            // 各元素和
    cout << matrix_33.trace() << endl;          // 迹
    cout << 10*matrix_33 << endl;               // 数乘
    cout << matrix_33.inverse() << endl;        // 逆
    cout << matrix_33.determinant() << endl;    // 行列式

    //如何解方程:matrix_33*X = v_3d,有两种方法:直接求逆法,矩阵分解法。下面分别求解并计时验证效率,可知直接法比较耗时,运算量大
    
    clock_t time_stt = clock();   // 计时(直接求逆法)
    Eigen::Matrix<double,3,1> X= matrix_33.inverse()*v_3d;
    cout<<"方程解为: "<<X<<endl;
    cout <<"计算所需时间:" << 1000* (clock() - time_stt)/(double)CLOCKS_PER_SEC << "ms"<< endl;
   

  // 矩阵分解法
     time_stt = clock();  //计时
        X = matrix_33.colPivHouseholderQr().solve(v_3d);
    cout<<"方程解为: "<<X<<endl;
       cout <<"计算所需时间:" << 1000* (clock() - time_stt)/(double)CLOCKS_PER_SEC << "ms"<< endl;
    return 0;

}

  

将程序文件保存命名为eigenMatrix.cpp,在ubuntu中我们使用cmake编译,CMakeLists.txt文件编辑如下:

 

cmake_minimum_required( VERSION 2.8 )

#创建名为useEigen的工程

project( useEigen )  

# 添加Eigen头文件

include_directories( "/usr/include/eigen3" )

#添加要运行的程序

add_executable( eigenMatrix eigenMatrix.cpp )


 

之后在终端通过cmake编译得到可执行文件,运行可执行文件得到运行结果如下:

1 2 3

4 5 6

1 2 3

4 5 6

14

32

1 2 3

4 5 6

7 9 9

1 4 7

2 5 9

3 6 9

46

15

10 20 30

40 50 60

70 90 90

-1.5 1.5 -0.5

1 -2 1

0.166667 0.833333 -0.5

6

方程解为:

0

0

0.333333

计算所需时间:0.043ms

方程解为:

1.14652e-15

-9.12374e-16

0.333333

计算所需时间:0.042ms

 

 

 

参考:《视觉slam十四讲,从理论到实践》,高翔,张涛编著。

 

以上是关于slam学习之Eigen库的简单总结的主要内容,如果未能解决你的问题,请参考以下文章

视觉slam学习:初识slam,三维空间刚体运动代码实战,Eigen库的使用

视觉slam学习:初识slam,三维空间刚体运动代码实战,Eigen库的使用

SLAM-Eigen库

《视觉slam十四讲》之第3讲-实践Eigen库

视觉slam十四讲开源库安装教程

从零开始的ROS学习之仿真+SLAM