Note: This tutorial assumes that you have completed the previous tutorials: ROSトピックの理解. |
Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags. |
ROSのサービスとパラメータを理解する
Description: このチュートリアルでは、rosserviceや rosparamなどのコマンドラインツールとともに、ROSのサービスやパラメータなどについて学びますTutorial Level: BEGINNER
Next Tutorial: rqt_console と roslaunch を使う
Contents
turtlesim_node は前のチュートリアルから起動したままだと思います.turtlesim が提供するサービスを見てみましょう:
ROS サービス
サービスはノードが他のノードとお互いに通信するための1つの手段です.サービスはノードがリクエストを送り,レスポンスを受け取れるようにします.
rosservice を使う
rosservice はサービスを用いて ROS のクライアント/サービスの仕組みを簡単に付け加えます.rosservice には以下に示す通り,トピックに使用できる多くのコマンドがあります:
使い方:
rosservice args サービスの引数を表示する rosservice call 引数で渡されたサービスを呼び出す rosservice find サービス型に応じたサービスを探す rosservice info サービスについての情報を表示する rosservice list アクティブなサービスの情報を表示する rosservice type サービスの型を表示する rosservice uri ROSRPC uri サービスを表示する
rosservice list
$ rosservice list
list コマンドで turtlesim ノードが9つのサービスを提供していることが分かります: reset, clear, spawn, kill, turtle1/set_pen, /turtle1/teleport_absolute, /turtle1/teleport_relative, turtlesim/get_loggers, そしてturtlesim/set_logger_level です. 別々のrosout ノードに関連した /rosout/get_loggers, /rosout/set_logger_level という2つのサービスもあります.
/clear /kill /reset /rosout/get_loggers /rosout/set_logger_level /spawn /turtle1/set_pen /turtle1/teleport_absolute /turtle1/teleport_relative /turtlesim/get_loggers /turtlesim/set_logger_level
rosservice type
rosservice type を使って, clear サービスについて,詳しく見てみましょう:
使い方:
rosservice type [service]
clear サービスの型を調べてみましょう:
$ rosservice type clear
std_srvs/Empty
このサービスの型は空で,このことはサービスを呼び出すのに引数がいらない(例えば,リクエストの作成にデータを送らない,レスポンスの受け取りにデータを受け取らない)ことを意味しています.このclearサービスを rosservice call を使用して呼び出しましょう:
rosservice call
使い方:
rosservice call [service] [args]
ここでは引数をつけないで呼び出します.なぜならサービスが空の型だからです。 実行してみましょう:
rosservice call clear
これが我々が求めていたものですね。turtlesim_nodeの背景がクリアされました。
spawnサービスの情報を使って、サービスが引数をとる場合についても見てみましょう:
$ rosservice type spawn| rossrv show
float32 x float32 y float32 theta string name --- string name
このサービスは与えられた位置と向きに新しいturtleを誕生させます.名前フィールドは任意です.それでは名前を付けずに新しいturtleを作ってみましょう.
$ rosservice call spawn 2 2 0.2 ""
サービスは新たに作られたturtleの名前を返します.
name: turtle2
turtlesim は以下のようになっているでしょう:
rosparam を使う
rosparam は ROS パラメータ サーバを用いてデータの蓄積や操作を実現します.パラメータ サーバは,整数・小数・真偽値・辞書・リストを蓄積できます.rosparamはYAML形式を使います。単純なケースではYAML は実に自然で、1 が整数,1.0 が小数,one が文字列,trueが真偽値,[1, 2, 3] が整数リスト,{1: b, c: d} が辞書です.rosparam には以下に示すトピックで使用される多くのコマンドがあります.
使い方:
rosparam set パラメータを設定します rosparam get パラメータを取得します rosparam load ファイルからパラメータを読み込みます rosparam dump ファイルへパラメータを書き出します rosparam delete パラメータを消去します rosparam list パラメータ名をリスト化します
では今,どんなパラメータがパラメータ サーバにあるのか見ていきましょう:
rosparam list
$ rosparam list
turtlesim ノードが背景色のための3つのパラメータをパラメータ サーバ内に保持していることが分かります:
/background_b /background_g /background_r /rosdistro /roslaunch/uris/aqy:51932 /rosversion /run_id
次にrosparam set を使って,パラメータの値を変えてみましょう:
rosparam set と rosparam get
使い方:
rosparam set [param_name] rosparam get [param_name]
背景色の赤色のチャネルを変えてみましょう:
$ rosparam set background_r 150
これはパラメータの値を変更しています。パラメータの変更を有効にするためには、ここでclearサービスを呼び出さなくてはなりません:
$ rosservice call clear
これでturtlesim は以下のように見えていますね:
それではパラメータ サーバのその他のパラメータの値についても見てみましょう.背景色の緑色のチャネルの値を取得してみましょう:
$ rosparam get background_g
144
全てのパラメータ サーバの中身を見るために,rosparam get / を使うこともできます.
$ rosparam get /
background_b: 255 background_g: 144 background_r: 150 rosdistro: 'hydro ' roslaunch: uris: {'aqy:51932': 'http://aqy:51932/'} rosversion: '1.10.11 ' run_id: e07ea71e-98df-11de-8875-001b21201aa8
別の機会に再利用できるように、この設定値をファイルに書き出しておきたいというような時、rosparamを使うと簡単にできますね。
rosparam dump と rosparam load
使い方:
rosparam dump [file_name] rosparam load [file_name] [namespace]
ここで全てのパラメータの値をparams.yamlに書き込むには:
$ rosparam dump params.yaml
こうしてできたyamlファイルを、例えばcopyと付けたネームスペースに読み込むこともできます:
$ rosparam load params.yaml copy $ rosparam get copy/background_b
255
ここでは ROS サービスとパラメータの働きについて理解しました.次は rqtconsole と roslaunchを使ってみましょう.