15-[LVI-SAM]分析总结

2023-05-16

2021SC@SDUSC

LVI-SAM分析总结

​ 这是我的LVI-SAM代码分析的最后一篇。在这一篇,我会做一个总结,对我前面的Blog做一个综述,分享在分析的过程中,我的收获。

文章目录

  • LVI-SAM分析总结
    • 1. 综述
    • 2. imageProjection
    • 3. visual_feature
    • 4. visual_odometry
    • 5. 节点交互
      • a. imageProjection
      • b. visual_feature
      • c. visual_odometry
    • 6. 收获

1. 综述

​ 在LVI-SAM的代码分析中,我负责分析lidar模块的imageProjection节点和视觉模块的visual_feature节点。后来,我又帮助小组的另外一个同学,分析visual_odometry节点。

​ 而对于我们整个小组来说,我们已经把lidar模块的所有部分完成。但可惜的是,视觉模块并没有分析所有完所有的节点,因此还没有办法把这2个模块串起来做个总结。

​ 下面,我将分别总结一下对每个节点的分析,然后,再把我的节点和其他队友分析的部分串联起来总结。最后,我会再讲述一下我的收获。

2. imageProjection

​ 该节点主要用于订阅IMU、里程计、原始lidar三个话题的信息,然后进行信息整合,筛选出有效的lidar点云,并转化成世界坐标系中,并把这个转化好的基于世界坐标系的lidar点云图发布出去。而在这里,需要分析代码,需要学会一点额外的运动学方面的知识。比如:什么是TF变换,位姿是怎么表示的,什么是仿射变换等等。而只有先弄明白这些,才能理解代码的思想。

3. visual_feature

​ 节点订阅imageProjection节点的发布的基于世界坐标系下的lidar点云图话题,获得世界坐标系下的lidar点云图,从中找到特征点,通过光流追踪算法,一直跟踪这些特征点。并结合获取到的lidar点云图,获得深度信息,重新封装并发布。同时,这里还会发布一个是否重启视觉部分的信号。

​ 而这里,虽然是视觉部分,但也用到了lidar模块的信息,需要从lidar点云图话题,去获取图像某个特征点的深度信息。而这个获取深度信息,也需要用到很多运动学的知识。比如说,怎么归一化2d特征到单位球体上。因为这个比较简单,我就没有单独去介绍,因为很多计算,都需要用到归一化。后面,还提到了k-d树,而这个,我也刚好接触过,也实现过,因此,分析起来比较舒服。

​ 但后面涉及到了图形学的东西——光流追踪算法。而理解这个算法,又需要知道什么是光流,总之这样一层层的深入,便慢慢的理解了这个节点的内容。

4. visual_odometry

​ 这个节点是我比较陌生的。因为我分析这个节点,也只分析了2周的时间,对于其中细节的实现,没有那么深究。这个节点需要订阅前面需要的visual_feature发布的带有深度信息的lidar点云图,然后还会需要订阅重启信息以及原始IMU信息,以及经过IMU预积分得到的里程计信息。最后会利用视觉特征点的信息初始化,再利用IMU,得到更精确的里程计信息。

​ 这个节点一共有3个回调函数,一个主线程。3个回调函数存储接受到的数据,主线程负责核心的计算处理,以及信息的发布。而这个主线程就用到了我们前面分析的visual_feature节点的输出——带有深度信息lidar点云图。然后,用这些信息,可以得到更精确的里程计信息。而如何计算出来的,我在之前的blog中也有分析,但很可惜,我没办法去进一步探究其中的原理,比如所IMU预积分,什么是IMU的参数PQV。

5. 节点交互

​ 下面是我的代码分析部分,和队友的节点代码分析的结合。

a. imageProjection

​ 在上面我们已经提到,这个节点订阅IMU信息,里程计信息,和原始lidar三个话题的信息。而其中,IMU信息和原始lidar信息都是直接从传感器获得的原始数据。而里程计信息则是通过visual_odometry节点获得。而visual_odometry又订阅了visual_feature的话题,而visual_feature又订阅了imageProjection的话题,而这就形成了一个环(见下图)。

​ 而这其实只是假象。因为,imageProjection并不是直接使用获得的里程计信息,而是根据时间,计算出需要的里程计信息,而计算所需要的,可能是上一个时间帧的里程计信息,因此,这个环有助于精度的提升。因为,每个时刻都会融合传感器的信息和之前的里程计信息进行计算。至于初始化,则是如果没有相关的信息,那就不用,虽然效果会差一点。

15-1

15-2

b. visual_feature

​ 这个节点只需要输入原始图像信息和imageProjection发布的基于世界坐标系的点云图。因此,和其他同学没有什么消息上的交互。至于为什么上面的图片中会发现有那么多的消息给这个节点,我也觉得很神奇,因为代码上,只订阅了2个话题。但经过研究发现,这其实是这个节点在get_depth()函数获取深度的时候,构造了一个TransformListener监听器。订阅TF话题,而很多节点又在TF上发布了信息,因此在这个图上面显示有很多TF信息传给了这个节点。

15-3

c. visual_odometry

​ 这个节点的输入除了TF信息之外,还有2个重要的信息。一个是上面提到的visual_feature节点。用来获取带有深度信息的lidar点云图。而且也会接受一个是否重启的信息,用来判断是否需要重启。除此之外,还需要订阅imuPreintegration节点的IMU话题的消息。通过阅读另外一个队友的blog,我了解到,这个节点也做了预积分处理,通过订阅原始IMU数据,用因子图优化,施加两帧之间的imu预积分量,预测每一个时刻的IMU信息。因此,通过这个消息,可以得到任意时刻的IMU的估算,从而配合计算出更加精确的里程计数据。

15-4

6. 收获

​ LVI-SAM的代码分析完,一个最直观的感受,就是明白一个复杂的工程是怎么组织起来的,至少,明白在ROS环境下,是如何组织一个项目。对于ROS来说,项目其实就是一个个节点组织而成。每个节点通过话题和消息进行交互。

​ 在完成一个项目的时候,最重要的其实不是项目的实现,而是项目的设计。在LVI-SAM中,我们可以看到,每个节点的功能十分的清晰,而且节点之间的信息交互已经在论文阶段就定义了。而且,在项目中,重要的并不是代码,而是在代码中的思想,因此,如果想要完成一个高质量的项目,首先,就要做好设计。

​ 除了有这么一个总的认识,在此期间,我还学会了很多额外的知识,特别是运动学方面的知识。从表示物体的位姿,以及不同坐标系之间的TF转换关系,到光流追踪算法等知识,都是在学习LVI-SAM中收获到的。而这,我觉得也是一个学习新知识的一个途径,可以通过想要学习的方向上的一个项目,了解到要学习这个方向需要哪些知识点,从而大致了解要学习这个方向的知识基础。通过学习LVI-SAM,我深刻地认识到,数学等理论知识是非常重要的,代码只是这些知识实现的载体!

​ 除了知识上的收获,还有技能性的收获。学会了如何去查找信息。比如说,要明白一些库函数的功能,可以从一些开源库的官方的Class Reference File去寻找函数的定义和实现,这样有助于理解函数的功能。而如果想要理解一个ROS的项目,则可以从节点的main函数开始分析,然后再从节点的回调函数入手,这样可以把握住节点的主要思想和功能。此外,还有一些C++的编写体会,如模板函数,函数传参,宏等等。

​ 最后,通过本次代码分析,我熟悉了在Linux下的项目构建流程,为之后用Linux开发项目打下了基础。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

15-[LVI-SAM]分析总结 的相关文章

  • (七)贪心法

    贪心法比较简单 xff0c 从这个算法的名字看来差不多都了解了 xff0c 贪心 xff0c 贪心的人是只顾一时的利益 xff0c 不顾长远的利益 贪心法把一个问复杂问题分解为一系列较为简单的局部最优选择 xff0c 每一步选择都是对当前的
  • Struts旅程(一)Struts简介和原理

    struts 简介 Struts 是 Apache 软件基金会 xff08 ASF xff09 赞助的一个开源项目 它最初是 jakarta 项目中的一 个子项目 xff0c 并在 2004 年 3 月成为 ASF 的顶级项目 它通过采用
  • Struts旅程(六)Struts页面转发控制ActionForward和ActionMapping

    上篇讲述了 struts 控制器 Action 和 DispatchAction 以及 LookupDispatchAction xff0c 本篇主要说说 struts 中的页面转发控制 xff0c struts 提供了 ActionFor
  • Hibernate旅程(四)Hibernate对数据库删除、查找、更新操作

    上篇 xff0c 我们以向数据库添加操作来演示 hibernate 持久化对象的三种状态 本节继续 hibernate 对数据库的其他操作 xff0c 删除 查询 修改 Hibernate 对数据删除操作 删除 User 表中个一条数据 x
  • 二分查找算法(递归与非递归两种方式)

    首先说说二分查找法 二分查找法是对一组有序的数字中进行查找 xff0c 传递相应的数据 xff0c 进行比较查找到与原数据相同的数据 xff0c 查找到了返回对应的数组下标 xff0c 没有找到返回 1 xff1b 如下示例 xff0c 其
  • 调用微信高级群发接口--视频群发接口出问题(微信官方文档错误纠正)

    这几天在弄项目与微信对接 xff0c 我主要负责将素材 xff08 视频 xff0c 图片 xff0c 缩略图 xff0c 音频 xff09 材料上传到微信服务器上 xff0c 并推送到所关注本平台的用户中 xff0c 从获取accessT
  • (七)Intellij 中的git操作

    git原理以后会分章节介绍 xff0c 本次主要说一下intellij怎样操作git intellij有很好的git操作界面 xff0c 可以拉取代码 xff0c 拉取分支详情 xff0c 提交代码到本地仓库 xff0c 提交代码到远程仓库
  • git 远程代码回滚master

    人总是会有犯错的时候 xff0c 所以我们的代码有时候就需要回滚 当我们要回滚的代码还没有提交到远程的时候 xff0c 可以进行本地回滚 xff0c 较为简单 一 本地回滚 git reset 回退内容到上一个版本 就像现在的自己为成年人
  • 如何搞定技术面试?阿里大牛为你选了8本必备好书

    当工作 生活的节奏越来越快 xff0c 阅读充电似乎也成为了一件奢侈的事 四月既是最美人间天 xff0c 也是阿里春招面试季 为此 xff0c 阿里妹特别策划了 阿里技 书 成长月 xff0c 多位技术大牛为你精挑细选荐好书 xff0c 相
  • (2)mysql--查询部门人数最多的部门

    简述 xff1a 找出部门人数大于或等于10个人的部门 要点 在上一篇的基础上 xff0c 考察having的使用 上篇链接 xff1a http blog csdn net lovesummerforever article detail
  • ll -bash: ls: command not found

    问题简单描述 xff1a centos6安装软件的时候 不知道执行了啥操作 ll ls 命令都不好用了 问题所在 在centos6系统上安装jdk 配置 etc profile 只配置了jdk的环境变量 忘记加入系统的变量 1 网上查了查是
  • (3)mysql index

    生活中的索引 最常见的书籍是有目录的 xff0c 也可以叫做为索引 为啥用索引 xff1f 为快不破 xff0c 为了快速的查找到我们想要的东西 xff0c 书中的索引可以快速查询到我们想看的章节内容 DB中的索引亦是如此 索引本质 本质就
  • 博客乔迁

    开通了个人博客网站 欢迎访问 http www codingfuns com 博客地址http www codingfuns com 刚开通多有不足之处 请留言哈 非常感谢 最近更新的一些文章 xff1a 文章题目文章链接地址更新日期com
  • 好书好人生--读书的步骤

    写在开始 xff1a 作为一名IT人士 xff0c 我们要经常接触新的技术 xff0c 也要多读一些技术的书和生活的书 xff0c 怎样读书最重要 xff0c 读书并不是读得多就好 xff0c 读书就像吃牛肉一样 xff0c 我们要吃了吸收
  • 目标跟踪 | 目标跟踪算法总结

    简介 本文为目标跟踪算法调研总结 注意 xff1a 可做分享 xff0c 切勿在投稿论文中大段摘用 xff08 重复率会很高 xff09 1 定义 目标跟踪是通过分析视频图片序列 xff0c 对检测出的各个候选目标区域实施匹配 xff0c
  • Python | python调用D435i报错:Failed to resolve the request 及其解决办法

    文章目录 简介报错解决办法 简介 英特尔实感深度摄像机D435i可以同时输出深度图像和RGB图像 官网上下载了一个D435i的测试文件 xff0c 编程语言为 xff1a python3 7 输出结果应该为同时显示深度图和RGB图的窗口 但
  • Java——死锁产生的条件及死锁判断排查

    文章目录 死锁产生的必要条件死锁排查 死锁产生的必要条件 要达到死锁 xff0c 必须具备以下4个条件 xff1a 互斥 至少有一个被持有的资源处于非共享模式 xff0c 如果有其他进程 线程请求这个资源 xff0c 那这个进程 线程必须等
  • 年终工作总结:给新手程序员的几个建议

    转自 xff1a 伯乐在线 马上到年末了 xff0c 自己也对今年做了一下总结 xff0c 自己有哪些优点 xff0c 有哪些还需要加强 每当我想到今年比较满意的地方 xff0c 对比之前 xff0c 就会有这样一个思考 xff1a 如果以
  • Linux下实现飞控开发:使用CMake构建STM32工程

    前言 QQ xff1a 562983648 由于工作原因 xff0c 已经许久没有接触飞控了 18年的时候曾经写过一个半成品开源飞控 xff0c 是基于Keil MDK这款商业IDE开发的 xff0c 只能在Windows下运行 由于笔者现
  • 嘘!偷偷看下阿里技术大牛的私人书单

    也许我们无法走遍地球的每一个角落 xff0c 却可以用阅读丈量整个世界 停止阅读就等于停止给大脑供给养分 信息爆炸时代 xff0c 养分 的质量决定了个人的成长速度 4 23世界读书日 阿里技 书 成长月 第二期 xff0c 我们 偷出 了

随机推荐

  • 工程师的精神家园

    文学家和艺术大师们总是在追求着自己的一片精神家园 xff0c 与工程师相比 xff0c 他们的姿态高傲而脱俗 真正朴实无华的 xff0c 大概是王小波描述的 xff0c 童年时代那个被锁着的书柜 xff0c 那个藏着奥维德的变形记 xff0
  • Github访问加速方法记录

    由于各种各样的原因 xff0c 在国内访问Github的速度非常慢 一般clone的速度只有几十k s的速度 xff0c 稍微大一点的工程基本无法clone xff0c 于是需要使用各种方式来加速访问Github的速度 使用代理 使用代理的
  • 姿态篇:四.非线性最小二乘与飞控传感器校准

    深入浅出多旋翼飞控开发 姿态篇 四 非线性最小二乘与飞控传感器校准 Github 作者 xff1a Sky 前言 搞好了传感器 xff0c 那意味着飞控已经完成了一半 不用猜了 xff0c 这句话正是鄙人说的 飞控的软硬件相关工作 xff0
  • 概述篇:二.多旋翼飞控技术综述

    深入浅出多旋翼飞控开发 概述篇 二 多旋翼飞控技术综述 Github 作者 xff1a Sky 要学习多旋翼飞控 xff0c 第一步得先弄清楚飞控的整体框架和大致工作流程 xff0c 对飞控有了一个整体的认识之后 xff0c 我们再逐步去学
  • 【深入浅出多旋翼飞控开发】系列教程

    针对飞控初学者编写的一系列教程 xff0c 可配合开源飞控项目 xff1a 天穹飞控一起学习 xff0c 效率更高 目录 概述篇 一 多旋翼飞控发展史 二 多旋翼飞控技术综述 预备篇 一 元器件选型及飞控电路设计 二 飞控代码下载与编译 三
  • Cortex-M4和Cortex-M7中的SIMD指令

    SIMD指令简介 单指令多数据流 xff0c 即SIMD xff08 Single Instruction xff0c Multiple Data xff09 指一类能够在单个指令周期内同时处理多个数据元素的指令集 xff0c 利用的是数据
  • 天穹地面站——专为飞控研发而生

    一 简介 天穹地面站是本人为开源飞控项目 天穹飞控专门开发的一个上位机软件 xff0c 针对飞控的研发与调试而设计 一直以来 xff0c 我都为没有一个适合飞控开发的上位机软件而发愁 xff0c 国内大部分爱好者们所使用的相关软件 xff0
  • 预备篇:二.飞控代码下载与编译

    深入浅出多旋翼飞控开发 预备篇 二 飞控代码下载与编译 开源飞控交流 xff1a 562983648 Github 因论坛关闭 xff0c 迁移该文章至博客 系统环境 xff1a WIN7 WIN8 WIN10 编译工具 xff1a Kei
  • 预备篇:一.元器件选型及飞控电路设计

    深入浅出多旋翼飞控开发 预备篇 一 元器件选型及飞控电路设计 Github 要让飞控程序跑起来 xff0c 首先我们得要有一个硬件实体 xff0c 也就是我们的飞控板 说实话 xff0c 飞控电路可以很简单 xff0c 单纯由几个简单的元器
  • 使用VSCode打造APM飞控的编译+烧录+调试一体的终极开发环境

    日期 xff1a 2019 05 08 前言 APM xff08 Ardupilot xff09 和PX4是当今世界上最为流行和活跃的两大开源飞控软件项目 xff0c 它们均在Linux下基于gcc编译工具链开发 xff0c 对于那些习惯与
  • “做好大数据测试,我是认真的!”

    阿里妹导读 xff1a 大数据已然是当下的重要课题 xff0c 大大小小的企业在重视大数据的同时 xff0c 也渐渐重视大数据质量的问题 阿里巴巴测试开发专家小郅 xff0c 今天会分享他对数据测试的系统性思考 文章内容架构清晰 xff0c
  • Docker(一)虚拟机安装Docker

    一 安装Docker 官方镜像 Docker现在的版本分为Docker CE 社区版 和Docker EE 企业版 由于历史版本的原因 在我们安装现在版本Docker的时候 如果之前的Linux已经安装了Docker 那么最好先删除了之后再
  • linux Ubuntu 连不上新Putty 连接出错解决办法

    1 首先检验linux系统是否安装了ssh server 在终端中输入 xff1a ssh localhost 若出现 xff1a ssh connect to host localhost port 22 Connection refus
  • git子仓库管理使用(添加子仓库,删除子仓库,更新子仓库)

    背景 项目中经常使用别人维护的模块 xff0c 在git中使用子模块的功能能够大大提高开发效率 使用子模块后 xff0c 不必负责子模块的维护 xff0c 只需要在必要的时候同步更新子模块即可 例如一个使用了子仓库的代码库 xff0c 如何
  • 串口发送数据,只接收到00的原因之一

    1 环境 xff1a STM32F103RCT6 KEIL 5 2 现象 xff1a 不管我发送任何类型的数据 xff0c 在串口助手上显示接收到的都是00 xff0c 我头很大 xff0c 去网上找了别人的代码对比检查 终于 xff0c
  • Eclipse常用技巧总结

    关于eclipse的使用方面 xff0c 其实有些东西都是小技巧的东西 xff0c 知道了后 xff0c 对编程会带来很大的方便 一 老是使用鼠标操作 xff0c 有的功能要点好多次鼠标 xff0c eclipse都有哪些热键呢 xff1f
  • 新学期flag-适合每个人的专业课

    在果壳上看了各学科入门书籍推荐这个帖子 xff0c 决定自己好好扩展一下自己的眼界 xff0c 开启一个伟大的阅读计划 xff1a 1 师从天才 作者 美 罗伯特 卡尼格尔 出版社 上海科技教育出版社 评语 sunfield推荐 xff08
  • Android指纹识别,看这一篇就够了

    在Android6 0 xff08 Api23 xff09 的时候 xff0c Android系统加入了指纹识别的api接口 xff0c 即FingerprintManager xff0c 定义了最基础的指纹识别接口 不过 xff0c 在A
  • 集成学习——机器学习(周志华)

    集成学习 目录 xff1a 个体和集成BoostingBagging与随机森林 Bagging随机森林 综合策略 平均法投票法学习法 多样性 误差 分歧分解多样性度量多样性增强 内容 xff1a 个体和集成 集成学习是通过构建并结合多个学习
  • 15-[LVI-SAM]分析总结

    2021SC 64 SDUSC LVI SAM分析总结 这是我的LVI SAM代码分析的最后一篇 在这一篇 xff0c 我会做一个总结 xff0c 对我前面的Blog做一个综述 xff0c 分享在分析的过程中 xff0c 我的收获 文章目录