Versions Compared

Key

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

はじめに

SDK V1.61以前を使用している場合、まず初めに下記を対応してください。
この修正はSDK v1.62以降で対応されています。

...

このチュートリアルでは、SDKのインストールディレクトリを${SDK_DIR}として記載します。

目次

...

Table of Contents
minLevel1
maxLevel4

概要

...

Python版のAdamAppで外部ライブラリを使用する場合は、Pythonモジュールのコンパイルが必要です。

本チュートリアルでは、Python用外部ライブラリをビルドするための環境構築~モジュールのコンパイルまでの手順を解説します。

チュートリアルで使用する外部ライブラリ
  • NumPy 1.14.9

  • OpenCV 3.4.7

  • sqlite 3.40.0

  • Python 3.7.9

  • pycurl 7.45.2

  • OpenSSL 1.1.1

Docker環境を構築する

...

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

チュートリアルでのインストール対象OS
  • Ubuntu 18.04.2 LTS (bionic)

...

Note

VirtualBox上の環境の場合、ホスト - ゲストの共有ディレクトリ上ではDockerのコンパイルに失敗する可能性がありますので、失敗した場合はUbuntu上のディレクトリにて作業してみてください。

パッケージをインストールする

Docker環境の構築に必要なパッケージをインストールします。

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

リポジトリを追加する

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

...

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

Docker実行用ファイルをインストールする

Docker実行に必要なファイルを、aptを使用してインストールします。

Code Block
languagebash
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

(任意)Dockerにプロキシ設定を行う

インターネット接続にプロキシサーバが必要な場合は、Dockerにプロキシ設定を行ってください。

参考:Docker公式ドキュメント

Dockerコマンドの権限を変更する

dockerコマンドを一般ユーザでも使用できるように設定を変更します。

Code Block
languagebash
$ sudo usermod -a -G docker $(whoami)

一度ログアウトして、再度ログインしてください。

Docker実行確認

Dockerが使用できるか確認します。

Code Block
languagebash
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Dockerイメージを作成

...

Pythonモジュールコンパイル用のDockerイメージを作成します。

Dockerfileを編集する

Dockerイメージを作成する場合、一般的にDockerfileと呼ばれるイメージ作成手順を記載したファイルを作成します。

...

Info

インターネット接続にプロキシサーバが必要な場合は、

RUN apt-get update \

の前の行に、以下の行を追加してください。

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

ENV http_proxy=http://proxy.example.com:8080/ https_proxy=http://proxy.example.com:8080/

Dockerイメージを作成する

Dockerイメージは、Dockerfileが存在するディレクトリで作成します。

...

Note

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

  • exec_entry.sh

  • qemu-aarch64-static

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

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

...

手順

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

...

Note

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

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

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

...

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

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

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

...

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

コンパイルする

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

...

Info

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

AdamAppに配置する

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

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

Numpyを配置する

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

...

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

OpenCVを配置する

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

...

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/external/lib/aarch64-linux-gnu/
$ aarch64-linux-gnu-strip --strip-debug libopencv_world.so.3.4.7

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

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

...

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

...

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

...

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

...

Info

・SDカードを挿入可能なカメラのみ確認可能ですので、事前に確認してください。

・ext4形式に対応したSDカードおよびカメラファームのみ確認可能ですので、事前に確認してください。

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

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

...

ダウンロードしたファイルは、${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_volume/install_pathにコンパイル済みモジュールが作成されます。

AdamAppに配置する

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

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

SQLiteを配置する

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

...

${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モジュールは以下のディレクトリにインストールされています。

...

修正前)from _sqlite3 import *

修正後)from sqlite3._sqlite3 import *

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

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

...

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

...

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

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

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

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

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

...

ダウンロードしたファイルは、${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_volumeにコンパイル済みモジュールが作成されます。

AdamAppに配置する

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

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

PyCurlを配置する

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

...

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

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

${SDK_DIR}/src/adamapp-py/additional_info_sample_app/python/pymain.py を開き、下記の通り追記します。

import os;

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

import pycurl;

...

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

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

...