视觉SLAM十四讲 第3讲 三维空间刚体运动

  • 1. 刚体
  • 2. 欧氏空间(euclidean space)
    • 2.1 欧氏距离:
    • 2.2 欧氏变换:
  • 3. 笛卡尔坐标系
  • 4. 透视空间
  • 5. 齐次坐标系
    • 5.1 问题:两条平行线可以相交于一点?
    • 5.2 为什么叫齐次?
  • 6. 关于Eigen
  • 7. 基础知识
    • 7.1 点和向量
    • 7.2 点乘和叉乘
  • 8. 旋转矩阵相乘的含义
  • 9. 变换矩阵Transform Matrix
  • 10. 旋转向量、欧拉角、四元数
    • 10.1 旋转向量和旋转矩阵
      • 10.1.1 旋转向量和旋转矩阵Eigen
    • 10.2 欧拉角
    • 10.3 万向锁
      • 10.3.1 如何理解万向锁?
    • 10.4 四元数
      • 10.4.1 加法
      • 10.4.2 乘法
      • 10.4.3 模长
      • 10.4.4 共轭
      • 10.4.5 逆

本文不以书上的知识点流程进行记录,而是将初学SLAM一些相关却又比较陌生的知识点、名词进行总结,然后再记录第3讲的相关知识。

1. 刚体

刚体rigid body,指在运动或受力的过程中,形状和大小不变,各个质点的相对位置不变

2. 欧氏空间(euclidean space)

欧几里得空间就是对现实空间的规则抽象和推广(从n<=3推广到有限n维空间)

简单来说所有满足从2维、3维推出的内积、距离、角的定义的空间都叫做欧氏空间。

2.1 欧氏距离:

d ( x , y ) = ( x 1 − y 1 ) 2 + ( x 2 − y 2 ) 2 + ⋯ + ( x n − y n ) 2 d(x, y) = \sqrt{ (x_1-y_1)^2 + (x_2-y_2)^2 + \dots + (x_n-y_n)^2 } d(x,y)=(x1​−y1​)2+(x2​−y2​)2+⋯+(xn​−yn​)2 ​

2.2 欧氏变换:

欧氏变换由旋转和平移组成

非欧几里得空间:二维扁平智能生物
https://www.zhihu.com/question/27903807

3. 笛卡尔坐标系

又称直角坐标系、正交坐标系。笛卡尔坐标系的研究结合了代数和欧几里得几何,对于后来的解析几何、微积分和地图学的发展,具有关键性的意义。

4. 透视空间

透视从理论上直观的解释了物体在平面(2维)上呈现三维空间的基本原理和规律。方法有单点透视、空气透视和散点透视。更多的是绘画上的概念。

可以直接把透视空间理解为3维空间往某个方向、平面,拍扁成2维平面所形成的图像

5. 齐次坐标系

5.1 问题:两条平行线可以相交于一点?

在欧式空间中,同一平面的两条平行线不能相交,但是透视空间中可以,比如火车轨道随着我们的实现越来越窄,最后两条平行线在无穷远处交于一点。

这个点的坐标是消失点(无穷,无穷),这在欧式空间中没有意义。

简而言之,齐次坐标系,就是用N+1维向量(矩阵)来表示N维向量(矩阵),而转化回笛卡尔坐标系就是用前N-1个元素除以第N个元素即可。齐次坐标系就是为了解决,平行线在透视空间相交且相交点在欧式空间没有意义的问题

笛卡尔坐标系(a, b) -> 齐次坐标系(x, y, w)
其中a = x / w, b = y / w

5.2 为什么叫齐次?

(4, 6, 2)和(2, 3, 1)对应的是同一个欧氏点,这些点是齐次的,齐次坐标有规模不变性

求平行线相交方程组:
https://blog.csdn.net/janestar/article/details/44244849
如果是普通坐标系,则方程无解,转化为齐次坐标系则有解,解在无穷远处

6. 关于Eigen

  • 在c++程序中,我们可以把一个float数据和double数据相加、相乘,编译器会自动把数据类型转换为最合适的那种。而在eigen中,处于对性能的考虑,必须显式得对矩阵类型进行转换,不然会出错。
  • 如果发现eigen出错,你可以直接找大写的部分,来看看出了什么问题。
  • eigen几乎所有数据都当做矩阵来处理

7. 基础知识

7.1 点和向量

点是空间中的基本元素,没有长度,没有体积。把两个点连接起来,就构成了向量。
向量可以看成从某点指向另一个点的一个箭头。切记,不要把向量与它的坐标这两个概念啊混淆。向量就是空间中的一个东西,不需要与任何实数相关联,只有确定了空间中的某个坐标系时,才可以谈论该向量在此坐标系下的坐标,也就是找到若干个实数对应这个向量

坐标的具体取值,一是和向量本身有关,二是和坐标系(基)的选取有关。基就是张成这个空间的一组线性无关的向量,有些书里也叫基底。基向量的长度为1。

7.2 点乘和叉乘

dot内积(点乘):
① a在b上的投影的模乘以b的模
② 描述向量之间的夹角
a ⋅ b = a T b = ∣ a ∣ ∣ b ∣ c o s < a , b > a · b = a^T b = |a||b|cos<a, b> a⋅b=aTb=∣a∣∣b∣cos<a,b>
矩阵没有点乘一说

cross product外积(叉乘):
① aOb平面的法向量
② ab组成的平行四边形的面积和法向量长度 ∣ a ∣ ∣ b ∣ s i n < a , b > |a||b|sin<a,b> ∣a∣∣b∣sin<a,b>
法向量的方向成右手法则,所以叉乘的顺序是会有影响的。

反对成矩阵(skew-symmetric matrix),如a = [a1, a2, a3]
a ^ = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] a \hat{} = \begin{bmatrix} 0 & -a_3 & a_2 \\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{bmatrix} a^=⎣⎡​0a3​−a2​​−a3​0a1​​a2​−a1​0​⎦⎤​

在机器人学中,你会给每个连杆和关节定义它们的坐标系。如果考虑运动的机器人,那么常见的做法是设定一个惯性坐标系(或者世界坐标系),可以认为它是固定不动的。

8. 旋转矩阵相乘的含义

a 1 = R 12 a 2 + t 12 a_1 = R_{12}a_2 + t_{12} a1​=R12​a2​+t12​
旋转矩阵 R 12 R_{12} R12​代表的意思是“把坐标系2的向量变换到坐标系1”。由于向量乘在了这个矩阵的右边,它的下表是从右读到左的。关于平移 t 12 t_{12} t12​,它实际对应的是坐标系1原点指向坐标系2原点的向量,在坐标系1下取得坐标。但是反过来的 t 21 t_{21} t21​不等于 − t 12 -t_{12} −t12​,t指平移,运算时为向量,但不能默许相反数的规则,这回导致后续的数学运算出错。

9. 变换矩阵Transform Matrix

SO(n)是特殊正交群(special orthogonal group),集合的定义如下:
S O ( N ) = { R ∈ R n × n ∣ R R T = I , d e t ( R ) = 1 } SO(N) = \{R \in \mathbb{R}^{n\times n} | RR^T = I, det(R) = 1\} SO(N)={R∈Rn×n∣RRT=I,det(R)=1}
特殊正交群要求正交,且行列式为1.

我们在一个三维向量的末尾添加1,将其变成了四位向量,称为其次坐标。对于这个四位向量,我们可以把旋转和平移卸载一个矩阵里,使得整个关系变成线性关系。
T = [ R t 0 1 ] T = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} T=[R0​t1​]

SE(3)是特殊欧氏群(special euclidean group),定义如下:
S E ( 3 ) = { T = [ R t 0 T 1 ] ∈ R 4 × 4 ∣ R ∈ S O ( 3 ) , t ∈ R 3 } SE(3) = \{ T = \begin{bmatrix} R & t \\ 0^T & 1 \end{bmatrix} \in \mathbb{R}^{4 \times 4} | R \in SO(3), t \in R^3\} SE(3)={T=[R0T​t1​]∈R4×4∣R∈SO(3),t∈R3}
反向的变换.inverse()为:
T − 1 = [ R T − R T t 0 T 1 ] T^{-1} = \begin{bmatrix} R^T & - R^T t\\ 0^T & 1\end{bmatrix} T−1=[RT0T​−RTt1​]

10. 旋转向量、欧拉角、四元数

10.1 旋转向量和旋转矩阵

任意旋转都可以用一个旋转轴和一个旋转角来刻画。于是,我们可以使用一个向量,其方向与旋转轴一致,而长度等于旋转角。这种向量称为旋转向量(或轴角/角轴,axis-angle),只需要一个三维向量即可描述旋转。

如果用一个旋转矩阵R来表示旋转,可以从旋转向量转化过来,假设旋转向量的单位向量n,以及角度(长度)Θ,则可以通过罗德里格斯公式(Rodrigues’s Formula)来表明:
R = c o s θ I + ( 1 − c o s θ ) n n T + s i n θ n ^ R = cos{\theta}I + (1 - cos\theta)nn^T + sin\theta \hat{n} R=cosθI+(1−cosθ)nnT+sinθn^
如果从旋转矩阵转回旋转向量,则可以两边取迹,方向向量则是R特征值为1的特征向量。
罗德里格斯公式的详细推导过程我自己总结了一份,写的会比其他博客详细一些

10.1.1 旋转向量和旋转矩阵Eigen

# 向量和旋转向量是不一样的,向量的base是Eigen::Matrix,而旋转向量是Eigen::AngleAxis
# 初始化旋转向量
Eigen::AngleAxisd rotation_vector(M_PI / 2, Eigen::Vector3d(1,2,3).normalized());
# 注意normalized()返回向量,norm返回L2范数,normalize()是归一化处理,不返回值# 旋转向量转旋转矩阵
Eigen::Matrix3d rotation_matrix = rotation_vector.matrix();# 旋转矩阵转旋转向量
Eigen::Vector3d rotate;
rotate.fromRotationMatrix(rotation_matrix);

10.2 欧拉角

无论是旋转矩阵还是旋转向量,虽然能描述旋转,但是对人类来说很不直观。

欧拉角提供了一种非常直观的方式来描述旋转——使用3个分离的转角,把一个旋转分解成3次不同的旋转。假设一个刚体的前方为x轴,右侧为Y轴,上方为Z轴。通常使用ypr(yaw-pitch-row)旋转顺序。

10.3 万向锁

欧拉角的一个重大缺点就是会碰到著名的万向锁问题(gimbal lock):当第二个旋转角为±90°时,第一次旋转和第三次旋转将会使用同一个轴,使得系统丢失一个自由度(由三次旋转变为2次旋转)。这被称为奇异性问题。理论上可以证明,只要想用三个实数来表达三维旋转,都会不可避免的遇到奇异性问题。

10.3.1 如何理解万向锁?

首先,万向锁(gimbal lock),是使用动态欧拉角表示旋转会出现的问题。

首先搞清楚一个概念,欧拉角有两种旋转:

  • 静态:世界坐标系(惯性坐标系),绕着世界坐标系三个轴旋转,因为物体旋转过程坐标轴保持静止,所以称为静态。
  • 动态:绕着物体坐标系旋转,因为旋转过程中坐标轴随着物体做相同的运动,所以称为动态。

使用动态欧拉角会出现万向锁现象,静态欧拉角不会出现万向锁现象。

当使用动态欧拉角旋转时,无论3个轴的旋转顺序是什么,只要第二个旋转轴的旋转角度为90度,那么第三个旋转轴(物体坐标系)的旋转效果和第一次旋转轴(世界坐标系)的旋转效果是一样的。这样,旋转系统丢失了一个自由度,原本需要3次旋转表示的旋转变成了2次。这被称为奇异性问题。实际上,只要想用三个实数来表达三维旋转,都会不可避免的遇到奇异性问题,这点有点类似于经纬度的表示,当维度为±90°时,经度没有意义。

口头描述(面试回答):
万向锁,英文名gimbal clock,是使用动态欧拉角表示旋转时会出现的问题。具体是什么问题呢,当使用动态欧拉角表示旋转的时候,不管旋转顺序如何,当第二个旋转轴旋转90°时,第一次旋转和第三次旋转的效果是一样的,也就是说旋转系统丢失了一个自由度(一个由3次旋转才能表示的旋转变成2次就是表示),这就是万向锁问题。也被称为奇异性问题。

10.4 四元数

定义:四元数是简单的超复数。超复数的意思是一个实数加三个复数。
意义:用四元数可以用来表示旋转,相对于欧拉角这种有奇异性的三维向量描述方式,四元数可以避免万向锁问题。

意义:① 增量旋转
② 避免万向锁问题
③ 给定方位的表达方式有两种,互为负(欧拉角有无数种表达方式)

10.4.1 加法

各项加

10.4.2 乘法

乘法是把qa的每一项与qb的每一项相乘,最后相加。

10.4.3 模长

∣ ∣ q a ∣ ∣ = s a 2 + x a 2 + y a 2 + z a 2 ||q_a||=\sqrt{s^2_a+x^2_a+y^2_a+z^2_a} ∣∣qa​∣∣=sa2​+xa2​+ya2​+za2​ ​
∣ ∣ q a q b ∣ ∣ = ∣ ∣ q a ∣ ∣ ∣ ∣ q b ∣ ∣ ||q_a q_b|| = ||q_a||||q_b|| ∣∣qa​qb​∣∣=∣∣qa​∣∣∣∣qb​∣∣

10.4.4 共轭

虚部取反

10.4.5 逆

q − 1 = q ⋆ ∣ ∣ q ∣ ∣ 2 q^{-1} = \frac{q^{\star}}{||q||^2} q−1=∣∣q∣∣2q⋆​

视觉SLAM十四讲 第3讲 三维空间刚体运动(相关知识点汇总)相关推荐

  1. 视觉SLAM总结——视觉SLAM十四讲笔记整理

    视觉SLAM总结--视觉SLAM十四讲笔记整理 说明 基础知识点 1. 特征提取.特征匹配 (1)Harris (2)SIFT (3)SUFT (4)ORB (5)特征匹配 2. 2D-2D:对极约束 ...

  2. 浅读《视觉SLAM十四讲:从理论到实践》--操作1--初识SLAM

    浅读<视觉SLAM十四讲:从理论到实践>--操作1--初识SLAM 下载<视觉SLAM十四讲:从理论到实践>源码:https://github.com/gaoxiang12/s ...

  3. 视觉SLAM十四讲(3):三维空间刚体运动

    本章需要掌握的知识点有:旋转矩阵,变换矩阵,四元数,欧拉角定义和数学表达:同时也要掌握Eigen库关于矩阵.几何模块的使用方法. 文章目录 3.1 旋转矩阵 3.1.1 点,向量和矩阵的关系 3.1. ...

  4. 视觉SLAM十四讲(2):初识SLAM

    这一讲主要介绍视觉SLAM的结构,并完成第一个SLAM程序:HelloSLAM. 目录 2.1 小萝卜的例子 单目相机 双目相机 深度相机 2.2 经典视觉SLAM框架 2.3 SLAM问题的数学表述 ...

  5. 视觉SLAM十四讲(1):预备知识

    最近在学习高翔博士的<视觉SLAM十四讲>(第二版),算是初学本书,配套资源还算蛮丰富的,有代码(第一版和第二版都有),B站上也有高翔博士对第一版录制的讲解视频,真的是很贴心. 来吧,让我 ...

  6. 视觉slam十四讲 pdf_视觉SLAM十四讲|第12讲 回环检测

    1. 什么是回环检测 前面有说过累积误差的问题,前一时刻的误差会积累到后面,导致画不成圈圈,如图12-1所示,而画圈圈(全局一致性)很重要,所以需要有一个步骤来纠正当前的计算偏差. 回环检测通过判断相 ...

  7. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-三角测量和实践

     专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第 ...

  8. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-对极几何和对极约束、本质矩阵、基础矩阵

    专栏系列文章如下:  专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLA ...

  9. 视觉SLAM十四讲学习笔记-第六讲学习笔记总结(1)---非线性优化原理

    第六讲学习笔记如下: 视觉SLAM十四讲学习笔记-第六讲-非线性优化的状态估计问题_goldqiu的博客-CSDN博客 ​​​​​​视觉SLAM十四讲学习笔记-第六讲-非线性优化的非线性最小二乘问题_ ...

  10. 视觉SLAM十四讲学习笔记-第四讲---第五讲学习笔记总结---李群和李代数、相机

    第四讲---第五讲学习笔记如下: 视觉SLAM十四讲学习笔记-第四讲-李群与李代数基础和定义.指数和对数映射_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第四讲-李代数求导与扰动模 ...

最新文章

  1. Android layer-list 使用
  2. R语言ggplot2可视化分面图(faceting)、在所有的分面中添加相同的参考基准曲线(overlay a base or reference plot to all facets )
  3. 在一个table中动态添加一行或删除一行
  4. 1.6 Java字节流的使用:字节输入/输出流、文件输入/输出流、字节数组输入/输出流
  5. java url api_深入阅读java api之URL
  6. 多线程的多核分配问题验证
  7. asterisk extconfig.conf文件解析
  8. 佳能c3320怎么设置接收方_入门级单反相机佳能800D是否值得买?在我看来价格决定一切...
  9. 【C语言】第三章 基本运算与顺序结构 题解
  10. SpringMVC文件上传笔记
  11. 怎么成为开源贡献者_成为负责任的开源用户
  12. 试述hadoop生态系统以及每个部分的具体功能_Hadoop在大数据分析中的意义和作用...
  13. JSON.toJSONString 首字母不小写
  14. 腾讯云VP王龙:与英特尔的合作将加速AI落地,硬件的灵活性要变得更强
  15. 在netbeans中使用tomcat服务器的web应用,在NetBeans中创建Apache—Tomcat-web服务器
  16. 中国计算机病毒发展简史
  17. 关于磁力计和加速度计的融合以及坐标系的对准
  18. mysql java驱动 ibm_各种数据库的jdbc驱动下载及连接方式
  19. zuc算法代码详解_zuc算法的实现
  20. java计算机毕业设计html5大众汽车网站MyBatis+系统+LW文档+源码+调试部署

热门文章

  1. 【STM32】Freemodbus流程解析函数解析详细
  2. Windows卸载JDK和安装JDK
  3. 抖音短视频系统开发自定义弹框
  4. VB网络编程(webbrowser应用及Inet抓包封包)
  5. OpenCV打开摄像头(二)
  6. 史上最强攻略!手把手教你建「数据中台」!
  7. 【dxf】(2)dxf 的块 Block 读取
  8. 【SAP业务模式】之ICS(一):业务详述
  9. logback 随笔 写入日志
  10. 云服务器80端口_怎么查看_放开端口检测