SLAM环境配置:Ubuntu16.04+Clion+Eigen+Ceres+g2o+Sophus+PCL+OpenCV+测试代码

考虑到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。
  • 安装要点如下:
  1. 首先关闭系统的“快速启动”模式,然后进入BIOS设置BootMode为UEFI模式(重要),接着在Security选项卡下设置SecurityBoot为Disabled;
  2. 制作启动盘软件:UltraISO+压缩200G内存空间用于Ubuntu安装;
  3. 14.04分区&大小:
逻辑分区,512M,起始,Ext4日志文件系统,/boot;
逻辑分区,8192M,起始,交换空间,无挂载点;
逻辑分区,51200M,起始,Ext4日志文件系统,/;
逻辑分区,剩余空间数,起始,Ext4日志文件系统,/home;
  1. 进入Ubuntu14.04,直接升级到16.04,参考:从Ubuntu 14.04 LTS版升级到Ubuntu 16.04 LTS

安装完成后,默认进入的是Ubuntu系统,即采用的是ubuntu引导windows的方式。

ps: 这么做有个弊端,就是如果网速较慢的话,升级过程可能需要持续好几个小时,如果中途一不小心中断了,还要从头再来。

搜狗输入法

搜狗输入法的安装比较简单,参考:Ubuntu 16.04 LTS安装sogou输入法详解

谷歌浏览器、“梯子”

  1. 谷歌浏览器的安装参考:ubuntu16.04安装chrome
  2. “梯子”使用electron-ssr,直接双击安装即可,安装完成后,在桌面右上角会出现小飞机图标,接下来的使用方法同 windows系统:从这里获取免费上网帐号,然后直接“二维码扫描”即可连接服务器;
  3. electron-ssr软件链接:https://pan.baidu.com/s/1_jvXIb3a5b6CMekmQkRHqA ,密码:iuss;
  4. 备注:梯子在使用时,需要切换到全局模式才能有效,PAC模式不行。

卸载不必要的软件

参考:Ubuntu 16.04卸载一些不必要的预装软件

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

  1. 安装
    Eigen的安装过程简单,网上也有很多安装教程,这里参考:ubuntu16.04+eigen3安装
  2. 注意
    Eigen的安装是后续Ceres和g2o安装的基础和前提。Eigen安装完成后,头文件存放在/usr/include/eigen3,且其只有头文件,没有实现的库文件。
  3. 测试代码
    虽然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)
  1. 程序运行结果:

Ceres

  1. 参考:ubuntu16.04安装ceres库,进行依赖项的安装;
  2. 接下来采用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库文件。

  1. 测试代码:

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
  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ORB-SLAM2是一种基于二维图像的实时单目视觉SLAM系统,可以在没有先验地图的情况下,从单个摄像头的输入中实时定位和建立环境模型。为了更好地理解ORB-SLAM2的原理和代码实现,我们需要逐行分析其核心算法。 ORB-SLAM2的主要原理是通过特征提取,特征匹配和位姿估计来实现定位和建图。在代码中,我们可以看到一些关键的数据结构和函数调用,这些都是实现这些原理的关键。 首先,ORB-SLAM2使用FAST特征检测器在图像中检测关键点。这些关键点代表图像中的有趣区域。然后,使用ORB描述符对关键点进行描述。ORB描述符使用二进制位串来表示关键点周围的特征。 然后,ORB-SLAM2使用词袋法(Bag-of-Words)模型来进行特征匹配。它首先通过建立一个词典来表示所有关键点的描述符。然后,使用词袋模型来计算图像之间的相似度,从而找到匹配的关键点。 接下来,ORB-SLAM2使用RANSAC算法来估计两个图像之间的相对位姿。RANSAC算法通过迭代随机采样的方式来筛选出最佳的匹配关系,从而得到相对位姿估计。 最后,ORB-SLAM2使用优化算法(如g2o)来进行位姿图优化,从而更精确地估计相机的位姿。通过优化,ORB-SLAM2能够减少位置漂移,并在动态环境下更好地跟踪相机的位置。 总的来说,ORB-SLAM2通过特征提取、特征匹配和位姿估计实现实时单目视觉SLAM。核心代码实现了特征检测、描述符提取、特征匹配、RANSAC算法和图优化等关键步骤。了解这些原理和代码实现,可以帮助我们更好地理解ORB-SLAM2系统背后的工作原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值