Azure Kinect Sensor SDKをUbuntu Linuxでビルドしてみる

# はじめに

[Azure Kinect DK](https://azure.microsoft.com/ja-jp/services/kinect-dk/)のraw dataアクセスを可能にする[Sensor SDK](https://github.com/Microsoft/Azure-Kinect-Sensor-SDK)はWindowsとLinuxでビルド可能とのことなのでUbuntu Linux 18.04でのビルドを試してみた

# Dockerでのセットアップ

[Linux Dependencies](https://github.com/microsoft/Azure-Kinect-Sensor-SDK/blob/develop/docs/building.md#linux-dependencies)にはLinuxはDockerfileみたらわかるよみたいに割と雑に書かれているのでざっと見てからDocker Imageを構築してまずはコンテナの中でSDKのexampleなどをビルドしてみようと思う。[building.md](https://github.com/microsoft/Azure-Kinect-Sensor-SDK/blob/develop/docs/building.md)が参考になった

まずは`Dockerfile`からイメージを作成してコンテナを起動する

```shell
cd $MYWORKSPACE
git clone https://github.com/microsoft/Azure-Kinect-Sensor-SDK.git
cd Azure-Kinect-Sensor-SDK/scripts/docker/
chmod +x ./setup-ubuntu.sh
docker build -t azure-kinect-sensor-sdk .
docker run -it -v $PWD:/tmp azure-kinect-sensor-sdk:latest bash
```

あとでビルドしたモジュールを他の環境でテストしたいのでホストのカレントディレクトリとコンテナ`/tmp`を繋げておいた。コンテナにログインした後以下のような手順でSDKをビルドする

```shell
git clone https://github.com/microsoft/Azure-Kinect-Sensor-SDK.git
cd Azure-Kinect-Sensor-SDK/
mkdir build && cd $_
cmake .. -GNinja -DCMAKE_BUILD_TYPE=Debug
ninja
```

`cmake .. -GNinja -DCMAKE_BUILD_TYPE=Debug`はデバッグビルドだが、リリースビルドの場合は`cmake .. -GNinja`でいいみたいだ。C++は全然詳しくないんだがいろいろ調べる中で[cmake](https://cmake.org/)や[ninja](https://ninja-build.org/manual.html)のことをざっくりと知った。

ビルドが成功したら`./bin`の中にtoolsやexamplesなどのモジュールが出来上がっている。

```shell
tree ./bin
./bin
|-- AzureKinectFirmwareTool
|-- allocator_ut
|-- azure_c_shared_test
|-- calibration_info
|-- calibration_ut
|-- capturesync_ut
|-- color_ft
|-- color_ut
|-- cpp_projection_ft
|-- custom_track_ut
|-- depth_ft
|-- depth_ut
|-- depthmcu_ut
|-- deversion
|-- dynlib_ut
|-- enumerate_devices
|-- executables_ft
|-- executables_ft_custom
|-- fastcapture_streaming
|-- fastcapture_trigger
|-- fastpointcloud
|-- functional_custom_test_list.txt
|-- functional_test_list.txt
|-- global_ft
|-- green_screen
|-- handle_ut
|-- imu_ft
|-- imu_ut
|-- k4a_cpp_ft
|-- k4a_example_test
|-- k4arecord_custom_track
|-- k4arecorder
|-- k4aviewer
|-- latency_perf
|-- libk4a.so -> libk4a.so.1.4
|-- libk4a.so.1.4 -> libk4a.so.1.4.0
|-- libk4a.so.1.4.0
|-- libk4arecord.so -> libk4arecord.so.1.4
|-- libk4arecord.so.1.4 -> libk4arecord.so.1.4.0
|-- libk4arecord.so.1.4.0
|-- libtest_dynlib.so -> libtest_dynlib.so.1
|-- libtest_dynlib.so.1 -> libtest_dynlib.so.1.0
|-- libtest_dynlib.so.1.0
|-- logging_ut
|-- multidevice_ft
|-- opencv_example
|-- perf_test_list.txt
|-- playback_external_sync
|-- playback_perf
|-- playback_ut
|-- queue_ut
|-- record_ut
|-- rwlock_ft
|-- streaming_samples
|-- testutil
|-- throughput_perf
|-- transformation_example
|-- transformation_ut
|-- undistort
|-- unit_test_list.txt
`-- viewer_opengl
```

これらをいったんホスト側にコピーしておく

```shell
mkdir /tmp/build_bins
cp ./bin/* /tmp/build_bins
```

# Docker以外でのビルド方法を検証してみる

既存のUbuntu上にSDKをセットアップすることを見据えて[Dockerfile](https://github.com/microsoft/Azure-Kinect-Sensor-SDK/blob/develop/scripts/docker/Dockerfile)が使っている[setup-ubuntu.sh](https://github.com/microsoft/Azure-Kinect-Sensor-SDK/blob/develop/scripts/docker/setup-ubuntu.sh)を参考に手順をつくってみた。手元に適当な素のUbuntu環境がなかったのでUbuntuのDockerコンテナを起動して検証してみる

```shell
docker pull ubuntu:18.04
docker run -it ubuntu:latest bash
```

以下の手順で正常にビルドすることができた。途中の`# [yes]`のところでライセンス許諾を求められるので`yes`と入力する

```shell
apt update
apt-get install -y --no-install-recommends gnupg curl gcc-aarch64-linux-gnu g++-aarch64-linux-gnu file dpkg-dev qemu binfmt-support qemu-user-static pkg-config ninja-build doxygen clang python3 gcc g++ git git-lfs nasm  cmake  powershell libgl1-mesa-dev:amd64 libsoundio-dev:amd64 libjpeg-dev:amd64 libvulkan-dev:amd64 libx11-dev:amd64 libxcursor-dev:amd64 libxinerama-dev:amd64 libxrandr-dev:amd64  libusb-1.0-0-dev:amd64 libssl-dev:amd64 libudev-dev:amd64 mesa-common-dev:$arch uuid-dev:amd64 libopencv-dev:amd64

curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
apt install -y --reinstall software-properties-common
apt-add-repository https://packages.microsoft.com/ubuntu/18.04/prod
apt-get update

apt install -y k4a-tools
# [yes]
apt install -y libk4a1.3-dev
# [yes]

git clone https://github.com/microsoft/Azure-Kinect-Sensor-SDK.git
cd Azure-Kinect-Sensor-SDK
mkdir build && cd $_
cmake .. -GNinja -DCMAKE_BUILD_TYPE=Debug
ninja
```

# ビルドしたモジュールを他のLinuxで動作させてみる

開発環境は上記でいいがモジュールを動作させる用の環境はどうしたらいいか？と思って調べてみた。

```shell
file /root/host_dir/build_bins/fastpointcloud 
/root/host_dir/build_bins/fastpointcloud: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=c484fa1efd1f450bfa3011c015504e727e9c5db2, with debug_info, not stripped
```

Staticなモジュールじゃないよね。いろいろ試してビルドされた`libk4a.so`あたりのライブラリの他に`libk4a1.3-dev`のヘッダなんかも必要だということがわかった。というわけで

```shell
docker run -it -v $PWD:/root/host_dir ubuntu:latest bash
```

とまた新しいUbuntu環境をつくってから

```shell
apt update
apt install -y gnupg curl
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
apt install -y --reinstall software-properties-common
apt-add-repository https://packages.microsoft.com/ubuntu/18.04/prod
apt-get update
apt install -y libk4a1.3-dev
[yes]
```

と`libk4a1.3-dev`をインストールしてから[fastpointcloud](https://github.com/microsoft/Azure-Kinect-Sensor-SDK/tree/develop/examples/fastpointcloud)のバイナリを実行してみる

```shell
cd /root
./host_dir/build_bins/fastpointcloud pointcloud.ply
[2020-03-15 09:43:22.710] [error] [t=4982] ../src/usbcommand/usbcommand.c (1037): usb_cmd_get_device_count(). No devices found
No K4A devices found
```

Azure KinectがUSB接続されていないので当然のエラーが出たけど、どうやらモジュールはうまく動作しているようだ。

# おわりに

とりあえずはビルド環境と実行環境のセットアップのしかたがわかった。後日なんか作って実際にAzure Kinectのデータを採ってみようと思う。