rclcpp  master
C++ ROS Client Library API
create_subscription.hpp
Go to the documentation of this file.
1 // Copyright 2016 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__CREATE_SUBSCRIPTION_HPP_
16 #define RCLCPP__CREATE_SUBSCRIPTION_HPP_
17 
18 #include <chrono>
19 #include <functional>
20 #include <memory>
21 #include <stdexcept>
22 #include <string>
23 #include <utility>
24 
26 
31 
33 #include "rclcpp/create_timer.hpp"
34 #include "rclcpp/qos.hpp"
37 #include "rclcpp/timer.hpp"
39 #include "rmw/qos_profiles.h"
40 
41 namespace rclcpp
42 {
43 
45 
67 template<
68  typename MessageT,
69  typename CallbackT,
70  typename AllocatorT = std::allocator<void>,
71  typename CallbackMessageT =
74  typename MessageMemoryStrategyT = rclcpp::message_memory_strategy::MessageMemoryStrategy<
75  CallbackMessageT,
76  AllocatorT
77  >,
78  typename NodeT>
81  NodeT && node,
82  const std::string & topic_name,
83  const rclcpp::QoS & qos,
84  CallbackT && callback,
87  ),
88  typename MessageMemoryStrategyT::SharedPtr msg_mem_strat = (
89  MessageMemoryStrategyT::create_default()
90  )
91 )
92 {
94  auto node_topics = get_node_topics_interface(std::forward<NodeT>(node));
95 
97  subscription_topic_stats = nullptr;
98 
100  options,
101  *node_topics->get_node_base_interface()))
102  {
103  if (options.topic_stats_options.publish_period <= std::chrono::milliseconds(0)) {
104  throw std::invalid_argument(
105  "topic_stats_options.publish_period must be greater than 0, specified value of " +
106  std::to_string(options.topic_stats_options.publish_period.count()) +
107  " ms");
108  }
109 
111  create_publisher<statistics_msgs::msg::MetricsMessage>(
112  node,
113  options.topic_stats_options.publish_topic,
114  qos);
115 
116  subscription_topic_stats = std::make_shared<
118  >(node_topics->get_node_base_interface()->get_name(), publisher);
119 
120  auto sub_call_back = [subscription_topic_stats]() {
121  subscription_topic_stats->publish_message();
122  };
123 
124  auto node_timer_interface = node_topics->get_node_timers_interface();
125 
126  auto timer = create_wall_timer(
127  std::chrono::duration_cast<std::chrono::nanoseconds>(
128  options.topic_stats_options.publish_period),
129  sub_call_back,
130  options.callback_group,
131  node_topics->get_node_base_interface(),
132  node_timer_interface
133  );
134 
135  subscription_topic_stats->set_publisher_timer(timer);
136  }
137 
138  auto factory = rclcpp::create_subscription_factory<MessageT>(
139  std::forward<CallbackT>(callback),
140  options,
141  msg_mem_strat,
142  subscription_topic_stats
143  );
144 
145  auto sub = node_topics->create_subscription(topic_name, factory, qos);
146  node_topics->add_subscription(sub, options.callback_group);
147 
148  return std::dynamic_pointer_cast<SubscriptionT>(sub);
149 }
150 
151 } // namespace rclcpp
152 
153 #endif // RCLCPP__CREATE_SUBSCRIPTION_HPP_
get_node_topics_interface.hpp
rclcpp::topic_statistics::SubscriptionTopicStatistics
Definition: subscription_topic_statistics.hpp:55
rclcpp::create_wall_timer
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)
Convenience method to create a timer with node resources.
Definition: create_timer.hpp:90
std::string
std::shared_ptr
std::make_shared
T make_shared(T... args)
std::chrono::milliseconds
get_node_timers_interface.hpp
rclcpp::SubscriptionOptionsWithAllocator
Structure containing optional configuration for Subscriptions.
Definition: subscription_options.hpp:79
rclcpp
This header provides the get_node_base_interface() template function.
Definition: allocator_common.hpp:24
qos.hpp
timer.hpp
rclcpp::Subscription
Subscription implementation, templated on the type of message this subscription receives.
Definition: subscription.hpp:69
node_topics_interface.hpp
rclcpp::QoS
Encapsulation of Quality of Service settings.
Definition: qos.hpp:59
rclcpp::subscription_traits::extract_message_type< rclcpp::function_traits::function_traits< CallbackT >::template argument_type< 0 > >::type
typename std::remove_cv< rclcpp::function_traits::function_traits< CallbackT >::template argument_type< 0 > >::type type
Definition: subscription_traits.hpp:67
std::to_string
T to_string(T... args)
std::invalid_argument
create_timer.hpp
rclcpp::node_interfaces::get_node_topics_interface
std::shared_ptr< rclcpp::node_interfaces::NodeTopicsInterface > get_node_topics_interface(NodeType &&node)
Get the NodeTopicsInterface as a shared pointer from a pointer to a "Node like" object.
Definition: get_node_topics_interface.hpp:72
rclcpp::detail::resolve_enable_topic_statistics
bool resolve_enable_topic_statistics(const OptionsT &options, const NodeBaseT &node_base)
Return whether or not topic statistics is enabled, resolving "NodeDefault" if needed.
Definition: resolve_enable_topic_statistics.hpp:30
subscription_factory.hpp
subscription_options.hpp
rclcpp::message_memory_strategy::MessageMemoryStrategy
Default allocation strategy for messages received by subscriptions.
Definition: message_memory_strategy.hpp:41
node_timers_interface.hpp
std::allocator
rclcpp::create_subscription
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.
Definition: create_subscription.hpp:80
resolve_enable_topic_statistics.hpp
subscription_topic_statistics.hpp
qos_profiles.h
create_publisher.hpp