Parameterの使い方 – Japanese ROS2 Tutorial

Written by Takumi Okamoto

07/05/2024

This tutorial is created by Robotics Ambassador Takumi

 

Robotics Ambassador: theconstruct.ai/robotics-ambassador/

何を学ぶか

このチュートリアルでは公式チュートリアルの内容を参考にROS Paramを動的に書き換える方法を試してみます。

なんで?

ROS 2になって、Parameterの動的な書き換えが可能になりました。
Parameterを初期値やファイルパスの設定とかに使ってる方割と多いと思うのですが、動的にいじれるとサーバの接続先変えたり、テスト中に設定間違えたパラメータ書き直したりできます。
かなり便利で多用しているので、紹介したいと思いました。

環境

ROS2 Humble
rosject link https://app.theconstruct.ai/l/61071157/

作業

パッケージ作成

以下のコマンドでパッケージを作ります。

ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_param_exp --dependencies rclcpp

ソースコード記述

srcディレクトリに参考にc++のコードを書きましょう。

#include 

#include "rclcpp/rclcpp.hpp"

class SampleNodeWithParameters : public rclcpp::Node {
public:
  SampleNodeWithParameters() : Node("node_with_parameters") {
    this->declare_parameter("an_int_param", 0);

    param_subscriber_ = std::make_shared(this);

    auto cb = [this](const rclcpp::Parameter &p) {
      RCLCPP_INFO(
          this->get_logger(),
          "cb: Received an update to parameter \"%s\" of type %s: \"%ld\"",
          p.get_name().c_str(), p.get_type_name().c_str(), p.as_int());
    };
    cb_handle_ = param_subscriber_->add_parameter_callback("an_int_param", cb);
  }

private:
  std::shared_ptr param_subscriber_;
  std::shared_ptr cb_handle_;
};

int main(int argc, char **argv) {
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared());
  rclcpp::shutdown();

  return 0;
}

コードの動作としては、an_int_paramパラメータの更新を受け取ったら、そのデータをログに吐くといういたって単純なモノです。
特徴的な所があるとしたら、コールバック関数の定義にラムダ式を使っている所でしょうか。

コンパイル

次はコンパイルします。
package.xmlとCMakeList.txtの記述が必要ですが、特に難しいことはやってないので、詳しくはRosjectを参照してください。
(sourceはしている前提とします。)

cd ~/ros2_ws/
colcon buildじ

実行

以下のコマンドで実行していきます。

[端末A]

cd ~/ros2_ws/
user:~/ros2_ws$ . install/setup.bash
user:~/ros2_ws$ ros2 run cpp_param_exp parameter_event_handlerき

起動できたら、別の[端末B]を開いて以下のコマンドを実行します。”Set parameter successful”と出れば成功です。

cd ~/ros2_ws/
user:~$ ros2 param set /node_with_parameters an_int_param 10
Set parameter successful

端末Aを見ると以下のメッセージが表示され、parameterの更新に成功していることが分かります。

[INFO] [1714224724.898754729] [node_with_parameters]: cb: Received an update to parameter "an_int_param" of type integer: "10"

また,rqt_reconfigureを使ってguiでデータ設定をする事も出来ます。試しあれ。
[端末B]

 . install/setup.bash
ros2 run rqt_reconfigure rqt_reconfigure

Video Tutorial

Topics: parameter | ros2
Masterclass 2023 batch2 blog banner

Check Out These Related Posts

0 Comments

Pin It on Pinterest

Share This