LoginSignup
8
4

More than 5 years have passed since last update.

XmlRpc::XmlRpcValueでrosparamをまとめて取得

Last updated at Posted at 2017-11-25

rosparamである値を取ってくるということは非常に簡単にできます。
以下のようにパラメータのキーを元にノードハンドラ経由でパラメータを取得します。

sample.cpp
ros::NodeHandle nh;
std::string global_name, relative_name, default_param;
if (nh.getParam("/global_name", global_name))
{
  ...
}

if (nh.getParam("relative_name", relative_name))
{
...
}

// Default value version
nh.param<std::string>("default_param", default_param, "default_value");

しかし、ある程度大きなプログラムを書く場合、これだけでは困ることがあります。
僕は以下のようなyamlファイルでパラメータを設定し、それを一気に読み込んで設定をロードするようなノードを作る必要に迫られました。

ros_ship_recognition.yaml
input_cloud: /velodyne_points
target_objects:
  buoy:
    stl_filename: BUOY.stl
    marker_filename: BUOY.dae
  (object_name):
    stl_filename: (object_stl_file).stl
    marker_filename: (object_dae_file).dae

こういったrosparamの設定方法ではそもそもキーの名前がソースコード作成の段階で決められていないので上の簡単な方法ではパラメータ取得ができません。
そこで、今回はこう言った構造のパラメータを取得する方法について調べました。

複雑な構造のrosparamの取得

こう言ったパラメータはXmlRpc::XmlRpcValueを介して取得できます。
ノードハンドラを経由してパラメータを取得するやり方も引数が変わるだけで基本的に変わりません。

sample.cpp
XmlRpc::XmlRpcValue parameters;
nh_.getParam(ros::this_node::getName(), parameters);
pointcloud_topic_ = std::string(parameters["input_cloud"]);
XmlRpc::XmlRpcValue target_objects_params = parameters["target_objects"];
std::string resource_path = ros::package::getPath("ros_ship_recognition") + "/data/";
for(auto object_param_itr = target_objects_params.begin(); object_param_itr != target_objects_params.end(); ++object_param_itr)
{
  std::string stl_path = resource_path+std::string(object_param_itr->second["stl_filename"]);
  std::string mesh_path = resource_path+std::string(object_param_itr->second["marker_filename"]);
  object_models_.push_back(load_object_model(object_param_itr->first,stl_path,mesh_path));
}

取得したパラメータとキーの組み合わせはstd::mapのような形式で取得できます。
そのためfirst,secondといたメンバにアクセスすることでキーとパラメータを取得することができます。
これにイテレータを組み合わせることでキーが未知であったとしてもパラメータを取得することができますね!!

8
4
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
8
4