技术标签: 《视觉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=BAR−1=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轴:⎣⎢⎢⎡1000⎦⎥⎥⎤Y轴:⎣⎢⎢⎡0100⎦⎥⎥⎤Z轴:⎣⎢⎢⎡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 BAT、CBT,则可以得到变换矩阵 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(1−34)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 [1−34]T即可。
若相对于运动坐标系(坐标系 { B } \{B\} { B})而言,采用右乘规则进行:首先相对坐标系 { A } \{A\} { A}平移 [ 1 − 3 4 ] T \begin{bmatrix}1&-3&4\end{bmatrix}^T [1−34]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=BAR−1=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=[BART0−BARTApBo1]
易得: A B T = B A T − 1 {}^B_AT={}^A_BT^{-1} ABT=BAT−1
变换矩阵 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):t∈ℜ3,R∈SO(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×4∣∣R∈SO(3),t∈ℜ3}=ℜ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+1∣∣R∈SO(n),t∈ℜn}=ℜ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)表示刚体
Java并发面试问答什么是原子操作?Java并发API中的原子类是什么?原子操作在单个任务单元中执行,而不受其他操作的干扰。在多线程环境中,原子操作是必需的,以避免数据不一致。int++不是原子操作。因此,当一个线程读取其值并将其递增1时,另一线程读取了较早的值,从而导致错误的结果。为了解决这个问题,我们必须确保对count的增量操作是原子的,我们可以使用Synchronization做到...
<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.$route 可以拿到当前路由信息 (包括路由路径,参数0
随着电脑的使用率越来越高,我们可能会遇到远程桌面提示“您的凭据不工作”的问题,要怎么处理呢?详细解决方法如下:方法一:组策略编辑器设置身份验证1、打开组策略编辑器。找到开始---运行--输入gpedit.msc,打开注册表编辑器,然后依次找到菜单,计算机配置---管理模板---系统---凭据分配----允许分配保存的凭据用于NTLM服务器身份验证,2、选择“已启用”然后在“显示”里面...
由于需要研究声源分离方向,然后拿效果比较好的spleeter开始研究.由于想要弄清楚里面的步骤,所以采用debug的模式来跟踪程序执行的过程.然后走的坑1:从命令行运行和从脚本运行的结果不同原因:从命令行运行的程序是我使用pip安装的spleeter,而从脚本运行的是我从github上面下的代码.由于需要debug,不打习惯从命令行调试,所以搞清楚输入的变量是什么之后,就直接将它赋值给了argv.不知道是不是坑的坑:spleeter里面自带了musdb18数据集的csv文件,然后mu
一个容器就是一些特定类型对象的集合。顺序容器(sequentialcontainer)为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值,而是与元素加入容器 时的位置相对应。与之相对的,我们将在第11章介绍的有序和无序关联容器,则根据关键字的值来存储元素。 标准库还提供了三种容器适配器,分别为容器操作定义了不同的接口,来与容器类型适配。我们将在本章末尾介绍适配器。9.1顺序容器概述表9.1列出了标准库中的顺序容器,所有顺序容器都提供了快速顺序访问元素的能力。但是,这些容器在以下方
NM的才刚入门就是一堆数学知识,可见数学才是一切科学的本源.所谓狗屁科学,只不过是数学的一个实例或者是一个近似的表达而已.越接近数学的,离正确性越近. 本人数学基础太垃圾,好在现在有互联网,本人说过,程序员+互联网=超人,有说过吗?有,只不过现在明确提出这个超人定理: 超人定理:超人=程序员+互联网 我们再看看其它的算法: 计算机系统=软件...
现在基本进入弃坑模式,相信这样子心得会比较详细全面。 先说优点,正如宣传语一样“网易和风匠心巨制,开启唯美奇幻之旅”,最大的特色就是整个游戏纯和风。在动漫方面,日本数一数二毋庸置疑,其声优、画风等深得大部分大众喜爱。文化方面,剧情故事、卡牌角色、功能名称等根据日本的传说改编,玩家的联想就不会局限于国内的所见所闻。加上由于成本巨大,耗时漫长(据说阴阳师开发周期2年),开发周期这么久国内的游戏公
第6章 利用数组处理批量数据例1:对10个数组元素依次赋值为1,2,3,4,5,6,7,8,9,10,要求按顺序输出。#include &lt;stdio.h&gt;int main(){ int i,a[10]; for(i=1;i&lt;=10;i++) //对数组元素a[0]-a[9]赋值 { a[i]=i; } for(i=1;i&lt;=10;i++) /...
目录1、机器学习概念2、机器学习分类3、机器学习应用场景4、机器学习常见算法5、机器学习的大致流程6、常见的机器学习库1、机器学习概念什么是机器学习?当前并没有一个统一的定义,常见的观点有:“机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经验学习中改善具体算法的性能”; “机器学习是对能通过经验自动改进的计算机算法的研究”; “机器学习是用数据或以往的经验,以此优化计算机程序的性能标准”。这里重点把握几个关键词:经验(以往的数据)...
Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。 第 15 章 HQL: Hibernate查询语言 Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识
前言 本文主要介绍etcd的基本原理及基于CentOS模板机克隆搭建etcd集群。简介 etcd这个名字源于两个想法,即unix “/etc” 文件夹和分布式系统”d”istibuted。 “/etc” 文件夹为单个系统存储配置数据的地方,而 etcd 存储大规模分布式系统的配置信息。因此,”d”istibuted 的 “/etc” ,故而称之为 “etcd”。 etcd 是一个用Go编写的高可用 Key/Value 存储系统,分布式系统中最关键的数据的分布式、可靠的键值存储(配置文件基本格式