激光slam坐标系和视觉slam坐标系对齐,两个slam系统之间坐标对齐,轨迹对齐,时间戳对齐

本文主要是介绍激光slam坐标系和视觉slam坐标系对齐,两个slam系统之间坐标对齐,轨迹对齐,时间戳对齐,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 面临的问题

两个独立的SLAM系统中,常常面临一个问题,那就是一个系统上的某一个pose,对应到另一个系统中是在哪里?

紧耦合的SLAM系统,不存在这个问题,比如激光雷达和相机融合的SLAM系统,它们不存在上述问题!

造成这种关系不确定的最主要原因是:两个系统各自有自己的一个参考系。如果它俩在一个统一的世界参考系下,那么就不存在上述的问题。

我们立马想到的一个办法是,我让两个SLAM系统同时开机运行,那么开机运行那一刻的原点不就是它们的坐标原点了嘛!但是你能保证两个SLAM系统都是一开机运行就能初始化成功吗?对于单目视觉slam,它的世界坐标系是在初始化成功的第一帧。也就是说可能开机运行了一段时间之后,它才出现自己的世界坐标系。而激光SLAM、RGBD SLAM、立体相机SLAM情况又不一样。

所以我们需要一种更通用的方法,来解决两个坐标系的对应问题。

以下分析方法,对于多于两个的SLAM系统也适用!

2. 问题分析

如果用几何来描述这个问题,可以通过下图来表示:

在这里插入图片描述

图 1

坐标系 O − x y z O-xyz Oxyz和坐标系 O ′ − x ′ y ′ z ′ O'-x'y'z' Oxyz分别表示两个SLAM系统的坐标原点,只要能找到这两个坐标系之间的变换关系,那么两个坐标系下的位姿就可以通过这个变换关系相互变换。

假设我们已经求出来了 O → O ′ O \rightarrow O' OO的变换矩阵为 T O ′ O T_{O'O} TOO

那么, O − x y z O-xyz Oxyz坐标系下的某一个位姿 P O P_{O} PO转换到 O ′ − x ′ y ′ z ′ O'-x'y'z' Oxyz坐标系下可以通过如下公式:
P O ′ = T O ′ O P O (0) P_{O}' = T_{O'O} P_{O} \tag{0} PO=TOOPO(0)

反过来, O ′ − x ′ y ′ z ′ O'-x'y'z' Oxyz坐标系下的位姿 P O ′ P_O' PO的到 O − x y z O-xyz Oxyz变换:
P O = T O ′ O − 1 P O ′ (1) P_{O}= T_{O'O}^{-1} P_{O}' \tag{1} PO=TOO1PO(1)

上面介绍的变换是刚性变换,有时可能面临尺度不统一的问题,那么刚性变换就不能满足条件了,必须使用sim3变换。

3. 解法

要求解上述的变换矩阵,只需要找到几对对应点,比如 O − x y z O-xyz Oxyz坐标系下的某一个点,对应找到它在 O ′ − x ′ y ′ z ′ O'-x'y'z' Oxyz坐标系下位置,就这样就形成了一个对应点对,如果能找到多对这样的点对,那么势必是可以求解出这样的变化矩阵 T T T。这里我就不卖关子了,通过这种对应关系求解变换矩阵的方法很多,其中一种比较常用的方法是:umeyama algorithm,它实际上就是通过最小二乘的思路推导出来的,它不但可以求解刚性变换,还可以求解sim3变换。

该算法我自己实现了一个版本,如果需要可以参考:align_trajectory

4.工程中具体做法

4.1根据时间戳找匹配

我们的机器人上可能同时安装了激光雷达和相机,它们可以同时开始运行或者先后运行两个独立的SLAM系统,那么此时就需要统一两个坐标系,由于它们刚性连接,所以它们最终必然产生相似的轨迹形状。

暂时是假设两个SLAM系统精度都比较高,或者比较相近,因为只有这样轨迹形状才会很相似。

对于这种情形,可以采用的坐标系统一方法是:按时间戳对齐。

由于激光雷达和相机被固定连接在一起,所以某一个时刻它们必定处在同一个真实空间位置。那么只需要根据时间戳,取出该时刻下两个传感器对应获得的位姿。根据多个时间戳最终就可以获得多对这样的匹配,然后采用umeyama algorithm,就可以求出两个坐标系之间的变换矩阵。

由于时间戳的精度比较高,有可能激光雷达坐标系下的某一个位姿,在当前时间戳下,相机坐标系并没有与之对应的位姿,此就需要根据实际情况扩大时间戳的范围,比方说在当前时间戳前后0.01秒之内的,可以认为是对应的位姿。

4.2 根据空间位置找匹配

此种方式限制性更小一些。

多数情况下激光雷达建图是会比视觉建图更琐碎一些,可能要控制机器人在环境中来回的运动,对于更大的环境,甚至还需要一点儿点儿精细的对环境进行建图,如果此时相机与激光雷达同时运行势必会浪费很多计算资源和空间,可能还会给视觉带来更大的累计误差,所以最好的方式应该是激光雷达先进行建图,然后打开激光雷达的重定位功能,进行实时的重定位,然后相机进行视觉SLAM功能,视觉SLAM当前时刻跟踪出来的位姿,与当前激光雷达重定位获得的位姿就形成了一对对应点,同样的可以获得很多这样的对应点对。进一步还可以根据激光雷达的定位置信度选择定位更准的点。然后根据umeyama algorithm算法求解出来两个坐标系之间的变换矩阵。

如果你使用的是单线激光雷达,那么势必就少了一个维度(高度上)的信息,而相机恢复出来的是三维信息,不过这并不影响,在实际使用umeyama algorithm时,只需要将激光雷达的高度数据设置为0

这种方法不但适用激光雷达与相机,甚至里程计与相机,里程计与激光雷达,相机与相机,激光雷达与激光雷达,只要是能获得重新定位的能力,此种方法理论上就是适用的。

可能你会怀疑这种方法的精度,实际来说这种精度的误差主要还是来自于SLAM本身,或者测量误差,一旦你能很精准的获得匹配关系,这种误差实际上很小的。

我做过一个实验,1400多米长的轨迹,分别使用激光雷达和相机进行SLAM,最终通过时间戳进行轨迹对齐,它们的误差非常小,可能只是因为SLAM精度带来了这种影响。如果你好奇具体做法,可以参考我github上的代码:align_trajectory
在这里插入图片描述

这篇关于激光slam坐标系和视觉slam坐标系对齐,两个slam系统之间坐标对齐,轨迹对齐,时间戳对齐的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

java时区时间转为UTC的代码示例和详细解释

《java时区时间转为UTC的代码示例和详细解释》作为一名经验丰富的开发者,我经常被问到如何将Java中的时间转换为UTC时间,:本文主要介绍java时区时间转为UTC的代码示例和详细解释,文中通... 目录前言步骤一:导入必要的Java包步骤二:获取指定时区的时间步骤三:将指定时区的时间转换为UTC时间步

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环