このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

ROS サービスの呼び出しと提供

ROS は、トピックとサービスという主要な 2 つの通信メカニズムをサポートしています。トピックにはパブリッシャーとサブスクライバーがあり、メッセージの送受信に使用されます (ROS のパブリッシャーおよびサブスクライバーとのデータ交換を参照)。一方、"サービス" は、要求/応答の通信を可能にすることによってより緊密な結合を実装します。"サービス クライアント" は "サービス サーバー" に要求メッセージを送信し、応答を待ちます。サーバーは、要求内のデータを使用して応答メッセージを構成し、クライアントに送り返します。各サービスには、要求メッセージと応答メッセージの構造を決定するタイプがあります。また、サービスには ROS ネットワーク内で一意の名前があります。

このサービス通信には、以下の特徴があります。

  • サービス要求 (またはサービス呼び出し) は、1 対 1 の通信に使用されます。1 つのノードが要求を開始し、1 つのノードのみが要求を受信して応答を送り返します。

  • サービス クライアントとサービス サーバーは、サービス呼び出しが実行される際に強く結合します。サービスの呼び出し時にサーバーは存在していなければならず、要求が送信されると、応答を受信するまでクライアントはブロックされます。

サービスの概念を以下の図に示します。

この例では、ROS ネットワークにサービスをアドバタイズするためにサービス サーバーを設定する方法を説明します。さらに、サービス クライアントを使用してサーバーを呼び出し、応答を受信する方法も学習します。

必要条件: ROS 入門ROS ネットワークへの接続ROS のパブリッシャーおよびサブスクライバーとのデータ交換

サービス サーバーの作成

サービスの諸概念を確認する前に、MATLAB® の ROS マスターとサンプル ROS ネットワークを起動します。exampleHelperROSCreateSampleNetwork はいくつかのサービス サーバーを作成して現実的な ROS ネットワークをシミュレートします。

rosinit
Initializing ROS master on http://bat583208glnxa64:37949/.
Initializing global node /matlab_global_node_30652 with NodeURI http://bat583208glnxa64:35805/
exampleHelperROSCreateSampleNetwork

サービスが呼び出されると "A service client is calling" と表示する、シンプルなサービス サーバーを作成するとします。rossvcserver コマンドを使用してサービスを作成します。サービス名とサービス メッセージ タイプを指定します。また、コールバック関数を exampleHelperROSEmptyCallback として定義します。サービス サーバーのコールバック関数は、特定のシグネチャをもちます。詳細については、rossvcserver のドキュメンテーションを参照してください。

testserver = rossvcserver('/test', 'std_srvs/Empty', @exampleHelperROSEmptyCallback)
testserver = 
  ServiceServer with properties:

      ServiceName: '/test'
      ServiceType: 'std_srvs/Empty'
    NewRequestFcn: @exampleHelperROSEmptyCallback

ROS ネットワーク内のすべてのサービスをリストすると、新規サービス /test を確認できます。

rosservice list
/add
/reply
/test

rosservice info を使用すると、サービスについてより詳しい情報が得られます。グローバル ノードは、サービス サーバーが到達可能なノードとしてリストされ、そのサービス タイプ std_srvs/Empty も表示されます。

rosservice info /test
Node: /matlab_global_node_30652
URI: rosrpc://bat583208glnxa64:41819/
Type: std_srvs/Empty
Args:

サービス クライアントの作成

サービス クライアントを使用して、ROS サービス サーバーに情報を要求します。クライアントを作成するには、サービス名を引数として rossvcclient を使用します。

先ほど作成した /test サービスのサービス クライアントを作成します。

testclient = rossvcclient('/test')
testclient = 
  ServiceClient with properties:

    ServiceName: '/test'
    ServiceType: 'std_srvs/Empty'

サービスに対する空の要求メッセージを作成します。関数 rosmessage を使用して、クライアントを最初の引数として渡します。これにより、サービスによって指定されるメッセージ タイプをもつサービス要求関数が作成されます。

testreq = rosmessage(testclient)
testreq = 
  ROS EmptyRequest message with properties:

    MessageType: 'std_srvs/EmptyRequest'

  Use showdetails to show the contents of the message

サーバーからの応答を取得する場合は、関数 を使用します。これは、サービス サーバーを呼び出して応答を返します。先ほど作成したサービス サーバーが空の応答を返します。さらに、関数 exampleHelperROSEmptyCallback を呼び出して文字列 "A service client is calling" を表示します。Timeout パラメーターも定義できますが、これは、クライアントが応答を待つ時間を示します。

testresp = call(testclient,testreq,'Timeout',3);

2 つの数値を加算するサービスの作成

これまでのところ、サービス サーバーは意味のある仕事をまったくしていませんが、計算およびデータ操作にサービスを利用することができます。2 つの整数を加算するサービスを作成します。

このタスクに使用できる既存のサービス タイプ roscpp_tutorials/TwoInts があります。rosmsg show を呼び出して、要求メッセージと応答メッセージの構造を検査できます。要求には 2 つの整数 AB が含まれており、応答ではそれらの和が Sum に格納されます。

rosmsg show roscpp_tutorials/TwoIntsRequest
int64 A
int64 B
rosmsg show roscpp_tutorials/TwoIntsResponse
int64 Sum

このメッセージ タイプ、および和を計算するコールバック関数をもつサービス サーバーを作成します。便宜上、関数 exampleHelperROSSumCallback が既にこの計算を実装しています。この関数をコールバックとして指定します。

sumserver = rossvcserver('/sum', 'roscpp_tutorials/TwoInts', @exampleHelperROSSumCallback)
sumserver = 
  ServiceServer with properties:

      ServiceName: '/sum'
      ServiceType: 'roscpp_tutorials/TwoInts'
    NewRequestFcn: @exampleHelperROSSumCallback

サービス サーバーを呼び出すには、サービス クライアントを作成しなければなりません。このクライアントは ROS クライアントの任意の場所に作成できる点に注意してください。この例のために、MATLAB に /sum サービスのクライアントを作成します。

sumclient = rossvcclient('/sum')
sumclient = 
  ServiceClient with properties:

    ServiceName: '/sum'
    ServiceType: 'roscpp_tutorials/TwoInts'

要求メッセージを作成します。2 つの整数 AB を定義できます。これらは コマンドを使用すると加算されます。

sumreq = rosmessage(sumclient);
sumreq.A = 2;
sumreq.B = 1
sumreq = 
  ROS TwoIntsRequest message with properties:

    MessageType: 'roscpp_tutorials/TwoIntsRequest'
              A: 2
              B: 1

  Use showdetails to show the contents of the message

これら 2 つの数の和は 3 になると予想されます。このサービスを呼び出すには、次のコマンドを使用します。サービスの応答メッセージには、AB の和を格納する Sum プロパティが含まれます。

sumresp = call(sumclient,sumreq,'Timeout',3)
sumresp = 
  ROS TwoIntsResponse message with properties:

    MessageType: 'roscpp_tutorials/TwoIntsResponse'
            Sum: 3

  Use showdetails to show the contents of the message

ROS ネットワークのシャットダウン

ROS ネットワークからサンプル ノードとサービス サーバーを削除します。

exampleHelperROSShutDownSampleNetwork

ROS マスターをシャットダウンしてグローバル ノードを削除します。

rosshutdown
Shutting down global node /matlab_global_node_30652 with NodeURI http://bat583208glnxa64:35805/
Shutting down ROS master on http://bat583208glnxa64:37949/.

次のステップ