LoginSignup
39
29

More than 5 years have passed since last update.

rosparamの使い方メモ

Posted at

概要

  • 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を作成しておくと便利です。

39
29
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
39
29