ROS-3DSLAM(十六)lvi-sam项目总结

2023-05-16

2021SC@SDUSC

学习内容概览

本次的项目lvi-sam主要分为两个大的模块:lidar模块和visual模块。我们小组学习先进行了lidar模块的学习,然后进行的visual模块。每个模块都分成了若干小的部分,分给每个组员主要负责,学习完成后进行组内交流。

我在lidar模块负责的部分是imuPreintegration(imu预积分)和mapOptmization(图优化);visual模块主要负责的是visual_loop(回环检测)。

imuPreintegration

imyPreintegration中主要的作用是将imu回传的数据进行预积分处理

我对该节点的分析主要是通过它订阅的两个话题的回调函数展开的:

//nh : ros::NodeHandle nh;   在utility.h中定义的
// 订阅imu原始数据,用下面因子图优化的结果,施加两帧之间的 imu预计分量 ,预测每一时刻(imu频率)的imu里程计
//<sensor_msgs::Imu>:通过源码分析,<>内的类型为函数的第三个参数(函数参数)的参数,需要显式的声明出来
subImu      = nh.subscribe<sensor_msgs::Imu>  (imuTopic, 2000, &IMUPreintegration::imuHandler, this, ros::TransportHints().tcpNoDelay());
// 订阅激光里程计,来自mapOptimization,用两帧之间的imu预计分量构建因子图,优化当前帧位姿(这个位姿仅用于更新每时刻的imu里程计,以及下一次因子图优化)
subOdometry = nh.subscribe<nav_msgs::Odometry>(PROJECT_NAME + "/lidar/mapping/odometry", 5, &IMUPreintegration::odometryHandler, this, ros::TransportHints().tcpNoDelay());

imuHandler:订阅imu原始数据,用因子图优化的结果,施加两帧之间的 imu预计分量 ,预测每一时刻(imu频率)的imu里程计。

订阅激光里程计,来自mapOptimization,用两帧之间的imu预计分量构建因子图,优化当前帧位姿(这个位姿仅用于更新每时刻的imu里程计,以及下一次因子图优化)。

可以理解为两帧雷达帧之间有若干的imu帧,通过将这些imu进行预积分处理,进行之后的帧优化工作。

在这里插入图片描述

发布了两个话题:都是关于imu里程计的信息。分别是里程计的信息和imu路径信息。

需要注意的是,接收到的原始imu数据和lidar激光帧都是在其原坐标系下的,在该节点实际参与计算时,需要将他们进行坐标系统一

mapOptmization

mapOptmization的代码量比较大,但是当梳理清楚后可以发现该节点的所有工作都是围绕着对激光雷达帧的优化展开的。mapOptmization订阅了来自FeatureExtraction的当前激光帧点云信息,通过一系列步骤得到优化后的激光帧:

  1. 对当前位姿进行初始化
    1. 如果是第一帧,用原始imu数据的RPY初始化当前帧位姿(旋转部分)。
    2. 如果是后续帧,用imu里程计计算两帧之间的增量位姿变换,作用于前一帧的激光位姿,得到当前帧的激光位姿。
  2. 提取局部角点、平面点云集合,加入局部地图
    1. 对最近一帧的关键帧,搜索时空维度上相邻的关键帧集合,降采样一下
    2. 对关键帧集合中的每一帧,提取对应的角点、平面点,加入局部地图中
  3. 对第2步提取的当前激光帧角点、平面点集合降采样
  4. scan-to-map优化当前帧位姿
  5. 判断当前帧是否为关键帧;设置当前帧为关键帧并执行因子图优化
    1. 要求当前帧特征点数量足够多,且匹配的点数够多,才执行优化
    2. 迭代30次(上限)优化
      1. 当前激光帧角点寻找局部地图匹配点
        1. 更新当前帧位姿,将当前帧角点坐标变换到map系下,在局部地图中查找5个最近点,距离小于1m,且5个点构成直线(用距离中心点的协方差矩阵,特征值进行判断),则认为匹配上了
        2. 计算当前帧角点到平面的距离、垂线的单位向量,存储为角点参数
      2. 当前激光帧平面点寻找局部地图匹配点
        1. 更新当前帧位姿,将当前帧平面点坐标变换到map系下,在局部地图中查找5个最近点,距离小于1m,且5个点构成平面(最小二乘拟合平面),则认为匹配上了。
        2. 计算当前帧平面点到平面的距离、垂线的单位向量,存储为平面点参数
      3. 提取当前帧中与局部地图匹配上了的角点、平面点,加入同一集合
      4. 对匹配特征点计算Jacobian矩阵,观测值为特征点到直线、平面的距离,构建高斯牛顿方程,迭代优化当前帧位姿,存transformTobeMapped
    3. 用imu原始RPY数据与scan-to-map优化后的位姿进行加权融合,更新当前帧位姿的roll,pitch,约束z坐标
  6. 更新因子图中历史关键帧的位姿,更新里程计轨迹(可以理解为用当前帧来优化历史帧)
    1. 计算当前帧与前一帧位姿变换,如果变化太小,不设为关键帧,反之设为关键帧
    2. 添加激光里程计因子、GPS因子、闭环因子
    3. 执行因子图优化
    4. 得到当前帧优化后的位姿,位姿协方差
    5. 添加cloudKeyPoses3D,cloudKeyPoses6D,更新transformTobeMapped,添加当前关键帧的角点、平面点集合
  7. 发布激光里程计
  8. 发布里程计、点云、轨迹

其中imuPreintegration订阅的激光里程计话题就是该节点发布的。

  • 在这里mapOptmization节点发布的优化后的激光雷达帧被imuPreintegration节点订阅,然后通过自身计算的imu预积分进一步优化激光雷达帧位姿,从而将imu里程计和激光里程计相融合。

  • 注意:mapOptmization节点发布的信息同时被多个节点所订阅,我会在后面的节点数据流向中作详细的分析。

visual_odometry/visual_loop

该节点位于视觉部分。视觉部分主要分为三个节点,loop节点的作用是进行回环检测。

该节点主要订阅来自视觉部分的另一个节点estimator发布的话题,包括关键帧的位姿、位置和图像信息,根据这些信息,通过回环检测算法(词袋模型),检测闭环,从而优化全局位姿。

该节点在初始化的时候会将项目中的数据集加载到程序中(config下的brief开头的文件)。这些数据集是词袋模型中的字典集,使用的描述子是BRIEF描述子。

之后会开启一个并行的线程,用来接收新的关键帧,并对他进行处理,判断是否形成闭环。

该节点发布的信息主要是回环检测优化过后的关键帧的相关信息。

节点间交互

首先看一下整个项目的rqt_graph图:

在这里插入图片描述

我分析的部分的节点数据流向总的来说并不复杂。

imuPreintegtration

可以看到imuPreintegtration有2条入边,3条出边。

在这里插入图片描述

首先是imuPreintegtration节点,接收来着imu的原始数据和mapOptmization的数据,如何处理在上面的总结中都有提到,这里能体现出项目的雷达-惯导融合;而对于订阅该节点发布的话题的节点,通过在后续visual部分学习后,和同学进行交流后知道,被视觉部分的feature和odometry部分订阅,用来作雷达-视觉融合后的imu优化位姿;另一个则是被rvzi订阅,用来图像显示。

在这里插入图片描述

mapOptmization

在这里插入图片描述

mapOptmization订阅的话题包括点云信息和关键帧信息,这也与要优化的内容相匹配;而订阅该节点发布话题的节点较多,总结下来都是那些需要关键帧来做处理的节点。

visual_odometry/visual_loop

在这里插入图片描述

以visual_loop节点为中心,可以看到之前的mapOptmization订阅的关键帧信息,正是通过视觉部分回环检测后的关键帧信息,这里较好的体现出了视觉-雷达-惯导融合的部分:lidar部分的mapOptmization节点,用imu预积分的结果来优化从visual部分传来的关键帧数据。

该节点订阅的消息则很好判断:视觉里程计提供关键帧信息;imageProjection提供图片信息。

总结

在本次课程的总体学习中,我感觉除了对整个liv-sam项目的学习外,我还有很多其他收获:

  • 阅读分析长代码的能力有了很大的提升。
  • 对c++的一些深层次的语法的应用有了认识,如共享指针、重定义等等。
  • 对linux系统和ROS系统的使用也得到了锻炼,尤其是在我们安装测试lvi-sam项目的时候,确实花费了一些功夫,但也从中总结了很多经验教训。
  • 除了lvi-sam外,我还在本学期自学了其他SLAM的相关知识,以《SLAM14讲》书籍为线索,配合网上的各种博客教程,让我对整个SLAM有了更加全面、系统的学习,为日后在无人驾驶导航方面的继续深入学习打下了基础。
  • 这次可能也让我认识到了团队的力量,队员之间合理分工、互相学习,就会发挥出1+1>2的能力
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS-3DSLAM(十六)lvi-sam项目总结 的相关文章

  • ag-grid基本配置

    columnDefs headerName 序号 必填 显示在表头的文本 width 50 宽度 minWidth 300 最小宽度 多数情况是在自适应时 设置使用 maxWidth 300 最大宽度 多数情况是在自适应时 设置使用 cel
  • Webots小车与Gampping建图仿真与ORB3算法实践

    此篇博客转自本作者在古月居的博客 https www guyuehome com 34537 前言 在研一的时候 由于XXX项目的需要 其中一项就是需要测试Gmapping建图 自然也要求使用ROS系统 由于之前经常在webots中进行仿真
  • SLAM-hector_slam 简介与使用

    hector slam功能包使用高斯牛顿方法 不需要里程计数据 只根据激光信息便可构建地图 所以他的总体框架如下 hector slam功能包 hector slam的核心节点是hector mapping 它订阅 scan 话题以获取SL
  • ros 中ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdist

    ros 中ERROR cannot download default sources list from https raw githubusercontent com ros rosdistro master rosdep sources
  • ROS诸多调试工具总结1

    ROS有许多调试工具来为ROS调试你的工具 1 rosnode 参数 用法 作用 list rosnode list 查看当前运行了哪些节点 info rosnode info node name 查看该节点发布 接受哪些话题以及服务 ki
  • V-REP安装

    小知识 是当前目录 是父级目录 是根目录 1 下载V REP 官网地址 http www v rep eu downloads html 我用ubuntu16 04下载V REP PRO EDU V3 5 0 Linux tar 2 解压安
  • 关于相机与激光雷达数据采集与标定

    最近在做一个关于车路协同的项目 需要做一个路侧系统 传感器有摄像头和激光雷达 相机和激光雷达联合标定费了老半天劲 在此记录一下 雷达时间戳不对 导致摄像头和雷达的数据无法对齐 解决办法 修改雷达驱动发布点云消息时的时间戳 相机内参标定可以使
  • Ubuntu下vscode配置ROS环境

    摘要 最近准备放弃用clion开发ROS使用更主流的vscode 整理一下在ubuntu18 04下的VSCode安装和ROS环境配置流程 安装 方法一 软件商店安装 个人还是推荐使用ubuntu软件下载vscode 简单不容易出错 方法二
  • ModuleNotFoundError: No module named ‘rosbag‘

    1 ModuleNotFoundError No module named rosbag File opt ros kinetic lib python2 7 dist packages roslib launcher py line 42
  • ROS rosdep update 出错方法 不需要翻墙切换之类的解决方法 ‘https://raw.githubusercontent.com/ros/rosdistro/master/inde

    系统 ubuntu18 rosdep update参考的这篇文章 https blog csdn net weixin 43311920 article details 114796748 utm source app app versio
  • rosprofiler 安装和使用

    rosprofiler wiki 页面 http wiki ros org rosprofiler rosprofiler package 下载rosprofiler和ros statistics msgs 放到工程目录下编译 https
  • ROS1 ROS2学习

    ROS1 ROS2学习 安装 ROS ROS1 ROS2 命令行界面 ROS2 功能包相关指令 ROS 命令行工具 ROS1 CLI工具 ROS2 CLI工具 ROS 通信核心概念 节点 Node 节点相关的CLI 话题 Topic 编写发
  • 进入 docker 容器,exec 丢失 PATH 环境变量

    这是我的 Dockerfile FROM ros kinetic ros core xenial CMD bash 如果我跑docker build t ros docker run it ros 然后从容器内echo PATH 我去拿 o
  • ROS AsyncSpinner 的多线程行为

    我试图了解 ROS 中的 AsyncSpinner 是如何工作的 因为我可能有一些误解 你可以找到类似的问题here As seen here它的定义提到 异步旋转器 产生几个线程 可配置 将并行执行回调 同时不会阻塞执行该操作的线程 叫它
  • 我的代码的 Boost 更新问题

    我最近将 boost 更新到 1 59 并安装在 usr local 中 我的系统默认安装在 usr 并且是1 46 我使用的是ubuntu 12 04 我的代码库使用 ROS Hydro 机器人操作系统 我有一个相当大的代码库 在更新之前
  • 无法在 ROS 中使用本地安装的 Protocol Buffer

    我已经安装了协议缓冲区 https developers google com protocol buffers 本地 ROS包的目录结构如下 CMakeLists txt package xml include addressbook p
  • ROS安装错误(Ubuntu 16.04中的ROS Kinetic)

    中列出的步骤顺序http wiki ros org kinetic Installat 已被关注 尝试在Ubuntu 16 04中安装ROSkinetic 输入以下命令时出错 sudo apt get install ros kinetic
  • 如何订阅“/scan”主题、修改消息并发布到新主题?

    我想通过订阅message ranges来改进turtlebot3的LDS 01传感器 通过应用一些算法修改messange ranges并将其发布到新主题 如下所示 但是当我运行编码时出现错误 错误是 遇到溢出的情况 错误是 运行时警告
  • 使用 CMake 链接 .s 文件

    我有一个我想使用的 c 函数 但它是用Intel编译器而不是gnu C编译器 我在用着cmake构建程序 我实际上正在使用ROS因此rosmake但基础是cmake所以我认为这更多是一个 cmake 问题而不是ROS问题 假设使用构建的文件
  • ROS中spin和rate.sleep的区别

    我是 ROS 新手 正在尝试了解这个强大的工具 我很困惑spin and rate sleep功能 谁能帮助我了解这两个功能之间的区别以及何时使用每个功能 ros spin and ros spinOnce 负责处理通信事件 例如到达的消息

随机推荐

  • 搭建kubernetes v1.21.5 和 kubesphere v3.2.1

    一 准备一台干净的centos7 6机器 二 关闭防火墙打上相关补丁和相关系统软件 systemctl stop firewalld yum span class token function install span openssh op
  • js定时器

    一 定时器概述 开发时用到的js定时器主要分为两种 xff1a 1 一次性的定时器setTimeOut方法 xff0c 通过设置一定的时间 xff0c 时间到就执行 var timer 61 setTimeout fun 毫秒数 清除的方法
  • UNIX 环境高级编程

    与你共享 xff0c 与你共舞 xff01 UNIX环境高级编程 xff08 第3版 xff09 是被誉为UNIX编程 圣经 xff1b 书中除了介绍UNIX文件和目录 标准I O库 系统数据文件和信息 进程环境 进程控制 进程关系 信号
  • ROS的CMakeList编写

    参考这位博主 我的cmakelist包 在 home xxx catkin Drone src Flight Control ROS CMakeLists txt cmake minimum required span class toke
  • Ubuntu18.04 NX下用ZED2 双目立体相机进行SLAM

    NX下的ZED2开发 安装流程问题开始了看效果安装ZED2 ROS工具 新故事篇章 zed2测距开始实现 安装流程 了解zed参数 因为网上的安装流程还是不太完整 xff0c 我补充一下 希望对其他人也有帮助 部分流程参考这位 xff1a
  • ubuntu16.04备份和迁移

    ubuntu16 04备份和迁移 背景实践1 备份整个系统2 重装Ubuntu16 043 恢复系统 题外话 xff1a 修改主机名参考文章 背景 此文用来快速记录备份和恢复的过程步骤 xff0c 具体命令意思不做过多介绍 因为不想新设备重
  • Ubuntu apt-get报错

    昨天晚上更新源 xff0c 居然报错了 zcidcs 64 ubuntu sudo apt get upgrade sudo password for zcidcs Reading package lists Done Building d
  • 2014阿里巴巴面试总结

    刚结束的一面 xff0c 可能昨天笔试题目做得还行 xff0c 今天中午电话我叫我1 30去面试 xff0c 时间紧急 xff0c 我吃完饭赶紧回宿舍小休息一会儿 xff0c 然后奔赴文三路的华星时代大厦 人太多了 xff0c 等到了2 2
  • 基类指针,子类指针,虚函数,override与final

    一 xff1a 基类指针与子类指针 span class token macro property span class token directive keyword include span span class token strin
  • web开发中实现页面记忆的几种方式

    一 前言 在前段时间公司有个需求是对前一个页面的操作进行记忆 xff0c 例如分页的样式 xff0c 选中的条件等 之前是用的session去存储记忆数据 xff0c 老大让我调研一下目前比较合理的方式然后分析一下 xff0c 这里以本篇博
  • 基于VINS与FastPlanner的无人机自主飞行Gazebo仿真

    项目来源及展示 xff1a https www bilibili com video BV1WK4y1V7um from 61 search amp seid 61 12548150687335659873 基本思路 xff1a 采用Gaz
  • RGB-D SLAM 相关总结

    目录 一 RGB D SLAM是什么 xff1f 二 D435i说明 三 RGB D SLAM研究现状 1 现有的RGB D SLAM方法 1 1 前端 1 2 后端 1 3 闭环检测 1 4 制图 2 优秀RGB D SLAM介绍 2 1
  • VINS-Mono学习(一)——数据预处理

    void push back double dt const Eigen Vector3d amp acc const Eigen Vector3d amp gyr dt buf push back dt acc buf push back
  • VINS-Mono学习(四)——回环检测与重定位

    目录 1 闭环检测常用方法有哪些 xff1f 2 ORB SLAM2中Loop Closing的具体实现流程是怎样的 xff1f 3 VINS回环检测与重定位 四自由度位姿图优化 3 1 第一部分 xff1a 回环检测与重定位 3 1 1
  • LADRC的学习——总概

    作者 xff1a 墨心 日期 xff1a 2019 7 25 xff1b 学习LADRC结构 xff1a 1 学习PID的相关知识 xff0c 作为学习ADRC的基础铺垫 xff0c 在simulink中搭建模块 xff0c 通过调节参数
  • LADRC的学习——PID的学习

    PID部分的学习 上文介绍了ADRC的理论 xff0c 并试着按照自己的理解用Matab编程实现韩老师论文中的算法 xff0c 但是对调节参数和一些地方还不太懂 xff0c 因此我打算从头开始理解 xff0c 从PID的好坏开始学习理解 x
  • LADRC的学习——换被控对象进行仿真测试

    LADRC控制器的检验 用不同的被控对象测验 一 前文总结 这篇文章主要根据清华大学的硕士陈星写的论文 xff1a 自抗扰控制器参数整定方法及其热工过程中的应用 进行学习 参考文献为 xff1a 1 Zhiqiang Gao Scaling
  • ROS-3DSLAM(二)lvi-sam项目认识

    2021SC 64 SDUSC xff08 二 xff09 lvi sam项目认识 一 SLAM简介 SLAM是Simultaneous Localization and Mapping xff08 同时定位 43 建图 xff09 独立的
  • KMP算法——字符串匹配问题

    贴上原址 xff1a http www ruanyifeng com blog 2013 05 Knuth E2 80 93Morris E2 80 93Pratt algorithm html 感觉这篇文章讲得很不错 xff0c 很容易懂
  • ROS-3DSLAM(十六)lvi-sam项目总结

    2021SC 64 SDUSC 学习内容概览 本次的项目lvi sam主要分为两个大的模块 xff1a lidar模块和visual模块 我们小组学习先进行了lidar模块的学习 xff0c 然后进行的visual模块 每个模块都分成了若干