三维空间刚体变换:变换矩阵_刚体变换矩阵_Jason.Li_0012的博客-程序员秘密

技术标签: 《视觉SLAM十四讲》笔记  线性代数  

变换矩阵

坐标系描述

A p B o ^Ap_{Bo} ApBo表示在参考坐标系 { A } \{A\} { A}下坐标系 { B } \{B\} { B}的原点坐标,并用旋转矩阵 B A R ^A_BR BAR描述坐标系 { B } \{B\} { B}在参考坐标系 { A } \{A\} { A}下的姿态,则坐标系 { B } \{B\} { B}的姿态可表示为:
{ B } = { A p B o B A R } \{B\}=\{\enspace^Ap_{Bo}\quad{}^A_BR\enspace\} { B}={ ApBoBAR}
坐标系的描述概括了刚体的位置和姿态的描述,当表示位置时,旋转矩阵 B A R = I {}^A_BR=I BAR=I;当表示姿态时,位移矢量 A p B o = 0 ^Ap_{Bo}=0 ApBo=0

平移映射

当两坐标系具有相同的方位,当坐标原点不重合时,可用位移矢量 A p B o ^Ap_{Bo} ApBo描述坐标系 { B } \{B\} { B}相对于坐标系 { A } \{A\} { A}的位置:

在这里插入图片描述

A p B o ^Ap_{Bo} ApBo为坐标系 { B } \{B\} { B}相对于 { A } \{A\} { A}的平移矢量,若点 p p p在坐标系 { B } \{B\} { B}下的位置为 B p ^Bp Bp,则它相对于坐标系 { A } \{A\} { A}的位置 A p ^Ap Ap可表示为:
A p = B p + A p B o {}^Ap={}^Bp+{}^Ap_{Bo} Ap=Bp+ApBo

旋转映射

当两坐标系原点重合,但方位不同时,可用旋转矩阵 B A R {}^A_BR BAR描述坐标系 { B } \{B\} { B}相对于坐标系 { A } \{A\} { A}的姿态:

在这里插入图片描述

B A R {}^A_BR BAR为坐标系 { B } \{B\} { B}相对于 { A } \{A\} { A}的方位,若点 p p p在坐标系 { B } \{B\} { B}下的位置为 B p ^Bp Bp,则它相对于坐标系 { A } \{A\} { A}的位置 A p ^Ap Ap可表示为:
A p = B A R   B p {}^Ap={}^A_BR\:{}^Bp Ap=BARBp
同样,用 A B R {}^B_AR ABR表示坐标系 { A } \{A\} { A}相对于 { B } \{B\} { B}的方位,则可由旋转矩阵的正交约束得:
A B R = B A R − 1 = B A R T {}^B_AR={}^A_BR^{-1}={}^A_BR^T ABR=BAR1=BART

一般刚体变换

在三维空间中,最常见的情况如下:坐标系 { B } \{B\} { B} { A } \{A\} { A}不但原点不重合,同时姿态也不相同。此时采用位移矢量 A p B o ^Ap_{Bo} ApBo描述坐标系 { B } \{B\} { B}相对于坐标系 { A } \{A\} { A}的位置,用旋转矩阵 B A R {}^A_BR BAR描述坐标系 { B } \{B\} { B}相对于坐标系 { A } \{A\} { A}的姿态:

在这里插入图片描述

则若点 p p p在坐标系 { B } \{B\} { B}下的位置为 B p ^Bp Bp,则它相对于坐标系 { A } \{A\} { A}的位置 A p ^Ap Ap可表示为:
A p = B A R   B p + A p B o {}^Ap={}^A_BR\:{}^Bp+{}^Ap_{Bo} Ap=BARBp+ApBo
也即,为旋转映射与平移映射的复合。先将坐标系 { B } \{B\} { B}根据旋转矩阵进行旋转,在沿着位移矢量进行平移。

将上式进行齐次变换,得到变换矩阵 B A T {}^A_BT BAT
[ A p 1 ] = [ B A R A p B o 0 1 ] [ B p 1 ] = B A T   B p \begin{bmatrix}{}^Ap\\1\end{bmatrix}=\begin{bmatrix}{}^A_BR&{}^Ap_{Bo}\\0&1\end{bmatrix}\begin{bmatrix}{}^Bp\\1\end{bmatrix}={}^A_BT\:{}^Bp [Ap1]=[BAR0ApBo1][Bp1]=BATBp
其中齐次变换矩阵 B A T {}^A_BT BAT 4 × 4 4\times4 4×4的矩阵,它表示了由坐标系 { B } \{B\} { B}到坐标系 { A } \{A\} { A}的变换关系:
B A T = [ B A R A p B o 0 1 ] {}^A_BT=\begin{bmatrix}{}^A_BR&{}^Ap_{Bo}\\0&1\end{bmatrix} BAT=[BAR0ApBo1]

齐次坐标

若一点的 p p p的坐标为 [ x y z ] T \begin{bmatrix}x&y&z\end{bmatrix}^T [xyz]T,则它的齐次坐标表示如下,齐次坐标并不唯一,可将隔行同乘一个常数 ω \omega ω表示的仍为同一坐标:
p = [ x y z 1 ] = [ ω x ω y ω z ω ] p=\begin{bmatrix}x\\y\\z\\1\end{bmatrix}=\begin{bmatrix}\omega x\\\omega y\\\omega z\\\omega\end{bmatrix} p=xyz1=ωxωyωzω
同时,规定坐标 [ 0 0 0 0 ] T \begin{bmatrix}0&0&0&0\end{bmatrix}^T [0000]T无意义,各个轴的无穷远处如下表示:
X 轴 : [ 1 0 0 0 ] Y 轴 : [ 0 1 0 0 ] Z 轴 : [ 0 0 1 0 ] 任 意 无 穷 远 处 : [ a b c 0 ] X轴:\begin{bmatrix}1\\0\\0\\0\end{bmatrix}\quad Y轴:\begin{bmatrix}0\\1\\0\\0\end{bmatrix}\quad Z轴:\begin{bmatrix}0\\0\\1\\0\end{bmatrix}\quad 任意无穷远处: \begin{bmatrix}a\\b\\c\\0\end{bmatrix} X:1000Y:0100Z:0010:abc0

变换矩阵运算与刚体群

运动算子

变换矩阵 B A T {}^A_BT BAT可分解为两个矩阵相乘的形式,其中用 T r a n s ( A p B o ) Trans({}^Ap_{Bo}) Trans(ApBo)表示平移变换矩阵,用 R o t ( k , θ ) Rot(k,\theta) Rot(k,θ)旋转变换矩阵:
B A T = [ B A R A p B o 0 1 ] = [ I 3 × 3 A p B o 0 1 ] [ B A R ( k , θ ) 0 0 1 ] = T r a n s ( A p B o ) R o t ( k , θ ) \begin{aligned} {}^A_BT =&\begin{bmatrix}{}^A_BR&{}^Ap_{Bo}\\0&1\end{bmatrix}\\ =&\begin{bmatrix}I_{3\times3}&{}^Ap_{Bo}\\0&1\end{bmatrix}\begin{bmatrix}{}^A_BR(k,\theta)&0\\0&1\end{bmatrix}\\ =&Trans({}^Ap_{Bo})Rot(k,\theta) \end{aligned} BAT===[BAR0ApBo1][I3×30ApBo1][BAR(k,θ)001]Trans(ApBo)Rot(k,θ)
T r a n s ( A p B o ) Trans({}^Ap_{Bo}) Trans(ApBo)表示沿着位移矢量 A p B o {}^Ap_{Bo} ApBo进行平移, R o t ( k , θ ) Rot(k,\theta) Rot(k,θ)则表示绕着过原点的轴 k k k旋转 θ \theta θ角。

平移算子

相对坐标系 { A } \{A\} { A},位移矢量 A p 1 {}^Ap_1 Ap1沿着 A p {}^Ap Ap移动至位移矢量 A p 2 {}^Ap_2 Ap2可用矢量相加表示:
A p 2 = A p 1 + A p {}^Ap_2={}^Ap_1+{}^Ap Ap2=Ap1+Ap
将其写为算子形式如下:
A p 2 = T r a n s ( A p )   A p 1 {}^Ap_2=Trans({}^Ap)\:{}^Ap_1 Ap2=Trans(Ap)Ap1
平移算子为 T r a n s ( A p ) Trans({}^Ap) Trans(Ap)表示沿着位移矢量 A p {}^Ap Ap的大小和方向进行平移。

旋转算子

相对坐标系 { A } \{A\} { A},某点由 A p 1 {}^Ap_1 Ap1旋转至 A p 2 {}^Ap_2 Ap2可表示为:
A p 2 = R   A p 1 {}^Ap_2=R\:{}^Ap_1 Ap2=RAp1
将其写为算子形式如下:
A p 2 = R o t ( k , θ )   A p 1 {}^Ap_2=Rot(k,\theta)\:{}^Ap_1 Ap2=Rot(k,θ)Ap1
旋转算子 R o t ( k , θ ) Rot(k,\theta) Rot(k,θ)表示沿着过原点的轴 k k k旋转角度 θ \theta θ

运动算子一般形式

齐次变换矩阵可用作为运动算子,描述某点在坐标系内的运动(包括平移和旋转)。当变换矩阵作为运动算子使用时,不带上、下标。

例如,质点 p p p在坐标系 { A } \{A\} { A}中的运动轨迹为时间 t t t的函数 A p ( t ) {}^Ap(t) Ap(t),其初始位置为 A p ( 0 ) {}^Ap(0) Ap(0),则用运动算子表示该质点的运动轨迹如下:
A p ( t ) = T ( t )   A p ( 0 ) {}^Ap(t)=T(t)\:{}^Ap(0) Ap(t)=T(t)Ap(0)

变换矩阵的运算

变换矩阵乘法

给定变换矩阵 B A T 、 C B T {}^A_BT、{}^B_CT BATCBT,则可以得到变换矩阵 C A T {}^A_CT CAT
C A T = B A T   C B T = [ B A R   C B R B A R   B p C o + A p B o 0 1 ] {}^A_CT={}^A_BT\:{}^B_CT=\begin{bmatrix}{}^A_BR\:{}^B_CR&{}^A_BR\:{}^Bp_{Co}+{}^Ap_{Bo}\\0&1\end{bmatrix} CAT=BATCBT=[BARCBR0BARBpCo+ApBo1]
也即,坐标系 { C } \{C\} { C}在坐标系 { A } \{A\} { A}中的位姿,可以拆为两步进行:先将坐标系 { C } \{C\} { C}转换至坐标系 { B } \{B\} { B}中的位姿;再将此位姿根据坐标系 { B } \{B\} { B} { A } \{A\} { A}的变换进行变换,从而得到最终变换矩阵。

变换矩阵乘法满足如下条件:

  • 运动相对固定坐标系而言:满足左乘规则,即变换顺序从右至左
  • 运动相对运动坐标系而言:满足右乘规则,即变换顺序从左至右
  • 变换的顺序不能调换进行

例如,对于一个变换矩阵 B A T = T r a n s ( 1 − 3 4 )   R o t ( y , 90 ° )   R o t ( z , 90 ° ) {}^A_BT=Trans(\begin{matrix}1&-3&4\end{matrix})\:Rot(y,90\degree)\:Rot(z,90\degree) BAT=Trans(134)Rot(y,90°)Rot(z,90°)

若相对固定坐标系(坐标系 { A } \{A\} { A})而言,采用左乘规则进行:首先绕 z A z_A zA轴旋转 90 ° 90\degree 90°,再绕 y A y_A yA轴旋转 90 ° 90\degree 90°,最后相对 { A } \{A\} { A}平移 [ 1 − 3 4 ] T \begin{bmatrix}1&-3&4\end{bmatrix}^T [134]T即可。

在这里插入图片描述

若相对于运动坐标系(坐标系 { B } \{B\} { B})而言,采用右乘规则进行:首先相对坐标系 { A } \{A\} { A}平移 [ 1 − 3 4 ] T \begin{bmatrix}1&-3&4\end{bmatrix}^T [134]T,再绕 y B y_B yB轴旋转 90 ° 90\degree 90°,最后绕 z B z_B zB轴旋转 90 ° 90\degree 90°即可。

在这里插入图片描述

变换矩阵求逆

若已知变换矩阵 B A T {}^A_BT BAT,此时需要求解坐标系 { A } \{A\} { A}相对于坐标系 { B } \{B\} { B}的变换 A B T {}^B_AT ABT,则需要对变换矩阵进行求逆。

此处利用齐次变换矩阵特点,简化计算:已知 B A T {}^A_BT BAT求解 A B T {}^B_AT ABT,只需要由 B A R {}^A_BR BAR A p B o {}^Ap_{Bo} ApBo求解 A B R {}^B_AR ABR B p A o {}^Bp_{Ao} BpAo即可。

首先,通过旋转矩阵正交约束知:
A B R = B A R − 1 = B A R T {}^B_AR={}^A_BR^{-1}={}^A_BR^T ABR=BAR1=BART
随后,根据平移映射关系,可知在坐标系 { A } \{A\} { A}下坐标系 { B } \{B\} { B}的原点 A p B o {}^Ap_{Bo} ApBo,在坐标系 { B } \{B\} { B}的坐标 B ( A p B o ) {}^B({}^Ap_{Bo}) B(ApBo)
B ( A p B o ) = A B R   A p B o + B p A o {}^B({}^Ap_{Bo})={}^B_AR\:{}^Ap_{Bo}+{}^Bp_{Ao} B(ApBo)=ABRApBo+BpAo
已知,在坐标系 { B } \{B\} { B}中,点 B o Bo Bo为原点,即上式右侧为零:
B p A o = − A B R   A p B o = − B A R T   A p B o {}^Bp_{Ao}=-{}^B_AR\:{}^Ap_{Bo}=-{}^A_BR^T\:{}^Ap_{Bo} BpAo=ABRApBo=BARTApBo
由此得到变换矩阵的逆矩阵:
A B T = [ B A R T − B A R T   A p B o 0 1 ] {}^B_AT=\begin{bmatrix}{}^A_BR^T&-{}^A_BR^T\:{}^Ap_{Bo}\\0&1\end{bmatrix} ABT=[BART0BARTApBo1]
易得: A B T = B A T − 1 {}^B_AT={}^A_BT^{-1} ABT=BAT1

刚体变换群

变换矩阵 T T T由旋转矩阵 R R R和位移矢量 t t t决定,也即任意刚体的位姿由 ( t , R ) : t ∈ ℜ 3 , R ∈ S O ( 3 ) (t,R):t\in\Re^{3},R\in SO(3) (t,R):t3,RSO(3)决定。

定义刚体变换群 S E ( 3 ) SE(3) SE(3)为乘积空间 ℜ 3 × S O ( 3 ) \Re^{3}\times SO(3) 3×SO(3)
S E ( 3 ) = { T = [ R t 0 T 1 ] ∈ ℜ 4 × 4 ∣ R ∈ S O ( 3 ) , t ∈ ℜ 3 } = ℜ 3 × S O ( 3 ) SE(3)=\bigl\{T=\begin{bmatrix}R&t\\0^T&1\end{bmatrix}\in \Re^{4\times4}\big\vert R\in SO(3),t\in\Re^{3}\bigr\}=\Re^{3}\times SO(3) SE(3)={ T=[R0Tt1]4×4RSO(3),t3}=3×SO(3)
S E ( 3 ) SE(3) SE(3)又称为三维空间的特殊欧式群(Special Euclidean Group ),推广到n维空间中可得:
S E ( n ) = { T = [ R t 0 T 1 ] ∈ ℜ n + 1 × n + 1 ∣ R ∈ S O ( n ) , t ∈ ℜ n } = ℜ n × S O ( n ) SE(n)=\bigl\{T=\begin{bmatrix}R&t\\0^T&1\end{bmatrix}\in \Re^{n+1\times n+1}\big\vert R\in SO(n),t\in\Re^{n}\bigr\}=\Re^{n}\times SO(n) SE(n)={ T=[R0Tt1]n+1×n+1RSO(n),tn}=n×SO(n)
S E ( n ) SE(n) SE(n)为李群,当n=2时, S E ( 2 ) SE(2) SE(2)表示刚体的平面运动,其单位元为 I 3 I_3 I3;当n=3时, S E ( 3 ) SE(3) SE(3)表示刚体

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45929038/article/details/122796956

智能推荐

Java多线程并发面试问答_淡定的蜗牛的博客-程序员秘密

Java并发面试问答什么是原子操作?Java并发API中的原子类是什么?原子操作在单个任务单元中执行,而不受其他操作的干扰。在多线程环境中,原子操作是必需的,以避免数据不一致。int++不是原子操作。因此,当一个线程读取其值并将其递增1时,另一线程读取了较早的值,从而导致错误的结果。为了解决这个问题,我们必须确保对count的增量操作是原子的,我们可以使用Synchronization做到...

Compilation Error 解决方案汇集 _compilation error怎么解决_德仔的博客-程序员秘密

<br />次遇见Compilation Error ,这次可就有办法对付了. 当然,这也算是一个BUG啦<br /><br /><br /><br />来源:http://www.dezai.cn/Blog/article.asp?id=386<br /><br />方案一:<br /><br />如果是在开发状态下编译出现Compilation <br />Error的话<br />(1)清理解决方案 Clean the <br />solution<br />(2)根据所报的错误提示,查找对应的页面划

this.$router.options.routes_多啦爱梦的梦想的博客-程序员秘密

this.$router.options.routes 可以拿到初始化时配置的路由规则this.$route 可以拿到当前路由信息 (包括路由路径,参数0

远程计算机凭据不对,三种办法助你解决远程桌面提示“您的凭据不工作”的问题..._weixin_39993322的博客-程序员秘密

随着电脑的使用率越来越高,我们可能会遇到远程桌面提示“您的凭据不工作”的问题,要怎么处理呢?详细解决方法如下:方法一:组策略编辑器设置身份验证1、打开组策略编辑器。找到开始---运行--输入gpedit.msc,打开注册表编辑器,然后依次找到菜单,计算机配置---管理模板---系统---凭据分配----允许分配保存的凭据用于NTLM服务器身份验证,2、选择“已启用”然后在“显示”里面...

Spleeter_隐夜拙的博客-程序员秘密

由于需要研究声源分离方向,然后拿效果比较好的spleeter开始研究.由于想要弄清楚里面的步骤,所以采用debug的模式来跟踪程序执行的过程.然后走的坑1:从命令行运行和从脚本运行的结果不同原因:从命令行运行的程序是我使用pip安装的spleeter,而从脚本运行的是我从github上面下的代码.由于需要debug,不打习惯从命令行调试,所以搞清楚输入的变量是什么之后,就直接将它赋值给了argv.不知道是不是坑的坑:spleeter里面自带了musdb18数据集的csv文件,然后mu

C++primer第九章 顺序容器 9.1 顺序容器概述 9.2容器库概览_元素初始化器_MY CUP OF TEA的博客-程序员秘密

一个容器就是一些特定类型对象的集合。顺序容器(sequentialcontainer)为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器 时的位置相对应。与之相对的,我们将在第11章介绍的有序和无序关联容器,则根据关键字的值来存储元素。 标准库还提供了三种容器适配器,分别为容器操作定义了不同的接口,来与容器类型适配。我们将在本章末尾介绍适配器。9.1顺序容器概述表9.1列出了标准库中的顺序容器,所有顺序容器都提供了快速顺序访问元素的能力。但是,这些容器在以下方

随便推点

量子学习及思考7-量子基本数学知识_aibo110110的博客-程序员秘密

NM的才刚入门就是一堆数学知识,可见数学才是一切科学的本源.所谓狗屁科学,只不过是数学的一个实例或者是一个近似的表达而已.越接近数学的,离正确性越近. 本人数学基础太垃圾,好在现在有互联网,本人说过,程序员+互联网=超人,有说过吗?有,只不过现在明确提出这个超人定理: 超人定理:超人=程序员+互联网 我们再看看其它的算法: 计算机系统=软件...

《阴阳师》分析_haobaworenle的博客-程序员秘密

现在基本进入弃坑模式,相信这样子心得会比较详细全面。  先说优点,正如宣传语一样“网易和风匠心巨制,开启唯美奇幻之旅”,最大的特色就是整个游戏纯和风。在动漫方面,日本数一数二毋庸置疑,其声优、画风等深得大部分大众喜爱。文化方面,剧情故事、卡牌角色、功能名称等根据日本的传说改编,玩家的联想就不会局限于国内的所见所闻。加上由于成本巨大,耗时漫长(据说阴阳师开发周期2年),开发周期这么久国内的游戏公

第6章 利用数组处理批量数据_powerful任的博客-程序员秘密

第6章 利用数组处理批量数据例1:对10个数组元素依次赋值为1,2,3,4,5,6,7,8,9,10,要求按顺序输出。#include &amp;lt;stdio.h&amp;gt;int main(){ int i,a[10]; for(i=1;i&amp;lt;=10;i++) //对数组元素a[0]-a[9]赋值 { a[i]=i; } for(i=1;i&amp;lt;=10;i++) /...

手把手教你学Python之机器学习基础_高成珍的博客-程序员秘密

目录1、机器学习概念2、机器学习分类3、机器学习应用场景4、机器学习常见算法5、机器学习的大致流程6、常见的机器学习库1、机器学习概念什么是机器学习?当前并没有一个统一的定义,常见的观点有:“机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能”; “机器学习是对能通过经验自动改进的计算机算法的研究”; “机器学习是用数据或以往的经验,以此优化计算机程序的性能标准”。这里重点把握几个关键词:经验(以往的数据)...

hql语句大全_hql由哪些句子组成_kkrgwbj的博客-程序员秘密

Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。  第 15 章 HQL: Hibernate查询语言 Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识

分布式集群中间件搭建(2): etcd集群搭建_etcd主从_王继红(男)的博客-程序员秘密

前言​ 本文主要介绍etcd的基本原理及基于CentOS模板机克隆搭建etcd集群。简介​ etcd这个名字源于两个想法,即unix “/etc” 文件夹和分布式系统”d”istibuted。 “/etc” 文件夹为单个系统存储配置数据的地方,而 etcd 存储大规模分布式系统的配置信息。因此,”d”istibuted 的 “/etc” ,故而称之为 “etcd”。​ etcd 是一个用Go编写的高可用 Key/Value 存储系统,分布式系统中最关键的数据的分布式、可靠的键值存储(配置文件基本格式