这两天读了一篇MIT关于无人车规划与决策方面的综述文章,写的非常全面,读完酣畅淋漓。读到了很多复现过以及刚产生idea就发现被人做了的工作,有必要在这里进行一些总结,同时作为读完文章的一个规整。在下文中对原文的翻译与转述将用黑色字体,个人的一些看法与评价将用红色字体。
这篇综述发表在《Annual Review of Control, Robotics, and Autonomous Systems》期刊中,是2018年刚发出的文章,因此其中的很多引用都非常新。同时作者眼光非常毒,很多本综述发表时还挂在arxiv上的文章现在也都纷纷出现在了NIPS、RSS、IJRR等顶刊顶会上。下面将依照论文行文顺序进行介绍。
自动驾驶中的规划与决策:综述
一、简介
随着车辆的增多,道路恶性事故也在逐年递增,带来了巨大的人员伤亡。而无人驾驶技术在解决这一问题上具有很大的潜力,同时为人类的出行带来了极大便利,因此我们需要研究无人驾驶问题。但同时这也是一个非常宏大的问题,涉及到很多领域例如:车辆设计、车辆控制、感知、规划……
在本篇文章中,我们主要着眼于以下几个问题:
- 无人车如何决定下一步去哪里?
- 如何利用感知信息进行决策?
- 与其他行驶车辆的交互会怎样影响决策?
- 如何从自身/他人的行驶数据中学习自动驾驶?
- 自动驾驶如何保证正确性与安全性?
- 怎样实现高效的合作共融式自动驾驶?
自动驾驶的5级分类早已经成为评判自动驾驶“自动程度”的一个准则,这里我们的研究目标是第五级即完全的自动驾驶,不需要人的干预。早在2004-2007年,美国就多次举行DARPA无人车挑战赛,从沙漠环境到城市环境,美国国防部先进研究部门为此投入了巨大的资金与政策支持,这也成为自动驾驶21世纪的第一个技术井喷期。然而必须要指出的是,DARPA挑战赛是有很大局限性的,由于其“比赛”式的行驶,决定了很多队伍会使用一些工程上的tricks,实用性上有所欠缺。更严重的局限在于DARPA挑战赛的环境大多是低速、无拥堵环境,技术难度相对较低,因此还需要研究更普适的自动驾驶方法。
真正的完全自动驾驶需要在不可预测的环境中根据感知及时、安全地作出决策,并控制无人车贯彻决策,这其中包含着巨大的技术挑战。
将自动驾驶问题看作一个从感知输入到控制输出的系统问题,则对此问题的解决思路有如图三种,分别是:
- 传统方法:感知层->行为选择层->运动规划层->反馈控制层
- 行为-意识方法:将1中行为选择与运动规划融为一体
- 端对端方法:直接从传感器输入映射出控制输出
也许是没有看出这篇文章的内在逻辑,个人感觉本文写的有些凌乱,其中第一章即本章简要介绍了本文内容与结构。第二章介绍了运动规划与控制的综述,可以近似认为对上述的传统方法做一总结,但同时还夹杂着一些别的方法。第三章又从感知讲起,带入到端对端方法,包含了上述的第三条。第四章讲了基于“行为-意识”的运动规划方法,近似与上述第二条。后面五六章简要的介绍了可靠性证明与安全性保证的一些方法,以及整个自动驾驶系统架构的一些框架。最后对文章进行了总结。需要指出的是,虽然大致分割如此,但作为一篇宏大的综述文章,在每一个小章节中又夹杂着一些擦边的内容,让本文的结构稍显混乱。
二、运动规划与控制
本章主要讲了传统的一些运动规划与控制方法,包括车辆动力学与控制、人车配合关系、传统自动驾驶的运动规划。
2.1、车辆动力学与控制
这方面的研究主要着眼于如何通过车辆动力学模型将车辆控制到期望的状态,例如姿态、位置、速度等。文中介绍比较简略,主要有PID、非线性控制、MPC、反馈-前馈控制等方法,倒是控制系的老本行,但个人对这方面兴趣不大,因此不过多研究。
前面几种方法都是基于模型的方法,因此通常需要先对模型做系统辨识,而对车辆这样庞大的模型做系统辨识是一项想想就头大的工程,还设计低速-高速工作点漂移等诸多问题。当前的主流方法分为基于最优化与基于学习两条路,选择哪条需要看具体需求与实际情况,例如带估参数过多的话也许最优化方法算不过来。同时对工作点漂移等问题,终身系统辨识等方法也在被研究。
2.2、人车关系
说实话我不清楚这一小节是怎么被塞进“运动规划与控制”这个章节的,不过看起来确实塞哪里都不太合适,还是尊重作者吧。
当前的驾驶员(人类)与驾驶算法之间的关系大致可以分为三种:
- 串联关系:即人类作出决策,驾驶算法去负责下层执行,这是目前最经常看到的一种关系,但也是智能程度最低的一种关系。、
- 交替式关系:即人类与驾驶算法交替式控制车辆,可以想见的一点是通常驾驶算法负责的控制过程应该是难度较低的一段,例如无车高速上长时间的定速巡航等。
- 平行式关系:这也是本节本来想着重讲的一个问题,即算法与驾驶员进行平行决策,在驾驶安全收到威胁的时候算法主动帮助驾驶员解决紧急问题,提升驾驶安全性。例如倒车防撞系统等。这也是最近的一个研究方向。
2.3、自动驾驶中的传统运动规划
首先这里给出了两篇对传统运动规划的综述文章,在传统路径规划/轨迹规划上这两篇文章介绍的更加全面一些。传统的路径规划问题有三种常见解决方案:
- 空间离散化+碰撞检测: 即A*那个流派,对地图先进行离散,再在里面依靠碰撞检测进行路径搜索。这是一种非常高效的方法,在高速路这样的简单环境中有着很大的应用空间。但其通常适用环境比较小,对观测要求比较高。
- 随机规划方法: 即RRT那个流派,应该也是先对地图离散出障碍物,但其通过随机撒点与优化,可以在更大的搜索空间中实现规划(虽然确实对算力消耗很大但还是可以搞的)。
- 约束最优化&滚动优化方法:利用最优化进行运动规划,这个与前两中个人认为放在一起比较牵强,前两种更多是应用于寻路中,而这种方法通常使用在路径跟踪中(例如变道过程中的轨迹优化)。
同时需要指出,在自动驾驶中,“找到路”不一定意味着这样的路可以走,因为还有各种交通规则的约束。于是如何将“交通规则”融合入运动规划中就成为了一个需要研究的问题。同时,有时交通规则并不是一定需要遵守的,尤其是在别的车已经违反交通规则并带来一定危险性的情况下,轻微的违反交通规则来确保安全是可以接受的。于是如何在平衡规则与安全性也是正在被研究的。
在整个第二章中,大部分方法都是在静态或者可以估计的动态环境中展开研究的,但在真实道路环境中,动态物体很多且难以预测,拥挤环境更是成为自动驾驶的噩梦,因此在下章将着眼于通过端对端方法研究这一问题。
三、融合感知与规划
本章主要讲了如何将感知与规划进行融合,分为两大块,首先是对感知方法的一个简要讲解,接着介绍了端对端的感知-规划方法。
3.1、从传统感知到当前基于神经网络的感知方法与挑战
首先给出了一个近期对感知方法进行总结的一篇综述,其中包括了物体识别、运动估计、目标跟踪、场景理解以及对各种数据集的端对端学习等方面,包含了KITTI、ISPRS、MOT、Cityscapes等多个数据集的介绍。
传统的视觉方法通常是基于特征点的,例如SIFT、BRISK、SURF、ORB等人为设计的特征点提取方法是这些方法最底层的组成。接着通过追踪、匹配这些特征点,可以实现定位、位姿估计以及建图、包括即时定位与建图(SLAM)等高级任务。一些典型的SLAM方法如ORB-SLAM 1\2、 LSD-SLAM、SVO等都是基于特征点方法的。随着激光的发展与小型化、平民化,人们也开始研究多传感器融合定位、建图、导航等问题。
建图当然具有其必要性,如果对于任意一个环境我们都能建立起足够精度的地图,那么一切导航规划问题都变成了搜索问题,然而要建立其这样的地图是不现实的。因为首先地图的更新不能保证实时,而自动驾驶中要求的反应时间通常是百毫秒级别的。同时地图尤其是融合了视觉点、关键帧与激光点云的地图在建立、存储和传输中都很不方便。因此通常我们只保存一个轻量级的带语义地图,而对于其他动态特征,我们通常需要进行实时的感知。
这里作者推荐了关于道路与车道线检测的另一篇综述,个人认为对相关方向的研究非常有参考价值。在目前检测领域中,基于深度学习的方法占有统治性地位,如Faster RCNN等方法在逐渐统治相关挑战赛。
然而目前的一个有挑战的问题在于高分辨率图片的语义分割,目前先进的方法如ResNet系列与PSPNet等可以实现80%以上的mIOU,其他ENet、ICNet也有其适用性。
深度神经网络需要解决的一个重要问题就是跨域间的结果稳定性。这牵扯到监督数据从何而来的问题。这里不妨介绍几个不错的自动驾驶数据集:
- Kitty: 这是当前几乎SLAM、目标检测等领域最常用的数据集,包括了多道路场景下多传感器的数据,同时有比较成熟的标注,主要应用于双目、光流、目标检测与跟踪、SLAM等领域。
- CityScapes: 这个数据集在图像分割领域有着和kitty相似的地位,都是相关领域的不二之选。
- Oxford RoboCar数据集(IJRR 2017):这个数据集是牛津花了一年时间在其内部道路上进行了百余次采集组成的多传感器(2D、3D lidar,GPS+Inertial,VO等)数据集定位感知数据集。其主要优势在于对同一地点的近百次经过,提供了各种天气、各种光照下的数据,可以作为算法鲁棒性的测试数据集。但英国是靠左行驶,也许对一些驾驶决策类任务该数据集不适合国内使用。
- ApolloScape(CVPR 2018):百度发布的对标kitty的数据集,大致看起来与kitty比较类似。
- DBNet(CVPR 2018):上交-厦大联合发布的一个数据集,与上述不同之处在于这个数据是面向自动驾驶决策而采集的,只有他录入了行驶过程中对应每一帧图像和激光下人类司机的动作指令(速度、方向盘角度),其他数据集则必须通过轨迹等进行逆向恢复,可能存在一些误差。
同时本文还提到一些基于贝叶斯方法和蒙特卡罗方法的域迁移和域适应,个人不是很感兴趣,域适应还得靠GAN。
3.2、端对端规划
传统自动驾驶框架中,感知和规划控制之间是有明显界限的,但随着深度学习、神经网络的发展,搞图像的那帮人越搞越膨胀了,经典的目标检测、跟踪、语义分割干的人太多了,一部分人就被挤到规划控制领域了。这样的工作这两年来层出不穷,例如ITSC2017的一篇利用驾驶数据集中驾驶轨迹作为真值进行端对端轨迹预测的弱监督学习,以及一众利用采集数据过程中的假设进行自动标签标注的弱监督学习,背后都有相似的神韵。同时这些原来搞图像的人还不甘心之搞端对端规划学习,往往还给学习网络旁边挂一些”辅助任务“比如”场景语义分割辅助驾驶行为预测“,”定位与深度估计辅助导航决策”等。但这种方法通常是一通分析很有道理,一看结果象征性提高一个点。
接着谈谈端对端这种把黑箱进行到底的方法,这种方法在决策问题中也可以称为“行为映射法”(behavior reflect approach),早在1989年就有人用神经网络开始做了(ALVINN, Autonomous Land Vehicle in a Neural Network)。随着GPU算力越来越猛,搞图像的那帮人觉得自己不但可以预测分类这种简单问题了还可以解决直接给出驾驶行为预测这样的问题了。问题是人家真的可以搞出来,NVIDIA 2016年的那件工作几乎是这些年类似工作的一个缩影,将图像与控制命令作为数据喂给模型,然后一通优化居然就真的能用了,不过人家确实也有自己的东西,并不是粗暴只把行驶中正前方的摄像头的图像数据扔进网络,而且还在偏左与偏右方向各设置了一个摄像头相当于生成一些绕动后的数据并进行反方向标注,这样等于在工作点附近生成了大量的纠正样本,这个操作是极重要的。
同时也有人对端对端这种方法的“黑箱”性质提出了问题,有的人提出要打开黑箱,看看里面的特征,比如Bojarski M等人关于卷积神经网络在驾驶学习中特征可解释性的工作。也有人更进一步要打破这个黑箱,又回到感知-规划分离的框架中,比如肖建雄ICCV-2015的一篇文章就提出要将感知适应自动驾驶需求,利于去学习一些“距离前车距离”、“距离车道中心距离”这样的一般搞视觉的人不太重视的中间结果,再用这些中间结果去知道自动驾驶系统进行行为决策。
对于规划到哪一个级别这个问题,有人搞的是规划到“控制层”即速度和方向盘角度,也有人规划到“决策层”即直行、左右转之类,也有厉害的两个都做,比如Xu等人CVPR-2017的一个工作,通过视频直接分别去学离散的决策和连续的控制,还去做了比较。他们也是之前那个非要给里面整个语义分割任务辅助预测的,不过看看他们只通过”上一时刻速度“一个特征就可以估计下一时刻速度到80%的准确率,其他加入的各种结构和特征感觉都有点没事找事的感觉。
不只是传统的监督学习,一些强化学习和模仿学习的工作也需要依靠端对端方法。例如DAgger这种"专家"手把手教"网络"的方法,个人认为这种方法有其独特之处,是一种有前途的方法。因为监督学习一般是不会有agent的现场探索过程的,都是离线学习离线测试的,谁也不知道真正拉到路上能不能工作,而强化学习虽然是把”探索“提高到了史无前例的指导地位,但没人敢把无人车开上马路让他自己探索,Deepmind这种在仓库里搞几十个机械臂”真-强化学习“的团队也不敢在无人车上这么搞。那么怎么样能让agent既实现了真实环境探索又不会惹事呢?DAgger这种旁边坐一个教练的方法还真的是目前最靠谱的。
不只是在无人驾驶领域,在他的兄弟领域——移动机器人领域这种端对端方法也是常规操作。例如Pffeifer等人ICRA-2017的一篇文章就通过对2D激光雷达用一个CNN去学然后跟目标点信息一个全联接,直接数据速度、角速度信息,可以实现在室内环境中对移动机器人的”数据驱动导航避障规划“。
在搞感知出发的端对端学习过程中必须考虑的一个问题还是域迁移问题,因为图像的各种光照、天气影响是常有的,不如”前车距离“这种信息这么普适。搞域迁移的方法还是那么几种,值得一提的是最近很多人搞的从仿真到真实环境的域迁移问题。如果这种域迁移可以比较高效真实的完成的话,强化学习就有希望从”游戏“变成真实的控制策略。两种思路,一种是在仿真环境中进行进行强化学习,在真实环境中应用时需要把真实图像迁移到仿真环境中,让机器人在自己适应的域中进行决策。另一种是直接在训练的时候对仿真环境中采集到的数据进行域迁移,让训练环境更加真实。但个人感觉可能效果都不会太好,毕竟”统一场理论“到现在都还完善不了。
四、行为意识运动规划
第二章的大部分方法需要对其他交通参与者未来的行为进行预测,然而当环境拥挤时,预测每一个动态物体的运动是不现实的。因此我们需要一些行为意识上的方法。例如人类司机在驾驶时通常会通过一些车辆行为进行个人意识的表达,这在拥堵场景中是比较实用的。
4.1、合作与协同
我不搞这一方面,可能理解有一些偏差。
首先在复杂环境下进行沟通与协作是非常有必要的,在一个对他人意图不确定的环境中进行驾驶的应对方法主要有以下几条:
- 用更好的模型估计运动:这条和没有一样,如果有更好的模型就不叫复杂环境了。
- 假设所有其他机器人都是可控的:这会让策略非常激进。
- 通过联合分布:联合概率分布法。
4.2、博弈论方法
这种方法有一个前提假设即所有的agent都会采用”最优策略“,立足这一假设可以从对方的角度进行推断,这样可以很大程度上避免极端情况的产生。
尽管从博弈论上思考这个问题是一个有趣的方向,但随着参与博弈的个体增多,问题逐渐变得不有趣了。因为可以证明这个博弈问题的复杂度会随着参与者的增加而指数增加,最终变得不能暴力优化。于是一些奇奇怪怪的优化方法就出现了,比如决策树剪枝之类的方法,即使是围棋那么大复杂度的问题AlphaGo的蒙特卡罗搜索都可以解决。
还有人用”斯坦克尔伯格模型“来对问题进行建模,其核心就是孙子兵法的”知己知彼”思想在自动驾驶(与企业经营)中的应用。
4.3、概率论方法
研究这些方法的人都很厉害。尤其是概率图模型之类的解法根本看不懂。
4.4、POMDP模型
还有一些明白人指出这自动驾驶决策问题其实是一个POMDP问题,即部分观测马尔科夫决策过程。同理解决完全的POMDP问题过于复杂了,因此通常将“求解”转化为“估计”,毕竟求解Bellman方程很难,估计这种方程是个人都行,估计不准再慢慢优化呗。
4.4、基于学习的方法
当然学习的方法还是我们关注的焦点,实质上各种方法的一个主要区别在于是“模型驱动”还是“数据驱动”。仅目前从表现来看还是数据驱动更胜一筹,因为隐含在数据中的模型往往胜过人类找到的描述模型。
这里面的做法包括通过学习从经过的轨迹中进行未来驾驶行为的预测;同时一个新兴的方向是通过逆强化学习进行人类示教数据的学习,最终找到一个指导人类驾驶行为的核心Reward function。
RSS-2016的一篇文章和我之前的想法和做法很相似,他们直接通过对人遥控小车数据的逆强化学习学得了人类的驾驶行为,再以此为baseline学习到了一种“主动式的驾驶交互”,说白了就是学到你怎么开车之后就可以通过各种操作逼你停车、变道等,是一个有意思的想法。
这一方面比较有搞头的一条线大概是IRL->DIRL->GAIL,其中IRL是提出比较早的,但一个很大的局限性在于它的reward是对手工提取特征的线性组合,那这个能不能拟合出真实的reward就值得怀疑了。而通过引入深度神经网络,我们实际上是替换掉了之前的线性映射层,这样可以通过神经网络的万能拟合能力进行reward的学习。有了reward之后怎么用呢,我们可以再通过正向的强化学习,但这样干总觉得中间绕了点弯路,于是有人提出了GAIL的方法,可以从数学上证明GAIL中存在是另一种形式的IRL。需要注意的是IL代表Imitation Learnging而IRL则是Inverse Reinforcement Learning。
五/六、安全性与系统框架
研究兴趣不大。
七、总结
根据以上归纳,可以总结出当前自动驾驶领域规划与决策方面亟待解决的一些问题:
- 数据驱动方法,即学习之类的方法能搞的部分被人开发的七七八八了,学界需要下一波的技术创新,至于是Reinforcement Learnig 还是Meta Learing,抑或是真实环境中的在线学习,总之我们需要下一个上升驱动力。
- 各种方法的可证明性、安全性、可解释性的研究亟待提升,现在相当多的工作出现了可以用但不知道为什么可以用的现象,这要是有隐藏的暗门bug还是很恐怖的。
- 泛化能力。反而是搞图像的人对这个提的比较多,可能是高强化学习的人已经在泛化能力上无欲无求了。
同时文章也对未来很有希望的一些领域进行了提点例如:
- 在拥挤环境下的社会行为
- 在不确定性环境的安全性问题
- 面对极端天气、极端事件的鲁棒性
- 学习方法还需要继续打磨
- 证明与安全保证
- 体系化的系统而不是只为demo而生