《听大咖 讲论文》直播回顾丨百度Apollo自动标定系统:一种工业级、数据驱动、基于学习的车辆纵向动力学标定算法
去年,百度在长沙宣布自动驾驶出租车队Robotaxi测试运营正式开启。今年开始,Apollo在长沙全面开放载人测试运营,目前覆盖的路网面积已达70公里,站点数量50个以上。
同时,Apollo生态联盟也在不断壮大,已拥有200+家生态合作方,囊括全球主流的整车、零部件、芯片、通信、出行、初创公司和科研公司,拥有40000多名全球开发者。Apollo已在不同场景落地,疫情期间生态合作伙伴的约100辆无人消毒车在17个城市运行。
当然,这些成绩离不开技术积累。根据今年3月发布的《北京市自动驾驶车辆道路测试报告(2019年)》,百度在多个技术维度上获得第一。在牌照方面,百度是全国目前唯一获得T4驾考牌照的公司。而在自动驾驶专利上,百度的自动驾驶技术专利位列全国第一。
那么,百度Apollo在核心技术上具体是如何更迭的?
6月30日,在CSDN、百度APP、B站举办的《听大咖 讲论文》——Apollo自动驾驶专场上,百度技术工程师精选了3篇百度智能驾驶领域的年度优秀论文,为开发者揭秘百度Apollo背后的核心技术创新,内容涉及鲁棒LiDAR定位系统的定位模块、控制模块、自动驾驶预测技术等。这些技术为解决因施工修路造成的定位失败问题、车辆的动力学状态问题、周边行人车辆的预测问题,提供了更优越的思路。除此之外,还对自动驾驶技术的发展做出展望。
上周我们为大家整理了《<听大咖 讲论文>直播回顾丨变化的城市场景中LiDAR惯性里程计辅助的鲁棒LiDAR定位系统》,今天我们将继续为大家送出第三篇论文讲解,由百度Apollo资深研发工程师——许昕为我们讲解《百度Apollo自动标定系统:一种工业级、数据驱动、基于学习的车辆纵向动力学标定算法》
了解更多相关内容,请点击下方视频观看:
ENJOY THE FOLLOWING
控制模块是直接跟车打交道的,它的跟踪精度以及对各工况的适应能力,是自动驾驶中非常重要的一部分。这篇论文主要介绍了如何在不需要获取一些车辆参数,比如发动机参数、轮胎参数的情况下,而且在比较剧烈的载重变化情况中,算法如何识别并适应这种变化。
本次分享分为三大块:
首先是背景介绍,可能一些不是非常熟悉控制模块的同学可以关注下这块,在这里会介绍一些背景知识,以及为什么要做这种算法以及这种算法会用到哪些场景里。
其次我们会具体到算法里,首先说一说控制模块的框架,然后介绍本篇论文的一个解决方案,接着是实现的思路和效果图,最终的效果是要通过实车路测来说话,所以说我们也会提供一些车在路上跑的一些性能指标。
最后是结语部分,会跟目前传统方法做比较,众所周知,汽车是一个具有悠久历史的工业,其实自动驾驶遇到的一些问题在汽车工业里可能也有洞悉,比如说本篇论文涉及到的因载重变化引起的纵向标定问题,在传统领域里也有比较成熟的方案,所以在结语部分会对比下这两种解决方案的思路和各自的特点。
先简单介绍下什么是纵向动力学以及我们为什么要做纵向动力学的自动标定。纵向动力学,这里我们专门指车辆的油门/刹车状态,油门/刹车是控制车辆加速度的。质量越大的物体惯性也越大,加速减速越困难。比如说一辆车在空载的时候可能加速减速都比较快,到了满载的时候就会发现,同样踩刹车油门,车的响应就会不一样,对于自动驾驶的车辆而言,载重的变化造成的这种纵向动力学状态的变化是需要算法自动识别的,也就是说,当这辆车里没有人去干预的时候,不管是满载、半载还是空载,我们的控制模块都需要识别出来,而且还得保证控制精度不受大的影响。
这里大家可能会奇怪,对于载重可以在车里装一个传感器感应重量或者用摄像头去数货物数人的方法,这样是否可行?汽车工业对成本是十分敏感的,加一个传感器的可靠性和成本都要斟酌再三,所以非常多的传统的方法以及我们的方法都着重在除了汽车本身固有的一些传感器,比如除IMU之外,我们不要求其他的额外传感器的情况下,怎么样去做这件事情。
本次以物流小车为例,说明在有载重变化的场景中,如何解决载重变化造成状态变化的开发与测试。在这个场景下,空载情况下整车重量是300千克,满载情况下可以达到660千克,载重变化超过1倍。
在这种情况下,如果说控制模块无法适应这种载重的变化,在一些指标上,比如位置误差和速度误差就会受比较大的影响,直观来说是车辆的控制性能会下降,可能空载时候跑得挺好,满载的时候速度上不去,该刹的时候刹不下来。
本文专门针对这个场景,在不要求额外配置专用传感器的前提下,以及不要求一些车辆参数的背景下,开发了能够适应明显车辆载重变化的控制算法。
介绍一下解决这个问题的基本框架,控制器接收来自定位、轨迹以及底盘状态的输入,然后利用这些输入结合一些控制算法去分别控制车辆的横向部分和纵向部分。本文所描述的算法就是在红色虚线框中纵向控制的部分,在本文的架构里,我们纵向控制输出的实际上就是我们对于该车期望达到的一个加速度,但是这个加速度不能直接发给底盘,原因是OEM的限制,而是通过一张“标定表”,将算法输出的期望的加速度通过“标定表”转化成底盘能够理解的油门/刹车的开合度。
本文的自动标定,实际上是针对标定表的,比如说在空载的时候,在一定速度下,踩50%的油门能获得一个加速度a;在满载的情况下,同样的条件,如果要获得加速度a可能需要踩70%的油门。所以这里速度、加速度以及油门的开合度就存在一定的对应关系,标定表实际上就反应了这种对应关系。自动标定就是说在载重变化的时候,在标定表内部能够实时的体现出这种对应关系的变化,从而使得我们能够更好的执行控制模块给出的希望的加速度。本文提到的自动标定分为两个部分:离线自动标定和在线自动标定。
离线自动标定是车辆在人工驾驶后,根据人类驾驶的数据,离线通过网络的模式去生成一张初始的离线标定表,这张表表达了人工驾驶时车辆纵向状态,是当时车辆的加速度/速度以及油门/刹车之间的一个对应关系,那么这个离线的标定表作为初始标定表给到自动驾驶使用,当车辆在路上跑的时候,算法会实时地收集必要的数据,比如说速度、期望的加速度、实际的加速度以及给到车辆的油门/刹车的指令等等,根据这些东西计算出一个△acc,代表车辆由于载重的变化而导致的纵向状态的变化。比如在空载的时候,原本在速度V下,踩50%的油门能产生a的加速度;而满载时,在同样的条件下,踩50%的油门产生的加速度b,那么这个b的变化,实际上是计算这个△acc得出来的。
最后将△acc和初始的离线标定表融合,得到一张新的标定表,因为这张表是自动驾驶实时生成的,所以叫它在线标定表,需要注意的是,在线标定表是每一帧都在实时变化的,并不是一成不变的,这个变化的过程,就是算法实时标定的过程。在标定的同时,算法输出的加速度会通过查询新的在线标定表得到对应的油门和刹车开合度,这样只要算法在不停地标定,在线标定表保持在一个最新的状态,我们通过这张表得到的油门和刹车的开合度也会较为准确地反映车辆当时的状态,达到提升控制、跟踪能力的效果。
可以知道,在我们在线实时标定的过程中,△acc的计算是非常重要的,因为它反映的是车辆当前的状态和初始标定表的一个变化。这是如何计算△acc的过程。首先在自动驾驶的过程中,系统会实时收集相关的数据,如上文所讲,比如IMU的数据以及系统下发的指令等等。数据收集过来之后,需要做一些预处理,因为实车在路上跑的时候,传感器不免会产生噪音的,在标定的过程中,希望拿到尽可能干净的数据,避免噪点对算法的影响,所以根据我们的系统的特点,设计了一些预处理步骤,以最大程度来过滤一些噪点。
对于其他系统而言,需要考虑到自己系统的特点在预处理中作出相应的改变。预处理完成之后,涉及两个cost,一个是距离的cost,另一个是相似度的cost,这两个cost的详细的公式和计算步骤在论文里面都有。这两个cost主要用来限制每一次更新的范围和幅度,因为我们希望每一帧都是小步小步的更新,慢慢收敛,其实这个不基于车辆动力学模型的,所以,我们不希望这个算法根据某几帧的结果对这个表进行大范围大幅度的修改,最后经过这两个cost计算出△acc,用来更新现有的标定表。
传统上,采用的方法多以动力学建模为主,根据我们的经验,像重卡这种载重可以超自重几十倍的案例,传统的方法也可以在数分钟内就完成标定。只是用动力学建模的方法,需要用户对动力总成系统比较熟悉,而且需要实时获取比较底层、关键的车辆参数。但很多时候开源社区的用户可能对动力总成系统并不熟悉,或者因为商业合作关系没有办法从OEM拿到比较底层的车辆参数。
我们的方法是将车辆纵向动力系统作为一个黑箱对待,不试图对其进行建模,只要发现速度、加速度、油门、刹车对应不上,就把能对应的地方进行调整。这可以类比成梯度下降的方式,当然,我们是没有模型的,所以也不是真正的梯度下降。
在物流小车这个特定场景里,我们也提供了这种方法的路测数据,想在该场景下研发的社区用户也可以参考这些数据。
对于未来在这个方向上的探索,我们认为大家可以关注如何用类似的思维,去进一步解决在路上遇到的道路坡度、风阻等问题。此外,横纵向同时能够标定的话可以达到更加精确的性能,我们目前的做法是横、纵向分开标定的。
比如除了纵向标定方法之外,我们也使用了横向自动标定的方法,而且单独标横向的话,我们测试方法中收敛的时间大概是几秒钟。但是我们认为未来在一些比较复杂的路况,比如高速或者复杂工况下,如果能够实现横纵向联合标定的话,可能控制性能会更好。在这个方向上,我们也十分欢迎开源社区与我们一起探索。
这个方法是没有用到一些动力学模型的,那么怎么样保证在线更新表的时候是朝着正确的方向更新呢?
经过对cost的设计,以及对一些不合理数据的过滤,我们保证表大致的更新方向。然后每次更新的幅度都特别小,来防止错误的更新造成的影响。更新的方向主要是通过反馈得来(预期与实际的差别)。未来当然也可以考虑一些简单动力学模型的融入。
标定表用的曲线拟合方式是生成的吗?
标定表里面主要是格点,没有去拟合。
标定表是什么?类似replay buffer吗?
标定表反应了车辆纵向动力学的状态。
利用这个标定方法,不同车型都需要人工驾驶先产生标定表吗?
因为车型不同,纵向动力学也是不一样的,需要标定。这个跟车辆业界的做法也是一致的。
什么是预处理采用的滤波算法?
主要是一些低通滤波、均值滤波,过滤噪点。
如何保证车辆载重不变时在线标定表的收敛性?
cost的设计比较重要,我们专门有一个similarity cost,倾向于相信车的原始表是正确的,除非车辆确实载重了,否则我们拿到的反馈会非常小,而且也会被similarity cost拉住不怎么去更新表。
离线标定中用到的feed-forward网络是用什么数据训练的?是否有开源数据?
是用人类驾驶的数据,自己收集去训练的,我们并没有去查看是否有现成的开源数据集。
这个根据标定表进行控制的算法,驾驶的平顺性如何?
驾驶的平顺性,跟Planning、Control的算法,以及标定表的准确性是综合相关的。
在车辆行驶过程,横向控制对纵向控制影响大么?如果有影响,大概有多大影响?是否共同考虑两者对整车行驶的影响或者建立整车模型?
横向控制当然有影响,但是影响有多大,这个得分场景、工况去考虑。在我们一些极其注重横向精度的场景(例如厘米级别),会用专门的横向在线标定方法去测量方向盘的零偏。整车模型的重要性,在我们的ppt最后结语部分有提及,是需要关注的,但是也是一个难点。
在线标定怎么知道差别是来源于重量变化还是路面摩擦力变化?
因为这个其实是模型无关的,所以其实是不知道的。
用人工驾驶数据进行离线标定如何保证标定表覆盖所有工况?
在司机师傅开的时候,我们会尽可能覆盖我们常用的一些速度、加速度区间,其他路上较少涉及的,也会去专门覆盖一下。
如果考虑到极限路面附着系数,该控制算法的精度还能达到要求吗?
非常极限的工况,我们并没有测试过。但是该算法是模型无关的,理论上是可以去测试一下效果,或许可以跟一些模型结合起来在这种工况下使用。当然,在极限工况下,其实标定表只是一方面,可能算法上也需要去做专门处理。
离线标定的3层网络有介绍吗?
论文上比较详细,还有好几种方法的对比,可以去看看。
通过这个算法框架训练出来的无人驾驶汽车能否去辅助想拿驾照新手去学开车?
这个算法只是对标定表在线更新,只涉及到无人车里其中一个模块。
标定表能够通过函数进行拟合或者差值出来吗?
这个我们没有去尝试。不过车辆的动力学一般比较复杂,可能在某些线性区比较好的地方可以尝试。
这种算法是属于强化学习范畴吧?
应该不是。
相比物流小车,自动驾驶的卡车满载和空载重量相比更大,自动标定精度要求是否更高?
这个需要看具体的工况、场景和要求,以及你对精度的定义(例如绝对还是相对)。
人工驾驶是什么工况?
如果是问标定表采集时候的工况的话,一般都是正常城市路面。
会随车辆上下坡改变吗?
因为该算法是模型无关的,所以其实不区分是重量引起的,还是上下坡引起的,所以如果是上下坡,是会进行标定的。
人工驾驶对速度、制动加速程度是否有要求?
会有一部分要求,主要是跟自动驾驶的常用工况相对应。但是并不是十分特殊的要求,大多数也是平常的加速场景、速度、加速度等。
标定时考虑工况路况吗?
如果工况的改变,影响到了标定表的准确程度,该算法是会去更新标定表以反应现在的工况的。
是否有考虑横向控制对纵向控制的影响?是否有考虑路径变化对标定的影响?
横纵向结合的问题,ppt结语有提到。
离线标定表的数据具体需要包含哪些?可以理解是每一时刻的加速度、油门、刹车、速度吗?
差不多可以这么理解(根据底盘不同不太一样)。在汽车工业,这个做法比较普遍。
如果同时考虑附着力变化和载重变化,是否有效呢?
只要影响到了标定表,理论上该算法都会生效(摩擦、风阻、坡度、重量等)。鼓励大家在多个工况下多多测试。
是不是应该检测坡度,较大坡度下关闭自动标定?因为如果一直上坡自动标定的差不多了,突然下坡怎么办?
我们提出的是一种算法,不涉及具体业务。具体的应用场景、要求,可以根据大家的要求去改变。
车辆上下坡在这个方法中如何体现?
上、下坡时,油门、刹车、速度、加速度的对应关系变了,该算法就会去改变标定表。
车辆的所有信号都是直接读取的CAN信号?
这个每个系统都不一样,也有其他渠道来的信号。
对于大卡车来说,有考虑拖头拖挂角度对校准的影响么?
拖挂是个非常复杂的问题,这一块可以跟开源社区的朋友们一起去探讨。
在线标定的代码实现有考虑开源?
论文里把方法、公式、数据都非常详细的公布了。
车速来源是什么?是GPS速度,还是车上的速度,还是融合的速度?
融合后的速度。(理论上越准越好)。
模型有用到道路垂直坡度的补偿吗,在道路有坡度时误差会比较大吗?
有坡度时该算法也会去校正,因为该算法并不区分导致标定表变化的来源(不管是重量还是坡度)。
*论文链接:https://arxiv.org/abs/1808.10134
以上就是本次关于百度Apoll自动标定系统:一种工业级、数据驱动、基于学习的车辆纵向动力学标定算法课程的全部内容。欢迎大家提出问题,进入社群进行交流。更多相关技术干货也可以继续关注后续的课程。
点击文章左下角『阅读原文』
可看直播视频回放
自Apollo平台开放已来,越来越多开发者积极地参与到我们所开设的分享当中,并基于Apollo擦出更多火花。
欢迎开发者继续关注Apollo开发者社区每月的课程分享,获取更多学习资料和自动驾驶相关技术内容。
开发者还可以添加Apollo小哥哥(微信号: apollo_xzs)为好友,加入开发者交流社群与业内开发者进行互动,期待大家的沟通交流!