当前位置: 首页 > news >正文

多激光雷达手眼标定

手眼标定方法已经有很多博客进行解析,但是都是针对机器人的手(夹爪)眼睛(相机)进行标定。例如:
标定学习笔记(四)-- 手眼标定详解
手眼标定_全面细致的推导过程

本文主要描述多激光雷达应用中如何使用手眼标定的方法进行标定。
假如存在以下问题,在一个小车上存在两个激光雷达,激光雷达A与激光雷达B,须求解激光雷达B到激光雷达A的转换参数 B A T ^A_BT BAT(外参)。
在这里插入图片描述

利用手眼标定方法原理如下:

变量定义

如上图中所示,存在一个世界坐标系G,点 P P P在世界坐标系中的坐标为 P G P_G PG
t 1 t_1 t1时刻,激光雷达A与激光雷达B分别观测到点 P P P的坐标为: P A 1 P_{A1} PA1 P B 1 P_{B1} PB1
t 2 t_2 t2时刻,激光雷达A与激光雷达B分别观测到点 P P P的坐标为: P A 2 P_{A2} PA2 P B 2 P_{B2} PB2

t 1 t_1 t1时刻,激光雷达A与激光雷达B分别到全局坐标系 G G G的转换关系为: A 1 G T ^{G}_{A1}T A1GT B 1 G T ^{G}_{B1}T B1GT
t 2 t_2 t2时刻,激光雷达A与激光雷达B分别到全局坐标系 G G G的转换关系为: A 2 G T ^{G}_{A2}T A2GT B 2 G T ^{G}_{B2}T B2GT

t 1 t_1 t1时刻,激光雷达A与激光雷达B之间的转换关系为 B 1 A 1 T ^{A1}_{B1}T B1A1T
t 2 t_2 t2时刻,激光雷达A与激光雷达B之间的转换关系为 B 2 A 2 T ^{A2}_{B2}T B2A2T

推导过程

t 1 t_1 t1时刻,点 P P P在世界坐标系中的坐标 P G P_G PG可以通过下式计算:

P G = ( A 1 G T ) ( B 1 A 1 T ) P B 1 P_G=(^{G}_{A1}T)(^{A1}_{B1}T)P_{B1} PG=(A1GT)(B1A1T)PB1
t 2 t_2 t2时刻,
P G = ( A 2 G T ) ( B 2 A 2 T ) P B 2 P_G=(^{G}_{A2}T)(^{A2}_{B2}T)P_{B2} PG=(A2GT)(B2A2T)PB2

由上述两式可得:
P G = ( A 1 G T ) ( B 1 A 1 T ) P B 1 = ( A 2 G T ) ( B 2 A 2 T ) P B 2 = P G P_G=(^{G}_{A1}T)(^{A1}_{B1}T)P_{B1}=(^{G}_{A2}T)(^{A2}_{B2}T)P_{B2}=P_G PG=(A1GT)(B1A1T)PB1=(A2GT)(B2A2T)PB2=PG

由于认为激光雷达A与激光雷达B之间是刚性连接,所以二者之间的变换不随时间进行变化,即:
B 1 A 1 T = B 2 A 2 T = B A T ^{A1}_{B1}T=^{A2}_{B2}T=^{A}_{B}T B1A1T=B2A2T=BAT
则上式变换为:
( A 1 G T ) ( B A T ) P B 1 = ( A 2 G T ) ( B A T ) P B 2 (^{G}_{A1}T)(^{A}_{B}T)P_{B1}=(^{G}_{A2}T)(^{A}_{B}T)P_{B2} (A1GT)(BAT)PB1=(A2GT)(BAT)PB2

两边同左乘 ( A 2 G T ) − 1 (^{G}_{A2}T)^{-1} (A2GT)1,并同时右乘 ( P B 1 ) − 1 (P_{B1})^{-1} (PB1)1,转换为下式:
( A 2 G T ) − 1 ( A 1 G T ) ( B A T ) = ( B A T ) P B 2 ( P B 1 ) − 1 (^{G}_{A2}T)^{-1}(^{G}_{A1}T)(^{A}_{B}T)=(^{A}_{B}T)P_{B2}(P_{B1})^{-1} (A2GT)1(A1GT)(BAT)=(BAT)PB2(PB1)1

假设 ( B A T ) (^{A}_{B}T) (BAT)为要求解的变量 X X X,系数为 A = ( A 2 G T ) − 1 ( A 1 G T ) A=(^{G}_{A2}T)^{-1}(^{G}_{A1}T) A=(A2GT)1(A1GT) B = P B 2 ( P B 1 ) − 1 B=P_{B2}(P_{B1})^{-1} B=PB2(PB1)1
则上式转换为:
A X = X B AX=XB AX=XB
这就是我们经常所说的手眼标定推导出的形式了。但是,这和我们的激光雷达轨迹有什么关系呢?

接着,对系数 A A A B B B分别进行转换,过程如下:

对式 A A A,代入 A 1 G T = ( A 2 G T ) ( A 1 A 2 T ) ^{G}_{A1}T=(^{G}_{A2}T)(^{A2}_{A1}T) A1GT=(A2GT)(A1A2T)得:
A = ( A 2 G T ) − 1 ( A 1 G T ) = ( A 2 G T ) − 1 ( A 2 G T ) ( A 1 A 2 T ) = A 1 A 2 T A=(^{G}_{A2}T)^{-1}(^{G}_{A1}T)=(^{G}_{A2}T)^{-1}(^{G}_{A2}T)(^{A2}_{A1}T)=^{A2}_{A1}T A=(A2GT)1(A1GT)=(A2GT)1(A2GT)(A1A2T)=A1A2T

对式 B B B,分别代入 P B 1 = ( G B 1 T ) P G P_{B1}=(^{B1}_{G}T)P_{G} PB1=(GB1T)PG P B 2 = ( G B 2 T ) P G P_{B2}=(^{B2}_{G}T)P_{G} PB2=(GB2T)PG得:
B = P B 2 ( P B 1 ) − 1 = ( G B 2 T ) P G ( G B 1 T P G ) − 1 B=P_{B2}(P_{B1})^{-1}=(^{B2}_{G}T)P_{G}(^{B1}_{G}TP_{G})^{-1} B=PB2(PB1)1=(GB2T)PG(GB1TPG)1
= ( G B 2 T ) P G P G − 1 ( G B 1 T ) − 1 = ( G B 2 T ) ( G B 1 T ) − 1 =(^{B2}_{G}T)P_{G}P_{G}^{-1}(^{B1}_{G}T)^{-1}=(^{B2}_{G}T)(^{B1}_{G}T)^{-1} =(GB2T)PGPG1(GB1T)1=(GB2T)(GB1T)1
代入 G B 2 T = ( B 1 B 2 T ) ( G B 1 T ) ^{B2}_{G}T=(^{B2}_{B1}T)(^{B1}_{G}T) GB2T=(B1B2T)(GB1T)得:
B = ( G B 2 T ) ( G B 1 T ) − 1 = ( B 1 B 2 T ) ( G B 1 T ) ( G B 1 T ) − 1 = B 1 B 2 T B=(^{B2}_{G}T)(^{B1}_{G}T)^{-1}=(^{B2}_{B1}T)(^{B1}_{G}T)(^{B1}_{G}T)^{-1}=^{B2}_{B1}T B=(GB2T)(GB1T)1=(B1B2T)(GB1T)(GB1T)1=B1B2T

由此,可得 A X = X B AX=XB AX=XB可以转换为下述形式:

( A 1 A 2 T ) X = X ( B 1 B 2 T ) (^{A2}_{A1}T)X=X(^{B2}_{B1}T) (A1A2T)X=X(B1B2T)

式中, A 1 A 2 T ^{A2}_{A1}T A1A2T为激光雷达 A A A t 1 t_1 t1时刻到 t 2 t_2 t2时刻的位姿变换(也就是轨迹)。同样的, B 1 B 2 T ^{B2}_{B1}T B1B2T为激光雷达 B B B t 1 t_1 t1时刻到 t 2 t_2 t2时刻的位姿变换。

相关文章:

多激光雷达手眼标定

手眼标定方法已经有很多博客进行解析,但是都是针对机器人的手(夹爪)眼睛(相机)进行标定。例如: 标定学习笔记(四)-- 手眼标定详解 手眼标定_全面细致的推导过程 本文主要描述多激光…...

SQL执行过程

1. select 语句执行过程 一条 select 语句的执行过程如上图所示 1、建立连接 连接器会校验你输入的用户名和密码是否正确,如果错误会返回提示,如果正确,连接器会查询当前用户对于的权限。连接器的作用就是校验用户权限 2、查询缓存 MySQL…...

K8S 部署 seata

文章目录 创建 Deployment 文件创建 ConfigMap 文件创建 Service 文件运行访问高可用部署踩坑 官方文档 k8s中volumeMounts.subPath的巧妙用法 创建 Deployment 文件 deploymemt.yaml namespace:指定命名空间image:使用 1.5.2 版本的镜像ports&#xf…...

ClickHouse:(二)数据类型

1.整型 固定长度的整型分为:有符号和无符合整型 有符号整型无符号整型类型范围类型范围Int8 -128 : 127 UInt8 0 : 255 Int16 -32768 : 32767 UInt16 0 : 65535 Int32 -2147483648 : 2147483647 UInt32 0 : 4294967295 Int64 -9223372036854775808 : 9223372036854…...

项目文档(request页面代码逻辑)

项目文档 目录 项目文档 1. 封装请求基地址 代码 2. 添加请求拦截器并设置请求头 作用 代码部分 3. 添加响应拦截器 作用 代码 4. token过期问题处理 5. 无感刷新 作用 代码 6. refresh_token过期处理 解决方式 1. 封装请求基地址 在src目录下 放上一个专门写…...

后端传到前端的JSON数据大写变小写--2023

问题复现:1. 首先我先说一下,我用了lombok,事实证明和这个也有关系 前端这里写的也是按照驼峰命名来写的 控制台打印出来的数据 后台打印出来的数据 解决方法: 1. 重写get/set方法 因为我在实体类上标注了Data注解 重写get/se…...

学习【菜鸟教程】【C++ 类 对象】【C++ 类的静态成员】

链接 1. 教程 可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时…...

计算机四大件笔记

啊~数据库、操作系统、计算机网络、Linux start 操作系统 并发和并行 并发是同一时间段内发生了多个事情,多任务之间互相抢占资源。 并行是在同一时间点内发生了多个事情,多任务之间不互相抢占资源,只有多CPU的情况下才能并行。 例如&a…...

【vue上传文件——hash】

vue上传文件 要求:只能上传视频,先计算文件的hash值,hash值一样则不需要上传,不一样在执行上传 分析:因为el-upload没有找到合适的属性,本次用的是原生的input的type属性为file上传 代码: html: 通过点击选取文件按钮调用input上传 js 第一步:点击上传文件先效验是否…...

【OpenCV DNN】Flask 视频监控目标检测教程 01

欢迎关注『OpenCV DNN Youcans』系列,持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 01 【OpenCV DNN】Flask 视频监控目标检测教程 01 1. 面向Python程序的Web框架2. Flask 框架的安装与使用2.1 Flask 安装2.2 Flask 框架例程2.3 绑定IP和端口2.4 Flask路…...

(转载)从0开始学matlab(第10天)—自顶向下的编程思想

在前面的内容中,我们开发了几个完全运转的 MATLAB 程序。但是这些程序都十分简单,包括一系列的 MATLAB 语句,这些语句按照固定的顺序一个接一个的执行。像这样的程序我们称之顺序结构程序。它首先读取输入,然后运算得到所需结果&a…...

mapreduce技术

要实现操作hbase数据表首先要了解它的原理: 1,Hbase原理篇 HBASE就是基于Hadoop的一个开源项目,也是对Google的BigTable的一种实现。 BigTable最浅显来看就是一张很大的表,表的属性可以根据需求去动态增加,但是又没有表与表之间…...

AI智慧安监视频平台EasyCVR视频出现不能播放的情况排查与解决

EasyCVR基于云边端协同,可支持海量视频的轻量化接入与汇聚管理。平台兼容性强、拓展度高,可提供视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、H.265自动转码、平台级联等功能。 有用户反…...

嵌入式学习之Linux驱动(第九期_设备模型_教程更新了)_基于RK3568

驱动视频全新升级,并持续更新~更全,思路更科学,入门更简单。 迅为基于iTOP-RK3568开发板进行讲解,本次更新内容为第九期,主要讲解设备模型,共计29讲。视频选集 0.课程规划 06:35 1.抛砖引玉-设备模型…...

LeetCode662.设计循环队列||4种方法实现

目录 题目 思路1(链表) 代码 思路2(数组) 代码 题目 题目要求的队列需要实现的功能有 ①Creat---设置队列长度 ②Front---获取队列头 ③Rear---获取队列尾 ④en----插入元素 ⑤de---删除元素 ⑥empty---判空 ⑦full---判满 思路1(链表) 🔍普通队列长度没有限制&…...

人工智能专栏第十二讲——依存解析

依存句法分析是一种自然语言处理技术,其目的是识别句子中单词之间的依赖关系。在自然语言处理中,依存句法分析是一项非常重要的任务,因为它可以帮助我们理解句子的语义结构,从而更好地进行文本分析、信息抽取、语音识别等任务。 …...

nest日志包pino、winston配置-懒人的折腾

nest日志 三种node服务端日志选型 winstonpinolog4js 2023年5月23日 看star数:winston > pino > log4js 使用体验: pino 格式简洁,速度快,支持输入日志到任意数据库,日志暂无自动清理(可能是我…...

一文看懂增值税发票识别OCR:从技术原理到 API Java 示例代码接入

引言 增值税发票识别OCR API是一项重要的技术创新,它在如今信息化的商业环境中发挥着重要作用。通过利用该API,企业和机构能够实现增值税发票的自动化识别和信息提取,从而在财务管理、票据核对、报销流程等方面带来许多好处。 本文将详细介…...

消息队列对比

目录 什么是消息队列 常用的消息队列工具对比 1 、ActiveMQ 2 、RabbitMQ 3、Kafka 4、 RocketMQ 什么是消息队列 消息队列是分布式应用间交换信息的重要组件,消息队列可驻留在内存或磁盘上, 队列可以存储消息直到它们被应用程序读走。通过消息队列&#xff0…...

Ceph对象存储的基本概念,使用以及优点

Ceph对象存储的基本概念,使用以及优点 Ceph是一种基于分布式架构的对象存储系统,它可以提供高可靠性、高扩展性和高性能的存储服务。这种存储系统可以用于处理大量的数据,例如大型数据库、云存储、视频流、图像数据等。Ceph对象存储系统的基…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...