【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵

专栏系列文章如下:
【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍
【视觉SLAM十四讲学习笔记】第二讲——初识SLAM

本章将介绍视觉SLAM的基本问题之一:如何描述刚体在三维空间中的运动

旋转矩阵

点、向量和坐标系

三维空间由3个轴组成,所以一个空间点的位置可以由3个坐标指定。而刚体,它不光有位置,还有自身的姿态。举个例子,相机也可以看成三维空间的刚体,于是位置是指相机在空间中的哪个地方,而姿态则是指相机的朝向,合起来称为位姿

点: 点是空间中的基本元素,没有长度,没有体积。

向量: 把两个点连接起来,就构成了向量。向量可以看成从某点指向另一点的一个箭头。不要把向量与它的坐标两个概念混淆。一个向量是空间当中的一样东西,并不需要和若干个实数相关联的。只有当我们指定这个三维空间中的某个坐标系时,才可以谈论该向量在此坐标系下的坐标,也就是找到若干个实数对应这个向量。简单来讲:向量本身就是一个东西,如果把它放在一个坐标系中,这个向量才有了对应于这个坐标系的坐标。

用线性代数的知识来说,三维空间中的某个点的坐标也可以用线性空间R^3来描述。假设在这个线性空间内,有该空间的一组基 (或者说基底)(e1,e2,e3),(基就是张成这个空间的一组线性相关的向量)那么,任意向量a在这组基下就有一个坐标,这里 (a1,a2,a3)T 称为a在此基下的坐标。公式如下:

img

坐标的具体取值,一是和向量本身有关,二是和坐标系(基)的选取有关。坐标系通常由3个正交的坐标轴组成,非正交的很少见。通常使用右手系,给定xy轴时,z 轴就可以通过右手法则由x × y定义出来。左手系的第3个轴与右手系的方向相反。

向量内积: 可以描述向量间的投影关系

img

其中<a,b>指向量a,b的夹角。

向量外积:

外积的结果是一个向量,它的方向垂直于这两个向量,大小为 |a||b|sin〈a,b〉,是两个向量张成的四边形的有向面积。

img

对于外积运算,我们引入∧符号,把a写成一个矩阵,事实上是一个反对称矩阵(Skew-symmetric matrix),反对称矩阵A满足AT = -A。你可以将∧记成一个反对称符号。这样就把外积a × b写成了矩阵与向量的乘法ab,把它变成了线性运算。这意味着任意向量都对应着唯一的一个反对称矩阵,反之亦然:

在这里插入图片描述

向量和加减法、内外积,即使在不谈论它们的坐标时也可以计算。例如,虽然内积在有坐标时,可以用两个向量的分量乘积之和表达,但是即使不知道它们的坐标时,也可以通过长度和夹角来计算二者的内积。所以两个向量的内积结果和坐标系的选取是无关的。

坐标系间的欧式变换

考虑运动的机器人,常见的做法是设定一个惯性坐标系(或者叫世界坐标系),可以认为它是固定不动的。相机或机器人则是一个移动坐标系。相机视野中某个向量p,它在相机坐标系下的坐标为pc,而在世界坐标系下看,它的坐标为pw。如果要实现这两个坐标之间的转换,需要先得到该点针对机器人坐标系的坐标值,再根据机器人位姿变换到世界坐标系中。我们需要一种数学手段来描述这个变换关系。

两个坐标系之间的运动由一个旋转加上一个平移组成,这种运动称为刚体运动。相机运动就是一个刚体运动。刚体运动过程中,同一个向量在各个坐标系下的长度和夹角都不会发生变化,只可能有空间位置和姿态的不同。此时,我们说刚体坐标系到世界坐标之间,相差了一个欧氏变换(Euclidean Transform)。

在这里插入图片描述

欧氏变换由旋转平移组成。首先考虑旋转,设某个单位正交基 (e1, e2, e3) 经过一次旋转变成了 (e1’, e2’, e3’) ,那么,对于同一个向量 a(该向量并没有随着坐标系的旋转而发生运动),它在两个坐标系下的坐标为[a1, a2, a3]T和[a1’, a2’, a3’]T。因为向量本身没变,根据坐标的定义,有:

img

为了描述两个坐标之间的关系,我们对上述等式的左右两边同时左乘

img

那么左边的系数就变成了单位矩阵,把中间的矩阵拿出来,定义成一个矩阵R:

img

这个矩阵由两组基之间的内积组成,刻画了旋转前后同一个向量的坐标变换关系。只要旋转是一样的,那么这个矩阵也是一样的。可以说,矩阵R描述了旋转本身。因此称为旋转矩阵(Rotation matrix)。该矩阵各分量是两个坐标系基的内积,由于基向量的长度为1,所以实际上是各基向量的夹角之余弦。所以这个矩阵也叫方向余弦矩阵(Direction Cosine matrix)。

旋转矩阵有一些特别的性质。它是一个行列式为1的正交矩阵。反之,行列式为1的正交矩阵也是一个旋转矩阵。以把 n 维旋转矩阵的集合定义如下:

img

SO(n) 是特殊正交群(Special Orthogonal Group)的意思。这个集合由n维空间的旋转矩阵组成,特别地,SO(3) 就是指三维空间的旋转。通过旋转矩阵,我们可以直接谈论两个坐标系之间的旋转变换,而不用再从基开始谈起。

由于旋转矩阵为正交矩阵,它的逆(即转置)描述了一个相反的旋转:

在这里插入图片描述

在欧氏变换中,除了旋转之外还有平移。考虑世界坐标系中的向量a,经过一次旋转(用R描述)和一次平移t后,得到了a′,把旋转和平移合到一起,有:
在这里插入图片描述

t称为平移向量。平移部分只需把平移向量加到旋转之后的坐标上。

通过上式,我们用一个旋转矩阵R和一个平移向量t完整地描述了一个欧氏空间的坐标变换关系。定义坐标系1、坐标系2,那么向量a在两个系下坐标为 a1, a2,它们之间的关系应该是:

在这里插入图片描述

R12 是指把坐标系2的向量变换到坐标系1中。同理,如果我们要表达从1到2的旋转矩阵时,就写成R21。关于平移t12,实际对应的是坐标系1原点指向坐标系2原点的向量,在坐标系1下取的坐标,把它记作从1到2的向量。但是反过来的t21,即从2指向1的向量在坐标系2下的坐标,并不等于−t12,这里和两个系的旋转还有关系。从向量层面来看,它们确实是反向的关系,但这两个向量的坐标值并不是相反数。

变换矩阵与齐次坐标

上面的变换关系并非一个线性关系,一旦变换多次就会非常繁杂。所以我们引入齐次坐标和变换矩阵:

在这里插入图片描述

这是一个数学技巧:我们在一个三维向量的末尾添加 1,将其变成了四维向量,称为齐次坐标。对于这个四维向量,我们可以把旋转和平移写在一个矩阵里面,使得整个关系变成线性关系。该式中,矩阵T称为变换矩阵(Transform Matrix)。

我们暂时用ã表示a的齐次坐标。那么依靠齐次坐标和变换矩阵,两次变换的叠加就可以有很好的形式:

在这里插入图片描述

但是懒得区分齐次和非齐次的符号了,所以在不引起歧义的情况下,我们就直接把它写成b=Ta的样子,默认其中进行了齐次坐标的转换。要注意的是,不进行齐次坐标转换时,这边的乘法在矩阵维度上是不成立的。

变换矩阵T具有比较特别的结构:左上角为旋转矩阵,右侧为平移向量,左下角为0 向量,右下角为 1。这种矩阵又称为特殊欧氏群(Special Euclidean Group):

img

与 SO(3) 一样,求解该矩阵的逆表示一个反向的变换:

&pos_id=img-bPvHSBFk-1700485941449)
同样,我们用T12 这样的写法来表示从2到1的变换。

总结:

首先介绍了向量及其坐标表示,并介绍了向量间的运算;然后,坐标系之间的运动由欧氏变换描述,它由平移和旋转组成。旋转可以由旋转矩阵 SO(3) 描述,而平移直接由一个R^3向量描述。最后,如果将平移和旋转放在一个矩阵中,就形成了变换矩阵 SE(3)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++数据结构:并查集

目录 一. 并查集的概念 二. 并查集的模拟实现 2.1 并查集类的声明 2.2 并查集的实现 三. 路径压缩 四. 总结 一. 并查集的概念 在生活中&#xff0c;我们经常需要对某一些事物进行归类处理&#xff0c;即&#xff1a;将N个不同的元素划分为几个互不相交的集合。在初始状态…

如何解决网站被攻击的问题:企业网络攻防的关键路径

在当今数字化时代&#xff0c;企业面临着不断升级的网络威胁&#xff0c;网站遭受攻击的风险也与日俱增。解决网站被攻击的问题对企业发展至关重要&#xff0c;不仅关系到企业的信息安全&#xff0c;也直接影响到企业的声誉和利益。从企业发展的角度出发&#xff0c;我们将探讨…

安装oracle19c卡在安装界面

我在个人window10电脑上安装 Oracle 19c 时遇到问题。解压后的数据库文件放在没有中文的文件目录下面&#xff0c;用管理员用户启动 CMD 窗口进行安装&#xff0c;但随后卡在菜单上。 取消安装之后去任务管理器中的服务里停掉OracleRemExecServiceV2服务。 用管理员运行CMD…

在VSCode创建vue项目,出现“因为在此系统上禁止运行脚本”问题

问题&#xff1a;vue : 无法加载文件 C:\Users\***\***\Roaming\npm\vue.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 ht tps:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 解决&#xff…

【23真题】超难985!做完感觉没学过!

本套试卷难度分析&#xff1a;22年西北工业大学827考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自取&#xff01;本套试题内容有难度&#xff0c;题目考察全为大题&#xff0c;题目不多&#xff01;但是题目都很新颖&#xff0c;状态方程的题目考察较…

企业实现员工聊天和转账行为的实时监管

如何解决企业营销团队的管理问题&#xff1f; 在当今竞争激烈的市场环境中&#xff0c;企业营销团队的管理显得尤为重要。营销团队是企业发展的重要支柱&#xff0c;然而&#xff0c;一些常见的问题如员工飞单、私单、辱骂删除客户、离职带走公司客户以及工作不认真、工作量无…

吐槽一个 R package :DSS

TMD&#xff01;&#xff01;&#xff01; 前言 最近在整理WGBS分析的流程&#xff0c;下游需要找 Differentially Methylated Loci (DML) / Region (DMR)&#xff0c;类似普通转录组中的差异分析。之前看的一篇文章提到一个R package &#xff1a; DSS&#xff0c;看Biocond…

虹科示波器 | 汽车免拆检修 | 1994款凯迪拉克fleetwood车发动机无法起动

一、故障现象 一辆1994款凯迪拉克fleetwood车&#xff0c;搭载5.7L发动机&#xff08;燃油系统采用进气歧管多点喷射&#xff0c;每个气缸都有独立的喷油器&#xff1b;点火系统只有一个点火线圈&#xff0c;带机械分电器和高压线&#xff09;&#xff0c;发动机无法起动。 二、…

【PCB学习】几种接地符号

声明 该图并非原创&#xff0c;原文出处不可考&#xff0c;因此在这里附加说明。 示意图

使用ssh在本地环境(Windows)连接虚拟机以及其中的docker容器

配置虚拟机防火墙 防火墙的一系列操作需要root权限&#xff0c;默认是没有root密码的&#xff0c;所以首先需要设置root密码&#xff1a; sudo passwd root按提示完成root密码设置 切换到root账户 su root启用22端口并重启防火墙 firewall-cmd --permanent --add-port22/tc…

Redis篇---第十篇

系列文章目录 文章目录 系列文章目录前言一、怎么提高缓存命中率&#xff1f;二、Redis 如何解决 key 冲突&#xff1f;三、Redis 报内存不足怎么处理&#xff1f; 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分…

基于饥饿游戏算法优化概率神经网络PNN的分类预测 - 附代码

基于饥饿游戏算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于饥饿游戏算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于饥饿游戏优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

FPGA系列:1、FPGA/verilog源代码保护:基于Quartus13.1平台保护verilog源码发给第三方但不泄露源码

catlog 需求具体步骤工程描述去掉相关调试文件切换顶层模块并导出相应模块为网表文件切换回原顶层模块并添加相应保护模块的qxp文件再次编译工程 参考&#xff1a; 需求 有时需要将源码交付给第三方&#xff0c;但是源码中部分模块涉及到的核心代码无法暴漏给第三方。因此&…

IIC总线逻辑

一、 我们习以为常的IIC通常是什么样子&#xff1f; 在我们研发/应用工程师眼中&#xff0c;IIC的形象通常是如图这样的吧&#xff1f;&#xff08;你们说是不是&#xff1f;&#xff09; 是的&#xff0c;对于理想的硬件调程序&#xff0c;这个层…

改进YOLOv8:结合ConvNeXt V2骨干网络!使用MAE共同设计和扩展ConvNet

🗝️YOLOv8实战宝典--星级指南:从入门到精通,您不可错过的技巧   -- 聚焦于YOLO的 最新版本, 对颈部网络改进、添加局部注意力、增加检测头部,实测涨点 💡 深入浅出YOLOv8:我的专业笔记与技术总结   -- YOLOv8轻松上手, 适用技术小白,文章代码齐全,仅需 …

开发仿抖音APP遇到的问题和解决方案

uni-app如何引入阿里矢量库图标/uniapp 中引入 iconfont 文件报错文件查找失败 uni-app如何引入阿里矢量库图标 - 知乎 uniapp 中引入 iconfont 文件报错文件查找失败&#xff1a;‘./iconfont.woff?t1673007495384‘ at App.vue:6_宝马金鞍901的博客-CSDN博客 将课件中的cs…

8.6 矢量图层点要素基于规则(Rule-based)渲染使用

文章目录 前言基于规则&#xff08;Rule-based&#xff09;QGis代码实现 总结 前言 前面介绍了矢量-点要素-单一符号、矢量-点要素-分类符号以及矢量-点要素-分级符号的使用本章介绍如何使用基于规则的渲染说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps …

Codeforces Round 908 (Div. 2)

一个教训&#xff1a;做题的时候一定要自己模拟一遍所有样例&#xff0c;这样思路出来的很快&#xff01;&#xff01;&#xff01; C. Anonymous Informant Example input Copy 6 5 3 4 3 3 2 3 3 100 7 2 1 5 5 6 1 1 1 1 1 1000000000 1 8 48 9 10 11 12 13 14 …

CTFHub Git泄露

Log 前言 根据题目描述&#xff0c;这个题目需要使用到工具 GitHack 来完成&#xff0c;而 CTFHub 上提供的工具需要在 python2 环境中执行&#xff0c;注意 python3 环境无法使用。 GitHack准备&#xff08;kali Linux&#xff09; 打开虚拟机 sudo su 以管理员的身份运行…

力扣刷题-二叉树-完全二叉树的节点个数

222.完全二叉树的节点个数 给出一个完全二叉树&#xff0c;求出该树的节点个数。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5,6] 输出&#xff1a;6 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;0 示例 3&#xff1a; 输入&#xff1a;root [1]…