-
Notifications
You must be signed in to change notification settings - Fork 522
Closed
Description
Seems that setting the QoS depth for clients and services is ignored:
// Client/Service options
rmw_qos_profile_t qos_profile = rmw_qos_profile_services_default;
qos_profile.depth = 1;
// Create client and service with options
auto client = client_node->create_client<AddTwoInts>("add_two_ints", qos_profile);
auto server = service_node->create_service<AddTwoInts>("add_two_ints", handle_service, qos_profile);
The following program shows the issue:
- Set QoS.depth = 1 for client/service
- Client does some requests
- Service node spins: processes all requests (not just one)
- Client node spins: get all requests responses (not just one)
#include <cinttypes>
#include <memory>
#include "example_interfaces/srv/add_two_ints.hpp"
#include "rclcpp/rclcpp.hpp"
using AddTwoInts = example_interfaces::srv::AddTwoInts;
rclcpp::Node::SharedPtr service_node = nullptr;
rclcpp::Node::SharedPtr client_node = nullptr;
using Executor = rclcpp::executors::SingleThreadedExecutor;
void handle_service(
const std::shared_ptr<rmw_request_id_t> request_header,
const std::shared_ptr<AddTwoInts::Request> request,
const std::shared_ptr<AddTwoInts::Response> response)
{
(void)request_header;
response->sum = request->a + request->b;
RCLCPP_INFO(
service_node->get_logger(),
"Handle service. Request: %" PRId64 " + %" PRId64 " = %" PRId64, request->a, request->b, response->sum);
}
void client_callback(
std::shared_ptr<typename AddTwoInts::Request> request,
typename rclcpp::Client<AddTwoInts>::SharedFuture result_future)
{
auto result = result_future.get();
RCLCPP_INFO(
client_node->get_logger(),
"Client callback. Result of %" PRId64 " + %" PRId64 " = %" PRId64, request->a, request->b, result->sum);
}
int main(int argc, char ** argv)
{
rclcpp::init(argc, argv);
// Node options
rclcpp::NodeOptions node_options = rclcpp::NodeOptions();
node_options.use_intra_process_comms(false);
node_options.start_parameter_services(false);
node_options.start_parameter_event_publisher(false);
// Create nodes with node options
service_node = rclcpp::Node::make_shared("service", node_options);
client_node = rclcpp::Node::make_shared("client", node_options);
// Client/Service options
rmw_qos_profile_t qos_profile = rmw_qos_profile_services_default;
qos_profile.history = RMW_QOS_POLICY_HISTORY_KEEP_LAST;
std::cout << "Setting OoS depth = 1 for client and service" << std::endl;
qos_profile.depth = 1;
// Create client and service with options
auto client = client_node->create_client<AddTwoInts>("add_two_ints", qos_profile);
auto server = service_node->create_service<AddTwoInts>("add_two_ints", handle_service, qos_profile);
// Create separate executors for client and service nodes to better show the issue
auto service_executor = std::make_shared<Executor>();
service_executor->add_node(service_node);
auto client_executor = std::make_shared<Executor>();
client_executor->add_node(client_node);
// Send requests (depth is set to 1, so we should only have a single client request)
for (int i=0; i <= 15; i++) {
auto request = std::make_shared<AddTwoInts::Request>();
request->a = i;
request->b = i;
std::function<void(
typename rclcpp::Client<AddTwoInts>::SharedFuture future)> callback_function = std::bind(
&client_callback,
request,
std::placeholders::_1
);
std::cout << "Client: async_send_request number: " << i << std::endl;
client->async_send_request(request, callback_function);
}
char a;
std::cout << "Press key to spin the Server" << std::endl;
std::cin >> a;
/******** SERVICE EXECUTOR THREAD *********************************************/
std::thread service_spin_thread([=](){
std::cout << "service_executor->spin()" << std::endl;
service_executor->spin();
});
service_spin_thread.detach();
/********************************************************************************************/
std::cout << "Press key to spin the Client" << std::endl;
std::cin >> a;
/******** CLIENT EXECUTOR THREAD ***********************************************/
std::thread spin_thread([=](){
std::cout << "client_executor->spin()" << std::endl;
client_executor->spin();
});
spin_thread.detach();
/********************************************************************************************/
std::cin >> a;
std::cout << "rclcpp::shutdown()" << std::endl;
rclcpp::shutdown();
service_node = nullptr;
client_node = nullptr;
return 0;
}
The output:
Setting OoS depth = 1 for client and service
Client: async_send_request number: 0
Client: async_send_request number: 1
Client: async_send_request number: 2
Client: async_send_request number: 3
Client: async_send_request number: 4
Client: async_send_request number: 5
Client: async_send_request number: 6
Client: async_send_request number: 7
Client: async_send_request number: 8
Client: async_send_request number: 9
Client: async_send_request number: 10
Client: async_send_request number: 11
Client: async_send_request number: 12
Client: async_send_request number: 13
Client: async_send_request number: 14
Client: async_send_request number: 15
Press key to spin the Server
service_executor->spin()
[INFO] [1632502510.911567814] [service]: Handle service. Request: 0 + 0 = 0
[INFO] [1632502510.912534665] [service]: Handle service. Request: 1 + 1 = 2
[INFO] [1632502510.912857264] [service]: Handle service. Request: 2 + 2 = 4
[INFO] [1632502510.913159732] [service]: Handle service. Request: 3 + 3 = 6
[INFO] [1632502510.913457916] [service]: Handle service. Request: 4 + 4 = 8
[INFO] [1632502510.913763411] [service]: Handle service. Request: 5 + 5 = 10
[INFO] [1632502510.914055334] [service]: Handle service. Request: 6 + 6 = 12
[INFO] [1632502510.914350376] [service]: Handle service. Request: 7 + 7 = 14
[INFO] [1632502510.914641348] [service]: Handle service. Request: 8 + 8 = 16
[INFO] [1632502510.914951640] [service]: Handle service. Request: 9 + 9 = 18
[INFO] [1632502510.915243627] [service]: Handle service. Request: 10 + 10 = 20
[INFO] [1632502510.915533047] [service]: Handle service. Request: 11 + 11 = 22
[INFO] [1632502510.915821592] [service]: Handle service. Request: 12 + 12 = 24
[INFO] [1632502510.916133874] [service]: Handle service. Request: 13 + 13 = 26
[INFO] [1632502510.916431093] [service]: Handle service. Request: 14 + 14 = 28
[INFO] [1632502510.916724053] [service]: Handle service. Request: 15 + 15 = 30
Press key to spin the Client
client_executor->spin()
[INFO] [1632502511.534574504] [client]: Client callback. Result of 0 + 0 = 0
[INFO] [1632502511.534917210] [client]: Client callback. Result of 1 + 1 = 2
[INFO] [1632502511.535152711] [client]: Client callback. Result of 2 + 2 = 4
[INFO] [1632502511.535379114] [client]: Client callback. Result of 3 + 3 = 6
[INFO] [1632502511.535604549] [client]: Client callback. Result of 4 + 4 = 8
[INFO] [1632502511.535839307] [client]: Client callback. Result of 5 + 5 = 10
[INFO] [1632502511.536060394] [client]: Client callback. Result of 6 + 6 = 12
[INFO] [1632502511.536311128] [client]: Client callback. Result of 7 + 7 = 14
[INFO] [1632502511.536534991] [client]: Client callback. Result of 8 + 8 = 16
[INFO] [1632502511.536754865] [client]: Client callback. Result of 9 + 9 = 18
[INFO] [1632502511.536974771] [client]: Client callback. Result of 10 + 10 = 20
[INFO] [1632502511.537194631] [client]: Client callback. Result of 11 + 11 = 22
[INFO] [1632502511.537414983] [client]: Client callback. Result of 12 + 12 = 24
[INFO] [1632502511.537635309] [client]: Client callback. Result of 13 + 13 = 26
[INFO] [1632502511.537853318] [client]: Client callback. Result of 14 + 14 = 28
[INFO] [1632502511.538072821] [client]: Client callback. Result of 15 + 15 = 30
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels