LoginSignup
0
1

rosparam + デフォルト値

Last updated at Posted at 2022-06-15

概要

パラメータを取得する際、指定したキー値がなかった場合のデフォルト値を設定する方法

環境

項目
Ubuntu 20.04
ROS Noetic

ソースコード(C++)

メソッドros::NodeHandle::param()を使う。

// private node handleの初期化
ros::NodeHandle private_node_handle("~");

// デフォルト値"param!"でパラメーターを取得
auto param = private_node_handle.param("path/to/param", std::string("param!"));

以下のように参照渡しでも設定可能

// パラメーター保存用の変数の宣言
std::string param;

// paramにパラメーターの値を設定
if (private_node_handle.param("path/to/param", param, std::string("param!")))
{
  ROS_INFO(
    "parameter %s set by user to path/to/param",
    private_node_handle.resolveName("path/to/param_none").c_str(),
    param.c_str()
  );
}
else
{
  ROS_INFO(
    "parameter %s set default",
    private_node_handle.resolveName("path/to/param_none").c_str()
  );
}

コードからもわかるよう(?)に、この使い方においてros::NodeHandle::param()は、パラメーターサーバーからパラメーターを取得できた場合は、trueを、取得できなかった(=デフォルト値を設定した)場合はfalseを返す。

ソースコード(Python)

Pythonではもっと簡単にできて、rospy.get_param()の第2引数にデフォルト値を指定すれば良い(公式wikiにもコード例がある)

param = rospy.get_param('~path/to/param', 'param!')

余談

公式wikigetParamの説明にデフォルト値を返すバージョンもあるよとか書いてあったが、wiki自体には書いてなかったので以下のように実装していた。

ros::NodeHandle private_node_handle("~");
// 宣言時にデフォルト値で初期化
std::string param = "param!";

// パラメーターを取得できた場合のみ上書く
if (private_node_handle.hasParam("path/to/param"))
{ 
  private_node_handle_.getParam("path/to/param", param);
}

参考サイト

0
1
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
0
1