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

ROS講座78 rosparamを使う2

環境

この記事は以下の環境で動いています。

項目
CPU Core i5-8250U
Ubuntu 16.04
ROS Kinetic

インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。

概要

前回は基本的なint型のparameterを読み込みましたが、rosparamでは辞書型やリスト型も使えます。これらの型のrosparamをROSノードで使う方法を解説します。

ソースコード

yamlファイル

今回読み込むパラメーターを記述したファイルです。以下の様にリスト型があり、そのアイテムが辞書型になっています。

adv_lecture/config/param2_config
member_list:
  - name: aaa
    id: 1
  - name: bbb
    id: 2
  - name: ccc
    id: 3

launch

adv_lecture/launch/rosparam2.launch
<launch>
  <node name="adv_param2_display" pkg="adv_lecture" type="adv_param2_display" output="screen">
    <rosparam command="load" file="$(find adv_lecture)/config/param2_config.yaml"/>
  </node>
</launch>

先ほどのyamlファイルをロードしています。

ソースコード(rosノード)

adv_lecture/src/adv_param2_display.cpp
#include <ros/ros.h>

int main(int argc, char** argv)
{
  ros::init(argc, argv, "do_dishes_client");
  ros::NodeHandle nh;
  ros::NodeHandle pnh("~");

  XmlRpc::XmlRpcValue member_list;
  pnh.getParam("member_list", member_list);
  ROS_ASSERT(member_list.getType() == XmlRpc::XmlRpcValue::TypeArray);
  ROS_INFO("member size: %i", (int)member_list.size());
  for (int32_t i = 0; i < member_list.size(); ++i)
  {
    ROS_INFO("read [%i]", i);
    int id = 0;
    std::string name = "";
    if (!member_list[i]["id"].valid() || !member_list[i]["name"].valid())
    {
      ROS_WARN("No id or name");
      continue;
    }
    if (member_list[i]["id"].getType() == XmlRpc::XmlRpcValue::TypeInt)
      id = static_cast<int>(member_list[i]["id"]);
    if (member_list[i]["name"].getType() == XmlRpc::XmlRpcValue::TypeString)
      name = static_cast<std::string>(member_list[i]["name"]);
    ROS_INFO("[%i] id: %i, name: %s", i, id, name.c_str());
  }
  return 0;
}
  • XmlRpc::XmlRpcValue member_list; pnh.getParam("member_list", member_list);でxmlrpc形式で読み込みます。
  • 辞書やリストにはmember_list[i]["id"]のように添え字でアクセスします。
  • getType()でその値の型を判別します。TypeInvalid, TypeBoolean, TypeInt, TypeDouble, TypeString, TypeArrayなどがあります。
  • リスト型なら.size()でサイズを取得できます。
  • 辞書型なら.valid()でそのキーがあるかどうかを判定します。
  • 値を読むときはstatic_cast<int>()のようにキャストします。

ビルド

cd ~/catkin_ws
catkin_make

実行

roslaunch adv_lecture rosparam2.launch 

以下のように表示されるはずです。

結果
[ INFO] [1588423525.235388960]: member size: 3
[ INFO] [1588423525.235467370]: read [0]
[ WARN] [1588423525.235506030]: No id or name
[ INFO] [1588423525.235519417]: read [1]
[ INFO] [1588423525.235534347]: [1] id: 1, name: bbb
[ INFO] [1588423525.235543629]: read [2]
[ INFO] [1588423525.235553543]: [2] id: 2, name: ccc

参考

rosparamタグ
parameter_server

目次ページへのリンク

ROS講座の目次へのリンク

srs
ロボットを日々こつこつと製作しています。ロボットやROSやC++、pythonに関心があります。
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
ユーザーは見つかりませんでした