iotedge-scott-or-notを動かす
//Build 2018のVision Keynoteで、Custom VisionをRaspberry Piで動かしてScottかどうかを判定するデモ、Scott or notのソースが公開されていたので動かしてみたところ、いくつかハマり所があったので書いておきます。
デモのソース
デモのソースはgithubにアップされています。
modules
配下にあるAzureFunctionContainer
、CustomVisionContainer
、StartupContainer
の3つが、IoT Edgeで動かすモジュールです。それぞれのフォルダにDockerイメージを作るためのDockerfile
とAzureIoTEdge拡張が使用するmodule.json
があります。
templates
配下には、AzureIoTEdge拡張が使用するRaspberry Pi用とWindows用のdeployment.template.json
があります。
[RasPi] IoT Edgeの準備
ハードウェアは、Raspberry Pi 3 BにSense HATとカメラモジュールV2です。
ディスプレイは必須ではありませんが、カメラが撮影した画像が確認できるので、接続しておいたほうが良いです。
OSは、8GBのマイクロSDに2018-04-18-raspbian-stretch-lite.imgを書き込みます。ついでに、boot配下にsshファイルを作っておくと、sshが有効になるので少し便利です。
raspi-configを起動して、カメラとI2Cを有効化、カメラのパッケージをインストールして再起動します。
$ sudo raspi-config 5 Interfacing Options -> P1 Camera 5 Interfacing Options -> P5 I2C
そして、こちらの記事のStep 2からStep 5を実施します。
必要に応じて、Azure Container Registryの認証情報を設定しておきましよう。
$ sudo iotedgectl login --address decodecr.azurecr.io --username decodecr --password (password)
★追加作業
RTIMULibをホストに入れておかないと後々でエラーになるので、pipでインストールします。モジュールからファイル名指定で参照するので、バージョンを指定するようにしましょう。
$ sudo pip install RTIMULib==7.2.1b1
[PC] 開発環境の準備
わたしの開発環境は、すでに諸々インストールされているので確認できませんが、たぶん下記をインストールすればOKです。
- Visual Studio Code
- Azure IoT Edge extension for Visual Studio Code
- Docker
あと、githubからソースをクローンする場合は、Git for Windowsも必要です。(zip形式でダウンロード、解凍する場合は不要です。)
gitコマンドでソースを開発環境にクローンします。
C:\Users\takashi\Desktop>git clone https://github.com/Azure-Samples/iotedge-scott-or-not.git Cloning into 'iotedge-scott-or-not'... remote: Counting objects: 65, done. remote: Total 65 (delta 0), reused 0 (delta 0), pack-reused 65 Unpacking objects: 100% (65/65), done.
★追加作業
StartupContainer
モジュールの/usr/lib/python2.7/dist-packages
参照がさまざまな問題を引き起こします。(ImportError: No module named requests等)
問題を回避するために、createOptions
を下記に変更しておきましょう。
"createOptions": "{\"Env\": [\"DEVICE=RPI\", \"AZURE_ML_HOSTNAME=CustomVisionContainer\"],\"HostConfig\": { \"Binds\": [\"/home/pi/image:/home/pi/image\", \"/dev:/dev\", \"/usr/local/lib/python2.7/dist-packages/RTIMU.so:/usr/local/lib/python2.7/dist-packages/RTIMU.so\", \"/usr/local/lib/python2.7/dist-packages/RTIMULib-7.2.1b1.dist-info:/usr/local/lib/python2.7/dist-packages/RTIMULib-7.2.1b1.dist-info\" ], \"Privileged\": true, \"PortBindings\":{\"8082/tcp\":[{\"HostPort\":\"8082\"}]}}}"
[PC] モジュールのDockerイメージをアップロード
templates\raspberry pi\deployment.template.json
をルートフォルダにコピーします。
C:\Users\takashi\Desktop>cd iotedge-scott-or-not C:\Users\takashi\Desktop\iotedge-scott-or-not>copy "templates\raspberry pi\deployment.template.json" . 1 個のファイルをコピーしました。
modules\AzureFunctionContainer\module.json
、modules\CustomVisionContainer\module.json
、modules\StartupContainer\module.json
内の[registry]
を、Azure Container Registryのログインサーバー名に変更します。
AzureFunctionContainer
には、Logic Appの呼び出しコードが含まれています。Logic Appを用意するのが手間なので、この部分をコメントにします。
ルートフォルダにあるdeployment.template.json
を右クリックしてBuild IoT Edge Solution
を選択すると、Dockerイメージを作成、Azure Container Registryにアップロードします。
[PC] IoT Edgeにモジュールを追加
IoT HubのIoT Edgeを設定して、モジュールのダウンロード、実行を指示します。
これらは、開発環境のVisual Studio Codeから設定することができます。
ルートフォルダにあるdeployment.template.json
を右クリックしてGenerate IoT Edge Deployment Manifest
を選択します。すると、config\deployment.json
というファイルが作成されます。
config\deployment.json
を右クリックしてCreate Deployment for IoT Edge Device
を選択、一覧表示されたIoT Edgeから設定先を選択すると、IoT HubのIoT Edgeにモジュールのダウンロード、実行が指示されます。
[RasPi] IoT Edgeを起動
$ sudo iotedgectl start
感想
- IoT Edge extension for Visual Studio Code、まぁ便利。
- とはいえ、このExtensionを過信してはいけない。(Arm/x64問題勃発)
- RasPiのDockerイメージをWindows x64で作成しようとする行為が問題を増している。(RasPiで作成するなら、DockerイメージにRTIMULibを加えるだけなのに...)