[ROS2] [rclcpp] [eloquent] spin_until_future_complete in an already spinning node

asked 2019-12-12 13:03:56 -0600

fcolecumberri gravatar image

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)

edit retag flag offensive close merge delete

Comments

I'm not sure why you have 2 threads, but this may help: https://answers.ros.org/question/3020...

clyde gravatar imageclyde ( 2019-12-18 18:36:53 -0600 )edit

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.

fcolecumberri gravatar imagefcolecumberri ( 2019-12-19 06:40:52 -0600 )edit