ament_cmake_autoを使ったROS 2のパッケージをcolcon buildする際に、最近(2.5.4以降)includeディレクトリのパス周りが更新されていることに気づき、その背景と対応について調べたのでまとめます。
https://twitter.com/Tiryoh/status/1921799222820561200
rcl/rclcppでのincludeディレクトリのパスの扱い
ROS 2 Humble以降とそれより前ではincludeディレクトリのパスが更新されています。
※変更前後どちらでも include <rclcpp/node.hpp>で使用できます。
before
/opt/ros/galactic/include/ ├── rcl │ ├── node.h ├── rclcpp │ ├── node.hppafter
/opt/ros/humble/include ├── rcl │ └── rcl │ ├── node.h ├── rclcpp │ └── rclcpp │ ├── node.hppこのパスの修正によりcolcon build --merge-installなどでmerge installする場合にunderlay/overlayに同名のパッケージがあると衝突してしまう問題を解決できるようになったようです。

Humbleリリース時にこの話を聞いたことがあったような気がしますが、そもそもmerge installをしていなかったり、単一ワークスペースのみで使っている場合はあまり影響がなかったので、完全に忘れていました。
ament_cmake_autoでの対応
このincludeディレクトリのパスの変更ですが、実は最近までament_cmake_autoではこのパスの変更が反映されていなかったようでした。
(ament_cmake_autoを使わずにament_cmakeでCMakeLists.txtを書いている場合は新しいincludeディレクトリのパスに変更されています)
反映されていなかった理由については、細かくは確認できていませんが、 ament_cmake_autoがあまり使われておらず影響範囲が少ないのが要因の1つではないかと思います。 ※詳細未調査です。詳しい経緯をご存知の方、是非教えてください。
先日rollingとkiltedについてはデフォルトの挙動を変更する形で反映されました。
humbleとjazzyについては、オプションを有効化することで反映できるようになり、有効化していない場合はcolcon build時にメッセージが表示されるようになりました。
In this package, headers install destination is set to
includeby ament_auto_package. It is recommended to installinclude/ros2_build_test_packageinstead and will be the default behavior of ament_auto_package from ROS 2 Kilted Kaiju. On distributions before Kilted, ament_auto_package behaves the same way when you use USE_SCOPED_HEADER_INSTALL_DIR option.
今後のament_cmake_autoでのCMakeLists.txtの書き方
※ament_cmake_autoを使わずにament_cmakeでCMakeLists.txtを書いている場合は、 影響がないので、特に対応は必要ありません。
Rolling/Kilted
標準で新しいスタイル(include/<package_name>/<package_name> ディレクトリ)にインストールされるようになっています。
Humble/Jazzy
標準ではGalacticと同じスタイルなので、新しいスタイル(include/<package_name>/<package_name> ディレクトリ)にインストールする場合は、ament_auto_packageのUSE_SCOPED_HEADER_INSTALL_DIRオプションを有効化する必要があります。
ament_auto_package( USE_SCOPED_HEADER_INSTALL_DIR INSTALL_TO_SHARE launch param)ただし、このオプションはament_cmake_autoの2.5.4以降(バイナリ版は2025年4月末にリリースされています)でしか対応しておらず、それ以前のバージョンでは colcon build時にエラーとなる可能性があります。
参考

関連記事
- JetsonでROS1/ROS2を使う際のCUDA互換性問題と解決策古いJetson上でROS 1/ROS 2とCUDAを組み合わせる際に直面するJetPack・Compute Capability・GCCバージョンの制約と、共有ライブラリ分離やカスタムL4T Baseイメージによる解決策をまとめた調査メモ。
- (Updated )ROSパッケージ管理に使うバージョン管理ツールの違いとその使い方ROS/ROS2のパッケージ管理のためにバージョン管理について調べていると、vcstools, wstool, rosinstall, vcstoolなど様々なバージョン管理ツールやバージョン管理のためのライブラリが出てきます。 それぞれの違いや使い分けが気になって調べたので、その違いと使い方についてまとめました。
- Mini Pupper 2をROS 2 Humbleで動かすまでROSCon2022でMini Pupperの発表をしたご縁があり、本日(2025年2月3日)Makuakeでキャンペーンが始まったMini Pupper 2を一足先に入手しました。ROS 2 Humbleで動かすまでの流れを中心にROS 2開発者目線でまとめました。
- TurtleBot3 + Gazebo + Navigation2 (ROS 2 Jazzy)ROS 2 JazzyでGazebo(旧Ignition)上のTurtleBot3をNavigation2(Nav2)を動かすまで+その過程で調べたことのメモです。
- (Updated )Ubuntu 20.04と最新Intel CPUでRVizを動かすDocker設定最近ROSの開発に使用するPCを新しくしました。そこでRViz/RViz2などのOpenGLを使うソフトウェア周りでトラブルがあったので、その内容と対処方法を紹介します。