Slam笔记I
视觉Slam笔记I
第二讲-三位空间刚体运动
点与坐标系:
基础概念:
坐标系:左手系和右手系。右手系更常用。定义坐标系时,会定义世界坐标系,相机坐标系,以及其他关心对象的坐标系。空间中任意一点可由空间的基的线性表出。
加减法:用坐标描述更方便。
内积:点乘得数,即

外积:叉乘得向量,即
右手系下,得到按照右手定则获取的向量。坐标系间的变换:

通过平移(向量的加减)和旋转(有多种描述方式,见下)2D情况:二维坐标点表示位置+一个旋转角表示朝向。
3D情况:三维坐标点表示位置+一个旋转角(角度间的变换使用旋转,旋转方式有多种,见下)。
旋转矩阵:(描述旋转的第一种方式)
坐标系 (e_1,e_2,e_3)经过旋转变成 (e'_1,e'_2,e'_3),在三维空间中,向量 a保持不动,那么如何表出它在 (e'_1,e'_2,e'_3)下的坐标:
- 线性表出法向量
a坐标:两坐标系实质是分别用两组不同的基去表示同一个点,则两者的线性组合是相等的:
- 左右两边同时左乘
(e_1,e_2,e_3)的转置,得到:
- R即为旋转矩阵。
- 性质:
- R是一个正交矩阵(矩阵的逆即矩阵的转置,或转置×本身即为一个单位矩阵)。
- R的行列式值为1。
- 满足上述性质的矩阵都可以称为旋转矩阵,使用集合表示:
,又称特殊正交群SO(3)。 - 固定表示方式(下标顺序):
且满足矩阵关系:
。
因此,空间中不同坐标系下点坐标的变换可以使用:
即旋转+平移的形式完全描述
- 理论依据:欧拉定理,刚体在三维空间中的一般运动,可分解为刚体上方某一点的平移,以及绕经过此点的旋转轴的转动。
但是,这种表示方式在多次进行变换时会有不便(
),因此使用增广的方式进行表示:

- 其中,
称为变换矩阵,
的形式称为齐次坐标。 - 齐次坐标性质:齐次坐标乘上任意非0常数时仍表达同一坐标

- 变换矩阵的集合:称为特殊欧式群SE(3):


旋转向量和欧拉角:
旋转矩阵在实际中更常用,但这些概念也是需要清楚的。
旋转矩阵R是一个3×3的矩阵,有九个元素,但仅有三个自由度,也就是存在描述方式上的冗余,那么能否以更少的元素表达旋转?
刚体旋转存在一个转轴(向量),还有转过的角度,于是想用角度乘以向量(单位化过后)的形式去描述旋转。
旋转向量
一个向量,方向为旋转轴方向,长度为转过的角度。(单位向量乘角度大小)
又称角轴/轴角。
罗德里格斯公式可以将旋转向量(n,theta)转换成旋转矩阵R:

旋转矩阵R也可以转换成旋转向量(n,theta):
n是特征向量。
欧拉角
- 将旋转分解成三个方向上的转动,常用顺序为yaw-pitch-roll(也就是绕Z-Y-X方式转,注意 ,不同地方在绕Z转之后,所绕的Y轴可能是原来的Y轴,也可能是转动后的Y轴)

- 万向锁(Gimbal Lock):欧拉角存在奇异性(特定值下,旋转的自由度减1)
在pitch方向旋转完毕后,roll方向旋转和yaw方向旋转是重合的。由此,欧拉角不适合插值或迭代,故不常用。
四元数:
吸取了旋转矩阵和旋转向量、欧拉角的优点,是一种优秀的描述方式。
- 2D情况下,可以用单位复数表达旋转:
\]
- 用z乘以i,相当于旋转了90度(
),乘-i转动-90度。
在三维情况下,四元数可作为扩充定义的复数
特点1:有三个虚部+一个实部

特点2:虚部之间存在关系:

单位四元数可以表达三维空间的旋转:

四元数也能定义很多运算:

四元数转换成旋转向量:

旋转向量转换成四元数:

用四元数表示旋转:

Slam笔记I的更多相关文章
- 非滤波单目视觉slam笔记1
非滤波单目视觉slam 主要分为以下8部分 数据类型 数据关联 初始化 位姿估计 地图维护 地图生成 失效恢复 回环检测 数据类型 直接法(稠密,半稠密) 基本原理是亮度一致性约束,\(J(x,y) ...
- SLAM笔记
1.matrix.preTranslate()和matrix.postTranslate()的区别 matrix.preTranslate(matrix_1); matrix.postTranslat ...
- ROS_RGB-D SLAM学习笔记--室内环境测试
ROS_RGB-D SLAM学习笔记 RTAB-Map's ros-pkg. RTAB-Map is a RGB-D SLAM approach with real-time constraints. ...
- Learning ROS for Robotics Programming Second Edition学习笔记(十) indigo Gazebo rviz slam navigation
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 moveit是书的最后一章,由于对机械臂完全不知,看不懂 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- SLAM学习笔记
ORB_SLAM2源码: 获得旋转矩阵,来自这里:http://www.cnblogs.com/shang-slam/p/6406584.html 关于Covisibility图来自:http://b ...
- ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - ROSMapModify - ROS地图修改
ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - 2 - MapModify地图修改 We can use gmapping model to genera ...
- 三维重建7:Visual SLAM算法笔记
VSLAM研究了几十年,新的东西不是很多,三维重建的VSLAM方法可以用一篇文章总结一下. 此文是一个好的视觉SLAM综述,对视觉SLAM总结比较全面,是SLAM那本书的很好的补充.介绍了基于滤波器的 ...
- SLAM学习笔记(2)SLAM算法
SLAM算法分为三类:Kalman滤波.概率滤波.图优化 Kalman滤波方法包括EKF.EIF:概率滤波包括RBPF,FastSLAM是RBPF滤波器最为成功的实例, 也是应用最为广泛的SLAM方法 ...
随机推荐
- arm-eabi-addr2line工具跟踪Android调用堆栈
使用arm-eabi-addr2line工具跟踪Android调用堆栈作者:liangshengyang转自:http://www.linuxidc.com/Linux/2011-01/31803.h ...
- 没有admin权限如何免安装使用Node和NPM
此教程只针对于在windows系统上没有admin权限和软件安装权限,但是又希望能像安装版一样使用Node和NPM的用户. 步骤一: 下载压缩版node 访问https://nodejs.org/en ...
- DIY电压基准测万用表
| 分类 日志 | 手里有三个常用的手持表,UT61E四位半,优利德明星产品:福禄克F117C,换挡快,单手操作还带LoZ:UT210E小钳表能够通过修改EEPROM更改电表配置,已经刷了6000字 ...
- 微软亚洲研究院开源图数据查询语言LIKQ
近日,微软亚洲研究院通过GitHub 平台开源图数据查询语言LIKQ (Language-Integrated Knowledge Query).LIKQ是基于分布式大规模图数据处理引擎Graph ...
- ZYNQ自定义AXI总线IP应用——PWM实现呼吸灯效果
一.前言 在实时性要求较高的场合中,CPU软件执行的方式显然不能满足需求,这时需要硬件逻辑实现部分功能.要想使自定义IP核被CPU访问,就必须带有总线接口.ZYNQ采用AXI BUS实现PS和PL之间 ...
- 记一次手机与PC同步开发Android项目
目录 -1 前言 0.0 流程简介 1.0 AS创建项目并上传GitHub 2.0 AIDE克隆GitHub项目 能力不足时曲线救国 > 3.0 termux编译AIDE目录下的项目文件 3.1 ...
- Failed to open the key database file. c;\\User\\w\\Destop\\SecureCRT_FX6.5.3\\Config\\KnowHosts\\Hostsmap.txt这个问题的解决方法
1.首先将这段错误在百度翻译上面查询一下,是什么意思,查询结果如下: 打开密钥数据库文件失败.C:\用户\ w \平台\ securecrt_fx6.5.3 \\ \\ \\ hostsmap.txt ...
- vue+element tree(树形控件)组件(1)
最近做了第一个组内可以使用的组件,虽然是最简版,也废了不少力.各位前辈帮我解决问题,才勉强搞定.让我来记录这个树形组件的编写过程和期间用到的知识点. 首先说说需求,就是点击出现弹窗+蒙板,弹窗内容是一 ...
- 纯CSS实现带返回顶部右侧悬浮菜单
这是我做个人网页的时候加上的带返回顶部右侧悬浮菜单效果,如下图, 使用工具是Hbuilder. 代码如下: <!DOCTYPE html> <html> <head> ...
- js 面向对象中,定义一个函数的过程
定义一个函数做的两件事:1: 实例化一个Function对象:2: 实例化一个Object对象,并给该函数扩展prototype属性指向这个构造函数 大致过程如图所示: 每一种引用类型(函数,对象,数 ...