LEGO Mindstorms×AI　機械学習その1　環境構築編

本記事の内容はベータ公開としているので内容が変更される場合があります。

---

本記事では、教育版 LEGO® MINDSTORMS EV3(以降EV3)上で動作するOSのev3devの開発環境を構築する手順をまとめる。
また次回以降2回に渡ってEV3をPythonを用いて制御し、線形回帰と分類の問題を解決する内容の記事を投稿していく。  

EV3×Pyrhon　機械学習その1　環境構築編：本記事
EV3×Pyrhon　機械学習その2　線形回帰編：[こちら](https://qiita.com/Hiroki-Fujimoto/items/6dae8c407e56a38625cf)
EV3×Pyrhon　機械学習その3　分類編：[こちら](https://qiita.com/Hiroki-Fujimoto/items/f4ff6e68455152c54bc4)

※EV3はレゴブロックとモーターやセンサーをあわせて組み立てたロボットを、プログラムせ自由に制御することができる製品である。詳しくは以下を参照。
[教育版レゴ® マインドストーム® EV3製品詳細](https://afrel.co.jp/product/ev3-introduction)

## 事前学習教材
本記事の内容ではHalloworld的な内容をEV3と連携させて行うが以下の書籍にて
Pythonを使ったEV3の基本的な制御等について網羅されている。
[ロボットではじめるAI入門](https://ai.afrel.co.jp/pythonai/)

今回は上記書籍の環境より利便性が高く簡単に実行できる環境を構築していく。

上記書籍の内容との関係は以下のようになる。(NEWと記載している部分が本記事と次回以降の内容になる)

~~~
・概要
・PC,EV3のセットアップ　⬅　NEW
・プログラム作成方法　⬅　NEW
・モーター,センサーの利用
・ライントレース制御
・ライントレースフィードバック
・線形回帰　⬅　NEW
・分類　⬅　NEW
~~~



# 本記事内で構築する環境  
* PC
Windows10
Python 3.7.3
開発環境 VisualStudioCode  

* EV3
python-ev3dev2(以降ev3dev)  

## 目次
1. EV3の環境構築
2. EV3とPCのBluetoothペアリング
3. PCの環境構築
4. サンプルプログラム作成・転送・実行
5. Appendix


## EV3の環境構築
今回利用するEV3のOSであるev3dev環境をマイクロSDカード(以降SDカード)に構築していく。通常のファームウェアと違いC++やPythonでのモーターやセンサーの制御が可能になる。  

### イメージファイル書き込みツールのインストール
PCからSDカードにOSのイメージファイルを書き込むためにEtcherというソフトウェアをインストールする。
https://www.balena.io/etcher/

URLにアクセスすると以下のような画面になるので、PCの環境にあわせてセットアップファイルをダウンロードし実行、インストールを行う。
<img width="600" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/f7af61d4-cbf5-0091-c9d5-000cd2c31716.png">


インストール完了後自動でEtcherが立ち上がる。
<img width="600" alt="1-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/fd8621b0-9077-a0a2-332c-4e53e4e2be42.png">

立ち上がらない、もしくは閉じてしまった場合などは検索で`balenaEtcher`と検索することで出てくる。
<img width="200" alt="1-2-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/93a7ac1f-42b5-5fbe-0c1a-9f8d5f12a741.png">

### ev3dev イメージファイルのダウンロード  
SDカードに書き込むイメージファイルを以下からダウンロードし、Zipファイルを解凍する。
https://www.ev3dev.org/downloads/
<img width="600" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/41407da4-f547-f903-a747-d3adfe36cd0b.png">
「Download ev3dev-stretch for EV3」を選択することでダウンロード可能。

ダウンロードしたZipファイルを解凍したらEtcherから操作を行う。マイクロSDカードはこの時点でPCに挿入しておく。
Etcherから「Flash from file」を選択し、解凍したフォルダ内にある「ev3dev-strech-ev3-generic-~~~~-~~.img」を選択する。
<img width="500" alt="1-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/9eae3428-8298-bd79-300e-8a17e07e1535.png">
<img width="500" alt=1-3".png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/79a6a983-f973-be0c-433d-82357af9d5c8.png">

Etcher内にて「Select target」が選べるようになるので選択する。
<img width="500" alt="1-4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/b3f40813-8dd7-3fb9-ceac-286e3cafd153.png">

Select targetのウィンドウが開くので、挿入されているSDカードにチェックをいれ「Select(1)」を選択する。
<img width="500" alt="1-5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/a7de5c71-3d78-178c-235a-a492bb97c5cf.png">

「Flash!」を選択し、イメージファイルの書き込みを開始する。
<img width="500" alt="1-6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/f735a2e3-7bbc-4324-b196-e0dd0a640937.png">

### EV3の起動
書き込みが完了したら、SDカードをEV3のインテリジェントブロック側面の差込口に挿入し、中央ボタンを押下し起動する。
<img width="400" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/5e9c04ea-8b4d-3d17-1e2c-532091e9d623.png">

EV3の画面は以下のようになれば、EV3のOSの準備は完了である。
<img width="200" alt="3-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/15b866bf-ce07-72ea-707a-b665860eb345.png">

## PCとEV3のBluetooth接続
EV3の環境構築が完了したら、PCとEV3をBluetoothでペアリングさせる。  

### ペアリング
まずはEV3側で操作を行う。
ev3devのメニューから「Wireless and Networks」をインテリジェントブロックの上下ボタンと中央ボタンを用いて選択する。
<img width="200" alt="N1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/08929eac-a730-d1bb-a17e-aacc5951ba96.png">


続いて「Bluetooth」を選択。
<img width="200" alt="N2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/6680a8dd-c24c-c128-508d-4244395f08e1.png">


次の画面にて「Powered」を選択してチェックを入れ、「Start Scan」を選択する。(「Start Scan」を選択すると選択肢が「Stop Scan」に変わる。)
<img width="200" alt="N3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/14bd1004-1ae5-05f2-dba9-59a4de4d4dc7.png">


「Start Scan」を選択し、しばらく待つと付近のペアリング可能な端末名が下に検出される。その中からペアリングしたいPC名を選択する。
<img width="200" alt="N4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/0918659b-e87b-5e93-3439-a02264889267.png">

PC名を選択後「Pair」を選択しペアリングを開始する。
「Pair」を選択するとPC側の画面右下に「デバイスの追加」の通知が表示されるのでクリックする。
<img width="200" alt="N5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/3c89e4ca-db57-981c-97c8-149d03f26e9d.png">　　　　　　　　　<img width="400" alt="N5-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/30b3e250-cf8a-a25c-89ef-5450f004d0d6.png">

続いてEV3とPCの両方の端末でpasskeyの確認が行われる。 
EV3側では「Accept」、PC側では「はい」を選択する。
<img width="200" alt="N6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/692bc61c-e069-faf8-143d-36d20af88640.png">　　　　　　　　　<img width="400" alt="N6-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/a821d951-91d4-ff29-a01a-7c568f81cad8.png">

passkeyの確認ができるとEV3側の画面が以下のようになるので、「Network Connection」を選択する。
<img width="200" alt="N7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/493b511a-b03b-3627-9085-6e703dad97a8.png">

以下のような画面になるので、「Connect」を選択する。
<img width="200" alt="N8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/95a03fcc-0730-4bd5-ef6c-bf4499609f02.png">
※「Connect」を選択すると「State：」の箇所が「Configuring」となる。この間EV3でペアリングするための設定が行われているため、EV3では操作は行わないよう注意する。  
ただし、以下のように「Timeout was reached」と表示された場合は中央ボタンを一度押して表示を消す。「Timeout was reached」と表示されても設定は継続中なので「State：」が「Connected」に変わるまでは操作は行わないよう注意する。
<img width="200" alt="N9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/3e235ee7-6572-180c-a25a-685afa823cdd.png">　　　　　　<img width="200" alt="N10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/9db60e7e-dc17-6b6a-8903-40e2779a9dcd.png">

ペアリングが完了すると以下のように「State：」が「Connected」になる。
<img width="200" alt="N11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/f17214c4-4ba7-7b3f-9a37-ed5965ffa5bb.png">
以上でペアリング作業は終了。  

## PCの環境構築  
EV3とPCのペアリングが完了したところで、PCのの環境構築に入る。(実際ペアリングはPCの環境構築後でもよいが、手順がいったりきたりしてしまうためこの順番で実施している。)  

### Pythonのダウンロード  
以下からPythonをダウンロードし、PCにインストールする。
最新のPythonは避け、一つ前のバージョンあたりのインストールをおすすめする。(3.5~3.8)
本記事の環境では3.7.3を利用している。
https://www.python.org/downloads/  

<img width="600" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/2a05b6f7-0878-11a0-4082-3e54f27f864b.png">

利用する環境にあわせてインストーラーをダウンロード・実行しPythonをインストールする。
<img width="800" alt="5-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/03ab6b6b-37f5-4f6d-b6fa-c85b79a05607.png">

どのPythonのバージョンでも同様にインストール時、以下のチェックボックスには必ずチェックを入れる。
<img width="500" alt=".png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/03f5452c-98aa-6dda-34d0-eea4a45d7d98.png">


### Visual Studio Codeのダウンロード  
以下から環境に合わせてVisual Studio Code(以降VSCode)をダウンロード・インストールする。
https://code.visualstudio.com/download
<img width="600" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/847aee10-c033-5461-1013-0a1dfde15202.png">


インストーラーの手順に従ってインストールを行う。特筆すべきことはないので割愛する。
インストールが完了し、VSCodeが起動すると以下のような画面が表示される。
<img width="800" alt="6-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/b50a869c-f6e3-a5b3-deb9-430c9d6bde84.png">


### VSCodeの拡張機能をインストール  
VSCodeが起動したら、画面左のタブから「拡張機能」のマークを選択し、検索欄にて「ev3dev」と入力する。  
検索結果から「ev3dev-browser」を選択する。 
<img width="400" alt="6-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/3883ef15-3328-8f31-e3f8-9b89d283a454.png">

「インストール」をクリックし、拡張機能をインストールする。
<img width="700" alt="6-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/5b4c5a34-de3b-016d-671c-5a8a33635da9.png">

これでEV3、PC共に基本的な環境構築が完了した。  

## サンプルプログラム作成・転送・実行
それでは環境構築が完了しているかの確認も含め、簡単なサンプルプログラムをVSCode上で作成し、EV3に転送・実行してみる。  


### ワークスペースの作成  
EV3にはワークスペースごと転送するので、まずは作業フォルダを作成する。  
VSCodeの上部タブ「ファイル」から「フォルダーを開く」を選択する。
<img width="300" alt="7-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/7c3d0f58-b87d-bda9-5994-d4f4c741ce1c.png">

エクスプローラーが開くので、適当な場所にフォルダを作成する。今回は「ev3workspace」という名前のフォルダを作成している。
<img width="550" alt=".png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/d4ab844b-913d-f107-eefe-ca613a927324.png">
作成したフォルダを選択し「フォルダーの選択」をクリックする。
<img width="500" alt=".png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/a140ebad-46bc-003d-ed75-c46b04039844.png">


VSCodeでフォルダーを開くと「エクスプローラー」の欄に開いているフォルダー名が表示されるようになる。
また、前述の拡張機能「ev3dev-browser」をインストールしていると、フォルダー名の下に「EV3DEV DEVICE BROWSER」が表示される。
<img width="500" alt="7-4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/9d8a801b-a6cf-2f8f-bdce-af2aeb859e11.png">


### プログラムの作成
作成したワークスペースにPythonプログラムを作成する。
「エクスプローラー」の追加したワークスペース名の右にある「新しいファイル」を選択する。
<img width="300" alt="9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/bca091a4-7140-844a-8b30-ef469e5665f1.png">

ファイルの名前を入力することでファイルが作成される。
今回は「hello-ev3.py」とする。
<img width="700" alt="9-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/4631195f-d31d-1c0b-c9da-704ed316586a.png">

hello-ev3.pyの中身を以下のように編集する。

~~~ hello-ev3.py
from ev3dev2.display import Display
import ev3dev2.fonts as fonts
import time

screen = Display()
font = fonts.load('luBS12')
screen.draw.text((10, 10), 'Hello EV3!', font=font)
screen.update()
time.sleep(3.0)

print('Hello World')
~~~  

VSCode上では以下のような感じになる。
<img width="800" alt="9-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/1b7014c6-7948-93ae-ec0c-97ac19a1064a.png">

### VSCode上からEV3へアクセス    
ここからはインストールした拡張機能「ev3dev-browser」を利用してVSCodeからEV3にアクセスする。
「エクスプローラー」の欄から「EV3DEV DEVICE BROWSER」を展開し「Click here to connnect to a device」を選択する。  

すると、画面上部にコマンドパレットが表示される。
その一覧にPCとBluetooth接続されているEV3が「ev3dev Bluetoothネットワーク接続」と表示されるので選択する。(ちなみにBluetoothではなくEV3とPCをUSB接続していると「ev3dev イーサネット~」と表示される。)
<img width="800" alt="8-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/80838953-0800-1a50-6882-01ac2e7484de.png">

VSCode上からEV3へのアクセスが完了すると以下のように緑色の丸が表示される。
<img width="500" alt="8-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/3858096d-09d8-60c5-2bd0-f8dc32bc905e.png">

### プログラムの転送・実行  
EV3にアクセスできたので、作成したプログラムを転送し実行してみる。  

まずは「EV3DEV DEVICE BROWSER」の右にある「Send workspace to device」をクリックし、ワークスペースである「ev3workspace」を転送する。
<img width="500" alt="9-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/b9973642-8902-149a-2997-a964eb8d75c4.png">

転送が完了するとVSCode右下に「Download to ev3dev complete」と表示され、「/home/robot/」の下に「ev3workspace」がコピーされる。  
<img width="900" alt="9-4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/f4ac8cf5-744c-0570-7c67-f6ddabba4b95.png">

次にターミナルよりプログラムを実行してみる。
緑の丸が表示されている「ev3dev」の欄を右クリックし、表示されたメニューより「Open SSH Terminal」を選択する。
<img width="500" alt="10-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/ee6867b9-309d-1bcb-4def-9a970957fb4d.png">

VSCode下部にEV3にSSHログインしているターミナルが表示され、コマンドベースで操作可能になるので、以下のコマンドを入力する。
`ls`
`cd ev3workspace/`
`python3 hello-ev3.py`

プログラムを実行すると、EV3側の画面に3秒間以下のように文字が表示され、その後ターミナルに「Hello World」と表示される。
<img width="200" alt="10-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/9cd2560c-972f-d91e-5309-2a4560ff5a0d.png">
<img width="800" alt="10-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/78e1ab26-e1a8-29c6-373a-05a6ec919e1f.png">


これでVSCodeからev3dev環境のEV3を制御する環境が整った。
次回からはPC側とEV3側でそれぞれプログラムを実行して、データをやり取りし線形回帰や分類の機械学習課題を扱っていく。  

## Appendix  
VSCode上でev3devのライブラリを利用したプログラムを作成する際に、インテリセンスが働いて赤波線が表示されてしまうことがある。  
プログラム作成上は問題ないが、ev3devを含めた自動校正を利用したい場合は以下のようにPCにev3devをインストールすることで利用できる。  

Windowsマークを右クリックし「Windows PowerShell(管理者)」を選択し、Powershellを開く。（管理者権限を利用して開く必要がある。）
<img width="300" alt="99-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/c32136f0-f567-5c55-acc8-ca2e98ee4b92.png">

Powershellにて以下のコマンドを入力しev3devをインストールする。  
`pip install python-ev3dev2`
<img width="800" alt="99-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/0a0d30b4-11f9-315e-bba2-c4772359b0c0.png">