【AWS】【AWS IoT Core】【やってみた】ルンバが本当に掃除しているのか監視するアプリをつくってみた(番外編)

 前回の投稿で作成した、「ルンバの位置監視サービス」開発の番外編になります。ルンバの位置をどのように取得するかという課題を解決するまでの紆余曲折を書きます。ここは、開発技術についての説明はありません。ただの苦労話といえば苦労話なのですが、実際の開発ではこういった泥臭い試行錯誤も必要なのだな、という教訓としてここに記録を残しておきます。

 前回の投稿はこちら。

highitoh.hatenablog.com

ルンバの位置をどう検知するか

 サービスの実現にあたっては、ルンバの現在位置をどのように取得するかという問題を解決しなければなりません。ここに関しては、アプリをつくるという目的からは外れたところなので、なるべくさっさと終わらせたい気持ちが強かったのですが、ここでかなり手間取りました。

 センサでモノの位置を取得する方法について、Googleで色々と調べてみたのですが、なかなかこれだという方法がみつからない。一番想像しやすいGPSを使う方法は精度の観点で難しく、ビーコンを使う方法も同じく精度の観点で難しい模様。自動運転などで使われているLiDARは、難易度が高く設備も数十万と高すぎる。マップを作成して自己位置を推定する方法(SLAM)もあるようですが、専門的な知識がない人間には敷居が高すぎる。。

最初の有望株:NFCタグ

 そんな中、最初の有望株として見つけたのが、NFCタグを使用する方法。日常的には、交通系ICカードなどに利用されている技術ですね。スマートフォンNFCリーダがあるので、ルンバの上にスマートフォンを取り付けて、天井からぶら下げたNFCタグの下を通過したときに位置情報をクラウドに送信すれば実現できそう。ちょうど、改札でカードをピッとタッチするイメージですね。

 実際に、NFCタグを10枚買ってみて実現できそうか試してみたのですが、これがどうやら難しそうであることがわかりました。どこが問題かというと、検知範囲の狭さです。本当にNFCタグの真下をスマートフォンが通過しないと反応しないので、ルンバの現在位置を知ろうとすると大量のNFCタグが必要になります。一つのNFCタグの大きさは3cmほど。これを、ルンバが通りそうな場所に張り巡らせようとするとタグが何百枚、費用的にも数万円かかってしまいます。そして、使い終わったあとのタグを、一体どう処理したらいいのか。。。ということで、NFCタグを使った方法は却下となりました(まあ、なんとなくそんな予感はありましたが)。

f:id:highitoh:20210905134818j:plain
検証に使ったNFCタグ(左)。大きめのタグを買いましたが、それでも今回の目的を実現するには程遠く。。

QRコードを使った方法を思いつく

 手軽な実現方法はないのではないかと、半ばあきらめかけた時もありましたが、ある時QRコードを使った方法を思いつきました。スマートフォンにつけたカメラでQRコードを読み取り、そのデータを送信する方法です。この方法であれば、NFCタグで問題となった検知範囲の問題についても、ある程度の範囲であれば読み取ってくれそう。。

 この方法も最初はうまくいきませんでした。スマートフォンのカメラでQRコードを読み取ろうとすると、ルンバの移動スピードが速く読み取れないことがわかりました。どうやら、処理性能が足らないようです。また、読み取れたとしても、読み取ったデータをクラウドに送信する処理を、専用のスマートフォンアプリを開発して実現しなければならないため、目的がもはやスマホアプリ開発になってしまいます。

 ということで、カメラを使ってQRコードを読み取る方法も却下。検知性能が問題であれば、ということで、専用のリーダを使ったら良いのではないかと思い、思い切ってQRコードリーダを発注。Amazonで小型でポータブルで比較的安い(何万もしない)ものがあったので、これを使ってみることにしました。

https://www.amazon.co.jp/gp/product/B07T35G1QN/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1

 これがうまくいきそうでした。リーダーをルンバの速度で動かして、50cm離れたQRコードを読み取ることができました。リーダーの場合、カメラとは違って検知範囲が狭くなりますが、QRコードを複製してA4の紙に敷き詰めれば、広範囲での検知ができそうです。これは、NFCタグではできない解決方法ですね。

 また、読み取ったデータをテキストデータでBluetooth送信してくれることも魅力的でした。これであれば、デバイス依存のアプリを作ることなく、PC側で受け取ったデータを整形してAWSに通信してあげればよく、実装のコストも抑えられそうです。

 いろいろと試してみたところ、A4用紙に3×4にQRコードを敷き詰めて印刷すると、検知性能に問題がないことがわかりました。あとは、部屋の領域にID番号を割り振って、そのID番号に対応するQRコードをその場所に置いておけば、ルンバの現在位置を送信することができそうです。

f:id:highitoh:20210905133633j:plain
↑実際に部屋に張り巡らせたQRコードの一枚。このQRコードは"3"を表しています。

実際に動かしてみる

 実際に、部屋にQRコードを張り巡らせたときの写真がこちら。壁に梱包用の紐を付けて、途中にQRコードを印刷した紙を部屋のIDに併せてくっつけています。写真は部屋の一部ですが、実験中部屋はQRコードと紐だらけであり、ルンバは下を通り抜けるので大丈夫ですが、人が移動するのは厳しい状況。実際にルンバを動かしている時も、壁に付けていた紐が何度も取れてしまい、紐をまたぎながら修復しに行く、といったことを続けていたのでとても疲れました。

 とはいえ、一応想定通りルンバが下を通るたびにQRコードを読み取ってくれ、ようやくルンバの現在位置を取得することができました。当たり前ですが、この方法ではサービスが動いている間は部屋が使用できなくなってしまうので、実用化するにはこれ以外の方法を採用しないといけませんね。

f:id:highitoh:20210905134822j:plain
部屋に張り巡らせたQRコードの紙。この下をルンバが通ると、上部に取り付けたリーダーでQRコードを読み取ってくれる仕組みです