CMakeListsの項目について - Riliumph/ros2_tutorial GitHub Wiki

CMakeLists.txtの解説

ros_ws/
└ install/
  └ ${PROJECT_NAME}/
    ├ share/
    | └ ament_index/
    |   └ resource_index
    |     └ rclcpp_components/
    |${PROJECT_NAME}
    |${PROJECT_NAME}/
      └ cmake/
        ├ ament_cmake_export_include_directories-extras.cmake
        ├ ${export_target}Export.cmake
        └ ${export_target}Export-debug.cmake

ament_package

colconエコシステムのresource indexにパッケージ情報を登録 ROS2コマンドがパッケージを認識できるようになる

最後に実行するべき

ament_target_dependencies

依存関係を下流のパッケージにエクスポートする。
これにより、そのライブラリのユーザがそれらの依存関係に対してもfind_packageを呼び出さなくてもよくなる。

ament_target_dependencies(${SRV_SRV_LIB}
  "rclcpp"
  "rclcpp_action"
  "rclcpp_components"
)

ament_export_targets

install(
  TARGETS ${LIB_NAME}
  EXPORT export_${PROJECT_NAME}
  ARCHIVE DESTINATION lib
  LIBRARY DESTINATION lib
  RUNTIME DESTINATION bin
)

ament_export_targets(
  export_${PROJECT_NAME}
)

この項目は、上記のinstallが無ければ以下のエラーになるので注意。

$ colcon build --cmake-args -DCMAKE_BUILD_TYPE=Debug --packages-select fibonacci
Starting >>> fibonacci
--- stderr: fibonacci
CMake Error: INSTALL(EXPORT) given unknown export "export_fibonacci"
CMake Generate step failed.  Build files cannot be regenerated correctly.
---
Failed   <<< fibonacci [1.39s, exited with code 1]

Summary: 0 packages finished [1.54s]
  1 package failed: fibonacci
  1 package had stderr output: fibonacci

rclcpp_components_register_node

#include "rclcpp_components/register_node_macro.hpp"
RCLCPP_COMPONENTS_REGISTER_NODE(fibonacci::FibonacciServiceClient)
rclcpp_components_register_node(${SRV_CLI_LIB}
  PLUGIN "fibonacci::FibonacciServiceClient"
  EXECUTABLE ${SRV_CLI_BIN}
)

第一引数は、add_libraryで作った共有ライブラリを指定する。
これによりプログラマはコードを共有ライブラリとしてビルドするだけで、独自にrclcpp::init()などを実行するmain関数を定義する必要もなく、ROSが定義しているmain関数で動かせる。

多重spin問題

これで作成した実行バイナリは必ず、rclcpp::spin()が実行される。
この都合上、独自にspinしてしまうと多重spinで実行時エラーとなる。

サービス通信などで、rclcpp::spin_until_future_complete()を使っている際は使えない。

terminate called after throwing an instance of 'std::runtime_error'
what():  spin_until_future_complete() called while already spinning

rclcpp_components_register_nodes

出力先:install/${PROJECT_NAME}/share/ament_index/resource_index/rclcpp_components/${PROJECT_NAME}

このファイルによりros2コマンドやlaunch.yamlなどがクラス名と参照ライブラリを知ることが出来る。

<第二引数>;<ライブラリのインストールパス>
fibonacci::FibonacciServiceServer;lib/libfibonacci_service_server.so
fibonacci::FibonacciActionServer;lib/libfibonacci_action_server.so
fibonacci::FibonacciActionClient;lib/libfibonacci_action_client.so

ament_export_include_directories

出力先:install/${PROJECT_NAME}/share/fibonacci/cmake/ament_cmake_export_include_directories-extras.cmake

ヘッダファイルのパスをcmakeへ出力することで、他パッケージのmakeがパッケージ情報を取得することが出来る。

ament_export_targets

出力先:install/${PROJECT_NAME}/cmake/${ARG1}Export-debug.cmake

上記ファイルの命名を決める?

ament_export_libraries

ament_export_targetsで出力したcmakeファイルにライブラリ情報を出力する。
このファイルにより、他パッケージのmakeがパッケージ情報を取得することが出来る。

  • パッケージ情報
    • デバッグ版の共有ライブラリのパス
    • 格納されているクラス名
    • etc

ament_lint_auto_find_test_dependencies

テストの依存関係をチェックするマクロらしいが、これを有効化するとGoogle Testが必ず失敗する。
チュートリアルですら失敗する。

Starting >>> fibonacci
--- stderr: fibonacci                   
Errors while running CTest
Output from these tests are in: /workspaces/ros_ws/build/fibonacci/Testing/Temporary/LastTest.log
Use "--rerun-failed --output-on-failure" to re-run the failed cases verbosely.
---
Finished <<< fibonacci [0.17s]  [ with test failures ]

Summary: 3 packages finished [0.91s]
  1 package had stderr output: fibonacci
  1 package had test failures: fibonacci
⚠️ **GitHub.com Fallback** ⚠️