SLAM_JOURNEY
[TOC]
研0入门
了解研究领域概况
- 了解研究领域的背景
- 由背景入手建立研究领域的框架
寻找适合的文献
- 找准关键术语,用不同的数据库检索文献
SLAM十四讲学习
学习这本书的方法
- 理解算法,补习数学基础
- 应用实践,跟着书敲代码,调调参数
- 习题,建议都练习一遍,对掌握知识很有帮助
SLAM的数学描述
已知$(uk,z{k,j})\to(x_k\text{定位},y_j\text{建图})$,相当于一个状态估计问题
第3讲 三维空间刚体运动
坐标系间的欧式变换
使用一个旋转矩阵R和一个平移向量t完整地描述了一个欧氏空间的坐标变换
但上述描述经过多次变换会显得很罗嗦并存在非线性关系,因此,引入齐次坐标和变换矩阵
这样使得整个变系为线性关系,其中矩阵T称为变换矩阵
关于四元数旋转,矩阵的迹还没有搞懂—2023.10.20
useGeometry例程理解
针对useGeometry例程,主要作用在于
- 设定旋转向量(旋转角度,沿哪个轴旋转
- 由旋转向量得到旋转矩阵
- 使用Angle Axis和旋转矩阵进行坐标变换
- 欧拉角的转换(由旋转向量直接转换)
- 将旋转向量转换为欧式变换矩阵进行坐标变换
- 使用四元数即进行坐标变换(也由旋转向量转换而来)
plotTrajectory例程理解
Isometry3d是Eigen库中的一个类,用于表示三维空间中的等距变换(Isometry)。等距变换是一种保持距离和角度不变的变换,它包括平移和旋转。
Quaterniond是Eigen库中的一个类,用于表示四元数(Quaternion)。四元数是一种数学工具,用于表示旋转或姿态的一种方式。与欧拉角和旋转矩阵相比,四元数具有一些优点,例如不存在万向锁问题,具有更高的计算效率等。
对于plotTrajectory程序,程序思路如下
- 定义vector类型的poses用于存储变换矩阵
- 对每个时间的目标进行旋转(Quaterniond)和平移(pretranslate)
- 绘制轨迹
对于DrawTrajectory函数,理解如下
先往下看吧,这段代码貌似不那么重要~
第4讲 李群与李代数
李群与李代数基础
理解了李群和李代数的概念,掌握SO(3)、SE(3)与对应李代数的表示方式
三维旋转矩阵构成了特殊正交群SO(3),变换矩阵构成了特殊欧式群SE(3)
- 对于只有一个(良好的)运算的集合,我们称作群
由$RR^T=I$进行求导,得到了$exp(\phi_0^{\land)}=R$
对于SO(3)上的指数映射是将$exp(\phi^{\land})=\sum_{n=0}^{\infty}\frac{1}{n!}(\phi^{\land})^n$,再通过将$\phi$分解为模长$\theta$和方向$a$对其泰勒展开进行化简,最后得到和罗德里格斯公式一样的式子
- 但遗憾的是并不是每个旋转矩阵$R$都能找到唯一的$\phi$,指数映射只是一个满射,并不是单射。类似于第三讲的万向锁问题?
- 如果我们把旋转角度固定到$±\pi$之间,那么李群和李代数元素是一一对应的
SE(3)上的指数映射同理,从而得到李群与李代数的三维旋转和三维变换的对应关系,见书p81
李代数求导与扰动模型
近似公式
在李代数上进行加法运算并不能对应SO(3)的两个矩阵乘积。但是,当$\phi_1$或$\phi_2$为小量时,小量二次以上的项都可以被忽略。此时,BCH拥有线性近似表达:
对于某个旋转R,对应的李代数为$\phi$。我们给它左乘一个微小旋转,记作$\Delta R$,对应的李代数为$\Delta\phi$。那么,在李群上,得到的结果就是$\Delta R*R$,而在李代数上,根据BCH近似,为$J_l^{-1}(\phi)\Delta\phi+\phi$。合并起来,可以写成:
反之亦然
李代数求导
第7讲 视觉里程计1
SLAM系统分为前端和后端,
Linux操作系统
SLAM十四讲使用ubuntu20.04操作系统为基础。在Windows里面,设置不好设备,您可以骂它,在Linux里面,如果设置好设备,您要感激它!
Linux系统由于是开源的操作系统,所以他的程序代码可以被修改成适合在各种机器、不同的硬件上运行。Linux的可移植性
Linux的文件权限与目录配置
使用ls -al命令查看文件属性,Linux的文件权限与目录配置
遇到的一些错误和问题
cmake后没有make出现error
bash: fg: %: 无此任务
解决办法:
cmake后再添加make
添加库文件会报错
6 | printHello();
| ^~~~~~~~~~
| printHELLO检查源文件发现没有错误,检查库文件后才发现把函数名称定义错误
解决办法:在头文件中拼写错误的函数名称修正
KDevelop中断点在边框中用鼠标点不了
解决办法,光标选中某一行使用Ctrl+Alt+B快捷键来打断点
针对某一程序Excute不能输出结果不正常,为另一个程序的输出结果,是由于Run中的Configure Launch的配置问题
解决办法:修改Configure Launch中的target project为目标程序文件
KDevelop如何建立新工程?
安装好Pangolin库后,运行ch3中的plotJecttory程序时,报错:
error while loading shared libraries: libpango_windowing.so: cannot open shared object file: No such file or directory
解决办法:是由于动态链接库异常,没有正确的加载共享库Terminal输入
sudo ldconfig即可KDevelop设置C++11标准
CMAKE_CXX_FLAGS -> -std=c++11
常用命令
查看eigen3版本,对于其他库更换名字即可
pkg-config --modversion eigen3 |
apt-get命令是一个功能强大且免费的包管理命令行程序,用于与Ubuntu的APT(高级打包工具)库配合执行新软件包的安装、删除现有软件包、升级现有软件包、甚至用于升级整个操作系统。
更新系统包
sudo apt-get update
升级系统包
sudo apt-get upgrade
查看Linux内核版本
uname -r |
关机命令
poweroff |
重启命令
reboot |
查看ubuntu版本号
lsb_release -a |
vim命令
数学基础问题
线性代数
反对称矩阵
通过反对称矩阵将向量的乘法变为线性运算
反对称矩阵满足
单位正交基
一个n维空间中任何一组线性无关的向量,都是这个n维空间的一组基。当这组基的向量两两垂直,则称为正交基。
三维空间中的单位正交基可以表示为一个 3x3 的矩阵,其中每一列代表一个基向量。假设单位正交基的三个基向量分别为 u, v, w,它们可以组成以下矩阵形式:
其中 u₁, u₂, u₃ 是向量 u 的三个分量,v₁, v₂, v₃ 是向量 v 的三个分量,w₁, w₂, w₃ 是向量 w 的三个分量。
具体表示如下所示:
正交矩阵
- 所有的列向量都是单位正交向量
- 所有的行向量都是单位正交向量
- detA = +1 或detA =-1
- 若detA =1,则A为n维旋转矩阵 (),旋转矩阵X旋转矩阵=旋转矩阵
- 向量X的范数(Norm) 或欧拉长度(Euclidean Length )
- 正交矩阵对向量进行正交变换,且正交变换不改变向量的长度(范数):设X的正交变换为AX,则AX的范数为:由此可见AX的范数与X的范数相等