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