ラズパイ版MESHを使って、Apple Watchで操作するおしゃべりロボットを作る

# ソニーMESH + ラズパイ + Google + Apple Watch
ソニーのMESHは、iPadなどのアプリで、指でつなぐだけプログラムする事なく、色々なIoTガジェット、ロボットなどが作れる簡単なセンサー、タグ群です。
そんなMESHを使ってロボットを作ってみたいと思います！（こちらはMaker Faire Tokyo 2018のMESH作ってみた友の会で展示したものです）
[![MESH Robot](http://img.youtube.com/vi/Ywu2-DPss64/0.jpg)](http://www.youtube.com/watch?v=Ywu2-DPss64)

<iframe width="560" height="315" src="https://www.youtube.com/embed/Ywu2-DPss64" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>

まずMESHに、みんな大好きラズベリーパイ版のアプリ[MESH Hub](https://meshprj.com/jp/hub/)があるの知ってました？
![IMG_8316.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/9ae896f7-09de-5d08-b584-a364cdb9ec62.jpeg)

これがあれば、簡単なインターフェースで動きが変えられるのはそのままに、iPadやiPhoneなどを近くに置いておかなくても（ラズパイがあれば）MESHが動くようになります。
もちろんラズパイ上で動くので、みなさんが普段使われているウェブサーバや、先進的なGoogle、AmazonのAPIと共に、MESHが動く事になります。
![MeshHub1.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/53f4e0b9-288a-73bc-5b48-a35d53137ef4.jpeg)
## ラズパイ版MESHにGoogle APIを入れて、更にAppleWatchから操作できるロボットを作って行きます！
![IMG_4344.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/9aea484a-341f-b986-4804-8967b860a37e.jpeg)

MESH SDKとラズパイのPythonを駆使して、見て（Google Vision）、聞いて（Google AIY、Assistant）、しゃべる（Google Translate、AquesTalk）、そしてIFTTTと組み合わせてAppleWatchから動かす（つまりMESH無しでも！ﾎﾞｿ）ロボットになります！
![raspimesh.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/995a8c36-3dc9-0d8b-5498-c1295d6b998f.jpeg)


少し長いですが、内容はこんな感じ。既にラズパイや、Google APIに詳しい方は適当に読み飛ばして、見てみて下さいね。とりあえず[Githubのプログラム](https://github.com/ktrips/mesh)もあります。

## MESHロボットの作り方ステップ
1. ラズパイ準備、MESH Hubのインストール
2. MESH SDKとBottleによるMESHカスタム・ファンクションの追加
3. ラズパイでのGoogle AIY、Assistant、Translate、Visionなどの導入
4. MESHアプリからラズパイ機能を呼び出す
5. ロボットの外形作り、モーターとの連動
6. 全部組み合わせて、AppleWatchで操作

## 必要な部品など
- [RaspberryPi 3B](https://www.amazon.co.jp/gp/product/B01NAHBSUD/355-2653889-7890949?ie=UTF8&camp=1207&creative=8411&creativeASIN=B01NAHBSUD&linkCode=shr&tag=ktrip-22&qid=1513648785&sr=8-5&keywords=raspberry+pi+3)
- [PiCamera](https://www.amazon.co.jp/gp/product/B01EW2KDTE?ie=UTF8&camp=1207&creative=8411&creativeASIN=B01EW2KDTE&linkCode=shr&tag=ktrip-22&s=electronics&qid=1513660039&sr=1-1&keywords=%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%82%AB%E3%83%A1%E3%83%A9)
- [小型USBマイク](https://www.amazon.co.jp/gp/product/B01KZPF1U8?ie=UTF8&camp=1207&creative=8411&creativeASIN=B01KZPF1U8&linkCode=shr&tag=ktrip-22&s=aps&qid=1513648890&sr=1-2-catcorr&keywords=%E8%B6%85%E5%B0%8F%E5%9E%8B%E3%83%9E%E3%82%A4%E3%82%AF)
- [小型スピーカー](http://akizukidenshi.com/catalog/g/gP-12587/)
- [アンプキット](http://akizukidenshi.com/catalog/g/gK-08161/)
- [小型USBバッテリー](https://www.amazon.co.jp/gp/product/B01M6BJNHP?ie=UTF8&camp=1207&creative=8411&creativeASIN=B01M6BJNHP&linkCode=shr&tag=ktrip-22&s=electronics&qid=1514019227&sr=1-2-fkmr1&keywords=%E5%B0%8F%E5%9E%8B%E3%83%90%E3%83%83%E3%83%86%E3%83%AA%E3%83%BC+avail)
- [モータードライバー](http://akizukidenshi.com/catalog/g/gI-02001/)
- [タミヤ工作キット（モーター付き）](https://www.amazon.co.jp/%E3%82%BF%E3%83%9F%E3%83%A4-%E6%A5%BD%E3%81%97%E3%81%84%E5%B7%A5%E4%BD%9C%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-No-162-%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E8%A3%BD%E4%BD%9C%E3%82%BB%E3%83%83%E3%83%88-%E3%82%BF%E3%82%A4%E3%83%A4%E3%82%BF%E3%82%A4%E3%83%97/dp/B002DR3HAI/ref=sr_1_17?ie=UTF8&qid=1533694722&sr=8-17&keywords=%E3%82%BF%E3%83%9F%E3%83%A4%E5%B7%A5%E4%BD%9C%E3%82%AD%E3%83%83%E3%83%88)
- 電池、ホルダー
- [LEDボタン](http://akizukidenshi.com/catalog/g/gP-04071/)
- [AppleWatch（あれば）](https://www.amazon.co.jp/Apple-%E3%82%A2%E3%83%83%E3%83%97%E3%83%AB-MJ2X2JA-Watch-%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%82%B0%E3%83%AC%E3%82%A4%E3%82%A2%E3%83%AB%E3%83%9F%E3%83%8B%E3%82%A6%E3%83%A0%E3%82%B1%E3%83%BC%E3%82%B9%E3%81%A8%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%82%B9%EF%BB%BF%E3%83%9D%EF%BB%BF%E3%83%BC%EF%BB%BF%E3%83%84%E3%83%90%EF%BB%BF%E3%83%B3%EF%BB%BF%E3%83%89/dp/B017LD8KX2/ref=sr_1_8?ie=UTF8&qid=1533694883&sr=8-8&keywords=apple+watch+nike)
- [MESH（ムーブタグ、ボタンタグなど）](https://www.amazon.co.jp/Sony-MESH-%E3%80%8C%E3%83%9C%E3%82%BF%E3%83%B3%E3%80%8D%E3%80%8CLED%E3%80%8D%E3%80%8C%E5%8B%95%E3%81%8D%E3%80%8D-3%E3%82%BF%E3%82%B0%E3%82%BB%E3%83%83%E3%83%88-MESH-100B3A/dp/B0154FZFBE/ref=pd_sbs_21_5?_encoding=UTF8&pd_rd_i=B0154FZFBE&pd_rd_r=89a8cc92-9ab1-11e8-933f-d59ca44f18d4&pd_rd_w=CAqbo&pd_rd_wg=0HI7t&pf_rd_i=desktop-dp-sims&pf_rd_m=AN1VRQENFRJN5&pf_rd_p=5805929820760247504&pf_rd_r=K37XK6VWM71VSHZ6XZN7&pf_rd_s=desktop-dp-sims&pf_rd_t=40701&psc=1&refRID=K37XK6VWM71VSHZ6XZN7)

それではステップ・バイ・ステップで見ていきましょう。
## 1. ラズパイ準備、MESH Hubのインストール

今回はラズパイ3を使いました。ロボット組み込みの為、小さいZeroを使ってやってみたのですが、カメラ、モーター、Google APIなど盛りだくさんなので、なかなかパフォーマンスが出ませんでした。

実はこのラズパイのセットアップ、MESH Hubのインストールはこちらのサイトで詳細に説明しています。
- [ラズパイのセットアップ（Google AIY付き）](https://deviceplus.jp/hobby/entry_y11/)
- [MESH Hubアプリのインストール](https://deviceplus.jp/hobby/mesh-09/)
基本的なセットアップはこれらを見て、済ませておいて下さい。

## 2. MESH SDKとBottleによるMESHカスタム・ファンクションの追加

次にラズパイの中で動くプログラムと、MESH Hubを連動させる仕組みを作ります。
それにはMESH SDKのカスタム・ファンクションを作ります。
[MESH SDKへのリンク](https://meshprj.com/sdk-jp/)
### MESH SDKでのファンクションの作り方
#### MESH SDK(Web)作業：
ここでラズパイのローカルプログラムをキックする簡単なカスタムファンクションを作ります。こちらにJSON形式のプログラムもあるので、それをインポートすると簡単に作れます。
[MESH SDK localファンクション JSON](https://github.com/ktrips/mesh/blob/master/meshlocal.json)
![sdk1.JPG](https://qiita-image-store.s3.amazonaws.com/0/212060/17b85a05-13cd-84ff-2e6c-cbf1096cd951.jpeg)![sdk2.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/e6b5244d-3817-9ad7-7497-fc9c819399c8.jpeg)

MESHファンクションが出来たので、この図のように指定したパスの機能を呼び出せるように、ラズパイにBottleというPythonベースのウェブサーバーを立ち上げます。/camera/faceなどのラズパイ内で動くプログラムは次の#4で書いていきます。
![raspimesh.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/995a8c36-3dc9-0d8b-5498-c1295d6b998f.jpeg)

### Bottleのインストール
#### ラズパイ側作業：
こちらのコマンドで、Bottleを入れます。
またmeshなどのプログラムフォルダーを作っておきます。

```python:command.line
$ pip3 install bottle
$ sudo mkdir mesh
$ cd mesh
```

そしてここに、サーバー機能となるPythonプログラムを作ります。ここでは[小林さんのQiita記事](https://qiita.com/mayfair/items/b5eb60f8356ffcb5e002)を大変参考にさせてもらいました。こちらはサンプルプログラムserver.pyの一部です。

```python:server.py
from bottle import route, run, template
@route('/stopwatch/<command>')
def stopwatch(command):
    if command == 'start':
        # /stopwatch/startに対応する処理
    elif command == 'lap':
        # /stopwatch/lapに対応する処理
    elif command == 'stop':
        # /stopwatch/stopに対応する処理
run(host='localhost', port=8080)
```

ラズパイ内のプログラムをキックできるサーバーを作ったところで、MESHアプリのレシピから動くか確かめてみます。
#### MESHアプリ作業：
まずMESHアプリから、“Add a new hub”を選び、ラズパイ側のMESH Hubを設定します。
![mesh_app1.png](https://qiita-image-store.s3.amazonaws.com/0/212060/1bd5f876-9bd2-4498-dd23-af6fe07dc85f.png)

アプリからMESH Hubにつなぐ事ができたら、これまで通りタグをペアリングさせたり、一通りの動作をする事ができます。
![mesh_app2.png](https://qiita-image-store.s3.amazonaws.com/0/212060/2a9f5f92-ad04-049d-dcc4-6312a15aa187.png)

 
次にIFTTTの設定を行います。MESHアプリ上で自分のIFTTTアカウントつなげるようにしておきます。
![IFTTT1.png](https://qiita-image-store.s3.amazonaws.com/0/212060/bdfeed26-baee-2aeb-7f92-5c17d535d41b.png)

その後、先ほどのLocalファンクションをカスタムタグから呼び出します。
![IFTTT2.png](https://qiita-image-store.s3.amazonaws.com/0/212060/f7bc2630-0059-a7ca-103e-b9e0adb326c7.png)

これで後は、server.pyをラズパイ側で流しておいて、IFTTT経由（Button Widgetなどで）でラズパイの機能を実行する事ができるようになります。

## 3. ラズパイでのGoogle AIY、Assistant、Translate、Visionなどの導入

せっかくラズパイを使っているので、カメラをつなげて画像認識したり、OK Googleなどのおしゃべり機能を付けたいですよね！？

### Google AIY/Assistantのセットアップ
Googleから会話機能のAssistantのSDKが出ていますが、より簡単なGoogle AIYという工作キットのラズパイ・イメージが配布されています。
もう既に#1で導入しているとは思いますが、こちらでGoogle AIY込みのラズパイになっているはずです。
- [ラズパイのセットアップ（Google AIY付き）](https://deviceplus.jp/hobby/entry_y11/)

この時点でhotwordコマンドなどでOK Googleができるようになります。（↑記事にしたがってマイクやスピーカーなどの設定をして下さい。project_idやmodel_idは各自のものを使用してくださいね。）
`$ ./bin/AIY-projects-shell.sh`
`$ googlesamples-assistant-hotword –project_id aiy-prj –device_model_id aiy-prj-device1`

また日本語発話機能のAquesTalkをダウンロードしておきます。
`$ wget https://www.a-quest.com/archive/package/aquestalkpi-20130827.tgz`
`$ tar xzvf aquestalkpi-*.tgz`

### Google Visionのセットアップ
カメラを付けた画像解析のために、Google Visionを導入します。これにより顔解析や文字検出が出来るようになります。
`$ sudo nano ~/.bashrc`
`(.bashrcの中程に) GOOGLE_APPLICATION_CREDENTIALS="/home/pi/visionxxx.json`
`$ echo $GOOGLE_APPLICATION_CREDENTIALS`

画像解析結果は英語（文字検出以外）で返ってくるのでそれを日本語にするGoogle Translateも入れておきます。
`$ pip install --upgrade oauth2client`
`$ pip install --upgrade google-cloud-translate`

ここでは[MESH Github](https://github.com/ktrips/mesh)の中のvisiontalk.pyというプログラムで、笑顔検出や文字読み取りを行っています。

## 4. MESHアプリからラズパイ機能を呼び出す

ではやっとMESH SDKとラズパイのPythonプログラムがそろったので、それをMESHアプリでつなげていきます。
先ほどから何度も出ているように、MESHアプリ上では、SDKで作ったLocalファンクションに/camera/faceのようにコマンドを指定するだけで、既に作ったプログラムをアプリ上から簡単に呼び出せるようにしています。
![raspimesh.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/995a8c36-3dc9-0d8b-5498-c1295d6b998f.jpeg)

実際のGoogle APIなどを実行するプログラムはmesh_func.pyになります。
[MESH Github](https://github.com/ktrips/mesh)

これらを使ってMESHアプリで、ロボットの動きを設定していきます。


## 5. ロボットの外形作り、モーターとの連動
ここまで来てやっと、ロボットとして二足歩行するようにする部分になりました。
ボディにはタミヤの工作フレームとモーターを使いました。
頭部分に、パイカメラとスピーカー、マイクは下から出しています。
モーターにモータードライバーをセットします。
モーターには単三電池で電源供給しています。
かなりグロテスクですが、このようになりました。
![IMG_4587.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/6bb8952a-423d-6e53-ea53-66b2cb6ddf6d.jpeg)

モーターを動かすプログラムは、[MESH Github](https://github.com/ktrips/mesh)のmotor.pyになっています。

## 6. 全部組み合わせて、AppleWatchで操作
最後に中身の上にペーパークラフトなどで外見を付け（この時は、Maker FaireのマスコットMakeyくんにしています）、ロボットっぽくします。
![IMG_4591.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/2f916c7e-4e12-48ec-c5de-4d41e2fc83b7.jpeg)

またApple Watchから操れるようにIFTTTを設定します。


これでなんとなく完成！もう一つ、ベイマックスくんも作って、対決させるのも面白いですね！
![IMG_4639.jpg](https://qiita-image-store.s3.amazonaws.com/0/212060/51940493-8075-9e81-f007-21960b201c17.jpeg)

こちらが動いている動画になります。
[![MESH Robot](http://img.youtube.com/vi/Ywu2-DPss64/0.jpg)](http://www.youtube.com/watch?v=Ywu2-DPss64)

いかがだったでしょうか？ここまで読んで、なぜMESHを使って？？という疑問が湧く方もいるかもしれませんが、ロボットを動かすトリガー（ボタンや動きタグなど）として簡単に使えるのと、ラズパイ内の動きを変えるのにアプリの簡易なインターフェースでその場で変えれるのが魅力だと思います。
全体ではおそらく1万円くらい（MESH、AppleWatch含まず）で作れるのではないかと思います。

以上、ラズパイとGoogleとAppleWatch、そしてMESHで作ったロボットでした！
その他のMESHで作った便利グッズなどはこちらの[MESHBOOK](http://ktri.ps/MESHBOOKj)でずらずらと並べています。そちらも見てみてください！！