ROSのサービスとパラメータ
Simple Wiki Based Contents Management System
関心分野 >> Ros4Winのインストール >> ROSのサービスとパラメータ

ROSのサービスとパラメータ

このページでは、ROSシステムにおけるサービスとパラメータについて説明していきます。ここでもturtlesimを使っていきますので、起動してない場合には再度turtlesim_nodeを起動してください。

ROSサービス

ROSサービスは、ノードが他のノードとお互いに通信するための1つの方法です。サービスは、トピック通信と異なり、ノードがリクエストを送り、他のノードが処理をした後のレスポンスを受取るような通信を行います。結果として、1対1の通信になっており、同期・非同期の通信を行うことができます。
ここでは、rosserviceコマンドを使ってturtlesim_nodeのサービスを使ってみたいと思います。
rosserviceコマンドの使い方は、下のようになっています。
 >rosservice -h
Commands:
        rosservice args print service arguments
        rosservice call call the service with the provided args
        rosservice find find services by service type
        rosservice info print information about service
        rosservice list list active services
        rosservice type print service type
        rosservice uri  print service ROSRPC uri

Type rosservice <command> -h for more detailed usage, e.g. 'rosservice call -h'

rosservice listで一覧表示

まず最初にrosservice listコマンドで現在のROSシステムが提供しているサービスを取得したいと思います。
 >rosservice list
/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
これを見ると11個のサービスが存在します(前のチュートリアルからの続きであればもう少し表示されているかもしれません)。この11個のサービスのうち '/rosout'で始まるサービスは '/rosout'ノードのものであり、その他の9個のサービスがturtlesim_nodeのものです。

rosservice typeとrosservice infoでサービスを調査

次に各サービスについて詳しく調べたいと思います。個々のサービスを調べるには rosservice typeコマンドを使用します。
では、/clearというサービス型を調べて見ます。
 >rosservice type /clear
 std_srvs/Empty
/clearというサービスは、 std_srvs/Empty というサービス型であることがわかりました。このサービス型の詳細は、rossrvコマンドでさらに調べることができます。
 >rosservice type /clear | rossrv show
 ----

これは /clearというサービスは、リクエストにデータなしで呼出し、レスポンスの受取データがない ことを示しています。また、rosservice infoコマンドでこのサービスの詳細情報を調査します。
 >rosservice info /clear
Node: /turtlesim
URI: rosrpc://DESKTOP-CE3EPO3:52772
Type: std_srvs/Empty
Args: b''

また、/spawnいうサービスは下のようになります。
 >rosservice type spawn
turtlesim/Spawn

 >rosservice type spawn | rossrv show
float32 x
float32 y
float32 theta
string name
---
string name

 >rosservice info spawn
Node: /turtlesim
URI: rosrpc://DESKTOP-CE3EPO3:52772
Type: turtlesim/Spawn
Args: b'x y theta name'

/spawnというサービスの場合には、リクエストに x, y, theta, name の4つのデータを付けて呼出し、レスポンスに nameという string型のデータを1つ受け取ることを示しています。

rosservice callでサービスを呼び出す

次に、先ほど調べたサービスをrosservice callコマンドで呼び出したいと思います。rosservice callの使い方は、下のようになっています。
 >rosservice call -h
Usage: rosservice call /service [args...]

Options:
  -h, --help  show this help message and exit
  -v          print verbose output
  --wait      wait for service to be advertised
では、/clearのサービスを呼び出してみます。/clearは、リクエストにデータを付けない(引数なし)ですので、下のようになります。
 >rosservice call clear
この結果turtlesimの背景がクリアされたことを確認して下さい。
次にspawinサービスの呼出しもやってみましょう。このサービスは、与えられた位置と向きに新しい亀を生成します。nameの部分は任意であり、省略するとturtlesim_nodeが生成した名前が返ってきます。
 >rosservice call spawn 2 2 0.2 ""
name: "turtle2"
この結果、下のように2つ目の亀が生成されたことを確認してください。

パラメータ

ROSシステムでは、トピック通信、サービスの他にパラメータサーバという機能があります。この機能は、ROS変数設定のサービス+システム内のデータ共有サーバのような機能を提供しています。
パラメータサーバで利用可能なデータは、整数、少数、ブール値、辞書、リストなどのデータに限定されています。パラメータサーバに関する操作は、rosparamコマンドを用い、使用方法は下の通りです。
 >rosparam
rosparam is a command-line tool for getting, setting, and deleting parameters from the ROS Parameter Server.

Commands:
        rosparam set    set parameter
        rosparam get    get parameter
        rosparam load   load parameters from file
        rosparam dump   dump parameters to file
        rosparam delete delete parameter
        rosparam list   list parameter names

rosparam listで一覧表示

最初に rosparam listコマンドで現在のシステム内で利用可能なパラメータを調べてみます。
 > rospara list
/background_b
/background_g
/background_r
/rosdistro
/roslaunch/uris/host_desktop_srbnmg7__56383
/rosversion
/run_id
これを見ると /turtlesimノードは、背景色のための3つのパラメータをパラメータサーバ内に保持していることがわかります。
次のステップでは、パラメータの値を参照、変更をしてみましょう。

rosparam set と rosparam getで値の変更と取得

パラメータサーバのパラメータ値の変更には、rosparam setコマンド、参照には rosparam getコマンドを使います。
では、turtlesimの背景色の赤色のチャネルを変更してみましょう。
 > rosparam set background_r 150
これでパラメータ値が変更できましたが、turtlesimの背景は変化していないと思います。そこで、変更された背景色を有効にするために(再描画する)clearサービスを呼び出してみましょう。
 > rosservice call clear
これを実行すると下のようになったと思います。

これでパラメータサーバのパラメータ値の変更はできました。次は、他のパラメータ値を参照してみましょう。
背景色のパラメータは、緑と青もありましたので、背景色の緑の値(background_g)を取得します。
以下のコマンドを実行してみて下さい。
 > rosparam get background_g
86
これで背景色の緑のパラメータ値が取得できました。
また、rosparamコマンドでは、すべてのパラメータサーバの中身を見ることもできます。
 > rosparam get /
background_b: 255
background_g: 86
background_r: 150
rosdistro: 'melodic

  '
roslaunch:
  uris: {host_desktop_srbnmg7__56383: 'http://DESKTOP-SRBNMG7:56383/'}
rosversion: '1.14.3

  '
run_id: 642001e6-2a01-11e9-b4ff-983b8fa64a9f

rosparam dump と rosparam loadで保存と読込

rosparamコマンドは、個々のパラメータの操作の他に、一括して取得したり、設定したりすることができます。
現在のパラメータサーバのパラメータ値を一括してファイルに保存するには、rosparam dumpコマンドを使い、ファイルに保存されたパラメータの値を一括設定には、rosparam loadコマンドを使います。
では、現在のROSシステムのパラメータの値をparams.yamlというファイルに保存してみましょう。
 > rosparam dump params.yaml
このファイル名からもわかると思いますが、rosparam dumpコマンドで保存されたパラメータ値は、YAML形式のデータとして保存されます。
保存されたパラメータの値を一括設定には、rosparam loadコマンドを使います。params.yamlのファイルで background_gの値を100に変更して、下のコマンドを実行してみてください。
 > rosparam load params.yaml
 > rosparam get background_g
100
無事にパラメータが変更されていることを確認してください。
また、params.yamlのパラメータを別のネームスペースに読み込むこともできます。
 > rosparam load params.yaml copy
 > rosparam get copy/background_b
255
これで、ROSサービスとパラメータの基本的な操作は完了です。次は、rqt_consoleとroslaunchに進んでください。