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

rosparamの使い方メモ

More than 3 years have passed since last update.

概要

  • rosparamの使い方についてのメモ
  • コマンドラインから使用
  • launchファイルから使用
  • C++, Pythonから使用

環境

  • ubuntu 16.04
  • ROS kinetic

rosparamとは

  • wiki
  • roscore起動時に一緒に起動されるROS Parameter Server
  • 定数などのパラメータを設定するために使用する
  • 各値はROS Parameter Serverに登録される
    • /foo/bar とパスを指定することで各パラメータにアクセスできる
  • roscore終了時に登録した値は全て削除される
  • 設定できる値は
    • int
    • double
    • string
    • date
    • list
    • base64

コマンドラインでの使い方

設定されてる値のパス一覧を取得

$ rosparam list

値を設定

$ rosparam set /foo hogehoge

値を取得

$ rosparam get /foo
  • 階層構造になってるので子の要素がある場合は連想配列として取得できる

値を削除

$ rosparam delete /foo
  • getと同じくこの要素がある場合は指定したパス以下の値を全て削除する

設定値をyamlファイルに書き出す

$ rosparam dump config.yaml

yamlから設定値をロードする

$ rosparam load config.yml

launchファイルから使用

  • launchファイルでrosparamタグを使用するとroslaunch時に読み込みや削除ができる
<launch>
  <rosparam command="load" file="$(find package_name)/example.yaml" />
  <rosparam command="delete" param="my/param" />
</launch>
  • nodeなどと同じくネームスペースも指定できる
<launch>
  <rosparam ns="foo" command="load" file="$(find package_name)/example.yaml" />
</launch>

Pythonから扱う

  • rosparamモジュールを使う方法と、rospyを使う方法があります

rosparam

rosparamコマンドのラッパー的な感じで、
get,setはもちろんできますが、コマンドでできるloadとかdumpをしたい場合はこちらを使います。

>>> import rosparam
>>> rosparam.get_param("/foo/bar")
1
>>> rosparam.set_param("/foo/bar/path", "value")
>>> rosparam.get_param("/foo/bar/path")
'value'
>>> rosparam.get_param("/foo")  # 階層になっている場合はdictで取得できる
{'bar': {'path': 'value'}}

rospy

rospyでもget, setはできますが、loadやdumpはできません。
rosparamと同じく存在しないキーを参照しようとするとExceptionが発生しますが、
存在しない場合のデフォルト値をしていすることができます。

>>> import rospy
>>> rospy.get_param("/foo/bar/")
{'path': 'value'}
>>> rospy.get_param("/foo/bar/path")
'value'
>>> rospy.get_param("/foo/bar/undefined")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rospy/client.py", line 465, in get_param
    return _param_server[param_name] #MasterProxy does all the magic for us
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rospy/msproxy.py", line 123, in __getitem__
    raise KeyError(key)
KeyError: '/foo/bar/undefined'
>>> print rospy.get_param("/foo/bar/undefined", None)
None

C++から扱う

C++の場合はNodeHandleからrosparamを扱うことができます。

#include <ros/ros.h>

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

  // 取得したいパラメータの値に対応する型の変数を引数で渡す
  int int_param;
  nh.getParam("/foo/bar", int_param);

  std::cout << int_param << std::endl;
  return 0;
}
  • 実行結果
$ rosrun rosparam_ex rosparam_ex_node 
1

複数の値を一度に取得したい場合はXmlRpcValueを使います。

#include <ros/ros.h>

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

  XmlRpc::XmlRpcValue params;
  nh.getParam("/foo/bar", params);

  std::cout << params << std::endl;

  std::cout << params["path"] << std::endl;  // std::mapと同じ要領で値を取得できる

  return 0;
}
  • 実行結果
$ rosrun rosparam_ex rosparam_ex_node 
[path:value]
value

rosparamを使用することで初期化の設定などを変えることができるので、
起動時の引数が多くなってしまった時などはユースケースごとにyamlを作成しておくと便利です。

groove-x
世界のどこにもない、心を満たすロボットを。私たちGROOVE Xは2015年に設立したスタートアップです。私たちの考えるロボットは、人々の生活に潤いを与える存在として、人が一緒にいたくなるような新世代の家庭用ロボットです。便利さや機能性ではなく、家族や伴侶として愛される存在になれるかどうか。 GROOVE Xが追求するのはあなたの感性の領域に訴えるロボットです。
https://groove-x.com/
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
ユーザーは見つかりませんでした