亚马逊AWS官方博客

“小米人车神争霸赛”冠军方案

背景

AWS DeepRacer 是全球第一款由强化学习驱动的 1/18 比例的完全自动驾驶赛车。开发人员可以在在线模拟器中训练、评估和调整强化学习模型,将他们的模型部署到 AWS DeepRacer 实车上,并参加 AWS DeepRacer比赛。本次小米人车神争霸赛使用了re:invent 2018跑道,笔者的队伍“旋风冲锋龙卷风”在线下比赛中跑出了25s三圈的成绩,一举夺得冠军。作者将在本篇博客中介绍模型训练的策略和比赛经验,希望可以对读者有所帮助。

本次线下赛之前的培训会中,指导老师提到:线上与线下差异较大,往往追求极限速度的策略,在线下赛中较容易出圈无法完赛。因此线下赛的策略是追求稳中求进,以下方案是以此为基础设计的。

方案

在“Amazon DeepRacer 多种策略模型实战应用分析”中,提到了两种较为稳定的模型方案。其中一种是让小车沿中线前进,比如Example1采用的是计算到中线的距离来保持小车前进方向,但是作者觉得该方法动作空间过大,难以在有限的训练时间内让模型收敛到较好的结果上。另外一种则是PurePursuit 策略,这是本次比赛中作者使用的策略。

图1 PurePursuit策略示意图

PurePusuit策略的思想是,借助waypoints(如上图1所示序列点),计算小车与最近以及下一个point的关系,进而调节小车的动作。依据这种思路,就能够衍生出很多种不同的方法。比如,1)根据waypoints间的距离计算速度,让小车速度params[‘speed’]去拟合;2)也可以从角度出发,根据points间的角度关系,结合小车的前进方向params[‘heading’]以及小车转向角度params[‘steering_angle’]来进行拟合。本方案采用的是后者。

以图2为例,理想状态下,小车沿着中线,由A驶向B。在当前位置,若想直线到达B,则在当前行驶方向的基础上,小车需要逆时针转动β度,因此可以令小车的转向角变量α去拟合目标角度β。因此,问题就转换成为了如何求解β,并将α和β结合进行reward function的设计。

图2 基于角度的PurePusuit方法

本方案中的求解方法为:

(1)获取当前距离小车最近的点A,并将当前点作为起点;

(2)以0.9*track_width为半径,以小车为中心,搜索小车前进方向上,第一个出圈的点,即为目标点B(x1, y1)。

(3)然后利用当前小车位置(params[‘x’], params[‘y’])计算小车到达B点的转向角β。

(4)计算角度误差error=abs(steering_angle – β),并将 max(1-error, 0.01) 作为奖励函数。

但是,有一个问题需要注意,即中线上waypoints的分布是不均衡的,如下图3所示。当处于密度较小的区域时,就容易出现因未能及时扫描到下一个点来计算转向角,而使得小车沿着某个方向一直前进,导致出弯。

图3 waypoints点分布图

很显然,丰富轨道信息,在密度小的区域内增多waypoints是最直接的解决方法。插值是在已知有限数量的离散点的基础上,通过补插连续函数,使得这条连续曲线通过全部给定的离散数据点,并且能够估算出在其他点处的近似值的一种技术。插值能够增多waypoints的数量。

插值技术有很多种,包括线性插值、多项式插值、样条曲线插值等。图4给出了对正弦曲线上部分离散点的采用不同插值技术的可视化结果。

图4 对正弦离散点的不同插值方法可视化结果对比图

作者之前使用贝塞尔插值处理过相似的问题。贝塞尔曲线经由法国工程师皮埃尔·贝济埃(Pierre Bézier)应用在汽车主体设计上而得到推广使用。贝塞尔曲线完全由其控制点决定其形状,n个控制点对应着n-1阶的贝塞尔曲线。当时想要尝试使用二阶的贝塞尔插值方法,但是由于临近开赛时间,退化使用一阶贝塞尔插值。一阶贝塞尔曲线的表达为:

其中,是起点,是终点,factor是插值因子,是插值。factor的选取会对模型的训练过程有影响。当factor过大时,轨道点的密度很大,训练过程中,模型学习到的转向角就比较集中在小角度的变化范围中,泛化能力不足。factor较小时,插值的作用又会被削弱。这里则分别取了10/20/40,并一一在线下赛中进行测试。最终,factor取值为20的模型更为稳定。

另外,在训练过程中,为了加快收敛并更贴近实际,采用了离散的动作空间进行训练。线下赛模型训练参数为,供读者参考:

线下赛小Tips

线下比赛情况多变,这里奉上一点作者的个人心得:

(1)未上赛道前的调试参数要记录下来,中途可能会因为更换电池等重启小车,记录下来可以快速完成调试。

(2)上赛道后,一般给的速度百分比为50%,要珍惜赛前调试时间,选定好稳定模型后,逐步上调速度百分比,了解小车的极限,在保证稳定的前提下不断突破。

(3)赛前测试的情况,与比赛期间的情况会略有不同,原因是多方面的,比如光线、信号源干扰、电池电量等。要在比赛给定的调试时间内快速部署,可以先从极限速度测试一轮,再根据表现做调整。

(4)认真准备,享受比赛。

本篇作者

王杰

小米集团算法工程师,负责手机端侧相关算法研发工作,擅长应用机器学习和深度学习算法解决业务问题。

纪路

亚马逊云科技解决方案架构师,现负责集团战略客户。拥有8年广告行业大数据架构、开发经验。擅长事件驱动架构、Serverless架构、流式处理架构的设计和开发。同时对SQL/NoSQL数据库的建模、调优有深入的研究。

赵安蓓

亚马逊云科技解决方案架构师,负责基于亚马逊云科技云平台的解决方案咨询和设计,尤其在大数据分析与建模领域有着丰富的实践经验。