Help us understand the problem. What is going on with this article?

ROS2におけるパラメータ変更に対するcallback関数の設定

ROS2関係トップページへ
メモ状態

概要

ROS2でパラメータが再設定された時に呼び出される関数(callback関数)をset_on_parameters_set_callbackで設定できる.
Crystal Clemmys以前ではregister_param_change_callback関数だったが,これは廃止予定.

set_on_parameters_set_callback関数について

公式githubを見ると当該関数は以下の宣言となる.

OnParametersSetCallbackType set_on_parameters_set_callback(OnParametersSetCallbackType callback)

で,このcallback関数を使うために必要な,OnParametersSetCallbackTypeは同じgithubのところで以下のように宣言されている.

using OnParametersSetCallbackType =
  std::function<
  rcl_interfaces::msg::SetParametersResult(const std::vector<rclcpp::Parameter> &)
  >;

で,callback関数の戻り値となるSetParametersResultは公式githubのrcl_interfaceの該当箇所をみると以下を持つ.

  • bool successful
  • string reason

というわけで,例えばパラメータをメンバ変数として持つ場合などでは,コンストラクタにて以下のように書く

NodeA::NodeA()
: Node(...){
...

  this->set_on_parameters_set_callback(
    [this](const std::vector<rclcpp::Parameter> params) -> rcl_interfaces::msg::SetParametersResult {
      auto results = std::make_shared<rcl_interfaces::msg::SetParametersResult>();
      for(auto param : params){
        if(param.get_name() == "param1"){
          member_param1_ = param.as_double(); // double型メンバ変数に代入
        }....
        }else{
          // パラメータ設定がうまくいかなかったとき
          results.successful = false;
          results.reason = "だめだった理由でも書く";
        }
      }
      // パラメータ設定がうまくいった
      results.successful = true;
      results.reason = ""; 
   }
  );
...
}

ちなみにcallback関数の場合,以下の感じ

calss NodeA : public rclcpp::Node{
  rcl_interfaces::msg::SetParametersResult
    param_reset_callback(const std::vector<rclcpp::Parameter> params);
...
};
rcl_interfaces::msg::SetParametersResult
NodeA::param_reset_callback(const std::vector<rclcpp::Parameter> params){
  auto results = std::make_shared<rcl_interfaces::msg::SetParametersResult>();
  for(auto param : params){
    if(param.get_name() == "param1"){
      member_param1_ = param.as_double(); // double型メンバ変数に代入
    }....
    }else{
      // パラメータ設定がうまくいかなかったとき
      results.successful = false;
      results.reason = "だめだった理由でも書く";
    }
  }
  // パラメータ設定がうまくいった
  results.successful = true;
  results.reason = ""; 
  }
}

NodeA::NodeA()
: Node(...){
...

  this->set_on_parameters_set_callback(
    std::bind(&NodeA::param_reset_callback, this, std::placeholders::_1)
  );
...
}

その他

package.xml,CMakeLists.txtについて

rcl_interfacesに関わる項目が必要かと思いきや,不必要.
多分,rclcppのパッケージに含まれている.

results変数について

resultsなくても動きます.
その場合,すっきりするかもしれません.
が,ビルド時にwarningが出てすっきりしません.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした