CMakeListsの項目について - Riliumph/ros2_tutorial GitHub Wiki
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
colconエコシステムのresource indexにパッケージ情報を登録 ROS2コマンドがパッケージを認識できるようになる
最後に実行するべき
依存関係を下流のパッケージにエクスポートする。
これにより、そのライブラリのユーザがそれらの依存関係に対してもfind_package
を呼び出さなくてもよくなる。
ament_target_dependencies(${SRV_SRV_LIB}
"rclcpp"
"rclcpp_action"
"rclcpp_components"
)
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
#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関数で動かせる。
これで作成した実行バイナリは必ず、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
出力先: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
出力先:install/${PROJECT_NAME}/share/fibonacci/cmake/ament_cmake_export_include_directories-extras.cmake
ヘッダファイルのパスをcmakeへ出力することで、他パッケージのmakeがパッケージ情報を取得することが出来る。
出力先:install/${PROJECT_NAME}/cmake/${ARG1}Export-debug.cmake
上記ファイルの命名を決める?
ament_export_targets
で出力したcmakeファイルにライブラリ情報を出力する。
このファイルにより、他パッケージのmakeがパッケージ情報を取得することが出来る。
- パッケージ情報
- デバッグ版の共有ライブラリのパス
- 格納されているクラス名
- etc
テストの依存関係をチェックするマクロらしいが、これを有効化すると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