视觉SLAM十四讲第三讲
第三章 三维空间刚体运动
主要目标
- 理解三维空间的刚体运动描述方式:旋转矩阵、变换矩阵、四元数和欧拉角。
- 掌握 Eigen 库的矩阵、几何模块使用方法。
一、 旋转矩阵
刚体,它不光有位置,还有自身的姿态。相机也可以看成三维空间的刚体,于是位置是指相机在空间中的哪个地方,而姿态
则是指相机的朝向。我们要用数学语言来描述它。
1)点和向量
点就是空间当中的基本元素,没有长度,没有体积。把两个点连接起来,就构成了向量。向量可以看成从某点指向另一点的一个箭头。
2)基
维空间中的某个点的坐标也可以用 R3 来描述。假设在这个线性空间内,我们找到了该空间的一组基(e1, e2, e3),那么,任意向量 a 在这组基下就有一个坐标:
这里 (a1, a2, a3)T 称为 a 在此基下的坐标。坐标的具体取值,一是和向量本身有关,二是和坐标系(基)的选取有关。
3)内积和外积
对于 a, b ∈ R3,通常意义下的内积可以写成:
其中 ⟨a, b⟩ 指向量 a, b 的夹角。内积也可以描述向量间的投影关系。而外积则是这个样子:
外积的结果是一个向量,它的方向垂直于这两个向量,大小为 |a| |b|sin ⟨a, b⟩,是两个向量张成的四边形的有向面积。
对于外积运算,我们引入 ∧ 符号,把 a 写成一个矩阵。事实上是一个反对称矩阵(Skew-symmetric matrix),可以将 ∧ 记成一个反对称符号。这样就把外积 a × b 写成了矩阵与向量的乘法a∧b,把它变成了线性运算。
4)坐标系间的欧氏变换
如下图所示的坐标变换。对于同一个向量 p,它在世界坐标系下的坐标 pw 和在相机坐标系下的坐标 pc是不同的。这个变换关系由变换矩阵 T 来描述。变换矩阵由旋转矩阵和平移向量构成。
欧氏变换由旋转和平移组成。我们首先考虑旋转。设某个单位正交基 (e1, e2, e3) 经过一次旋转变成了 (e′1, e′2, e′3)。那么,对于同一个向量 a(该向量并没有随着坐标系的旋转而发生运动),它在两个坐标系下的坐标为 [a1, a2, a3]T 和 [a′1, a′2, a′3]T。因为向量本身没变,根据坐标的定义,有:
为了描述两个坐标之间的关系,我们对上述等式的左右两边同时左乘 [eT1 eT2 eT3 ]T,那么左边的系数就变成了单位矩阵,所以:
5)变换矩阵与齐次坐标
这是一个数学技巧:我们在一个三维向量的末尾添加 1,将其变成了四维向量,称为齐次坐标。对于这个四维向量,我们可以把旋转和平移写在一个矩阵里面,使得整个关系变成线性关系。该式中,矩阵 T 称为变换矩阵(Transform Matrix)。
二、实践:Eigen
输入以下命令进行安装:
sudo apt-get install libeigen3-dev
三、旋转向量和欧拉角
1)旋转向量
任意旋转都可以用一个旋转轴和一个旋转角来刻画。于是,我们可以使用一个向量,其方向与旋转轴一致,而长度等于旋转角。这种向量称为旋转向量(或轴角/角轴,Axis-Angle),只需一个三维向量即可描述旋转。同样,对于变换矩阵,我们使用一个旋转向量和一个平移向量即可表达一次变换。这时的变量维数正好是六维。
假设旋转轴为一个单位长度的向量 n,角度为 θ,那么向量 θn 也可以描述这个旋转。从旋转向量到旋转矩阵的转换过程由罗德里格斯公式(Rodrigues’s Formula )表明:
一个旋转矩阵到旋转向量的转换:
2)欧拉角
而欧拉角则提供了一种非常直观的方式来描述旋转——它使用了 3 个分离的转角,把一个旋转分解成 3 次绕不同轴的旋转。
具体参考:https://blog.csdn.net/sinolover/article/details/90671784
三、四元数
1)四元数的定义
旋转矩阵用 9 个量描述 3 自由度的旋转,具有冗余性;欧拉角和旋转向量是紧凑的,但具有奇异性。而四元数是 Hamilton 找到的一种扩展的复数。它既是紧凑的,也没有奇异性。如果说缺点,四元数不够直观,其运算稍复杂些。
一个四元数 q 拥有一个实部和三个虚部。
其中 i, j, k 为四元数的三个虚部。这三个虚部满足以下关系式:
2)四元数的运算
四元数 qa, qb 的加减运算为:
乘法:
模长:
共轭:
逆:
数乘:
3)四元数表示旋转
首先,把三维空间点用一个虚四元数来描述:
相当于把四元数的 3 个虚部与空间中的 3 个轴相对应。那么,旋转后的点 p′ 即可表示为这样的乘积:
这里的乘法均为四元数乘法,结果也是四元数。最后把 p′ 的虚部取出,即得旋转之后点的坐标。
4)四元数到其他旋转表示的转换
四元数到旋转矩阵:
四元数到旋转向量的转换公式:
四、相似、仿射、射影变换
1、相似变换
相似变换比欧氏变换多了一个自由度,它允许物体进行均匀缩放,其矩阵表示为:
2、仿射变换
仿射变换的矩阵形式如下:
3、射影变换
4、常见变换比较
五、实践:Eigen 几何模块
• 旋转矩阵(3 × 3):Eigen::Matrix3d。
• 旋转向量(3 × 1):Eigen::AngleAxisd。
• 欧拉角(3 × 1):Eigen::Vector3d。
• 四元数(4 × 1):Eigen::Quaterniond。
• 欧氏变换矩阵(4 × 4):Eigen::Isometry3d。
• 仿射变换(4 × 4):Eigen::Affine3d。
• 射影变换(4 × 4):Eigen::Projective3d。
视觉SLAM十四讲第三讲相关推荐
- 视觉SLAM十四讲学习笔记---前三讲学习笔记总结之SLAM的作用、变换和位姿表示
经过半年学习SLAM相关知识,对SLAM系统有了一些新的认识,故回看以前的学习记录,做总结和校正. 前三讲学习笔记如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉S ...
- 视觉SLAM十四讲学习笔记-第三讲-相似、仿射、射影变换和eigen程序、可视化演示
专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...
- 视觉SLAM十四讲学习笔记-第三讲-旋转矩阵和Eigen库
专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...
- 视觉SLAM十四讲学习笔记-第三讲-旋转向量、欧拉角、四元数
专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...
- 视觉 SLAM 十四讲 —— 第十三讲 建图
视觉 SLAM 十四讲 -- 第十三讲 建图 在前端和后端中,我们重点关注同时估计相机运动轨迹与特征点空间位置的问题.然而,在实际使用 SLAM 时,除了对相机本体进行定位之外,还存在许多其他的需求. ...
- 视觉SLAM十四讲笔记-第三讲 刚体运动
目录 1.两条基本公式:运动方程和观测方程 2.点与坐标系: 3. 旋转矩阵 3.1 两个条件: 4.旋转向量和欧拉角 4.1 旋转向量(Rotation Vector,又称角轴/轴角(Angle A ...
- 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-三角测量和实践
专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第 ...
- 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-对极几何和对极约束、本质矩阵、基础矩阵
专栏系列文章如下: 专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLA ...
- 视觉SLAM十四讲学习笔记-第六讲学习笔记总结(1)---非线性优化原理
第六讲学习笔记如下: 视觉SLAM十四讲学习笔记-第六讲-非线性优化的状态估计问题_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第六讲-非线性优化的非线性最小二乘问题_ ...
- 视觉SLAM十四讲学习笔记-第四讲---第五讲学习笔记总结---李群和李代数、相机
第四讲---第五讲学习笔记如下: 视觉SLAM十四讲学习笔记-第四讲-李群与李代数基础和定义.指数和对数映射_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第四讲-李代数求导与扰动模 ...
最新文章
- 如何更好的招聘软件测试人员?
- MyBatis日志到底是如何做到兼容所有常用日志框架的?
- OSMboxPost()
- jsp页面内引入静态html,JSP技术实现动态页面到静态页面的方法
- Chapter12(动态内存)--C++Prime笔记
- linux进程莫名其妙被kill,Linux运行程序时,程序进程莫名退出(被杀死)
- mysql集群集成springboot_springboot配置数据库包括集群下 配置
- php程序员述职材料_php程序员述职报告(精选多篇)
- 构建之法第四章学习心得
- BZOJ1001: [BeiJing2006]狼抓兔子 (最小割)
- 探讨【IGE】的源代码【三】。
- 基于微信小程序点餐系统的设计与实现
- Python打包为exe文件
- 在线客服系统解决方案:物流行业
- 工银亚洲见证开户详细过程和攻略
- 手机必备四款提高工作效率APP,每一个都是黑科技!
- Charles 抓包夜神模拟器,实现对App网络请求的监控
- 迪士尼超级计算机多少钱,上海迪士尼乐园公布票务调整方案,明年1月9日起实行新票价...
- Java研发技术学习路线
- VisualStudio20008快捷键大全
热门文章
- 概率论简明教程_Chapter-02_最大似然估计
- 西门子 PLC 和 AB罗克韦尔 PLC 有什么区别?
- linux机顶盒线刷教程,网络机顶盒刷机教程和详细方法,实现软件任意安装,电视免费看...
- matlab卷积动画实现
- System.Data.SQLite 支持所有(32位、64位的资源下载包)
- oracle根据中文获取拼音全拼函数
- 酷Q插件dll 加载失败!错误:缺失AppInfo返回的AppID(york.1996.com)对应的文件(-110)
- 【原创】VBA学习笔记(4)VBA函数 和 worksheetfunction工作表函数
- cad插件_CAD插件燕秀工具箱2.81
- 黑马程序员—怎么去黑马?吃住问题解答