LIMO: Lidar-Monocular Visual Odometry

article/2025/7/22 11:25:57

IROS2018的论文

本文提出了LIMO SLAM框架,主要工作是融合了LiDAR和Monocular。

https://github.com/johannes-graeter/limo

 

前端

特征

本文使用的是viso2特征,它能 non-maimum suppression, outlier rejection 和 subpixel refinement.

30-40ms能提取2000个特征。

深度

正常特征

单目没有深度信息,通过LiDAR获取。

首先把LiDAR点投影到图像平面:

  • 在特征点f附近选取投影过来的LiDAR点集F,不要取一条线上的激光点(右图)。

  • 在3D LiDAR空间把F分割前后景(深度不同),取前景点集F_f(因为特征点一般在边缘,打过去的激光点有些在特征点所在平面上,有些其实打在背景上了。)

  • 把F_f拟合一个平面,这个平面不能太小
  • 特征点的射线跟这个平面相交,获得特侦点的深度
  • 平面的法线和特征点的射线的夹角大于某个阈值,或者深度超过30米会被拒绝

地面特征点

地面上的特征点会特殊处理,因为(垂直方向)地面上雷达点更稀疏。

  • 首先RANSAC提取出地面平面
  • 跟之前一样我们围绕f逆和一个local平面,这个平面面积阈值比之前大一些

帧间运动量

除了常用的PnP估计外,

引入了Fundamental matrix的pFp约束。

另外用了Cauchy function包裹这个新引入的约束。

后端

关键帧的选择

mean optical flow 小于某个阈值的时候认为机器人没有在运动,此时不记录关键帧。

时间间隔是0.3s

路标点的选择

前端的时候所有的特征都会被计算,路标的选择在后端进行。

所有的特征点被分为远中近三组。

近处的特征对位移估计好

中间的点都好

远处的点对旋转估计好。

用了voxel filter with median filtering 来减少trees bushes对BA的影响(把局部地区富集到一起的信息离散化了?)

BA的lost function

lost function包括三部分:

投影误差和深度估计误差

以及

这个误差我没看懂,说是

优化窗口内最古老的motion包含最多的信息所以最准确。

因此我们增加了cost functor v that punishes deviations from the length of its translation vector.

P0 P1是优化窗口中最近的两个pose。

s is a constant with the value of before optimization.

In that way changes in scale are regularized and the estimate is smoother and more robust outliers.

 

另外他们的BA会定期剔除一些误差项以跳出局部最优。

 

实验感想

我在改ORBSLAM2的时候尝试用这个办法找到Monocular跟LiDAR的比率

在特征点附近找LiDAR point拟合平面看起来很美好。用Kitti数据集,街边一些非墙面和地面的地区就很麻烦。

特征点附近的激光点云肉眼一看就是个非垂直非水平的倾斜平面,拟合出来的平面跟射线的相交点经常离群,距离特征点附近的激光点云很远。

很容易被30米或者平面法线射线夹角的阈值给干掉。

最后感觉没有一个平面-射线交点是可靠的。

(可能还不如像其他方法用最近LiDAR点的深度替代)

 


http://chatgpt.dhexx.cn/article/NaGebs3y.shtml

相关文章

Visual Odometry技术 (Of VSLAM)

目录 什么是SLAM 经典视觉SLAM框架 Visual Odometry Lucas–Kanade光流 Acknowledgements and References 什么是SLAM SLAM是Simultaneous localization and mapping缩写,意为“同步定位与建图”1。它是指搭载了特定传感器的主体,如机器人或者无人…

ROS 位置姿态Odometry仿真模拟(gmapping)

使用单纯的雷达数据进行 2D 建立图像的时候,建图的效果和雷达的性能也有关系,雷达的扫描频率会随着小车的移动速度增大而变化,通过更改扫描的频率来更新栅格地图的完整性。 点击DEMO-LINK 所需要的环境 ubuntu 18.04 ROS Melodic desktop fu…

rospy Odometry天坑小计

rospy Odometry天坑小计 在使用 python 自己搭建 ros 控制小车的上位机接口时,遇到了一个非常奇怪的问题,发布里程计的时候,一旦里程计得到订阅,发布者就会报 ndarray 属性找不到错误,乍一看着实让人脑瓜疼&#xff0…

Tightly Coupled LiDAR Inertial Odometry and Mapping源码解析(一)

Tightly Coupled LiDAR Inertial Odometry and Mapping源码解析(一) 1. LiDAR inertial odometry and mapping简介2. Tightly coupled LiDAR inertial odometry2.1 LiDAR-IMU odometry overview2.2 IMU and pre-integration2.3 De-skewing and feature e…

SLAM——入门到放弃:ROS里程计(odometry)

ROS gmapping导航包,要求有2 个 输入,一个是激光数据,另一个就是里程计信息。 里程计又包含2 个方面的信息: 位姿(位置和转角),即(x,y,θ)是速度(前进速度和…

Ros Odometry获取机器人位置-python 代码打印

纪念一下,辛苦了一天多,终于找出来了,经过网上的资料反向推出结构。 博主需要通过机器人的实时位置来进行计算。从网上查阅得知nav_msgs/Odometry消息中存储机器人的位置和速度估计等。 下面展示一下操作流程: 1.首先通过 ros…

ROS里程计消息nav_msgs/Odometry的可视化方法

ROS中里程计的消息类型为nav_msgs/Odometry,该消息类型具有以下结构: 可以看到,里程计消息中的pose包含了位置pose.position和姿态pose.orientation 在ROS中,有一种常用消息类型为nav_msgs/Path,可视化的方法为&#…

基于rf2o_laser_odometry纯激光里程计的gmapping建图

ROS环境:ubuntu16.04 & ROS kinetic激光雷达:EAI-X4 or RPlidar-A1激光里程计:rf2o_laser_odometry建图:gmapping 对于很多刚入门的同学,购买一台带有高精度轮式里程计的ROS小车经济上往往不允许。但是大多数同学…

nav_msgs/Odometry消息的发布和tf变换

一。ROS使用tf来决定机器人的位置和静态地图中的传感器数据,但是tf中没有机器人的速度信息,所以导航功能包要求机器人 能够通过里程计信息源发布包含速度信息的里程计nav_msgs/Odometry 消息。 本篇将介绍nav_msgs/Odometry消息,并且通过代码…

【视觉SLAM】DM-VIO: Delayed Marginalization Visual-Inertial Odometry

L. v. Stumberg and D. Cremers, “DM-VIO: Delayed Marginalization Visual-Inertial Odometry,” in IEEE Robotics and Automation Letters, vol. 7, no. 2, pp. 1408-1415, April 2022, doi: 10.1109/LRA.2021.3140129. 论文阅读方法:Title,Abstract…

DSO(Direct Sparse Odometry)

DSO(Direct Sparse Odometry) 文章目录 1. 简述2. 概述3. 框架流程3.1 代码框架与数据表示3.2 VO流程 4. DSO详细介绍4.1 残差的构成与雅可比4.2 滑动窗口的维护与边缘化4.3 零空间,FEJ4.4 其他零散的模块和算法 5. 光度标定6. 评述7. 资料与…

SVO(SVO: fast semi-direct monocular visual odometry)

SVO2系列之深度滤波DepthFiltersvo_noteSVO(SVO: fast semi-direct monocular visual odometry)SVO 半直接视觉里程计【DepthFilter】深度滤波器【svopro】代码梳理 SVO(SVO: fast semi-direct monocular visual odometry)翻译 1、…

航迹推演

​ 做机器人底层程序的时候,经常用到航迹推演(Odometry),无论是定位导航还是普通的方向控制。航迹推演中除了对机器人位姿进行估计,另一个很重要的关系是移动机器人前进速度、转向角速度与左轮速度、右轮速度之间的转换…

航迹推演(Odometry)

做机器人底层程序的时候,经常用到航迹推演(Odometry),无论是定位导航还是普通的方向控制。航迹推演中除了对机器人位姿进行估计,另一个很重要的关系是移动机器人前进速度、转向角速度与左轮速度、右轮速度之间的转换。…

大数据基础编程+实验

本文仅用于分析和记录在校期间学习大数据分析课程的一点心得体会。 1、Ubuntu系统的安装和使用 本文采用Ubuntu16.04系统,安装系统省略,选择镜像后一直点击下一步 1.1 进入系统后,调整输入法,将输入法切换至中英文切换 1.2为…

Python数据库编程pymysql

Python数据库编程pymysql 一、数据库编程介绍 数据库编程就是针对数据库的操作,通过编写程序的方式,让程序做为数据库的客户端进行数据库操作。 对于MySQL的操作我们可以通过SQL语句,但是有很多情况下我们需要写入MySQL的数据非常多&#…

过程化SQL数据库编程

一、过程化SQL的块结构 基本的SQL是高度非过程化的语言。嵌入式SQL将SQL语句嵌入程序设计语言,借助高级语言的控制功能实现过程化。过程化SQL是对SQL的扩展,使其增加了过程化语句功能。 过程化SQL程序的基本结构是块。所有的过程化SQL程序都是由块组成的…

Java的数据库编程:JDBC

目录 一、JDBC是什么? 二、使用步骤 1.首先将JDBC的包引进java中 2.创建新的类来写代码 3.描述你的服务器 4.设置你的数据库地址,数据库用户名,数据库密码 5.连接数据库 6.书写你所要执行的SQL语句 7.把字符串风格的sql转化成一个对象 8.执行语句 9.回收资…

Python数据库编程

操作SQLite3数据库 从Python3.x版本开始,在标准库中已经内置了SQLlite3模块,它可以支持SQLite3数据库的访问和相关的数据库操作。在需要操作SQLite3数据库数据时,只须在程序中导入SQLite3模块即可。Python语言操作SQLite3数据库的基本流程如…

实验7 数据库编程

第1关 定义一个名为PROC_COUNT的无参数存储过程 任务描述 定义一个名为PROC_COUNT的无参数存储过程,查询工程名称中含有“厂”字的工程数量,并调用该存储过程。 相关知识 1、工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)…