技术标签: 《视觉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)表示刚体
强化学习(主要基于Sutton-RLbook2020)学习笔记。本节我们继续基于基于多臂老虎机问题的不同epsilon-greedy的另一种行动选择方法:Upper Confidence Bound action selection
点是否在多边形内,是一个很经典的问题,方法也很成熟,但是去github或网上找的资料感觉有些乱,我在他们基础上做了整理,点是否在多边形内的判别方法有多种,其算法具体原理在此不赘述,有比较好的博客,我一并放置在此。我要做的是使用射线法来判断点是否在多边形内部并使用C语言实施了其判定过程。 射线判别法原理如下: 从目标点出发引一条射线,看这条射线和多边...
开篇介绍个人背景:不说太多废话,但起码要让你先对我有一个基本的了解。本人毕业于浙江某二本院校,算是科班出身,毕业后就进了一家外包公司做开发,当然不是阿里的外包,具体什么公司就不透露了,在外包一呆就呆了整整2年多,直到现在才从外包离开,如今拿到阿里的offer准备入职了。阐述原因:在外包公司的两年里,作为一名菜鸡,确实非常合格,技术没什么长进,眼见也没有提升,没规划没未来,让人实在焦虑,之所以开始改变自己也是家庭发生了变故,才让自己开始思考人生。身边很多人感叹过,能从外包逆袭,算是传奇,所以今天想要分
.NET Core 应用程序部署分为2中情况: 依赖框架的部署。顾名思义,依赖框架的部署 (FDD) 依赖目标系统上存在共享系统级版本的 .NET Core。由于已存在 .NET Core,因此应用在 .NET Core 安装程序间也是可移植的。应用仅包含其自己的代码和任何位于 .NET Core 库外的第三方依赖项。FDD 包含可通过在命令行中使用dotnet 实用程序启动的....
Unity的ShaderGraph插件,我决定把我自己实验的所有效果记录到这篇博客中,附带完整高清的连线动态图,希望对想要学习ShaderGraph的同学有所启发。
效果图功能分解动画计算高度组件源码<template> <div class="ys-message-wrapper animated fadeInDown"> <div class="ys-message-toast"> <img :src="currentType" alt=""
分享第一份Java基础-中级-高级面试集合Java基础(对象+线程+字符+接口+变量+异常+方法)Java中级开发(底层+Spring相关+Redis+分布式+设计模式+MySQL+高并发+锁+线程)Java高级“程序猿”(高并发+Redis缓存+分布式+消息队列+高可用+微服务+分库分表+读写分离)高并发系列(经典面试题:如何设计一个高并发系统?)Redis缓存系列分布式系列消息队列系列高可用系列微服务系列分库分表系列读写分离系列… …Java高
实现QML中运用webEngineView加载EchartsGitHub:八至作者:狐狸家的鱼本文链接:QML-WebEngineView加载Echarts一、前言Qt允许使用混合GUI创建应用程序,甚至支持通过webChannel和webSockets与HTML端的交互。关于如何显示HTML内容,可以有三种方式:使用WebEngi...
大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。微机中运算器的主要功能是算术和逻辑运算和逻辑运算,运算器的处理对象是数据,所以数据长度和计算机数据表示方法,对运算器的性能影响极大。运算器由算术逻辑单元(ALU)、累加器、状态寄存器、通用寄存器组等组成。算术逻辑运算单元(ALU)的基本功能为加、减、乘、除四则运算,与、或、非、异或等逻辑操作,以及移位、求补等操作。计算机运行时,运...
文章目录前言手机商城一、 登录二、 商品列表查询三、 商品详情四、 添加到购物车五、 立即购买六、 展示购物车商品七、 访问足迹参考代码:总结前言大家好,我是ChinaManor,直译过来就是中国码农的意思,我希望自己能成为国家复兴道路的铺路人,大数据领域的耕耘者,平凡但不甘于平庸的人。下面是本码农在学习Java基础做的练习题,发出来希望给各位萌新学java有所帮助需要用到的Jar包链接:https://pan.baidu.com/s/1Y4CT_ePPKc2lDdh_ylMCe
2019独角兽企业重金招聘Python工程师标准>>> ...
简介:DouPHP是一款轻量级企业网站管理系统,基于PHP+Mysql架构,可运行在Linux、Windows、MacOSX、Solaris等各种平台上,采用Smarty模板引擎,支持自定义伪静态,前台模板DIV+CSS设计,后台界面设计简洁明了,具有良好的用户体验,稳定性好、扩展性及安全性强,面向中小型站点提供网站建设解决方案网盘下载地址:http://kekewangLuo.cc/zVzTXHjDW6z0图片:...