利用强化学习训练无人驾驶小车

在这篇文章中,我们将看到如何在几分钟内训练自动驾驶赛车以及如何平稳控制。该方法基于强化学习(RL)并在Donkey Car中呈现,旨在适用于现实世界。本文的工作建立在一家专注于自动驾驶的创业公司Wayve.ai的工作基础之上,本文中使用的代码已开源。

GitHub

 

https://github.com/araffin/learning-to-drive-in-5-minutes

 

简介:赛车比赛

 

自从几年前创建DIY Robocars以来,现在存在许多自动赛车比赛(例如Toulouse Robot Race,Iron Car ……)。在那些目标很简单:你有一辆赛车,它必须尽可能快地停留在轨道上,只给出车载摄像头的图像作为输入。

 

为了便于无人驾驶的学习,业界开发了开源自动驾驶平台Donkey Car。在它的生态系统中,现在有一个以小型机器人为特色的统一模拟器。我们将Donkey Car来训练测试。

 

大纲

 

在简要回顾了小型自动驾驶汽车比赛中使用的不同方法之后,我们将介绍强化学习的内容,然后详细介绍我们的方法。

 

 

带Arduino,树莓派和Pi相机的自动赛车机器人

 

用于自驾车比赛的方法:线路跟踪和行为克隆

 

在介绍RL之前,我们将首先快速回顾一下目前在RC汽车比赛中使用的不同解决方案。

 

在之前的一篇博文中,我描述了第一种自动驾驶的方法,它结合了 计算机视觉和PID控制器 。虽然这个想法很简单并且适用于许多设置,但它需要手动标记数据,告诉汽车轨道中心的位置。

 

 

预测轨道中心的位置

 

作为另一种方法,许多竞争者使用监督学习来重现人类驾驶员的行为。为此,人们需要在几圈内手动驾驶汽车,记录摄像机图像和来自操纵杆的相关控制输入。然后,训练模型以再现人类驾驶。然而,这种技术并不是非常强大,需要对每个轨道进行均匀的驱动和再训练。

 

什幺是强化学习(RL)以及我们为什幺要使用它?

 

鉴于上述问题,强化学习(RL)似乎是一个有趣的选择。

 

在强化学习设置中,代理(或机器人)作用于其环境并接收奖励作为反馈。它可以是一个奖励或惩罚。

 

机器人的目标是最大化累积奖励。为此,它通过与世界的互动来学习所谓的策略,将其感官输入映射到行动。

 

在我们的例子中,输入是摄像机图像,动作是油门和转向角。因此,如果我们以汽车停留在轨道上并最大化其速度的方式对奖励进行建模,那幺我们就完成了!

 

 

这是强化学习的美妙之处,你需要很少的假设(这里只设计奖励功能),它会直接优化你想要的东西(在赛道上快速赢得比赛!)。

 

注意:这不是第一篇关于小型自动驾驶汽车强化学习的博客文章,但与之前的方法相比,所提出的技术只需几分钟即可学习良好而顺畅的控制策略。

 

现在我们已经简要介绍了什幺是RL,我们将详细介绍,从Wayve.ai的方法开始,这是我们方法的基础。

 

学习驾驶一天 – Wayve.ai方法的关键要素

 

Wayve.ai描述了一种在简单的道路上训练现实世界中的自动驾驶汽车的方法。该方法由几个关键元素组成。

 

 

首先,他们训练特征提取器(这里是变分自动编码器)将图像压缩到较低维度的空间。该模型经过训练以重建输入图像。

 

从原始数据中提取相关信息的这一步骤称为 状态表示学习(SRL) ,是我的主要研究课题。这显然可以减少搜索空间,从而加快培训速度。下面的图表显示了SRL和端到端强化学习之间的联系,也就是说,从像素直接学习控制策略。

 

注意:训练自动编码器不是提取有用功能的唯一解决方案,您也可以训练例如逆动力学模型。

 

 

第二个关键要素是使用名为Deep Deterministic Policy Gradient(DDPG)的RL算法,该算法使用VAE特征作为输入来学习控制策略。每次迭代后都会更新此策略。该算法的一个重要方面是,它有一个记忆,被称为重播缓冲区,在那里它与它的环境之间的相互作用被记录下来,可以“回放”之后。因此,即使汽车不与世界互动,它也可以从这个缓冲区中获取经验来更新其策略。

 

对汽车进行训练,以便在人为干预之前最大化行驶的米数。这是最后的关键因素:一旦汽车开始离开,人类操作员就会结束这一事件。这种 提前终止 非常重要(如Deep Mimic所示)并且可以防止汽车探索无法解决任务的区域。

 

到目前为止,没有提出任何新内容,我们只总结了Wayve.ai的方法。以下是我对基本技术所做的所有修改。

 

学会在几分钟内开车 – 更新的方法

 

尽管Wayve.ai技术原则上可以起作用,但是它有一些问题需要解决,以便将其应用于自动驾驶的RC车。

 

首先,因为在每集之后训练特征提取器(VAE),所以特征的分布不是静止的。也就是说,这些特征随着时间的推移而发生变化,并可能导致政策培训的不稳定性。此外,在笔记本电脑上(没有GPU)训练VAE的速度非常慢,因此我们希望避免在每次迭代后重新训练VAE。

 

为了解决这两个问题,我决定事先训练VAE并使用Google Colab笔记本来保存我的电脑。这样,策略就会使用固定的特征提取器进行训练。

 

在下图中,我们将探讨VAE学到了什幺。我们在其潜在空间中导航(使用滑块)并观察重建的图像。

 

然后,已知DDPG是不稳定的(从某种意义上说,它的性能在训练期间可能会发生灾难性的下降)并且很难调整。幸运的是,最近的一个名为 Soft Actor-Critic (SAC)的 算法 具有相同的性能,并且更容易调整 *。

 

在我的实验中,我尝试了PPO,SAC和DDPG。DDPG和SAC在几集中给出了最好的结果,但SAC更容易调整。

 

对于这个项目,我使用了我为稳定基线编写的Soft Actor-Critic(SAC)实现(如果你正在使用RL,我绝对建议你去看看;)),它有最新的算法改进它。

 

最后,我更新了奖励功能和动作空间,以平滑控制并最大化速度。

 

奖励功能:快速前进但保持在轨道上!

 

机器人车没有任何里程计(也没有速度传感器),因此行驶的米数(也不是速度)不能用作奖励。

 

因此,我决定在每个时间步骤给予“生命奖励”(即,留在赛道上的+1奖励)并使用 “ 崩溃罚款 ” (-10奖励)惩罚机器人以离开赛道。此外,我发现在太快的情况下惩罚车辆也是有益的:与油门成比例的额外负面奖励会增加到撞车罚款中。

 

最后,因为我们想要快速行驶,因为它是一辆赛车,我添加了一个与当前油门成比例的“油门奖励”。这样, 机器人将尝试保持在轨道上并同时最大化其速度 。

 

把它们加起来:

 

避免摇摇欲坠的控制:学会顺利驾驶

 

世界并不是真正随机的。如果您注意到 – 机器人不会自发地开始颤抖。除非你把RL算法连接到它。 – Emo Todorov

 

如果你到目前为止应用所提出的方法,它将起作用:汽车将留在赛道上并试图快速前进。然而, 你可能会得到一个不稳定的控制: 汽车将如上图所示振荡,因为它没有动力不这样做,它只是试图最大化它的奖励。

 

平滑控制的解决方案是约束转向角的变化,同时利用先前命令(转向和节气门) 的历史来增加输入 。这样, 你就可以 在转向中 保持连续性

 

例如,如果当前汽车转向角为0°并且突然尝试以90°转向,则连续性约束将仅允许其例如以40°转向。因此,两个连续转向命令之间的差异保持在给定范围内。这种额外的限制需要多花一点培训。

 

在找到令人满意的解决方案之前,我通过了几天尝试解决该问题 ,所以这是我尝试过的不起作用 :

 

输出相对转向而不是绝对转向:产生频率较低的振荡

 

增加一个连续性惩罚(惩罚机器人以获得转向的高变化):机器人没有优化正确的东西,它有时会工作,但不会留在轨道上。如果罚款的成本太低,它就会忽略它。

 

限制最大转向:汽车不能再以最锋利的转弯停留在轨道上

 

堆叠几帧以给出一些速度信息:产生较低频率的振荡

 

回顾方法

 

在我们的方法中,我们将策略学习与特征提取分离,并添加额外约束以平滑控制。

 

首先,人类通过手动驾驶汽车来收集数据(手动驾驶约5分钟内的10k图像)。这些图像用于训练VAE。

 

然后,我们在探索事件(使用随机策略)和策略训练(当人类将车辆放回轨道以优化所花费的时间时完成)之间交替。

 

为了训练策略,首先使用VAE(这里具有64维的潜在空间)对图像进行编码,并且与最近采取的10个动作(节流和转向)的历史连接,从而创建84D特征向量。

 

控制策略由神经网络(2个完全连接的32和16个单元层,具有ReLU或ELU激活功能)表示。

 

该控制器输出转向角和油门。我们将油门限制在给定范围内,并且还限制当前和先前转向角之间的差异。

 

结论

 

在本文中,我们提出了一种方法,只需几分钟即可在几分钟内学习Donkey Car的平滑控制策略。

 

由于此方法旨在应用于现实世界,这绝对是我在该项目中的下一步:在真正的RC车上测试方法。这将需要缩小VAE模型(策略网络已经非常小),以使其在树莓派上运行。

发表评论

电子邮件地址不会被公开。 必填项已用*标注