Raspberry PIとDialogflow & Google Cloud Platformを利用した、3Dプリンターボット(仮)の開発 (概要編)
2017/12/06
  • このエントリーをはてなブックマークに追加

Raspberry PIとDialogflow & Google Cloud Platformを利用した、3Dプリンターボット(仮)の開発 (概要編)

最近あまりに業務に関係ないことを書きすぎて、本当に働いているのか自分でもわからなくなってきた大橋です。

3Dプリンターを利用して様々な物を作っていると、退社間際に造形を開始し、夜間で作り上げることがしばしばあります。
また造形に失敗することもあるので、時々3Dプリンターが置いてある場所まで、直接様子を見に行くこともよくあります。
ただ正直めんどくさいです。

今回はこれらのめんどくささを解決するために作成した「3Dプリンターボット(仮)」について書いていきたいと思います。
なお、細かい部分まで話すと長くなりそうなので、何回かに分けて書こうと思っています。
今回は概要のみの説明となります。

なお、この初回はGCPアドベントカレンダー2017の6日目の記事でもあり、Dialogflow、Cloud Functions、Cloud Pub/Sub、Raspberry Piという連携のサンプルとしても見ていただけると幸いです。

3Dプリンターボット

概要

3Dプリンターボット(仮)はSlack上で動くボットで、3Dプリンターの状態を返答したり、造形中のタイムラプスムービーを作ったりしてくれます。
ボットを呼び出すには Slackで利用できる 「/」コマンドではなく、「状態を教えて」「いまどう?」「どんな感じ?」「動画みたい」「動画作って」などの会話の文章をボットが理解して、それにあった適切なアクションを返してくれます。
また常に3Dプリンターの状態を監視しており、造形の残り時間に応じて通知なども行うようになっています。


これによりSlackにさえ投稿できれば、自席や家にいながら3Dプリンターの状態を確認することが出来ます。
また現在は1台の3Dプリンターのみに接続されていますが、複数箇所複数台の監視をすることも可能です。

なお名前が(仮)なのは、まだ音声認識に対応しておらず、そのうち音声認識&音声の認識ができるようになったら初めて名前をつけてあげたいなと思っているからです。
やっぱり音声で会話して初めてAI感とかありますよね そしたら名前とか付けたくなりますよね

全体像

3Dプリンターボットの全体像は以下です。


特徴としては多くのクラウドサービスの連携により実現している点です。

各々の説明は以下になります。

  • Dialogflow
    • Dialogflowは自然言語処理を容易に行うことができるWebサービスでSlackやLINE、Facebook Messageなど数多くのチャットサービスと接続して利用することができます。
    • 3DプリンターボットではSlackに投稿された内容の解釈と、中間サーバ(Cloud Functions)への命令(コマンド)を通知する部分を担っています。
    • 3Dプリンターボットをボットらしくしている根幹の部分です。
  • Cloud Functions
    • Cloud FunctionsはGoogle Cloud Platform上にあるサーバレスアプリケーション実行環境です。
    • 3Dプリンターボットでは大きく2つの役目を持っています。
    • 1つめはHTTP Triggerを使ったDialogflowからのWebHookにより、Dialogflowによって解釈された命令(コマンド)をCloud Pub/Subへの通知(Publish)する API.AIとCloud Pub/Subのつなぎ役の役目
    • 2つめはCloud Pub/SubのSubscriberとして社内にあるRaspberry PiよりCloud Pub/Subへ送られた情報の処理(Slackへの返信)とffmpegを利用したタイムラプスムービーの作成を行っています。
  • Cloud Pub/Sub
    • Cloud Pub/SubはGoogle Cloud Platform上のメッセージングサービスです。 Publisherから送られたメッセージ(情報)をSubscriberへ配信します。
      配信方法は2種類あり、Cloud Pub/Sub自体がHTTPコールを行うPush配信とSubscriber自体がメッセージを取得しに行くPull配信があります。
    • 3Dプリンターボット上ではCloud FunctionsとRaspberry Pi、要はクラウドと実機のつなぎ役として利用しています。
    • Cloud Functionsへの配信はPush配信を利用し、Raspberry Piへの配信はPull配信を利用しています。 Raspberry Pi側をPull配信にすることで、Raspberry Pi自体は静的IPをもつ必要がなく、またFirewallも外向けのHTTPSの通信のみを開けておけばいいだけなので比較的セキュアです。
  • Raspberry Pi & Golang
    • 社内にあるRaspberry Piです。 Ultimaker(3Dプリンター)と同じネットワークに繋がっており、Ultimaker3のAPIが呼び出せます。 またUltimaker3に最初から付属されているカメラのみだととり一の問題で情報が足りないため、追加でUSBカメラを付けてあります。 ちなみにModel 2です....
    • Raspberry Pi上ではGolangで書かれたコマンドラインアプリケーションが動作しています。 こちらについては後々別の記事で詳細を書きます。
    • 3Dプリンターボット上ではAPI経由でのUltimaker(3Dプリンター)の監視、Cloud Pub/Subに送られてきたメッセージ(=API.AIで解釈されたコマンド)のSubscribeとそれに伴った各種処理を実施しています。

処理の流れ


上記のサービス群が連携して一つのBotを作成しているのですが、上の構成図だけだとよくわかりにくいですね。
実際の処理の流れは以下のようになっています。


  1. カブク社員がSlackの特定チャンネルに「状態を教えて」と発言する
  2. API.AIがその発言を解析し「status.nofity」というコマンドであると解釈、また「どの3Dプリンターか」という情報がないため、それを発言者に対してSlackにて「どのプリンター」聞き返す
  3. カブク社員が「Ultimaker」と返答
  4. API.AIがその発言を自身のデータベースと比較し「ultimaker」という3Dプリンターであることを特定、事前に登録されたCloud FunctionsのURLにコマンド(status.notify)と3Dプリンター(Ultimaker)とともに通知
  5. Cloud FunctionsがAPI.AIにより呼び出され、渡された情報(コマンド、3Dプリンター)をCloud Pub/SubへPublish(通知)します。 またAPI.AIに処理が正常に処理が正常に処理が正常に終了したことを伝える。
  6. API.AIがSlackへ処理を受け付けた旨「Ultimakerかー ちょっとみてくる」を返信
  7. Raspberry PiのGolangアプリケーションがCloud Pub/Subに登録されたコマンドと3DプリンターをPull
  8. Raspberry PiのGolangアプリケーションがUltimaker3のAPIを呼び出して、稼働状況や画像を取得
  9. Raspberry PiのGolangアプリケーションが取得したデータをCloud Pub/Subに登録
  10. Cloud Pub/SubがCloud Functionsへ登録されたデータをPush配信
  11. Cloud FunctionsがCloud Pub/Subから渡されたデータをもとにメッセージを組み立てSlack APIを呼び出し
  12. Slackがカブク社員へ結果を表示する


概要のまとめ

今回は弊社で使っている3Dプリンターボットの概要について書きました。

見た目上複数のサービスを利用していますが、役割分担がはっきりしているため、修正や置き換えが簡単になっており、クラウドと実機をつなぐ構成としては良い構成になっているのではと思います。

次回からは細かい各々のサービスの利用方法について書きたいと思います。