-
Notifications
You must be signed in to change notification settings - Fork 256
Open
Labels
Description
Bug report
Required Info:
- Operating System:
- Ubuntu 20.04
- Installation type:
- binaries
- Version or commit hash:
- foxy (the 2022-09-28 release that was just pushed through the apt repos)
- DDS implementation:
- Fast-RTPS for sure
- Any (I think)
- Client library (if applicable):
- rclpy
Steps to reproduce issue
Use the minimal service server from the examples
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()
and a slightly modified service client:
from example_interfaces.srv import AddTwoInts
import rclpy
from rclpy.node import Node
from rclpy.executors import MultiThreadedExecutor
from rclpy.callback_groups import MutuallyExclusiveCallbackGroup
class MinimalClient(Node):
def __init__(self):
super().__init__("minimal_client_async")
self.cb = None
self.timer_cb = MutuallyExclusiveCallbackGroup()
self.cli = self.create_client(
AddTwoInts, "add_two_ints", callback_group=self.cb
)
while not self.cli.wait_for_service(timeout_sec=1.0):
self.get_logger().info("service not available, waiting again...")
self.req = AddTwoInts.Request()
# Create a timer for the main loop execution
self.timer = self.create_timer(
1.0, self.main_loop, callback_group=self.timer_cb
)
def send_request(self, a, b):
self.get_logger().info("send_request: enter")
self.req.a = a
self.req.b = b
# Only works once, then never executes the timer again
self.future = self.cli.call_async(self.req)
rclpy.spin_until_future_complete(self, self.future)
self.get_logger().info("send_request: exit")
return self.future.result()
# Used to work, but blocks now
# return self.cli.call(self.req)
def main_loop(self) -> None:
response = self.send_request(4, 2)
self.get_logger().info(
"Result of add_two_ints: for %d + %d = %d" % (4, 2, response.sum)
)
def main(args=None):
rclpy.init(args=args)
minimal_client = MinimalClient()
executor = MultiThreadedExecutor()
executor.add_node(minimal_client)
executor.spin()
rclpy.shutdown()
if __name__ == "__main__":
main()
Run the service server in one terminal and the client in another.
Expected behavior
You repeatedly see the client call the server every second and get a response.
Actual behavior
The client runs correctly once, but then hangs (never executes the timer loop again)
Additional information
Previous to the 2022-09-28 patch release of foxy, a workaround was to use a synchronous call. However, that is non-functional now (see #1016 for more info/workarounds on that issue). As this behavior is functional in rclcpp in foxy, and seems to be what the documentation of foxy recommends it would be good to have this be functional.
jackiescanlon