1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ROS2における個々のパラメータの詳細設定 - ParameterDescriptorの使用 -

Last updated at Posted at 2021-08-03

ROS2導入&レクチャー

概要

個々のパラメータをdeclare_parameterで宣言する時にそのパラメータの詳細を設定できる.それにより,例えばread only(変更不可)にしたりできる.

パラメータタイプの動的変更について

パラメータのタイプ(int型とか)は,foxy以前のデフォルトが「変更可」であった.これがgalactic以降のデフォルトは「変更不可」となった.

25行目を見比べると,bool dynamic_typing falseが追加されていることがわかる.

ParameterDescriptorによるパラメータの詳細設定

設定できる項目についてはParameterDescriptor.msgを参照のこと.

設定手順例

例として,ParameterDescriptor.msgにある項目read_onlyを試す.デフォルトではfalseになっており,変更可になっている.これを変えて変更不可として宣言する方法を述べる.
なお参考元はros2 githubのここ

cpp
...(コンストラクタの中とかのパラメータの宣言部分)
  rcl_interfaces::msg::ParameterDescriptor descriptor;
  descriptor.read_only = true;

  this->declare_parameter("test_param", 0, descriptor);

...

項目の説明

ParameterDescriptor.msgの各項目についての説明.

string name

パラメータの名前.現在のところ何に使うのか不明.単なる識別するための文字?

uint8 type

typeの指定.詳しくはrcl_interfaces::msg::ParameterType.msgを見ろとのこと.

  • uint8 PARAMETER_NOT_SET=0
  • uint8 PARAMETER_BOOL=1
  • uint8 PARAMETER_INTEGER=2
  • uint8 PARAMETER_DOUBLE=3
  • uint8 PARAMETER_STRING=4
  • uint8 PARAMETER_BYTE_ARRAY=5
  • uint8 PARAMETER_BOOL_ARRAY=6
  • uint8 PARAMETER_INTEGER_ARRAY=7
  • uint8 PARAMETER_DOUBLE_ARRAY=8
  • uint8 PARAMETER_STRING_ARRAY=9

string description

覚書かな?たんなるメモ?

string additional_constraints

ParameterDesctiptorで設定できない制約条件を書いておくこと.例えば"only prime numbers"(素数のみ!)とか.

bool read_only

デフォルト値はfalse

  • read_only=true
    • 書き込み不可
    • undeclare_parameterもエラーになる
  • read_only=false
    • 書き込みOK

bool dynamic_typing

galacticより追加された項目.
galactic以降でのデフォルト値はfalse
foxy以前でのデフォルト値はtrue

  • dynamic_typing=true
    • 実行途中でパラメータの型を変更可
  • dynamic_typing=false
    • 実行途中でパラメータの型を変更不可

FloatingPointRange[<=1] floating_point_range

もしuint8 typeuint8 PARAMETER_DOUBLE=3またはuint8 PARAMETER_DOUBLE_ARRAY=8を選んだ場合,使用する変数の範囲について制限を加えられる.
デフォルト値はの時,特に制限は加えられず,何か値を設定したときにこの制限は有効になる.
また[IntegerRange[<=1] integer_range](#IntegerRange[<=1] integer_range)と排他的(どっちかしか使えない).
詳しくはrcl_interfaces::msg::FloatingPointRange.msgを参照のこと.

基本的に設定できる内容は以下の三つ.

  • from_value
  • to_value
  • step
    • step=0.0の時,from_valueからto_valueの間の連続値が有効な値となる.
    • 逆に言うと,stepが0.0以外の値であれば飛び飛びの値になる.
    • 正負は区別されず絶対値が使用されると考えればよい.

  • from_value=1.0, to_value=2.0, step=0.5
    • 有効な値: {1.0, 1.5, 2.0}
  • from_value=1.0, to_value=2.0, step=0.8
    • 有効な値: {1.0, 1.8, 2.0}
  • from_value=1.0, to_value=2.0, step=10.0
    • 有効な値: {1.0, 2.0}

1番目の例を設定する場合(参考).

...
  rcl_interfaces::msg::ParameterDescriptor d;
  d.type=3; // PARAMETER_DOUBLE=3
  d.floating_point_range.resize(1);
  auto& range = d.floating_point_range.at(0);
  range.from_value=1.0;
  range.to_value=2.0;
  range.step=0.5;
...

ちなみにrcl_interfaces::msg::ParameterDescriptorに関する#includeはいらない(rclcpp/rclcpp.hppに入っている?)
また判定のタイミングはadd_on_set_parameters_callback関数で指定されたパラメータ変更用のコールバック関数の「処理後」となる.考え方としては,

  1. パラメータ変更の指示が届く(例えばros2 param set <package名> <パラメータ名> <値>)
  2. 値に従って前処理がおこなわれる.
  3. 前処理が大丈夫なら,いよいよパラメータ変更.この時にfrom_value, to_value, stepで判定が行われる.

IntegerRange[<=1] integer_range

[FloatingPointRange[<=1] floating_point_range](#FloatingPointRange[<=1] floating_point_range)と全く同じ.対象としているのが実数値か整数値かの違い.stepに関しても同じ.
詳しくはrcl_interfaces::msg::IntegerRange.msgを参照のこと.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?