104 Transformer(
const rclcpp::Node::SharedPtr& node,
const bool spin_thread =
true,
const rclcpp::CallbackGroup::SharedPtr& callback_group =
nullptr);
131 Transformer(
const rclcpp::Node::SharedPtr& node,
const rclcpp::Clock::SharedPtr& clock,
132 const rclcpp::Duration& cache_time = rclcpp::Duration(tf2::BUFFER_CORE_DEFAULT_CACHE_TIME),
const rclcpp::QoS& qos = rclcpp::ServicesQoS(),
133 const bool spin_thread =
true,
const rclcpp::CallbackGroup::SharedPtr& callback_group =
nullptr);
162 std::scoped_lock lck(mutex_);
163 default_frame_id_ = frame_id;
185 std::scoped_lock lck(mutex_);
189 prefix_ = prefix +
"/";
206 void setLatLon(
const double lat,
const double lon);
223 std::scoped_lock lck(mutex_);
224 lookup_timeout_ = timeout;
243 std::scoped_lock lck(mutex_);
244 retry_lookup_newest_ = retry;
260 std::scoped_lock lck(mutex_);
280 std::scoped_lock lck(mutex_);
281 return resolveFrameImpl(frame_id);
296 [[nodiscard]] std::optional<T>
transformSingle(
const T& what,
const std::string& to_frame);
309 [[nodiscard]] std::optional<std::shared_ptr<T>>
transformSingle(
const std::shared_ptr<T>& what,
const std::string& to_frame)
325 [[nodiscard]] std::optional<std::shared_ptr<T>>
transformSingle(
const std::shared_ptr<const T>& what,
const std::string& to_frame)
328 if (ret == std::nullopt)
331 return std::make_shared<T>(std::move(ret.value()));
347 [[nodiscard]] std::optional<T>
transformSingle(
const std::string& from_frame,
const T& what,
const std::string& to_frame,
348 const rclcpp::Time& time_stamp = rclcpp::Time(0));
363 [[nodiscard]] std::optional<std::shared_ptr<T>>
transformSingle(
const std::string& from_frame,
const std::shared_ptr<T>& what,
const std::string& to_frame,
364 const rclcpp::Time& time_stamp = rclcpp::Time(0))
366 return transformSingle(from_frame, std::shared_ptr<const T>(what), to_frame, time_stamp);
382 [[nodiscard]] std::optional<std::shared_ptr<T>>
transformSingle(
const std::string& from_frame,
const std::shared_ptr<const T>& what,
383 const std::string& to_frame,
const rclcpp::Time& time_stamp = rclcpp::Time(0))
386 if (ret == std::nullopt)
389 return std::make_shared<T>(std::move(ret.value()));
405 [[nodiscard]] std::optional<T>
transform(
const T& what,
const geometry_msgs::msg::TransformStamped& tf);
418 [[nodiscard]] std::optional<std::shared_ptr<T>>
transform(
const std::shared_ptr<const T>& what,
const geometry_msgs::msg::TransformStamped& tf)
421 if (ret == std::nullopt)
424 return std::make_shared<T>(std::move(ret.value()));
438 [[nodiscard]] std::optional<std::shared_ptr<T>>
transform(
const std::shared_ptr<T>& what,
const geometry_msgs::msg::TransformStamped& tf)
440 return transform(std::shared_ptr<const T>(what), tf);
456 [[nodiscard]] std::optional<Eigen::Vector3d>
transformAsVector(
const Eigen::Vector3d& what,
const geometry_msgs::msg::TransformStamped& tf);
470 [[nodiscard]] std::optional<Eigen::Vector3d>
transformAsVector(
const std::string& from_frame,
const Eigen::Vector3d& what,
const std::string& to_frame,
471 const rclcpp::Time& time_stamp = rclcpp::Time(0));
485 [[nodiscard]] std::optional<Eigen::Vector3d>
transformAsPoint(
const Eigen::Vector3d& what,
const geometry_msgs::msg::TransformStamped& tf);
499 [[nodiscard]] std::optional<Eigen::Vector3d>
transformAsPoint(
const std::string& from_frame,
const Eigen::Vector3d& what,
const std::string& to_frame,
500 const rclcpp::Time& time_stamp = rclcpp::Time(0));
514 [[nodiscard]] std::optional<geometry_msgs::msg::TransformStamped>
getTransform(
const std::string& from_frame,
const std::string& to_frame,
515 const rclcpp::Time& time_stamp = rclcpp::Time(0));
532 [[nodiscard]] std::optional<geometry_msgs::msg::TransformStamped>
getTransform(
const std::string& from_frame,
const rclcpp::Time& from_stamp,
533 const std::string& to_frame,
const rclcpp::Time& to_stamp,
534 const std::string& fixed_frame);
544 bool initialized_ =
false;
545 rclcpp::Node::SharedPtr node_;
547 std::unique_ptr<tf2_ros::Buffer> tf_buffer_;
548 std::unique_ptr<tf2_ros::TransformListener> tf_listener_ptr_;
551 std::string default_frame_id_ =
"";
552 std::string prefix_ =
"";
554 rclcpp::Duration lookup_timeout_ = rclcpp::Duration(0, 0);
555 bool retry_lookup_newest_ =
false;
557 bool got_utm_zone_ =
false;
558 std::array<char, 10> utm_zone_ = {};
561 std::string getFramePrefix(
const std::string& frame_id);
564 std::optional<T> transformImpl(
const geometry_msgs::msg::TransformStamped& tf,
const T& what);
565 std::optional<mrs_msgs::msg::ReferenceStamped> transformImpl(
const geometry_msgs::msg::TransformStamped& tf,
const mrs_msgs::msg::ReferenceStamped& what);
566 std::optional<Eigen::Vector3d> transformImpl(
const geometry_msgs::msg::TransformStamped& tf,
const Eigen::Vector3d& what);
568 [[nodiscard]] std::optional<geometry_msgs::msg::TransformStamped> getTransformImpl(
const std::string& from_frame,
const std::string& to_frame,
569 const rclcpp::Time& time_stamp,
const std::string& latlon_frame);
571 [[nodiscard]] std::optional<geometry_msgs::msg::TransformStamped> getTransformImpl(
const std::string& from_frame,
const rclcpp::Time& from_stamp,
572 const std::string& to_frame,
const rclcpp::Time& to_stamp,
573 const std::string& fixed_frame,
const std::string& latlon_frame);
575 std::string resolveFrameImpl(
const std::string& frame_id);
578 std::optional<T> doTransform(
const T& what,
const geometry_msgs::msg::TransformStamped& tf);
592 static constexpr const std::string&
frame_from(
const geometry_msgs::msg::TransformStamped& msg)
594 return msg.child_frame_id;
605 static constexpr std::string&
frame_from(geometry_msgs::msg::TransformStamped& msg)
607 return msg.child_frame_id;
616 static constexpr const std::string&
frame_to(
const geometry_msgs::msg::TransformStamped& msg)
618 return msg.header.frame_id;
629 static constexpr std::string&
frame_to(geometry_msgs::msg::TransformStamped& msg)
631 return msg.header.frame_id;
640 static geometry_msgs::msg::TransformStamped
inverse(
const geometry_msgs::msg::TransformStamped& msg)
643 tf2::fromMsg(msg.transform, tf2);
645 return create_transform(
frame_to(msg),
frame_from(msg), msg.header.stamp, tf2::toMsg(tf2));
651 static geometry_msgs::msg::TransformStamped create_transform(
const std::string& from_frame,
const std::string& to_frame,
const rclcpp::Time& time_stamp)
653 geometry_msgs::msg::TransformStamped ret;
656 ret.header.stamp = time_stamp;
660 static geometry_msgs::msg::TransformStamped create_transform(
const std::string& from_frame,
const std::string& to_frame,
const rclcpp::Time& time_stamp,
661 const geometry_msgs::msg::Transform& tf)
663 geometry_msgs::msg::TransformStamped ret;
666 ret.header.stamp = time_stamp;
675 template <
typename T>
676 using has_header_member_chk =
decltype(std::declval<T&>().header);
678 template <
typename T>
679 static constexpr bool has_header_member_v = std::experimental::is_detected<has_header_member_chk, T>::value;
681 template <
typename msg_t>
682 std_msgs::msg::Header getHeader(
const msg_t& msg);
684#ifdef PCL_SPECIALIZATION
685 template <
typename pt_t>
686 std_msgs::msg::Header getHeader(
const pcl::PointCloud<pt_t>& cloud);
688 template <
typename pt_t>
689 void setHeader(pcl::PointCloud<pt_t>& cloud,
const std_msgs::msg::Header& header);
692 template <
typename msg_t>
693 void setHeader(msg_t& msg,
const std_msgs::msg::Header& header);
695 template <
typename T>
696 T copyChangeFrame(
const T& what,
const std::string& frame_id);
701 geometry_msgs::msg::Point LLtoUTM(
const geometry_msgs::msg::Point& what,
const std::string& prefix);
702 geometry_msgs::msg::PointStamped LLtoUTM(
const geometry_msgs::msg::PointStamped& what,
const std::string& prefix);
703 geometry_msgs::msg::Pose LLtoUTM(
const geometry_msgs::msg::Pose& what,
const std::string& prefix);
704 geometry_msgs::msg::PoseStamped LLtoUTM(
const geometry_msgs::msg::PoseStamped& what,
const std::string& prefix);
706 std::optional<geometry_msgs::msg::Point> UTMtoLL(
const geometry_msgs::msg::Point& what,
const std::string& prefix);
707 std::optional<geometry_msgs::msg::PointStamped> UTMtoLL(
const geometry_msgs::msg::PointStamped& what,
const std::string& prefix);
708 std::optional<geometry_msgs::msg::Pose> UTMtoLL(
const geometry_msgs::msg::Pose& what,
const std::string& prefix);
709 std::optional<geometry_msgs::msg::PoseStamped> UTMtoLL(
const geometry_msgs::msg::PoseStamped& what,
const std::string& prefix);
712 template <
class Class,
typename Message>
713 using UTMLL_method_chk =
decltype(std::declval<Class>().UTMtoLL(std::declval<const Message&>(),
""));
715 template <
class Class,
typename Message>
716 using LLUTM_method_chk =
decltype(std::declval<Class>().LLtoUTM(std::declval<const Message&>(),
""));
718 template <
class Class,
typename Message>
719 static constexpr bool UTMLL_exists_v =
720 std::experimental::is_detected<UTMLL_method_chk, Class, Message>::value && std::experimental::is_detected<LLUTM_method_chk, Class, Message>::value;