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: このチュートリアルでは、rosservicerosparamなどのコマンドラインツールとともに、ROSのサービスやパラメータなどについて学びます

Tutorial Level: BEGINNER

Next Tutorial: rqt_console と roslaunch を使う

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の背景がクリアされました。

  • ROS/Tutorials/UnderstandingServicesParams/turtlesim.png

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 は以下のようになっているでしょう:

  • ROS/Tutorials/UnderstandingServicesParams/turtle(service).png

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 は以下のように見えていますね:

  • ROS/Tutorials/UnderstandingServicesParams/turtle(param).png

それではパラメータ サーバのその他のパラメータの値についても見てみましょう.背景色の緑色のチャネルの値を取得してみましょう:

$ 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を使ってみましょう.

Wiki: ja/ROS/Tutorials/UnderstandingServicesParams (last edited 2014-12-04 08:29:16 by Moirai)