fast-vgicp代码阅读


  论文阅读参考:https://zhuanlan.zhihu.com/p/135454523
  fast-vgicp代码中以pcl::Registration为基类,写了自己GICP和VGICP方法。自己只对少数关键函数进行了重构。首先简述gicp和vgicp代码的逻辑,然后按照继承顺序逐层梳理代码原理。

GICP代码解析

  重载了pcl::Registration类中的虚函数computeTransformation。
  使用lm算法迭代优化位姿变换,在标准lm流程中重载了协方差的计算,以及匹配误差的计算。代码的核心函数分布在pcl::Registration->fast_gicp::LsqRegistration->fast_gicp::FastGICP三层继承关系中,分别是:

  • pcl::Registration::align
  • fast_gicp::LsqRegistration::computeTransformation
  • fast_gicp::LsqRegistration::step_lm
  • fast_gicp::LsqRegistration::is_converged
  • fast_gicp::FastGICP::calculate_covariances
  • fast_gicp::FastGICP::linearize
  • fast_gicp::FastGICP::update_correspondences
  • fast_gicp::FastGICP::compute_error

  从上往下依次介绍函数的功能和调用关系。

pcl::Registration::align和fast_gicp::LsqRegistration::computeTransformation

  pcl::Registration::align对点云进行一系列的初始化操作,同时调用computeTransformation函数估计位姿。
  fast_gicp::LsqRegistration::computeTransformation迭代调用LM优化器 fast_gicp::LsqRegistration::step_lm直至收敛或者达到迭代次数上限。

fast_gicp::LsqRegistration::step_lm和fast_gicp::LsqRegistration::is_converged

  LM流程如下图(来自METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS)所示,区别在于 A A A g g g F ( X ) F(X) F(X)的计算。
在这里插入图片描述

  收敛条件分为平移和旋转两个部分,平移向量绝对值的最大元素小于阈值同时旋转矩阵和单位矩阵差绝对值的最大元素也需要小于阈值。

fast_gicp::FastGICP::calculate_covariances

  在computeTransformation中被调用计算协方差,基于kd-tree使用20个最近邻点计算协方差,由于采用平面对局部点云进行近似,将协方差SVD分解之后,将特征值改为 [ 1 , 1 , ϵ ] [1,1,\epsilon] [1,1,ϵ]

fast_gicp::FastGICP::linearize

  在step_lm中被调用计算 A A A g g g

fast_gicp::FastGICP::update_correspondences

   在linearize中被调用构建配对关系计算信息矩阵。基于kd-tree在原点云和目标点云之间构建配对关系,根据点对的协方差矩阵计算匹配本身的协方差的逆 Ω i = ( C i B + T C i A T T ) − 1 \Omega_i=(C_i^B+TC_i^AT^T)^{-1} Ωi=(CiB+TCiATT)1

fast_gicp::FastGICP::compute_error

  在step_lm中被调用计算 F ( x ) F(x) F(x)。对于每一个匹配点对,计算误差 e i = b i − T a i e_i=b_i-Ta_i ei=biTai以及协方差修正之后的目标函数 E = ∑ e i T ∗ Ω i ∗ e i E=\sum e_i^T*\Omega_i*e_i E=eiTΩiei

VGICP代码解析

  VGICP是一种voxel-based distribution-to-multi-distribution算法,实现上继承自fast_gicp::FastGICP。大体框架和上一节的GICP类似,但是采用了基于Voxel的方法而不是基于KD-tree的方法来估计协方差,也因此在海森矩阵计算等方法存在差异。首先介绍Voxel相关操作,然后阐述VGICP算法和GICP算法在update_correspondences,linearize,compute_error三个函数中的不同。

GaussianVoxelMap类和相关函数

  在设定的分辨率下,根据点云计算Voxel的参数。

create_voxelmap

  将点云分配到Voexl中,对每个存在点云的Voxel计算点云分布的均值和协方差。

voxel_coord 和lookup_voxel

  根据点云坐标计算对应Voxel和判断Voxel是否存在。

neighbor_offsets

  设置Voxel的邻域搜索方式,也就是当前帧的一个点需要和前一帧的哪几个Voxel进行匹配,预设了三种模式DIRECT1,DIRECT7,DIRECT27 。DIRECT1为坐标对应Voxel,DIRECT7为对应Voxel和x,y,z方向的相邻Voxel,DIRECT27为以对应Voxel为中心的333的Voxel。

FastVGICP::update_correspondences

   在linearize中被调用构建配对关系计算信息矩阵。基于Voxel构建distribution-to-multi-distribution的配对关系,根据Voxel的协方差矩阵计算匹配本身的协方差的逆 Ω i = ( C i B + T C i A T T ) − 1 \Omega_i=(C_i^B+TC_i^AT^T)^{-1} Ωi=(CiB+TCiATT)1

FastVGICP::linearize和FastVGICP::compute_error

  两个函数功能和GICP版本完全相同。和GICP的区别在于协方差的表示形式,和激光点对每个邻域Voxel都构成误差项,每对box的误差项由Voxel内点数量进行加权。

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
fast-lio-localization 是一个基于激光雷达的定位算法,它的核心思想是将激光雷达数据转化为一些特征,并根据这些特征进行定位。下面是 fast-lio-localization 的代码详解: 1. 读取激光雷达数据 首先,在 main 函数我们需要读取激光雷达数据。fast-lio-localization 支持多种不同类型的激光雷达,包括 Velodyne HDL-32E、Velodyne VLP-16、Hokuyo UTM-30LX 和 Sick LMS200。 2. 预处理激光雷达数据 预处理激光雷达数据是 fast-lio-localization 的一个重要步骤。在这个步骤,我们需要将激光雷达数据转化为一些特征。这些特征包括: - 点云:将激光雷达数据转化为点云,便于后续处理。 - 点云滤波:对点云进行滤波,去除一些噪声点。 - 特征提取:从点云提取一些特征,如角点和平面点。 3. 初始化粒子滤波器 fast-lio-localization 使用粒子滤波器来进行定位。在初始化粒子滤波器时,我们需要设置一些参数,如粒子数量、初始位置和方向等。 4. 运行粒子滤波器 在运行粒子滤波器时,我们需要执行以下步骤: - 根据当前机器人的运动模型,对粒子进行预测。 - 使用激光雷达数据和地图,计算每个粒子的权重。 - 根据粒子的权重,重新采样粒子。 5. 输出定位结果 在粒子滤波器运行完毕后,我们可以得到一些最终的粒子。通过对这些粒子的统计分析,我们可以得到机器人的位置和方向,并输出定位结果。 以上就是 fast-lio-localization 的代码详解。需要注意的是,fast-lio-localization 是一个比较复杂的算法,需要对激光雷达数据和粒子滤波器等知识有一定的了解才能深入理解它的实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值