15 #ifndef RCLCPP__CREATE_SUBSCRIPTION_HPP_
16 #define RCLCPP__CREATE_SUBSCRIPTION_HPP_
25 #include "rclcpp/detail/resolve_enable_topic_statistics.hpp"
27 #include "rclcpp/node_interfaces/get_node_timers_interface.hpp"
28 #include "rclcpp/node_interfaces/get_node_topics_interface.hpp"
29 #include "rclcpp/node_interfaces/node_timers_interface.hpp"
30 #include "rclcpp/node_interfaces/node_topics_interface.hpp"
32 #include "rclcpp/create_publisher.hpp"
33 #include "rclcpp/create_timer.hpp"
34 #include "rclcpp/qos.hpp"
35 #include "rclcpp/subscription_factory.hpp"
36 #include "rclcpp/subscription_options.hpp"
37 #include "rclcpp/timer.hpp"
38 #include "rclcpp/topic_statistics/subscription_topic_statistics.hpp"
39 #include "rmw/qos_profiles.h"
50 typename SubscriptionT,
51 typename MessageMemoryStrategyT,
52 typename NodeParametersT,
55 typename std::shared_ptr<SubscriptionT>
57 NodeParametersT & node_parameters,
58 NodeTopicsT & node_topics,
59 const std::string & topic_name,
61 CallbackT && callback,
65 typename MessageMemoryStrategyT::SharedPtr msg_mem_strat = (
66 MessageMemoryStrategyT::create_default()
70 using rclcpp::node_interfaces::get_node_topics_interface;
71 auto node_topics_interface = get_node_topics_interface(node_topics);
73 std::shared_ptr<rclcpp::topic_statistics::SubscriptionTopicStatistics>
74 subscription_topic_stats =
nullptr;
76 if (rclcpp::detail::resolve_enable_topic_statistics(
78 *node_topics_interface->get_node_base_interface()))
80 if (options.topic_stats_options.publish_period <= std::chrono::milliseconds(0)) {
81 throw std::invalid_argument(
82 "topic_stats_options.publish_period must be greater than 0, specified value of " +
83 std::to_string(options.topic_stats_options.publish_period.count()) +
" ms");
86 std::shared_ptr<Publisher<statistics_msgs::msg::MetricsMessage>>
87 publisher = rclcpp::detail::create_publisher<statistics_msgs::msg::MetricsMessage>(
89 node_topics_interface,
90 options.topic_stats_options.publish_topic,
91 options.topic_stats_options.qos);
93 subscription_topic_stats =
94 std::make_shared<rclcpp::topic_statistics::SubscriptionTopicStatistics>(
95 node_topics_interface->get_node_base_interface()->get_name(), publisher);
99 > weak_subscription_topic_stats(subscription_topic_stats);
100 auto sub_call_back = [weak_subscription_topic_stats]() {
101 auto subscription_topic_stats = weak_subscription_topic_stats.lock();
102 if (subscription_topic_stats) {
103 subscription_topic_stats->publish_message_and_reset_measurements();
107 auto node_timer_interface = node_topics_interface->get_node_timers_interface();
110 std::chrono::duration_cast<std::chrono::nanoseconds>(
111 options.topic_stats_options.publish_period),
113 options.callback_group,
114 node_topics_interface->get_node_base_interface(),
118 subscription_topic_stats->set_publisher_timer(timer);
121 auto factory = rclcpp::create_subscription_factory<MessageT>(
122 std::forward<CallbackT>(callback),
125 subscription_topic_stats
128 const rclcpp::QoS & actual_qos = options.qos_overriding_options.get_policy_kinds().size() ?
129 rclcpp::detail::declare_qos_parameters(
130 options.qos_overriding_options, node_parameters,
131 node_topics_interface->resolve_topic_name(topic_name),
135 auto sub = node_topics_interface->create_subscription(topic_name, factory, actual_qos);
136 node_topics_interface->add_subscription(sub, options.callback_group);
138 return std::dynamic_pointer_cast<SubscriptionT>(sub);
171 typename AllocatorT = std::allocator<void>,
173 typename MessageMemoryStrategyT =
typename SubscriptionT::MessageMemoryStrategyType,
175 typename std::shared_ptr<SubscriptionT>
178 const std::string & topic_name,
180 CallbackT && callback,
184 typename MessageMemoryStrategyT::SharedPtr msg_mem_strat = (
185 MessageMemoryStrategyT::create_default()
189 return rclcpp::detail::create_subscription<
190 MessageT, CallbackT, AllocatorT, SubscriptionT, MessageMemoryStrategyT>(
191 node, node, topic_name, qos, std::forward<CallbackT>(callback), options, msg_mem_strat);
201 typename AllocatorT = std::allocator<void>,
203 typename MessageMemoryStrategyT =
typename SubscriptionT::MessageMemoryStrategyType>
204 typename std::shared_ptr<SubscriptionT>
206 rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & node_parameters,
207 rclcpp::node_interfaces::NodeTopicsInterface::SharedPtr & node_topics,
208 const std::string & topic_name,
210 CallbackT && callback,
214 typename MessageMemoryStrategyT::SharedPtr msg_mem_strat = (
215 MessageMemoryStrategyT::create_default()
219 return rclcpp::detail::create_subscription<
220 MessageT, CallbackT, AllocatorT, SubscriptionT, MessageMemoryStrategyT>(
221 node_parameters, node_topics, topic_name, qos,
222 std::forward<CallbackT>(callback), options, msg_mem_strat);
Encapsulation of Quality of Service settings.
Subscription implementation, templated on the type of message this subscription receives.
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.
rclcpp::WallTimer< CallbackT >::SharedPtr create_wall_timer(std::chrono::duration< DurationRepT, DurationT > period, CallbackT callback, rclcpp::CallbackGroup::SharedPtr group, node_interfaces::NodeBaseInterface *node_base, node_interfaces::NodeTimersInterface *node_timers, bool autostart=true)
Convenience method to create a wall timer with node resources.
std::shared_ptr< SubscriptionT > create_subscription(NodeT &node, const std::string &topic_name, const rclcpp::QoS &qos, CallbackT &&callback, const rclcpp::SubscriptionOptionsWithAllocator< AllocatorT > &options=(rclcpp::SubscriptionOptionsWithAllocator< AllocatorT >()), typename MessageMemoryStrategyT::SharedPtr msg_mem_strat=(MessageMemoryStrategyT::create_default()))
Create and return a subscription of the given MessageT type.
Structure containing optional configuration for Subscriptions.