22.7K Views
October 17, 22
スライド概要
ROS2 の開発をしたことがあり、ビルドシステムの正確な知識を得たい方向けのオンラインセミナーを開催します。
ROS2のビルドシステムに関しては正しい記述方法がわからず、何かを追加するたびにエラーが発生して都度解決するということがよくあります。
また、ROS公式の解説で実行可能なサンプルがほとんどなく、公式で動作確認されている記述方法がわからないという問題もあります。
本セミナーではROS2のビルドシステム全体の説明を行い、あわせてサンプルを例示いたします。
<過去資料>
・ROS2自律走行実現に向けて 1 : https://www.docswell.com/s/fixstars/57VGDN-20221017
・ROS2自律走行実現に向けて 2: https://www.docswell.com/s/fixstars/K8G1N9-20221130
・Jetson活用 ROS2自律走行実現に向けて ~自律移動ロボット用ー自己位置推定のCUDA高速化: https://www.docswell.com/s/fixstars/KQ814X-20211104
・フィックスターズの自動車向けソフトウェア開発: https://at.fixstars.com/ja
フィックスターズは、コンピュータの性能を最大限に引き出すソフトウェア開発のスペシャリストです。車載、産業機器、金融、医療など、幅広い分野での開発経験があります。また、ディープラーニングや機械学習などの最先端技術にも力を入れています。 並列化や最適化技術を駆使して、マルチコアCPU、GPU、FPGA、量子アニーリングマシンなど、さまざまなハードウェアでソフトウェアを高速化するサービスを提供しています。さらに、長年の経験から培ったハードウェアの知識と最適化ノウハウを活かし、高精度で高性能なアルゴリズムの開発も行っています。 ・開催セミナー一覧:https://www.fixstars.com/ja/seminar ・技術ブログ :https://proc-cpuinfo.fixstars.com/
ROS2自律走行実現に向けて 次世代ロボット開発フレームワーク ROS2のビルドシステム徹底理解 Copyright © Fixstars Group
本日のAgenda はじめに フィックスターズのご紹介 次世代ロボット開発フレームワーク ROS2のビルドシステム徹底理解 Copyright © Fixstars Group 2
はじめに Copyright © Fixstars Group
本セミナーの位置づけ ウェビナー「ROS2自律走行実現に向けて」シリーズでは、 自律走行する車両型ロボットの実現に向け、 ROS2を使った開発に関連する、様々な情報を発信しています 前回の内容 ROS1上で開発した資産の活用 ○ 自己位置推定パッケージの CUDA高速化 ○ 今回の内容 ○ パッケージ開発に欠かせない ビルドシステムの解説 こんな方に向いています ○ ROS2 の開発をしたことがあり、ビルドシステムの正確な知識を得たい方 Copyright © Fixstars Group 4
発表者紹介 冨田 明彦 坂本 浩平 ソリューションカンパニー 執行役員 ソリューション第3事業部 シニアエンジニア 2008年に入社。金融、医療業界において、ソ フトウェア高速化業務に携わる。その後、新規 事業企画、半導体業界の事業を担当し、現職。 2019 年入社。入社以来自律移動車両の実証 実験や ADAS システムの開発を担当している。 Copyright © Fixstars Group 5
フィックスターズの ご紹介 Copyright © Fixstars Group
フィックスターズの強み コンピュータの性能を最大限に引き出す、ソフトウェア高速化のエキスパート集団 ハードウェアの知見 アルゴリズム実装力 各産業・研究分野の知見 目的の製品に最適なハードウェアを見抜き、 その性能をフル活用するソフトウェアを開 発します。 ハードウェアの特徴と製品要求仕様に合わ せて、アルゴリズムを改良して高速化を実 現します。 開発したい製品に使える技術を見抜き、実 際に動作する実装までトータルにサポート します。 Copyright © Fixstars Group 7
サービス概要 お客様専任のエンジニアが直接ヒアリングを行い、高速化を実現するために乗り越えるべき 課題や問題を明確にしていきます。 高速化のワークフロー コンサルティング 高速化 サポート 先行技術調査 アルゴリズムの改良・開発 レポートやコードへのQ&A 性能評価・ボトルネックの特定 ハードウェアへの最適化 実製品への組込み支援 レポート作成 Copyright © Fixstars Group 8
サービス提供分野 半導体 産業機器 金融 自動車 ●NAND型フラッシュメモリ向け ファームウェア開発 ●次世代AIチップの開発環境基盤 生命科学 ●Smart Factory実現への支援 ●マシンビジョンシステムの高速化 ●自動運転の高性能化、実用化 ●ゲノム解析の高速化 ●次世代パーソナルモビリティの 研究開発 ●医用画像処理の高速化 Copyright © Fixstars Group ●デリバティブシステムの高速化 ●HFT(アルゴリズムトレード)の高速化 ●AI画像診断システムの研究開発 9
サービス領域 様々な領域でソフトウェア高速化サービスを提供しています。大量データの高速処理は、 お客様の製品競争力の源泉となっています。 組込み高速化 GPU向け高速化 AI・深層学習 画像処理・アルゴリズム 開発 FPGAを活用した システム開発 分散並列システム開発 量子コンピューティング 自動車向け フラッシュメモリ向けフ ソフトウェア開発 ァームウェア開発 Copyright © Fixstars Group 10
組込み高速化 組込み機器製品の計算処理実装をお手伝いしています。 お客様の課題 ご支援内容 組込みシステムの目標性能が達成できない ターゲットデバイスの特性に合わせて、 性能要求を満たしたい 安価なハードウェアでも処理速度を維持し 製品にかかるコストを下げたい ターゲットデバイスの例 ARM/ TOSHIBA Visconti/ Renesas R-Car/ NXP S32/ Automotive Platform/ CEVA-XM6/ Texas Instruments © Fixstars Group C6000/ Cadence Vision DSP FamilyCopyright など 最適化方針のご提案 ボトルネック調査、最適化に向けた検討 システム設計コンサルティング ハードウェア選定を含めたシステム設計のご提案 アルゴリズムの改善と移植 既存アルゴリズムを改善して計算を高速化 組込みアルゴリズム開発 ターゲットデバイス向けに最適化されたアルゴリズムを実装
画像処理アルゴリズム開発 高速な画像処理需要に対して、経験豊富なエンジニアが 責任を持って製品開発をご支援します。 お客様の課題 ご支援内容 高度な画像処理や深層学習等のアルゴリズム を開発できる人材が社内に限られている アルゴリズム調査・改変 課題に合ったアルゴリズム・実装手法を調査 製品実装に向けて適切な改変を実施 機能要件は満たせそうだが、ターゲット機器 上で性能要件までクリアできるか不安 深層学習ネットワーク精度の改善 様々な手法を駆使して深層学習ネットワークの精度を改善 製品化に結びつくような研究ができていない 論文調査・改善活動 論文調査から最先端の手法の探索 性能向上に向けた改善活動を継続 Copyright © Fixstars Group
自動車向けソフトウェア開発 アルゴリズム開発から量産車ターゲット向けの高速化まで、 自動運転の実現に向けた統合的な技術開発を行っています。 ご支援内容 Copyright © Fixstars Group
ROS2のビルドシステム 徹底理解 Copyright © Fixstars Group
本セミナーのねらい ROS2 を開発していてビルド面で困ることがよくある ○ C++ パッケージを作ろうとして CMake を書いたがビルドエラー/実行時エラーになる ○ Python パッケージを作ったが、設定ファイルの意味がわからない 本セミナーでは上記の状況に対してビルドシステムの解説を行う 本セミナーでのサンプルは ROS2 humble での実行確認済み ○ 本セミナー後ソース公開予定 Copyright © Fixstars Group 15
ROS2 ビルドシステム概要 Copyright © Fixstars Group
ROS2 ビルドシステム概要 ROS2 ではパッケージ単位のモジュールとして各機能が提 供されている パッケージ単位でビルドツール切り替えが可能 packages ○ ROS1 パッケージや非 ROS パッケージ (例: Gazebo) もビルド可能 ament_cmake ビルドの管理を colcon で行う ○ パッケージ間の依存管理 ○ 各パッケージのビルドツールの呼び出し ○ ビルド時/実行時の環境設定 ROS2 向けビルドは ament で行う ○ C++: ament_cmake (CMake 拡張) ○ Python: ament_python catkin colcon cmake ament_python その他 Copyright © Fixstars Group 17
アジェンダ 1. 2. 3. 4. 5. colcon コマンドと package.xml ament_cmake ament_cmake の発展的な使い方 ament_cmake_auto ament_python Copyright © Fixstars Group 18
colcon コマンドと package.xml Copyright © Fixstars Group
colcon コマンドと package.xml 目次 1.1 colcon コマンド概要 packages 1.2 コマンドライン引数 1.3 ログ出力 ament_cmake 1.4 colcon mixin 1.5 package.xml catkin colcon 1.6 パッケージ探索、依存解析 cmake ament_python その他 Copyright © Fixstars Group 20
1.1 colcon コマンド概要 複数のパッケージのビルド、テストを容易に行うビルドシステム ○ ○ ○ ○ パッケージ間の依存関係の管理 ビルド、テスト対象パッケージの選択 ビルドツールを呼び出しパッケージビルド ビルド環境のセットアップ ■ 複数パッケージで環境を分離する ○ 実行環境の export 実行方法 ○ colcon <verb> …. という形式で実行する ■ <verb>: build, test … ユーザーで拡張可能: Extension points ユーザードキュメント Copyright © Fixstars Group 21
1.1 colcon の verb build: パッケージビルドを行う test, test_result: パッケージのテストを行う info, list, graph: パッケージ情報の取得 mixin: mixin の管理 metadata: メタデータの管理 ○ (使用頻度は低いと思われる) Copyright © Fixstars Group 22
1.2 colcon のコマンドライン引数 verb ごとにコマンドライン引数が違う よく使うコマンドライン引数 ○ ○ ○ ○ ディレクトリ管理 パッケージ選択 ビルドツール/テストツールへの引数引渡し その他 Copyright © Fixstars Group 23
1.2 colcon のコマンドライン引数例 ディレクトリ管理 ○ 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+: ビルド時のログをコンソール出力する Copyright © Fixstars Group 24
1.3 colcon のログ制御 標準では colcon はターミナル出力をほとんどしない ○ ターミナル出力には --event-handlers console_direct+ の指定が必要 ログはログディレクトリに出力される ○ 標準では log/${verb}_${timestamp} に出力 ○ --log-base 引数で変更可能 colcon コマンドログレベルは --log-level 引数で変更可能 ○ 設定値は Python ログレベルと同様 --log-base, --log-level 引数は colcon コマンドの直後に記述する ○ colcon --log-level INFO build Copyright © Fixstars Group 25
1.4 colcon mixin colcon コマンド引数の定義済み設定 ○ colcon の mixin Github レポジトリ では CMake のフラグを設定するものが多い ○ ユーザー定義もできる 使用目的 ○ 煩雑なビルド引数設定の簡略化 使い方 ○ 準備: mixin 登録 (一回行えばよい) $ colcon mixin add default ¥ https://raw.githubusercontent.com/colcon/colcon-mixin-repository/master/index.yaml $ colcon mixin update Copyright © Fixstars Group 26
1.4 colcon mixin 使い方 ○ 詳細確認 (build で使える mixin の詳細を確認する) ■ colcon build --help 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'] ○ ビルド時の使用: colcon build --mixin debug ■ これで –DCMAKE_BUILD_TYPE=Debug が CMake に渡される Copyright © Fixstars Group 27
1.5 package.xml XML で書かれたパッケージマニフェストファイル ○ ros2 pkg create で生成される package.xml を修正していけばよい ○ colcon はここに書かれた依存情報をもとにパッケージ間の依存を解析する 記述内容 (XML タグ) ○ パッケージの管理情報 ■ name, version, description, maintainer, license ... ○ パッケージ間の依存管理 ■ depend, build_depend … ○ パッケージ export 情報 ■ export 仕様: REP-149 Copyright © Fixstars Group 28
1.5 package.xml サンプル <?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> Copyright © Fixstars Group 29
1.5 package.xml による依存設定 (1) 他のパッケージへの依存を指定する ○ package.xml がない CMake ライブラリ, システムパッケージも指定可 依存設定指定タグ ○ build_depend: ビルド時の依存指定 ○ build_export_depend: ビルド時に必要な export の依存指定 ■ 例: ビルドにパッケージのヘッダファイルのみが必要な場合 ○ exec_depend: 実行時の依存指定 ○ depend: build_depend, build_export_depend, exec_depend すべての指定 ○ test_depend: テスト時の依存指定 ■ Linter パッケージ等 ○ buildtool_depend: ビルド時に使用するツールの指定 Copyright © Fixstars Group 30
1.5 package.xml による依存設定 (2) member_of_group/group_depend ○ あるタイプのパッケージすべてに依存するが依存を明示的に指定できないときに使う ○ 例: ros1_bridge ■ メッセージパッケージすべてに依存するが依存対象となるメッセージパッケージがどれかはビルド 時までわからない ○ 被依存側に member_of_group を設定して依存側に group_depend を設定することで実現 ■ メッセージパッケージに <member_of_group>rosidl_interface_packages</member_of_group> を指 定する Copyright © Fixstars Group 31
1.6 パッケージ探索、依存解析 パッケージ探索 ○ デフォルトでは 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 の依存情報を使う 解析した情報をもとにパッケージのビルド順を決定する 自己依存や循環依存があるとビルドできない Copyright © Fixstars Group 32
ament_cmake Copyright © Fixstars Group
ament_cmake 目次 2.1 ament_cmake 概要 2.2 ライブラリ/ノードパッケージ設定 packages 2.3 Launch, パラメータファイルインストール ament_cmake 2.4 単体テスト, Linter設定 catkin 2.5 メッセージパッケージ設定 colcon cmake ament_python その他 Copyright © Fixstars Group 34
2.1 ament_cmake 概要 ROS2 向けのパッケージビルドツール CMake の ROS2 向け拡張 ○ パッケージ探索、Export 設定、メッセージ生成 ユーザーで拡張可能 ユーザーガイド Copyright © Fixstars Group 35
2.2 ライブラリ/ノードパッケージ設定 ライブラリとノードの CMakeLists.txt の設定方法 以下の 3 パッケージを作成する ○ CMake 共有ライブラリ: simple_library ○ ament_cmake 共有ライブラリ: simple_ament_library ■ simple_library に依存している ○ ROS2ノード: simple_package ■ simple_library, simple_ament_library に依存している simple_library simple_package simple_ament_library Copyright © Fixstars Group 36
2.2 CMake 共有ライブラリ設定 (1) CMake の共有ライブラリの設定方法 simple_library simple_package simple_ament_library Copyright © Fixstars Group 37
2.2 CMake 共有ライブラリ設定 (1)
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})
Copyright © Fixstars Group
38
2.2 CMake 共有ライブラリ設定 (2)
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)
インクルード設定
参照 : CMake ドキュメント
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})
Copyright © Fixstars Group
インストール設定
参照 : CMake ドキュメント
39
2.2 CMake 共有ライブラリ設定 (3)
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)
public ヘッダ設定
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)
Copyright © Fixstars Group
40
2.2 ament_cmake 共有ライブラリ設定 (1) ament_cmake を使った共有ライブラリの設定方法 ○ simple_library への依存がある simple_library simple_package simple_ament_library Copyright © Fixstars Group 41
2.2 ament_cmake 共有ライブラリ設定 (2) 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() Copyright © Fixstars Group 42
2.2 ament_cmake 共有ライブラリ設定 (3) cmake_minimum_required(VERSION 3.8) project(simple_ament_library) find_package(ament_cmake REQUIRED) find_package(simple_library REQUIRED) find_package による 依存パッケージ探索 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}) PUBLIC_HEADER を使わない場合 ament_export_dependencies(simple_library) ヘッダは別個にインストール必要 install(TARGETS ${PROJECT_NAME} EXPORT export_${PROJECT_NAME} LIBRARY DESTINATION lib) install(DIRECTORY include/ DESTINATION include) ament_package() Copyright © Fixstars Group 43
2.2 ament_cmake 共有ライブラリ設定 (4) cmake_minimum_required(VERSION 3.8) project(simple_ament_library) find_package(ament_cmake REQUIRED) find_package(simple_library REQUIRED) 共有ライブラリを作成する場合 SHARED 指定する ※ ament_cmake では デフォルトが静的ライブラリ 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) ament_cmake での install(TARGETS ${PROJECT_NAME} EXPORT export_${PROJECT_NAME} LIBRARY DESTINATION lib) Export 設定 install(DIRECTORY include/ DESTINATION include) CMakeFile.txt の最後に必要 Copyright © Fixstars Group ament_package() 44
2.2 ROS2 ノード設定 (1) ROS2 ノードの設定方法 ○ これまでと違い実行バイナリを生成する ○ simple_library, simple_ament_library への依存がある simple_library simple_package simple_ament_library Copyright © Fixstars Group 45
2.2 ROS2 ノード設定 (2) 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() Copyright © Fixstars Group 46
2.2 ROS2 ノード設定 (3) cmake_minimum_required(VERSION 3.8) project(simple_package) ノードなので rclcpp への依存がある find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(simple_library REQUIRED) find_package(simple_ament_library REQUIRED) ament_cmake パッケージと CMake パッケージで 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>) ros2 run/launch で発見して もらうために lib にインストール install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION lib/${PROJECT_NAME}) ament_package() Copyright © Fixstars Group 47
2.3 Launch, パラメータファイルインストール 右のような構成をインストールする . ├── ├── │ ├── │ └── CMakeLists.txt config └── simple_param.yaml launch └── with_param.launch.py package.xml <exec_depend>ros2launch</exec_depend> package.xml 追加設定 install(DIRECTORY launch config DESTINATION share/${PROJECT_NAME}) これでインストールディレクトの launch/config にインストールされる CMakeLists.txt 追加設定 Copyright © Fixstars Group 48
2.4 単体テスト、Linter 設定 (1) colcon test で行うテストの設定 ○ package.xml テスト依存設定 ■ ament_cmake_gtest ■ 使用したい linter ○ CMakeLists.txt 設定 ■ if(BUILD_TESTING) でテスト設定 <test_depend>ament_cmake_gtest</test_depend> <test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_common</test_depend> package.xml 設定 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() CMakeLists.txt 設定 Copyright © Fixstars Group 49
2.4 単体テスト、Linter 設定 (2) <test_depend>ament_cmake_gtest</test_depend> C/C++ gtest への依存 ament_lint_auto と 実行したい linter パッケージへの 依存を書く ament_lint_auto_find_test_dependencies すれば個別の linter 設定は不要 テストバイナリ作成設定 <test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_common</test_depend> package.xml 設定 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() CMakeLists.txt 設定 Copyright © Fixstars Group 50
2.5 メッセージパッケージ設定 <build_depend>rosidl_default_generators</build_depend> <exec_depend>rosidl_default_runtime</exec_depend> <member_of_group>rosidl_interface_packages</member_of_group> package.xml 設定 rosidl への依存設定 find_package(rosidl_default_generators REQUIRED) rosidl_generate_interfaces(${PROJECT_NAME} msg/Simple.msg ) *.msg: メッセージ定義 *.srv: サービス定義 *.action: アクション定義 CMakeLists.txt 設定 Copyright © Fixstars Group 51
ament_cmake の 発展的な使い方 Copyright © Fixstars Group
ament_cmake の発展的な使い方 3.1 プラグイン作成 3.2 ament 拡張 packages 3.3 リソース登録 ament_cmake catkin colcon cmake ament_python その他 Copyright © Fixstars Group 53
3.1 プラグイン作成 ament_cmake ではプラグインを作成できる ○ I/F となる抽象ベースクラスを定義し、それを実装したコードを実行時にロードさせる ○ ユーザーはプラグイン使用側の再ビルドなしに自分のコードを実行できる ○ 例: rviz2, navigation2 作成に必要なパッケージ ○ プラグインの元となるベースクラスパッケージ: simple_plugin_base ○ プラグインを実装するパッケージ: simple_plugin namespace simple_plugin { class SimplePluginBase { public: virtual void Print() = 0; }; } Copyright © Fixstars Group 54
3.1 プラグイン構成 simple_plugin_base プラグイン使用側 simple_plugin Copyright © Fixstars Group 55
3.1 simple_plugin_base 作成 特別な設定は必要ない ○ pluginlib への依存も不要 simple_plugin_base プラグイン使用側 simple_plugin Copyright © Fixstars Group 56
3.1 simple_plugin_base CMake 設定 cmake_minimum_required(VERSION 3.8) project(simple_plugin_base) find_package(ament_cmake) ヘッダファイルのみのライブラリのため INTERFACE 指定する 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() Copyright © Fixstars Group 57
3.1 simple_plugin 作成 以下が必要 ○ ○ ○ ○ package.xml の設定 プラグイン記述 XML ファイルの作成 CMakeLists.xml の設定 ソースコードでのマクロ呼び出し 失敗すると実行時にプラグインがロードされない simple_plugin_base プラグイン使用側 simple_plugin Copyright © Fixstars Group 58
3.1 simple_plugin の package.xml 設定 (1)
<depend>simple_plugin_base</depend>
<depend>pluginlib</depend>
<export>
<build_type>ament_cmake</build_type>
<!-- simple_plugin_base plugin="${prefix}/plugins_description.xml"/ -->
</export>
Copyright © Fixstars Group
59
3.1 simple_plugin の package.xml 設定 (2)
<depend>simple_plugin_base</depend>
<depend>pluginlib</depend>
ベースクラスパッケージと
plubinlib への依存が必要
<export>
<build_type>ament_cmake</build_type>
<!-- simple_plugin_base plugin="${prefix}/plugins_description.xml"/ -->
</export>
ROS2 では不要
Copyright © Fixstars Group
60
3.1 simple_plugin のプラグイン記述 XML 設定 <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> Copyright © Fixstars Group 61
3.1 simple_plugin のプラグイン記述 XML 設定 path にはパッケージ名を入れる <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> - name: プラグインロードする際のキー - type: プラグインクラス名 - base_class_type: プラグインベースクラス名 ※ name は省略可、省略した場合は type がプラグインロードのキーになる Copyright © Fixstars Group 62
3.1 simple_plugin CMakeLists.txt 追加設定 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) Copyright © Fixstars Group 63
3.1 simple_plugin CMakeLists.txt 追加設定 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 ファイルパス Copyright © Fixstars Group 64
3.1 simple_plugin 実装
#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;
}
PLUGINLIB_EXPORT_CLASS で
};
クラスローダ―への登録が必要
}
#include <pluginlib/class_list_macros.hpp>
PLUGINLIB_EXPORT_CLASS(
simple_plugin::SimplePlugin, simple_plugin::SimplePluginBase)
Copyright © Fixstars Group
65
3.1 プラグイン使用側作成 pluginlib を使ってプラグインをロードする ○ pluginlib, simple_plugin_base への依存が必要 ○ simple_plugin への依存は不要 simple_plugin_base プラグイン使用側 simple_plugin Copyright © Fixstars Group 66
3.1 プラグイン使用側実装 (1)
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());
}
}
Copyright © Fixstars Group
67
3.1 プラグイン使用実装 (2)
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");
プラグイン記述 XML ファイルで記述した
simple_plugin->Print();
プラグイン名を指定する
} catch (pluginlib::PluginlibException& ex) {
printf("Load error: %s¥n", ex.what());
}
Copyright © Fixstars Group
68
3.2 ament 拡張 ament を拡張することができる ○ コマンド登録 ■ 他のパッケージからよばれるコマンドの登録 ○ ExtensionPoint 登録 ■ 特定のコマンド実行時にユーザーの CMake ファイルを実行する ● ament_package, rosidl_generate_interfaces などが呼ばれたときに自分の CMake フ ァイルを実行させることができる ユーザーガイド#Extending ament 参考パッケージ: ament_lint_auto Copyright © Fixstars Group 69
3.2 リソース登録 リソース登録/探索のシステムが用意されている ○ リソースの例 ■ rviz2 のメッシュファイル ■ pluginlib のプラグイン記述 XML ファイル ○ プラグイン使用側で必要なファイルをプラグイン提供側で登録するのに必要 ユーザーガイド#Adding_resources 参考パッケージ: pluginlib Copyright © Fixstars Group 70
ament_cmake_auto Copyright © Fixstars Group
ament_cmake_auto 目次 4.1 ament_cmake_auto 概要 4.2 ノードパッケージ作成 packages 4.3 ライブラリパッケージ作成 ament_cmake 4.4 単体テスト設定 catkin colcon cmake ament_python その他 Copyright © Fixstars Group 72
4-1 ament_cmake_auto 概要 これまでに見てきた 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 を最後に呼び出す Copyright © Fixstars Group 73
4-2 ノードパッケージ作成 ament_cmake_auto を使えば非常に簡単に書ける <buildtool_depend>ament_cmake_auto</buildtool_depend> <depend>rclcpp</depend> package.xml 追加設定 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() CMakeLists.txt 全体 Copyright © Fixstars Group 74
4-3 ライブラリパッケージ作成 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 を指定する Copyright © Fixstars Group 75
4-4 単体テスト設定 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() Copyright © Fixstars Group 76
ament_python Copyright © Fixstars Group
ament_python 目次 5-1 ament_python 概要 5-2 デフォルト作成ファイル解説 packages 5-3 ノードパッケージ作成 ament_cmake 5-4 Launch, パラメータファイルインストール 5-5 ament_cmake_python catkin colcon cmake ament_python その他 Copyright © Fixstars Group 78
5-1 ament_python 概要 colcon での Python パッケージ生成ツール Setuptools でパッケージを設定できる ○ ROS1 では Python パッケージであっても CMakeLists.txt を書く必要があった ament_python 設定法 ○ Setuptools の記法に従って設定すればよい ○ CMake に対する ament_cmake のような ROS2 拡張はない模様 Copyright © Fixstars Group 79
5-1 Setuptools Python のパッケージングツール setup.py と setup.cfg に設定を書く ○ 現在 pyproject.toml への移行を行っているが一部対応がβ ■ 今後 ROS2 でも pyproject.toml で設定を書く方向になるかもしれない 公式ドキュメント Copyright © Fixstars Group 80
5-2 デフォルト作成ファイル解説 ros2 pkg create --build-type ament_python test_python_package ファイル ○ ○ ○ ○ package.xml: マニフェストファイル resource/test_python_package: パッケージ探索に使うマーカーファイル setup.cfg/setup.py: Setuptools 設定 . test/*: pytest スクリプト置き場 ├── package.xml ■ 実はどこに配置しても pytest 対象になる ○ test_python_package: パッケージソース置き場 Copyright © Fixstars Group ├── │ ├── ├── ├── │ │ │ └── resource └── test_python_package setup.cfg setup.py test ├── test_copyright.py ├── test_flake8.py └── test_pep257.py test_python_package └── __init__.py 81
5-2 デフォルト setup.py 解説 (1)
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': [],
},
)
Copyright © Fixstars Group
82
5-2 デフォルト setup.py 解説 (2)
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': [],
},
)
Copyright © Fixstars Group
83
5-2 デフォルト setup.py 解説 (3)
from setuptools import setup
package_name = 'test_python_package'
ファイルコピー設定
setup(
パッケージマーカーファイルと
name=package_name,
Packge.xml をコピー
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': [],
エントリーポイント
},
)
Copyright © Fixstars Group
84
5-2 デフォルト setup.cfg 解説 デフォルトで設定されているのは Setuptools のコマンド引数 ○ [develop]: develop 環境へのインストール時設定 ○ [install]: パッケージインストール時設定 ○ ROS2 では実行ファイルは lib に置かれるので設定が必要 引数の詳細は python3 setup.py install --help 等で確認できる [develop] script_dir=$base/lib/test_python_package [install] install_scripts=$base/lib/test_python_package Copyright © Fixstars Group 85
5-3 ノードパッケージ作成
以下のノードを動かす設定
○ simple_python_node がパッケージのルート
○ simple_python_node.py がコマンドスクリプト
.
├── setup.py
└── simple_python_node
├── __init__.py
└── simple_python_node.py
■ main 関数から動かす
setup(
entry_points={
'console_scripts': [
'simple_node=simple_python_node.simple_python_node:main',
],
},
)
console_scripts に動かすスクリプトを設定する
書式は ‘<コマンド名>=<呼び出しスクリプトのモジュール名>:<呼び出し関数>’
Copyright © Fixstars Group
86
5-4 Launch, パラメータファイルインストール 右のような構成をインストールする <exec_depend>ros2launch</exec_depend> . ├── │ ├── │ ├── ├── └── config └── simple_param.yaml launch └── with_param.launch.py setup.cfg setup.py package.xml package.xml 追加設定 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')) ], setup.py 追加設定 Copyright © Fixstars Group 87
5-5 ament_cmake_python ament_cmake 中に Python スクリプトを混ぜたいときに使う 公式ドキュメント Python モジュールをインストールするには package.xml と CMakeLists.txt で以下の記述を行えばよい ○ これだけで登録したモジュールを他のパッケージから使える <buildtool_depend>ament_cmake</buildtool_depend> <buildtool_depend>ament_cmake_python</buildtool_depend> package.xml 追加設定 find_package(ament_cmake_python REQUIRED) ament_python_install_package(${PROJECT_NAME}) CMakeLists.txt 追加設定 Copyright © Fixstars Group 88
5-5 ament_cmake_python によるコマンド登録 (1) ament_cmake_python にて ros2 run で実行できるコマンドを登録する ○ 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} ) CMakeLists.txt 追加設定 #!/usr/bin/env python3 スクリプト冒頭 Copyright © Fixstars Group 89
5-5 ament_cmake_python によるコマンド登録 (2) ament_cmake_python にて ros2 run で実行できるコマンドを登録する ○ CMakeLists.txt, スクリプトへの追加設定が必要 find_package(ament_cmake_python REQUIRED) ament_python_install_package(${PROJECT_NAME}) PROGRAMS 設定で lib にインストールして 実行属性をつける install(PROGRAMS ament_cmake_python_test/ament_cmake_python_test.py DESTINATION lib/${PROJECT_NAME} ) CMakeLists.txt 追加設定 #!/usr/bin/env python3 スクリプト冒頭 直接実行されるので シバンが必要 ※ --symlink-install する場合は ソースファイル自体に実行属性が必要 Copyright © Fixstars Group 90
参考サイト Copyright © Fixstars Group
参考サイト : ROS2 ビルドシステム、colcon 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 Copyright © Fixstars Group 92
参考サイト : ament_cmake 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 Copyright © Fixstars Group 93
参考サイト : ament_python ROS2 document: ament_cmake_python user documentation Setuptools document Copyright © Fixstars Group 94
Appendix Copyright © Fixstars Group
Appendix A1: colcon のコマンドライン引数レファレンス Copyright © Fixstars Group 96
A1 colcon のディレクトリ管理引数 --build-base: ビルド時の一時ディレクトリ設定 --install-base: インストール先のディレクトリ設定 --test-result-base: テスト結果配置場所設定 --log-base: ログ配置場所設定 上記の引数は--log-base以外はサブコマンドの後に配置する。 ○ 例: colcon build --build-base ... ○ 例: colcon --log-base … build Copyright © Fixstars Group 97
A1 colcon のパッケージ選択引数 指定パッケージを選択 ○ --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 を取る Copyright © Fixstars Group 98
A1 colcon のビルド/テストツール渡し引数 ビルドツール (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 Copyright © Fixstars Group 99
A1 colcon その他引数 --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 では環境変数の文字数に制限があるため Copyright © Fixstars Group 100
A1 colcon その他引数 パッケージ探索設定 ○ パッケージ探索ディレクトリ設定 (指定ディレクトリ直下のディレクトリを探索) ■ --paths ○ パッケージ探索ディレクトリ設定 (指定ディレクトリから再帰的に探索) ■ --base-paths ○ 指定パッケージを無視 ■ --packages-ignore, --package-ignore-regex Copyright © Fixstars Group 101
Thank you! お問い合わせ窓口 : [email protected] Copyright © Fixstars Group