5#include <mrs_lib/transformer.h>
15 template <
typename msg_t>
16 std_msgs::msg::Header Transformer::getHeader(
const msg_t& msg)
21#ifdef PCL_SPECIALIZATION
22 template <
typename pt_t>
23 std_msgs::msg::Header Transformer::getHeader(
const pcl::PointCloud<pt_t>& cloud)
25 std_msgs::msg::Header ret;
26 pcl_conversions::fromPCL(cloud.header, ret);
35 template <
typename msg_t>
36 void Transformer::setHeader(msg_t& msg,
const std_msgs::msg::Header& header)
41#ifdef PCL_SPECIALIZATION
42 template <
typename pt_t>
43 void Transformer::setHeader(pcl::PointCloud<pt_t>& cloud,
const std_msgs::msg::Header& header)
45 pcl_conversions::toPCL(header, cloud.header);
54 T Transformer::copyChangeFrame(
const T& what,
const std::string& frame_id)
57 if constexpr (has_header_member_v<T>)
59 std_msgs::msg::Header new_header = getHeader(what);
60 new_header.frame_id = frame_id;
61 setHeader(ret, new_header);
71 std::optional<T> Transformer::transformImpl(
const geometry_msgs::msg::TransformStamped& tf,
const T& what)
75 const std::string to_frame =
frame_to(tf);
77 if (from_frame == to_frame)
78 return copyChangeFrame(what, from_frame);
80 const std::string latlon_frame_name = resolveFrameImpl(LATLON_ORIGIN);
84 if constexpr (UTMLL_exists_v<Transformer, T>)
87 if (from_frame == latlon_frame_name)
89 const std::optional<T> tmp = LLtoUTM(what, getFramePrefix(from_frame));
92 return doTransform(tmp.value(), tf);
95 else if (to_frame == latlon_frame_name)
97 const std::optional<T> tmp = doTransform(what, tf);
100 return UTMtoLL(tmp.value(), getFramePrefix(to_frame));
105 if (from_frame == latlon_frame_name || to_frame == latlon_frame_name)
107 RCLCPP_ERROR_STREAM_THROTTLE(node_->get_logger(), *node_->get_clock(), 1e9,
108 "Transformer: cannot transform message of this type (" <<
typeid(T).name() <<
") to/from latitude/longitude coordinates!");
114 return doTransform(what, tf);
122 std::optional<T> Transformer::doTransform(
const T& what,
const geometry_msgs::msg::TransformStamped& tf)
127 tf2::doTransform(what, result, tf);
130 catch (tf2::TransformException& ex)
132 RCLCPP_WARN_THROTTLE(node_->get_logger(), *node_->get_clock(), 1e9,
"Transformer: Error during transform from \"%s\" frame to \"%s\" frame.\n\tMSG: %s",
147 const std_msgs::msg::Header orig_header = getHeader(what);
148 return transformSingle(orig_header.frame_id, what, to_frame_raw, orig_header.stamp);
153 const rclcpp::Time& time_stamp)
155 std::scoped_lock lck(mutex_);
159 RCLCPP_ERROR_THROTTLE(node_->get_logger(), *node_->get_clock(), 1e9,
"Transformer: cannot transform, not initialized");
163 const std::string from_frame = resolveFrameImpl(from_frame_raw);
164 const std::string to_frame = resolveFrameImpl(to_frame_raw);
165 const std::string latlon_frame = resolveFrameImpl(LATLON_ORIGIN);
168 const auto tf_opt = getTransformImpl(from_frame, to_frame, time_stamp, latlon_frame);
169 if (!tf_opt.has_value())
172 const geometry_msgs::msg::TransformStamped& tf = tf_opt.value();
175 const geometry_msgs::msg::TransformStamped tf_resolved = create_transform(from_frame, to_frame, tf.header.stamp, tf.transform);
177 return transformImpl(tf_resolved, what);
187 std::scoped_lock lck(mutex_);
191 RCLCPP_ERROR_THROTTLE(node_->get_logger(), *node_->get_clock(), 1e9,
"Transformer: cannot transform, not initialized");
195 const std::string from_frame = resolveFrameImpl(
frame_from(tf));
196 const std::string to_frame = resolveFrameImpl(
frame_to(tf));
197 const geometry_msgs::msg::TransformStamped tf_resolved = create_transform(from_frame, to_frame, tf.header.stamp, tf.transform);
199 return transformImpl(tf_resolved, what);
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition attitude_converter.h:24