[ROS2] [rclcpp] [eloquent] spin_until_future_complete in an already spinning node
I’m making a program, this program has a rclcpp::node and is running with several threads. In the main thread I have
executor.add_node(node);
executor.spin();
this let me manage services and subscribe to topics but in other thread I am running
auto client = create_client<ConnectionCore>(service_name)
if(!client->wait_for_service(std::chrono::duration<long double, std::milli>(100)))
{
auto result = client->async_send_request(request);
rclcpp::spin_until_future_complete(node, result);
}
but I get
terminate called after throwing an instance of 'std::runtime_error'
what(): spin_once() called while already spinning
which is very logical since the node is already spinning, but if my node is spinning how can I call a service?
I have already tried stuff like
client->async_send_request(request, [this](decltype(client)::element_type::SharedFuture future){
//do stuff...
});
// wthout the rclcpp::spin_until_future_complete
but it doesn't enter in the callback. I have also tried to
auto result = client->async_send_request(request);
result.get() // and result.wait()
and this just blocked the thread and never get out.
I'm porting this code from ROS1 (where this was no problem) so I'm almoust sure there must be a good way to call a service and subscribe to topics at the same time since in ROS1 is posible, I'm just not sure how to do it.
(I have also thought about creating a second node just to call the service and then destroy it, but I think that is the ugliest possible solution)
Asked by fcolecumberri on 2019-12-12 14:03:56 UTC
Comments
I'm not sure why you have 2 threads, but this may help: https://answers.ros.org/question/302037/ros2-how-to-call-a-service-from-the-callback-function-of-a-subscriber/
Asked by clyde on 2019-12-18 19:36:53 UTC
there are plenty of reasons to use threads in ROS, as an example if you make an interface to a hardware that has sensors and actuators, you want to attend the calls that modify the actuator at the same time that you want to publish the information of the sensors, I have done this kind of things in ROS1 several times.
Asked by fcolecumberri on 2019-12-19 07:40:52 UTC
I'm facing the same issue, have you found any solutions?
Asked by MrCheesecake on 2020-06-05 09:42:10 UTC
I have the same issue, I am trying tones of different stuff, like spin some nodes in the main and create new nodes for the client but thing still hangs. Some help would be good here.
Asked by Rextab on 2020-10-23 13:59:59 UTC
IINM, when
if(!client->wait_for_service
(with "!") matches, the Service in question is unavailable. Are you sure that is the condition you intend to call a Service (byclient->async_send_request
)?Asked by 130s on 2023-05-05 13:02:48 UTC