えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

depthai-coreの環境構築とCMakeの書き方

安価で高画質・高機能なステレオカメラで人気のOAK-Dカメラをご存知でしょうか?

このカメラは、4Kカメラ・ステレオカメラ・AI演算アクセラレータ(Myriad Xイメージプロセスユニット)を搭載しており、物体認識・追跡が可能なサンプルプログラムが揃っています。


高機能なのは勿論のこと、特別な設定なしで深度を測定可能なカメラにしてはかなり安い3万円以下となっているのも魅力的で、値上がりしたRealSenseの代替になりうるポテンシャルを持っています。(レーザー照射という点で性質は異なりますが…)

日本では、スイッチサイエンスなどに在庫があり、結構手軽に購入できます。

www.switch-science.com


C++API叩きたい…!

OAK-Dカメラは、Pythonで使うのが最も楽でオススメです。

環境構築も簡単だし、使用例・記事もたくさん上がっています。

公式のサンプルであれば、depthai-pythonを見ると良さそうです。

github.com


しかし、私はC++で扱いたいなーと結構思ったりします。

というのも、ROSのラッパーにしたり、ロボット・組み込みを想定するのであれば、ROSであればComposableNodeにできるC++にするのが好ましいからです。

一応、GitHub - luxonis/depthai-rosというパッケージはありますが、いろいろな機能を取捨選択するならAPI直接叩きに勝るものはないのかなーと考えたり…


そこで、OAK-DのC++APIであるdepthai-coreを見たのですが、めっちゃ複雑でわかりにくすぎました…

github.com

Pythonプログラムは道を整備すればするほど簡単になりますが、C++はその逆が起こるのはなぜなのか…


テンプレート化

なんとしてもC++APIを叩いてやると決めたので、(できる限りシンプルな)プロジェクトのベースを作りました。(結果、半日かかりました)

github.com

流れとしては、bash setup_depthai_core.bashで依存関係を全て解消しつつ、depthai-coreのビルドを行い、

そのライブラリを使って個人のプログラムをコンパイルさせるという感じです。


depthai-coreで最も悩まれるであろうCMakeListsについて少し詳しく説明します。

(意外と指定項目は少なかったです。)

cmake_minimum_required(VERSION 3.5)
project("dai_core_template")

set(CMAKE_CXX_STANDARD 14)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

set(depthai_DIR depthai-core-lib)

find_package(OpenCV REQUIRED)
find_package(depthai CONFIG REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS})


# set compile target -------------------------------------------------------
set(TARGET stereo_hconcat)

add_executable(${TARGET} examples/${TARGET}.cpp)

target_include_directories(${TARGET} PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
)

target_link_libraries(
  ${TARGET}
  ${OpenCV_LIBS}
  depthai::opencv
)

【注意すべき点?】

  • CMAKE_CXX_STANDARDは14に設定しています。(最初は指定していなかったのですが、めっちゃ文法エラーが出てきたので、14に引き上げました。)

  • set(depthai_DIR depthai-core-lib)は、depthai-coreがインストールされている場所を示しています。ここでは、CMakeListsのあるディレクトリと同じ階層にdepthai-core-libを作成し、そこにdepthai-coreのビルドファイルをインストールしました。(自動インストールスクリプトに記述)

  • target_link_librariesdepthai::opencvを追記します。depthai::opencv自体にOpenCVが含まれているので、もしかしたらその上のOpenCVはいらないかもしれません。


ROS2を使用する場合は、ament_cmakeを使ってROS関連の設定を追記していくだけです。

実行

サンプルにstereo_hconcatを入れています。

ステレオ画像を横にくっつけて1枚の画像にするプログラムです。

pipelineを引数に渡すdai::Device device;はスマートポインタにして宣言しないといけないことが分からず、解決に時間がかかりました…