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.py
とpackage.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
、実行可能ファイルを見つけることができません。