Pythonのサービスサービスとクライアント・ノードの論文に書かれたROS2の研究ノート

学習目標:パイソンを使用して、クライアントとサーバノードの単純なサービスを作成して実行します。

背景

通信相手を介してサービスノードが送信する際のデータは、私たちは、クライアント、我々はサーバー呼び出しの端を、対応する受信したデータを呼び出して要求します。リクエストとレスポンスのデータ構造.srvファイルの決定。
私たちは和を作るこのルーチンは、ノードは二つの整数、それに応じて別のノード要求を追加する要求を送信します。

予備的

私たちは、ワークスペース、機能パックを作成する方法を知っています

学びます

1パッケージを作成します。

チュートリアル用の新しいパッケージを作成します。

cd ~/dev_ws/src
ros2 pkg create --build-type ament_python py_srvcli --dependencies rclpy example_interfaces

1.1アップデートのpackage.xml

私たちが使用しているので--dependenciesオプションを、私たちは依存するオプションを追加する必要はありません。私たちは、ライセンスのみのコンテンツ、機能パックの説明擁護者の名前と連絡先情報を記入する必要があります

<description>Python client server tutorial</description>
<maintainer email="[email protected]">Your Name</maintainer>
<license>Apache License 2.0</license>

1.2アップデートsetup.py

更新setup.pypackage.xml一貫

maintainer='Your Name',
maintainer_email='[email protected]',
description='Python client server tutorial',
license='Apache License 2.0',

サービスノードのサービスを書く2。

dev_ws/src/py_srvcli/srcフォルダの作成service_member_function.py、ファイルを保存し、次の内容を貼り付けます。

from example_interfaces.srv import AddTwoInts

import rclpy
from rclpy.node import Node


class MinimalService(Node):

    def __init__(self):
        super().__init__('minimal_service')
        self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.add_two_ints_callback)

    def add_two_ints_callback(self, request, response):
        response.sum = request.a + request.b
        self.get_logger().info('Incoming request\na: %d b: %d' % (request.a, request.b))

        return response


def main(args=None):
    rclpy.init(args=args)

    minimal_service = MinimalService()

    rclpy.spin(minimal_service)

    rclpy.shutdown()


if __name__ == '__main__':
    main()

2.1コード説明

Pythonのクライアント・ノード・クラスの最初のサービスローディングメッセージタイプのライン、及びその後ロードされROS2

from example_interfaces.srv import AddTwoInts

import rclpy
from rclpy.node import Node

次は、後でクラスを定義し、コンストラクタ関数内のノードの名前を初期化し、サービスの名前、およびコールバック関数のタイプ

def __init__(self):
    super().__init__('minimal_service')
    self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.add_two_ints_callback)

それぞれの添加後に受信されたコールバック関数が戻るの二つの数字、コンソールにしながら、印刷メッセージ。

def add_two_ints_callback(self, request, response):
    response.sum = request.a + request.b
    self.get_logger().info('Incoming request\na: %d b: %d' % (request.a, request.b))

    return response

最後に、メインクラスの初期化ROS2 Pythonクライアントの主な機能は、コールバック保留、サービスノードを作成します。

2.2 [プログラムエントリの追加

オープンsetup.pyした後、console_scripts次のプログラム行入口ブラケットを追加します:

'service = py_srvcli.service_member_function:main',

3.ライト・クライアントのクライアントノード

dev_ws/src/py_srvcli/srcフォルダの作成client_member_function.py、ファイルを保存し、次の内容を貼り付けます。

import sys

from example_interfaces.srv import AddTwoInts
import rclpy
from rclpy.node import Node


class MinimalClientAsync(Node):

    def __init__(self):
        super().__init__('minimal_client_async')
        self.cli = self.create_client(AddTwoInts, 'add_two_ints')
        while not self.cli.wait_for_service(timeout_sec=1.0):
            self.get_logger().info('service not available, waiting again...')
        self.req = AddTwoInts.Request()

    def send_request(self):
        self.req.a = int(sys.argv[1])
        self.req.b = int(sys.argv[2])
        self.future = self.cli.call_async(self.req)


def main(args=None):
    rclpy.init(args=args)

    minimal_client = MinimalClientAsync()
    minimal_client.send_request()

    while rclpy.ok():
        rclpy.spin_once(minimal_client)
        if minimal_client.future.done():
            try:
                response = minimal_client.future.result()
            except Exception as e:
                minimal_client.get_logger().info(
                    'Service call failed %r' % (e,))
            else:
                minimal_client.get_logger().info(
                    'Result of add_two_ints: for %d + %d = %d' %
                    (minimal_client.req.a, minimal_client.req.b, response.sum))
            break

    minimal_client.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__':
    main()

3.1コード説明

我々はプログラムの入力パラメータを取得する必要があるため、私たちは、新しい行を追加しているimport sys
類似して、サーバーを、最初のクラスを定義し、コンストラクタ内のノードとしてのタイプ名とサーバーを作成します。
次いで、ループは、白色サーバが探し続ける
機能を定義し、主な機能は、後に要求を送信する
応答メッセージが正しく印刷されている場合、例外処理ながらサービスを待っているに対応する主機能を検出するために、whileループ。

3.2 [プログラムエントリの追加

開きsetup.py、我々はクライアントプログラムのエントリを追加すると、ファイル、およびサーバーを

entry_points={
    'console_scripts': [
        'service = py_srvcli.service_member_function:main',
        'client = py_srvcli.client_member_function:main',
    ],
},

4.コンパイルして実行

ワークスペース・ルートのコンパイルに

cd ~/dev_ws
colcon build --packages-select py_srvcli

新しいターミナルを開き、我々はサービスサーバを実行します

cd ~/dev_ws
source install/setup.bash
ros2 run py_srvcli service

そして、新しいターミナルを開いて、私たちは、クライアントのクライアントを実行します

cd ~/dev_ws
source install/setup.bash
ros2 run cpp_srvcli client 2 3

クライアントは応答を受けた後、応答サーバ側の出口を受けた後、

[INFO] [minimal_client_async]: Result of add_two_ints: for 2 + 3 = 5

また、メッセージサーバを出力しますが、受信したクライアントの要求が表示されます

[INFO] [minimal_service]: Incoming request
a: 2 b: 3

今すぐCtrl+ C2のノードの電源を切ります。

概要

Pythonはプログラムを追加することを忘れないで入学のための同様の操作手順およびトピックはそうでない場合ros2 run、実行可能ファイルを見つけることができません。

公開された70元の記事 ウォン称賛50 ビュー30000 +

おすすめ

転載: blog.csdn.net/qq_38649880/article/details/104429277