From e0e02a7855a2c8567ee7a5adeb011cf6ba4e0bc9 Mon Sep 17 00:00:00 2001 From: Tomoya Fujita Date: Wed, 4 Sep 2024 16:22:41 -0700 Subject: [PATCH] Service clients freeze on multi-client cases. Ref: https://github.com/ros2/rmw/issues/372 Signed-off-by: Tomoya Fujita --- prover_rclpy/setup.py | 2 ++ prover_rclpy/src/rmw_372_client.py | 34 ++++++++++++++++++++++++++++++ prover_rclpy/src/rmw_372_server.py | 21 ++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 prover_rclpy/src/rmw_372_client.py create mode 100644 prover_rclpy/src/rmw_372_server.py diff --git a/prover_rclpy/setup.py b/prover_rclpy/setup.py index 201b914..6816f32 100644 --- a/prover_rclpy/setup.py +++ b/prover_rclpy/setup.py @@ -63,6 +63,8 @@ 'rclpy_bar_940 = src.rclpy_bar_940:main', 'ros2_1173 = src.ros2_1173:main', 'ros2_1517 = src.ros2_1517:main', + 'rmw_372_client = src.rmw_372_client:main', + 'rmw_372_server = src.rmw_372_server:main', 'rclpy_1030 = src.rclpy_1030:main', 'rclpy_1034 = src.rclpy_1034:main', 'rclpy_1039 = src.rclpy_1039:main', diff --git a/prover_rclpy/src/rmw_372_client.py b/prover_rclpy/src/rmw_372_client.py new file mode 100644 index 0000000..f57bab9 --- /dev/null +++ b/prover_rclpy/src/rmw_372_client.py @@ -0,0 +1,34 @@ +import rclpy +from rclpy.node import Node +from example_interfaces.srv import AddTwoInts + +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...') + + def send_request(self, a, b): + self.req = AddTwoInts.Request() + self.req.a = a + self.req.b = b + self.future = self.cli.call_async(self.req) + rclpy.spin_until_future_complete(self, self.future) + return self.future.result() + +def main(args=None): + rclpy.init(args=args) + minimal_client = MinimalClientAsync() + for i in range(1000000000): + response = minimal_client.send_request(1, 2) + if i%1000 == 0: + minimal_client.get_logger().info( + 'Result of add_two_ints: for %d + %d = %d' % + (1, 2, response.sum)) + + minimal_client.destroy_node() + rclpy.shutdown() + +if __name__ == '__main__': + main() diff --git a/prover_rclpy/src/rmw_372_server.py b/prover_rclpy/src/rmw_372_server.py new file mode 100644 index 0000000..0753e12 --- /dev/null +++ b/prover_rclpy/src/rmw_372_server.py @@ -0,0 +1,21 @@ +import rclpy +from rclpy.node import Node +from example_interfaces.srv import AddTwoInts + +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 + return response + +def main(args=None): + rclpy.init(args=args) + minimal_service = MinimalService() + rclpy.spin(minimal_service) + rclpy.shutdown() + +if __name__ == '__main__': + main()