我家里有 Alexa,我的两个孩子喜欢乐高积木。我从没想过我可以做些什么来帮助我提高我的开发技能,并且可以让我的孩子从如此有趣的角度看待我的工作。他们总是告诉我他们想玩乐高机器人,我不会说开发这个解决方案提供的所有功能很容易,所以我不得不告诉他们构建伟大的东西需要时间。现在我看到他们在玩它,我知道这个项目不知何故对他们产生了影响,而不仅仅是对我。
这个项目有两个主要部分。一个是Alexa技能,一个是Lego Mindstorms机器人。让我们在下面看看它们。
该技能是在定义了意图和槽的 Alexa 开发控制台中开发的。
要创建技能,请登录 Alexa 开发控制台并单击创建技能。
为其命名,选择自定义模型,并选择提供您自己的后端资源,因为我们将使用我们自己的 Lambda 函数而不是 Alexa 托管技能功能。
在您创建的技能中粘贴您将在提供的 GitHub 存储库中找到的 json 技能模型定义并保存模型。三种不同的语言有三种 json 模型。
技能的服务端点是 AWS Lambda 函数。在端点部分,您将需要引入 Lambda 函数的 ARN(请参阅下面的 lambda 函数创建部分),并且您将需要使用可在此处找到的技能 ID。
Custom Interface Controller 接口和 Alexa Presentation Language (APL) 接口已启用,可以与 Alexa Gadget (Lego Mindstorm) 通信,并管理 Amazon Echo 显示(如果设备有显示)。
语言和声音
这是一项自定义 Alexa 技能,提供两种语言版本,即英语(美国和英国)和西班牙语 (ES)。
语言英语(美国)和英语(英国)的技能模型定义相同。西班牙语 (ES) 中的技能具有相同的意图和槽类型,但示例话语被翻译,因为槽值同义词保持相同的槽值。这样,当从 Alexa 设备接收指令时,我们可以对所有语言使用相同的 Lambda 函数处理程序。
我只介绍了西班牙语,但可以使用相同的方法添加任何其他语言。
Lambda 函数的语音文件夹中有两个 json 文件,其中包含英语 (en-US.json) 和西班牙语 (es-ES.json) 的 Alexa 语音表达式,Alexa 将回复用户请求,或者乐高头脑风暴事件。考虑到 Alexa 设备请求的“区域设置”属性,将选择这两者之一,该属性指示在 Echo 设备中选择的语言。
回声设备中有两种主要声音,一种是作为技能助手的每种语言的 Alexa 默认声音,另一种是代表乐高机器人声音的男性声音(美国的 Justin,ES 的 Enrique 和英国的 Brian) .
交互模型:调用、意图和槽
调用模型是英文的“lego battle”和西班牙文的“batalla de lego”。
定义了 12 个意图和 14 个槽。
goSomewhere 意图允许用户在乐高战场中移动机器人。机器人可以去 6 个地方,即家、直升机场、停车场、火车站、港口和颜色线。
机器人有 4 种武器可用,即枪、锤子、刀片和采摘器。changeTool intent 允许用户告诉 Alexa 武器发生了变化,useTool intent 用于命令机器人对指定目标使用武器,或者在当前位置和方向使用武器,以防没有目标定义。
findColor 意图为用户提供了让机器人在颜色线中找到特定颜色的能力。
setSpeed 意图允许用户在慢速、正常或快速之间进行选择。
setTarget 是定义机器人攻击目标的意图。定义了 5 个目标:飞机、船、拖拉机、树和移动目标。
最后一个自定义 intent 是 remoteControl,它可以被触发以在 echo 设备屏幕中打开遥控器,如果它有的话。使用该遥控器,用户可以触摸屏幕上使用 APL 渲染的不同箭头,将机器人向前、向后、向左和向右移动 90º。
还有 5 个默认的内置意图可用。普通嫌疑犯。
已经为每个意图定义了示例话语,试图涵盖用户可能提出这些请求以管理 Lego Battle 领域中的 Lego 机器人的许多可能方式。
定义了一组 14 种槽类型,以收集技能正常工作所需的相关槽,例如 placeToGo、finalTool、target、speed 和 colorFind,但其他一些类型用于涵盖可能的不同用户表达。
并非只有一个值对每个槽类型有效,定义了多个同义词以涵盖更多场景。
您可以在提供的 GitHub 存储库的 /lego/models/ 文件夹中找到技能的 json 定义。为特定的技能语言交互模型加载它们,保存并构建它们将使一切正常工作,一旦启用了上述接口并连接了 Lambda 函数端点。
Lambda 函数端点
要创建 Lambda 函数,您需要登录 AWS 控制台 Lambda 服务并创建一个新函数。
选择 Author from scratch,为其命名并单击 Create function。
在下一个屏幕中,您需要单击添加触发器。在此屏幕中,您可以复制 Alexa 技能开发控制台中需要的函数 ARN 来定义 Lambda 端点。
添加 Alexa Skill Kit 触发器时,启用技能 ID 验证,以便只接受来自该技能的请求。可以在 Alexa 技能开发控制台的端点部分找到此技能 ID。引入它并单击添加。
在此之后,您可以部署可以在提供的 GitHub 存储库 (/lego/lambda/) 中找到的 nodeJs 代码,然后一切都将在与 Alexa 技能相关的方面发挥作用。不要忘记安装所需的节点模块。“npm install”将安装 package.json 中列为依赖项的所有模块。
唯一缺少的部分是 Alexa 语音服务中的 Alexa Gadget 产品创建以及 Lego Mindstorms 构建和配置。在解释之前,让我们更深入地了解提供的 nodeJs 代码片段。
在本地克隆 Github 存储库并使用 Visual Studio Code 或您首选的开发应用程序打开它。
乐高文件夹包含:
我们已经制造了所有可用的武器。
这是一个巨大的乐趣!
除此之外,我还添加了两个传感器:颜色传感器和触摸传感器,因此 Track3r 现在能够跟踪颜色线中的颜色,并且当它在战场上失去位置时也可以重置到原位。
这里有一些颜色传感器如何连接到积木的图片。
一些其他图像来解释如何连接乐高机器人中的触摸传感器。
EV3程序块设置
我已按照 LEGO MINDSTORMS 语音挑战中的说明进行操作:设置页面 ( https://www.hackster.io/alexagadgets/lego-mindstorms-voice-challenge-setup-17300f ) 以设置 EV3 开发环境并准备与 Echo 设备和 Alexa 配合使用的 EV3 程序块。
下载 ev3dev 软件,闪存 SD 卡并连接到 EV3 程序块(在我的例子中使用电缆)。在 Visual Studio Code 中安装 ev3dev-browser 扩展,您可以连接设备、发送工作区文件并使用 SSH 终端执行 python 程序。
上面提供的链接中的说明非常详细。
Lego Mindstorms 中的蓝牙存在一些已知问题,因此如果您在 EV3 程序块中看不到蓝牙,请尝试重新启动它并拔下所有连接的传感器,如果它仍然无法正常工作,请尝试重新刷新您的 SD 卡。
Python代码
传输到 Ev3 Brick 并执行以通过蓝牙从 Alexa Echo 设备接收控制指令的代码具有以下结构:
有两个文件夹:
打开技能时出现的另一个功能是 APL 文档渲染。我正在使用一个名为 sequence.json 的 APL 文档,可以在文档文件夹中找到它。主要属性如下所示。
该文档是一个带有容器的模板,容器具有水平序列组件,图像组件通过数据源中的 listImages 数组绑定到文档。另一个容器包含将在 SpeakItem 命令中使用的不可见文本组件。
在 Lego Ev3 Brick 中执行 lego.py 程序时,会初始化所有电机、传感器、Ev3 功能和 python 变量。之后是一段简短的图像和一个显示机器人还活着的命令。
创建 show_image 函数是为了方便在 Ev3 Brick 液晶屏幕上显示图像,从图像文件夹中获取图像。
在导入了 ColorSensor 类并创建了它的一个实例之后,与颜色相关的变量被初始化,并创建了一个线程来管理颜色搜索例程。
让我们看一下管理 findColor Intent 的 Lambda nodeJs 代码。
一旦收到 findColor 意图,就会计算响应,并构建指令类型 findColor 以发送到小工具。
机器人位置和场地中的不同位置使用 X 和 Y 轴值定义。方向是介于 0 和 2*pi 弧度之间的值。机器人从位置 (1, 1) 和方向 0 开始,这也是起始位置。
从初始点到目标点的移动距离是 X 轴行程和 Y 轴行程的斜边。使用反正切计算方向,然后要进行的转弯是方向与当前方向的差值。
一旦计算出这一点,就会执行移动,开始转向面向目标点,向前移动计算出的距离,然后再次转向以进入目标位置位置方向。
一旦到达那个新位置,就会调用 setPosition 函数来为下一次移动保留新位置。
转弯和移动功能考虑了轮子的半径和机器人轮子之间的距离。使用一些数学方程式可以计算出电机必须移动的度数。
setPosition 函数使用小工具类中定义的内部变量来保持机器人在场地中的最终位置。
关于负责 goSomewhere 意图的 nodeJs 代码,没有什么新的可说的。
让我们看一下用于这些意图的特定 python 和 nodeJs 代码。
当武器是枪时,它会在不离开位置的情况下开火。只是方向发生了变化。
当定义的目标是移动目标时,机器人必须首先找出目标在哪里。在这种情况下,目标是红外传感器遥控信标。机器人反应的信标信号是通道 4 中的信标信号。
函数 facingTarget 计算信标的方向。由于红外传感器位于机器人的后部,因此我们将 pi 弧度与航向返回值相加,转换为弧度。
距离考虑到大约有70cm的红外范围,所以红外传感器距离函数给出的值乘以7。
我只会评论更多关于 useTool nodeJs 代码的内容,因为 setTarget 和 changeTool 意图与已经解释过的其他意图相比没有什么特别之处。
当收到 useTool 意图并且用户提供武器名称和要执行的操作时,代码会检查这两者是否相关联,这样您就不会尝试发射锤子或砸碎枪支。
当用户按下其中一个箭头时,TouchWrapprer 中生成的事件将被发送并在收到时进行分析,以便将自定义指令发送到触发移动动作的 Ev3 小工具。
在以下 python 代码行中,您可以看到 TouchSensor 类是如何实例化的,以及管理被按下按钮的线程是如何创建的以及它是如何工作的。
如果遥控器已被使用,则 remoteControl 变量的值为 True,然后,如果按下按钮,位置将设置为主页,HomeButton 事件将发送到 Alexa。
InfraredSensor 类的一个实例被创建并用于定义按下通道 1 和通道 2 中的每个按钮时需要触发的内容。
这里模拟了您如何使用 FireTV 在电视中看到技能运行,但由于该小工具未通过蓝牙连接到 FireTV,因此乐高机器人没有提供任何响应。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !