Welcome to VimSkill’s documentation!

Contents:

基本的数学模型

相机自身的位置与当前位置下的路标的观测数据。 所以一共两个方程 一个自身的运动方程,另一个对于路标的观测方程。当相机在 \(x_k\) 位置时,看到某个路标点 \(y_j\) ,产生了一个观测数据 \(z_{k,j}\).

\[\begin{split}运动方程 与 观测方程 \begin{array}{lcl} x_k & = & f(x_{k-1},u_k,w_k) \\ z_{k,j} & = & h(y_j,x_k,v_{k,j}) \end{array}\end{split}\]

\(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;
}

传感器

  1. 单目摄像头,无法解决尺度问题
  2. 双目, 通过视差来解决深度
  3. RGB-D 深度摄像头
  4. 激光雷达
  5. IMU 测量自身的位姿
  6. GPS

VO

主要是解决,计算机是如何通过图像确定相机的运动。相机本身的旋转与平移。 主要是通过相邻帧间的图像估计相机运动。并恢复场景的空间。

  1. 特征点,关键点与描述子两部分组成,相似性通过描述子的各种度量距离来计算暴力匹配,可以用汉明距离,当然还快速近假最近邻(FLANN)。 特征是图像信息的另一种数字表达式,我们的目标是要使特征点在相机运动之后保持稳定。

    CPU还无法实时计算SIFT特征。当然通过GPU加速后的SIFT,就可以满足实时计算要求。

特征点个数 ORB(Oriented FAST and Rotated BRIEF) SURF SIFT
1000 15.3.ms 217.3ms 5228.7ms.

不同的方法,角点的描述能力也不一样。

  1. 单目的时候,从2D的像素坐标估计相机问题运动,对采用对极几何,多线共面的约束来求。
  2. 双目 RGB-D, 两组3D点来估计运动,来求平移与旋转,就用ICP来解决。
  3. 如果3D点与它们在相抽的投影位置,用PnP来估计的相机的运动。

而采用传统图像处理的方法,特征点不稳定,量大,并且特征点不突出,并且没有语义。而现在基于 DL的做法,可以直接得到基于语义的特征点。 特征点: 可重复性,可区另性,高效率,本地性。

特征点的优缺点: 1. 关键点的提取与描述子的计算在耗时。 2. 使用特点点,忽略了除特征点以外的所有信息,相当于丢弃了大部分可能有用的图像信息。 3. 相机在没有明显纹理信息的场景下,会遇到特征缺失,没有找到足够的匹配点来计算机相运动。

直接法:

  1. 保留特征点,但不计算描述子。直接发使用光流跟踪,并且直接计算特征点在一时刻的位置,光流法会根据图像像素灰度信息来计算机运动。对光照要求严格。
_images/SFM_overview.png _images/outline.png _images/overview.png _images/nvx_arch_diagram.png

nlp 非线性优化

因为在自然状态下,看到的结果就是当前环境约束下的最优解。 所谓的优化也就是得到一组平衡点。

  1. 原理根据依赖列出方程组,然后再根据变量的个数建立最小方程组的个数。 最后还能通过量最优解。
  2. 李群李代数利用旋转与平移矩阵组合李群的特征,然后再通过李代数 把转换成代数约束来建立方程。
  3. g2o 图优化,就是利用图论的理论来做优化,利用图论,利用变量当做结点,而约束变成边。
  4. 要么是常规的非线性约束,例如非线性的最小二乘,那就利用Ceres库。

Mapping

建立的地图分为两种,度量地图与拓扑地图。 对于拓图地图可以用游戏里的八叉树之类的 来建立。当然这个是建立图形的识别的基础上的,这个地方可以利用生GAN生成模型。

度量地图,就是那种分网格,tiling地图,记录每一个tile里状态。最好多的状态那就是路标信息。

  1. 稀疏的地图
  2. 半稠密地图
  3. 稠密地图

直接用点阵库这样才建立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";
}
  1. 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
    
  2. libopencv4tegra-dev

    sudo apt-get install -y cuda-cross-aarch64
    

Indices and tables