Welcome to VimSkill’s documentation!¶
Contents:
基本的数学模型¶
相机自身的位置与当前位置下的路标的观测数据。 所以一共两个方程 一个自身的运动方程,另一个对于路标的观测方程。当相机在 \(x_k\) 位置时,看到某个路标点 \(y_j\) ,产生了一个观测数据 \(z_{k,j}\).
\(x_i\) 是相机自身的位姿状态 \(t=1,...,K\) 是 \(u_k\) 是传感器参数, \(w_k\) 是噪声, \(v_{k,j}\) 是观测里的噪声。 相机检测的路标用 \(y_1,...,y_n\) 来表示。
基本的工作流¶
SLAM 的难点,在仅通过计觉里程计算将不避免地出现累计漂移。 当然传感器本身误差不准确,以及和各种噪声的存在。为了解决漂移问题,我们采用两种技术 后端优化与回环检测。 后端优化这就要通过一个nlp优化,而回环检测,就是把机器人回到原始的位置给检测出来。
![digraph G {
graph [layout=dot rankdir=LR];
node [shape=box];
sensor->vo->nlp->map[weight=10];
sensor->loop_check->nlp;
}](_images/graphviz-c2f45a61b119b84e273bc6fcfe6bc1ac344b57fb.png)
传感器¶
- 单目摄像头,无法解决尺度问题
- 双目, 通过视差来解决深度
- RGB-D 深度摄像头
- 激光雷达
- IMU 测量自身的位姿
- GPS
VO¶
主要是解决,计算机是如何通过图像确定相机的运动。相机本身的旋转与平移。 主要是通过相邻帧间的图像估计相机运动。并恢复场景的空间。
特征点,关键点与描述子两部分组成,相似性通过描述子的各种度量距离来计算暴力匹配,可以用汉明距离,当然还快速近假最近邻(FLANN)。 特征是图像信息的另一种数字表达式,我们的目标是要使特征点在相机运动之后保持稳定。
CPU还无法实时计算SIFT特征。当然通过GPU加速后的SIFT,就可以满足实时计算要求。
特征点个数 | ORB(Oriented FAST and Rotated BRIEF) | SURF | SIFT |
---|---|---|---|
1000 | 15.3.ms | 217.3ms | 5228.7ms. |
不同的方法,角点的描述能力也不一样。
- 单目的时候,从2D的像素坐标估计相机问题运动,对采用对极几何,多线共面的约束来求。
- 双目 RGB-D, 两组3D点来估计运动,来求平移与旋转,就用ICP来解决。
- 如果3D点与它们在相抽的投影位置,用PnP来估计的相机的运动。
而采用传统图像处理的方法,特征点不稳定,量大,并且特征点不突出,并且没有语义。而现在基于 DL的做法,可以直接得到基于语义的特征点。 特征点: 可重复性,可区另性,高效率,本地性。
特征点的优缺点: 1. 关键点的提取与描述子的计算在耗时。 2. 使用特点点,忽略了除特征点以外的所有信息,相当于丢弃了大部分可能有用的图像信息。 3. 相机在没有明显纹理信息的场景下,会遇到特征缺失,没有找到足够的匹配点来计算机相运动。
直接法:
- 保留特征点,但不计算描述子。直接发使用光流跟踪,并且直接计算特征点在一时刻的位置,光流法会根据图像像素灰度信息来计算机运动。对光照要求严格。




nlp 非线性优化¶
因为在自然状态下,看到的结果就是当前环境约束下的最优解。 所谓的优化也就是得到一组平衡点。
- 原理根据依赖列出方程组,然后再根据变量的个数建立最小方程组的个数。 最后还能通过量最优解。
- 李群李代数利用旋转与平移矩阵组合李群的特征,然后再通过李代数 把转换成代数约束来建立方程。
- g2o 图优化,就是利用图论的理论来做优化,利用图论,利用变量当做结点,而约束变成边。
- 要么是常规的非线性约束,例如非线性的最小二乘,那就利用Ceres库。
Mapping¶
建立的地图分为两种,度量地图与拓扑地图。 对于拓图地图可以用游戏里的八叉树之类的 来建立。当然这个是建立图形的识别的基础上的,这个地方可以利用生GAN生成模型。
度量地图,就是那种分网格,tiling地图,记录每一个tile里状态。最好多的状态那就是路标信息。
- 稀疏的地图
- 半稠密地图
- 稠密地图
直接用点阵库这样才建立map会太大,可以词态来建立关键链。 当然词态可以用聚类的这些算法来实现。 最简单的结构那就是点云了,这就是利用上了PCL库了。
传感器的融合¶
单一的传感器功能往往十分有限,但是多个传感器之间的相互关系复杂,很难直接描述。 现在可以利用神经网络直接连接各个传感器,并且通过神经网络的网络的拓扑结构来表达之间的相互关系。来解决各种滤波的问题。
每一种传感器都有其独特的优势与弱点。可以通过组合来实现取长取补短。同时处理复杂环境数据,会造成车辆驾驶决策的延迟,而最大限度减少这种延迟,是提升车辆安全性的又一关键部分,一个方案那就是数据融合能够减少系统做驾驶决策所需的计算资源。
例如无人驾驶通过传感器融合技术,将各种传感器的不同视角整合,并最终赋能自动驾驶车辆环境感知。 并且通过冗余来提供鲁棒性。 例如毫米波雷达可在低分辨率情况下完成测距,且受天气困素影响很小,而摄像头有更高的分辨率,能够感知颜色,但受强光影响较大,激光雷达则能够提供三维尺度感知信息,对环境的重构能力更强。
同时利用人工智能自动不断迭代来建立一个高精度的地图。
自动驾驶对于计算量的要求。
现在的奥迪A8可以在60KM/h下实现自动驾驶,你就是16.66m/s. 每秒20fps,其核心是每帧可以前进行多少米。也就是16.66/20=0.833 也就是计算每帧0.833秒。 这个同时也与探测的安全的距离相关,也就是给你多少反应时间。同时这么大的计算量的对于资源的消耗又是怎样的。
相机¶
相机的模型,那就要做相机的标定,包括内参数与外参数。 内参数就是光学参数,焦距以及畸变参数。 而外参数则是指相机的位姿,相比于不变的内参,外参数会随着相机的运动发生改变,同时SLAM中待估计的目标。
ORB¶
orb 加了码盘信息(帧间约束),走2.4米,跟踪点少,光照100流明以下时,误差30~10cm 特征点跟踪100个以下时,误差太。
普通摄像头噪点多,误匹配多,系统极不稳定。
现在能否直接把识别直接放在传感器,对了用FPGA。把FPGA + DL + 传感器放在传感器上。
SLAM on Jetson TX2¶
![digraph G {
node [shape=box];
Camera ->"Jetson TX2"-> "V4L2Engines"->CUDA->TensorRT->GL;
"Decodes from video" ->"run deep learning"->"do post processingwithCUDAandGraphics";
}](_images/graphviz-7c20f31b709ed44ced2249239d90d004ce3f5e2a.png)
Install CUDA
sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-r381_8.0.84-1_amd64.deb sudo apt-get sudo apt-get install -y --allow-unauthenticated update sudo apt-get install -y cuda sudo dpkg --add-architecture arm64 sudo apt-get --allow-unauthenticated update sudo apt-get install -y --allow-unauthenticated cuda-cross-aarch64
libopencv4tegra-dev
sudo apt-get install -y cuda-cross-aarch64