概要
パラメータを取得する際、指定したキー値がなかった場合のデフォルト値を設定する方法
環境
項目 | 値 |
---|---|
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!')
余談
公式wikiのgetParam
の説明にデフォルト値を返すバージョンもあるよとか書いてあったが、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);
}
参考サイト
- 公式リファレンス (C++) : http://docs.ros.org/en/api/roscpp/html/classros_1_1NodeHandle.html#a8d0a7ae423a715eced81fa984c3437ac
- 公式wiki (C++) : http://wiki.ros.org/roscpp/Overview/Parameter%20Server
- 公式wiki (Python) : http://wiki.ros.org/rospy/Overview/Parameter%20Server