ROS学習記録③:サービス通信とコード練習


Service通信とコード練習
  • 六、サービス通信
  • 6.1サーバ側作成
  • 6.1.1作成ノード
  • 6.1.2処理要求の論理
  • 6.1.3 Serverエンドによる
  • の実装
  • 6.2サーバ側デバッグ
  • 6.2.1 rosserviceツール(コマンドライン)
  • 6.2.2 rqt_service_callerツール(可視化)
  • 6.3 Client側作成
  • 6.3.1ノード
  • を作成する.
  • 6.3.2サービス
  • を呼び出す
  • 6.3.3 Clientエンド
  • を実現
  • 6.4 Clientエンドデバッグ
  • 6.5 Serviceコマンドラインツール
  • 七、サービス通信練習
  • 六、サービス通信
    6.1サーバ側の作成
    取付pyserial
    pip install pyserial
    

    ワークスペースの下にパッケージを作成する
    cd ros_ws/first_ws/src
    catkin_create_pkg hello_service rospy roscpp rosmsg
    

    Clionを使用してディレクトリhello_serviceを開き、scriptsディレクトリの下にPythonファイルserver_nodeを新規作成します.
    6.1.1ノードの作成
    rospy.init_node('server_node')
    

    Ctrl+Pの1番目のパラメータserviceNameをサービス名とし、1つのuriアドレスの2番目のパラメータservice_classがサービスに必要なデータ型である3番目のパラメータhandleがサービス要求のコールバックである
    6.1.2処理要求のロジック
    def callback(request):
        if not isinstance(request, AddTwoIntsRequest): return
    
        a = request.a
        b = request.b
    
        #       
        c = a + b
    	#       
        response = AddTwoIntsResponse()
        response.sum = c
        return response
    

    コールバック関数のパラメータは、要求されたデータの戻り値が応答するデータである
    6.1.3 Serverエンドの実装
    完全なコードは次のとおりです.
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time : 15/9/20 12:38 AM
    # @Author : Chenan_Wang
    # @File : server_node.py
    # @Software: CLion
    
    """
    client: 10 20
    server: 10 + 20
    """
    
    import rospy
    from rospy_tutorials.srv import AddTwoInts, AddTwoIntsRequest, AddTwoIntsResponse
    
    
    def callback(request):
        if not isinstance(request, AddTwoIntsRequest): return
    
        a = request.a
        b = request.b
    
        #       
        c = a + b
        #       
        response = AddTwoIntsResponse()
        response.sum = c
        return response
    
    
    if __name__ == '__main__':
        #     
        rospy.init_node('server_node')
    
        # server      server
        #    server
        #     
        service_name = '/hello/server'
        # service_class,       
        # handle,  ,         
        server = rospy.Service(service_name, AddTwoInts, callback)
    
        rospy.spin()
    

    6.2サーバ側のデバッグ
    6.2.1 rosserviceツール(コマンドライン)rosservice listコマンドを使用すると、現在実行されているすべてのサービスを検索できます.
    rosservice list
    

    クエリの結果、対応するサービス名/hello/serverが得られます.
    このサービスは、クエリーのサービス名によって呼び出されます.
    rosservice call /hello/server "a:1 b:3"
    
    rosservice callはサービスの呼び出しを担当します.最初のパラメータは呼び出すサービスの名前で、後のパラメータは呼び出すときに入力するパラメータです.
    6.2.2 rqt_service_callerツール(可視化)
    コマンド呼び出しツール
    rosrun rqt_service_caller rqt_service_caller
    

    6.3 Client側作成
    6.3.1ノードの作成
    rospy.init_node('client_node')
    

    6.3.2サービスの呼び出し
    #   servers    ,      ,    
    rospy.wait_for_service(service_name)
    #     
    client = rospy.ServiceProxy(service_name, AddTwoInts)
    #  server   
    request = AddTwoIntsRequest()
    request.a = 17
    request.b = 8
    response = client.call(request)
    

    6.3.3 Clientエンドインプリメンテーション
    完全なコードは次のとおりです.
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time : 15/9/20 2:21 AM
    # @Author : Chenan_Wang
    # @File : client_node.py
    # @Software: CLion 
    
    import rospy
    from rospy_tutorials.srv import AddTwoInts, AddTwoIntsRequest, AddTwoIntsResponse
    
    if __name__ == '__main__':
        #     
        rospy.init_node('client_node')
    
        #         client
        #       
        service_name = '/hello/server'
        client = rospy.ServiceProxy(service_name, AddTwoInts)
    
        #   servers    ,      ,    
        rospy.wait_for_service(service_name)
    
        #  server   
        request = AddTwoIntsRequest()
        request.a = 17
        request.b = 8
        response = client.call(request)
    
        if isinstance(response, AddTwoIntsResponse):
            print response.sum
    
        rospy.spin()
    

    6.4 Clientエンドデバッグ
    既存のserverでclientをデバッグ
    source devel/setup.bash
    rosrun hello_service server_node.py
    
    source devel/setup.bash
    rosrun hello_service client_node.py
    

    6.5 Serviceコマンドラインツール
    すべてのサービスを問い合わせる
    rosservice list
    

    サービス詳細の照会
    rosservice info     
    

    サービス転送のデータ型のクエリー
    rosservice type     
    

    シミュレーションクライアント側呼び出しサービス
    rosservcie call          
    

    サービス要求パラメータのクエリー
    rosservice args     
    

    七、サービス通信練習