亚马逊AWS官方博客

制造一辆无人驾驶车辆 Part2:全力加速

本文是我们的系列中的第二篇博客文章,旨在指导您制作 1/16 比例的无人驾驶车辆。您还可收听我们的 Twitch 网络直播以回顾这些博客文章中讨论过的概念。在跟随我们操作之后,您可以将您自己的车辆带进 re:Invent Robocar Rally 2017 的赛道,也可以使用我们提供的车辆。

在我们的第一篇博客文章中,我们制作了一辆 Donkey car 并将导航服务器部署到您的 Amazon EC2 实例上。在本篇博客文章中,我们将布置一个赛道并教您的车辆使用 Amazon EC2 Systems Manager 和 AWS IoT 进行驾驶。如果您已经关闭了 Donkey Server EC2 实例,现在请将它打开并获取其公共 IP 地址。获取公共 IP 地址后,我们会将您的车连接到 EC2 Systems Manager 以远程访问它。之后,我们会将您的车连接到 AWS IoT 以跟踪可用来与好友比较圈速的遥测数据。

赛道布置

教您的车驾驶的第一步是布置赛道。准备好赛道后,您需要驾驶您的车辆在赛道上跑第一圈以开始训练其神经网络。我们要使用的车的速度相当快并且转弯半径不太大,因此您需要从没有急弯的赛道开始。

除此之外,您布置的赛道的大小受您的可用空间和您手头的胶带数的限制。您可在设计中尽情发挥创意,但要确保将各个角度的左转和右转考虑进去以便让您的神经网络接触多种不同的情况。请记住,您的车辆使用其前置摄像头观察您布置的赛道,因此您需要确保能够轻松区分胶带与地面。

赛道设计提示和技巧

  • 与具有各种光亮和阴影水平的室外赛道相比,室内赛道提供的持续照明产生更好的效果。
  • 您的车通常具有最小 30 度的转弯半径,因此在设计拐角的弯度时应记住这一点。
  • 您可使用白色丝带和蓝色喷涂胶带制作临时赛道。
  • 您还可使用一条白线作为赛道。行为克隆方法将学习沿着线驾驶。
  • 无光表面胶带的效果比光面胶带的更好。

用于制作更持久的赛道的两种选择。

准备好赛道后,请打开 EC2 Systems Manager 并激活您的车。

在 EC2 Systems Manager 上激活设备

EC2 Systems Manager 提供了各种对您的车非常有用的功能。Systems Manager 可帮助您自动执行功能,从而无需通过 SSH 连接到您的车上的 Raspberry Pi。Raspberry Pi 的设置过程简单,首先是创建激活、安装代理和创建控制某些行为的文档开始。Systems Manager 支持您在不使用 SSH 的情况下运行命令,并且可充当纯文本和加密密钥值对的参数存储。Systems Manager 还有助于确保本地导航正在运行并准备好在启动时执行命令。我们将使用 Systems Manager 自动生成和下载安全地将遥测数据传输到 AWS IoT 服务所需的 AWS IoT 证书。

转到 EC2 Console,然后按 Activations

选择 create an activation。输入您的 Activation Description。在本博客文章中,我们将它命名为 DonkeyCar Activation。现在将限制保留为 1。设置未来的到期日期 (不超过 30 天) 并将设备命名为 myDonkeyCar。选择 Create Activation 后,您将收到 Activation CodeActivation ID

将这些内容记在某个安全的位置,因为您需要激活代码和激活 ID 才能将 Raspberry Pi 注册到 EC2 Systems Manager。

使用运行 donkey 车辆的 Raspberry Pi 的 IP 地址,通过 SSH 连接到 Donkey。使用 Raspberry Pi 的 IP 地址执行此操作的命令如下所示。

ssh pi@172.20.10.7

请注意,默认用户名为“pi”,密码为“raspberry”。建议您自行设置用户名和密码。

在设备上,输入以下命令行以安装 EC2 Systems Manager 代理,然后启动服务以便让它与 Systems Manager 进行通信。我们还将按此处所述的方式安装 AWS CLI。

mkdir /tmp/ssm
sudo curl https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_arm/amazon-ssm-agent.deb -o /tmp/ssm/amazon-ssm-agent.deb
sudo dpkg -i /tmp/ssm/amazon-ssm-agent.deb
sudo service amazon-ssm-agent stop
sudo amazon-ssm-agent -register -code "code" -id "id" –region "us-east-1"
sudo service amazon-ssm-agent start
curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
unzip awscli-bundle.zip
sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws

注意:如果您使用的是 Donkey Raspberry Pi 图像,还请运行以下命令以获得稳定的计算机 ID。

sudo umount /etc/machine-id
sudo systemd-machine-id-setup

在服务启动后,您将在 Managed Devices 下看到设备。您可从 AWS 控制台远程访问它。对于我们的设备,我们还希望为其授予完整 SSM 权限。转到 IAM,然后按 Roles

搜索 AmazonEC2RunCommandRoleforManagedInstances。我们希望将 AmazonSSMFullAccess 策略附加到此角色,从而使 Donkey Car 获得对 EC2 Systems Manager 的完全访问权限。让我们附加 AWSIoTConfigAccess,为我们的设备提供预置安全 IoT 证书的权限。

“摘要”页面应如下所示:

开始驾驶

要开始,请使用运行 donkey 车辆的 Raspberry Pi 的 IP 地址,通过 SSH 连接到 Donkey。使用 Raspberry Pi 的 IP 地址执行此操作的命令如下所示。

ssh pi@172.20.10.7

请注意,默认用户名为“pi”,密码为“raspberry”。建议您选择更独特的密码。请记住此密码,因为它是您与车辆交互的主要方式。

您还可以自动执行整个操作。让我们创建一个 Systems Manager 文档以便为 Raspberry Pi 定义一些操作。我们将我们的文档命名为 RunCar。我们可将 Document Type 保留为 Command

我们可使用以下 JSON 定义基本更新 Pi 脚本。要了解更多信息,请转到 Systems Manager 文档。将以下内容复制到 Content 中。按 Create Document

{
   "schemaVersion":"2.2",
   "description":"Run your Donkey Car",
   "mainSteps":[
      {
         "action":"aws:runShellScript",
         "name":"Runcar",
         "precondition":{
            "StringEquals":[
               "platformType",
               "Linux"
            ]
         },
         "inputs":{
            "runCommand":[
              "cd /home/pi",
	          ". env/bin/activate",
	          "cd d2",
              "python manage.py drive"
            ]
         }
      }
   ]
}

注意:当为现有文档创建新版本时,请确保将最新的版本设置为默认版本。

要运行此命令,请转到 Run Command 并按 Run a Command

选择 RunCar 并手动选择要运行的 Raspberry Pi (托管实例具有前缀“mi”)。这将从您在 Raspberry Pi 上创建的文档运行命令,无需使用 SSH 连接到 Raspberry Pi。

现在,连接到 Raspberry Pi 的 IP 地址,同时指定端口 8887。您可使用任何浏览器,但下一个部分将更有趣并且将在平板电脑或手机上产生更好的效果。

http://172.20.10.7:8887

您的浏览器应显示类似于下面的页面:

选择“Vehicles”选项卡,然后选择您的车辆。这会将您连接到控制面板。控制面板应如下所示:

您需要使用控制面板绕赛道手动驾驶车辆以开始训练您的神经网络。在将车开进赛道之前,确保抽点时间学习如何控制油门和转向角。

有多种控制模式,但我们喜欢通过游戏手柄、游戏杆或键盘控件来使用设备倾斜模式。基于赛道的尺寸限制最大油门也很有用。在我们的测试中,我们发现发动车辆需要最大油门的 25%,但提高到 30% 会让人更难手动控制车辆。也就是说,您的车辆可以学习开得更快。

当您做好准备后,将车辆连接到其蓄电池并选择绿色的 Start Vehicle Button。如果一切正常,您将从摄像头中看到包含响应角度和油门仪表以及响应控件的实时 POV 视频源。花几分钟时间熟悉一下控件,然后前往赛道。请记住,您的车将学习您的行为。确保保持直线驾驶,不要转任何急弯。您需要能够跑完 10 个整圈而不出错。

在布置赛道并掌握基础知识之后,您就可以开始训练神经网络了。为此,请选择 Start Recording。您的车现在将通过摄像头捕获 160×120 帧,存储该图像并将关联元数据 (如油门和转向角) 捕获到单独的 JSON 文件中。

如您所见,我们正在为您的神经网络开始学习使用包含对应转向角和油门数据的样本图像奠定基础。当您的车获取到更多数据时,它将开发一种模型来帮助自己看清道路并做出相应反应。

为了让此模型具有一定的准确度或精确度,您需要驾驶车辆几分钟以收集至少几千张图像。此模型需要接受充分的训练才能收集足够大的样本集,并且可能需要连续正常驾驶 10-20 个整圈。

当您收集足够大的训练集后,您可选择 Stop Vehicle 停止收集数据。现在,是时候将会话数据上传到您的 EC2 实例上的深度学习框架以便为您的车辆开发模型了。您可使用 Raspberry Pi 上的计算能力训练车辆,但在 EC2 实例上训练会快很多。

要开始,请使用以下命令设置指向您的深度学习 EC2 实例 (您在上一篇文章中设置) 的 SSH 会话。这会从 Raspberry Pi 的 data 文件夹将您的数据复制并同步到深度学习实例。

注意:确保您的 Raspberry Pi 可通过以太网 (公共 IP 地址) 从 Internet 进行连接。否则,您需要将 DonkeyKP pem 文件复制到 Raspberry Pi 上并远程同步其他方向 (从 Raspberry Pi 中远程同步)。

ssh -i "DonkeyKP-us-east-1.pem" ec2-user@ec2-your-ip.compute-1.amazonaws.com
rsync pi@<your_pi_ip_address>:/d2/data/ ~/d2/data/

在数据同步完成后,您现在可以使用会话数据开始训练。作为训练成果,我们将创建一个要部署在 Raspberry Pi 上的模型

python ~/d2/manage.py train --model myfirstpilot

创建该模型后,您需要将它从实例下载到车辆的 Raspberry Pi。

rsync ~/d2/models/ pi@<your_ip_address>:~/d2/models/

注意:如果您要从 Raspberry Pi 中同步数据,请改用以下命令来下载数据和模型 (前提是您已将深度学习实例的 pem 文件下载到设备上)。

将数据从 Donkey Raspberry Pi 下载到深度学习实例上。

rsync -rva --progress -e "ssh -i /path/to/key/DonkeyKP-us-east-1.pem" /home/pi/d2/data/ ec2-user@ec2-your-ip.compute-1.amazonaws.com:~/d2/data/

使用我们之前向您展示的同一方式训练深度学习实例中的模型。

将模型从深度学习实例下载到 Donkey Raspberry Pi 上:

rsync -rva --progress -e "ssh -i /path/to/key/DonkeyKP-us-east-1.pem" ec2-user@ec2-your-ip.compute-1.amazonaws.com:~/d2/models/ /home/pi/d2/models/

在模型位于 Raspberry Pi 上之后,您可使用该模型让车辆自行驾驶。这可在不建立与 Raspberry Pi 的 SSH 连接的情况下实现。正如您之前所做的那样,仅使用 Run Command。您可以像之前一样创建文档,也可以使用以下命令。

在“Commands”内,选择 AWS-RunShellScript 并在 commands 下键入以下命令。

. /home/pi/env/bin/activate 
python /home/pi/d2/manage.py drive --model myfirstpilot

既然您的模型已完成训练,请回到平板电脑,刷新浏览器,选择您的车辆,然后选择“Mode & Pilot”下的 Auto Angle。现在,确保 Donkey Car 已通电并位于赛道上。然后,将最大油门设置为 25% 并选择 Start Vehicle。您仍能控制车辆的油门,但它已进入自行驾驶状态。让 Donkey Car 缓慢移动并观察它在您的赛道上的行进情况。

当您的车辆在赛道上掉头时,它将获取更多数据,供您加载回模型中。您拥有的数据越多,车辆就驾驶得越好。

您还可使用 EC2 Systems Manager Parameter Store 保存您的所有工作。

使用 Parameter Store 存储配置数据和机密

EC2 Systems Manager 内有一个很有用的功能,名为 Parameter Store。它是存储配置数据、机密、API 密钥和密码的绝佳位置,使您不必对代码内的值进行硬编码。

我们不必在 our /home/pi/d2/manage.py 脚本中对参数值进行硬编码,而是可以将这些值存储在 Parameter Store 内,从而可以轻松更改它们而无需使用 SSH 连接到深度学习实例或 Raspberry Pi。

例如,让我们为 LEFT_PULSE 创建一个参数。 转到 Parameters,选择 Create Parameter。我们可将它设置为 441 (默认设置)。

创建该参数后,我们可通过以下方式引用它:使用 AWS CLI 和 get-parameters,或者使用 AWS 开发工具包。由于我们要修改 manage.py,我们需要使用 Systems Manager 的 boto3 SDK

您需要先通过在 Raspberry Pi 上运行以下命令,然后才能使用 boto3:

pip install boto3

在代码中,让我们添加 boto3 import 并定义我们的 ssm 客户端。

import boto3  
client = boto3.client('ssm', region_name='us-east-1')

get-parameter 方法信息可在此处找到。

manage.py 代码内,不要调用 left_pulse=441,而是调用

left_pulse=int(client.get_parameter(Name='LEFT_PULSE’)['Parameter']['Value'])

在车辆运行良好后,您可使用 AWS IoT 跟踪您的圈速并与好友比赛。

AWS IoT 设置

首先打开 AWS 管理控制台并选择 AWS IoT 控制台。通过使用 AWS IoT,我们将为我们的无人驾驶车辆设计一项车队监控服务。

车队监控服务的组件通过逻辑功能 (和 AWS 服务) 进行颜色编码,以展示解决方案的每个组件的安全性、可扩展性以及是否完全基于使用情况。

您可以使用车队监控服务跟踪和比较圈速,但希望开发其自己的互联车辆平台的无人驾驶汽车制造商也可使用此架构。

这一切都始于您的车辆 (以绿色阴影显示)。您的设备已连接 Internet,这意味着它能够将遥测数据流式传输到一个集中位置 (如 AWS IoT)。我们将在下一篇文章中讨论遥测数据的收集。

为保证您车辆的安全,您需要从 AWS IoT 服务生成证书并将证书部署到您的车辆。通过使用证书,您的车辆可通过 MQTT 使用 TLSv1.2,从而能安全与 AWS IoT 服务进行通信。MQTT 是一个极其轻量的协议,非常擅长应对低信号网络,因此它可以解决连接可靠性难题。

创建证书的方法有两种。您可以使用 AWS CLI 或 AWS IoT 控制台创建它。

使用 AWS CLI 创建证书

我们将在 Systems Manager Document 内通过 AWS CLI 命令生成证书、公钥、私钥以及根证书 AWS IoT CA。

请按照本文开头讨论的过程创建另一个文档,并将它命名为 RegisterCar

{
   "schemaVersion":"2.2",
   "description":"Register and activate your Donkey Car with AWS IoT",
   "mainSteps":[
      {
         "action":"aws:runShellScript",
         "name":"IoTRaspberryPiIoTRaspberry Pi",
         "precondition":{
            "StringEquals":[
               "platformType",
               "Linux"
            ]
         },
         "inputs":{
            "runCommand":[
               "mkdir /home/pi/d2/creds",
               "cd /home/pi/d2/creds",
               "aws iot create-keys-and-certificate --set-as-active --certificate-pem-outfile donkeycar.cert.pem --public-key-outfile donkeycar.public.key --private-key-outfile donkeycar.private.key --region us-east-1",
               "curl https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem -o Public-Primary-Certification-Authority-G5.pem"
            ]

         }
      }
   ]
}

要应用此文档中所述的操作,请返回到 Run Command 并选择使用选定实例运行 RegisterCar

使用 AWS IoT 控制台创建证书

保证安全的另一种方法是使用一键式证书创建方法。为此,请从 AWS IoT 控制面板左侧选择“Security”。在右上角,选择蓝色的“Create”按钮。

单击 Create certificate 以从 AWS IoT 服务证书颁发机构 (CA) 自动生成证书、公钥和私钥。

下载各个文件,然后将它们复制到 Raspberry Pi。确保您还下载根 AWS IoT CA。

然后单击“Activate”以启用要使用的证书。

接着单击“Attach a policy”。

更多可选加载项

当管理大量 Raspberry Pi 时,请考虑使用标记。我们通过使用 add-tags-to-resource API 操作来标记设备。这使我们能够通过 Specifying a Tag 而不是手动选择实例来应用 Run Commands

 

此外,State Manager 可用于为您的车辆保持一致的配置。您可在启动时使用特定软件来引导 Raspberry Pi (如安装 Donkey Car 存储库,连接到 AWS IoT 等)。

后续步骤

关注我们的系列中的下一篇博客文章,在该文章中,我们会将 Donkey Car 配置到 AWS 以收集、分析和记录我们的车辆遥测数据。