【中級者向け】M5Stack UnitV2のOpenCVバージョンを上げる手順

 初心者向けではありません。C++でOpenCVが使えて、Linuxの知識もある方向けです。UnitV2のアプリを開発したい場合に利用します。M5StackUnitV2を使い始めたのですが、色々試行錯誤しているうちに辿り着いてしまいました。手順が複雑なので備忘録としてまとめておきます。2021/10/25時点での手順ですので、変わっている可能性もあるので最新情報は確認するようにしてください。(間違っている点がありましたら、メールやコメントでご連絡いただけると幸いです。)

 コマンドを間違えるとUnitV2が起動しなくなるリスクもあります。その点は保証できませんので予めご了承くださいm(_ _)m

 もくじ(Index)

M5Stack関連の目次へ戻る

環境

下記の環境でクロスコンパイルを行いました。

  • VMWare上のUbuntu20.04
  • VSCode+Remote Development
  • Docker 20.10.9
  • OpenCV 4.5.4
  • UnitV2Frameworkはししかわさんのリポジトリのものを利用しています。
    インストール方法は変わる可能性があるので最新はREADME.mdを参照するようにしてください。

参考リンク

VSCodeで環境をビルドする

①リポジトリからgit clone

 ししかわさんのリポジトリを元にフォークしOpenCVのバージョンが4.5.4になるように変更しました。

git clone https://github.com/mongonta0716/UnitV2Framework-docker.git
cd UnitV2Framework-docker

②Dockerfileの書き換え(自分のリポジトリで修正しました。)

 Dockerfileの27行目にbgsegmを追加します。

RUN cmake -B build/arm -DCMAKE_TOOLCHAIN_FILE=./platforms/linux/arm-gnueabi.toolchain.cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules/ -DBUILD_LIST=bgsegm,tracking,imgcodecs,videoio,highgui,features2d,ml,xfeatures2d -DCMAKE_BUILD_TYPE=Release . \

③VSCodeでフォルダを開く

 git cloneしたフォルダをVSCodeで開き、ReOpenするとDockerイメージのビルドが始まります。(Core i7 4770の環境で30~1時間程度)

④framework.cppの書き換え(自分のリポジトリでは修正しました。)

 2021/10/25現在、camera_streamをビルドすると実行時にエラーが出ます。src/framework.cppの下記3行をコメントアウトします。

https://github.com/meganetaaan/UnitV2Framework/commit/012da4c41c68a232f385618cf5f283a72a4d1114#diff-f9045d849b05acdb6bb63188e6ba8380eb6f69f6d33b18af4e23c59b5a48bb2c

⑤camera_streamのビルド(任意)

 環境が整っているかどうか確認するためにcamera_streamをビルドします。VSCodeのメニューから「ターミナル」→「新しいターミナル」を開きます。

 開いたら、ターミナル上で下記のコマンドを実行します。bin/camera_streamがビルドされていれば成功です。

cmake -B build/arm -DOPENCV_DIR=/external/opencv/build/arm/ -DCMAKE_TOOLCHAIN_FILE=./platforms/arm.toolchain.cmake -DTARGET=camera_stream .
cmake --build build/arm

⑥OpenCVの圧縮ファイルを作成

 UnitV2のOpenCV環境は4.4.0なので、OpenCVの関連ファイルも転送する必要があります。私は下記の手順でUnitV2用の圧縮ファイルを作成しました。(opencv.tar.gz)

cd /external/opencv/install/arm
tar -zcvf /workspaces/UnitV2Framework-docker/opencv.tar.gz bin include lib share

UnitV2側の作業

 tarファイルをscpで転送して解凍するだけなので分かる方は読み飛ばしてください。

①sudoを利用できるようにする。

 notebook modeにしてターミナルから下記のコマンドを実行してsudoを利用可能にしておきます。

 詳細な手順は下記の記事が詳しいです。

M5Stack UnitV2を弄るための備忘録 (zenn.dev)

②scp可能にする

 起動時は権限が無いのでscpで転送しようとするとPermission Deniedのエラーがでます。sshでUnitV2に接続し、下記のコマンドを実行します。

sudo chmod 666 /dev/null

③scpでPC側から圧縮ファイルとcamera_streamを転送

 PC側で作業します。(※ここで/home/m5stackに権限がないという場合はファームウェアが古いためです。UnitV2側でchmod 777 /home/m5stackを実行するか新しいファームウェアにアップデートしましょう。)

cd ~/UnitV2Framework-docker
scp ./opencv.tar.gz m5stack@10.254.239.1:/home/m5stack
scp bin/camera_stream m5stack@10.254.239.1:/home/m5stack

④opencv.tar.gzの解凍

 UnitV2へssh接続し、下記のようにコマンドを実行して/に解凍します。

ssh m5stack@10.254.239.1
sudo cp opencv.tar.gz /
cd /
sudo zcat opencv.tar.gz | sudo tar -xvf -

⑤camera_streamの入れ替え

 camera_streamの実行ファイルは/home/m5stack/payload/binに置きます。念のため元のファイルはバックアップを取りましょう。

cd /home/m5stack
sudo mv payload/bin/camera_stream camera_stream.bak
sudo mv camera_stream payload/bin

⑥UnitV2の再起動

 UnitV2側でsudo rebootして再起動します。

実行

 ブラウザを開いてcamera_streamを実行して白黒表示になっていればOKです。

【失敗したとき】UnitV2を元に戻す(自分で作成したファイルは全部消えます。) 

 下記のファームウェアアップデートの手順で元に戻すことができます。

  1. M5UnitV2RootfsRecoveryPackage-09072021.zipをダウンロードし、解凍
  2. 解凍したフォルダにあるM5UnitV2UpdPackage.imgをmicroSDのルートにコピー
  3. microSDをUnitV2にセットし、上部にあるボタンを押しながら電源に接続する。
  4. LEDが赤色に点灯したらボタンを離す。
  5. 更新中は赤色LEDが点灯します。(4,5分かかる。)LEDが消えたら再度電源を接続しなおして元に戻っているか確認してください。

https://docs.m5stack.com/en/quick_start/unitv2/update

【付録】OpenCV 4.4.0のままビルドしたい場合【未保証】

 OpenCVをバージョンアップする必要が無い場合はDockerfileを下記のように変更すると動くかもしれません。(動作検証してないので未保証です。。。)

# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.177.0/containers/cpp/.devcontainer/base.Dockerfile

# [Choice] Debian / Ubuntu version: debian-10, debian-9, ubuntu-20.04, ubuntu-18.04
ARG VARIANT="ubuntu-20.04"
FROM mcr.microsoft.com/vscode/devcontainers/cpp:0-${VARIANT}

# [Optional] Uncomment this section to install additional packages.
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
    && apt-get -y install --no-install-recommends \
    gcc-arm-linux-gnueabihf \
    g++-arm-linux-gnueabihf \
    && apt-get clean && rm -rf /var/lib/opt/lists/*

WORKDIR /external
RUN wget https://github.com/opencv/opencv/archive/refs/tags/4.4.0.tar.gz \
    && mkdir opencv \
    && tar -xvf 4.4.0.tar.gz --strip-components 1 -C opencv \
#    && cd .. \
    && rm 4.4.0.tar.gz \
    && wget https://github.com/opencv/opencv_contrib/archive/refs/tags/4.4.0.tar.gz \
    && mkdir opencv_contrib \
    && tar -xvf 4.4.0.tar.gz --strip-components 1 -C opencv_contrib \
#    && cd .. \
    && rm 4.4.0.tar.gz \
    && git clone --depth 1 https://github.com/Tencent/ncnn.git \
    && wget https://jaist.dl.sourceforge.net/project/zbar/zbar/0.10/zbar-0.10.tar.bz2 \
    && tar -jxvf zbar-0.10.tar.bz2 \
    && rm zbar-0.10.tar.bz2
# RUN wget "https://developer.arm.com/-/media/Files/downloads/gnu-a/10.2-2020.11/binrel/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz?revision=d0b90559-3960-4e4b-9297-7ddbc3e52783&la=en&hash=985078B758BC782BC338DB947347107FBCF8EF6B"
# RUN tar -xvf ./* -C /usr/local \
#     && ls -l && rm ./*

# Build OpenCV with extra modules
WORKDIR /external/opencv/platforms/linux/
RUN mkdir build \
    && cd build \
    && cmake -DOPENCV_ARCH=ARM -DCMAKE_TOOLCHAIN_FILE=../arm-gnueabi.toolchain.cmake -DOPENCV_EXTRA_MODULES_PATH=../../../../opencv_contrib/modules/  -DBUILD_LIST=tracking,imgcodecs,videoio,highgui,features2d,ml,xfeatures2d -DCMAKE_BUILD_TYPE=Release ../../.. \
    && make \
    && make install

WORKDIR /external/ncnn
RUN mkdir build \
    && cd build \
    && cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/arm-linux-gnueabihf.toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=OFF -DNCNN_BUILD_EXAMPLES=ON .. \
    && make \
    && make install

WORKDIR /external/zbar-0.10
RUN env NM=nm CFLAGS="" ./configure --prefix=$(pwd)/build --host=arm-none-linux-gnueabihf --build=x86_64-linux --enable-shared --without-gtk --without-python --without-qt --without-imagemagick --disable-video CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ \
    && make \
    && make install

おわりに

 UnitV2はここまでしなくても、十分使える機能が揃っていますが今回は音声認識の機能を試したくなったのでアプリのビルド環境を整える必要がありました。あまり情報がないのでUnitV2使っていない方もいるかと思いますが、頑張って使っていきましょう。

 普通(?)の使い方もそのうち記事にしたいと思っています。

更新履歴

  • 2021/10/25  新規作成(初出後、19:00頃手順を自分のリポジトリで行うように修正しました。)

コメントを残す

メールアドレスが公開されることはありません。