6
4

More than 3 years have passed since last update.

【AWS・Tello】声でドローンを操作してみたPart1

Last updated at Posted at 2019-12-09

はじめに

この記事は
ドローンを活用した避難勧告システム
の第二章です.
製作背景などはそれを参照してください.

また,本章の内容は以下の内容が前提なので,まだ読まれていない方はまずそちらをご覧ください.
第一章【AWS・Tello】ドローンをクラウド上で操作するシステムの構築

概要

 TelloドローンをAlexaを使って声で操作してみましょう.インフラはAWSを使用します.
まず動画で完成形を見てみましょう.
IMAGE ALT TEXT HERE

システム構成図

system.png

やること

前回まででIoTCoreとTelloの通信を確認したので今回は
lambdaでAlexaスキルのエンドポイントをホスティングし,IoTCoreにpublishするところまでやりましょう.
Part1. スキル開発・lambdaとの連携
Part2. lambdaからIoTCoreへの通信

スキル開発

スキル作成

alexa developer console (以下ADC)にログインし,カスタムスキルを作成します.
skillselect1.png
backendforalexa.png

 スキルのバックエンドに「ユーザー定義のプロビジョニング」を選択すると自前でlambda関数を用意する必要があります.「Alexa-Hosted」を選択するとADC上のコードエディタを使えて初学者に易しく取っ付き易い気がします.IoTCoreとの通信するので今後の拡張性も考え,ここでは自前でlambda関数を用意する前者のやり方で行います.
 というわけでlambdaを新しく用意しときます.lambdaのARNは控えといてスキルのエンドポイントでデフォルトの地域の箇所に設定します.
endpointforalexa.png

スキル用語集

 優しいのでスキルの基本用語を再確認してあげます.後ほど詳しく触れます.

呼び出し名: 対話(セッション)を始める合言葉
インテント: 対話の意図(開発者が自由に設定することができます)
ビルトインインテント: デフォルトで組み込まれているインテント(キャンセル・ストップ・ヘルプなど)
サンプル発話: セッション内で特定のインテントを呼ぶための合言葉
スロット: サンプル発話で保持させられる変数のようなもの
ビルトインスロット: 既に用意されているスロット(数字や施設名,女優名もある...すごい)
カスタムスロット: 開発者が自由に設定できるスロット

ちなみにスロットは同義語やID指定など柔軟に設定できるから素晴らしい.

スキル詳しく

 今回のドローン制御システムで設定したスキルの詳細です.(参考までに)

呼び出し名: 「コントローラー」
インテント: Controller/Land
ドローンを動かしたい時にControllerインテント, 着陸したい時にLandインテント
(Flipインテントなんか面白そう)
サンプル発話
Contorollerインテントの場合
ContIntent.png

ビルトインスロット: num(数字)
カスタムスロット: direction(方向)
slot_direc.png

 つまりControllerインテントでは,進む方向と距離の二つの情報が必要になります.好みになりますが,実際のスキルで方向しか声で入力されなかった場合に距離を聞き返す工夫をするべきです.
 ここらへんの対話モデルはjsonで定義できるっぽいので付録で載せときます.

バックエンド

 先程作ったlambdaをいじります.ここで「Alexa Skills Kit SDK」を使った方が絶対良いです.使わなくてもできますが,リクエストパラメータのjsonのネストが深くて処理がめんどくさそうです.
 言語はPythonにします.Nodejsを使う人が多くてPython使う人が少ないのでここではあえてPythonにしました.

Alexa Skills Kit SDK for Python

まずlambdaでask_sdk_coreをimportしてください.

$ import ask_sdk_core

ただそのままだと外部ライブラリは読み込めないのでask_sdk_coreをlayerとして追加しましょう.

ローカルでプロジェクトにpip installして,プロジェクト全体をzip化してlambdaにアップロードする方法もあります.以下のリンクではその方法およびlambdaのローカル開発のエコシステムをまとめましたので気になる方はご覧ください.
【AWS・Lambda】Python外部ライブラリ読み込み方法

ask_sdk_coreはPurePythonなライブラリなのでlayer用のzipファイルを作る環境はどれでも大丈夫なはずです.MacOSで行いました.(python3.7の例)

$ mkdir -p build/python/lib/python3.7/site-packages
$ pip3 install ask_sdk_core -t build/python/lib/python3.7/site-packages/
$ cd build
$ zip -r ask_sdk.zip .

生成されたask_sdk.zipをlayerに追加し,lambda内でlayerを適応させればライブラリが読み込まれます.
createlayer.png

layer.png

lambdaトリガーの設定

今回のlambdaトリガーはもちろんAlexa Skill KitでスキルIDは先程作ったスキルのIDを貼り付けます.
trigger.png

まとめ

Alexaのスキルの対話モデルとlambdaとの連携ができました.
次はlambdaのコード開発とIoTCoreの連携を行います.

長くなりましたのでPart2に移ります.
第三章【AWS・Tello】声でドローンを操作してみたPart2

付録

対話モデルをjsonで載せときます.インテントなど新しく作られた場合は,GitHubにPRお願いします:pray:
https://github.com/shoda888/tello_ask_model

{
    "interactionModel": {
        "languageModel": {
            "invocationName": "コントローラー",
            "intents": [
                {
                    "name": "AMAZON.CancelIntent",
                    "samples": []
                },
                {
                    "name": "AMAZON.HelpIntent",
                    "samples": []
                },
                {
                    "name": "AMAZON.StopIntent",
                    "samples": []
                },
                {
                    "name": "Controller",
                    "slots": [
                        {
                            "name": "num",
                            "type": "AMAZON.NUMBER"
                        },
                        {
                            "name": "direction",
                            "type": "direction"
                        }
                    ],
                    "samples": [
                        "{direction} {num}",
                        " {num} センチ {direction} に移動して",
                        "{direction} に {num} センチ",
                        "{direction} に {num} センチ移動して"
                    ]
                },
                {
                    "name": "AMAZON.NavigateHomeIntent",
                    "samples": []
                },
                {
                    "name": "Land",
                    "slots": [],
                    "samples": [
                        "着陸",
                        "着陸して",
                        "ランド"
                    ]
                }
            ],
            "types": [
                {
                    "name": "direction",
                    "values": [
                        {
                            "id": "back",
                            "name": {
                                "value": "うしろ",
                                "synonyms": [
                                    "後ろ",
                                    "後方"
                                ]
                            }
                        },
                        {
                            "id": "forward",
                            "name": {
                                "value": "まえ",
                                "synonyms": [
                                    "前",
                                    "前方"
                                ]
                            }
                        },
                        {
                            "id": "down",
                            "name": {
                                "value": "した",
                                "synonyms": [
                                    "下",
                                    "下降",
                                    "下方"
                                ]
                            }
                        },
                        {
                            "id": "up",
                            "name": {
                                "value": "うえ",
                                "synonyms": [
                                    "上",
                                    "上方",
                                    "上昇"
                                ]
                            }
                        },
                        {
                            "id": "left",
                            "name": {
                                "value": "ひだり",
                                "synonyms": [
                                    "左"
                                ]
                            }
                        },
                        {
                            "id": "right",
                            "name": {
                                "value": "みぎ",
                                "synonyms": [
                                    "右"
                                ]
                            }
                        }
                    ]
                }
            ]
        }
    }
}
6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4