ROS 2 rclcpp + rcl - rolling  rolling-29de98cf
ROS 2 C++ Client Library with ROS Client Library
publisher_base.hpp
1 // Copyright 2014 Open Source Robotics Foundation, Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef RCLCPP__PUBLISHER_BASE_HPP_
16 #define RCLCPP__PUBLISHER_BASE_HPP_
17 
18 #include <rmw/error_handling.h>
19 #include <rmw/rmw.h>
20 
21 #include <chrono>
22 #include <functional>
23 #include <memory>
24 #include <string>
25 #include <unordered_map>
26 #include <utility>
27 #include <vector>
28 
29 #include "rcl/publisher.h"
30 
31 #include "rclcpp/macros.hpp"
32 #include "rclcpp/network_flow_endpoint.hpp"
33 #include "rclcpp/qos.hpp"
34 #include "rclcpp/event_handler.hpp"
35 #include "rclcpp/visibility_control.hpp"
36 #include "rcpputils/time.hpp"
37 
38 namespace rclcpp
39 {
40 
41 // Forward declaration is used for friend statement.
42 namespace node_interfaces
43 {
44 class NodeBaseInterface;
45 class NodeTopicsInterface;
46 } // namespace node_interfaces
47 
48 namespace experimental
49 {
54 class IntraProcessManager;
55 } // namespace experimental
56 
57 class PublisherBase : public std::enable_shared_from_this<PublisherBase>
58 {
59  friend ::rclcpp::node_interfaces::NodeTopicsInterface;
60 
61 public:
62  RCLCPP_SMART_PTR_DEFINITIONS(PublisherBase)
63 
64 
73  RCLCPP_PUBLIC
76  const std::string & topic,
77  const rosidl_message_type_support_t & type_support,
78  const rcl_publisher_options_t & publisher_options,
79  const PublisherEventCallbacks & event_callbacks,
80  bool use_default_callbacks);
81 
82  RCLCPP_PUBLIC
83  virtual ~PublisherBase();
84 
86 
95  RCLCPP_PUBLIC
96  static
97  bool
99 
101  RCLCPP_PUBLIC
102  void
103  bind_event_callbacks(const PublisherEventCallbacks & event_callbacks, bool use_default_callbacks);
104 
106 
107  RCLCPP_PUBLIC
108  const char *
109  get_topic_name() const;
110 
112 
113  RCLCPP_PUBLIC
114  size_t
115  get_queue_size() const;
116 
118 
119  RCLCPP_PUBLIC
120  const rmw_gid_t &
121  get_gid() const;
122 
124 
125  RCLCPP_PUBLIC
126  std::shared_ptr<rcl_publisher_t>
128 
130 
131  RCLCPP_PUBLIC
132  std::shared_ptr<const rcl_publisher_t>
133  get_publisher_handle() const;
134 
136 
137  RCLCPP_PUBLIC
138  const
139  std::unordered_map<rcl_publisher_event_type_t, std::shared_ptr<rclcpp::EventHandlerBase>> &
140  get_event_handlers() const;
141 
143 
144  RCLCPP_PUBLIC
145  size_t
146  get_subscription_count() const;
147 
149 
150  RCLCPP_PUBLIC
151  size_t
153 
155 
156  RCLCPP_PUBLIC
157  bool
159 
161 
168  RCLCPP_PUBLIC
169  RCUTILS_WARN_UNUSED
170  bool
171  assert_liveliness() const;
172 
174 
184  RCLCPP_PUBLIC
186  get_actual_qos() const;
187 
189 
193  RCLCPP_PUBLIC
194  bool
195  can_loan_messages() const;
196 
198 
203  RCLCPP_PUBLIC
204  bool
205  operator==(const rmw_gid_t & gid) const;
206 
208 
213  RCLCPP_PUBLIC
214  bool
215  operator==(const rmw_gid_t * gid) const;
216 
217  using IntraProcessManagerSharedPtr =
218  std::shared_ptr<rclcpp::experimental::IntraProcessManager>;
219 
221  RCLCPP_PUBLIC
222  void
224  uint64_t intra_process_publisher_id,
225  const IntraProcessManagerSharedPtr & ipm);
226 
228 
232  RCLCPP_PUBLIC
233  std::vector<rclcpp::NetworkFlowEndpoint>
235 
237 
243  RCLCPP_PUBLIC
244  size_t
246 
248 
269  template<typename DurationRepT = int64_t, typename DurationT = std::milli>
270  bool
272  std::chrono::duration<DurationRepT, DurationT> timeout =
273  std::chrono::duration<DurationRepT, DurationT>(-1)) const
274  {
275  rcl_duration_value_t rcl_timeout = rcpputils::convert_to_nanoseconds(timeout).count();
276 
277  rcl_ret_t ret = rcl_publisher_wait_for_all_acked(publisher_handle_.get(), rcl_timeout);
278  if (ret == RCL_RET_OK) {
279  return true;
280  } else if (ret == RCL_RET_TIMEOUT) {
281  return false;
282  } else {
283  rclcpp::exceptions::throw_from_rcl_error(ret);
284  }
285  }
286 
288 
313  RCLCPP_PUBLIC
314  void
316  const std::function<void(size_t)> & callback,
317  rcl_publisher_event_type_t event_type);
318 
320  RCLCPP_PUBLIC
321  void
323 
324 protected:
325  template<typename EventCallbackT>
326  void
327  add_event_handler(
328  const EventCallbackT & callback,
329  const rcl_publisher_event_type_t event_type)
330  {
331  auto handler = std::make_shared<EventHandler<EventCallbackT,
332  std::shared_ptr<rcl_publisher_t>>>(
333  callback,
335  publisher_handle_,
336  event_type);
337  event_handlers_.insert(std::make_pair(event_type, handler));
338  }
339 
340  RCLCPP_PUBLIC
341  void default_incompatible_qos_callback(QOSOfferedIncompatibleQoSInfo & info) const;
342 
343  RCLCPP_PUBLIC
344  void default_incompatible_type_callback(IncompatibleTypeInfo & info) const;
345 
346  std::shared_ptr<rcl_node_t> rcl_node_handle_;
347 
348  std::shared_ptr<rcl_publisher_t> publisher_handle_;
349 
350  std::unordered_map<rcl_publisher_event_type_t,
351  std::shared_ptr<rclcpp::EventHandlerBase>> event_handlers_;
352 
353  using IntraProcessManagerWeakPtr =
354  std::weak_ptr<rclcpp::experimental::IntraProcessManager>;
355  bool intra_process_is_enabled_;
356  IntraProcessManagerWeakPtr weak_ipm_;
357  uint64_t intra_process_publisher_id_;
358 
359  rmw_gid_t rmw_gid_;
360 
361  const rosidl_message_type_support_t type_support_;
362 
363  const PublisherEventCallbacks event_callbacks_;
364 };
365 
366 } // namespace rclcpp
367 
368 #endif // RCLCPP__PUBLISHER_BASE_HPP_
RCLCPP_PUBLIC const rmw_gid_t & get_gid() const
Get the global identifier for this publisher (used in rmw and by DDS).
RCLCPP_PUBLIC void set_on_new_qos_event_callback(const std::function< void(size_t)> &callback, rcl_publisher_event_type_t event_type)
Set a callback to be called when each new qos event instance occurs.
RCLCPP_PUBLIC std::shared_ptr< rcl_publisher_t > get_publisher_handle()
Get the rcl publisher handle.
RCLCPP_PUBLIC size_t get_intra_process_subscription_count() const
Get intraprocess subscription count.
RCLCPP_PUBLIC PublisherBase(rclcpp::node_interfaces::NodeBaseInterface *node_base, const std::string &topic, const rosidl_message_type_support_t &type_support, const rcl_publisher_options_t &publisher_options, const PublisherEventCallbacks &event_callbacks, bool use_default_callbacks)
Default constructor.
RCLCPP_PUBLIC void clear_on_new_qos_event_callback(rcl_publisher_event_type_t event_type)
Unset the callback registered for new qos events, if any.
RCLCPP_PUBLIC void bind_event_callbacks(const PublisherEventCallbacks &event_callbacks, bool use_default_callbacks)
Add event handlers for passed in event_callbacks.
RCLCPP_PUBLIC rclcpp::QoS get_actual_qos() const
Get the actual QoS settings, after the defaults have been determined.
RCLCPP_PUBLIC const char * get_topic_name() const
Get the topic that this publisher publishes on.
RCLCPP_PUBLIC void setup_intra_process(uint64_t intra_process_publisher_id, const IntraProcessManagerSharedPtr &ipm)
Implementation utility function used to setup intra process publishing after creation.
RCLCPP_PUBLIC bool operator==(const rmw_gid_t &gid) const
Compare this publisher to a gid.
RCLCPP_PUBLIC size_t get_queue_size() const
Get the queue size for this publisher.
RCLCPP_PUBLIC bool can_loan_messages() const
Check if publisher instance can loan messages.
RCLCPP_PUBLIC bool is_durability_transient_local() const
Get if durability is transient local.
RCLCPP_PUBLIC size_t get_subscription_count() const
Get subscription count.
RCLCPP_PUBLIC std::vector< rclcpp::NetworkFlowEndpoint > get_network_flow_endpoints() const
Get network flow endpoints.
bool wait_for_all_acked(std::chrono::duration< DurationRepT, DurationT > timeout=std::chrono::duration< DurationRepT, DurationT >(-1)) const
Wait until all published messages are acknowledged or until the specified timeout elapses.
RCLCPP_PUBLIC RCUTILS_WARN_UNUSED bool assert_liveliness() const
Manually assert that this Publisher is alive (for RMW_QOS_POLICY_LIVELINESS_MANUAL_BY_TOPIC).
RCLCPP_PUBLIC const std::unordered_map< rcl_publisher_event_type_t, std::shared_ptr< rclcpp::EventHandlerBase > > & get_event_handlers() const
Get all the QoS event handlers associated with this publisher.
RCLCPP_PUBLIC size_t lowest_available_ipm_capacity() const
Return the lowest available capacity for all subscription buffers.
static RCLCPP_PUBLIC bool event_type_is_supported(const rcl_publisher_event_type_t event_type)
Check if a publisher event type is supported by the active RMW implementation.
Encapsulation of Quality of Service settings.
Definition: qos.hpp:114
Pure virtual interface class for the NodeBase part of the Node API.
enum rcl_publisher_event_type_e rcl_publisher_event_type_t
Enumeration of all of the publisher events that may fire.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_publisher_event_init(rcl_event_t *event, const rcl_publisher_t *publisher, const rcl_publisher_event_type_t event_type)
Initialize an rcl_event_t with a publisher.
Definition: event.c:43
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_publisher_wait_for_all_acked(const rcl_publisher_t *publisher, rcl_duration_value_t timeout)
Wait until all published message data is acknowledged or until the specified timeout elapses.
Definition: publisher.c:344
Options available for a rcl publisher.
Definition: publisher.h:44
Contains callbacks for various types of events a Publisher can receive from the middleware.
rcutils_duration_value_t rcl_duration_value_t
A duration of time, measured in nanoseconds.
Definition: time.h:48
#define RCL_RET_OK
Success return code.
Definition: types.h:27
#define RCL_RET_TIMEOUT
Timeout occurred return code.
Definition: types.h:31
rmw_ret_t rcl_ret_t
The type that holds an rcl return code.
Definition: types.h:24