当前位置: 首页 > news >正文

SLAM技术栈 ——《视觉SLAM十四讲》学习笔记(一)

《视觉SLAM十四讲》学习笔记(一)

  • 第2讲 初识SLAM
    • 习题部分
  • 第3讲 三维空间刚体运动
    • 3.1 左手系与右手系
    • 3.2 齐次坐标
    • 3.3 旋转矩阵与变换矩阵
    • 3.4 正交群与欧式群
    • 3.5 旋转向量与欧拉角
    • 3.6 实践Eigen线性代数库
      • 3.6.1 QR分解(QR decomposition)
    • 3.7 四元数到其它旋转表示的转换
    • 3.8 相似、仿射、射影变换
  • 第4讲 李代数

第2讲 初识SLAM

这篇文章已经总结的很好了,把要点都总结到了,我就不重复了《重读《视觉SLAM十四讲》ch2初识SLAM》

习题部分

《视觉SLAM十四讲笔记 – 第二讲课后习题》,这篇文章有较为完善的习题讲解,但缺少第8问,我这里补充下。

8.完善Hello SLAM小程序,把它做成一个小程序库,安装到本地硬盘中。然后,新建一个工程,使用find_package找这个库并调用

参考《“轻松搞定 CMake”系列之 find_package 用法详解》

第3讲 三维空间刚体运动

3.1 左手系与右手系

伸出你的左右手,始终保持这两只手指的大拇指朝右(x轴正方向)食指朝上(y轴正方向),然后中指垂直于大拇指与食指所构成的平面,即 (z轴正方向)

左手系与右手系

图片来源 —— Understanding left- or right-handed coordinate systems,百度百科也用的这张图

3.2 齐次坐标

【探秘三维透视投影 - 齐次坐标的妙用 - 奇乐编程学院】
投影分为正交投影(又称平行投影,不会改变物体的比例,本质依然是简单的缩放和平移)与透视投影
《【Math】齐次坐标 》这篇文章看过后,你应该能理解,为什么看上去铁轨在无限延伸处,看起来是相交的,这就是因为三维空间投影至二维视觉成像平面,损失了深度信息。即,你的观察点和两条铁轨的无限远处的某点所连成的直线,与成像平面的交点会越来越靠近同一个点。图我无法画的很好看,只能用这段文字说明下,用相似三角形就可以表示了。

3.3 旋转矩阵与变换矩阵

旋转矩阵 R R R,由于基向量的长度为1,所以实际上是各基向量夹角的余弦值。所以这个矩阵也叫方向余弦矩阵(Direction Cosine Matrix)。下面统一称为旋转矩阵。旋转矩阵R是一个行列式为1的正交矩阵。

书中的符号记法: R 12 R_{12} R12代表“把坐标系2的向量变换到坐标系1”的旋转矩阵
下面的公式里的 T T T称为变换矩阵(Transform Matrix)

不刻意区别齐次坐标与普通坐标的符号,默认使用的是符合运算法则的那一种

3.4 正交群与欧式群

SO(n)是特殊正交群(Special Orthogonal Group)
SE(n)是特殊欧氏群(Special Euclidean Group):这种矩阵的特点是,左上角为旋转矩阵,右侧为平移向量,左下角为0向量,右下角为1

3.5 旋转向量与欧拉角

书曰:“事实上,任意旋转都可以用一个旋转轴和一个旋转角来刻画。于是,我们可以使用一个向量,其方向与旋转轴一致,而长度等于旋转角。这种向量称为旋转向量(或轴角/角轴,Axis-Angle),只需一个三维向量即可描述旋转”。所以按这种说法,角速度也是一种向量,高中物理课本上有说这一点,但是角速度这种向量很特殊,被当做标量处理。

从旋转向量到旋转矩阵的转换过程由罗德里格斯公式(Rodrigues’s Formula)表明:
罗德里格斯公式

参考证明
Rodrigues’ rotation formula - wiki
【罗德里格斯公式推导】- bilibili

3.6 实践Eigen线性代数库

安装线性代数库Egien,这个库是C++编写的

sudo apt install libeigen3-dev

Eigen的特性是,不能混合两种不同类型的矩阵,具体代码请看书籍或配套资料

3.6.1 QR分解(QR decomposition)

在书籍代码中有涉及,这是考研数学的一部分,来复习下,QR分解的一个目的是为了快速寻找矩阵特征值

参考资料
【矩阵分解:QR分解】
形象解释线性代数之QR分解

3.7 四元数到其它旋转表示的转换

3.8 相似、仿射、射影变换

常见变换的性质比较

第4讲 李代数

http://www.lryc.cn/news/531153.html

相关文章:

  • 【ChatGPT:开启人工智能新纪元】
  • 1. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--前言
  • 量子力学初步:微观领域的科学之旅
  • 趣味Python100例初学者练习01
  • postgresql的用户、数据库和表
  • 对游戏宣发的粗浅思考
  • 【Java基础-42.3】Java 基本数据类型与字符串之间的转换:深入理解数据类型的转换方法
  • (9) 上:学习与验证 linux 里的 epoll 对象里的 EPOLLIN、 EPOLLHUP 与 EPOLLRDHUP 的不同
  • webpack传输性能优化
  • 智能小区物业管理系统打造高效智能社区服务新生态
  • (done) MIT6.S081 2023 学习笔记 (Day7: LAB6 Multithreading)
  • 面试经典150题——栈
  • openmv的端口被拆分为两个 导致电脑无法访问openmv文件系统解决办法 openmv USB功能改动 openmv驱动被更改如何修复
  • 自制虚拟机(C/C++)(三、做成标准GUI Windows软件,扩展指令集,直接支持img软盘)
  • 算法题(56):旋转链表
  • 解决PyG安装中torch-sparse安装失败问题:详细指南
  • 如何创建折叠式Title
  • go-zero学习笔记(三)
  • Wildcard工具详解:从入门到精通
  • 冰蝎v3.0 beta7来啦
  • React中使用箭头函数定义事件处理程序
  • 记忆化搜索和动态规划 --最长回文子串为例
  • Tree Compass( Codeforces Round 934 (Div. 2) )
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.17 掩码数组:缺失值处理的优雅方案
  • PHP 常用函数2025.02
  • react中如何获取dom元素
  • 【C++】继承(下)
  • C语言实现字符串排序:从代码到原理深度解析
  • Vue3的el-table-column下拉输入实时查询API数据选择的实现方法
  • 【数据结构】_链表经典算法OJ:复杂链表的复制