15 #ifndef RCLCPP__CLIENT_HPP_ 16 #define RCLCPP__CLIENT_HPP_ 45 namespace node_interfaces
47 class NodeBaseInterface;
61 rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph,
62 const std::string & service_name);
65 virtual ~ClientBase();
69 get_service_name()
const;
73 get_client_handle()
const;
77 service_is_ready()
const;
79 template<
typename RatioT = std::milli>
82 std::chrono::duration<int64_t, RatioT> timeout = std::chrono::duration<int64_t, RatioT>(-1))
84 return wait_for_service_nanoseconds(
85 std::chrono::duration_cast<std::chrono::nanoseconds>(timeout)
89 virtual std::shared_ptr<void> create_response() = 0;
90 virtual std::shared_ptr<rmw_request_id_t> create_request_header() = 0;
91 virtual void handle_response(
92 std::shared_ptr<rmw_request_id_t> request_header, std::shared_ptr<void> response) = 0;
99 wait_for_service_nanoseconds(std::chrono::nanoseconds timeout);
103 get_rcl_node_handle()
const;
112 template<
typename ServiceT>
134 rclcpp::node_interfaces::NodeBaseInterface * node_base,
135 rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph,
136 const
std::
string & service_name,
138 : ClientBase(node_base, node_graph, service_name)
140 using rosidl_typesupport_cpp::get_service_type_support_handle;
141 auto service_type_support_handle =
142 get_service_type_support_handle<ServiceT>();
145 this->get_rcl_node_handle(),
146 service_type_support_handle,
147 service_name.c_str(),
151 auto rcl_node_handle = this->get_rcl_node_handle();
173 std::shared_ptr<void>
176 return std::shared_ptr<void>(
new typename ServiceT::Response());
179 std::shared_ptr<rmw_request_id_t>
189 std::shared_ptr<void> response)
191 std::lock_guard<std::mutex> lock(pending_requests_mutex_);
192 auto typed_response = std::static_pointer_cast<
typename ServiceT::Response>(response);
193 int64_t sequence_number = request_header->sequence_number;
195 if (this->pending_requests_.count(sequence_number) == 0) {
196 fprintf(stderr,
"Received invalid sequence number. Ignoring...\n");
199 auto tuple = this->pending_requests_[sequence_number];
200 auto call_promise = std::get<0>(tuple);
201 auto callback = std::get<1>(tuple);
202 auto future = std::get<2>(tuple);
203 this->pending_requests_.erase(sequence_number);
204 call_promise->set_value(typed_response);
211 return async_send_request(request, [](
SharedFuture) {});
216 typename std::enable_if<
226 std::lock_guard<std::mutex> lock(pending_requests_mutex_);
227 int64_t sequence_number;
235 pending_requests_[sequence_number] =
236 std::make_tuple(call_promise, std::forward<CallbackType>(cb), f);
242 typename std::enable_if<
255 auto wrapping_cb = [future_with_request, promise, request, &cb](
SharedFuture future) {
256 auto response = future.get();
257 promise->set_value(std::make_pair(request, response));
258 cb(future_with_request);
261 async_send_request(request, wrapping_cb);
263 return future_with_request;
269 std::map<int64_t, std::tuple<SharedPromise, CallbackType, SharedFuture>> pending_requests_;
270 std::mutex pending_requests_mutex_;
276 #endif // RCLCPP__CLIENT_HPP_ std::shared_ptr< rmw_request_id_t > create_request_header()
Definition: client.hpp:180
SharedFutureWithRequest async_send_request(SharedRequest request, CallbackT &&cb)
Definition: client.hpp:250
std::shared_ptr< rcl_node_t > node_handle_
Definition: client.hpp:106
#define RCLCPP_DISABLE_COPY(...)
Definition: macros.hpp:26
Definition: allocator_common.hpp:24
Definition: parameter.hpp:235
rcl_ret_t rcl_send_request(const rcl_client_t *client, const void *ros_request, int64_t *sequence_number)
std::string expand_topic_or_service_name(const std::string &name, const std::string &node_name, const std::string &namespace_, bool is_service=false)
Expand a topic or service name and throw if it is not valid.
std::shared_ptr< Promise > SharedPromise
Definition: client.hpp:122
virtual ~Client()
Definition: client.hpp:164
std::shared_future< std::pair< SharedRequest, SharedResponse > > SharedFutureWithRequest
Definition: client.hpp:126
std::promise< SharedResponse > Promise
Definition: client.hpp:119
void throw_from_rcl_error(rcl_ret_t ret, const std::string &prefix="", const rcl_error_state_t *error_state=nullptr, void(*reset_error)()=rcl_reset_error)
Throw a C++ std::exception which was created based on an rcl error.
rcl_ret_t rcl_client_init(rcl_client_t *client, const rcl_node_t *node, const rosidl_service_type_support_t *type_support, const char *service_name, const rcl_client_options_t *options)
#define RCLCPP_SMART_PTR_DEFINITIONS(...)
Definition: macros.hpp:36
SharedFuture async_send_request(SharedRequest request, CallbackT &&cb)
Definition: client.hpp:224
Definition: function_traits.hpp:141
Pure virtual interface class for the NodeBase part of the Node API.
Definition: node_base_interface.hpp:36
std::promise< std::pair< SharedRequest, SharedResponse > > PromiseWithRequest
Definition: client.hpp:120
typename rcl_interfaces::srv::GetParameters ::Response::SharedPtr SharedResponse
Definition: client.hpp:117
#define rcl_get_error_string_safe
std::string service_name_
Definition: client.hpp:109
typename rcl_interfaces::srv::GetParameters ::Request::SharedPtr SharedRequest
Definition: client.hpp:116
#define RCLCPP_SMART_PTR_DEFINITIONS_NOT_COPYABLE(...)
Definition: macros.hpp:51
std::function< void(SharedFuture)> CallbackType
Definition: client.hpp:128
#define RCLCPP_PUBLIC
Definition: visibility_control.hpp:50
Definition: client.hpp:53
std::shared_ptr< void > create_response()
Definition: client.hpp:174
#define RCL_RET_SERVICE_NAME_INVALID
const char * rcl_node_get_name(const rcl_node_t *node)
SharedFuture async_send_request(SharedRequest request)
Definition: client.hpp:209
const char * rcl_node_get_namespace(const rcl_node_t *node)
std::function< void(SharedFutureWithRequest)> CallbackWithRequestType
Definition: client.hpp:129
void handle_response(std::shared_ptr< rmw_request_id_t > request_header, std::shared_ptr< void > response)
Definition: client.hpp:188
rcl_client_t rcl_get_zero_initialized_client(void)
rcl_ret_t rcl_client_fini(rcl_client_t *client, rcl_node_t *node)
Definition: client.hpp:113
rclcpp::node_interfaces::NodeGraphInterface::WeakPtr node_graph_
Definition: client.hpp:105
std::shared_future< SharedResponse > SharedFuture
Definition: client.hpp:125
bool wait_for_service(std::chrono::duration< int64_t, RatioT > timeout=std::chrono::duration< int64_t, RatioT >(-1))
Definition: client.hpp:81
std::shared_ptr< PromiseWithRequest > SharedPromiseWithRequest
Definition: client.hpp:123