SLAM环境配置
考虑到linux系统可能会出现很多bug,导致需要反复重装系统,所以这里对自己配置SLAM环境的相关细节进行记录,权当做个笔记。
Ubuntu16.04
环境:Win10+Ubuntu16.04双系统
- 安装方法:
先安装14.04再升级成16.04,如果可以,建议还是采取直接安装ubuntu16.04的方式; - 原因
直接安装16.04会遇到问题:[error5]Input/output error,据说是制作启动盘时U盘格式为FAT32,需要格式化为NTFS格式。但是经实际测试,发现即使将U盘格式化为NTFS格式,使用UltraISO制作的启动盘最终仍然为FAT32。 - 安装要点如下:
- 首先关闭系统的“快速启动”模式,然后进入BIOS设置BootMode为UEFI模式(重要),接着在Security选项卡下设置SecurityBoot为Disabled;
- 制作启动盘软件:UltraISO+压缩200G内存空间用于Ubuntu安装;
- 14.04分区&大小:
逻辑分区,512M,起始,Ext4日志文件系统,/boot;
逻辑分区,8192M,起始,交换空间,无挂载点;
逻辑分区,51200M,起始,Ext4日志文件系统,/;
逻辑分区,剩余空间数,起始,Ext4日志文件系统,/home;
- 进入Ubuntu14.04,直接升级到16.04,参考:从Ubuntu 14.04 LTS版升级到Ubuntu 16.04 LTS;
安装完成后,默认进入的是Ubuntu系统,即采用的是ubuntu引导windows的方式。
ps: 这么做有个弊端,就是如果网速较慢的话,升级过程可能需要持续好几个小时,如果中途一不小心中断了,还要从头再来。
搜狗输入法
搜狗输入法的安装比较简单,参考:Ubuntu 16.04 LTS安装sogou输入法详解
谷歌浏览器、“梯子”
- 谷歌浏览器的安装参考:ubuntu16.04安装chrome
- “梯子”使用electron-ssr,直接双击安装即可,安装完成后,在桌面右上角会出现小飞机图标,接下来的使用方法同 windows系统:从这里获取免费上网帐号,然后直接“二维码扫描”即可连接服务器;
- electron-ssr软件链接:https://pan.baidu.com/s/1_jvXIb3a5b6CMekmQkRHqA ,密码:iuss;
- 备注:梯子在使用时,需要切换到全局模式才能有效,PAC模式不行。
卸载不必要的软件
IDE:Clion
参考:Ubuntu16.04安装clion全过程 进行安装,激活码:idea 2019注册码 。这里安装的是2019.1.3版本,激活码亲测可用。如果不能用,可自行搜索;如果未找到CLion激活码,可考虑使用Jetbrain系列其他IDE激活码,应该可以互用。
环境配置
整个环境的配置,除Eigen以外的安装均采用源码编译安装的方式,编译、安装的整体流程套路都差不多。博主这里把除Eigen以外的环境文件全部放到了一个文件夹下,即/home/SLAM_Lib文件夹,编译的结果都存放在新建的build或release文件夹下,其文件目录结构如下所示:
├── SLAM_Lib
└── ceres-solver
└── build # 存放cmake编译结果
└── ...
└── g2o
└── build
└── ...
└── Sophus
└── build
└── ...
└── pcl
└── release
└── ...
└── opencv3.1.0
└── build
└── opencv_contrib-3.1.0
└── ...
Eigen
- 安装
Eigen的安装过程简单,网上也有很多安装教程,这里参考:ubuntu16.04+eigen3安装。 - 注意
Eigen的安装是后续Ceres和g2o安装的基础和前提。Eigen安装完成后,头文件存放在/usr/include/eigen3,且其只有头文件,没有实现的库文件。 - 测试代码
虽然Eigen的安装比较简单,这里还是给出测试代码,以节省测试时间。
main.cpp
#include <iostream>
#include <cmath>
using namespace std;
#include <Eigen/Core>
// Eigen 几何模块
#include <Eigen/Geometry>
/****************************
* 本程序演示了 Eigen 几何模块的使用方法
****************************/
int main ( int argc, char** argv )
{
// Eigen/Geometry 模块提供了各种旋转和平移的表示
// 3D 旋转矩阵直接使用 Matrix3d 或 Matrix3f
Eigen::Matrix3d rotation_matrix = Eigen::Matrix3d::Identity();
// 旋转向量使用 AngleAxis, 它底层不直接是Matrix,但运算可以当作矩阵(因为重载了运算符)
Eigen::AngleAxisd rotation_vector ( M_PI/4, Eigen::Vector3d ( 0,0,1 ) ); //沿 Z 轴旋转 45 度
cout .precision(3);
cout<<"rotation matrix =\n"<<rotation_vector.matrix() <<endl; //用matrix()转换成矩阵
// 也可以直接赋值
rotation_matrix = rotation_vector.toRotationMatrix();
// 用 AngleAxis 可以进行坐标变换
Eigen::Vector3d v ( 1,0,0 );
Eigen::Vector3d v_rotated = rotation_vector * v;
cout<<"(1,0,0) after rotation = "<<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 ); // ZYX顺序,即roll pitch yaw顺序
cout<<"yaw pitch roll = "<<euler_angles.transpose()<<endl;
// 欧氏变换矩阵使用 Eigen::Isometry
Eigen::Isometry3d T=Eigen::Isometry3d::Identity(); // 虽然称为3d,实质上是4*4的矩阵
T.rotate ( rotation_vector ); // 按照rotation_vector进行旋转
T.pretranslate ( Eigen::Vector3d ( 1,3,4 ) ); // 把平移向量设成(1,3,4)
cout << "Transform matrix = \n" << T.matrix() <<endl;
// 用变换矩阵进行坐标变换
Eigen::Vector3d v_transformed = T*v; // 相当于R*v+t
cout<<"v tranformed = "<<v_transformed.transpose()<<endl;
// 对于仿射和射影变换,使用 Eigen::Affine3d 和 Eigen::Projective3d 即可,略
// 四元数
// 可以直接把AngleAxis赋值给四元数,反之亦然
Eigen::Quaterniond q = Eigen::Quaterniond ( rotation_vector );
cout<<"quaternion = \n"<<q.coeffs() <<endl; // 请注意coeffs的顺序是(x,y,z,w),w为实部,前三者为虚部
// 也可以把旋转矩阵赋给它
q = Eigen::Quaterniond ( rotation_matrix );
cout<<"quaternion = \n"<<q.coeffs() <<endl;
// 使用四元数旋转一个向量,使用重载的乘法即可
v_rotated = q*v; // 注意数学上是qvq^{-1}
cout<<"(1,0,0) after rotation = "<<v_rotated.transpose()<<endl;
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(eigen_test)
set(CMAKE_CXX_STANDARD 14)
include_directories("/usr/include/eigen3")
add_executable(eigen_test main.cpp)
- 程序运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/859218db6ac7c4f811c5665ad8d844d2.png)
Ceres
- 参考:ubuntu16.04安装ceres库,进行依赖项的安装;
- 接下来采用git clone的方式下载ceres-solver源码,并新建build文件夹、定位到build文件夹,再进行编译、安装,具体操作如下:
mkdir SLAM_Lib
cd SLAM_Lib
git clone https://github.com/ceres-solver/ceres-solver.git
cd ceres-solver # git clone结果为ceres-solver文件夹
mkdir build
cmake ..
make
sudo make install
ceres安装完成之后,在/usr/local/include/ceres下可找到Ceres头文件,在/usr/local/lib下可找到libceres.a库文件。
- 测试代码:
main.cpp
/*
* 拟合y=ax+b的代码,设置ground truth y=2x+3
*/
#include <iostream>
#include<chrono>
#include<ceres/ceres.h>
#include<stdlib.h>
#include<vector>
#include<math.h>
using namespace std;
struct LineFitCost
{
LineFitCost(double x,double y):_x(x),_y(y){
}//初始化列表
template<typename T> //重载(),函数对象
bool operator()(const T* const ab,T* residual)const
{
//y=ax+b
residual[0