jhelovuo / ros2-client

ROS2 client library based on RustDDS
68 stars 15 forks source link

Issues with `ros2_service_client` example #24

Closed phil-opp closed 6 months ago

phil-opp commented 7 months ago

The ros2_service_client only receives replies if the examples_rclcpp_minimal_service is started afterwards. If it's already running, the ros2_service_client requests never receive any replies.

I tried it with both humble and iron.

Steps to reproduce

I'm running the latest master commit db85ada.

Details

If terminal 1 is started before terminal 2, I get the following output in terminal 2:

>>> ros2_service starting...
 ERROR rustdds::network::udp_listener > UDPListener::new_multicast() not implemented for IpV6
 ERROR rustdds::network::udp_listener > UDPListener::new_multicast() not implemented for IpV6
 ERROR rustdds::network::udp_listener > UDPListener::new_multicast() not implemented for IpV6
 ERROR rustdds::network::udp_listener > UDPListener::new_multicast() not implemented for IpV6
 ERROR rustdds::network::udp_sender   > UDPSender::new() not implemented for IpV6
 ERROR rustdds::network::udp_sender   > UDPSender::new() not implemented for IpV6
>>> ros2_service node started
>>> ros2_service client created
>>> request sending...
>>> request sent a=3 b=3, RmwRequestId { writer_guid: GUID {0112257de46a0039547eee73 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(1) }
>>> request sending...
>>> request sent a=1 b=6, RmwRequestId { writer_guid: GUID {0112257de46a0039547eee73 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(2) }
>>> request sending...
>>> request sent a=4 b=2, RmwRequestId { writer_guid: GUID {0112257de46a0039547eee73 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(3) }
>>> request sending...
>>> request sent a=2 b=5, RmwRequestId { writer_guid: GUID {0112257de46a0039547eee73 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(4) }
>>> request sending...
>>> request sent a=0 b=1, RmwRequestId { writer_guid: GUID {0112257de46a0039547eee73 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(5) }
>>> request sending...
>>> request sent a=3 b=4, RmwRequestId { writer_guid: GUID {0112257de46a0039547eee73 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(6) }
[...]

...and so on. There is no output in terminal 1. It looks like the requests are never received, so no responses are generated

If terminal 2 is started before terminal 1, it works as expected. I get the following output:

In Terminal 2:

>>> ros2_service starting...
 ERROR rustdds::network::udp_listener > UDPListener::new_multicast() not implemented for IpV6
 ERROR rustdds::network::udp_listener > UDPListener::new_multicast() not implemented for IpV6
 ERROR rustdds::network::udp_listener > UDPListener::new_multicast() not implemented for IpV6
 ERROR rustdds::network::udp_listener > UDPListener::new_multicast() not implemented for IpV6
 ERROR rustdds::network::udp_sender   > UDPSender::new() not implemented for IpV6
 ERROR rustdds::network::udp_sender   > UDPSender::new() not implemented for IpV6
>>> ros2_service node started
>>> ros2_service client created
>>> request sending...
>>> request sent a=3 b=3, RmwRequestId { writer_guid: GUID {01127818c6e0fa74c9de7943 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(1) }
>>> request sending...
>>> request sent a=1 b=6, RmwRequestId { writer_guid: GUID {01127818c6e0fa74c9de7943 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(2) }
>>> request sending...
>>> request sent a=4 b=2, RmwRequestId { writer_guid: GUID {01127818c6e0fa74c9de7943 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(3) }
>>> request sending...
>>> request sent a=2 b=5, RmwRequestId { writer_guid: GUID {01127818c6e0fa74c9de7943 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(4) }
>>> Response received: response: AddTwoIntsResponse { sum: 7 } - response id: RmwRequestId { writer_guid: GUID {01127818c6e0fa74c9de7943 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(4) }, 
>>> request sending...
>>> request sent a=0 b=1, RmwRequestId { writer_guid: GUID {01127818c6e0fa74c9de7943 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(5) }
>>> Response received: response: AddTwoIntsResponse { sum: 1 } - response id: RmwRequestId { writer_guid: GUID {01127818c6e0fa74c9de7943 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(5) }, 
>>> request sending...
>>> request sent a=3 b=4, RmwRequestId { writer_guid: GUID {01127818c6e0fa74c9de7943 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(6) }
>>> Response received: response: AddTwoIntsResponse { sum: 7 } - response id: RmwRequestId { writer_guid: GUID {01127818c6e0fa74c9de7943 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(6) }, 
>>> request sending...
>>> request sent a=1 b=0, RmwRequestId { writer_guid: GUID {01127818c6e0fa74c9de7943 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(7) }
>>> Response received: response: AddTwoIntsResponse { sum: 1 } - response id: RmwRequestId { writer_guid: GUID {01127818c6e0fa74c9de7943 EntityId {[0, 0, 3] EntityKind::WRITER_NO_KEY_USER_DEFINED}}, sequence_number: SequenceNumber(7) }, 

In Terminal 1:

[INFO] [1710337142.500465857] [minimal_service]: request: 2 + 5
[INFO] [1710337144.512001789] [minimal_service]: request: 0 + 1
[INFO] [1710337146.523442206] [minimal_service]: request: 3 + 4
[INFO] [1710337148.535072501] [minimal_service]: request: 1 + 0
phil-opp commented 7 months ago

I thought that it might be related to https://github.com/jhelovuo/ros2-client/issues/14#issuecomment-1810143335 and https://github.com/jhelovuo/ros2-client/commit/42a1f85948928eb15ddbab322bc4b45870f2da4c#diff-7e763e421256aad22d1c6e12c6bbb596f6470f61129bae27e8835580be545439R12-R16, but I think the fact that it behaves the same on iron and humble indicates that this is something else.

phil-opp commented 7 months ago

Someone else from our team just tried to reproduce this issue, but it worked as expected for them on humble. So I probably did something wrong when I switched from iron to humble for testing. I'll investigate more and report back.

phil-opp commented 7 months ago

So I tried rebooting, cargo clean, etc., but I still can't get the ros2_service_client example to work if the service is started first.

However, the async_service_client example works without any issues:

❯ cargo r --example async_service_client
    Finished dev [unoptimized + debuginfo] target(s) in 0.06s
     Running `target/debug/examples/async_service_client`
Press Ctrl-C to quit.
 ERROR rustdds::network::udp_listener > UDPListener::new_multicast() not implemented for IpV6
 ERROR rustdds::network::udp_listener > UDPListener::new_multicast() not implemented for IpV6
 ERROR rustdds::network::udp_listener > UDPListener::new_multicast() not implemented for IpV6
 ERROR rustdds::network::udp_listener > UDPListener::new_multicast() not implemented for IpV6
 ERROR rustdds::network::udp_sender   > UDPSender::new() not implemented for IpV6
 ERROR rustdds::network::udp_sender   > UDPSender::new() not implemented for IpV6
>>> waiting for Server to appear.
>>> waiting for Server to appear.
>>> request sent a=3 b=3, SequenceNumber(1)
<<< response error WriteError(WouldBlock { data: () })
>>> request sent a=1 b=6, SequenceNumber(2)
<<< response: AddTwoIntsResponse { sum: 7 }
>>> request sent a=4 b=2, SequenceNumber(3)
<<< response: AddTwoIntsResponse { sum: 6 }

This is very surprising to me, as I would expect the sync and async variants to behave the same way.

jhelovuo commented 6 months ago

New version 0.7.0 or ros2-client has been released. This version contains bug fixes relating to Services.

Please try again with the latest release. I tested interoperability of both synchronous and async service client and server, and they worked for me in the release candidate.

phil-opp commented 6 months ago

Thanks a lot! I tried both the sync and async client examples and I can no longer reproduce the issue with the new version. So this seems to be fixed.