ZED SDKをqmakeでクロスコンパイルする方法(Jetson TX1向け)


ZED SDKのインストール

Jetson向けZED SDKをダウンロードして、Jetsonにインストールする。
https://www.stereolabs.com/developers/release/

jetson$ chmod +x ZED_SDK_JTX1_v*.run
jetson$ ./ZED_SDK_JTX1_v*.run

ビルド方法を確認

サンプルプログラムのビルド方法はこちらに書かれている。
CMakeでビルドをしており、以下のファイルでパス等を確認できる。

jetson$ vi /usr/local/zed/zed-config.cmake
zed-config.cmake
# ===================================================================================
#  The ZED CMake configuration file
#
#  Usage from an external project:
#    In your CMakeLists.txt, add these lines:
#
#    SET(ZED_DIR "/usr/local/zed/")
#    FIND_PACKAGE(zed REQUIRED )
#    INCLUDE_DIRECTORIES(${ZED_INCLUDE_DIRS})
#    link_directories(${ZED_LIBRARY_DIR})
#    TARGET_LINK_LIBRARIES(MY_TARGET_NAME ${ZED_LIBRARIES})
#
#    This file will define the following variables:
#      - ZED_LIBRARIES           : The list of dynamic libraries (ZED SDK) to links against.
#      - ZED_STATIC_LIBRARIES    : The list of static libraries (ZED SDK) to links against.
#      - ZED_STATIC_DEP_LIBRARIES: The list of static libraries (ZED SDK dependencies) to links against.
#      - ZED_LIBRARY_DIR         : The directory where lib files are.
#      - ZED_INCLUDE_DIRS        : The ZED include directories.
#      - ZED_CUDA_VERSION        : The CUDA version required by the ZED SDK.
#      - CUDA_NPP_LIBRARIES_ZED  : The CUDA NPP libraries used by the ZED SDK.
# ===================================================================================

set(ZED_FOUND FALSE CACHE BOOL "" FORCE)

set(ZED_INCLUDE_DIRS "/usr/local/zed/include")    ★ ZED SDKのインクルードパス
set(ZED_LIBRARY_DIR "/usr/local/zed/lib")       ★ ZED SDKのライブラリパス

if(ZED_INCLUDE_DIRS)
    set(ZED_LIBRARIES
        "/usr/local/zed/lib/libsl_input.so"         ★ ZED SDKの共有ライブラリ
        "/usr/local/zed/lib/libsl_core.so"
        "/usr/local/zed/lib/libsl_zed.so"
    )

    set(ZED_STATIC_LIBRARIES
        "/usr/local/zed/lib/libsl_zed_static.a"      ★ ZED SDKの静的ライブラリ
        "/usr/local/zed/lib/libsl_input_static.a"
        "/usr/local/zed/lib/libsl_core_static.a"
    )

    set(ZED_FOUND TRUE CACHE BOOL "" FORCE)

    exec_program(uname ARGS -p OUTPUT_VARIABLE CMAKE_SYSTEM_NAME2)
    if (CMAKE_SYSTEM_NAME2 MATCHES "aarch64" )
        unset(CUDA_USE_STATIC_CUDA_RUNTIME CACHE)
        option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
    endif()

    SET(ZED_CUDA_VERSION 9.0)

    find_package(CUDA 9.0 EXACT REQUIRED)
    if(CUDA_FOUND)
            set(cuda_path "/usr/local/cuda-${CUDA_VERSION_MAJOR}.${CUDA_VERSION_MINOR}/lib64/") ★ CUDAのライブラリパス
            set(CUDA_NPP_LIBRARIES_ZED
                                "${cuda_path}libnppial.so"     ★ CUDAの共有ライブラリ
                                "${cuda_path}libnppisu.so"
                                "${cuda_path}libnppicc.so"
                                "${cuda_path}libnppicom.so"
                                "${cuda_path}libnppidei.so"
                                "${cuda_path}libnppif.so"
                                "${cuda_path}libnppig.so"

ホスト環境にファイルを転送する

ZED SDK

JetsonにインストールしたZED SDKのファイルを、クロスビルド環境のホストPCに転送する。
ZED SDKのライブラリやインクルードファイル等は/usr/local/zed/フォルダにインストールされている。
JetPackのrootfsフォルダで操作を行う。(IPアドレスはJetsonのIPアドレス)

host$ cd ~/JetPack/64_TX1/Linux_for_Tegra/rootfs/usr/local
host$ sudo rsync -e ssh -avz [email protected]:/usr/local/zed .

ZED SDKインストール時にユーザー所有権でインストールしていたので、rootに変更しておく。
パーミッションも合わせて変更しておく。

host$ sudo chown -R root zed
host$ sudo chmod -R 755 zed

CUDA

同様に転送する。

host$ cd ~/JetPack/64_TX1/Linux_for_Tegra/rootfs/usr/local
host$ sudo rsync -e ssh -avz [email protected]:/usr/local/cuda .
host$ sudo rsync -e ssh -avz [email protected]:/usr/local/cuda-9.0 .

aarch64-linux-gnu

同様に転送する。

host$ cd ~/JetPack/64_TX1/Linux_for_Tegra/rootfs/usr/lib
host$ sudo rsync -e ssh -avz [email protected]:/usr/lib/aarch64-linux-gnu .

シンボリックリンクの修正

以下のスクリプトを利用し、ホスト側にコピーしたシンボリックリンクをホスト向けに修正する。
https://github.com/alpqr/fixsymlinks_tx1

host$ chmod +x fixsymlinks.sh
host$ sudo ./fixsymlinks.sh ~/JetPack/64_TX1/Linux_for_Tegra/rootfs

クロスビルドで Hello ZED する

sysroot設定

Qt Creatorを起動する。
オプションでSysrootにJetPackのrootfsを指定しておくこと。

プロジェクトファイル設定

INCLUDEPATHLIBSにZEDとCUDAのパスを通す。

INCLUDEPATH += /home/ubuntu/JetPack/64_TX1/Linux_for_Tegra/rootfs/usr/local/zed/include \
               /home/ubuntu/JetPack/64_TX1/Linux_for_Tegra/rootfs/usr/local/cuda/include

LIBS += -L/home/ubuntu/JetPack/64_TX1/Linux_for_Tegra/rootfs/usr/local/zed/lib \
            -lsl_input \
            -lsl_core \
            -lsl_zed \
        -L/home/ubuntu/JetPack/64_TX1/Linux_for_Tegra/rootfs/usr/local/cuda/lib64 \
            -lnppial \
            -lnppisu \
            -lnppicc \
            -lnppicom \
            -lnppidei \
            -lnppif \
            -lnppig \
            -lnppim \
            -lnppist \
            -lnppitc \
            -lnpps \
            -lnppc

これでサンプルプログラムがqmakeでビルドできるようになる。
参考までに、QtでZED tutorial 1をビルドしたソースコードをGitHubに置いた。