221 Views
August 05, 26
スライド概要
ROSConJP 2026「ros2log: ROS 2のログ制御を統合する公式CLIの開発 」の発表スライドです.
Decwest
>100
ros2log: ROS 2のログ制御を統合する 公式CLIの開発 〇大西 史弥(慶應義塾大学),藤田 智哉(TriOrb.Inc) ※ROS Japan Developer会議での取り組みです 1/20
ROS Japan Developer 会議 とは ◼概要 – ROS本線を開発しよう – 技術課題をシェアしよう – 目指せ!ROSコミッター&メンテナー ◼取り組み – ROS本線の技術課題や新機能提案について議論 • オンライン,隔週,水曜日 20:00~20:50 • 半年に一回程度,対面会議も実施 Join Now! 2/20
目次 ◼ros2logの紹介 – 開発の背景 – ros2logの機能 – 実装の詳細 – Limitation・今後の展望 ◼REP (Robotics Enhancement Proposal) の紹介 – REPとは – REPに基づく標準化プロセス – ros2logでの具体例 ◼(大西が)開発をして思ったこと ◼まとめ 3/20
開発の背景 • 全て表示されて見にくい… • ログレベルが混在… 4/20
開発の背景
◼実行中のログレベル変更
ros2 service call ¥
<ノード名>/set_logger_levels ¥
rcl_interfaces/srv/SetLoggerLevels ¥
"{levels: [{name: <logger名>, level: <レベル数値>}]}"
– 毎回手で打つのは煩雑…
注)実行中のログレベル変更は、ノード生成時に
enable_logger_service=true
としたもののみが対象
•
•
Python
node = Node('NodeWithLoggerService',
enable_logger_service=True)
C++
auto node =
std::make_shared<rclcpp::Node>
("NodeWithLoggerService",
rclcpp::NodeOptions()
.enable_logger_service(true))
5/20
取り組み概要 ✓ ROS 2のログ制御を統合するCLI ros2log を開発 ✓ 公式の標準化プロセスにREP-0156として提案 ROS 2 Lyrical以降で使用可能 6/20
使用例 ◼ros2 log watch --regex controller ログ出力をフィルタ! 7/20
使用例 旧コマンド→ ◼ros2 log set /controller_server DEBUG ros2 service call ¥ /controller_server/set_logger_levels ¥ rcl_interfaces/srv/SetLoggerLevels ¥ "{levels: [{name: controller_server, level: 10}]}" ログレベルを変更! 8/20
使用例 ◼ros2 log watch --logger controller_server --level DEBUG ログ出力をフィルタ! 9/20
ros2logの紹介 10/20
ros2logの機能 ◼コマンド – ros2 log <subcommand> ◼サブコマンド一覧 ロ グ フ ィ ル タ – watch [options] • /rosoutトピックをサブスクライブし,以下の[options]でフィルタされたログを出力 ➢ --level:ログレベル ➢ --regex:正規表現 ➢ --logger:ロガー名(現実装ではノード名) – levels ロ グ レ ベ ル 変 更 • ログレベルの一覧を出力(UNSET,DEBUG,INFO,WARN,ERROR,FATAL) – list • 実行中にログレベルの変更が可能なノード一覧を出力 – get <node> • 対象ノード<node>の現在のログレベルを取得 – set <node> <level> • 対象ノード<node>のログレベルを設定値<level>に変更 11/20
実装の詳細 ◼ros2logの開発場所 – ros2cli: https://github.com/ros2/ros2cli – 実装言語:Python • ros2cliはPython製CLIフレームワーク • ros2 <command>は内部でPythonが実行されている ◼各サブコマンド実装のポイント – watch ➢/rosoutトピックをサブスクライブ ➢Content Filtered Topicsを活用 – list, get, set 【Content Filtered Topicsとは】 • 内容の条件を満たすメッセージのみ受信するように サブスクライバーを設定できる機能 (厳密には,DDSのContentFilteredTopicを ROS 2のRMW層から利用する仕組み) • 不要な受信処理や通信量の削減が可能 ➢ /node/get_logger_levels,/node/set_logger_levels サービスを活用 (ノード作成時,enable_logger_service=Trueとすると使用可能) • list:get, setサービスを有するノードを列挙 • get:getサービスのラッパー • set:setサービスのラッパー 12/20
Limitation・今後の展望 ◼ログフィルタに関して ➢/rosoutトピックに含まれないログは表示できない • Launchシステム自身のログ,OS/デバイスのsyslog,過去のログなど… ros2 log watchは/rosoutのライブログのみを対象 • ログの保存方式・保存先・保存有無は,logging backendやユーザ設定によって 実行ごとに変わりうるため ◼ログレベル変更に関して Node "my_node" root logger ➢ノードに紐づくroot logger以外 (child logger) の制御は困難 =ノード名 ➢各loggerの情報を取得する`describe`サブコマンドも未実装 – 理由:ROS 2にlogger名を列挙するAPIが無いため child logger child logger logger名を列挙するAPIを追加し, my_node.foo my_node.bar `describe`サブコマンドとchild loggerの制御にも対応 Child logger 13/20
REPの紹介 14/20
REPとは[1] ◼REP (Robotics Enhancement Proposal) – OSRAが管轄するオープンソースプロジェクトへの 機能強化の内容・方法・理由を説明する文書 – 複数のPull Request、リポジトリにまたがる 大規模変更が主な対象 – 2025年10月に現体制へ移行(旧:ROS Enhancement Proposal) • • • • • ROS Gazebo Open-RMF ROS Infrastructure ros_control OSRA管轄の OSSプロジェクト ◼REPの種類 – 標準規格 (Standard):プロジェクト群が準拠すべき制約やパターン • 例:単位,座標系,ハードウェアドライバのインタフェース etc… • ros2log (REP-0156) はこれ:複数のロギング実装が従う共通インタフェース – 仕様 (Specification):実装間の相互運用を保証するデータ形式・APIの定義 • 例:package.xml, メッセージの定義,ROS executorのAPI etc… – メタ文書 (Meta):REPプロセス自体の定義 • 例:REP 0001:2025 [1] REP 0001:2025, https://reps.openrobotics.org/rep-0001-2025/ 15/20
REPのStatus ◼Draft – REP文書がrepリポジトリにマージされたが, まだ採択、却下されていない状態 ◼Accepted・Rejected – 関連PMCによる正式なプロセスを経て 採択・却下された状態 ◼Finalized REP文書が repリポジトリにマージ Draft ROS PMCによる レビュー – 採択済みで,実装も完了・マージされた状態 ◼ Superseded – より新しいFinalized REPに置き換えられた状態 ◼ Withdrawn – 著者側が取り下げた or 不活動で取り下げられた状態 ◼ Deferred – 採択前に進捗が停滞した状態 Accepted Rejected 全ての実装を mainlineにマージ 改善して新たな REPを作成 Finalized 16/20
REPに基づく標準化プロセス 1. 提案内容の妥当性をオープンな場で議論 – REPを要する規模や性質のものか、など 2. REP文書の作成 – 目的、仕様、動機、後方互換性、実装方針などを整理 None 3. openrobotics/repsリポジトリへPull Requestを作成 – – 関連するPMCからSponsorを得る REP Editorsに確認いただき、マージしていただく 4. オープンな場で議論を継続しながら、実装 – ROS Discourse, Open RoboticsのZulip等で議論スレッドを立てる – 公式リポジトリからブランチを切って実装 5. ROS PMCにREPの承認を依頼 – REPが十分議論済みで、REPに記載した内容全ての実装方針が現実的か 6. REPに記載した内容全ての実装をmainlineにマージ Draft Accepted Finalized 17/20
REPに基づく標準化プロセス ~ros2logの場合~ 1. 提案内容の妥当性をオープンな場で議論 – ros2cli, ros2 repositoryのIssueで議論した 2. REP文書の作成 – REP-0156を作成した None 3. openrobotics/repsリポジトリへPull Requestを作成 – – ros2cliを管轄するROS PMCからSponsorを得た(mjcarrollさん) REP Editors(Geoffさん)にご確認いただき、マージしていただいた 4. オープンな場で議論を継続しながら、実装 – ROS Discourseに議論スレッドを立てた – ros2cliのmainブランチから切って開発中(←今ここ) 5. ROS PMCにREPの承認を依頼 – REPが十分議論済みで、REPに記載した内容全ての実装方針が現実的か 6. REPに記載した内容全ての実装をmainlineにマージ Draft Accepted Finalized 18/20
(大西が)開発をして思ったこと ◼まずは「作りたい・貢献したい」という意志が大切 – コードは生成AIで書ける時代に.気持ち先行で,知識は後から補う形も? – 自分もros2cliを知らないまま挑戦 開発を通して実装やREPのプロセスを理解 ◼ROS 2は自らの手で変えられるという感覚 – OSSなので,誰でもPull Requestで改変できる 使いにくい点を我慢せず,ROS本線に改善を入れる発想が生まれる ◼日本でROS本線の開発に携わるなら,ROS Japan Dev会議への参加が一番! – 本線に入れるかの判断を,ROSに詳しい開発者と議論できる – ROS PMCの藤田さんと気軽に話せ,他のPMCへの連絡(REP時に必要)も円滑 19/20
まとめ ◼ros2log – ROS2のログ制御を統合するCLI ros2logを開発 • /rosoutトピックのライブログをオプションでフィルタ • ノード単位でログレベル変更 – 今後の展望 • logger名を列挙するAPIを追加し, `describe`サブコマンドとchild loggerの制御にも対応 ◼REP – OSRA管轄のOSSプロジェクトに対する機能強化を説明する文書 • ros2logもREP-0156で提案中(Status: Draft) – 今後の展望 • 開発をすべて完了し,ROS PMCにREPの承認を依頼&開発物を全てマージ 20/20