Fast-LiO2中涉及到的算法学习

2024-01-30 06:50
文章标签 算法 涉及 学习 fast lio2

本文主要是介绍Fast-LiO2中涉及到的算法学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

弄懂Fast-lio2需要看的学习资料
感谢知乎Poao的文章,给我学习起到了很大帮助!

总览

雷达惯性里程计论文阅读笔记—FAST-LIO (一)
雷达惯性里程计论文阅读笔记—FAST-LIO2 (二)

卡尔曼滤波

如何通俗并尽可能详细地解释卡尔曼滤波? - 知乎

FAST-LIO的状态估计过程与卡尔曼滤波过程是高度相似的!
卡尔曼滤波实际上是一种优化估计算法不是我们通俗意义上理解的滤波
假设我们拥有一个机器人,如何估算这个机器人在tk时刻的位姿?
我们有两种手段
1、通过机器人上一时刻t(k-1)的位姿来估计当前时刻的位姿
2、通过机器人上携带的传感器来测量当前时刻的位姿
得到的估计值和观测值是相互独立的,并且二者都符合高斯分布(正态分布)
但是如果我们只采用1,假设t(k-1)时刻的位姿不准确,那么这个估计就是错误的;如果只采用2,假设我们的传感器坏掉了, 那么这个估计也是错误的,卡尔曼滤波实际上就是融合了这两个估计,使得该时刻的估计更加准确。
因为二者都是独立的正态分布,所以这里的融合其实就是两个正态分布相乘,得到一个新的正态分布。

KD-Tree

FAST-LIO论文知识补充—KNN&KD-Tree

在Fast-LIO2中采用了一种新的数据结构,iKD-Tree,这种数据结构是来自KD-Tree
为了搞清楚ikdtree是个什么东西,我们首先需要理解KD-Tree。
KD-Tree实际上是一种搜索算法,给定一空间中的一簇点集N,给定一个坐标点p,如何快速找到距离坐标点p最近的点n且n属于N?KD-Tree就是这样的算法。
主要步骤
1、空间划分
通过点集N中所有点的坐标,将整个空间划分成不同的区域,对一个树干下每次只划分两个树枝,划分依据为在同一坐标轴下所有点中中位数的那个点,分成两个区域后,再对每个区域下进行同样的划分。
2、找到最近邻点
首先根据点p的坐标,沿着根节点开始寻找,循着树枝依次找到最后,最后的点成为s。
3、回溯
因为只通过2找到的最近邻点不一定是真正的最近邻,需要回溯寻找,回溯的方式是“画圆”,然后看看有没有其他的划分线和这个圆相交,如果有的话,看看有没有点在圆内,如果有,这说明s不是距离p最近的在N上的点,假设在园内这个点为k,重复这个过程;否则这说明找到的点s就是点集N上距离p最近的点。

流形

流形-Manifold(1)
浅谈流形学习
对流形(Manifold)的最简单快速的理解

在loam系列的的论文中,毫无例外都提到了流形这一概念,所以必须要学习流形。
1、流形是什么?
流形取自文天祥取的“天地有正气,杂然赋流形”,英文Many Flods,意为许多褶皱。
首先我们要明确,流形是一个空间,不是形状,地球其实就可以看做是一个嵌入在三维空间中的二维流形。
2、流形的作用是什么?
(1)流形其实为了避免冗余的表示出现的。
比如地球是一个三维空间,我们为了表示三维空间中的一个点,会用直角坐标系或者球坐标系,但是对于地球上的某个地点,实际有用的坐标信息其实只有经度和纬度,比如我们要表示北京,只需要(东经116°20′;北纬39°56′)就可以在地球这个三维空间中定位北京的位置,但是如果采用直角坐标系,那么我们就需要(x,y,z)三个参量来确定北京的位置,可是我们采用经纬度只需要两个参量就可以确定北京的位置,经纬度其实就是一种流形的表示方法。
比较直观的一个例子就是球坐标系:
球坐标系
如上所示的球坐标系,针对地球的点,地球的半径是固定的r = r0,由此可以看到x,y,z三个参数就会完全被两个角度参数确定,从这里也可以直观地得到,地球球面上的点是一个二维流形在三维空间的嵌入。
(2)流形可以应用于机器学习中
流形有两种用法

  • 将原来在欧氏空间中适用的算法加以改造,使得它工作在流形上,直接或间接地对流形的结构和性质加以利用
  • 直接分析流形的结构,并试图将其映射到一个欧氏空间中,再在得到的结果上运用以前适用于欧氏空间的算法来进行学习
  • losmap的应用

雅克比矩阵J

对雅可比矩阵的理解
首先膜拜写这篇文章的巨佬,写文章时作者竟然才高二,吾等是在是自愧不如~

该篇文章中:

  • 不能再用一个常数矩阵来描述了

是指的从空间a到空间b的线性变换 f(·) 可以用一个常数矩阵来描述,但是如果这个变换是一个非线性变换 g(·),那么这个变换不能用常数矩阵来描述

  • 每一个不同向量都有自己的矩阵变换,

其实意思就是在如果是线性变换的话,对任意一个向量a,在经过f(·)的变换后,映射到另外一个空间的向量b,这个映射可用一个常数矩阵来表示,但是如果是非线性映射g(·),每个向量对应的常数矩阵就是不一样的了,也就是每个不同向量都有自己的矩阵变换。

  • 因为是“附近”,所以这个向量在邻域内张成的空间可以看作是线性变换的,所以可以用一个特定的矩阵来描述。

类似是求导那里,非线性函数在很短的一段deltax中是线性的,非线性线性化了

n是向量m经过线性变换之后得到向量,如果说我们在空间中的向量是
在这里插入图片描述
那么经过变换之后,得到的向量应该是n撇,又因为在m很小的邻域内进行的这个变换是一个线性变换,那么必然存在一个矩阵J使得
式1
推导J的过程如下
在这里插入图片描述

李群与李代数

李群与李代数这一部分在高博的视觉slam十四讲里面讲解的很清楚,建议直接阅读高波的书,这里贴一个视觉slam十四讲李群李代数部分的知乎的分享笔记。
视觉SLAM-从零爬起打破秃头魔咒——(三)李群与李代数

先验分布、后验分布与似然函数

先验分布、后验分布、似然估计这几个概念是什么意思,它们之间的关系是什么?
如何理解似然函数?

1、先验分布
先验分布是指未知结果,根据经验直接确定原因的概率分布。
2、后验分布
后验分布是指已知结果,根据结果确定原因的概率分布
3、似然函数
似然函数与后验分布很像,都是已知结果,求解原因的概率分布,不同的在于似然函数认为原因是事件的一个固有属性,而后验认为原因只是一个概率。

这篇关于Fast-LiO2中涉及到的算法学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/659412

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时