iotedge-scott-or-notを動かす

//Build 2018のVision Keynoteで、Custom VisionRaspberry Piで動かしてScottかどうかを判定するデモ、Scott or notのソースが公開されていたので動かしてみたところ、いくつかハマり所があったので書いておきます。

youtu.be

デモのソース

デモのソースはgithubにアップされています。

github.com

modules配下にあるAzureFunctionContainerCustomVisionContainerStartupContainerの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を実施します。

matsujirushi.hatenablog.jp

必要に応じて、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です。

あと、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.jsonmodules\CustomVisionContainer\module.jsonmodules\StartupContainer\module.json内の[registry]を、Azure Container Registryのログインサーバー名に変更します。

f:id:matsujirushix:20180525224043p:plain

AzureFunctionContainerには、Logic Appの呼び出しコードが含まれています。Logic Appを用意するのが手間なので、この部分をコメントにします。

f:id:matsujirushix:20180525224951p:plain

ルートフォルダにあるdeployment.template.jsonを右クリックしてBuild IoT Edge Solutionを選択すると、Dockerイメージを作成、Azure Container Registryにアップロードします。

f:id:matsujirushix:20180525224523p:plain

[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にモジュールのダウンロード、実行が指示されます。

f:id:matsujirushix:20180525225731p:plain

[RasPi] IoT Edgeを起動

$ sudo iotedgectl start

感想

  • IoT Edge extension for Visual Studio Code、まぁ便利。
  • とはいえ、このExtensionを過信してはいけない。(Arm/x64問題勃発)
  • RasPiのDockerイメージをWindows x64で作成しようとする行為が問題を増している。(RasPiで作成するなら、DockerイメージにRTIMULibを加えるだけなのに...)