Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
9
Help us understand the problem. What are the problem?
@srs

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, "param_sample");
  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

補足

  • XmlRpc::XmlRpcValue::getType()で判定できる値として以下があります(本当はもう少しありますが、ROSで出てくるのはこれぐらい)。
    • TypeBoolean
    • TypeInt
    • TypeDouble
    • TypeString
    • TypeArray
    • TypeStruct
  • TypeArrayやTypeStructは範囲for文が使えます

参考

rosparamタグ
parameter_server

目次ページへのリンク

ROS講座の目次へのリンク

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
9
Help us understand the problem. What are the problem?