📘
ROS2におけるパラメータ
解説対象
本記事では、ROS2で登場する各種パラメータをまとめています。
本記事は下記の「ROS2を深く理解する」の記事群の一部ですが、この記事単独でも理解できるようになっています。
前提
- 調査はROS2 humble時の実装に基づいていますが、基本的にdistributionに依存しない内容です。
- 調査はc++側の実装(rclcpp)に基づいていますが、基本的にクライアント言語に依存しない内容です。
解説
ROS2におけるパラメータ
ROS2においてパラメータと呼べるモノは下記表の通り多数あります。
※パラメータ(parameter)という用語と引数(argument)という用語は明確に区別せず、動作を決定するために外部から与えられる変という意味で用いています。
これらパラメータを理解することがROSのソフトウェア設計には欠かせません。
表1:ROS2における各種パラメータの一覧
| 概念 | 目的 | 形式 | 値の型 |
|---|---|---|---|
| ノードパラメータ | ROSノードの動作を変更する | 名前がついている値の組(key-value dictionary形式) | bool, int64, double, string, byte[], bool[], int64[], double[], string[] |
| コマンドラインROS引数 | グローバルROS引数を生成する | コマンドライン引数(フラグと値の配列) | string |
| グローバルROS引数 | executable中の全ROSノードの初期化処理を制御する |
rcl_arguments_impl_s構造体 |
rcl_params_t他多数 |
| ローカルROS引数 | 個別のROSノードの初期化処理を制御する |
rcl_arguments_impl_s構造体 |
rcl_params_t他多数 |
| launch引数 | launch fileの動作を変更する | 名前がついている値の組(key-value dictionary形式) | str |
| xacro実行引数 | URDFの生成時に可変値を与える | 名前がついている値の組(key-value dictionary形式) | str |
| xacroマクロ引数 | マクロの実行時に可変値を与える | 名前がついている値の組(key-value dictionary形式) | str(※1),xmlブロック |
※1:xacroマクロ引数の値は内部的には単なるstr型として受け渡される(マクロを呼ぶ側がhoge="1"を入力した場合、これはstr型の"1"として受け取られる)。ただし、${hoge + 1}等の形式でxacroマクロ引数を使用する時にhoge部分が置換される時にeval()によって値が解釈される("1"という文字列はintの1と解釈される)。そして最終的に${hoge + 1}の結果はint型の2となる(これを受け取る側では文字列として解釈し、str型の"2"となる)
表2:ROS2における各種パラメータのアクセス性
| 概念 | 宣言要否 | 読み出し | 書き換え | 初期値 |
|---|---|---|---|---|
| ノードパラメータ | 原則、明示的に宣言しておいた値のみ受け取れる | 自ROSノードの値はフィールド参照で読み出し可能。他ROSノードの値はROSサービスを使用して読みだし可能(制限することも可能) | 自ROSノードの値はフィールド参照で書き込み可能。他ROSノードの値はROSサービスを使用して書き込み可能(制限することも可能) | executable実行時にコマンドラインROS引数を用いてグローバル初期値を設定可能な他、executable実装時のコード中でローカル初期値を設定可能 |
| コマンドラインROS引数 | 不要 | 自プロセスの値をexecutableのmain関数の引数argvから読み出せる | 不可 | executable実行時のコマンドライン引数として値を指定する |
| グローバルROS引数 | 不要 | 自プロセスの値をグローバルデフォルトコンテキストから読みだせる | 不可(ローカルROS引数で上書きは可能) | コマンドラインROS引数から生成される |
| ローカルROS引数 | 不要 | 自ROSノードの値をフィールド参照で読みだせる | 不可 | executable実装時のコード中(Nodeのconstructorへの引数)で実装する |
| launch引数 | 必要。DeclareLaunchArgumentアクションで宣言する |
launchファイル中のどこでも読み出せる | 不可 | launchコマンドのコマンドライン引数として値を指定する |
| xacro実行引数 | 必要。xacro:argにおいてname=で宣言する |
xacroファイル中(includeしたxacroファイル含む)のどこでも読み出せる | 不可 | xacroコマンドのコマンドライン引数として値を指定する |
| xacroマクロ引数 | 必要。xacro:macroにおいて params=で宣言する |
宣言したマクロ中でのみ読み出せる。 | 不可 | マクロ呼び出し時に値を指定する |
ノードパラメータは単に「パラメータ」と呼ばれることもありますが
この記事では取り違えないようにノードパラメータと呼んでいます。
Discussion