5#include <mrs_lib/transformer.h>
15template <
typename msg_t>
16std_msgs::msg::Header Transformer::getHeader(
const msg_t& msg) {
20#ifdef PCL_SPECIALIZATION
21template <
typename pt_t>
22std_msgs::msg::Header Transformer::getHeader(
const pcl::PointCloud<pt_t>& cloud) {
23 std_msgs::msg::Header ret;
24 pcl_conversions::fromPCL(cloud.header, ret);
33template <
typename msg_t>
34void Transformer::setHeader(msg_t& msg,
const std_msgs::msg::Header& header) {
38#ifdef PCL_SPECIALIZATION
39template <
typename pt_t>
40void Transformer::setHeader(pcl::PointCloud<pt_t>& cloud,
const std_msgs::msg::Header& header) {
41 pcl_conversions::toPCL(header, cloud.header);
50T Transformer::copyChangeFrame(
const T& what,
const std::string& frame_id) {
52 if constexpr (has_header_member_v<T>) {
53 std_msgs::msg::Header new_header = getHeader(what);
54 new_header.frame_id = frame_id;
55 setHeader(ret, new_header);
65std::optional<T> Transformer::transformImpl(
const geometry_msgs::msg::TransformStamped& tf,
const T& what) {
68 const std::string to_frame =
frame_to(tf);
70 if (from_frame == to_frame)
71 return copyChangeFrame(what, from_frame);
73 const std::string latlon_frame_name = resolveFrameImpl(LATLON_ORIGIN);
77 if constexpr (UTMLL_exists_v<Transformer, T>) {
79 if (from_frame == latlon_frame_name) {
80 const std::optional<T> tmp = LLtoUTM(what, getFramePrefix(from_frame));
83 return doTransform(tmp.value(), tf);
86 else if (to_frame == latlon_frame_name) {
87 const std::optional<T> tmp = doTransform(what, tf);
90 return UTMtoLL(tmp.value(), getFramePrefix(to_frame));
94 if (from_frame == latlon_frame_name || to_frame == latlon_frame_name) {
95 RCLCPP_ERROR_STREAM_THROTTLE(node_->get_logger(), *node_->get_clock(), 1e9,
96 "Transformer: cannot transform message of this type (" <<
typeid(T).name() <<
") to/from latitude/longitude coordinates!");
102 return doTransform(what, tf);
110std::optional<T> Transformer::doTransform(
const T& what,
const geometry_msgs::msg::TransformStamped& tf) {
113 tf2::doTransform(what, result, tf);
116 catch (tf2::TransformException& ex) {
117 RCLCPP_WARN_THROTTLE(node_->get_logger(), *node_->get_clock(), 1e9,
"Transformer: Error during transform from \"%s\" frame to \"%s\" frame.\n\tMSG: %s",
131 const std_msgs::msg::Header orig_header = getHeader(what);
132 return transformSingle(orig_header.frame_id, what, to_frame_raw, orig_header.stamp);
137 const rclcpp::Time& time_stamp) {
138 std::scoped_lock lck(mutex_);
141 RCLCPP_ERROR_THROTTLE(node_->get_logger(), *node_->get_clock(), 1e9,
"Transformer: cannot transform, not initialized");
145 const std::string from_frame = resolveFrameImpl(from_frame_raw);
146 const std::string to_frame = resolveFrameImpl(to_frame_raw);
147 const std::string latlon_frame = resolveFrameImpl(LATLON_ORIGIN);
150 const auto tf_opt = getTransformImpl(from_frame, to_frame, time_stamp, latlon_frame);
151 if (!tf_opt.has_value())
154 const geometry_msgs::msg::TransformStamped& tf = tf_opt.value();
157 const geometry_msgs::msg::TransformStamped tf_resolved = create_transform(from_frame, to_frame, tf.header.stamp, tf.transform);
159 return transformImpl(tf_resolved, what);
168 std::scoped_lock lck(mutex_);
171 RCLCPP_ERROR_THROTTLE(node_->get_logger(), *node_->get_clock(), 1e9,
"Transformer: cannot transform, not initialized");
175 const std::string from_frame = resolveFrameImpl(
frame_from(tf));
176 const std::string to_frame = resolveFrameImpl(
frame_to(tf));
177 const geometry_msgs::msg::TransformStamped tf_resolved = create_transform(from_frame, to_frame, tf.header.stamp, tf.transform);
179 return transformImpl(tf_resolved, what);
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition attitude_converter.h:24