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