聚合国内IT技术精华文章,分享IT技术精华,帮助IT从业人士成长

通俗理解感知融合的经典算法:卡尔曼滤波

2021-09-18 02:43 浏览: 7170042 次 我要评论(0 条) 字号:

前言

        我个人有近10年AI教育经验了,中间获得过一些名号,比如北理工校外导师,微软MVP兼CSDN技术专家,本博客也有1700多万PV了,在AI圈内有了极高知名度。后2015年和团队一块创业创办AI职教平台「七月在线」,至今已近7年,这6 7年我们把AI职教做透了,同行没做的我们做,同行没有的广度我们有,同行不到的深度我们到(本处同行仅指AI社会培训机构)。

        六年多来,在专注成人AI职教的同时,面对过很多行业的刺激,但自始至终都坚持专注AI。可过程中也越发深刻意识到,AI只有与行业深度绑定结合才能真正发挥出超级价值,考虑到我们的使命始终是“推动社会智能化发展”,加之国家的制造强国战略特别提到新能源汽车、智能汽车,而AI可以很好的赋能自动驾驶,所以一个月前我司平台的定位由“AI职教平台”改为“AI与汽车职教平台”。

        一个月的时间,我们组织了50位汽车专家/讲师(年底100人),与原有的200+AI专家/讲师区分开,大家讨论中都深感传统车企向智能化转型的急迫。偶然中,在一车企客户现场聊到感知融合的经典算法:卡尔曼滤波,故新一篇博客就写这个。这算法神到什么程度呢,比如有人号称当年阿波罗就靠它登陆上的月球  :) ​​​​ 

        关于卡尔曼滤波,网上有一篇流传甚广的文章《How a Kalman filter works, in pictures》,也有不少朋友对它进行过翻译。我看过几遍,觉得还可以把卡尔曼滤波解释的更通俗些,毕竟把相对复杂的算法尽可能解释的更通俗易懂,从而让更多初学者更好更快的理解,是我现在继续更新博客的唯一动力了。

        此外,为照顾一些传统汽车人甚至之前没听说过智能网联、自动驾驶的朋友也能从本文有所收获,故我会从智能网联、无人驾驶开始讲起,直到讲透卡尔曼滤波算法。另欢迎批评指正,thanks。

第一部分 无人驾驶技术架构

1.1 什么是智能网联

一般而言,智能网联包含了自动驾驶和车联网,高级别的自动驾驶又称无人驾驶。

图片

从上图对智能网联汽车的定义,可以看出涉及的技术不少,每项技术背后都对应着一个个岗位

我们来分析其中几个岗位,比如视觉SLAM算法工程师。

那什么是slam呢?我们知道,传统的图像处理基本上是基于二维图像,而人眼是通过两只眼睛的视差(双目立体视觉)来感知周围的三维空间。随着三维视觉传感器的飞速发展,三维视觉核心技术:SLAM(全称 Simultaneous Localization And Mapping,译为同时定位与地图构建)技术,在无人驾驶、智能机器人、无人机、增强现实等领域应用越来越重要。可以说凡是具有一定行动能力的智能移动终端都具有有某种形式的SLAM系统。

视觉SLAM中的传感器即为摄像头

  • 摄像头如果使用深度相机,可以直接获取障碍物的距离,生成点云数据
  • 当然也有用单目、双目、鱼眼摄像机的视觉SLAM ,这些摄像头需要用其他的方法才能间接的获取周围障碍物的距离

可能有同学问了,视觉SLAM都要求掌握哪些技术呢(当然 以下所有这些技术都可以通过这个slam课掌握好)?

  1. 常用的操作系统也是Linux,这和我们做IT后台开发或AI算法研发,不懂Linux寸步难行,学校没学的,都得在找工作中或公司里抽时间恶补;
  2. 编程语言:C、C++,在如今AI特别火的时代,Python可以说是数据科学领域第一语言了,通过Python入门AI确实是不错的选择,但入门之后,真想在IT、AI、汽车行业真正深入发展,只懂一门Python可能就不够了,第二门语言可以是C/C++(C++ primer、深度理解C++对象模型等经典书都不错),也可以是Java(这里也有个Java与数据结构课)
  3. SLAM相关的数学知识,包括且不限于:线性代数基础(矩阵操作)、三维空间的刚体运动、SLAM中空间点与不同的坐标系、旋转的表达(四元数、旋转矩阵、旋转向量、欧拉角)、李群与李代数、相机成像及常用视觉传感器、最小二乘法
  4. SLAM核心技术点:视觉里程计、多视角几何、视觉里程计中的位姿估计方法 、非线性优化(比如卡尔曼滤波)、回环检测与重建常用的vSLAM算法,如ORB-SLAM、SVO、DSO、MonoSLAM,VINS以及RGB-D相机等
  5. ROS机器人操作系统;
  6. 一些滤波算法,比如误差状态卡尔曼滤波器、扩展卡尔曼滤波、无迹卡尔曼滤波,英文简写分别为ESKF、EKF、UKF等

对于以上六点,有两点值得再提的是:比如针对第3点,不要忌惮数学,因为凡是涉及到数据相关的技术,最后都是算法,最深入都是数学(可能你此刻还不这么觉得,但当你你看完全文后你一定会深以为然);针对第4点,下面是“RGB-D相机中的直接法运用”的示意图

 再比如视觉感知算法工程师,会涉及

  1. 感知算法研发和系统实现,基于视觉的障碍物检测、跟踪、行为预测等;
  2. 感知的视觉几何计算三维重建,目标检测跟踪、图像分割、图像识别等算法研发;

最后,再比如传感器融合算法高级工程师,这个岗位的岗位职责一般是:通过融合摄像头、激光雷达、毫米波雷达等传感器的感知信息,实现对周围动静环境的精确描述及预测,具体包括

  1. 多传感器多目标跟踪与意图预测,涉及感知信息的预处理、目标创建、关联、状态估计、合并与删除等等;
  2. 构建高性能的3D感知融合系统;
  3. 设计开发基于毫米波雷达稀疏点云的目标检测;
  4. 栅格地图静态环境实时构建。

反应到岗位要求,一般有以下几点

  1. 扎实的编程能力,熟悉在Linux环境下进行C++Python开发,理解常用数据结构及STL使用;
  2. 深入理解卡尔曼滤波等贝叶斯滤波算法,能够熟练地进行数学建模及其状态估计,深入理解常用的数据关联算法与距离计算方法;
  3. 熟悉摄像头、激光雷达、毫米波雷达等传感器,熟悉计算机视觉及其应用,有SLAMDeep Learning基础更佳;

对的,卡尔曼滤波在感知融合里应用很广。

1.2 自动驾驶/无人驾驶

现在是个车企都在往自动驾驶方面投入(动辄就是上百亿),到了好像没有自动驾驶,就不是一辆可以上得了台面的车,毕竟智能三电、智能座舱、自动驾驶已代表未来汽车的发展趋势,所以没自动驾驶没未来。而自动驾驶的门槛相对高,技术种类也不少,所以市面上类似的书、课程都不多(比如有一本《第一本无人驾驶技术书》,七月在线也曾于2019年推出过一个《无人驾驶实战》,后面则陆续推出过目标检测、目标跟踪、slam、行为识别与分析等等小课)。

总的说来,无人驾驶系统主要由三部分组成:算法端、车端和云端。其中算法端包括传感器、感知和决策等智能关键步骤的算法;车端包括机器人操作系统、各种计算硬件和车辆底盘硬件等;云端包括数据挖掘、仿真模拟、高精地图以及深度学习训练等等。

2.png

之前七月在线《无人驾驶实战》的授课老师盛老师有写过一篇关于自动驾驶L4级技术的短文,现引用如下:

无人驾驶要解决4 个关键问题:我在哪?我周围有什么?接下来会发生什么?我应该怎么做?

1.2.1 我在哪?定位、高精地图

    定位问题是无人车首先要解决的问题,只有明白自身的位置才能最优的开往目的地。定位需要依靠一种称为高精地图的技术,该技术会将无人车要走的所有静态环境进行描述,包括车道线、行人斑马线、标志牌等等。这些静态信息可以提供交通信号的关键信息,也会作为定位方案的锚定物对自身的位置进行校准,比如通过摄像头看到距离左边标志牌的距离是2.5m,那么在地图中知道了标志牌的坐标也就知道了自身车辆的坐标。同时,还会依靠GPS/IMU等全局设备来定位自身位置,不过这可比我们目前智能手机里的GPS精度要求高很多,通过差分融合技术可以达到厘米级精度。

3.png

1.2.2 我周围有什么?视觉感知、激光雷达等
有了定位后,无人车的感知系统将通过传感器和人工智能算法将周围的障碍物位置、大小、状态、类别等标识出来。目前主流L4级别的传感器包括GPS/IMU、LIDAR、Camera、Radar等,LIDAR、Camera和Radar都是用于感知周围障碍物的主要传感器,分别在不同环境下能够有不同的优势。这些信息犹如人类驾驶员的眼睛一样看到周围动态环境物体,并将其识别出来,而无人车会利用自己多传感器和计算效率达到远超人类的水平,比如精准识别车辆后方任何物体、同时关注左右两边的车辆状态,在黑暗状态时可以通过激光雷达精准识别。

4.png

1.2.3 接下来会发生什么?行为预测、速度预测
    无人车知道周围动态物体后,还需要能够尽可能的预测这些物体的走向,包括行为预测和速度预测。例如这个车是要左转还是直行,这辆车会不会闯红灯等等,汇入车流时速度是多少。这些问题都将决定我们无人车后续应该怎么走,如何避免碰撞发生危险。当然由于人的主观意志具有很多不确定性,在人类司机和自动驾驶司机混合的道路上,人工智能程序还需要学习人类的行为习惯和约定俗成的礼让方式,这些都大大增加了无人车的难度。

5.png

1.2.4 我应该怎么做?决策、规划、控制
    最后一步就是根据上述信息综合来选择一条最适合无人车的道路,如同人类的大脑一样对车辆最终的行为负责,选择最合适的方式达到目的地。这需要考虑行车的体感、安全和快捷等因素,通过最优化算法、搜索算法、蒙特卡洛树采样等多种算法来得到未来的驾驶行为,也有通过模仿优秀老司机的驾驶行为等方式来提升驾驶性能等等。

6.png

    上述4个问题表面上仅仅是车辆端的问题,但是其背后的技术栈是异常庞大复杂的,这些人工智能技术会用到云端的仿真系统、模型训练系统等等。要做好其中任何步骤都是学术界长期以来不断积累而得,也是需要工程能力非常强大的工程师才能实现的高效算法。无人驾驶作为人工智能的一个重大应用方向,不是某一项单一的技术可以实现的,它是一个目前人类技术巅峰的一个整合创新。需要有算法上的创新、系统上的融合以及云平台的支持。

第二部分 卡尔曼滤波算法

什么是卡尔曼滤波,下面是维基百科上的解释

​卡尔曼滤波(Kalman filter)是一种高效率的递归滤波器(自回归滤波器),它能够从一系列的不完全及包含噪声的测量中,估计动态系统的状态。卡尔曼滤波会根据各测量量在不同时间下的值,考虑各时间下的联合分布,再产生对未知变数的估计,因此会比只以单一测量量为基础的估计方式要准。卡尔曼滤波得名自主要贡献者之一的鲁道夫·卡尔曼。

卡尔曼滤波的算法是二步骤的程序。

  1. 在估计步骤中,卡尔曼滤波会产生有关目前状态的估计,其中也包括不确定性。只要观察到下一个量测(其中一定含有某种程度的误差,包括随机噪声)。会通过加权平均来更新估计值,而确定性越高的量测加权比重也越高。
  2. 算法是迭代的,可以在实时控制系统中执行,只需要目前的输入量测、以往的计算值以及其不确定性矩阵,不需要其他以往的资讯。

也发展了一些扩展或是广义的卡尔曼滤波,例如运作在非线性系统的扩展卡尔曼滤波及无迹卡尔曼滤波(unscented Kalman filter)。底层的模型类似隐马尔可夫模型,不过潜在变量的状态空间是连续的,而且所有潜在变量及可观测变数都是正态分布。

恩,官方的定义向来准确严谨,唯一问题就是不够通俗、不够易懂,怎么理解更好懂呢?很简单,抽丝剥茧,一个算法相对复杂,一般来讲是因为其中的背景知识比较多,那咱们就来一一剖析,切开了揉碎了自然就好懂了。

2.1 贝叶斯与HMM

首先,卡尔曼滤波里面包含着贝叶斯框架的思想,其次底层的模型类似隐马尔可夫模型。

什么是贝叶斯?为避免篇幅过长,仅引用我之前写的一篇贝叶斯笔记的部分内容简单复习下(全文请看参考文献5):

    贝叶斯派把需要推断的参数(比如对一件事情发生或不发生的概率)看做是一个随机变量,所以要计算的分布,便得事先知道的无条件分布,即在有样本之前(或观察到X之前),有着怎样的分布呢?  

    比如往台球桌上扔一个球,这个球落会落在何处呢?如果是不偏不倚的把球抛出去,那么此球落在台球桌上的任一位置都有着相同的机会,即球落在台球桌上某一位置的概率服从均匀分布。这种在实验之前定下的属于基本前提性质的分布称为先验分布,或的无条件分布。

    至此,贝叶斯及贝叶斯派提出了一个思考问题的固定模式:

先验分布 + 样本信息 后验分布
    上述思考模式意味着,新观察到的样本信息将修正人们以前对事物的认知。换言之,在得到新的样本信息之前,人们对的认知是先验分布,在得到新的样本信息后,人们对的认知为。  

什么又是隐马尔可夫模型?引用参考文献6的部分内容复习梳理下:

假设我手里有三个不同的骰子。
第一个骰子是我们平常见的骰子(称这个骰子为D6),6个面,每个面(1,2,3,4,5,6)出现的概率是1/6。
第二个骰子是个四面体(称这个骰子为D4),每个面(1,2,3,4)出现的概率是1/4。
第三个骰子有八个面(称这个骰子为D8),每个面(1,2,3,4,5,6,7,8)出现的概率是1/8。

假设我们开始掷骰子,我们先从三个骰子里挑一个,挑到每一个骰子的概率都是1/3。然后我们掷骰子,得到一个数字,1,2,3,4,5,6,7,8中的一个。不停的重复上述过程,我们会得到一串数字,每个数字都是1,2,3,4,5,6,7,8中的一个。例如我们可能得到这么一串数字(掷骰子10次):1 6 3 5 2 7 3 5 2 4

这串数字叫做可见状态链。但是在隐马尔可夫模型中,我们不仅仅有这么一串可见状态链,还有一串隐含状态链。在这个例子里,这串隐含状态链就是你用的骰子的序列。比如,隐含状态链有可能是:D6 D8 D8 D6 D4 D8 D6 D6 D4 D8

一般来说,HMM中说到的马尔可夫链其实是指隐含状态链,因为隐含状态(骰子)之间存在转换概率(transition probability)。在我们这个例子里,D6的下一个状态是D4,D6,D8的概率都是1/3。D4,D8的下一个状态是D4,D6,D8的转换概率也都一样是1/3。这样设定是为了最开始容易说清楚,但是我们其实是可以随意设定转换概率的。比如,我们可以这样定义,D6后面不能接D4,D6后面是D6的概率是0.9,是D8的概率是0.1。这样就是一个新的HMM。

同样的,尽管可见状态之间没有转换概率,但是隐含状态和可见状态之间有一个概率叫做输出概率(emission probability)。就我们的例子来说,六面骰(D6)产生1的输出概率是1/6。产生2,3,4,5,6的概率也都是1/6。我们同样可以对输出概率进行其他定义。比如,我有一个被赌场动过手脚的六面骰子,掷出来是1的概率更大,是1/2,掷出来是2,3,4,5,6的概率是1/10。

参考文献

  1. 智能网联汽车技术路线图2.0及创新应用路线图
  2. 如何入门学习自动驾驶技术(一)​​​​​​
  3. 七月在线《无人驾驶实战》小课
  4. Wikipedia上关于卡尔曼滤波的解释
  5. 从贝叶斯方法谈到贝叶斯网络
  6. 如何通俗理解隐马尔可夫模型HMM?

to 此刻看到本文的读者

本文于9.17日开始写,预计一周基本完稿,然后修改一周,所以十一之时基本成型。至于十一之前你可以看到本文的成文、修改过程,而十一之后,你就可以看到全网关于卡尔曼滤波最通俗易懂的文章拉。

作者:v_JULY_v 发表于 2021/09/17 11:22:37 原文链接 http://it.taocms.org/09/84149.htm
阅读:84


网友评论已有0条评论, 我也要评论

发表评论

*

* (保密)

Ctrl+Enter 快捷回复