笔者最近开始学习深蓝学院的网课《从零开始手写VIO》,先前读过《视觉slam十四讲》以及《机器人学中的状态估计》两本书,光是里面的数学推导都感到非常吃力,实操更是一塌糊涂。所以也是趁着有些矩阵分析和李代数的基础,借助于《从零开始手写VIO》课程,正式步入视觉惯性里程计的学习和实践,分享在学习中遇到的问题和经验。对于VIO实践来说,所有的研究都是基于三维运动的姿态变化为重点,所以第一步需要安装的库就是Sophus。
操作系统:Ubuntu16.04。
编译环境:VSCode,C++。关于VSCode的介绍和安装这里就不再赘述了,需要关注的是工程的配置文件中 .vscode/c_cpp_properties.json 的变量 includePath,在之后的研究中如果需要添加新库,则需要把那个库的路径添加在这个变量中。
Eigen库:矩阵库,可以进行线性代数、向量、矩阵等操作和运算的C++库。解压即可用,不需要使用cmake。
Sophus库:支持二维运动SO(2)、SE(2),三维运动SO(3)、SE(3)等内容,是在Eigen库基础上的开发,分为模板类库和非模板类库,这里选择非模板类库。
安装Eigen
sudo apt-get install libeigen3-dev
解压完成后确认Eigen的路径,可以把eigen-3.3.7中的Eigen文件夹单独复制出来,与eigen-3.3.7同一个路径下(方便写代码的时候直接使用“#include
程序中添加Eigen的头文件测试,例如以下代码,没有报错即表示安装成功。
#include
#include
通过以下命令下载非模板类的Sophus库:
git clone https://github.com/strasdat/Sophus.git
对Sophus进行编译(为了避免不必要的麻烦,最好执行最后一条安装命令):
cd Sophus
git checkout a621ff
mkdir build
cd build
cmake ..
make
sudo make install
编译安装完成后会出现 /usr/local/include/sophus/ 下的各种头文件。同样把Sophus的路径添加进includePath。
可以用一个简单的例子Sophus.cpp验证:
#include
#include
#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未正确链接。所以有两种方式进行编译。
使用以下命令:
g++ Sophus.cpp -l Sophus -o Sophus
这种方式看似简单只有一条命令,但一般不合适多数情况,试想如果有100个so文件需要连接,总不能每次编译都写那么长一串。。。
在要编译的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。
笔者最开始也只是知道有cmake这个方式可以进行编译,平常习惯用g++方式,遇到Sophus库的安装问题也是费了一些功夫,才对cmake稍有点理解,在此以这个简单的例子记录整个安装过程。以后需要编译的文件多了,就慢慢体会到cmake的方便之处。