三. 多传感器标定方案(空间同步)--2

news2024/9/24 23:27:41

前面的内容:

一. 器件选型心得(系统设计)--1_goldqiu的博客-CSDN博客

一. 器件选型心得(系统设计)--2_goldqiu的博客-CSDN博客

二. 多传感器时间同步方案(时序闭环)--1

三. 多传感器标定方案(空间同步)--1_goldqiu的博客-CSDN博客

三. 多传感器标定方案(空间同步)--2

多传感器空间同步除了内参标定,还有外参标定。

外参标定

外参即各传感器到车体坐标系的转换关系,包含:

• IMU(GNSS) – Car

• LiDAR – Camera

• Camera – Camera

• LiDAR – LiDAR

• LiDAR – IMU(GNSS)

• LiDAR – Radar

• 超声波雷达– Car

解法1:

• 直接标各传感器与车体坐标系

解法2:

• 标部分传感器与车体坐标系

• 另外一部分通过传感器之间实现标定

我们一般采用解法2。

注意:车体坐标系与世界坐标系的转换关系由定位模块确定。

外参1:IMU(GNSS)和车体坐标系

假设我们能:

• 获取自车运动的位姿序列

• 通过GNSS+IMU设备观测自车运动(组合导航设备是能够获取车辆的位姿信息)

对于自车坐标系和GNSS+IMU坐标系,每个时刻有:

于是目标函数:

存在一些问题:

• GNSS+IMU设备观测的位姿序列可以达到cm级别

• 6自由度的自车运动很难精确获得

解决方案:

•优先关注3个自由度:(x, y, yaw)

•z通过测量得到 (pitch和roll近似为0)

设计测试路段:

• 严格直道(可通过激光笔测试),距离为d

• 车辆尽量严格按直线行驶

最后得到:

外参2:Camera与Camera之间的标定

首先包含一个PnP问题,要求:Camera与Camera之间有视野重叠。

然后如果能通过图像还原一个点的3D位置,使下式成立:

个人理解:假如是两个相机标定外参,需要先处理两个PnP问题,通过两个相机的两组图像还原其对应棋盘格角点的3D位置,即得到了两组3D点。然后再用这两组3D点构建优化问题,求解上式,得到两个相机之间的T。可以简单理解为,先PnP,再ICP。

总结:

先是PnP问题:2d还原3d的过程。

求解的目标函数就是:3D点投影到像素平面的UV值和本身像素平面UV值的误差,使之最小;进而求解出变换矩阵T。

这样我们就可以得到两个相机对应的两组3D点了。

然后:

类似于ICP,两组3D点求解之间的变换矩阵。目标函数是第一组3D点与变换过来的第二组3D点之间的误差,使之最小,求得变换矩阵T。

参考的开源工具:

https://github.com/ethz-asl/kalibr

https://github.com/zju3dv/EasyMocap

https://github.com/calibtoolkit/calibration_kit

外参3:LiDAR和Camera

同上,通过PnP可还原图像的3D位置,则:

要求:LiDAR与Camera之间有视野重叠

求解过程:

可参考开源工具包:

用过的:

https://github.com/XidianLemon/calibration_camera_lidar

https://github.com/JunzWu/Autoware_Calibration_Camera_Lidar

没用过的:

https://github.com/Livox-SDK/livox_camera_lidar_calibration

https://github.com/ankitdhall/lidar_camera_calibration

https://github.com/heethesh/lidar_camera_calibration

https://github.com/calibtoolkit/calibration_kit

参考博客:

goldqiu:二十一.激光、视觉和惯导LVIO-SLAM框架学习之相机与雷达外参标定(1)

另外补充:以上只能算作雷达和相机的粗标定,如果需要更加好的融合效果,则需要精标定。

需要根据雷达的线束特点和空间特性来设计标定平台,标定好pitch、roll和yaw三个角度,这样精度可以更高。可以写一套算法自动标定,也可以做一个半自动标定软件进行手动标定。

具体见:

激光雷达三维建模项目总结_哔哩哔哩_bilibili​www.bilibili.com/video/BV1bm4y1Y7be/

外参4:LiDAR和LiDAR

如果能找到两帧点云中的若干点对,则可建立如下关系:

这是ICP问题:

事实上,在实际标定时,我们往往会选择一个结构化的墙角,这样就有比较明显的特征。

但是,如果事先我们完全不知道两个雷达的变换关系,或者说两个雷达没有共视区域(比如都是固态雷达),那么在这种初值不知道或者相差很多的情况下直接用ICP是求解不出来的。

我们有两种方式:

  1. 直接给出一个初值:一般雷达的坐标系都是已知的,我们可以通过安装关系大概能推出雷达与雷达之间粗略的变换关系。根据这个初值再进行ICP。

  2. 假设雷达安装只差了一个角度,那么可以通过多分辨率处理或者遍历搜索角度的方式来搜索出初值角度,作为初值再进行ICP求解。(这个类似于后面会讲的多机协同定位利用雷达进行初始化位姿求解的过程)

假设多雷达安装相互之间三个角度都是错乱的,那么得考虑其他的方法了。

可参考开源工具包:

多激光雷达标定multi_LiDAR_calibration_多雷达标定_雨霖 X的博客-CSDN博客

https://github.com/calibtoolkit/calibration_kit

个人多机协同定位初始化展示(和多雷达外参标定是一个问题):

初始化前:

初始化后,并协同定位实时运行:

参考:深蓝学院《多传感器融合感知》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/806243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI聊天GPT三步上篮!

1、是什么? CHATGPT是OpenAI开发的基于GPT(Generative Pre-trained Transformer)架构的聊天型人工智能模型。也就是你问它答,根据网络抓去训练 2、怎么用? 清晰表达自己诉求,因为它就是一个AI助手&#…

【腾讯云 Cloud Studio 实战训练营】Cloud Studio实现健康上报小程序(代码开源)

目录 🍳前言🍳实验介绍🍳产品介绍🍳注册Cloud Stdio🍳后端Spring服务🍳创建项目上传项目数据库连接与导入 🍳Vue后台管理创建项目编辑模板信息选择环境镜像上传资源文件 🍳小程序⭐总…

容器演进时间轴及容器技术演进

1.1 1979年 — chroot 容器技术的概念可以追溯到1979年的UNIX chroot。 它是一套“UNIX操作系统”系统,旨在将其root目录及其它子目录变更至文件系统内的新位置,且只接受特定进程的访问。 这项功能的设计目的在于为每个进程提供一套隔离化磁盘空间。 …

NIM游戏/SG函数

NIM游戏 先看一下一维 NIM游戏。 有一堆大小为 n 的石子,甲和乙轮流从石堆里面拿石子,不能一次拿掉所有石子,取走最后一个石子的人获胜,甲先开始,谁是必胜的? 显然,谁先手,谁就获胜…

蓝桥杯单片机第五届国赛 真题+代码

onewire.c /* # 单总线代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求,进行代码调试和修改。 */// #include …

Opencv的Mat内容学习

来源&#xff1a;Opencv的Mat内容小记 - 知乎 (zhihu.com) 1.Mat是一种图像容器&#xff0c;是二维向量。 灰度图的Mat一般存放<uchar>类型 RGB彩色图像一般存放<Vec3b>类型。 (1)单通道灰度图数据存放样式&#xff1a; (2)RGB三通道彩色图存放形式不同&#x…

微服务性能分析工具 Pyroscope 初体验

Go 自带接口性能分析工具 pprof&#xff0c;较为常用的有以下 4 种分析&#xff1a; CPU Profiling: CPU 分析&#xff0c;按照一定的频率采集所监听的应用程序 CPU&#xff08;含寄存器&#xff09;的使用情况&#xff0c;可确定应用程序在主动消耗 CPU 周期时花费时间的位置…

数值线性代数:奇异值分解SVD

本文记录计算矩阵奇异值分解SVD的原理与流程。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 零、预修 0.1 矩阵的奇异值 设列满秩矩阵&#xff0c;若的特征值为&#xff0c;则称为矩阵的奇异值。 0.2 SVD(分解)定理 设&#xff0c;则…

❤ Redirected when going from “/login“ to “/“ via a navigation guard错误

❤ vue路由遇到 Redirected when going from “/login“ to “/“ via a navigation guard错误 路由版本&#xff1a;“vue-router”: “^3.5.2”, 添加了路由守卫&#xff0c;然后开始报这个错误&#xff0c; 原因 就是路由版本导致的 解决办法 // 导航守卫限制路由跳转 …

Jenkins插件管理切换国内源地址

一、替换国内插件下载地址 选择系统管理–>插件管理–> Available Plugins 并等待页面完全加载完成、这样做是为了把jenkins官方的插件列表下载到本地、接着修改地址文件、替换为国内插件地址 进入插件文件目录 cd /var/lib/jenkins/updatesdefault.json 为插件源地址…

比较两字符串数组中对应位置元素的大小char.greater()和char.less()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 比较两字符串数组中 对应位置元素的大小 char.greater()和char.less() [太阳]选择题 下列代码最后输出的结果是&#xff1f; import numpy as np x1 np.array([a, bc, D]) print("【显…

go 查询采购单设备事项V3

一、版本说明 本版本在整合上两次的功能基础上&#xff0c;引进ini配置文件的读取事项&#xff0c;快速读取本地配置文件&#xff0c;完成读取设置 第一版&#xff1a;实现了严格匹配模式的查找 https://blog.csdn.net/wtt234/article/details/131979385 第二版&#xff1a;实…

整数转换-C语言/Java

描述 整数转换。编写一个函数&#xff0c;确定需要改变几个位才能将整数A转成整数B。A&#xff0c;B范围在[-2147483648, 2147483647]之间。 示例1&#xff1a; 输入&#xff1a;A 29 &#xff08;或者0b11101&#xff09;, B 15&#xff08;或者0b01111&#xff09; 输出&…

c++数据锁链

题目描述&#xff1a; 创建一个结构体为Node&#xff0c;具有value , next 两个属性&#xff1b; value为整型&#xff0c;用来储存结构体数值&#xff1b; next为Node类型指针&#xff0c;用来指向下一组数据地址&#xff1b; 第1组数据value 5&#xff1b; 第2组数据value …

1400*C. String Equality(greedy)

Example input 4 3 3 abc bcd 4 2 abba azza 2 1 zz aa 6 2 aaabba ddddcc output No Yes No Yes 题意&#xff1a; 字符串a和b&#xff0c;其字母顺序可以任意交换&#xff0c;k个连续的相同字母&#xff0c;可以全部变为大于这个字母的其他字母&#xff08;bb->cc&…

小程序动态隐藏分享按钮

// 禁用分享 wx.hideShareMenu({menus: [shareAppMessage, shareTimeline] })// 显示分享 wx.showShareMenu({withShareTicket: true,menus: [shareAppMessage, shareTimeline] })//私密消息 wx.updateShareMenu({isPrivateMessage: true, })

Docker容器监控之 CAdvisor+InfluxDB+Granfana

通过docker stats命令可以很方便的看到当前宿主机上所有容器的CPU,内存以及网络流量等数据&#xff0c;一般小公司够用了。但是&#xff0c;docker stats统计结果只能是当前宿主机的全部容器&#xff0c;数据资料是实时的&#xff0c;没有地方存储、没有健康指标过线预警等功能…

Tensorflow预训练模型ckpt与pb两种文件类型的介绍

我们在 Tensorflow无人车使用移动端的SSD(单发多框检测)来识别物体及Graph的认识 熟悉了Graph计算图以及在 Tensorflow2.0中function(是1.0版本的Graph的推荐替代)的相关知识介绍 这个tf.function的用法&#xff0c;了解到控制流与计算图的各自作用&#xff0c;无论使用哪种方…

向量vector与erase()

运行代码&#xff1a; //向量vector与erase() #include"std_lib_facilities.h" //声明Item类 struct Item {string name;int iid;double value;Item():name(" "),iid(0),value(0.0){}Item(string ss,int ii,double vv):name(ss),iid(ii),value(vv){}frien…