Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Docker環境は、AdamAppSDKがインストールされたUbuntu上に構築します。

チュートリアルでのインストール対象OS
  • Ubuntu SDK v1.71以前:Ubuntu 18.04.2 LTS (bionic)

  • SDK v1.80以降:Ubuntu 22.04.3 LTS (Jammy Jellyfish)

あらかじめAdamAppSDK開発環境を構築してください。(本チュートリアルでは省略します)

Info

SDK ver.1.80以降にて、既にAdamAppSDK開発環境を構築されている場合、重複して実施している手順があります。実施不要な箇所は適宜省略して作業してください。
また、AdamAppSDK開発環境を構築した際に.devcontainer/Dockerfileを用いて作成したDockerイメージと本章で説明しているDockerイメージは異なるDockerイメージですので注意ください。

また、apt-getコマンドなどを使ってソフトのインストールを行いますので、apt-getが可能なインターネット接続と、インストールが可能な権限(root権限など)設定も実施しておいてください。

...

Code Block
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common \
    qemu-user-static

リポジトリを追加する(apt-keyコマンドを利用する場合)

Note

apt-key コマンドは廃止時期は未定ですが廃止予定となっております。後述のapt-keyコマンドを利用しない方法をお試しください。リポジトリ追加方法は1つの例ですので、代替方法は各自でご検討ください。

Docker社提供のUbuntu用aptリポジトリをシステムに追加します。

Docker社オフィシャルPGPキーをシステムに追加します。

Code Block
languagebash
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK
Note
apt-key コマンドは廃止予定となっております。廃止時期は未定ですが代替方法は各自でご検討ください。
Info

インターネット接続にプロキシサーバが必要な場合は、-xオプションを使用します。

(プロキシサーバのURLやポート番号は、使用するプロキシサーバに即したものへと変更してください。)

$ curl -x http://proxy.example.com:8080/ -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

PGPキーを追加したら、fingerprintがこのようになっているか確認してください。

Code Block
languagebash
$ sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown ] Docker Release (CE deb) docker@docker.com
sub   rsa4096 2017-02-22 [S]

次に、Docker公式aptリポジトリをシステムに追加します。

Code Block
languagebash
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Info

インターネット接続にプロキシサーバが必要な場合は、環境変数”http_proxy”と”https_proxy”を以下のように追加してください。

(プロキシサーバのURLやポート番号は、使用するプロキシサーバに即したものへと変更してください。)

$ sudo http_proxy=http://proxy.example.com:8080 https_proxy=https://proxy.example.com:8080 add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

aptリポジトリを追加したら、/etc/apt/sources.listにリポジトリが追加されていることを確認してください。

Code Block
languagebash
$ cat /etc/apt/sources.list
(省略)
deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable
# deb-src [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable

...

リポジトリを追加する(apt-keyコマンドを利用しない場合)

Note

apt-key コマンドは廃止予定となっておりますので、代替方法の例を示しています。代替方法は各自で検討ください。コマンドは廃止予定となっておりますので、代替方法の例を示しています。代替方法は各自で検討ください。また、既にapt-keyコマンドを利用した環境でDockerイメージを作成している場合はDockerコンテナから作成をやり直さないと正常に動作しない可能性があります。ご注意ください。

Docker社提供のUbuntu用aptリポジトリをシステムに追加します。

...

Code Block
languagebash
$ cd ${SDK_DIR}/external/build/sample/docker/
$ docker build -t compile/ubuntu-rel:0.1 .
Info

エラーが出るなどして失敗した場合、下記を実施ください。
qemuインストール方法 - Technology Partner - Confluence (atlassian.net)エラーが出るなどして失敗した場合、後述のqemuインストールを実施ください。

作成が完了したら、compile/ubuntu-relというリポジトリが作成されていることを確認してください。

...

Note

Dockerfileが存在するディレクトリに、以下の2ファイルが存在することを確認してください。

  • exec_entry.sh

  • qemu-aarch64-static

これらのファイルはPythonモジュール作成時に必要であるため、削除しないでください。

Pythonモジュールをコンパイルする(Numpy, OpenCV)

手順

AdamApp用Pythonモジュールは、以下の手順で作成します。

  1. ${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリにソースファイルを配置する。

  2. ${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.sh にコンパイル手順を記載する。

  3. dockerを実行し、コンパイルを行う。

  4. ${SDK_DIR}/external/build/sample/docker/docker_volume/install_pathディレクトリに作成されたモジュールが配置される。

チュートリアルとして、NumPyとOpenCVのコンパイルを実施します。

Note

VirtualBox環境の場合、共有フォルダ上で作業するとコンパイルに失敗します。
Ubuntu上にフォルダを作成・移動したうえで作業してください。

ソースコードをダウンロードする

NumpyとOpenCVのソースコードを以下URLからダウンロードしてください。

このチュートリアルでは、Numpy 1.19.4、OpenCV 3.4.7を使用します。

ダウンロードするバージョンは、使用する機能に合わせて選択してください。

Numpy 1.19.4:

https://github.com/numpy/numpy/archive/v1.19.4.tar.gz

OpenCV 3.4.7:

https://github.com/opencv/opencv/archive/3.4.7.zip

...

qemuインストール

コンテナ版追加アプリを作成するために、開発環境にインストールする必要のある、qemuのインストール方法を記載します。Dockerイメージの作成が完了している場合はqemuのインストールは不要ですので、次の章に進んでください。

Info

PCを再起動すると、build可能なアーキテクチャにlinux/arm64が表示されなくなる場合があります。その際は、再度同じ手順でqemuをインストールしてください。

qemuのインストール

Code Block
sudo apt update
sudo apt-get install qemu binfmt-support qemu-user-static # Install the qemu packages
sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # This step will execute the registering scripts

 

docker buildxの準備

  • experimental 機能や BuildKit を使うため、環境変数を追加設定 & 反映 します。

  • 設定ファイルを開く

    Code Block
    vi ~/.bashrc
  • 以下を末尾に追加

    Code Block
    export DOCKER_CLI_EXPERIMENTAL=enabled
    export DOCKER_BUILDKIT=1

    保存

  • buildxが使えるようになっているか確認。

    Code Block
    docker --help | grep buildx

    出力例

    Code Block
      buildx*     Docker Buildx (Docker Inc., v0.10.5)

     

  • 現在build可能なアーキテクチャを確認。

    Code Block
    docker buildx ls

    出力例

    Code Block
    NAME/NODE DRIVER/ENDPOINT STATUS  BUILDKIT                              PLATFORMS
    default * docker
      default default         running v0.11.7-0.20230525183624-798ad6b0ce9f linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/amd64/v4, linux/386, linux/arm64, linux/riscv64, linux/ppc64, linux/ppc64le, linux/s390x, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6

    この出力の中に linux/arm64 があれば成功です。

Pythonモジュールをコンパイルする(Numpy, OpenCV)

...

手順

AdamApp用Pythonモジュールは、以下の手順で作成します。

  1. ${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリにソースファイルを配置する。

  2. ${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.sh にコンパイル手順を記載する。

  3. dockerを実行し、コンパイルを行う。

  4. ${SDK_DIR}/external/build/sample/docker/docker_volume/install_pathディレクトリに作成されたモジュールが配置される。

チュートリアルとして、NumPyとOpenCVのコンパイルを実施します。

Note

VirtualBox環境の場合、共有フォルダ上で作業するとコンパイルに失敗します。
Ubuntu上にフォルダを作成・移動したうえで作業してください。

ソースコードをダウンロードする

NumpyとOpenCVのソースコードを以下URLからダウンロードしてください。

このチュートリアルでは、Numpy 1.19.4、OpenCV 3.4.7を使用します。

ダウンロードするバージョンは、使用する機能に合わせて選択してください。

Numpy 1.19.4:

https://github.com/numpy/numpy/archive/v1.19.4.tar.gz

OpenCV 3.4.7:

https://github.com/opencv/opencv/archive/3.4.7.zip

ダウンロードしたファイルは、${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリに配置してください。

コンパイル手順ファイルを更新する

${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.shファイルに、コンパイル手順を記載します。

Info

コンパイル手順を更新するときは、以下にご注意ください。

  • dockerを実行した際、${SDK_DIR}/external/build/sample/docker/docker_volumeが/home/dockerとしてmountされます。

  • ソースファイルやコンパイルディレクトリも/home/dockerに配置されます。

  • コンパイル済みモジュールは/home/docker/install_pathにインストールするようにしてください。

  • OpenCVのコンパイルには、NumPyモジュールが必要になります。

サンプルスクリプトとして、NumpyとOpenCVをコンパイルするためのmodule_compile.shを用意しています。

チュートリアルではmodule_compile.shを変更せずに進めます。

コンパイルする

Dockerを用いてNumPyモジュールとOpenCVモジュールをコンパイルします。

${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。

Code Block
$ docker run --rm -it --name aarch64-ubuntu -v `pwd`/docker_volume:/home/docker compile/ubuntu-rel:0.1

external/build/sample/docker/docker_volume/install_pathにコンパイル済みモジュールが作成されます。

Info
  • OpenCVのコンパイルには時間がかかるため、しばらく待ちます。

  • SDK V1.70以前でコンパイルエラーが発生した場合は「はじめに」項で記載しているexternal/build/sample/docker/Dockerfileを修正していることを確認してください。修正できていない場合はDockerイメージの作成からやりなおしてください。

AdamAppに配置する

作成されたモジュールを、AdamAppで使用できるように配置します。

チュートリアルでは${SDK_DIR}/src/adamapp-py/jpeg_appを例とします。

Numpyを配置する

NumPyモジュールは以下のディレクトリにインストールされています。

${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/site-packages/numpy-1.19.4-py3.7-linux-aarch64.egg/numpy

ディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。

${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages

Code Block
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/site-packages/numpy-1.19.4-py3.7-linux-aarch64.egg/numpy ${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages

コピー後のディレクトリ構成は以下のようになります。

${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages/numpy

OpenCVを配置する

OpenCV Python用モジュールは以下のディレクトリにインストールされています。

${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/dist-packages/cv2

ディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。

${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages

Code Block
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/dist-packages/cv2 ${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages

コピー後のディレクトリ構成は以下のようになります。

${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages/cv2

OpenCVは、Python用モジュールだけではなくOpenCVライブラリも必要となるため、あわせて配置します。

OpenCVライブラリは以下のディレクトリにインストールされています。

${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib

libopencv_world.so.3.4.7を以下のディレクトリにコピーしてください。

Info

externalフォルダ以降は手動で作製ください。

例)${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/

Code Block
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/libopencv_world.so.3.4.7 ${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu

コピーしたら、シンボリックリンクを作成してください。

Code Block
languagebash
$ cd ${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/
$ ln -s libopencv_world.so.3.4.7 libopencv_world.so.3.4
$ ln -s libopencv_world.so.3.4 libopencv_world.so

不要なファイルを削除する

AdamAppでは、Pythonキャッシュファイル(__pycache__)は使用しません。

容量削減のため削除することをお勧めします。

Code Block
languagebash
$ cd ${SDK_DIR}/src/adamapp-py/jpeg_app/python/site-packages/
$ find . -name *pycache* -print | xargs rm -rf

また、作成されたOpenCVライブラリには、ライブラリのデバッグに使用するための情報が含まれています。

アプリケーション実行時には使用しないため、容量削減のためデバッグ情報を削除することをお勧めします。

Code Block
languagebash
$ cd ${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/
$ aarch64-linux-gnu-strip --strip-debug libopencv_world.so.3.4.7

サンプルアプリをビルドする

サンプルアプリ「jpeg_app」をビルドして、カメラにインストールします(例:下記画像の緑枠からインストール可能)。

ビルド方法は各SDKバージョンに応じて実施ください。

アプリ画面を開いて(下記画像の赤枠ボタン)、カメラが撮影したjpeg画像が表示されていれば成功です。

...

Pythonモジュールをコンパイルする(SQLite)

...

NumpyとOpenCVのコンパイルを実施することができました。

次のチュートリアルとして、SQLiteのコンパイルを実施します。

ソースコードをダウンロードする

sqliteとPythonのソースコードを以下URLからダウンロードしてください。

このチュートリアルでは、sqlite 3.40.0、Python 3.7.9 を使用します。

ダウンロードするバージョンは、使用する機能に合わせて選択してください。

sqlite 3.40.0

https://www.sqlite.org/2022/sqlite-autoconf-3400000.tar.gz

Python 3.7.9

https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz

ダウンロードしたファイルは、${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリに配置してください。

コンパイル手順ファイルを更新する

${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.shファイルに、コンパイル手順を記載します。

下記の内容をコピーしてください。

Code Block
#!/bin/sh -x

HOME_PATH=/home/docker

LIB_INSTALL_DIR=${HOME_PATH}/install_path

SQLITE_ARCHIVES=sqlite-autoconf-3400000.tar.gz
SQLITE_DIR=sqlite-autoconf-3400000
SQLITE_BUILD_DIR=sqlite-autoconf-3400000/build

PYTHONPATH=$PYTHONPATH:${NUMPY_SITE_PACKAGES}
export PYTHONPATH

PYTHON_ARCHIVES=Python-3.7.9.tgz
PYTHON_DIR=Python-3.7.9

## for sqlite
cd ${HOME_PATH}
tar zxf ${SQLITE_ARCHIVES}
mkdir -p ${SQLITE_BUILD_DIR}
cd ${SQLITE_DIR}
./configure --prefix=${LIB_INSTALL_DIR}
make
make install

## for python
cd ${HOME_PATH}
tar zxf ${PYTHON_ARCHIVES}
cd ${PYTHON_DIR}
./configure --prefix=${LIB_INSTALL_DIR}
make
make install

コンパイルする

Dockerを用いてsqliteモジュールとPythonモジュールをコンパイルします。

${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。

Code Block
$ docker run --rm -it --name aarch64-ubuntu -v `pwd`/docker_volume:/home/docker compile/ubuntu-rel:0.1

${SDK_DIR}/external/build/sample/docker/docker_volume/install_pathにコンパイル済みモジュールが作成されます。

AdamAppに配置する

作成されたモジュールを、AdamAppで使用できるように配置します。

チュートリアルではsrc/adamapp-py/sqlite_appを例とします。

Note

sqlite_app の動作にはSDカードが必要です。SDカードを挿入できるカメラのみ確認可能です。
また、カメラのファームウェアによってはext4でフォーマットしたSDカードでないと動作しない可能性があります。

SQLiteを配置する

sqliteライブラリは以下のディレクトリにインストールされています。

${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib

libsqlite3.so
libsqlite3.so.0
libsqlite3.so.0.8.6
libsqlite3.la
libsqlite3.a

上記5ファイルを、AdamAppソースディレクトリにコピーしてください。

${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu

Code Block
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/libsqlite3.so ${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/libsqlite3.so.0 ${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/libsqlite3.so.0.8.6 ${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/libsqlite3.la ${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker

...

コンパイル手順ファイルを更新する

_volume/install_path/lib/libsqlite3.a ${SDK_DIR}/src/adamapp-py/sqlite_app/external/

...

Info

コンパイル手順を更新するときは、以下にご注意ください。

dockerを実行した際、$
lib/aarch64-linux-gnu

コピー後のディレクトリ構成は以下のようになります。

${SDK_DIR}/

...

src/

...

ソースファイルやコンパイルディレクトリも/home/dockerに配置されます。

...

コンパイル済みモジュールは/home/docker/install_pathにインストールするようにしてください。

...

OpenCVのコンパイルには、NumPyモジュールが必要になります。

サンプルスクリプトとして、NumpyとOpenCVをコンパイルするためのmodule_compile.shを用意しています。

チュートリアルではmodule_compile.shを変更せずに進めます。

コンパイルする

...

adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.so
${SDK_DIR}/src/adamapp-py/sqlite_app/external/

...

Code Block
$ docker run --rm -it --name aarch64-ubuntu -v `pwd`/docker_volume:/home/docker compile/ubuntu-rel:0.1

external/build/sample/docker/docker_volume/install_pathにコンパイル済みモジュールが作成されます。

Info
  • OpenCVのコンパイルには時間がかかるため、しばらく待ちます。

  • SDK V1.70以前でコンパイルエラーが発生した場合は「はじめに」項で記載しているexternal/build/sample/docker/Dockerfileを修正していることを確認してください。修正できていない場合はDockerイメージの作成からやりなおしてください。

AdamAppに配置する

作成されたモジュールを、AdamAppで使用できるように配置します。

...

lib/aarch64-linux-gnu/libsqlite3.so.0
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.so.0.8.6
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.la
${SDK_DIR}/src/adamapp-py/

...

Numpyを配置する

...

sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.a

Python用sqliteを配置する

Python用sqliteモジュールは以下のディレクトリにインストールされています。

${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/site-packages/numpy-1.19.4-py3.7-linux-aarch64.egg/numpysqlite3

ディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。

${SDK_DIR}/src/adamapp-py/jpegsqlite_app/python/site-packages

Code Block
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/site-packages/numpy-1.19.4-py3.7-linux-aarch64.egg/numpysqlite3 ${SDK_DIR}/src/adamapp-py/jpegsqlite_app/python/site-packages

...

${SDK_DIR}/src/adamapp-py/jpegsqlite_app/python/site-packages/numpysqlite3

...

Python用sqliteは、モジュールだけではなくライブラリも必要となるため、あわせて配置します。

OpenCV Python用モジュールは以下のディレクトリにインストールされています。Python用sqliteライブラリは以下のディレクトリにインストールされています。

${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/distlib-packages/cv2

...

dynload

_sqlite3.cpython-37m-aarch64-linux-gnu.soを以下のディレクトリにコピーしてください。

${SDK_DIR}/src/adamapp-py/jpegsqlite_app/python/site-packages/sqlite3

Code Block
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/distlib-packages/cv2dynload/_sqlite3.cpython-37m-aarch64-linux-gnu.so ${SDK_DIR}/src/adamapp-py/jpegsqlite_app/python/site-packages/sqlite3

コピー後のディレクトリ構成は以下のようになります。

${SDK_DIR}/src/adamapp-py/jpegsqlite_app/python/site-packages/cv2

OpenCVは、Python用モジュールだけではなくOpenCVライブラリも必要となるため、あわせて配置します。

OpenCVライブラリは以下のディレクトリにインストールされています。

${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib

libopencv_world.so.3.4.7を以下のディレクトリにコピーしてください。

Info

externalフォルダ以降は手動で作製ください。

例)$sqlite3/_sqlite3.cpython-37m-aarch64-linux-gnu.so

次に、import時にPython用sqliteライブラリを読み込めるよう、dbapi2.pyを修正します。

${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/

Code Block
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/libopencv_world.so.3.4.7 ${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu

コピーしたら、シンボリックリンクを作成してください。

Code Block
languagebash
$ cd ${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/
$ ln -s libopencv_world.so.3.4.7 libopencv_world.so.3.4
$ ln -s libopencv_world.so.3.4 libopencv_world.so

不要なファイルを削除する

AdamAppでは、Pythonキャッシュファイル(__pycache__)は使用しません。

容量削減のため削除することをお勧めします。

...

languagebash

...

sqlite_app/python/site-packages/sqlite3/dbapi2.py

下記の通りに修正します。

修正前)from _sqlite3 import *

修正後)from sqlite3._sqlite3 import *

サンプルアプリをビルドする

サンプルアプリをビルドする前に、下記の画面にてSDカードをフォーマットします。(フォーマットしてよいSDカードか事前に確認ください、SDカードのデータは全て消去されます。)
フォーマットが完了したら、SDカードをext(ext4)フォーマットにしてSetボタンを押下します。

...

サンプルアプリ「sqlite_app」をビルドして、カメラにインストールします。

ビルド方法は各SDKバージョンに応じて実施ください。

アプリ画面を開いて、下記の画面が表示されていれば成功です。

...

Pythonモジュールをコンパイルする(Pycurl)

SQLiteのコンパイルを実施できました。

次のチュートリアルとして、Pycurlのコンパイルを実施します。

ソースコードをダウンロードする

PyCurlとOpenSSLのソースコードを以下URLからダウンロードしてください。

このチュートリアルでは、pycurl 7.45.2、OpenSSL 1.1.1 を使用します。

ダウンロードするバージョンは、使用する機能に合わせて選択してください。

pycurl 7.45.2

https://files.pythonhosted.org/packages/a8/af/24d3acfa76b867dbd8f1166853c18eefc890fc5da03a48672b38ea77ddae/pycurl-7.45.2.tar.gz

OpenSSL 1.1.1

https://github.com/openssl/openssl/archive/OpenSSL_1_1_1i.tar.gz

ダウンロードしたファイルは、${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリに配置してください。

Info

SoCがambaCV5Xのカメラファームv3.10以前の場合はカメラ内のOpenSSL 1.1.1を利用するため、OpenSSLを配置しなくても動作します。カメラファームのv3.20以降はOpenSSL 3.0.12にアップデートされているためOpenSSLをアプリに配置するか、OpenSSL 3.0.12を用いてビルドしなければ動作しません。アプリの環境に合わせてOpenSSLのバージョンを選択して利用してください。

SoCについては下記を参照してください。

i-PROカメラへのソフトウェアインストール条件 - FAQ - Development Partner Portal

コンパイル手順ファイルを更新する

${SDK_DIR}/

...

external/

...

また、作成されたOpenCVライブラリには、ライブラリのデバッグに使用するための情報が含まれています。

アプリケーション実行時には使用しないため、容量削減のためデバッグ情報を削除することをお勧めします。

Code Block
languagebash
$ cd ${SDK_DIR}/src/adamapp-py/jpeg_app/external/lib/aarch64-linux-gnu/
$ aarch64-linux-gnu-strip --strip-debug libopencv_world.so.3.4.7

サンプルアプリをビルドする

サンプルアプリ「jpeg_app」をビルドして、カメラにインストールします(例:下記画像の緑枠からインストール可能)。

ビルド方法はこちらを参照してください。

アプリ画面を開いて(下記画像の赤枠ボタン)、カメラが撮影したjpeg画像が表示されていれば成功です。

...

Pythonモジュールをコンパイルする(SQLite)

NumpyとOpenCVのコンパイルを実施することができました。

次のチュートリアルとして、SQLiteのコンパイルを実施します。

ソースコードをダウンロードする

sqliteとPythonのソースコードを以下URLからダウンロードしてください。

このチュートリアルでは、sqlite 3.40.0、Python 3.7.9 を使用します。

ダウンロードするバージョンは、使用する機能に合わせて選択してください。

sqlite 3.40.0

https://www.sqlite.org/2022/sqlite-autoconf-3400000.tar.gz

Python 3.7.9

https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz

ダウンロードしたファイルは、${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリに配置してください。

コンパイル手順ファイルを更新する

${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.shファイルに、コンパイル手順を記載します。

下記の内容をコピーしてください。

Code Block
#!/bin/sh -x

HOME_PATH=/home/docker

LIB_INSTALL_DIR=${HOME_PATH}/install_path

SQLITE_ARCHIVES=sqlite-autoconf-3400000.tar.gz
SQLITE_DIR=sqlite-autoconf-3400000
SQLITE_BUILD_DIR=sqlite-autoconf-3400000/build

PYTHONPATH=$PYTHONPATH:${NUMPY_SITE_PACKAGES}
export PYTHONPATH

PYTHON_ARCHIVES=Python-3.7.9.tgz
PYTHON_DIR=Python-3.7.9

## for sqlite
cd ${HOME_PATH}
tar zxf ${SQLITE_ARCHIVES}
mkdir -p ${SQLITE_BUILD_DIR}
cd ${SQLITE_DIR}
./configure --prefix=${LIB_INSTALL_DIR}
make
make install

## for python
cd ${HOME_PATH}
tar zxf ${PYTHON_ARCHIVES}
cd ${PYTHON_DIR}
./configure --prefix=${LIB_INSTALL_DIR}
make
make install

コンパイルする

Dockerを用いてsqliteモジュールとPythonモジュールをコンパイルします。build/sample/docker/docker_volume/module_compile.shファイルに、コンパイル手順を記載します。

下記の内容をコピーしてください。

Code Block
#!/bin/sh -x

HOME_PATH=/home/docker

OPENSSL_ARCHIVES=openssl-OpenSSL_1_1_1i.tar.gz
OPENSSL_DIR=openssl-OpenSSL_1_1_1i

PYCURL_ARCHIVES=pycurl-7.45.2.tar.gz
PYCURL_DIR=pycurl-7.45.2

apt update
apt install libcurl4-openssl-dev libssl-dev

cd ${HOME_PATH}
tar zxf ${OPENSSL_ARCHIVES}
cd ${OPENSSL_DIR}
./Configure linux-aarch64
make

export PYCURL_SSL_LIBRARY=openssl
export CPPFLAGS=-I${HOME_PATH}/${OPENSSL_DIR}/include/openssl
export LDFLAGS=-L${HOME_PATH}/${OPENSSL_DIR}

## for pycurl
cd ${HOME_PATH}
tar zxf ${PYCURL_ARCHIVES}
cd ${PYCURL_DIR}
python3.7 setup.py --with-openssl --openssl-dir=${HOME_PATH}/${OPENSSL_DIR} build

コンパイルする

Dockerを用いてpycurlモジュールとOpenSSLモジュールをコンパイルします。

${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。

Code Block
$ docker run --rm -it --name aarch64-ubuntu -v `pwd`/docker_volume:/home/docker compile/ubuntu-rel:0.1

${SDK_DIR}/external/build/sample/docker/docker_volumeにコンパイル済みモジュールが作成されます。

AdamAppに配置する

作成されたモジュールを、AdamAppで使用できるように配置します。

チュートリアルではsrc/adamapp-py/hogehoge_appを例とします。

PyCurlを配置する

PyCurlライブラリは以下のディレクトリにインストールされています。

${SDK_DIR}/external/build/sample/docker/docker_volume/pycurl-7.45.2/build/lib.linux-aarch64-3.7

pycurl.cpython-37m-aarch64-linux-gnu.so

上記ファイルを、AdamAppソースディレクトリにコピーしてください。

${SDK_DIR}/src/adamapp-py/hogehoge_app/python/site-packages

Code Block
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/pycurl-7.45.2/build/lib.linux-aarch64-3.7/pycurl.cpython-37m-aarch64-linux-gnu.so ${SDK_DIR}/src/adamapp-py/hogehoge_app/python/site-packages

コピー後のディレクトリ構成は以下のようになります。

${SDK_DIR}/

...

src/adamapp-py/hogehoge_app/python/site-packages/pycurl.cpython-37m-aarch64-linux-gnu.so

PyCurlを読み込むようソースコードを修正する

${SDK_DIR}/externalsrc/build/sample/docker/docker_volume/install_pathにコンパイル済みモジュールが作成されます。

AdamAppに配置する

作成されたモジュールを、AdamAppで使用できるように配置します。

チュートリアルではsrc/adamapp-py/sqlite_appを例とします。

Info

sqlite_app の動作にはSDカードが必要です。SDカードを挿入できるカメラのみ確認可能です。
また、カメラのファームウェアによってはext4でフォーマットしたSDカードでないと動作しない可能性があります。

SQLiteを配置する

sqliteライブラリは以下のディレクトリにインストールされています。

${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib

libsqlite3.so
libsqlite3.so.0
libsqlite3.so.0.8.6
libsqlite3.la
libsqlite3.a

上記5ファイルを、AdamAppソースディレクトリにコピーしてください。

${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu

...

adamapp-py/hogehoge_app/python/pymain.py を開き、下記の通り追記します。

import os;

の1つ下の行に下記を追記する。

import pycurl;

...

サンプルアプリをビルドする

サンプルアプリ「hogehoge_app」をビルドして、カメラにインストールします。

ビルド方法は各SDKバージョンに応じて実施ください。

Pythonモジュールをコンパイルする(Numba)

Pythonの高速化に使われるNumbaのビルド手順について記載します。

ソースコードをダウンロードする

Numbaを実行するために、複数のモジュールが必要です。
それぞれのソースコードは以下のURLからダウンロードしてください。
また各モジュールのバージョンは、Python 3.7.9 に対応しているものを選択してください。

Numba 0.56.4:
https://github.com/numba/numba/archive/refs/tags/0.56.4.zip

Numpy 1.19.4:
https://github.com/numpy/numpy/archive/v1.19.4.tar.gz

LLVM 11.1.0:
https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-11.1.0.tar.gz

llvmlite 0.39.1:
https://github.com/numba/llvmlite/archive/refs/tags/v0.39.1.tar.gz

importlib_metadata 6.7.0:
https://github.com/python/importlib_metadata/archive/refs/tags/v6.7.0.zip

typing_extensions 4.7.1:
https://github.com/python/typing_extensions/archive/refs/tags/4.7.1.zip

zipp 3.15.0:
https://github.com/jaraco/zipp/archive/refs/tags/v3.15.0.zip

ダウンロードしたファイルは、${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリに配置してください。

コンパイル手順ファイルを更新する

${SDK_DIR}/external/build/sample/docker/docker_volume/

...

コピー後のディレクトリ構成は以下のようになります。

${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.so
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.so.0
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.so.0.8.6
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.la
${SDK_DIR}/src/adamapp-py/sqlite_app/external/lib/aarch64-linux-gnu/libsqlite3.a

Python用sqliteを配置する

Python用sqliteモジュールは以下のディレクトリにインストールされています。

${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/sqlite3

ディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。

${SDK_DIR}/src/adamapp-py/sqlite_app/python/site-packages

Code Block
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/sqlite3 ${SDK_DIR}/src/adamapp-py/sqlite_app/python/site-packages

コピー後のディレクトリ構成は以下のようになります。

${SDK_DIR}/src/adamapp-py/sqlite_app/python/site-packages/sqlite3

Python用sqliteは、モジュールだけではなくライブラリも必要となるため、あわせて配置します。

Python用sqliteライブラリは以下のディレクトリにインストールされています。

${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/lib-dynload

_sqlite3.cpython-37m-aarch64-linux-gnu.soを以下のディレクトリにコピーしてください。

${SDK_DIR}/src/adamapp-py/sqlite_app/python/site-packages/sqlite3

Code Block
$ cp -R ${SDK_DIR}/external/build/sample/docker/docker_volume/install_path/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-aarch64-linux-gnu.so ${SDK_DIR}/src/adamapp-py/sqlite_app/python/site-packages/sqlite3

コピー後のディレクトリ構成は以下のようになります。

${SDK_DIR}/src/adamapp-py/sqlite_app/python/site-packages/sqlite3/_sqlite3.cpython-37m-aarch64-linux-gnu.so

次に、import時にPython用sqliteライブラリを読み込めるよう、dbapi2.pyを修正します。

${SDK_DIR}/src/adamapp-py/sqlite_app/python/site-packages/sqlite3/dbapi2.py

下記の通りに修正します。

修正前)from _sqlite3 import *

修正後)from sqlite3._sqlite3 import *

サンプルアプリをビルドする

サンプルアプリ「sqlite_app」をビルドして、カメラにインストールします。

ビルド方法はこちらを参照してください。

アプリ画面を開いて、下記の画面が表示されていれば成功です。

...

Pythonモジュールをコンパイルする(Pycurl)

SQLiteのコンパイルを実施できました。

次のチュートリアルとして、Pycurlのコンパイルを実施します。

ソースコードをダウンロードする

PyCurlとOpenSSLのソースコードを以下URLからダウンロードしてください。

このチュートリアルでは、pycurl 7.45.2、OpenSSL 1.1.1 を使用します。

ダウンロードするバージョンは、使用する機能に合わせて選択してください。

pycurl 7.45.2

https://files.pythonhosted.org/packages/a8/af/24d3acfa76b867dbd8f1166853c18eefc890fc5da03a48672b38ea77ddae/pycurl-7.45.2.tar.gz

OpenSSL 1.1.1

https://github.com/openssl/openssl/archive/OpenSSL_1_1_1i.tar.gz

ダウンロードしたファイルは、${SDK_DIR}/external/build/sample/docker/docker_volumeディレクトリに配置してください。

コンパイル手順ファイルを更新する

${SDK_DIR}/external/build/sample/docker/docker_volume/module_compile.shファイルに、コンパイル手順を記載します。

下記の内容をコピーしてください。

Code Block
#!/bin/sh -x

HOME_PATH=/home/docker

OPENSSL_ARCHIVES=openssl-OpenSSL_1_1_1i.tar.gz
OPENSSL_DIR=openssl-OpenSSL_1_1_1i

PYCURL_ARCHIVES=pycurl-7.45.2.tar.gz
PYCURL_DIR=pycurl-7.45.2

apt update
apt install libcurl4-openssl-dev libssl-dev

cd ${HOME_PATH}
tar zxf ${OPENSSL_ARCHIVES}
cd ${OPENSSL_DIR}
./Configure linux-aarch64
make

export PYCURL_SSL_LIBRARY=openssl
export CPPFLAGS=-I${HOME_PATH}/${OPENSSL_DIR}/include/openssl
export LDFLAGS=-L${HOME_PATH}/${OPENSSL_DIR}

## for pycurl
cd ${HOME_PATH}
tar zxf ${PYCURL_ARCHIVES}
cd ${PYCURL_DIR}
python3.7 setup.py --with-openssl --openssl-dir=${HOME_PATH}/${OPENSSL_DIR} build

コンパイルする

Dockerを用いてpycurlモジュールとOpenSSLモジュールをコンパイルします。

${SDK_DIR}/external/build/sample/docker ディレクトリでDockerを実行してください。

Code Block
$ docker run --rm -it --name aarch64-ubuntu -v `pwd`/docker_volume:/home/docker compile/ubuntu-rel:0.1

${SDK_DIR}/external/build/sample/docker/docker_volumeにコンパイル済みモジュールが作成されます。

AdamAppに配置する

作成されたモジュールを、AdamAppで使用できるように配置します。

チュートリアルではsrc/adamapp-py/additional_info_sample_appを例とします。

PyCurlを配置する

PyCurlライブラリは以下のディレクトリにインストールされています。

module_compile.shファイルに、コンパイル手順を記載します。

下記の内容をコピーしてください。

Code Block
#!/bin/sh -x

#----------
HOME_PATH=/home/docker
LIB_INSTALL_DIR=${HOME_PATH}/install_path
SITE_PACKAGES=${LIB_INSTALL_DIR}/lib/python3.7/site-packages

NUMPY_ARCHIVES=numpy-1.19.4.tar.gz
NUMPY_DIR=numpy-1.19.4

LLVM_ARCHIVES=llvm-project-llvmorg-11.1.0.tar.gz
LLVM_DIR=llvm-project-llvmorg-11.1.0
LLVM_INSTALL_DIR=${LIB_INSTALL_DIR}/llvm
LLVM_PATCH_SRC=${LLVMLITE_DIR}/conda-recipes
LLVM_PATCH_DST=${LLVM_DIR}/llvm

LLVMLITE_ARCHIVES=llvmlite-0.39.1.tar.gz
LLVMLITE_DIR=llvmlite-0.39.1

NUMBA_ARCHIVES=numba-0.56.4.zip
NUMBA_DIR=numba-0.56.4

#----------

# NumPy
cd ${HOME_PATH}
mkdir -p ${SITE_PACKAGES}
tar xf ${NUMPY_ARCHIVES}
cd ${NUMPY_DIR}
python setup.py build
PYTHONPATH=$PYTHONPATH:${SITE_PACKAGES}
export PYTHONPATH
python setup.py install --prefix=${LIB_INSTALL_DIR}


# LLVM / llvmlite
cd ${HOME_PATH}
tar xf ${LLVM_ARCHIVES}
tar xf ${LLVMLITE_ARCHIVES}

cd ${LLVM_PATCH_DST}
for patchFile in $(find ../../${LLVM_PATCH_SRC} -name "*.patch" -type f); do
	patch --dry-run -f -p1 -i ${patchFile}
	if [ $? -eq 0 ]; then
		patch -p1 -i ${patchFile}
	fi
done

LLVM_BUILD_SH="../../${LLVMLITE_DIR}/conda-recipes/llvmdev/build.sh"
mkdir -p ${LLVM_INSTALL_DIR}
export PREFIX=${LLVM_INSTALL_DIR} CPU_COUNT=2
sed -i -e "s/\(^LLVM_TARGETS_TO_BUILD=\).*/\1\$\{LLVM_TARGETS_TO_BUILD:-\"AArch64\"\}/" ${LLVM_BUILD_SH}
sed -i -e "/LLVM_ENABLE_ASSERTIONS/d" ${LLVM_BUILD_SH}
sed -i -e "/LLVM_EXPERIMENTAL_TARGETS_TO_BUILD/d" ${LLVM_BUILD_SH}
chmod +x ${LLVM_BUILD_SH}
${LLVM_BUILD_SH}
cd ../../

cd ${LLVMLITE_DIR}
export LLVM_CONFIG=${LLVM_INSTALL_DIR}/bin/llvm-config
python setup.py build
python setup.py install --prefix=${LIB_INSTALL_DIR}
cd ../


# numba
unzip ${NUMBA_ARCHIVES}
cd ${NUMBA_DIR}
export NUMBA_DISABLE_TBB=1
python setup.py build
python setup.py install --prefix=${LIB_INSTALL_DIR}
cd ../


# replace some libraries compatible with python3.7
cd ${HOME_PATH}
unzip importlib_metadata-6.7.0.zip
mv importlib_metadata-6.7.0/importlib_metadata ${SITE_PACKAGES}
unzip typing_extensions-4.7.1.zip
mv typing_extensions-4.7.1/src/typing_extensions.py ${SITE_PACKAGES}
unzip zipp-3.15.0.zip
mv zipp-3.15.0/zipp ${SITE_PACKAGES}


# cleanup
cd ${SITE_PACKAGES}
rm -f easy-install.pth setuptools.pth site.py
find . -maxdepth 2 -name numpy -type d -exec mv {} . \;
find . -maxdepth 2 -name numba -type d -exec mv {} . \;
rm -rf *.egg*
find . -name *pycache* -type d -print | xargs rm -rf
find . -name tests -type d -print | xargs rm -rf
find . -name *.so | xargs aarch64-linux-gnu-strip --strip-debug
cd ${HOME_PATH}

コンパイルする

Dockerを用いて各モジュールをコンパイルします。
${SDK_DIR}/external/build/sample/docker

...

pycurl.cpython-37m-aarch64-linux-gnu.so

上記ファイルを、AdamAppソースディレクトリにコピーしてください。

${SDK_DIR}/src/adamapp-py/additional_info_sample_app/python/site-packages

...

ディレクトリでDockerを実行してください。

Code Block
$ docker run --rm -it --name aarch64-ubuntu -v `pwd`/docker_volume:/home/docker compile/ubuntu-rel:0.1

コンパイル済みのモジュールは以下のディレクトリに配置されます。
${SDK_DIR}/external/build/sample/docker/docker_volume/

...

install_path/lib/python3.7/

...

site-packages

Info

LLVMのコンパイルに時間がかかるため、しばらく待ちます。
コンパイル済みモジュールのファイルサイズは、合計で約60MByteになります。

AdamAppに配置する

作成されたモジュールを、AdamAppで使用できるように配置します。
チュートリアルでは${SDK_DIR}/src/adamapp-py/

...

yuv_

...

コピー後のディレクトリ構成は以下のようになります。

...

yolov5_appを例とします。

モジュールを配置する

コンパイル済みのモジュールをディレクトリ構成そのままで、AdamAppソースディレクトリにコピーしてください。

$ cp -R ${SDK_DIR}/srcexternal/adamapp-py/additional_info_sample_app/python/site-packages/pycurl.cpython-37m-aarch64-linux-gnu.so

PyCurlを読み込むようソースコードを修正する

build/sample/docker/docker_volume/install_path/lib/python3.7/site-packages ${SDK_DIR}/src/adamapp-py/

...

yuv_

...

yolov5_

...

app/python/

pymain.py を開き、下記の通り追記します。

import os;

の1つ下の行に下記を追記する。

import pycurl;

...

サンプルアプリをビルドする

サンプルアプリ「additional_info_sample_app」をビルドして、カメラにインストールします。

ビルド方法はこちらを参照してください。

アプリ画面を開いて、「body」のように文字列が表示されていれば成功です。を更新する

numbaに対応したソースコードに変更します。下記のファイルと添付ファイル「pymain.py」を差し替えます。
\src\adamapp-py\yuv_yolov5_app\python\pymain.py

View file
namepymain_numba.zip

サンプルアプリをビルドする

サンプルアプリ「yuv_yolov5_app」をビルドして、カメラにインストールします。

ビルド方法は各SDKバージョンに応じて実施ください。

アプリ画面を開いて、画面に映っている物体(人など)に枠が付いていれば成功です。

サンプルアプリの動作説明も参照ください。

失敗した場合はアプリ画面にアプリ起動失敗を示すメッセージが表示されます。

...