AI 智能车:结合 Alexa 制作 AI 控制的机器人

这个项目的目的是,创建一个可以通过语音控制的智能车。语音控制使用 Amazon Alexa Skills Kit 完成,电机控制使用 Adafruit 的 Raspberry Pi MotorHAT 和 MotorHAT python 库完成。

整体架构

这个项目有三个主要部分:Raspberry Pi、AWS(Amazon Web Services)和Motor HAT。

Raspberry Pi 用于获取用户的音频输入,以及通过 I2C 与 motorHAT 进行通信。它也可以提供音频反馈,虽然这部分是可选的。控制电机行为的脚本在 Raspberry Pi 上运行,并用 Python 实现。

AWS Alexa 是完成语音输入的所有处理的地方。AWS lambda 中实现的自定义 Alexa 技能,通过 MQTT 协议将语音触发的意图转换为消息。AWS IoT 消息代理用于广播携带消息的主题。智能汽车 Raspberry Pi 充当物联网设备,并订阅主题并捕获消息。

从端到端的角度来看,它来自:

  1. 人类的声音命令
  2. 在 Raspberry Pi 上的 Alexa 语音服务
  3. AWS 的 Alexa 前端(frontend)
  4. 自定义意图处理的 AWS lambda
  5. 意图发布到的 MQTT 主题
  6. AWS IoT 中将所有主题广播到的 MQTT 代理
  7. Raspberry Pi 充当同一主题的 MQTT 订阅者
  8. Raspberry Pi 接收主题中的特定消息,并采取适当的电机控制操作。

一旦所有的进程都设置好了。motorHAT 将通过设置每个电机的方向和速度来控制电机。通过做不同的方向和速度组合,汽车可以执行各种操作。

Alexa Bot 架构图

实物图

视频演示地址:https://www.youtube.com/watch?v=s38WPVKDUk0

硬件清单和硬件设置

硬件清单

  1. Raspberry Pi(我的是 Raspberry Pi 3)
  2. Adafruit MotorHAT 直流电机驱动器
  3. 带两个直流电机的基本汽车底盘
  4. 便携式手机充电器
  5. 4节AA电池和电池组
  6. USB麦克风
  7. 3.5 毫米插孔扬声器

硬件设置

第一步是使用引脚连接器连接 motorHAT 和 Raspberry Pi,然后组装到机箱。Raspberry Pi 通过标准的 I2C 作为 GPIO 设置的一部分与 motoHAT 通信。

将 Raspberry Pi、扬声器和电池组放在一起,使所有的端口都可以轻松访问。对于我来说,Raspberry Pi 在后面,中间的是扬声器,前面的是电池组。为Pi供电的手机充电器,放置在机箱下方以节省空间。 所有的电线应该能够很容易地连接。

下载 Adafruit Python 库提供了一个直流电机测试脚本,可以运行以检查电机是否正常工作。如果电机向后旋转,只需拿起电线并将其切换。 还要测试麦克风和扬声器是否正常工作。网上有很多资源可以帮助解决这个问题。

在 Raspberry Pi 3 上安装 Alexa

在开始安装 Alexa 之前,请确保您注册了 Amazon 开发者帐户。在这个项目中需要进行大量的验证,所有的安全措施都将在这个账户中完成。

按照下面的安装在 Raspberry Pi 上安装 Alexa。

https://github.com/alexa/alexa-avs-sample-app/wiki/Raspberry-Pi

这个网站将为您提供有关,如何安装和设置 Raspberry Pi 以使用 Alexa 的完整说明。接近尾声时,它提供了唤醒词引擎的两个选项(这是当你说 “Alexa” 时将触发 Raspberry Pi 监听程序,我个人只能让 kitt_ai 工作。)

使用 AWS Lambda 进行 Alexa 技能

使用您的亚马逊开发人员帐户,使用 Alexa 技能套件创建一个新的 Alexa 技能。您可以使用任何技能名称和调用名称。调用名称是您将用来激活您的技能。

接下来,创建一些意图(intent),这是机器人将执行的实际任务。 他们应该是这样的格式:

{
  "intents":[
    {
      "intent": "intent_name"
    }
  ]
}

下面将是创建话语的区域。键入意图(intent)名称,然后输入您希望 Alexa 识别的短语。 例如:

<intent_name> use this intent

在我们继续这个技能之前,我们需要创建一个 lambda 函数。

Lambda 是 Amazon 提供的在其 Serverless 结构上运行代码的服务。创建一个空白函数,并将触发器配置为 Alexa 技能工具包,选择您计划使用的任何运行时环境(语言)。我使用的是 Python 2.7。

您可以将您的代码上传到 zip 文件,进行内联编辑,或者从自己的编辑器复制粘贴。 一旦你有你的代码,选择角色 "lambda_basic_execution"。

如果你没有,创建一个新的自定义角色,然后点击 “Allow”。现在你已经有了一个 lambda 函数,复制功能页面右上角的 ARN。它应该以 “arn:aws:lambda:”开始。现在回到你的Alexa技能。

在配置页面下,选择 ARN,选择离您最近的区域,并从 lambda 函数粘贴到 ARN 中。你现在可以测试你的技能是否有效。

使用 AWS IoT 作为消息分发

当您的 lambda 函数运行其中一个意图时,它需要触发一条消息通过 mqtt 协议发送到 AWS IoT 消息代理。此消息必须采用JSON格式,并且将成为 Raspberry Pi 提供的消息。

我用 python 中的 boto3 和 json 格式库实现了这一点。这个消息是根据一个主题,下面发布消息的名称,一个 QOS 值,我已经设置为 1,以及一个有效负载,这是消息本身发送的。确保在创建有效载荷时他们是唯一的,并且稍后尝试执行电机控制逻辑时,不会有混淆的可能性。

请注意,使用 boto3 库,是因为它已经内置到 lambda 包含的库中。 您可以简单地将其导入到 Python 代码中,然后可以使用 boto3 库。

我发现 boto3 基本上是 AWS 管理功能(配置/等)的API。它具有非常有限的数据层(data plane)功能。对于物联网和 MQTT 支持,它只能发布,但不能订阅。 对于这个简单的项目,这是足够的,因为消息流是单向的( 从AWS lambda 到 IoT )。从长远来看,如果我想从机器人/Raspberry Pi 中检索信息,我将不得不去掉 boto3,因为它没有能力接收 MQTT 消息。

另一方面,Raspberry Pi 上使用的 AWS IOT 库基于 AWS IoT Python SDK。 你可以在下面的 github 链接中找到它。这具有完整的数据层(data plane)功能(包括订阅功能)。我在 Raspberry Pi 上使用这个来订阅 boto3 发表的主题; 并用它来接收 MQTT 消息来控制电机。我之所以没有在 lambda 函数中使用这个函数,是因为这个库不是内置到 AWS lambda 中,而且也不能被轻易导入。

https://github.com/aws/aws-iot-device-sdk-python

电机控制逻辑和使用电机控制 HAT

这部分很简单。如我之前提到,在 Adafruit motorHAT Python 库的安装中包含了一个电机测试脚本。在这个例子中,所有运行电机所需的代码都是这样的。 只需复制和粘贴任何需要的东西。

安装指南:

https://cdn-learn.adafruit.com/downloads/pdf/adafruit-dc-and-stepper-motor-hat-for-raspberry-pi.pdf

HAT 的 Github:

https://github.com/adafruit/Adafruit-Motor-HAT-Python-Library

我实施的电机控制指令包括:

  • Forward
  • Backward
  • Turn right
  • Turn left
  • 3 point turn right
  • 3 point turn left
  • U turn right
  • U turn left

未来

未来的增强功能,包括自我平衡的动作,我喜欢增加一个 Camera 玩计算机视觉。

https://www.youtube.com/watch?v=METfVYmg408

原文链接:https://shawnmklee.wordpress.com/alexa-ai-controlled-robot-car/

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.