从零开始的VIO——Eigen和Sophus的安装配置

1. 前言

笔者最近开始学习深蓝学院的网课《从零开始手写VIO》,先前读过《视觉slam十四讲》以及《机器人学中的状态估计》两本书,光是里面的数学推导都感到非常吃力,实操更是一塌糊涂。所以也是趁着有些矩阵分析和李代数的基础,借助于《从零开始手写VIO》课程,正式步入视觉惯性里程计的学习和实践,分享在学习中遇到的问题和经验。对于VIO实践来说,所有的研究都是基于三维运动的姿态变化为重点,所以第一步需要安装的库就是Sophus。

2.概述

操作系统:Ubuntu16.04。
编译环境:VSCode,C++。关于VSCode的介绍和安装这里就不再赘述了,需要关注的是工程的配置文件中 .vscode/c_cpp_properties.json 的变量 includePath,在之后的研究中如果需要添加新库,则需要把那个库的路径添加在这个变量中。
Eigen库:矩阵库,可以进行线性代数、向量、矩阵等操作和运算的C++库。解压即可用,不需要使用cmake。
Sophus库:支持二维运动SO(2)、SE(2),三维运动SO(3)、SE(3)等内容,是在Eigen库基础上的开发,分为模板类库和非模板类库,这里选择非模板类库。

3. Eigen和Sophus的安装

(1)矩阵Eigen

安装Eigen

sudo apt-get install libeigen3-dev

解压完成后确认Eigen的路径,可以把eigen-3.3.7中的Eigen文件夹单独复制出来,与eigen-3.3.7同一个路径下(方便写代码的时候直接使用“#include <Eigen/…>”),把该路径添加进includePath。我的是 /usr/local/include/Eigen。如下图所示:
在这里插入图片描述
程序中添加Eigen的头文件测试,例如以下代码,没有报错即表示安装成功。

#include <Eigen/Core>
#include <Eigen/Geometry>

(2)李代数Sophus

通过以下命令下载非模板类的Sophus库:

git clone https://github.com/strasdat/Sophus.git

对Sophus进行编译(为了避免不必要的麻烦,最好执行最后一条安装命令):

cd Sophus
git checkout a621ff
mkdir build
cmake ..
make
sudo make install

编译安装完成后会出现 /usr/local/include/sophus/ 下的各种头文件。同样把Sophus的路径添加进includePath
在这里插入图片描述
可以用一个简单的例子Sophus.cpp验证:

#include <iostream>
#include <Eigen/Core>
#include "sophus/so3"

int main(){
	Eigen::Matrix3d R = Eigen::Matrix3d::Identity();
    Eigen::AngleAxisd rotation_vector(M_PI/4, Eigen::Vector3d(0,0,1));
    Sophus::Quaterniond q(R);

	return 0;
}

注意在编译这段代码时,不能简单的使用g++ Sophus.cpp -o Sophus进行编译,即便代码本身不会报错,但会提示Sophus未找到,是因为动态链接库libSophus.so未正确链接。所以有两种方式进行编译。

(3)编译

g++方式

使用以下命令:

g++ Sophus.cpp -l Sophus -o Sophus

这种方式看似简单只有一条命令,但一般不合适多数情况,试想如果有100个so文件需要连接,总不能每次编译都写那么长一串。。。

cmake方式

在要编译的cpp文件同级目录中新建文件CMakeLists.txt,编写这个文件,使之能自动寻找Sophus库的路径。以下是我写的一个CMakeLists.txt。

cmake_minimum_required( VERSION 2.8 )
PROJECT(DemoSophus)

FIND_PACKAGE(Sophus REQUIRED)

SET(CMAKE_EXPORT_COMPILE_COMMANDS ON)
SET(SOPHUS_INCLUDE_DIR /usr/local/include/sophus)
SET(EIGEN_INCLUDE_DIR /usr/local/include/eigen3)
SET(ALL_CODE_LIST Sophus.cpp)
SET(SOPHUS_LIBRARIES /usr/local/lib/libSophus.so)

MESSAGE(STATUS "This is binary dir: " ${DemoSophus_BINARY_DIR})
MESSAGE(STATUS "This is source dir: " ${DemoSophus_SOURCE_DIR})

INCLUDE_DIRECTORIES(${SOPHUS_INCLUDE_DIR})
ADD_EXECUTABLE(Sophus ${ALL_CODE_LIST})
TARGET_LINK_LIBRARIES(Sophus ${SOPHUS_LIBRARIES})

关于CMakeLists.txt如何编写我也是初学者,需要的话在网上可以很容易找到cmake的教程,这里只是一个很简单的例子。这里面的MESSAGE语句可以不用理会,只是为了输出提示信息。需要注意的只有SET语句,先自定义变量名(名字随意,之后这个名字就代表后面的路径),再把路径补全,请自行查看那些文件所对应的路径。接下来,用cmake编译就可以了。

mkdir build
cd build
cmake ..
make

最后,在build文件夹里,就会生成对应的可执行文件Sophus。
在这里插入图片描述

4. 结语

笔者最开始也只是知道有cmake这个方式可以进行编译,平常习惯用g++方式,遇到Sophus库的安装问题也是费了一些功夫,才对cmake稍有点理解,在此以这个简单的例子记录整个安装过程。以后需要编译的文件多了,就慢慢体会到cmake的方便之处。

发布了2 篇原创文章 · 获赞 0 · 访问量 127

猜你喜欢

转载自blog.csdn.net/EternalGlory_wx/article/details/104423759
今日推荐