ROS2のCMakeを簡単に!~ament_cmake_auto~

この記事はROS/ROS2アドベントカレンダー2020の18日目の記事です

こんな経験はありませんか?

ROS2のCMakeLists.txtを書いていてこんな経験はありませんか?

  • package.xmlで依存関係を変えたらCMakeも書き換えないといけない...
  • ROS2のコンポーネント指向,便利だけどCMake書くのが面倒...
  • 毎回同じような内容を書く割には抜け漏れが起こりやすい...

その悩み,”ament_cmake_auto”が解決します!

ament_cmake_autoを使うとROS2のCMakeを簡潔に書くことが出来るようになります*1

では,実際にどれくらい簡潔に書けるのかを見ていきます.

ament_cmake_autoを使ったCMakeLists.txt

最小限のサンプルがこちらになります.

cmake_minimum_required(VERSION 3.5)
project(example)

find_package(ament_cmake_auto REQUIRED)
ament_auto_find_build_dependencies()

ament_auto_add_library(${PROJECT_NAME} SHARED
 src/example.cpp include/example.hpp)

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  ament_lint_auto_find_test_dependencies()
endif()

ament_auto_package()

あれ?依存関係は??
exportしなくていいの???
installは????

まともにROS2のCMakeを書いたことがある人なら頭の中がはてなマークでいっぱいになると思います.
でも大丈夫,"ament_cmake_auto"がぜ〜んぶやってくれます.

関数群

具体的にどのようなことをやってくれているのかを関数ごとに見ていきます.
詳しくは実装*2をご覧ください.

ament_auto_add_executable

実行ファイル生成に関して

  • add_executable
  • target_include_directories
  • target_link_libraries
  • ament_target_dependencies

をまとめてやってくれます

ament_auto_add_library

ライブラリ生成に関して

  • add_library
  • target_include_directories
  • target_link_libraries
  • ament_target_dependencies

をまとめてやってくれます

ament_auto_find_build_dependencies

package.xmlから依存を読み取ってfind_packageしてくれます.

ament_auto_generate_code

メッセージのファイルを探してヘッダーなどを自動生成してくれるようですが,未実装のようです.
今後に期待

ament_auto_package

  • ament_export_include_directories
  • ament_export_libraries
  • install

export,install関係を全部やってくれます

最後に

ros2に標準でついてくるament_cmake_autoですが, 非常に便利なのに使っている人も文献も少ないように思えた*3ので今回記事にしてみました.

*1:ROS1でもcatkin_simpleというCMakeを簡単に書くためのパッケージがあります

*2:https://github.com/ament/ament_cmake/tree/master/ament_cmake_auto/cmake

*3:使われているのをAutowareのROS2バージョンであるAutoware.Auto以外に見たことがない...