前々回、rclcpp (ROS Client Library for C++) を読み解く (2)の続きで、サンプルプログラムを書いていくつもりでしたが、本日は途中で出てきたROS 2のパラメータに関して、まず学ぶことにしました。

ROS 2にもROS 1と同様にパラメータがあります。 パラメータというのは、グローバル変数みたいなものであり、ノードをまたいでアクセスすることができます。 ただし、取得、設定の通信速度は速くありませんので、動的に逐次変化するものはトピックで扱い、ほぼ静的でたまに変化するものをパラメータとして扱いましょう。

パラメータの種類

パラメータには以下のデータ型を使うことができます。最後のbytes[]はバイナリデータを扱うために用いられます。

  • float64:浮動小数点数
  • int64:整数
  • string:文字列
  • bool:論理値
  • bytes[]:バイト列

パラメータの設定・取得

rclcpp (ROS Client Library for C++) を読み解く (1)で見たパラメータ関連のメソッドを呼ぶことで、パラメータの値を設定、取得することができます。

ソースコードは下記デモのものを参考にしました。

https://github.com/ros2/demos/tree/master/demo_nodes_cpp/src/parameters

パラメータの非同期取得

パラメータは上記rclcpp::parameter_client::SyncParametersClientを使うと、パラメータの値が取得できるまで待ってしまいますが、非同期取得の方法も用意されています。

auto parameters_client = std::make_shared<rclcpp::parameter_client::SyncParametersClient>(node);

auto parameters_client = std::make_shared<rclcpp::parameter_client::AsyncParametersClient>(node);

に変更し、パラメータの取得メソッドを非同期処理ライブラリでよく使われるFutureパターンを使って、Futureオブジェクトの取得と値の取り出しの2段階に分けるだけです。 これにより、Futureオブジェクトだけ取得し何らかの時間がかかる処理をして、その後、値を取り出すことができるようになります。

その他、コールバック関数でイベントドリブンに処理することもできます。