ディープラーニングの眼を持ったロボットを、LEGOとM5StickVでサクッと作ろう！（機能概要編）

# 機能概要

深層学習による物体認識能力を持ったLEGOロボットを簡単に作れる仕組みを開発してみました。

例えば、今回開発した仕組みを使えば、次の動画のようにBB-8の姿を認識したら一回転するロボットが、**たった1枚**の写真撮影と実質的に**3ステップ**のプログラムで作れてしまいます。驚異的な簡単さです。

**BB-8を認識したら顔真似しつつ一回転（YouTube動画）:**
[![BB-8認識ムービー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/2c626742-b8ce-3aea-008d-0803dfb93b5c.jpeg)](https://www.youtube.com/watch?v=Yie-T35wHJU)

## 仕組みの特徴

1. **LEGO + AIカメラ**: 仕組みは、一言で言えば、ロボティクスキットである[LEGO Mindstorms](https://www.lego.com/ja-jp/product/robot-inventor-51515)や[LEGO Spike Prime](https://education.lego.com/ja-jp/products/-spike-/45678#spikeプライム)から、[AIカメラ M5StickV](https://www.switch-science.com/catalog/6651/)の物体認識機能を利用できるようにしたものです。

2. **複数種類の物体を認識可能**: もちろん、物体は複数種類を認識できます（最大約200種類、デフォルト設定では10種類）。
例えば、AIカメラで顔を認識したら笑顔になり、BB-8の姿を認識したら一回転し、鳥の姿を認識したら羽ばたくロボットが下図の短いScratchコードで書けてしまいます。やることの複雑さに対して、たったのこれだけです。
<img width="700" alt="code.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/50e10b7d-80f5-8c87-0ab5-81a1b4c88072.png">

3. **標準開発環境が利用可能**: ロボットのプログラミングに特殊なアプリは不要で、標準開発環境である[LEGO Mindstormsアプリ](https://apps.apple.com/jp/app/lego-mindstorms-inventor/id1515448947)や[LEGO Spike Primeアプリ](https://apps.apple.com/jp/app/spike-lego-education/id1469183033)（言語はScratchまたはPython）で開発できるのも（特に教育での利用上）大事なポイントです。

4. **エッジ推論可能**: 更に、動作にはパソコンやiPad等を必要とせず、デバイスのみで深層ニューラルネットワークの推論が高速で行われます（[M5StickV](https://www.switch-science.com/catalog/6651/)のエッジ推論用チップのお陰）。すごい世の中です。

それでは、この仕組みの利用にあたっての準備と使い方を順に説明していきます。
仕組みの詳細は次回解説します（近日公開予定）。


# 前提知識・スキル

時間の都合で、インターネットで検索すれば比較的容易に情報を入手できる下記事項は既知のものとさせてください。

1. [LEGO Mindstorms 51515 Robot Inventor](https://www.lego.com/ja-jp/product/robot-inventor-51515)か[LEGO Spike Prime](https://education.lego.com/ja-jp/products/-spike-/45678#spikeプライム)の基礎知識（各パーツの使い方や基本的なプログラミング）
    - [LEGO Mindstorms 51515 Robot Inventor](https://www.lego.com/ja-jp/product/robot-inventor-51515)は11/23日現在、日本では発売されていませんが、海外では発売されています。頭脳部分であるハブやセンサーのハードウェアは[LEGO Spike Prime](https://education.lego.com/ja-jp/products/-spike-/45678#spikeプライム)と同一です（ハブのファームウェアは少し違います）。
    - [LEGO Spike Prime](https://education.lego.com/ja-jp/products/-spike-/45678#spikeプライム)は[代理店](https://education.lego.com/ja-jp/shop/find-distributor)から購入できます。私は[アフレルさん](https://spike.afrel.co.jp)から購入しました（モーターの初期不良にすぐご対応いただき感謝）。
2. [M5StickV](https://www.switch-science.com/catalog/6651/)の基礎知識を持ち、自身でトラブルシュートできる
3. 電子工作スキル（はんだ付け、テスターの利用ができる）


# 免責事項

著者は本記事を掲載するにあたって、その内容、機能等について細心の注意を払っておりますが、内容が正確であるかどうか、安全なものであるか等について保証をするものではなく、何らの責任を負うものではありません。
本記事内容のご利用により、万一、ご利用者様に何らかの不都合や損害が発生したとしても、著者や著者の所属組織（日鉄ソリューションズ株式会社（NSSOL））は何らの責任を負うものではありません。
本工作によりメーカー保証を受けられなくなったり、電子工作に失敗するとデバイスを壊してしまう可能性があります。その可能性を十分に理解した上で本記事の情報を利用してください。


# 準備（電子工作）

[LEGO Mindstorms](https://www.lego.com/ja-jp/product/robot-inventor-51515)等と[M5StickV](https://www.switch-science.com/catalog/6651/)がシリアル通信するためのケーブルを作り、M5StickVにAIカメラ・アプリケーションをインストールします。

※Mindstorms 51515のファームウェア 10.0.3（2020年12月26日時点の最新バージョン）で動作確認済みです。

**完成図**:
<img width="500" alt="pin-converter.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/6caf67df-3307-a87b-5227-237d46fdea13.jpeg">


## 必要なもの

* 電子工作の道具（はんだごてや導通テスターなど基本的なもの）
* T6トルクスドライバー
* [LEGO 距離センサー 45604](https://education.lego.com/ja-jp/products/-spike-/45604)（[LEGO Mindstorms](https://www.lego.com/ja-jp/product/robot-inventor-51515)や[LEGO Spike Prime](https://education.lego.com/ja-jp/products/-spike-/45678#spikeプライム)に同梱されています）
* 1.27mmピッチピンヘッダを2.54mmピッチピンヘッダに変換する基盤等（次のどちらか一つ）
    * [Breadboard Connector Kit for SPIKE Prime Ultrasonic sensor cable](http://www.mindsensors.com/spike-prime/218-breadboard-connector-kit-for-spike-prime-ultrasonic-sensor-cable)（おすすめ。以下このキットを用いて説明します）
    * または、[1.27mmピッチを2.54mmピッチに変換する基盤](https://akizukidenshi.com/catalog/g/gP-07380/)と[1.27mmピッチピンヘッダ](https://akizukidenshi.com/catalog/g/gC-03865/)と[2.54mmピッチピンヘッダ](https://akizukidenshi.com/catalog/g/gC-00167/)
* [GROVE - 4ピン-ジャンパメスケーブル](https://www.switch-science.com/catalog/1048/)
* M5StickVで利用できるSDカード（※重要: 笹尾先生による[動作確認済みSDカード情報](https://docs.google.com/spreadsheets/d/10Vv8ZQkbXX59aT_GkoolTMHf83zroIT21uNjvQMaGng/edit#gid=0)）


## 電子工作の3ステップ

1. パンダみたいな見た目をした[LEGO 距離センサー 45604](https://education.lego.com/ja-jp/products/-spike-/45604)の裏側にあるネジをT6トルクスドライバーを使って緩め、パンダ側を取り外します。すると、下図のように1.27mmピッチのコネクタが見えてきます。
今回はLEGO MindstormsのハブとM5StickVをシリアル通信させるためにこのRx/Tx/GNDを使用します（**3V3は使いません**）。
<img width="500" alt="ultrasonic-sensor.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/be2e9fbe-fa95-b202-c97f-5561b114bc3d.jpeg">

2. 下図のように1.27mmピッチピンヘッダを2.54mmピッチピンヘッダに変換する基盤を組み立てます（はんだ付けするだけですので詳細省略）。オスからオスへの変換になるようにしてください。
**※隣のピン等へのショートが起きないよう、はんだ付けと導通テストを十分に注意して行いましょう。もし、ショートが起きたら最悪LEGO MindstormsハブやM5StickVを破壊してしまう危険性があります。**
<img width="500" alt="pitch-converter.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/2ed5693f-2a4b-1924-319c-2db47bd09ff0.jpeg">

3. 下図のように、1で開封した距離センサーの1.27ピッチコネクタに2の変換基盤の1.27ピッチヘッダピンを差し込みます（**※差し込むピンの位置がずれないよう注意**）。GROVEケーブルをM5StickVにしっかり差し込み、反対側の黄色を変換基盤のRXに、白をTXに、黒をGndに差し込みます（**※赤（5V）はハブに接続しません**）。電子工作はこれで完成です。
<img width="500" alt="pin-converter.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/6caf67df-3307-a87b-5227-237d46fdea13.jpeg">

## AIカメラ・アプリケーション cheese のインストール

最後にもうひと作業です。次のリンク先ZIPファイルを解凍し、そのフォルダの**中身**（boot.py等全てのファイルとフォルダ）をSDカードの直下にコピーします。

* [AIカメラ・アプリケーション cheese（ZIP）](https://github.com/sonoisa/cheese/archive/main.zip)

電源が切られたM5StickVにそのSDカードを挿し込みます。
M5StickVの電源を入れたときに数秒して次の画面が表示されたらインストール成功です。画面が表示されたら電源を切ってください。
![startup.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/a4ec0cc7-bc51-2a13-5b8f-42a8556e0539.jpeg)


# 使い方

M5StickVとLEGO Mindstormsのハブを繋ぐケーブルができたら、認識したい物体を撮影すれば、物体認識を行えるようになります。
ここでは最初に説明した、AIカメラで顔を認識したら笑顔になり、BB-8の姿を認識したら一回転し、鳥の姿を認識したら羽ばたくロボットを例にしながら説明します。
なお、以下の説明で使うボタンの位置は下図のとおりです。
<img width="500" alt="pitch-converter.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/65edd6de-59fb-c311-4ca9-ac26344f3772.jpeg">


## 認識したい物体の撮影

以下のステップで認識したい物体の写真を1種類につき1枚撮影します。最大約200種類、デフォルト設定では10種類、撮影できます。プログラミングは不要です。

1. Bボタンをずっと押したまま電源を入れます（数秒間押しっぱなしにしていてください）。次の画面が出てくるまで押したままにしてください。起動画面に似ていますが、別の次の画面です。
![camera.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/e81ddd9b-8b2a-2cc1-c0e8-37e5ee0a653e.jpeg)

2. Bボタンを押し、認識する物体のID（クラス）を選択します。デフォルトでは10種類（IDが1から10）選択できます。プログラミングの時に使うので、どのクラスIDで何を認識させるのかメモしておいてください。
<img width="500" alt="select-class.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/d6de25b8-b9f6-dbcb-a5c7-326e2c1e855e.png">

3. Aボタンを押して、そのクラスとして認識させたい画像を**1枚**撮影します。何度でも撮り直しできます（各クラスの最新の一枚のみSDカードに上書き保存されます）。
<img width="500" alt="take-a-picture.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/ef6309b5-00ec-0350-d89a-47db735ec6f7.jpeg">
実際に撮影された画像はSDカードのimagesフォルダの中に保存されます。画像ファイル名は、クラスID.jpgです（サイズは224x224です）。不要なものがあれば画像ファイルを削除できます。
<img width="224" alt="BB-8.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/e4982db7-d0b9-ebd1-979f-d41349c0a070.jpeg">

4. 2と3の作業を認識させたいクラス分だけ繰り返します。撮影が終わったら電源を切ります。
最初の例だと、クラスID 1で人の顔、クラスID 9でBB-8の姿、クラスID 10で鳥（ファンタスティックビーストのサンダーバード）の姿を撮影しています。

5. 必要に応じて物体認識のテストを実行します。Aボタンをずっと押しながら電源を入れます（数秒間押しっぱなしにしていてください）。撮影した物体の写真がそのクラスIDと共に紙芝居のようにカタカタ表示された後、テストモードに入ります。テストモードでは物体が認識されたらそのクラスIDが上部に表示されます。期待通りの物体認識ができているかテストし、必要に応じて再撮影やクラスの追加を行ってください。
<img width="500" alt="select-class.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/d6de25b8-b9f6-dbcb-a5c7-326e2c1e855e.png">


## 物体認識の実行

さて、本番です。物体認識を行うプログラムを作り、実行します。

1. 物体認識を行うプログラムの開発は非常に簡単です。iPad等の[LEGO Mindstormsアプリ](https://apps.apple.com/jp/app/lego-mindstorms-inventor/id1515448947)や[LEGO Spike Primeアプリ](https://apps.apple.com/jp/app/spike-lego-education/id1469183033)を使ってプログラミングします。
AIカメラセンサーは距離センサーのふりをして動作します。つまり、物体が認識されたら、あたかもそのクラスIDの距離（センチメール）にモノがあるかのようにセンサーが働きます。例えば、BB-8（クラスIDが9）が認識されたら、距離センサーが9cmにモノがあるという反応をします。
今回の例である、顔（クラスIDが1）を認識したら笑顔になり、BB-8（クラスIDが9）を認識したら顔真似しながら一回転し、サンダーバード（クラスIDが10）を認識したら顔真似しながら羽ばたくプログラムは下図のように書けます。普通のプログラムと違うポイントは水色の距離センサーのところだけです。cmの数値をクラスID（1や9や10）にしているだけです。ただそれだけです。簡単ですね。
なお、下図のプログラムでは、ポートEにM5StickVに繋がるケーブルを、ハブのポートDに足回りのモーターを、ポートBとFに腕のモーターを繋いでいるとしています。
<img width="700" alt="code.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/50e10b7d-80f5-8c87-0ab5-81a1b4c88072.png">

2. いつものLEGO Mindstormsプログラミングと同じく、LEGO Mindstorms等の電源を入れ、iPad等と接続し、プログラミングを書き込みます。

3. LEGO Mindstorms等の電源が入っている状態でM5StickVの電源を入れます。数秒〜十秒程度、M5StickVのディスプレイに"Connecting to LPF2 Hub..."という表示が出て、その表示が消えてディスプレイにカメラが捉える画像が表示され始めたら、LEGO Mindstormsハブへの接続が成功です。もし、ハブへの接続が成功しない場合は、M5StickVの電源をオフ/オンしてください。

4. これで準備完了。プログラムを実行すればOKです。例えば、次のムービーのように顔認識してみたり、BB-8やサンダーバードの認識を試してみてください。
**顔認識をしたら笑顔を返す（YouTube動画）**:
[![顔認識ムービー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/ff10281f-e232-2874-02ba-a9f84db6e260.jpeg)](https://www.youtube.com/watch?v=qp2Q1Rkzbyo)
**BB-8を認識したら顔真似しつつ一回転（YouTube動画）**:
[![BB-8認識ムービー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/2c626742-b8ce-3aea-008d-0803dfb93b5c.jpeg)](https://www.youtube.com/watch?v=Yie-T35wHJU)
**サンダーバードを認識したら顔真似しつつ羽ばたく（YouTube動画）**:
[![サンダーバード認識ムービー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/613490fd-ed6f-e4b2-a3ba-bb56467dd027.jpeg)](https://www.youtube.com/watch?v=v0COY-wwlcA)

5. 好きなだけ改造してみましょう。迷路の中に隠した物を発見するロボットを作ったり、冷蔵庫のプリンの盗み食いを発見して教えてくれるロボットを作ったり、ジャンケン勝負してくれるロボットを作ったり、物を仕分けるロボットを作ったり、猫と遊ぶロボットを作ったり、頑張ればサッカーボールを追いかけてゴールにシュートするロボットだって作れるかもしれません。


# まとめと今後の展望

LEGO MindstormsとAIカメラ M5StickVを連携させることで、深層学習の眼を持ったロボットをサクッと簡単に作る方法を説明しました。

今回は仕組みを使うための準備と使い方の説明まで行いました。
次回は、AIカメラのプログラムの中身について解説していきます。LEGO Mindstorms等のハブとM5StickVのシリアル通信、[笹尾先生の物体認識アプリBrownie](https://github.com/ksasao/brownie)を少し改造した物体認識について解説する予定です。

また、今回はLEGO MindstormsやLEGO Spike Primeのハブと接続できるようにしましたが、もっと安価な[LEGO Boost](https://www.lego.com/ja-jp/product/boost-creative-toolbox-17101)も同種の通信プロトコルを用いて通信できるので、[LEGO Boost](https://www.lego.com/ja-jp/product/boost-creative-toolbox-17101)版も近々公開する予定です。
他にもマイク入りの[M5StickC](https://docs.m5stack.com/#/ja/core/m5stickc)や[M5Atom](https://m5stack.com/collections/m5-atom)を繋いで音声認識をしたり、深層学習は使わないけれどもM5StickVのカメラをOpenCV的な画像認識に使ったりすることも考えています。
こんなことが簡単に実現できるなんて、本当、いい世の中になりましたねぇ。

（仕組み解説編へ、つづく・・・）