Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ROS2自律走行実現に向けて / Autonomous driving realization by ROS2

ROS2自律走行実現に向けて / Autonomous driving realization by ROS2

2022年10月17日(月)に開催された、「ROS2自律走行実現に向けて~次世代ロボット開発フレームワークROS2のビルドシステム徹底理解~」セミナーの当日資料です。

今後開催する当社の無料技術セミナーは以下URLから申込いただけます。
https://connpass.com/user/fixstars/

More Decks by 株式会社フィックスターズ

Other Decks in Programming

Transcript

  1. Copyright © Fixstars Group 本日のAgenda ⚫ はじめに ⚫ フィックスターズのご紹介 ⚫

    次世代ロボット開発フレームワーク ROS2のビルドシステム徹底理解 ⚫ Q&A / 告知 2
  2. Copyright © Fixstars Group 本セミナーの位置づけ ⚫ ウェビナー「ROS2自律走行実現に向けて」シリーズでは、 自律走行する車両型ロボットの実現に向け、 ROS2を使った開発に関連する、様々な情報を発信しています ⚫

    前回の内容 ◦ ROS1上で開発した資産の活用 ◦ 自己位置推定パッケージの CUDA高速化 ⚫ 今回の内容 ◦ パッケージ開発に欠かせない ビルドシステムの解説 ⚫ こんな方に向いています ◦ ROS2 の開発をしたことがあり、ビルドシステムの正確な知識を得たい方 4
  3. Copyright © Fixstars Group 発表者紹介 5 冨田 明彦 ソリューションカンパニー 執行役員

    2008年に入社。金融、医療業界において、ソ フトウェア高速化業務に携わる。その後、新規 事業企画、半導体業界の事業を担当し、現職。 坂本 浩平 ソリューション第3事業部 シニアエンジニア 2019 年入社。入社以来自律移動車両の実証 実験や ADAS システムの開発を担当している。
  4. Copyright © Fixstars Group フィックスターズの強み コンピュータの性能を最大限に引き出す、ソフトウェア高速化のエキスパート集団 ハードウェアの知見 アルゴリズム実装力 各産業・研究分野の知見 7

    目的の製品に最適なハードウェアを見抜き、 その性能をフル活用するソフトウェアを開 発します。 ハードウェアの特徴と製品要求仕様に合わ せて、アルゴリズムを改良して高速化を実 現します。 開発したい製品に使える技術を見抜き、実 際に動作する実装までトータルにサポート します。
  5. Copyright © Fixstars Group サービス概要 お客様専任のエンジニアが直接ヒアリングを行い、高速化を実現するために乗り越えるべき 課題や問題を明確にしていきます。 高速化のワークフロー コンサルティング 先行技術調査

    性能評価・ボトルネックの特定 高速化 アルゴリズムの改良・開発 ハードウェアへの最適化 レポート作成 サポート レポートやコードへのQ&A 実製品への組込み支援 8
  6. Copyright © Fixstars Group サービス提供分野 9 半導体 自動車 産業機器 生命科学

    金融 •NAND型フラッシュメモリ向けフ ァームウェア開発 •次世代AIチップの開発環境基盤 •自動運転の高性能化、実用化 •次世代パーソナルモビリティの 研究開発 •Smart Factory実現への支援 •マシンビジョンシステムの高速化 •ゲノム解析の高速化 •医用画像処理の高速化 •AI画像診断システムの研究開発 •デリバティブシステムの高速化 •HFT(アルゴリズムトレード)の高速化
  7. Copyright © Fixstars Group サービス領域 様々な領域でソフトウェア高速化サービスを提供しています。大量データの高速処理は、 お客様の製品競争力の源泉となっています。 10 組込み高速化 画像処理・アルゴリズム

    開発 分散並列システム開発 GPU向け高速化 FPGAを活用した システム開発 量子コンピューティング AI・深層学習 自動車向け ソフトウェア開発 フラッシュメモリ向けフ ァームウェア開発
  8. Copyright © Fixstars Group 組込み高速化 組込み機器製品の計算処理実装をお手伝いしています。 お客様の課題 組込みシステムの目標性能が達成できない ターゲットデバイスの特性に合わせて、 性能要求を満たしたい

    安価なハードウェアでも処理速度を維持し 製品にかかるコストを下げたい ターゲットデバイスの例 ARM/ TOSHIBA Visconti/ Renesas R-Car/ NXP S32/ Automotive Platform/ CEVA-XM6/ Texas Instruments C6000/ Cadence Vision DSP Family など システム設計コンサルティング ハードウェア選定を含めたシステム設計のご提案 アルゴリズムの改善と移植 既存アルゴリズムを改善して計算を高速化 組込みアルゴリズム開発 ターゲットデバイス向けに最適化されたアルゴリズムを実装 ご支援内容 最適化方針のご提案 ボトルネック調査、最適化に向けた検討
  9. Copyright © Fixstars Group 画像処理アルゴリズム開発 高速な画像処理需要に対して、経験豊富なエンジニアが 責任を持って製品開発をご支援します。 お客様の課題 高度な画像処理や深層学習等のアルゴリズム を開発できる人材が社内に限られている

    機能要件は満たせそうだが、ターゲット機器 上で性能要件までクリアできるか不安 製品化に結びつくような研究ができていない ご支援内容 深層学習ネットワーク精度の改善 様々な手法を駆使して深層学習ネットワークの精度を改善 論文調査・改善活動 論文調査から最先端の手法の探索 性能向上に向けた改善活動を継続 アルゴリズム調査・改変 課題に合ったアルゴリズム・実装手法を調査 製品実装に向けて適切な改変を実施
  10. Copyright © Fixstars Group 本セミナーのねらい 15 ⚫ ROS2 を開発していてビルド面で困ることがよくある ◦

    C++ パッケージを作ろうとして CMake を書いたがビルドエラー/実行時エラーになる ◦ Python パッケージを作ったが、設定ファイルの意味がわからない ⚫ 本セミナーでは上記の状況に対してビルドシステムの解説を行う ⚫ 本セミナーでのサンプルは ROS2 humble での実行確認済み ◦ サンプルコード公開 : https://github.com/fixstars/ros2-seminar-ament-sample
  11. Copyright © Fixstars Group ROS2 ビルドシステム概要 17 colcon ament_cmake catkin

    cmake ament_python ⚫ ROS2 ではパッケージ単位のモジュールとして各機能が提 供されている ⚫ パッケージ単位でビルドツール切り替えが可能 ◦ ROS1 パッケージや非 ROS パッケージ (例: Gazebo) もビルド可能 ⚫ ビルドの管理を colcon で行う ◦ パッケージ間の依存管理 ◦ 各パッケージのビルドツールの呼び出し ◦ ビルド時/実行時の環境設定 ⚫ ROS2 向けビルドは ament で行う ◦ C++: ament_cmake (CMake 拡張) ◦ Python: ament_python その他 packages
  12. Copyright © Fixstars Group アジェンダ 18 1. colcon コマンドと package.xml

    2. ament_cmake 3. ament_cmake の発展的な使い方 4. ament_cmake_auto 5. ament_python
  13. Copyright © Fixstars Group colcon コマンドと package.xml 目次 20 1.1

    colcon コマンド概要 1.2 コマンドライン引数 1.3 ログ出力 1.4 colcon mixin 1.5 package.xml 1.6 パッケージ探索、依存解析 colcon ament_cmake catkin cmake ament_python その他 packages
  14. Copyright © Fixstars Group 1.1 colcon コマンド概要 21 ⚫ 複数のパッケージのビルド、テストを容易に行うビルドシステム

    ◦ パッケージ間の依存関係の管理 ◦ ビルド、テスト対象パッケージの選択 ◦ ビルドツールを呼び出しパッケージビルド ◦ ビルド環境のセットアップ ▪ 複数パッケージで環境を分離する ◦ 実行環境の export ⚫ 実行方法 ◦ colcon <verb> …. という形式で実行する ▪ <verb>: build, test … ⚫ ユーザーで拡張可能: Extension points ⚫ ユーザードキュメント
  15. Copyright © Fixstars Group 1.1 colcon の verb 22 ⚫

    build: パッケージビルドを行う ⚫ test, test_result: パッケージのテストを行う ⚫ info, list, graph: パッケージ情報の取得 ⚫ mixin: mixin の管理 ⚫ metadata: メタデータの管理 ◦ (使用頻度は低いと思われる)
  16. Copyright © Fixstars Group 1.2 colcon のコマンドライン引数 23 ⚫ verb

    ごとにコマンドライン引数が違う ⚫ よく使うコマンドライン引数 ◦ ディレクトリ管理 ◦ パッケージ選択 ◦ ビルドツール/テストツールへの引数引渡し ◦ その他
  17. Copyright © Fixstars Group 1.2 colcon のコマンドライン引数例 24 ⚫ ディレクトリ管理

    ◦ colcon build --install-base: インストール先ディレクトリを変える ⚫ パッケージ選択 ◦ colcon test --packages-select: 選択したパッケージのみ処理 (test の場合テスト) する ⚫ ビルドツールへの引数引渡し ◦ colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release: CMake にて Release ビルドする ⚫ その他引数 ◦ colcon build --symlink-install: インストール時にシンボリックリンク作成でインストールする ▪ launch ファイル/パラメータファイルの変更後に再インストールが必要ない ◦ colcon build --event-handlers console_direct+: ビルド時のログをコンソール出力する
  18. Copyright © Fixstars Group 1.3 colcon のログ制御 25 ⚫ 標準では

    colcon はターミナル出力をほとんどしない ◦ ターミナル出力には --event-handlers console_direct+ の指定が必要 ⚫ ログはログディレクトリに出力される ◦ 標準では log/${verb}_${timestamp} に出力 ◦ --log-base 引数で変更可能 ⚫ colcon コマンドログレベルは --log-level 引数で変更可能 ◦ 設定値は Python ログレベルと同様 ⚫ --log-base, --log-level 引数は colcon コマンドの直後に記述する ◦ colcon --log-level INFO build
  19. Copyright © Fixstars Group 1.4 colcon mixin 26 ⚫ colcon

    コマンド引数の定義済み設定 ◦ colcon の mixin Github レポジトリ では CMake のフラグを設定するものが多い ◦ ユーザー定義もできる ⚫ 使用目的 ◦ 煩雑なビルド引数設定の簡略化 ⚫ 使い方 ◦ 準備: mixin 登録 (一回行えばよい) $ colcon mixin add default ¥ https://raw.githubusercontent.com/colcon/colcon-mixin-repository/master/index.yaml $ colcon mixin update
  20. Copyright © Fixstars Group 1.4 colcon mixin 27 ⚫ 使い方

    ◦ 詳細確認 (build で使える mixin の詳細を確認する) ▪ colcon build --help ◦ ビルド時の使用: colcon build --mixin debug ▪ これで –DCMAKE_BUILD_TYPE=Debug が CMake に渡される Mixin predefined sets of command line parameters: --mixin-files [FILE ...] Additional files providing mixins --mixin [mixin1 [mixin2 ...]] The following mixins are available: * debug: - cmake-args: ['-DCMAKE_BUILD_TYPE=Debug']
  21. Copyright © Fixstars Group 1.5 package.xml 28 ⚫ XML で書かれたパッケージマニフェストファイル

    ◦ ros2 pkg create で生成される package.xml を修正していけばよい ◦ colcon はここに書かれた依存情報をもとにパッケージ間の依存を解析する ⚫ 記述内容 (XML タグ) ◦ パッケージの管理情報 ▪ name, version, description, maintainer, license ... ◦ パッケージ間の依存管理 ▪ depend, build_depend … ◦ パッケージ export 情報 ▪ export ⚫ 仕様: REP-149
  22. Copyright © Fixstars Group 1.5 package.xml サンプル 29 <?xml version="1.0"?>

    <?xml-model href=http://download.ros.org/schema/package_format3.xsd schematypens="http://www.w3.org/2001/XMLSchema"?> <package format="3"> <name>test_package</name> <version>0.0.0</version> <description>TODO: Package description</description> <maintainer email=“[email protected]">vscode</maintainer> <license>TODO: License declaration</license> <buildtool_depend>ament_cmake</buildtool_depend> <test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_common</test_depend> <export> <build_type>ament_cmake</build_type> </export> </package>
  23. Copyright © Fixstars Group 1.5 package.xml による依存設定 (1) 30 ⚫

    他のパッケージへの依存を指定する ◦ package.xml がない CMake ライブラリ, システムパッケージも指定可 ⚫ 依存設定指定タグ ◦ build_depend: ビルド時の依存指定 ◦ build_export_depend: ビルド時に必要な export の依存指定 ▪ 例: ビルドにパッケージのヘッダファイルのみが必要な場合 ◦ exec_depend: 実行時の依存指定 ◦ depend: build_depend, build_export_depend, exec_depend すべての指定 ◦ test_depend: テスト時の依存指定 ▪ Linter パッケージ等 ◦ buildtool_depend: ビルド時に使用するツールの指定
  24. Copyright © Fixstars Group 1.5 package.xml による依存設定 (2) 31 ⚫

    member_of_group/group_depend ◦ あるタイプのパッケージすべてに依存するが依存を明示的に指定できないときに使う ◦ 例: ros1_bridge ▪ メッセージパッケージすべてに依存するが依存対象となるメッセージパッケージがどれか はビルド時までわからない ◦ 被依存側に member_of_group を設定して依存側に group_depend を設定することで実現 ▪ メッセージパッケージに <member_of_group>rosidl_interface_packages</member_of_group> を指定する
  25. Copyright © Fixstars Group 1.6 パッケージ探索、依存解析 32 ⚫ パッケージ探索 ◦

    デフォルトでは colcon 実行ディレクトリを再帰的に探索する ▪ colcon コマンド引数で探索先を設定された場合それに従う ◦ COLCON_IGNORE ファイルが配置されたディレクトリから先は探索しない ⚫ 探索対象 (パッケージ判定) ◦ package.xml があるディレクトリ ◦ package.xml がないが CMakeLitst.txt (C++) または setup.py/setup.cfg (Python) のあるディレクトリ ⚫ 依存解析 ◦ package.xml があれば、package.xml の依存情報を使う ◦ package.xml がない場合、 CMakeLitst.txt や setup.py/setup.cfg の依存情報を使う ◦ 解析した情報をもとにパッケージのビルド順を決定する ◦ 自己依存や循環依存があるとビルドできない
  26. Copyright © Fixstars Group ament_cmake 目次 34 2.1 ament_cmake 概要

    2.2 ライブラリ/ノードパッケージ設定 2.3 Launch, パラメータファイルインストール 2.4 単体テスト, Linter設定 2.5 メッセージパッケージ設定 colcon ament_cmake catkin cmake ament_python その他 packages
  27. Copyright © Fixstars Group 2.1 ament_cmake 概要 35 ⚫ ROS2

    向けのパッケージビルドツール ⚫ CMake の ROS2 向け拡張 ◦ パッケージ探索、Export 設定、メッセージ生成 ⚫ ユーザーで拡張可能 ⚫ ユーザーガイド
  28. Copyright © Fixstars Group 2.2 ライブラリ/ノードパッケージ設定 36 ⚫ ライブラリとノードの CMakeLists.txt

    の設定方法 ⚫ 以下の 3 パッケージを作成する ◦ CMake 共有ライブラリ: simple_library ◦ ament_cmake 共有ライブラリ: simple_ament_library ▪ simple_library に依存している ◦ ROS2ノード: simple_package ▪ simple_library, simple_ament_library に依存している simple_package simple_library simple_ament_library
  29. Copyright © Fixstars Group 2.2 CMake 共有ライブラリ設定 (1) 37 ⚫

    CMake の共有ライブラリの設定方法 simple_package simple_library simple_ament_library
  30. Copyright © Fixstars Group 2.2 CMake 共有ライブラリ設定 (1) 38 cmake_minimum_required(VERSION

    3.8) project(simple_library) add_library(${PROJECT_NAME} src/simple.cpp include/simple_library/simple.hpp) target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>) set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER include/simple_library/simple.hpp) install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}-config LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION include/${PROJECT_NAME}) install(EXPORT ${PROJECT_NAME}-config DESTINATION lib/cmake/${PROJECT_NAME})
  31. Copyright © Fixstars Group 2.2 CMake 共有ライブラリ設定 (2) 39 cmake_minimum_required(VERSION

    3.8) project(simple_library) add_library(${PROJECT_NAME} src/simple.cpp include/simple_library/simple.hpp) target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>) set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER include/simple_library/simple.hpp) install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}-config LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION include/${PROJECT_NAME}) install(EXPORT ${PROJECT_NAME}-config DESTINATION lib/cmake/${PROJECT_NAME}) パッケージ名と同じである必要がある インクルード設定 参照 : CMake ドキュメント インストール設定 参照 : CMake ドキュメント
  32. Copyright © Fixstars Group 2.2 CMake 共有ライブラリ設定 (3) 40 cmake_minimum_required(VERSION

    3.8) project(simple_library) add_library(${PROJECT_NAME} src/simple.cpp include/simple_library/simple.hpp) target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>) set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER include/simple_library/simple.hpp) install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}-config LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION include/${PROJECT_NAME}) install(EXPORT ${PROJECT_NAME}-config DESTINATION lib/cmake/${PROJECT_NAME}) ライブラリソース インストール設定 (Export) public ヘッダ設定
  33. Copyright © Fixstars Group 2.2 ament_cmake 共有ライブラリ設定 (1) 41 ⚫

    ament_cmake を使った共有ライブラリの設定方法 ◦ simple_library への依存がある simple_package simple_library simple_ament_library
  34. Copyright © Fixstars Group 2.2 ament_cmake 共有ライブラリ設定 (2) 42 cmake_minimum_required(VERSION

    3.8) project(simple_ament_library) find_package(ament_cmake REQUIRED) find_package(simple_library REQUIRED) add_library(${PROJECT_NAME} SHARED src/simple.cpp include/simple_ament_library/simple.hpp) target_link_libraries(${PROJECT_NAME} simple_library) target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>) ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET) ament_export_libraries(${PROJECT_NAME}) ament_export_dependencies(simple_library) install(TARGETS ${PROJECT_NAME} EXPORT export_${PROJECT_NAME} LIBRARY DESTINATION lib) install(DIRECTORY include/ DESTINATION include) ament_package()
  35. Copyright © Fixstars Group 2.2 ament_cmake 共有ライブラリ設定 (3) 43 cmake_minimum_required(VERSION

    3.8) project(simple_ament_library) find_package(ament_cmake REQUIRED) find_package(simple_library REQUIRED) add_library(${PROJECT_NAME} SHARED src/simple.cpp include/simple_ament_library/simple.hpp) target_link_libraries(${PROJECT_NAME} simple_library) target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>) ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET) ament_export_libraries(${PROJECT_NAME}) ament_export_dependencies(simple_library) install(TARGETS ${PROJECT_NAME} EXPORT export_${PROJECT_NAME} LIBRARY DESTINATION lib) install(DIRECTORY include/ DESTINATION include) ament_package() find_package による 依存パッケージ探索 ライブラリ依存設定 ヘッダの探索にも必要 PUBLIC_HEADER を使わない場合 ヘッダは別個にインストール必要
  36. Copyright © Fixstars Group 2.2 ament_cmake 共有ライブラリ設定 (4) 44 cmake_minimum_required(VERSION

    3.8) project(simple_ament_library) find_package(ament_cmake REQUIRED) find_package(simple_library REQUIRED) add_library(${PROJECT_NAME} SHARED src/simple.cpp include/simple_ament_library/simple.hpp) target_link_libraries(${PROJECT_NAME} simple_library) target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>) ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET) ament_export_libraries(${PROJECT_NAME}) ament_export_dependencies(simple_library) install(TARGETS ${PROJECT_NAME} EXPORT export_${PROJECT_NAME} LIBRARY DESTINATION lib) install(DIRECTORY include/ DESTINATION include) ament_package() 共有ライブラリを作成する場合 SHARED 指定する ※ ament_cmake では デフォルトが静的ライブラリ ament_cmake での Export 設定 CMakeFile.txt の最後に必要
  37. Copyright © Fixstars Group 2.2 ROS2 ノード設定 (1) 45 ⚫

    ROS2 ノードの設定方法 ◦ これまでと違い実行バイナリを生成する ◦ simple_library, simple_ament_library への依存がある simple_package simple_library simple_ament_library
  38. Copyright © Fixstars Group 2.2 ROS2 ノード設定 (2) 46 cmake_minimum_required(VERSION

    3.8) project(simple_package) find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(simple_library REQUIRED) find_package(simple_ament_library REQUIRED) add_executable(${PROJECT_NAME} src/simple_package.cpp include/simple_package/simple_package_node.hpp) ament_target_dependencies(${PROJECT_NAME} rclcpp simple_ament_library) target_link_libraries(${PROJECT_NAME} simple_library) target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>) install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION lib/${PROJECT_NAME}) ament_package()
  39. Copyright © Fixstars Group 2.2 ROS2 ノード設定 (3) 47 cmake_minimum_required(VERSION

    3.8) project(simple_package) find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(simple_library REQUIRED) find_package(simple_ament_library REQUIRED) add_executable(${PROJECT_NAME} src/simple_package.cpp include/simple_package/simple_package_node.hpp) ament_target_dependencies(${PROJECT_NAME} rclcpp simple_ament_library) target_link_libraries(${PROJECT_NAME} simple_library) target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>) install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION lib/${PROJECT_NAME}) ament_package() ノードなので rclcpp への依存がある ros2 run/launch で発見して もらうために lib にインストール ament_cmake パッケージと CMake パッケージで 依存設定コマンドが違う
  40. Copyright © Fixstars Group 2.3 Launch, パラメータファイルインストール 48 ⚫ 右のような構成をインストールする

    CMakeLists.txt 追加設定 package.xml 追加設定 . ├── CMakeLists.txt ├── config │ └── simple_param.yaml ├── launch │ └── with_param.launch.py └── package.xml <exec_depend>ros2launch</exec_depend> install(DIRECTORY launch config DESTINATION share/${PROJECT_NAME}) これでインストールディレクトの launch/config にインストールされる
  41. Copyright © Fixstars Group 2.4 単体テスト、Linter 設定 (1) 49 ⚫

    colcon test で行うテストの設定 ◦ package.xml テスト依存設定 ▪ ament_cmake_gtest ▪ 使用したい linter ◦ CMakeLists.txt 設定 ▪ if(BUILD_TESTING) でテスト設定 package.xml 設定 CMakeLists.txt 設定 if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) ament_lint_auto_find_test_dependencies() set(TEST_NAME ${PROJECT_NAME}_test) find_package(ament_cmake_gtest REQUIRED) ament_add_gtest(${TEST_NAME} test/test_example.cpp) target_link_libraries( ${TEST_NAME} ${PROJECT_NAME}) endif() <test_depend>ament_cmake_gtest</test_depend> <test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_common</test_depend>
  42. Copyright © Fixstars Group 2.4 単体テスト、Linter 設定 (2) 50 package.xml

    設定 CMakeLists.txt 設定 if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) ament_lint_auto_find_test_dependencies() set(TEST_NAME ${PROJECT_NAME}_test) find_package(ament_cmake_gtest REQUIRED) ament_add_gtest(${TEST_NAME} test/test_example.cpp) target_link_libraries( ${TEST_NAME} ${PROJECT_NAME}) endif() <test_depend>ament_cmake_gtest</test_depend> <test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_common</test_depend> C/C++ gtest への依存 ament_lint_auto と 実行したい linter パッケージへの 依存を書く ament_lint_auto_find_test_dependencies すれば個別の linter 設定は不要 テストバイナリ作成設定
  43. Copyright © Fixstars Group 2.5 メッセージパッケージ設定 51 package.xml 設定 CMakeLists.txt

    設定 <build_depend>rosidl_default_generators</build_depend> <exec_depend>rosidl_default_runtime</exec_depend> <member_of_group>rosidl_interface_packages</member_of_group> find_package(rosidl_default_generators REQUIRED) rosidl_generate_interfaces(${PROJECT_NAME} msg/Simple.msg ) rosidl への依存設定 *.msg: メッセージ定義 *.srv: サービス定義 *.action: アクション定義
  44. Copyright © Fixstars Group ament_cmake の発展的な使い方 53 3.1 プラグイン作成 3.2

    ament 拡張 3.3 リソース登録 colcon ament_cmake catkin cmake ament_python その他 packages
  45. Copyright © Fixstars Group 3.1 プラグイン作成 54 ⚫ ament_cmake ではプラグインを作成できる

    ◦ I/F となる抽象ベースクラスを定義し、それを実装したコードを実行時にロードさせる ◦ ユーザーはプラグイン使用側の再ビルドなしに自分のコードを実行できる ◦ 例: rviz2, navigation2 ⚫ 作成に必要なパッケージ ◦ プラグインの元となるベースクラスパッケージ: simple_plugin_base ◦ プラグインを実装するパッケージ: simple_plugin namespace simple_plugin { class SimplePluginBase { public: virtual void Print() = 0; }; }
  46. Copyright © Fixstars Group 3.1 simple_plugin_base 作成 56 ⚫ 特別な設定は必要ない

    ◦ pluginlib への依存も不要 simple_plugin_base simple_plugin プラグイン使用側
  47. Copyright © Fixstars Group 3.1 simple_plugin_base CMake 設定 57 cmake_minimum_required(VERSION

    3.8) project(simple_plugin_base) find_package(ament_cmake) add_library(${PROJECT_NAME} INTERFACE) target_include_directories(${PROJECT_NAME} INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>) install(DIRECTORY include/ DESTINATION include/ ) ament_export_include_directories(include) ament_package() ヘッダファイルのみのライブラリのため INTERFACE 指定する
  48. Copyright © Fixstars Group 3.1 simple_plugin 作成 58 ⚫ 以下が必要

    ◦ package.xml の設定 ◦ プラグイン記述 XML ファイルの作成 ◦ CMakeLists.xml の設定 ◦ ソースコードでのマクロ呼び出し ⚫ 失敗すると実行時にプラグインがロードされない simple_plugin_base simple_plugin プラグイン使用側
  49. Copyright © Fixstars Group 3.1 simple_plugin の package.xml 設定 (1)

    59 <depend>simple_plugin_base</depend> <depend>pluginlib</depend> <export> <build_type>ament_cmake</build_type> <!-- simple_plugin_base plugin="${prefix}/plugins_description.xml"/ --> </export>
  50. Copyright © Fixstars Group 3.1 simple_plugin の package.xml 設定 (2)

    60 <depend>simple_plugin_base</depend> <depend>pluginlib</depend> <export> <build_type>ament_cmake</build_type> <!-- simple_plugin_base plugin="${prefix}/plugins_description.xml"/ --> </export> ベースクラスパッケージと plubinlib への依存が必要 ROS2 では不要
  51. Copyright © Fixstars Group 3.1 simple_plugin のプラグイン記述 XML 設定 61

    <library path="simple_plugin"> <class name="simple_plugin/SimplePlugin“ type="simple_plugin::SimplePlugin" base_class_type="simple_plugin::SimplePluginBase"> <description>This is a sample plugin.</description> </class> </library>
  52. Copyright © Fixstars Group 3.1 simple_plugin のプラグイン記述 XML 設定 62

    <library path="simple_plugin"> <class name="simple_plugin/SimplePlugin" type="simple_plugin::SimplePlugin" base_class_type="simple_plugin::SimplePluginBase"> <description>This is a sample plugin.</description> </class> </library> path にはパッケージ名を入れる - name: プラグインロードする際のキー - type: プラグインクラス名 - base_class_type: プラグインベースクラス名 ※ name は省略可、省略した場合は type がプラグインロードのキーになる
  53. Copyright © Fixstars Group 3.1 simple_plugin CMakeLists.txt 追加設定 63 find_package(pluginlib

    REQUIRED) find_package(simple_plugin_base REQUIRED) ament_target_dependencies(${PROJECT_NAME} pluginlib simple_plugin_base) ament_export_dependencies(simple_plugin_base) pluginlib_export_plugin_description_file( simple_plugin_base plugins_description.xml)
  54. Copyright © Fixstars Group 3.1 simple_plugin CMakeLists.txt 追加設定 64 find_package(pluginlib

    REQUIRED) find_package(simple_plugin_base REQUIRED) ament_target_dependencies(${PROJECT_NAME} pluginlib simple_plugin_base) ament_export_dependencies(simple_plugin_base) pluginlib_export_plugin_description_file( simple_plugin_base plugins_description.xml) pluginlib および ベースクラスパッケージへの依存 第一引数がベースクラスパッケージ 第二引数がプラグイン記述 XML ファイルパス
  55. Copyright © Fixstars Group 3.1 simple_plugin 実装 65 #include <iostream>

    #include <simple_plugin_base/simple_plugin_base.hpp> namespace simple_plugin { class SimplePlugin : public SimplePluginBase { public: virtual void Print() override { std::cout << "inside SimplePlugin" << std::endl; } }; } #include <pluginlib/class_list_macros.hpp> PLUGINLIB_EXPORT_CLASS( simple_plugin::SimplePlugin, simple_plugin::SimplePluginBase) PLUGINLIB_EXPORT_CLASS で クラスローダ―への登録が必要
  56. Copyright © Fixstars Group 3.1 プラグイン使用側作成 66 ⚫ pluginlib を使ってプラグインをロードする

    ◦ pluginlib, simple_plugin_base への依存が必要 ◦ simple_plugin への依存は不要 simple_plugin_base simple_plugin プラグイン使用側
  57. Copyright © Fixstars Group 3.1 プラグイン使用側実装 (1) 67 pluginlib::ClassLoader<simple_plugin::SimplePluginBase> simple_plugin_loader(

    "simple_plugin_base", "simple_plugin::SimplePluginBase"); try { auto simple_plugin = simple_plugin_loader.createSharedInstance( "simple_plugin/SimplePlugin"); simple_plugin->Print(); } catch (pluginlib::PluginlibException& ex) { printf("Load error: %s¥n", ex.what()); } }
  58. Copyright © Fixstars Group 3.1 プラグイン使用実装 (2) 68 pluginlib::ClassLoader<simple_plugin::SimplePluginBase> simple_plugin_loader(

    "simple_plugin_base", "simple_plugin::SimplePluginBase"); try { auto simple_plugin = simple_plugin_loader.createSharedInstance( "simple_plugin/SimplePlugin"); simple_plugin->Print(); } catch (pluginlib::PluginlibException& ex) { printf("Load error: %s¥n", ex.what()); } 第一引数がベースクラスパッケージ 第二引数がベースクラス プラグイン記述 XML ファイルで記述した プラグイン名を指定する
  59. Copyright © Fixstars Group 3.2 ament 拡張 69 ⚫ ament

    を拡張することができる ◦ コマンド登録 ▪ 他のパッケージからよばれるコマンドの登録 ◦ ExtensionPoint 登録 ▪ 特定のコマンド実行時にユーザーの CMake ファイルを実行する • ament_package, rosidl_generate_interfaces などが呼ばれたときに自分の CMake ファイルを実行させることができる ⚫ ユーザーガイド#Extending ament ⚫ 参考パッケージ: ament_lint_auto
  60. Copyright © Fixstars Group 3.2 リソース登録 70 ⚫ リソース登録/探索のシステムが用意されている ◦

    リソースの例 ▪ rviz2 のメッシュファイル ▪ pluginlib のプラグイン記述 XML ファイル ◦ プラグイン使用側で必要なファイルをプラグイン提供側で登録するのに必要 ⚫ ユーザーガイド#Adding_resources ⚫ 参考パッケージ: pluginlib
  61. Copyright © Fixstars Group ament_cmake_auto 目次 72 4.1 ament_cmake_auto 概要

    4.2 ノードパッケージ作成 4.3 ライブラリパッケージ作成 4.4 単体テスト設定 colcon ament_cmake catkin cmake ament_python その他 packages
  62. Copyright © Fixstars Group 4-1 ament_cmake_auto 概要 73 ⚫ これまでに見てきた

    ament_cmake の設定を自動化してくれる 1. 依存パッケージ解決 2. インストール設定 3. Export 設定 ⚫ 提供 CMake マクロ ◦ 依存パッケージ探索 ▪ ament_auto_find_build_dependencies, ament_auto_find_test_dependencies ◦ インストール, Export 設定 ▪ ament_auto_add_executable, ament_auto_add_library, ament_auto_add_gtest ◦ ament_auto_package を最後に呼び出す
  63. Copyright © Fixstars Group 4-2 ノードパッケージ作成 74 ⚫ ament_cmake_auto を使えば非常に簡単に書ける

    package.xml 追加設定 CMakeLists.txt 全体 <buildtool_depend>ament_cmake_auto</buildtool_depend> <depend>rclcpp</depend> cmake_minimum_required(VERSION 3.8) project(ament_cmake_auto_node) find_package(ament_cmake_auto REQUIRED) ament_auto_find_build_dependencies() ament_auto_add_executable(${PROJECT_NAME} DIRECTORY src) ament_auto_package()
  64. Copyright © Fixstars Group 4-3 ライブラリパッケージ作成 75 ⚫ ament_auto_add_library でライブラリソースをヘッダごと指定すればよい

    cmake_minimum_required(VERSION 3.8) project(ament_cmake_auto_library) find_package(ament_cmake_auto REQUIRED) ament_auto_find_build_dependencies() ament_auto_add_library(${PROJECT_NAME} SHARED DIRECTORY src include) ament_auto_package() 共有ライブラリを作るときは SHARED を指定する
  65. Copyright © Fixstars Group 4-4 単体テスト設定 76 ⚫ ament_auto_find_test_dependencies で依存設定を行い

    ⚫ ament_auto_add_gtest でテストファイル登録を行う if(BUILD_TESTING) set(TEST_NAME ${PROJECT_NAME}_test) ament_auto_find_test_dependencies() ament_auto_add_gtest(${TEST_NAME} test/test_example.cpp) endif()
  66. Copyright © Fixstars Group ament_python 目次 78 5-1 ament_python 概要

    5-2 デフォルト作成ファイル解説 5-3 ノードパッケージ作成 5-4 Launch, パラメータファイルインストール 5-5 ament_cmake_python colcon ament_cmake catkin cmake ament_python その他 packages
  67. Copyright © Fixstars Group 5-1 ament_python 概要 79 ⚫ colcon

    での Python パッケージ生成ツール ⚫ Setuptools でパッケージを設定できる ◦ ROS1 では Python パッケージであっても CMakeLists.txt を書く必要があった ⚫ ament_python 設定法 ◦ Setuptools の記法に従って設定すればよい ◦ CMake に対する ament_cmake のような ROS2 拡張はない模様
  68. Copyright © Fixstars Group 5-1 Setuptools 80 ⚫ Python のパッケージングツール

    ⚫ setup.py と setup.cfg に設定を書く ◦ 現在 pyproject.toml への移行を行っているが一部対応がβ ▪ 今後 ROS2 でも pyproject.toml で設定を書く方向になるかもしれない ⚫ 公式ドキュメント
  69. Copyright © Fixstars Group 5-2 デフォルト作成ファイル解説 81 ⚫ ros2 pkg

    create --build-type ament_python test_python_package ファイル ◦ package.xml: マニフェストファイル ◦ resource/test_python_package: パッケージ探索に使うマーカーファイル ◦ setup.cfg/setup.py: Setuptools 設定 ◦ test/*: pytest スクリプト置き場 ▪ 実はどこに配置しても pytest 対象になる ◦ test_python_package: パッケージソース置き場 . ├── package.xml ├── resource │ └── test_python_package ├── setup.cfg ├── setup.py ├── test │ ├── test_copyright.py │ ├── test_flake8.py │ └── test_pep257.py └── test_python_package └── __init__.py
  70. Copyright © Fixstars Group 5-2 デフォルト setup.py 解説 (1) 82

    from setuptools import setup package_name = 'test_python_package' setup( name=package_name, version='0.0.0', packages=[package_name], data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), ], install_requires=['setuptools'], zip_safe=True, maintainer='vscode’, maintainer_email=‘[email protected]', description='TODO: Package description', license='TODO: License declaration', tests_require=['pytest'], entry_points={ 'console_scripts': [], }, )
  71. Copyright © Fixstars Group 5-2 デフォルト setup.py 解説 (2) 83

    from setuptools import setup package_name = 'test_python_package' setup( name=package_name, version='0.0.0', packages=[package_name], data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), ], install_requires=['setuptools'], zip_safe=True, maintainer='vscode’, maintainer_email=‘[email protected]', description='TODO: Package description', license='TODO: License declaration', tests_require=['pytest'], entry_points={ 'console_scripts': [], }, ) パッケージソースディレクトリ設定 テスト依存パッケージ設定
  72. Copyright © Fixstars Group 5-2 デフォルト setup.py 解説 (3) 84

    from setuptools import setup package_name = 'test_python_package' setup( name=package_name, version='0.0.0', packages=[package_name], data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), ], install_requires=['setuptools'], zip_safe=True, maintainer='vscode’, maintainer_email=‘[email protected]', description='TODO: Package description', license='TODO: License declaration', tests_require=['pytest'], entry_points={ 'console_scripts': [], }, ) ファイルコピー設定 パッケージマーカーファイルと Packge.xml をコピー コンソールコマンドの エントリーポイント
  73. Copyright © Fixstars Group ⚫ デフォルトで設定されているのは Setuptools のコマンド引数 ◦ [develop]:

    develop 環境へのインストール時設定 ◦ [install]: パッケージインストール時設定 ◦ ROS2 では実行ファイルは lib に置かれるので設定が必要 ⚫ 引数の詳細は python3 setup.py install --help 等で確認できる 5-2 デフォルト setup.cfg 解説 85 [develop] script_dir=$base/lib/test_python_package [install] install_scripts=$base/lib/test_python_package
  74. Copyright © Fixstars Group 5-3 ノードパッケージ作成 86 ⚫ 以下のノードを動かす設定 ◦

    simple_python_node がパッケージのルート ◦ simple_python_node.py がコマンドスクリプト ▪ main 関数から動かす . ├── setup.py └── simple_python_node ├── __init__.py └── simple_python_node.py setup( entry_points={ 'console_scripts': [ 'simple_node=simple_python_node.simple_python_node:main', ], }, ) console_scripts に動かすスクリプトを設定する 書式は ‘<コマンド名>=<呼び出しスクリプトのモジュール名>:<呼び出し関数>’
  75. Copyright © Fixstars Group 5-4 Launch, パラメータファイルインストール 87 ⚫ 右のような構成をインストールする

    setup.py 追加設定 package.xml 追加設定 . ├── config │ └── simple_param.yaml ├── launch │ └── with_param.launch.py ├── setup.cfg ├── setup.py └── package.xml <exec_depend>ros2launch</exec_depend> data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), # Launch ファイルインストール ('share/' + package_name + '/launch', glob('launch/*.launch.py')), # Param ファイルインストール ('share/' + package_name + '/config', glob('config/*.yaml')) ],
  76. Copyright © Fixstars Group 5-5 ament_cmake_python 88 ⚫ ament_cmake 中に

    Python スクリプトを混ぜたいときに使う ⚫ 公式ドキュメント ⚫ Python モジュールをインストールするには package.xml と CMakeLists.txt で以下の記述を行えばよい ◦ これだけで登録したモジュールを他のパッケージから使える package.xml 追加設定 CMakeLists.txt 追加設定 <buildtool_depend>ament_cmake</buildtool_depend> <buildtool_depend>ament_cmake_python</buildtool_depend> find_package(ament_cmake_python REQUIRED) ament_python_install_package(${PROJECT_NAME})
  77. Copyright © Fixstars Group 5-5 ament_cmake_python によるコマンド登録 (1) 89 ⚫

    ament_cmake_python にて ros2 run で実行できるコマンドを登録する ◦ CMakeLists.txt, スクリプトへの追加設定が必要 CMakeLists.txt 追加設定 スクリプト冒頭 find_package(ament_cmake_python REQUIRED) ament_python_install_package(${PROJECT_NAME}) install(PROGRAMS ament_cmake_python_test/ament_cmake_python_test.py DESTINATION lib/${PROJECT_NAME} ) #!/usr/bin/env python3
  78. Copyright © Fixstars Group 5-5 ament_cmake_python によるコマンド登録 (2) 90 ⚫

    ament_cmake_python にて ros2 run で実行できるコマンドを登録する ◦ CMakeLists.txt, スクリプトへの追加設定が必要 CMakeLists.txt 追加設定 スクリプト冒頭 find_package(ament_cmake_python REQUIRED) ament_python_install_package(${PROJECT_NAME}) install(PROGRAMS ament_cmake_python_test/ament_cmake_python_test.py DESTINATION lib/${PROJECT_NAME} ) #!/usr/bin/env python3 直接実行されるので シバンが必要 PROGRAMS 設定で lib にインストールして 実行属性をつける ※ --symlink-install する場合は ソースファイル自体に実行属性が必要
  79. Copyright © Fixstars Group 参考サイト : ROS2 ビルドシステム、colcon 92 ⚫

    ROS2 Design: A universal build tool ⚫ ROS2 document: About the build system ⚫ colcon document ⚫ colcon Github ⚫ REP149: Package Manifest Format Three Specification ⚫ ros_core: Core Stack Developer Overview
  80. Copyright © Fixstars Group 参考サイト : ament_cmake 93 ⚫ ROS2

    document: ament_cmake user documentation ⚫ ROS2 document: Creating and using plugins (C++) ⚫ ament_cmake Github ⚫ ament_cmake Github: resource_index document ⚫ pluginlib Github ◦ ※ レポジトリ自体は ROS1 と共通 ⚫ CMake document
  81. Copyright © Fixstars Group 参考サイト : ament_python 94 ⚫ ROS2

    document: ament_cmake_python user documentation ⚫ Setuptools document
  82. Copyright © Fixstars Group A1 colcon のディレクトリ管理引数 97 ⚫ --build-base:

    ビルド時の一時ディレクトリ設定 ⚫ --install-base: インストール先のディレクトリ設定 ⚫ --test-result-base: テスト結果配置場所設定 ⚫ --log-base: ログ配置場所設定 ⚫ 上記の引数は--log-base以外はサブコマンドの後に配置する。 ◦ 例: colcon build --build-base ... ◦ 例: colcon --log-base … build
  83. Copyright © Fixstars Group A1 colcon のパッケージ選択引数 98 ⚫ 指定パッケージを選択

    ◦ --packages-select, --packages-select-regex ⚫ 指定パッケージおよび指定パッケージの依存パッケージを選択 ◦ --packages-up-to, --packages-up-to-regex ⚫ 指定パッケージとそれに依存するパッケージを選択 ◦ --packages-above, --packages-above-and-dependencies ▪ and-dependencies は packages-up-to も同時に選択される ⚫ 指定パッケージを無視 ◦ --packages-skip, --packages-skip-regex ⚫ 複数の条件を指定すると and を取る
  84. Copyright © Fixstars Group A1 colcon のビルド/テストツール渡し引数 99 ⚫ ビルドツール

    (ament_cmake/catkin/cmake) に引数を引き渡せる ◦ --ament-cmake-args, --catkin-cmake-args, --cmake-args ◦ 例: -DCMAKE_BUILD_TYPE (ビルドタイプ指定) ▪ colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release ◦ 例: -DCMAKE_VERBOSE_MAKEFILE=1 (ビルド時の詳細ログ生成) ▪ colcon build --cmake-args -DCMAKE_VERBOSE_MAKEFILE=1 ⚫ テストツールにも引数を引き渡せる ◦ --ctest-args/--pytest-args
  85. Copyright © Fixstars Group A1 colcon その他引数 100 ⚫ --event-handlers

    ◦ ビルド時のイベントに応じた処理設定を変える ▪ colcon build --event-handlers console_direct+: ビルド時のログをコンソール出力する ◦ build 時の event handler の一覧は colcon build --help で確認できる ⚫ --symlink-install ◦ ビルド時にファイルコピーではなくシンボリックリンク作成される ◦ パラメータファイル、launch 変更後インストールせずに実行できる ◦ ament_python では動作しない模様: colcon-core#407 ⚫ --merge-install ◦ パッケージ間での隔離がされないかわりに環境変数の文字数が小さくなる ◦ Windows 上で多数のパッケージをインストールするときに必要 ▪ Windows では環境変数の文字数に制限があるため
  86. Copyright © Fixstars Group A1 colcon その他引数 101 ⚫ パッケージ探索設定

    ◦ パッケージ探索ディレクトリ設定 (指定ディレクトリ直下のディレクトリを探索) ▪ --paths ◦ パッケージ探索ディレクトリ設定 (指定ディレクトリから再帰的に探索) ▪ --base-paths ◦ 指定パッケージを無視 ▪ --packages-ignore, --package-ignore-regex