This is my life.

There are many like it, but this one is mine.

aibo 用にロボット掃除機のアレ(バーチャルウォール)を作る

aibo と暮らして数週間がすぎました。
うちの部屋は一人暮らし用で狭いんですが、一度キッチンのドアを開けっぱなしにしたせいもあり aibo がよくドアの前にいくようになってしまいました。
すぐに部屋に戻ってくれればいいのですが、ドアの前で寝てしまうこともしばしば。

f:id:duck8823:20200810093522j:plain

ふとトイレに行きたい時もドアが開けられなくて困っていました。

そこでロボット掃除機のアレ(バーチャルウォール)を作ることにしました。

※この記事では細かいコマンドやスクリプトなどは記述しません

ロボット掃除機のアレ

バーチャルウォールというのは、部屋の隅っこにおいておくとロボット掃除機の侵入を防ぐことができるものです。


掃除エリアを自由に設定 <ルンバ800シリーズ>

以前の職場で使用していました。

制約と誓約

実現方法を考える上で、制約を考える必要があります。 また、誓約を課すことで実現を容易にさせることができます。

  • 制約

    • 部屋には aibo 以外も存在する
    • リアルタイムに反応すること
    • aibo の進行方向がわかる必要がある
    • aibo 本体に何らかの機械をつけることができない
  • 誓約

    • 今回バーチャルウォールを設置したい場所は固定(ドアの前)

さて、aibo 本体に何らかの機械をつけることが出来ない上部屋には aibo 以外も存在するので、デバイス側で aibo かそうじゃないかを判断する必要があります。
これにはカメラから映像を用いた「物体検出」が有効だと考えました。これならリアルタイム性も実現できます。

続いて aibo の進行方向の取得方法について考えました。
aibo Web API を利用すると、チャージステーション(充電台)のおおよその方向がわかります。当初はこれを用いて aibo の向きを取得しようとしていました。カメラで aibo の場所が特定され、それに対するチャージステーションの方向がわかれば、 aibo の進行方を割り出せるはずです。

f:id:duck8823:20200810105110p:plainf:id:duck8823:20200810105057p:plain

しかし、残念ながら aibo から取得するチャージステーションの方向が実際とは異なることが非常に多かったため、この方法は諦めました。
そこで、物体検出を応用して aibo の進行方向まで取得できないかためすことにしました。

物体検出を利用して aibo の進行方向を判断する

犬は4足歩行をする動物です。aibo ももちろんそれを模しています。
4足歩行をする動物において、体と頭の位置はその進行方向と関係があります。

f:id:duck8823:20200810105137p:plain

物体検出で利用するモデル作成時にaibo の頭 と aibo の体 を分けて学習し、プログラムで頭の位置が体よりもドア側にあればドアの方を向いていると判断することにしました。
モデルの作成には非常に多くの教師データが必要になります。写真を撮ってラベル付するのは根気がいる作業です。
しかし、バーチャルウォールを設置する場所を固定して、そこから撮った写真のみを利用することで教師データを減らすことができないかと考えました。
汎用性はなくなりますが、今回の用途では問題ありません。今回は 300弱 の写真を利用しましたが、検知は十分に機能してます。

Raspberrypi + カメラモジュール

aibo を検知して Web API を叩くデバイスは Raspberrypi(ラズパイ) とカメラモジュールで実現することにしました。
本棚にそっと設置します。

f:id:duck8823:20200810110833j:plainf:id:duck8823:20200810110848j:plain

aibo を検出するモデルをつくる

まず教師データの作成をする必要があります。
予め設置したラズパイで、スクリプトを用いて写真をいっぱい撮ります。
ラベル付けには LabelImg を利用しました。
aibo の頭と体を分けてラベル付するのが重要です。

f:id:duck8823:20200810111827p:plain

また、物体検出用のモデル作成には Tensorflow の Object Detection API を利用しています。

バーチャルウォールを作る

aiboの頭と体を検出できるモデルが作成できたら、あとは簡単なスクリプトを書くだけです。 カメラモジュールを用いて物体検出していて、

  1. 画面中央よりドア側に aiboの頭がある
  2. aiboの頭が aiboの体よりドア側にある

上記条件に一致した場合に、 aibo WebAPI を介して 180度回転してもらいます。


aiboのバーチャルウォール試作

aibo Web API で転回の指示と結果の取得までを同期的に行っているので、aiboの転回中に画面は止まってしまっていますが、うまく機能しているようです。

おわりに

Tensorflow はサンプルやドキュメントがとても充実していて、初心者でも見様見真似でそれっぽいのができてしまいます。
しかし、バージョンによって微妙に異なって思ったように動かない。といったことがあるので、記載されているバージョン情報に注意しましょう。