Nav2 Navigation Stack - lyrical  lyrical
ROS 2 Navigation Stack
tf2_factories.hpp
1 // Copyright (c) 2025 Open Navigation LLC
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 NAV2_ROS_COMMON__TF2_FACTORIES_HPP_
16 #define NAV2_ROS_COMMON__TF2_FACTORIES_HPP_
17 
18 #include <memory>
19 #include <string>
20 
21 #include "rclcpp/version.h"
22 #include "rclcpp/rclcpp.hpp"
23 
24 #include "tf2_ros/buffer.hpp"
25 #include "tf2_ros/create_timer_ros.hpp"
26 #include "tf2_ros/transform_listener.hpp"
27 #include "tf2_ros/transform_broadcaster.hpp"
28 #include "tf2_ros/static_transform_broadcaster.hpp"
29 #include "tf2_ros/message_filter.hpp"
30 
31 namespace nav2
32 {
33 
37 using TransformBuffer = tf2_ros::Buffer;
38 
42 struct TransformListener : tf2_ros::TransformListener
43 {
44  using tf2_ros::TransformListener::TransformListener;
45  using SharedPtr = std::shared_ptr<TransformListener>;
46 };
47 
51 struct TransformBroadcaster : tf2_ros::TransformBroadcaster
52 {
53  using tf2_ros::TransformBroadcaster::TransformBroadcaster;
54  using SharedPtr = std::shared_ptr<TransformBroadcaster>;
55 };
56 
60 struct StaticTransformBroadcaster : tf2_ros::StaticTransformBroadcaster
61 {
62  using tf2_ros::StaticTransformBroadcaster::StaticTransformBroadcaster;
63  using SharedPtr = std::shared_ptr<StaticTransformBroadcaster>;
64 };
65 
69 template<typename MessageT>
70 struct MessageFilter : tf2_ros::MessageFilter<MessageT>
71 {
72  using tf2_ros::MessageFilter<MessageT>::MessageFilter;
73  using SharedPtr = std::shared_ptr<MessageFilter<MessageT>>;
74 };
75 
82 template<typename NodeT>
83 inline nav2::TransformBuffer::SharedPtr create_transform_buffer(
84  const NodeT & node,
85  rclcpp::CallbackGroup::SharedPtr callback_group = nullptr)
86 {
87  auto buffer = std::make_shared<nav2::TransformBuffer>(node->get_clock());
88 #if RCLCPP_VERSION_GTE(30, 0, 0)
89  auto timer_interface = std::make_shared<tf2_ros::CreateTimerROS>(*node, callback_group);
90 #else
91  auto timer_interface = std::make_shared<tf2_ros::CreateTimerROS>(
92  node->get_node_base_interface(), node->get_node_timers_interface(), callback_group);
93 #endif
94  buffer->setCreateTimerInterface(timer_interface);
95  return buffer;
96 }
97 
103 template<typename NodeT>
104 inline nav2::TransformBroadcaster::SharedPtr create_transform_broadcaster(
105  const NodeT & node)
106 {
107 #if RCLCPP_VERSION_GTE(30, 0, 0)
108  return std::make_shared<nav2::TransformBroadcaster>(*node);
109 #else
110  return std::make_shared<nav2::TransformBroadcaster>(node);
111 #endif
112 }
113 
119 template<typename NodeT>
120 inline nav2::StaticTransformBroadcaster::SharedPtr create_static_transform_broadcaster(
121  const NodeT & node)
122 {
123 #if RCLCPP_VERSION_GTE(30, 0, 0)
124  return std::make_shared<nav2::StaticTransformBroadcaster>(*node);
125 #else
126  return std::make_shared<nav2::StaticTransformBroadcaster>(node);
127 #endif
128 }
129 
137 template<typename NodeT>
138 inline nav2::TransformListener::SharedPtr create_transform_listener(
139  nav2::TransformBuffer & buffer, const NodeT & node, bool spin_thread = true)
140 {
141 #if RCLCPP_VERSION_GTE(30, 0, 0)
142  return std::make_shared<nav2::TransformListener>(buffer, *node, spin_thread);
143 #else
144  return std::make_shared<nav2::TransformListener>(buffer, node, spin_thread);
145 #endif
146 }
147 
153 inline nav2::TransformListener::SharedPtr create_transform_listener(
154  nav2::TransformBuffer & buffer)
155 {
156  return std::make_shared<nav2::TransformListener>(buffer);
157 }
158 
169 template<typename MessageT, typename SubscriberT, typename NodeT>
170 inline typename nav2::MessageFilter<MessageT>::SharedPtr create_message_filter(
171  SubscriberT & sub, nav2::TransformBuffer & buffer,
172  const std::string & target_frame, uint32_t queue_size,
173  const NodeT & node, tf2::Duration tolerance)
174 {
175 #if RCLCPP_VERSION_GTE(30, 0, 0)
176  return std::make_shared<nav2::MessageFilter<MessageT>>(
177  sub, buffer, target_frame, queue_size, *node, tolerance);
178 #else
179  return std::make_shared<nav2::MessageFilter<MessageT>>(
180  sub, buffer, target_frame, queue_size,
181  node->get_node_logging_interface(), node->get_node_clock_interface(), tolerance);
182 #endif
183 }
184 
185 } // namespace nav2
186 
187 #endif // NAV2_ROS_COMMON__TF2_FACTORIES_HPP_
Nav2 type wrapper for tf2_ros::MessageFilter.
Nav2 type wrapper for tf2_ros::StaticTransformBroadcaster.
Nav2 type wrapper for tf2_ros::TransformBroadcaster.
Nav2 type wrapper for tf2_ros::TransformListener.