激光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

相关文章

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2