SLAM|2. 差异与统一:坐标系变换与外参标定

本章主要内容
1.坐标系变换
2.相机外参标定
上一章我们了解了相机内参的概念,内参主要解决三维世界与二维图像之间的映射关系。有了内参我们可以一定程度上还原相机看到了什么(但缺乏尺度)。但相机看到的数据只是处于相机坐标系,为局部观测,我们需要将局部观测转换到全局观测上,这就涉及坐标系间转换。将传感器坐标系观测转换到载体坐标系需要通过外参。本章将介绍坐标系转换及相机外参这两部分内容。

2.1 坐标系转换

在这里插入图片描述

如图6,对同一物体,在不同坐标系下便有不同坐标。那么如果知道A与B的相对位置关系,且知道树在A坐标系下的坐标,我们如何求出树在B坐标系下的坐标呢,这就涉及到坐标系转换的内容。
首先我们有一个人为设定的世界坐标系,任何物体在这个坐标系下有其固定的坐标,这个是不变的。而这个物体被相机观测到之后,在相机坐标系下会有一个观测坐标,如图6中的A,B,C,但这个观测是相对观测,只对当前的相机坐标系有意义,对其他观测者是没有意义的,因为它无法把这个信息转换为对自己有用的信息,只有当坐标能转化到世界坐标系这个公共坐标系下,其他观测者才能利用这次观测,从而达到对环境的“有效建模”。
那么如何转换呢,需要使用转换矩阵来完成。接下来我们会从最简单的二维坐标系变换开始,一步一步推导出三维坐标系之间坐标转换的计算方式。

2.1.1 二维纯旋转变换

在这里插入图片描述

假设XOY为固定的世界坐标系,X’OY’为活动坐标系,在XOY坐标系下有一点P(x,y),假设X’OY’相对于XOY旋转了θ度,则根据三角函数,可以得到在X’OY’下点P的坐标P’为

x ∗ = O D + D F = x × cos ⁡ ( θ ) + y × sin ⁡ ( θ ) y ∗ = P C − F C = y × cos ⁡ ( θ ) − x × sin ⁡ ( θ ) \mathbf{x}^{*}=\mathbf{O D}+\mathrm{DF}=\mathbf{x} \times \cos (\theta)+\mathbf{y} \times \sin (\theta) \\ \mathbf{y}^{*}=\mathbf{P C}-\mathrm{FC}=y \times \cos (\theta)-\mathbf{x} \times \sin (\theta) \\ x=OD+DF=x×cos(θ)+y×sin(θ)y=PCFC=y×cos(θ)x×sin(θ)

在这里插入图片描述

根据上述计算关系,我们也可以把P看做首先在X’OY’中测得的坐标,而XOY相对于X’OY’反向旋转了θ度(-θ),可以得到在活动坐标系下点P(x,y),在固定世界坐标系下坐标为
x ∗ = O D + D F = x × cos ⁡ ( − θ ) + y × sin ⁡ ( − θ ) = x × cos ⁡ ( θ ) − y × sin ⁡ ( θ ) y ∗ = P C − F C = y × cos ⁡ ( − θ ) − x × sin ⁡ ( − θ ) = y × cos ⁡ ( θ ) + x × sin ⁡ ( θ ) \mathbf{x}^{*}=\mathbf{O D}+\mathrm{DF}=\mathbf{x} \times \cos (-\theta)+\mathbf{y} \times \sin (-\theta)=\mathbf{x} \times \cos (\theta)-\mathbf{y} \times \sin (\theta) \\ \mathbf{y}^{*}=\mathbf{P C}-\mathbf{F C}=y \times \cos (-\theta)-\mathbf{x} \times \sin (-\theta)=y \times \cos (\theta)+\mathbf{x} \times \sin (\theta) \\ x=OD+DF=x×cos(θ)+y×sin(θ)=x×cos(θ)y×sin(θ)y=PCFC=y×cos(θ)x×sin(θ)=y×cos(θ)+x×sin(θ)

写为矩阵形式为

( x ∗ y ∗ ) = ( cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ) ( x y ) = R ( x y ) \left(\begin{array}{l} x^{*} \\ y^{*} \end{array}\right)=\left(\begin{array}{cc} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{array}\right)\left(\begin{array}{l} x \\ y \end{array}\right)=R\left(\begin{array}{l} x \\ y \end{array}\right) \\ (xy)=(cosθsinθsinθcosθ)(xy)=R(xy)
其中R为X’OY’在XOY坐标系下的旋转矩阵

2.1.2二维纯平移变换

两个坐标系只有平移变换,则坐标系转换很简单,如下
在这里插入图片描述

x ∗ = x + t x y ∗ = y + t y \mathbf{x}^{*}=\mathbf{x}+t_{x} \\ \mathbf{y}^{*}=\mathbf{y}+t_{y} \\ x=x+txy=y+ty

2.1.3二维坐标系变换

在这里插入图片描述

把上述旋转变换与平移变换结合在一起,就是二维坐标系变换
( x ∗ y ∗ ) = ( cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ) ( x y ) + ( t x t y ) \left(\begin{array}{l} x^{*} \\ y^{*} \end{array}\right)=\left(\begin{array}{cc} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{array}\right)\left(\begin{array}{l} x \\ y \end{array}\right)+\left(\begin{array}{l} t_{x} \\ t_{y} \end{array}\right) \\ (xy)=(cosθsinθsinθcosθ)(xy)+(txty)

2.1.4 最终坐标系变换-扩展到三维

二维的旋转,可以看做三维下只绕Z轴的旋转,其中Z坐标不变,旋转矩阵扩展为
( x ∗ y ∗ z ∗ ) = ( cos ⁡ θ − sin ⁡ θ 0 sin ⁡ θ cos ⁡ θ 0 0 0 1 ) ( x y z ) \left(\begin{array}{l} x^{*} \\ y^{*} \\ z^{*} \end{array}\right)=\left(\begin{array}{ccc} \cos \theta & -\sin \theta & 0 \\ \sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{array}\right)\left(\begin{array}{l} x \\ y \\ z \end{array}\right) \\ xyz = cosθsinθ0sinθcosθ0001 xyz
相应的,对于不同旋转,目前只需要记住中间有一个3X3的旋转矩阵就行(该矩阵有一个特殊性质,就是属于SO3群),而平移则是从二维变为三维就行了,最后三维变换:

( x ∗ y ∗ z ∗ ) = ( cos ⁡ θ − sin ⁡ θ 0 sin ⁡ θ cos ⁡ θ 0 0 0 1 ) ( x y z ) + ( t x t y t z ) = R ( x y z ) + t \left(\begin{array}{l} x^{*} \\ y^{*} \\ z^{*} \end{array}\right)=\left(\begin{array}{ccc} \cos \theta & -\sin \theta & 0 \\ \sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{array}\right)\left(\begin{array}{l} x \\ y \\ z \end{array}\right)+\left(\begin{array}{l} t_{x} \\ t_{y} \\ t_{z} \end{array}\right)=R\left(\begin{array}{l} x \\ y \\ z \end{array}\right)+t \\ xyz = cosθsinθ0sinθcosθ0001 xyz + txtytz =R xyz +t

但对于坐标系变换,常用齐次矩阵来表示,及把旋转变换与平移变换,放到一个矩阵里

( x ∗ y ∗ z ∗ 1 ) = ( cos ⁡ θ − sin ⁡ θ 0 t x sin ⁡ θ cos ⁡ θ 0 t y 0 0 1 t z 0 0 0 1 ) ( x y z 1 ) \left(\begin{array}{l} x^{*} \\ y^{*} \\ z^{*} \\ 1 \end{array}\right)=\left(\begin{array}{cccc} \cos \theta & -\sin \theta & 0 & t_{x} \\ \sin \theta & \cos \theta & 0 & t_{y} \\ 0 & 0 & 1 & t_{z} \\ 0 & 0 & 0 & 1 \end{array}\right)\left(\begin{array}{l} x \\ y \\ z \\ 1 \end{array}\right) \\ xyz1 = cosθsinθ00sinθcosθ000010txtytz1 xyz1

在原三维向量下,添加1后的坐标,称为齐次坐标,这个是几何变换中常用的数学技巧

a ∗ ~ = ( R t 0 1 ) a ~ \widetilde{a^{*}}=\left(\begin{array}{cc} R & t \\ 0 & 1 \end{array}\right) \widetilde{a} \\ a =(R0t1)a
于是可以简化到下面这种形式:

a 1 ~ = T 2 1 a 2 ~ \widetilde{a_{1}}=T_{2}^{1} \widetilde{a_{2}} \\ a1 =T21a2
其中T12称为变换矩阵,表示将坐标系2下的坐标,转换到1所需要变换。
在这里插入图片描述

使用坐标系变换,可以把相机坐标系(cam)下的坐标,转换到世界坐标系下。反之,也可以把世界坐标系下坐标,转换到相机坐标系下。

2.2 相机外参

2.2.1 定义

对于移动载体来说,相机只是载体的一个传感器,我们更感兴趣的是,通过相机观测到的物体,相对于载体而言,其坐标为什么。如果说相机坐标系为camera_link,那么载体坐标系为base_link,这二者之间存在一个变换矩阵,通常用camera_link到base_link的欧式转换表示,而这个变换矩阵,就是常说的相机外参。使用外参矩阵,可以把相机坐标系下看到的点转换到机器人坐标下。
通俗来讲,相机外参描述了相机安装在载体的什么地方,安装角度是怎样的。
如下图,相机0与相机1均不与飞行器本体坐标系重叠,假设相机0安装在本体坐标系的t处(平移),旋转矩阵为R,则其外参为(R,t)。通过相机外参,可以把相机观测转换到飞行器本体坐标系的观测中。
在这里插入图片描述

2.2.2 相机外参的标定

如果知道相机相对于载体坐标系安装的位置与角度,是可以直接得到相机外参的,但是,由于机械安装的误差,或者运动过程的变形,这个外参是会改变的。为了获取此时的外参,常借助于一些外参标定工具,常见的外参标定工具有如下几种:
OpenCV
OpenCV除了提供相机内参标定外,也提供了相机外参标定的功能。通过拍摄已知的三维空间点的图像,并利用这些点在相机坐标系下的三维坐标,可以计算相机的位姿。
Matlab
Matlab也提供了相机外参标定的工具箱,其中包括了单目和立体相机的标定工具。通过拍摄已知的三维空间点的图像,可以计算相机的位姿。
Kalibr
Kalibr是ETH Zurich的一个开源相机标定工具,支持单目、双目和多目相机标定。Kalibr使用基于优化的方法来计算相机的位姿,同时也可以进行相机和IMU的联合标定。

2.2.3 外参标定的意义

相机外参标定确定了相机在世界坐标系中的位置和朝向,这些信息可以用于将图像中的点转换为世界坐标系中的点,或者将世界坐标系中的点转换为图像中的点。因此,外参标定对于相机视觉算法的准确性和稳定性有着重要的影响。以下是外参标定对算法的几个方面的影响:
(一) 特征匹配:在进行特征匹配时,需要将图像中的特征点匹配到世界坐标系中的点。如果外参标定不准确,将导致匹配错误,从而影响算法的准确性。
(二) 三维重建:在进行三维重建时,需要将多张图像中的点匹配到世界坐标系中的点,并进行三维重建。如果外参标定不准确,将导致重建的几何形状不准确或者出现扭曲。
(三) 目标跟踪:在进行目标跟踪时,需要将跟踪目标在多张图像中的位置匹配到世界坐标系中的点,并进行跟踪。如果外参标定不准确,将导致跟踪不准确或者跟踪失败。
(四) 相机姿态估计:在进行相机姿态估计时,需要将相机在多张图像中的位置和朝向匹配到世界坐标系中的点,并进行姿态估计。

2.2.4 相机标定类型

相机标定是指确定相机内部参数和外部参数的过程,以便在图像中恢复真实世界中的几何信息。常用的相机标定类型包括以下几种:
(一) 内部标定:用于确定相机的内部参数,包括焦距、主点位置、畸变系数等。内部标定通常使用标定板等已知几何形状的物体,并采用校正方法进行计算。
(二) 外部标定:用于确定相机在世界坐标系中的位置和方向。外部标定通常使用已知位置的标定板或者其他几何形状的物体,并采用三维重建方法进行计算。
(三) 传感器到传感器标定:用于确定多个相机之间的相对位置和方向,以便进行双目或多目视觉处理。传感器到传感器标定通常使用标定板或者球形标定物等,采用立体匹配算法进行计算。
(四) 传感器到车体标定:用于确定相机在车体坐标系中的位置和方向,以便进行车载视觉处理。传感器到车体标定通常使用车体固定的标定板或者其他几何形状的物体,采用三维重建方法进行计算。
(五) 姿态标定:用于确定相机在平面或者空间中的朝向,以便进行视觉导航或者机器人控制。姿态标定通常使用旋转平台或者陀螺仪等设备,采用角度解算方法进行计算。
(六) 相机-激光雷达标定:用于确定相机和激光雷达之间的相对位置和方向,以便进行三维点云重建或者障碍物检测。相机-激光雷达标定通常使用已知几何形状的标定板或者球形标定物,采用多视角几何约束方法进行计算。
(七) 相机-IMU标定:用于确定相机和惯性测量单元(IMU)之间的相对位置和方向,以便进行惯性辅助导航或者姿态估计。相机-IMU标定通常使用运动平台或者旋转平台等设备,采用卡尔曼滤波或者优化方法进行计算。

本章小结

本章主要介绍如何将相机坐标系下观测,转换到其他坐标系(如载体坐标系),紧接着介绍了相机外参。相机外参主要作用是将相机的局部观测转到载体坐标系下。载体在世界坐标系中不断运动,如何描述载体在世界坐标系下姿态,见下一章。

本章思考

1.相机外参的作用是什么?
2.一个载体搭载着摄像头,在平面上运动,相机外参【t(x,y,z)与R(roll,pitch,yaw)】哪些量不可以被标定出来?
附录

  1. 摄像机外参标定
    求解相机的内、外参数矩阵,描述了三维世界到二维像素的映射关系
    在这里插入图片描述

其中的 θ \theta θ为单个像素两条边的夹角,一般我们认为这个角度为90°,早期对于一些加工不好的传感器,像素可能会是平行四边形。
M矩阵有11个未知量,求解投影矩阵需要最少六对点对应,但实操时一般使用多于六对点获得更鲁棒的效果
径向畸变:图像像素点以畸变中心为中心点,沿着径向产生的位置偏差,从而导致图像中所成的像发生形变
产生原因:光线在远离透镜中心的地方比靠近中心的地方更加弯曲
图像放大率随距光轴距离的增加而减小

在这里插入图片描述

2 提取摄像机参数
将投影矩阵M拆分开,参数分为内参数与外参数。
在这里插入图片描述

对于这里的 ρ \rho ρ,是一个标量,因为我们求得的解,其实会与实际的解相差一个系数,该系数由 ρ \rho ρ表示。
2.1 提取摄像机内参数u、v与θ
在这里插入图片描述

其中A与b分别为
在这里插入图片描述

带入其中得
在这里插入图片描述

其中K、R、T分别为
在这里插入图片描述

计算得
在这里插入图片描述

利用正交性质,将两行对应相乘
在这里插入图片描述

求相应的模,可得
在这里插入图片描述

自己点乘自己,可得
在这里插入图片描述

得到θ
在这里插入图片描述

最后得到α与β
在这里插入图片描述

2.2 提取摄像机外参数r1、r2与r3
在这里插入图片描述

再求得外参数T
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt6聊天室项目】 主界面功能实现

1. 获取当前用户的个人信息 1.1 前后端逻辑分析(主界面功能) 主界面上所有的前后端交互逻辑相同,分析到加载会话列表后其余功能仅实现。 核心逻辑总结 异步请求-响应模型 客户端发起请求,向服务器发送包含会话ID的请求服务端处…

ASP.NET Core 8.0 中使用 Hangfire 调度 API

在这篇博文中,我们将引导您完成将 Hangfire 集成到 ASP.NET Core NET Core 项目中以安排 API 每天运行的步骤。Hangfire 是一个功能强大的库,可简化 .NET 应用程序中的后台作业处理,使其成为调度任务的绝佳选择。继续阅读以了解如何设置 Hang…

计算机毕业设计PySpark+大模型高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

基于Spark的高考报名信息推荐系统 系统用到的各项技术和工具的介绍: 1. Python Python是一种高级的、解释型的程序设计语言,因为其简洁而易学、可读性强等特点,在数据处理、人工智能、机器学习、Web开发等领域得到了广泛运用。在该系统中…

php AES 加解密(支持在线运行)

https://andi.cn/page/621792.html 这篇文章不仅给出了 php AES 加解密代码,而且可以在线运行来对数据进行加解密,满足实际中的一些需求。

C语言初阶七:C语言操作符详解(1)

#1024程序员节|征文# 这篇文章是对之前文章中操作符的补充,可以看之前的文章:C语言初阶:六.算数操作_如何用编程表示除法-CSDN博客 C语言操作符是用于执行各种运算和操作的符号。包括算术操作符(如、-、*、/、%)&#…

Python URL编码

在 Python 中,可以使用 urllib.parse模块对 URL 进行编码。 一、依赖安装 pip install urllib 二、URL编码 from urllib.parse import quoteurl rhttps://myshop.com/shop/shopList?query query {"id":14,"pageSize":10,"pageNum&quo…

[软件工程]—桥接(Brige)模式与伪码推导

桥接(Brige)模式与伪码推导 1.基本概念 1.1 动机 由于某些类型的固有的实现逻辑,使它们具有两个变化的维度,乃至多个维度的变化。如何应对这种“多维度的变化”?如何利用面向对象技术是的类型可以轻松的沿着两个乃至…

新鲜出炉面试题之【说说spring spring MVC spring boot的区别】

Spring MVC 和 Spring Boot 是 Spring 框架的一部分,但它们的目的和用途有所不同。下面详细阐述这两者之间的区别。 1. 概念 Spring MVC: Spring MVC 是一种基于请求-响应模式的 Web 框架,属于 Spring 框架的一部分。它提供了一种分离的方式…

html 轮播图效果

轮播效果: 1、鼠标没有移入到banner,自动轮播 2、鼠标移入:取消自动轮播、移除开始自动轮播 3、点击指示点开始轮播到对应位置 4、点击前一个后一个按钮,轮播到上一个下一个图片 注意 最后一个图片无缝滚动,就是先克隆第一个图片…

【树莓派系统安装】Raspberry Pi OS操作系统烧录与VNC远程树莓派实战

文章目录 前言1. 使用 Raspberry Pi Imager 安装 Raspberry Pi OS2. Windows安装VNC远程树莓派3. 使用VNC Viewer公网远程访问树莓派3.1 安装Cpolar步骤3.2 配置固定的公网地址3.3 VNC远程连接测试 4. 固定远程连接公网地址4.1 固定TCP地址测试 前言 本文主要介绍如何在树莓派…

Linux使用Dockerfile部署Tomcat以及jdk

资源准备 首先提供本教程所有资源包。 当然也可以根据自己需求去官网下载。 链接:百度网盘 请输入提取码 提取码:f31y #我们开始吧 首先我们需要一台linux操作系统的机器,当然windows也是可以的,本系列教程是基于Linux的&#…

利用数据库过滤和元数据提取提升多跳查询的RAG性能

人工智能咨询培训老师叶梓 转载标明出处 大模型在处理需要从多个文档中检索和推理信息的多跳查询时,常常表现不佳,因为它们需要从多个来源检索和推理证据。图1展示了一个简单的RAG实现用于MultiHop-RAG查询。图中显示了用户查询、嵌入向量数据库、提示&…

解决:git SSL certificate problem: unable to get local issuer certificate

在使用Git进行代码交流和版本控制过程中,可能会遇到SSL证书问题。这通常是由于Git客户端无法验证SSL证书的合法性而引起的。当我们尝试与Git服务器建立安全连接时,Git客户端将会验证服务器端提供的SSL证书是否由受信任的证书颁发机构(Certifi…

三数之和(15)

打回现实的一道题 思路:先将数组进行排序 遍历数组,使用left标记i1,right标记nums.length-1 如果三数之和(nums[i]nums[left]nums[right])大于0,right--,如果小于0,left 注意:1、使用set集合进行去重 2、找到…

链路分析对性能测试的意义

目录 一、白盒能力的提升 二、人员技术门槛的提升 链路分析的出现对测试工程师也带来了不同的影响,能实际提升测试工程师的分析能力,但是需要测试工程师具备主动的自我提升意识。 一、白盒能力的提升 传统的性能测试主要以TPS、响应时间、成功率等用户…

【工具】Ghidra|Ghidra 安装过程以及脚本运行方式

文章目录 前言安装 java下载 Ghidra打开 Ghidra 使用 Ghidra步骤 1:打开 Ghidra 并加载项目步骤 2:打开 Script Manager步骤 3:新建脚本并编写代码步骤 4:保存脚本步骤 5:运行脚本注意事项 前言 我的用途:…

【Prometheus】为Prometheus设置basic_auth访问权限

Prometheus目前已经成为国、内外互联网行业,一款非常知名的免费监控工具,我们可以通过它,以及Prometheus官方、第三方提供的一些exporter工具,对系统、中间件、数据库等一系列的软、硬件的运行数据,进行采集、存储、监…

【在Win11下安装ubuntu +图形化界面】

在win11下安装ubuntu 一、安装流程1. 前期准备:先配置好基础设置2. 安装 ubuntu3. ubuntu进行配置4. 下载图形化界面 并安装 二、遇到的问题问题1. win11安装wsl报错:无法解析服务器的名称或地址1. 方法一:更改DNS(对本人无效&…

Java8中Stream、Function、Opotions特性使用案例

所有数据都基于UserInfo类&#xff0c;其中包含了 userId、userName、course、score 等字段&#xff0c;下面是如何使用Options、 Stream 、Function来处理 UserInfo 对象列表的一些示例 List<UserInfo> userInfoList Arrays.asList(new UserInfo(1L, "Alice"…

闯关leetcode——206. Reverse Linked List

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/reverse-linked-list/ 内容 Given the head of a singly linked list, reverse the list, and return the reversed list. Example 1: Input: head [1,2,3,4,5] Output: [5,4,3,2,1] Example 2:…