【AWS】【AWS IoT Core】【やってみた】ルンバが本当に掃除しているのか監視するサービスをつくってみた

 最近、クラウドの開発知識を得たくて、AWSの勉強をしています。勉強するにあたって、知識だけではなく、やはり実践的になにかのサービスを作ってみたほうが勉強になるだろう、ということでネタを考えていました。

 そこで、目に留まったのがルンバ。ボタンを押しただけで部屋の掃除を勝手にしてくれる優れものなのですが、どうも同じところばかり掃除しているように見える。。うちのルンバはスペックが低くカメラが付いていない機種なので、仕方ないといえば仕方ないのですが。。

 ということで、ルンバが実際にどこを掃除しているのかリアルタイムにわかるサービス(Roomba Police)を、AWSを使って作ってみた、というお話になります。

 作成したコードはこちらにアップしています。

github.com

f:id:highitoh:20210815210548p:plain
完成したルンバの監視画面。ベージュのエリアを掃除してほしいのだが。。

システム構成

 全体のシステム構成は下の図のとおりです。ルンバの現在位置は、部屋の位置IDを書き込んだQRコードを読み取ることで検知します。読み取った位置IDをクラウド側に渡すことで、ルンバの位置を監視する仕組みです。クラウド側は、IoT Coreの初級ハンズオンと同等の構成で実現することができました。

https://aws-iot-core-for-beginners.workshop.aws/

f:id:highitoh:20210815205137p:plain

 作成期間は、おおよそ4日程度です。AWSの使い方を勉強する目的で始めたのですが、結局ルンバの位置情報の取得方法(QRコード)の検討とブラウザでルンバの位置を表示するプログラムの実装に半分以上の時間を使った結果になりました。AWS側は、lambdaの実装をサンプルから大部分流用できたのが大きいですね。ただ、サービスを実現するための最低限の作業しかしていないので、IAMなどの設定を加えるとなると、もう少し時間がかかると思われます。

ルンバの位置登録

 ルンバに取り付けたQRコードリーダは、部屋にあるQRコードから位置IDを読み取ります。読み取ったデータは、BluetoothでPCに送信されます。QRコードリーダから送信されるデータは、標準入力でテキストデータの形式で受け取れるので、簡単に取り扱うことができます。

 PCでは、標準入力で位置IDを受け取り、それをMQTTでAWSに送信します。IoT Coreとの接続は、AWS IoT SDKを使う必要があります。Pythonを使用した実装方法は、下のページに詳しく書かれており、この内容を少し書き換えることで実装ができてしまいました。ファイル行数としても、50行強程度です。経験はないのですが、面倒なイメージのある証明書を使ったセキュアな通信を、こんなに簡単に実現できるのかと驚きました。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/iot-core-publish-mqtt-messages-python/

 AWSに送られたMQTTのデータは、IoT Coreで時刻と位置IDが解釈され、バッファとなるKinesis Data Streamsに送られます。lambdaは、Kinesisからデータを受け取り、DynamoDBにルンバの位置情報を登録します。この処理は、IoT Coreハンズオンで使用されているPythonコードを改造して実装しました。これで、ルンバの指定時刻の位置をAWSに登録することができました。

ルンバの位置表示

 続けて、参照側の実現方法です。大きな流れとしては、WebブラウザからS3に格納したHTMLファイルにアクセスし、API GatewayREST API経由でDynamoDBに格納されたルンバの位置情報を取得して表示します。

 Webブラウザは、静的ウェブサイトホスティングを有効にしたS3にアクセスし、Webページを表示します。Webページは、一定時間おきにJavaScriptAPI Gatewayに対しHTTP GETを発行し、ルンバの最新の位置情報を問い合わせます。(今回は3秒おきで更新するように実装しましたが、あんまり更新頻度が大きいとたくさん課金されそう。。今回は個人利用なので良しとします)。API Gatewayは、HTTP GETリクエストを受け取ると、lambdaをキックします。lambdaは、DynamoDBから最新の位置IDを取得して、Webブラウザに返します。このlambdaの実装も、IoT Coreハンズオンの内容の多くを流用して作ることができました。

 Webブラウザは、受け取った位置IDからルンバの位置を計算し、ルンバの画像を移動させます。なお、画像の移動はCSSアニメーションを利用しています。このあたり、フロントエンドの開発知識があまりなかったので、結構時間を使ってしまいました。

検証結果

 このようにして、QRコードリーダから送信された位置情報をもとに、Webブラウザ上にルンバの位置を表示させるサービスを作ることができました。併せて、現在位置の表示だけでなく、過去の動きをトレースするページを作成しました。完成したページは、下の動画のように動きます。リアルタイムにチェックするよりも、後から掃除していたか確認するこちらの方が、ユースケース的には便利そうですね。

 肝心のルンバの動きの方はというと、ベージュのエリアを掃除して欲しかったのですが、あまりそちらには向かってくれなかったようです。。うーむ。 youtu.be