目次
はじめに
ヒューマノイドロボットNAO向けアプリを開発する機会があったので、備忘録も兼ねて作り方を紹介します。
この記事では、WebAPIを使って簡単な天気予報をするNAO向けアプリの作り方を解説します。NAOをまったく知らない人でも大丈夫です。
※NAO本体がなくてもPCがあれば動作確認できます。
作成するアプリの機能
- NAOに「天気どう?」と聞いたら、大阪市の天気を教えてくれる
これだけです。大阪市なのは単に筆者が大阪在住のためです。
NAOについて
NAOはSoftbank Robotics社のヒューマノイドロボットです。v6が最新ですが、今回作成するアプリはv5を対象としています。
© SoftBank Robotics
※ SoftBank RoboticsのNAOを活用し、当社が独自に実施しています。
開発環境
開発環境については公式ドキュメント(Choregraphe suite installation)をご確認ください。
参考として、筆者の開発環境を記載します。
OS | Ubuntu 18.04 64bit |
RAM | 8GB |
Choregraphe version | 2.5.5 |
※Windows10 64bitで開発ツールのChoregrapheを使ってみたところ、動作が不安定だったためLinux版を使っています。
Choregrapheのインストール
NAO向けアプリ開発にはChoregrapheというツールを使います。
Choregrapheはビジュアルプログラミングツールであり、ほとんどソースコードを書かずにNAO向けアプリを開発できます。Pythonでスクリプトを書くことも可能です。
SoftBank社が公開しているChoregraphe(コレグラフ)のインストール方法を参考にインストールしてください。
プロジェクトの作成
Choregrapheをインストール後、起動します。
「ファイル」 → 「プロジェクトを新規作成」をクリックしてプロジェクトを新規作成します。
プロジェクトのプロパティを開きます。
ロボアプリの対応言語に日本語を追加します。アプリ名なども変更できます。
アプリの構成
プログラムはビヘイビアと呼ばれるところに、ボックスを設置して作ります。ボックスは、機能をまとめたもので、例えば、音声認識するボックスや、ロボットにしゃべらせるボックスなどがあります。
今回のような小さなアプリでは1つのビヘイビアにすべての処理を書いてもいいですが、アプリの規模が大きくなるとごちゃごちゃしてしまいがちです。
なので、アプリを次の2つのビヘイビアに分けます。
- メインビヘイビア … アプリの開始点となるビヘイビア。ユーザーから天気を聞かれると、後述の天気予報ビヘイビアを実行する。
- 天気予報ビヘイビア … 天気予報APIを呼んでロボットが天気をしゃべるビヘイビア。
このようにある程度の機能(ダンス、歌う…など)でビヘイビアを分けるとアプリの構成がすっきりして、後々の機能追加などが楽になるんじゃないかと思います。
天気予報ビヘイビアの作成
先に天気予報ビヘイビアを作成していきます。
Choregrapheの画面左側にある、「+ボタン」 → 「新規Behavior…」をクリックします。
ビヘイビアの名前はweather_infoとします。「追加」をクリックします。
追加されたweather_infoフォルダ内の、behavior.xarをダブルクリックして開きます。
次に、天気予報APIを呼ぶ処理を作ります。残念ながら標準のボックスではそのような機能はないため、Pythonスクリプトを書きます。
ボックスライブラリからPython Scriptボックスを選択し、ドラッグ&ドロップします。
ボックスを右クリック → 「ボックスを編集」で名前等を編集できます。ここでは名前をget_weather_infoとしています。
設置したPythonボックス右側の出力(onStopped)を右クリックし、出力を編集します。タイプを文字列にします。
Pythonボックスをダブルクリックするとスクリプトを編集できます。次のスクリプトをコピペします。今回は、天気予報のAPIにDark Sky APIを使っています。あらかじめ登録してAPIキーを取得してください。
スクリプトの18行目urlの{API_KEY}の部分を、Dark Sky APIのAPIキーに書き換えてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import urllib2 import json class MyClass(GeneratedClass): def __init__(self): GeneratedClass.__init__(self) def onLoad(self): #put initialization code here pass def onUnload(self): #put clean-up code here pass def onInput_onStart(self): # urlの{API_KEY}の箇所を、Dark Sky API の APIキーに書き換える url = "https://api.darksky.net/forecast/{API_KEY}/34.686316,135.519711?exclude=minutely,hourly,daily&units=ca&lang=ja" req = urllib2.Request(url) # APIにリクエストを投げる try: res = urllib2.urlopen(req) except urllib2.URLError as e: self.onStopped("インターネットに接続されていません") return # レスポンスをゴニョゴニョしてNAOにしゃべらせる文字列を作る result = res.read() weather = json.loads(result) city = "大阪市" icon = weather["currently"]["icon"] icon_to_summary = { "clear-day": "晴れ", "clear-night": "晴れ", "rain": "雨", "snow": "雪", "sleet": "みぞれ", "wind": "強風", "fog": "霧", "cloudy": "くもり", "partly-cloudy-day": "晴れときどきくもり", "partly-cloudy-night": "晴れときどきくもり" } summary = icon_to_summary[icon] weather_text = "今日の" + city + "の天気は" + summary + "です" self.logger.info(result) self.logger.info(weather_text) # NAOにしゃべらせる文字列を出力する self.onStopped(weather_text) def onInput_onStop(self): self.onUnload() #it is recommended to reuse the clean-up as the box is stopped self.onStopped() #activate the output of the box |
コメントにも書いてますが、このスクリプトは、
- APIにリクエストを投げる
- レスポンス(JSON)をパースして、NAOにしゃべらせる文字列を作る
- NAOにしゃべらせる文字列をボックスから出力する
という流れとなっています。
ロボットにしゃべらせるには、Animated Speech Textボックスを使います。このボックスは、入力された文字列をロボットが身振り手振りしながらしゃべるものです。
Animated Speech Textボックスをドラッグ&ドロップします。
ボックスの設定(レンチのアイコン)を開き、Speaking movement modeをcontextualにします。これで、ボックスに入力された文字列の文脈によってロボットが適切な身振り手振りをしてくれます。
最後に、線をこのようにつなげて完成です。
動作を確認してみましょう。NAOの実機がなくても、バーチャルロボットで確認できます。
画面上部のロボットに接続するボタン(緑色の電波マーク)をクリックします。
バーチャルロボットを選択します。
weather_infoフォルダのbehavior.xarを開いた状態で、「ロボットビュー」を開き、「アップロードして再生ボタン」をクリックします。
ロボットビューに、「今日の大阪市の天気は晴れです」などと表示されたらOKです。ダイアログでも確認できます。(表示されてなかったらメニューの「表示」からダイアログを選択してください)
メインビヘイビアの作成
アプリの起点となるメインビヘイビアを作ります。このビヘイビアは、ロボットと対話するDialogボックスを実行するだけです。
「+ボタン」→「新規Behavior…」から名前をmainとしてビヘイビアを作成します。mainビヘイビアができたらダブルクリックして開きます。
次に、「+ボタン」→「新規ダイアログトピック…」でダイアログを作成します。
名前をdialog_sampleとしています。言語はJapaneseにチェックを入れて「追加」をクリック。
dialog_sample内の、dialog_sample.dlgをドラッグ&ドロップします。
ロボットの言語を日本語にするため、Set Languageボックスを設置します。
線はこのようにつなぎます。
Set Languageボックスの設定を開き、LanguageをJapaneseに変更します。
ダイアログトピックの編集
dialog_sample内のdialog_sample_jpj.topファイルを開きます。このファイルにQiChatというスクリプトでロボットとの対話ルールを記述します。
次のスクリプトをコピペしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
topic: ~dialog_sample() language: jpj # Defining extra concepts out of words or group of words #concept:(hello) [hello hi hey "good morning" greetings] concept:(weather_info) [天気 天気予報] # Catching inputs and triggering outputs #u:(e:onStart) $onStopped=1 # Replying to speech #u:(~hello) ~hello u:(~weather_info) 大阪市の天気を調べます ^runBehavior(.lastUploadedChoregrapheBehavior/weather_info) |
なんとなく、意味がわかるんじゃないでしょうか。シャープはコメント行です。
7行目のconceptは、同じ概念の単語グループを定義したものです。ここでは、[天気, 天気予報]の2つの単語をweather_infoというconceptとしています。
15行目からは、ユーザーからの入力とそれに対するロボットの応答を記述しています。
ユーザーからの入力にweather_infoのconceptが展開されています(~weather_info)。
^runBehaviorは引数に渡されたビヘイビアを実行します。
つまり、ユーザーから「天気」または「天気予報」と聞かれたら、ロボットは「大阪市の天気を調べます」と言い、weather_infoビヘイビアを実行するという意味になります。
スクリプトを編集したらアプリは完成です。実行してみましょう。
mainビヘイビアを開いた状態で、「アップロードして再生」ボタンをクリックします。
ダイアログから「天気」、「天気予報」と入力してみてロボットが天気予報の結果を答えてくれたらOKです。
おわりに
いかがでしたか?けっこう簡単にNAO向けアプリが作れたと思っていただければ幸いです。今回はNAOとの対話にQiChatを使いましたが、IBM WatsonのAPIを利用するとさらに柔軟な対話が実現できると思います。
今回ご紹介したNAOのデモを、以下の展示会で展示しています。弊社ブースにぜひお立ち寄りください。
第11回 販促・マーケティング総合展【夏】内、「第7回 看板・ディスプレイEXPO【夏】」
※旧称:店舗販促EXPO
【会期】2019年6月19日(水)~21日(金)
【会場】東京ビッグサイト西展示棟1F 2ホール ブース番号:12-31
【展示内容】クラウド型サイネージ管理サービス「DAiS Signage」
【招待券請求・お問い合わせ】tdiお問い合わせページ
参考
執筆者プロフィール
- AWS上で使えるツールの開発やフロントエンドの調査、生成系AIの調査等を行っています。最近は AWS の CDK やサーバーレスに興味があります。