ラピロとインタラクションする(ラピロへのジェスチャセンサの搭載)

これまでは過去に搭載した機能の移植という形で進めてきましたが、ここからは過去になかった機能を搭載していきます。

これまで搭載してきた機能は、実は一方的にラピロがこちらに向けて何かを発信するためだけのものでした。表情を出すのも、音声を出すのも。そこで、次はこちらからのアクションをラピロに受け取ってもらえるようにしたいと思います。

ということで、今回はジェスチャセンサをラピロに取り付けてみます。

いつもはセンサの組み込み方の話をしてから最後にソフトの話をするのですが、今回は先にソフトのお話から。

今回使用するジェスチャセンサはGroveシステムの一つなので、Raspberry Piで使うにはGrovePi を挟んで使うのが真っ当な手順だと思います。が、残念ながら自分のラピロの頭の中にはそんなスペースは残されていないので、今回はGrovePiなしでやります。このセンサはI2C接続なので、そのままRaspberry PiのGPIOに繋ぐ形でも特に問題ありません。

さて、GrovePiのモノ自体は使いませんが、GrovePiが使っているPythonライブラリは公開されているので、これをありがたく使わせていただきます。

上記に置いてある”grove_gesture_sensor.py”をそのまま持ってきて、適当なところに置きます。自分の場合は”/home/pi/server/python/my-packages”に置いていますが、これはpipとかeasy_installとかを使わずに、自分が適当に拾ってきたパッケージ(ライブラリ)を突っ込んでおくために自分で作ったディレクトリです。

Pythonの実行時に上記のディレクトリを参照してもらうようにするため、デフォルトでパスの通っている”/usr/local/lib/python2.7/dist-packages”に、”xxxxx.pth”というファイルを作成して、自作ディレクトリのパスを記述します。

$ sudo /usr/local/lib/python2.7/dist-packages/my-packages.pth

/home/pi/server/python/my-packages

これで、Pythonファイルをどこで実行しても、my-pacakgesディレクトリの中身が参照されるようになります。パスが追加されているかは、以下のコマンドで確認可能です。

$ python
Python 2.7.9 (default, Mar  8 2015, 00:52:26) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import shs
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named shs
>>> import sys
>>> sys.path
...
>>> quit()

ライブラリの準備はできたので、次はサンプルファイルを用意します。これも、こちらにある”gesture_value.py”をそのまま使わせてもらえばOKです。

続いて、センサを本格的に組み込む前に、仮接続してセンサの動作テストを行います。ジェスチャセンサの4本の線(GND, VCC, SDA, SCL)をそれぞれ Raspberry PiのGPIOに繋いだら、I2Cデバイスが認識されているかを確認します。動作電圧は仕様では5.0Vですが、一応3.3Vでも動くっぽいです。

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: 70 71 -- 73 -- -- -- --                  

自分の場合はなぜか、いつも一回目のコマンドではジェスチャセンサのアドレス(0x73)が確認されず、二回目のコマンドからは認識されます。謎。ちなみに0x70と0x71は別に接続しているLEDマトリクスのアドレスです。

接続が確認できたら、早速”gesture_value.py”を実行してみます。

$ python gesture_value.py 
wake-up finish.
Paj7620 initialize register finished.
-
-
-
-
FORWARD
BACKWARD
-
-
-
-
-
LEFT
-
-
-
-
-
RIGHT
-
-

うん、問題なさそうです。このジェスチャセンサはデフォルトで9種類のジェスチャに対応してくれます。

 

それでは、ラピロ本体にセンサを組み込んでいきます。 どこに組み込むかが一番の問題ですが、センサ部分を露出させる必要がある以上、本来カメラモジュールを取り付けるためのスペースに取り付けるのが妥当かと思われます。そうなると、カメラモジュールとジェスチャセンサの二者択一になってしまいますが、今のところ自分はカメラを使うことはほとんどないので、今回はカメラを捨ててジェスチャセンサを取り付けることにします。

th_rapiro-gesture-1

横幅がわずかに短いですが、カメラモジュールの取り付け穴にネジ止めすることができます。正位置から90度傾いた状態での取り付けになってしまいますが、それはプログラム側で認識結果を補正してやれば問題ないかと思います。

th_rapiro-gesture-2

あんまり目立ちませんね。

早速動作チェックしてみると。。。全然認識してくれなくなりました。

th_rapiro-gesture-3

どうもセンサの位置が奥すぎる模様。

th_rapiro-gesture-4

 適当に切った紙で覆ってみたのですが、この程度奥まっているだけでも、認識してくれなくなります。

th_rapiro-gesture-5

これぐらい露出させるとOK。

th_rapiro-gesture-6

穴を大きくすれば、ちょっと奥まるぐらいなら認識してくれるようになります。

ということは、ジェスチャセンサをラピロのおでこの穴に密着するように取り付けられれば、なんとか認識してくれるようになるハズ。

th_rapiro-gesture-8

密着させようと思うと、ネジ穴を使うことはできません。が、ジェスチャセンサ自体がとてもうまい具合にネジ穴に沿う形になっているので、なんとかこの形で止められれば密着できそうです。この取り付け方だと、センサの位置も正位置になるので、プログラム側での補正も不要です。

ただ、上記のように止めようと思った場合、残念ながらGroveシステムの純正ケーブルは使えません。しょうがないので、

th_rapiro-gesture-9

コネクタの後ろの部分にダイレクトに導線を半田付けします。

th_rapiro-gesture-10

あとはそれをはめ込んで、ワッシャをつけたネジとテープで固定します。

th_rapiro-gesture-11

センサの位置がだいぶ前に出てきました。この状態でもう一度サンプルプログラムを動かすと、今度はちゃんと認識してくれました。よかったよかった。

 

ということで、「今回搭載したジェスチャセンサと、前の動作とか表情づけを組み合わせるとこんなことができますよ」というデモです。

やっていることは簡単で、センサでジェスチャを認識したら、それに対応するアクションのHTTPリクエストを内部で投げるだけ、です。

 

というわけで、ラピロにジェスチャセンサを組み込んでみました。これができるとラピロとインタラクションできるようになるので、ラピロの活用の幅が広がると思います。同じようなことはカメラを使って画像認識してもできると思うのですが、それに比べると処理の記述は簡単ですし、ラピロの電力と処理能力的な負荷もそんなに大きくないと思うので、オススメです。

ちなみに、頑張って加工すればカメラとジェスチャセンサを両立させることは可能かもしれません。頭にはカメラを入れて、ジェスチャセンサは胴体に穴開けて入れるとか。。。うーん、余裕があればやってみたいですが、とりあえず今回はパスです。