十一.激光惯导LIO-SLAM框架学习之LIO-SAM框架---框架介绍和运行演示

 专栏系列文章如下:

一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN博客

二.激光SLAM框架学习之A-LOAM框架---介绍及其演示_goldqiu的博客-CSDN博客

三.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---1.项目文件介绍(除主要源码部分)_goldqiu的博客-CSDN博客

四.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---2.scanRegistration.cpp--前端雷达处理和特征提取_goldqiu的博客-CSDN博客

五.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---3.laserOdometry.cpp--前端雷达里程计和位姿粗估计_goldqiu的博客-CSDN博客

六.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---4.laserMapping.cpp--后端建图和帧位姿精估计(优化)_goldqiu的博客-CSDN博客

七.激光SLAM框架学习之A-LOAM框架---速腾Robosense-16线雷达室内建图_goldqiu的博客-CSDN博客

八.激光SLAM框架学习之LeGO-LOAM框架---框架介绍和运行演示_goldqiu的博客-CSDN博客

九.激光SLAM框架学习之LeGO-LOAM框架---速腾Robosense-16线雷达室外建图和其他框架对比、录包和保存数据_goldqiu的博客-CSDN博客

十.激光SLAM框架学习之LeGO-LOAM框架---算法原理和改进、项目工程代码_goldqiu的博客-CSDN博客

一. 框架介绍

LIO-SAM是Tixiao Shan在2020的IROS会议提出的⼀种激光惯导紧耦合的SLAM框架,可在室内和室外实现效果不错的建图。

这是作者附在Github上面的框架图:

特点:

1. 一共使用了三个传感器,GPS可选;

2. Odometry 以IMU的frequency(要收到雷达里程计信息后才发出),这样前端频率更高;

3. IMU odometry提供初始估计值并做了预积分处理,同时IMU原始数据进行雷达进行运动补偿;

4. 后端因子图优化包括四个因子,IMU预积分结合雷达里程计的帧间约束因子在预积分节点维护,其他三个在后端节点维护,分别是GPS因子、雷达里程计因子和回环检测因子。

5. 紧耦合:IMU的零偏可以被估计,利用雷达里程计的帧间约束进行反馈,使IMU解算更加准确,提供更好的初值。

二. LIO-SAM运行演示

1. 首先要安装 ROS

Ubuntu 64-bit 16.04 or 18.04. ROS Kinetic or Melodic

2. 安装ROS依赖

sudo apt-get install -y ros-kinetic-navigation

sudo apt-get install -y ros-kinetic-robot-localization

sudo apt-get install -y ros-kinetic-robot-state-publisher

3.安装gtsam

wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.0-alpha2.zip

cd ~/Downloads/ && unzip gtsam.zip -d ~/Downloads/

cd ~/Downloads/gtsam-4.0.0-alpha2/

mkdir build && cd build

cmake ..

sudo make install

4.下载编译LIO-SAM

cd ~/catkin_ws/src
git clone https://github.com/TixiaoShan/LIO-SAM.git
cd ..
catkin_make

4. 播放 bag 包运行(github上有数据集下载)

roslaunch lio_sam run.launch
rosbag play your-bag.bag 

这里有些数据集需要更改yaml文件,具体请看github。

效果如下:

5.报错解决

error: static assertion failed: Error: GTSAM was built against a different version of Eigen
static_assert

GTSAM默认编译并没有使用系统eigen

在CMakeLists.txt文件中if(GTSAM_USE_SYSTEM_EIGEN)判断的前边添加如下代码:

set(GTSAM_USE_SYSTEM_EIGEN ON)

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于在激光SLAM框架LIO-SAM中加入地平面约束,构造地平面因子,用C++代码实现的问题,我可以为您提供一些思路。 首先,需要明确的是,在LIO-SAM中加入地平面约束的主要目的是为了提高定位和建图的精度。地平面信息可以帮助我们更好地估计机器人的高度,并且可以过滤掉一些误差比较大的点云数据,从而提高建图的质量。 其次,在LIO-SAM中构造地平面因子的过程可以分为以下几个步骤: 1. 首先需要对点云数据进行初步的处理,将点云数据转换到机器人坐标系下,并对点云进行滤波和分割,得到地面和非地面点云数据。 2. 接着,需要对地面点云数据进行平面拟合,得到地面的法向量和距离参数。 3. 然后,可以根据地面的法向量和距离参数,构造地平面因子。具体而言,可以采用高斯-牛顿法或者LM算法等优化方法,将地面因子加入到目标函数中,从而实现地平面约束。 最后,关于用C++代码实现地平面因子的构造,可以参考以下的代码: ``` // 定义地平面因子 class GroundFactor: public ceres::SizedCostFunction<1, 6> { public: GroundFactor(const Eigen::Vector3d& n, const double d) : n_(n), d_(d) {} virtual ~GroundFactor() {} virtual bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const { const double* p = parameters[0]; Eigen::Map<const Eigen::Vector3d> T(p); residuals[0] = n_.dot(T) + d_; if (jacobians != NULL && jacobians[0] != NULL) { Eigen::Map<Eigen::Matrix<double, 1, 6, Eigen::RowMajor>> jacobian(jacobians[0]); jacobian.setZero(); jacobian.block<1, 3>(0, 0) = n_.transpose(); } return true; } static ceres::CostFunction* Create(const Eigen::Vector3d& n, const double d) { return (new ceres::AutoDiffCostFunction<GroundFactor, 1, 6>(new GroundFactor(n, d))); } private: Eigen::Vector3d n_; double d_; }; ``` 以上就是关于在激光SLAM框架LIO-SAM中加入地平面约束,构造地平面因子,用C++代码实现的一些思路和代码实现。希望对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值