点击上方“小白学视觉”,选择加"星标"或“置顶”

重磅干货,第一时间送达

刚体,顾名思义,是指本身不会在运动过程中产生形变的物体,如相机的运动就是刚体运动,运动过程中同一个向量的长度和夹角都不会发生变化。刚体变换也称为欧式变换。

视觉SLAM中使用的相机就是典型的刚体,相机一般通过人手持、机载(安装在机器人上)、车载(固定在车辆上)等方式在三维空间内运动,形式包括旋转、平移、缩放、切变等。其中,刚体在三维空间中最重要的运动形式就是旋转。那么刚体的旋转如何量化表达呢?

三维空间中刚体的旋转表示

三维空间中刚体的旋转总共有4种表示方法,高翔的十四讲中的第3讲比较详细的讲解了。本文提炼中最重要的内容,并加上实际使用过程中的经验总结进行了归纳。下面按照重要顺序分别进行介绍。

1

旋转矩阵

1、SLAM编程中使用比较频繁。需要重点掌握。

2、旋转矩阵不是一般矩阵,它有比较强的约束条件。旋转矩阵R具有正交性,R和R的转置的乘积是单位阵,且行列式值为1

3、旋转矩阵R的逆矩阵表示了一个和R相反的旋转。

4、旋转矩阵R通常和平移向量t一起组成齐次的变换矩阵T,描述了欧氏坐标变换。引入齐次坐标是为了可以方便的描述连续的欧氏变换,这个在上一篇文章《从零开始一起学习SLAM | 为什么要用齐次坐标?》中有讲解。

5、冗余。用9个元素表示3个自由度的旋转,比较冗余。

2

四元数

1、SLAM编程中使用频繁程度接近旋转矩阵。稍微有点抽象,不太直观,但是一定得掌握。

2、四元数由一个实部和三个虚部组成,是一种非常紧凑、没有奇异的表达方式。

3、编程时候很多坑,必须注意。首先,一定要注意四元素定义中实部虚部和打印系数的顺序不同,很容易出错!

其次,单位四元素才能描述旋转,所以四元素使用前必须归一化:q.normalize()。

3

旋转向量

1、用一个旋转轴n和旋转角θ来描述一个旋转,所以也称轴角。不过很明显,因为旋转角度有一定的周期性(360°一圈),所以这种表达方式具有奇异性。

2、从旋转向量到旋转矩阵的转换过程称为 罗德里格斯公式。这个推导比较麻烦,否则也不会有一个专属的名字了。OpenCV和MATLAB中都有专门的罗德里格斯函数。

3、旋转向量本身没什么出彩的,不过旋转向量和旋转矩阵的转换关系,其实对应于李代数和李群的映射,这对于后面理解李代数很有帮助。

4

欧拉角

1、把一次旋转分解成3次绕不同坐标轴的旋转,比如航空领域经常使用的“偏航-俯仰-滚转”(yaw,pitch,roll)就是一种欧拉角。该表达方式最大的优势就是直观。

2、欧拉角在SLAM中用的很少,原因是它的一个致命缺点:万向锁。也就是在俯仰角为±90°时,第一次和第3次旋转使用的是同一个坐标轴,会丢失一个自由度,引起奇异性。事实上,想要表达三维旋转,至少需要4个变量。

了解了四种旋转的表达方式,那么编程时如何使用呢?

矩阵线性代数运算库Eigen

事实上,上述几种旋转的表达方式在一个第三方库Eigen中已经定义好啦。Eigen是一个C++开源线性代数库,安装非常方便,Ubuntu下一行代码即可搞定:

sudo apt-get install libeigen3-dev

Eigen在SLAM编程中是必备基础,必须熟练编程。关于Eigen,主要有以下几点需要强调或注意。

1、Eigen库不同于一般的库,它只有头文件没有.so和 .a那样的二进制库文件,所以在CMakeLists.txt里只需要添加头文件路径,并不需要使用 target_link_libraries 将程序链接到库上。

2、Eigen以矩阵为基本数据单元,在Eigen中,所有的矩阵和向量都是Matrix模板类的对象,Matrix一般使用3个参数:数据类型、行数、列数

Eigen::Matrix<typename Scalar, int rowsNum, int colsNum>

而向量只是一种特殊的矩阵(一行或者一列)。同时,Eigen通过typedef 预先定义好了很多内置类型,如下,我们可以看到底层仍然是Eigen::Matrix

typedef Eigen::Matrix<float, 4, 4> Matrix4f;

typedef Eigen::Matrix<float, 3, 1> Vector3f;

3、为了提高效率,对于已知大小的矩阵,使用时需要指定矩阵的大小和类型。如果不确定矩阵的大小,可以使用动态矩阵Eigen::Dynamic

Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix_dynamic;

4、Eigen在数据类型方面“很傻很天真”。什么意思呢?就是使用Eigen时操作数据类型必须完全一致,不能进行自动类型提升。比如C++中,float类型加上double类型变量不会报错,编译器会自动将结果提升为double。但是在Eigen中float类型矩阵和double类型矩阵不能直接相加,必须统一为float或者double,否则会报错。

5、Eigen除了空间几何变换外,还提供了大量矩阵分解、稀疏线性方程求解等函数,非常方便。学习Eigen最好的方式就是官网:

http://eigen.tuxfamily.org/dox/

有非常多的示例参考。

上述四种旋转表达方式是可以相互转化的。在Eigen中它们之间的转化非常的方便。下图是我看的别人总结的旋转矩阵、四元素、旋转向量之间的相互转化图:

作业

题目1:

已知旋转矩阵定义是沿着Z轴旋转45°。请按照该定义初始化旋转向量、旋转矩阵、四元数、欧拉角。请编程实现:

1、以上四种表达方式的相互转换关系并输出,并参考给出的结果验证是否正确。

2、假设平移向量为(1,2,3),请输出旋转矩阵和该平移矩阵构成的欧式变换矩阵,并根据欧式变换矩阵提取旋转向量及平移向量。

本程序学习目标:

1、学习eigen中刚体旋转的四种表达方式,熟悉他们之间的相互转换关系

2、熟悉旋转平移和欧式变换矩阵的相互转换关系

以下是参考的编程框架:

题目2:

我们知道单位四元数q可以表达旋转。一个三维空间点可以用虚四元数p表示,用四元数 q 旋转点 p 的结果p'为:

证明:此时 p′ 必定为虚四元数(实部为零)。

公众号菜单栏回复:“旋转”,即可下载题目1代码框架和输出参考结果。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

从零开始一起学习SLAM | 三维空间刚体的旋转相关推荐

  1. 从零开始一起学习SLAM | 为啥需要李群与李代数?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 很多刚刚接触SLAM的小伙伴在看到李群和李代数这部分的时候,都有点 ...

  2. 从零开始一起学习SLAM | 你好,点云

    本文提纲 先热热身 点云是啥 你知道点云优缺点吗? 点云库PCL:开发者的福音 PCL安装指北 炒鸡简单的PCL实践 留个作业再走 先热热身 小白:hi,师兄,好久不见 师兄:师妹好,上周单应矩阵作业 ...

  3. 从零开始一起学习SLAM | 给点云加个滤网

    对VSLAM和三维重建感兴趣的在计算机视觉life"公众号菜单栏回复"三维视觉"进交流群. 小白:师兄,上次你讲了点云拼接后,我回去费了不少时间研究,终于得到了和你给的参 ...

  4. 从零开始一起学习SLAM | 掌握g2o顶点编程套路

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 小白:师兄,上一次将的g2o框架<从零开始一起学习SLAM ...

  5. 从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 自从小白向师兄学习了李群李代数和相机成像模型的基本原理后,感觉书上 ...

  6. 从零开始一起学习SLAM(8)相机成像模型

    文章目录 小孔成像 纷繁复杂的坐标系 针孔相机成像原理 相机畸变   此文发于公众号:计算机视觉life.   原文链接:从零开始一起学习SLAM | 相机成像模型 上一篇文章<从零开始一起学习 ...

  7. 从零开始一起学习SLAM | 点云到网格的进化

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 小白:师兄,师兄,你在<从零开始一起学习SLAM | 给点云 ...

  8. 三维空间坐标的旋转算法详解_视觉slam | 三维空间刚体运动的五种表达:旋转矩阵 变化矩阵 欧拉角 旋转向量 四元数及互相转换...

    原po:高翔slam十四讲-刚体运动 1.旋转矩阵 考虑一次旋转 Before: 坐标系(e1,e2,e3), 向量(a1,a2,a3) After: 坐标系(e1',e2',e3'), 向量(a1' ...

  9. SLAM学习:三维空间刚体变换(1)

    1. 欧式变换 相机运动是一个刚体运动,它保证了同一个向量在各个坐标系下的长度和夹角都不会发生变化.这种变换称为欧氏变换. 一个欧式变换由一个旋转和一个平移两部分组成:其中,旋转矩阵表征绕各个坐标轴所 ...

最新文章

  1. Java多线程的11种创建方式以及纠正网上流传很久的一个谬误
  2. VLFeat库中加extern “C“
  3. Java心得--键值、枚举器
  4. 【DIY】填坑,热水器自动定时烧水断电方案,预期目标及功能
  5. Android配置环境问题
  6. rhel6.2安装oracle11g,RHEL 6.2 x86_64 下安装Oracle 11g步骤
  7. Java魔法堂:URI、URL(含URL Protocol Handler)和URN
  8. 取文件 shell_webshell文件上传分析溯源
  9. 蔬菜大棚成本_蔬菜大棚建设标准和成本
  10. GoF23种设计模式之行为型模式之策略模式
  11. ScrollView 里面捕获OnTouchMove事件
  12. 6、PXE安装ESXI6.0
  13. [Publish AAR To Maven] 使用GPG对文件进行签名加密
  14. 房地产项目成本管理系统包含的内容和价值!
  15. Python数据分析(二) —— 进阶绘制双折线图
  16. 多元统计分析-橄榄油数据集
  17. iconv的使用方法
  18. 基恩士pda开发指南
  19. 个人即时到帐支付接口-个人收款即时到账免签约
  20. CSS学习笔记-—学会用PS切图和取色—day03(基本用法)

热门文章

  1. 从词袋到Transfomer,NLP十年突破史
  2. AI和大数据如何落地智能城市?京东城市这6篇论文必读 | KDD 2019
  3. 厉害了!不重启JVM,替换掉已经加载的类
  4. 同事乱用 Redis 卡爆,我真是醉了...
  5. 还在写大量 if 来判断?试试用一个规则执行器来替代它
  6. 如何跨微服务共享DTO
  7. 推荐一款 Java 对象映射神器
  8. 为什么阿里巴巴要求日期格式化时必须有使用y表示年,而不能用Y?
  9. 山东省第三届数据应用赛事来了!
  10. 一文讲解特征工程 | 经典外文PPT及中文解析