From 73f147999757b1636b4726756690eed17614c4d9 Mon Sep 17 00:00:00 2001 From: Christian Rauch Date: Sun, 2 Jun 2024 15:19:31 +0200 Subject: [PATCH] t2 type conversions --- src/conversion.cpp | 37 +++++++++++++++++++++ src/conversion.hpp | 6 ++++ src/pose_estimation.cpp | 74 +++++++++++++++++++++++++++++++++++++---- 3 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 src/conversion.cpp create mode 100644 src/conversion.hpp diff --git a/src/conversion.cpp b/src/conversion.cpp new file mode 100644 index 0000000..cdf4d1f --- /dev/null +++ b/src/conversion.cpp @@ -0,0 +1,37 @@ +#include +#include + +// template<> +// geometry_msgs::msg::Vector3 +// tf2::toMsg(const cv::Mat_& vec) +// { +// assert(vec.rows == 3 || vec.cols == 3); + +// geometry_msgs::msg::Vector3 t; +// t.x = vec.at(0); +// t.y = vec.at(1); +// t.z = vec.at(2); +// return t; +// } + +template<> +void +tf2::convert(const cv::Mat_& vec, geometry_msgs::msg::Vector3& t) +{ + assert(vec.rows == 3 || vec.cols == 3); + + t.x = vec.at(0); + t.y = vec.at(1); + t.z = vec.at(2); +} + +// template<> +// void +// tf2::toMsg(const cv::Mat_& vec, geometry_msgs::msg::Vector3& t) +// { +// assert(vec.rows == 3 || vec.cols == 3); + +// t.x = vec.at(0); +// t.y = vec.at(1); +// t.z = vec.at(2); +// } diff --git a/src/conversion.hpp b/src/conversion.hpp new file mode 100644 index 0000000..7919603 --- /dev/null +++ b/src/conversion.hpp @@ -0,0 +1,6 @@ +#include +#include + +template<> +void +tf2::convert(const cv::Mat_& vec, geometry_msgs::msg::Vector3& t); diff --git a/src/pose_estimation.cpp b/src/pose_estimation.cpp index 979427f..ac2fb28 100644 --- a/src/pose_estimation.cpp +++ b/src/pose_estimation.cpp @@ -4,9 +4,44 @@ #include #include #include +// #include +#include +#include "conversion.hpp" + + +// std::string& operator+ (const int k, std::string& c) +// { +// size_t len = c.length(); +// for (size_t i = 0; i < len; i++) +// c[i] += k; +// return c; +// } + +// std::string& operator= (const int k) +// { +// size_t len = k; +// for (size_t i = 0; i < len; i++) +// c[i] += k; +// return k; +// } + +// template<> +// geometry_msgs::msg::Vector3 +// toMsg(const matd_t& t) +// { +// assert(vec.rows == 3 || vec.cols == 3); + +// geometry_msgs::msg::Vector3 t; +// t.x = vec.at(0); +// t.y = vec.at(1); +// t.z = vec.at(2); +// return t; +// } -geometry_msgs::msg::Transform tf_from_apriltag_pose(const apriltag_pose_t& pose) + +geometry_msgs::msg::Transform +toMsg(const apriltag_pose_t& pose) { const Eigen::Quaterniond q(Eigen::Map>(pose.R->data)); @@ -20,18 +55,30 @@ geometry_msgs::msg::Transform tf_from_apriltag_pose(const apriltag_pose_t& pose) t.rotation.y = q.y(); t.rotation.z = q.z(); + // geometry_msgs::msg::Transform t = tf2::eigenToTransform(const Eigen::Isometry3d & TODO); + return t; } -geometry_msgs::msg::Transform tf_from_cv(const cv::Mat_& tvec, const cv::Mat_& rvec) +geometry_msgs::msg::Transform +toMsg(const cv::Mat_& tvec, const cv::Mat_& rvec) { const cv::Quat q = cv::Quat::createFromRvec(rvec); + // convert rotation vector to angle-axis to quaternion + const Eigen::Map v((double*)rvec.data); + const Eigen::Quaterniond qq({v.norm(), v.normalized()}); + geometry_msgs::msg::Transform t; - t.translation.x = tvec.at(0); - t.translation.y = tvec.at(1); - t.translation.z = tvec.at(2); + // t.translation.x = tvec.at(0); + // t.translation.y = tvec.at(1); + // t.translation.z = tvec.at(2); + + // t.translation = tf2::toMsg, geometry_msgs::msg::Vector3>(tvec); + // tf2::convert, geometry_msgs::msg::Vector3>(tvec, t.translation); + tf2::convert(tvec, t.translation); + t.rotation.w = q.w; t.rotation.x = q.x; t.rotation.y = q.y; @@ -40,6 +87,19 @@ geometry_msgs::msg::Transform tf_from_cv(const cv::Mat_& tvec, const cv: return t; } +// geometry_msgs::msg::Transform tf_from_eigen(const Eigen::Vector3d &t, const Eigen::Quaterniond &q) +// { +// geometry_msgs::msg::Transform tf; + +// // tf.translation = tf2::toMsg(t); +// tf2::convert(t, tf.translation); +// // tf2::toMsg(t, tf.translation); +// // tf.rotation = tf2::toMsg(q); +// // tf2::toMsg(q, tf.rotation); + +// return tf; +// } + geometry_msgs::msg::Transform homography(apriltag_detection_t* const detection, const std::array& intr, double tagsize) { @@ -48,7 +108,7 @@ homography(apriltag_detection_t* const detection, const std::array& i apriltag_pose_t pose; estimate_pose_for_tag_homography(&info, &pose); - return tf_from_apriltag_pose(pose); + return toMsg(pose); } geometry_msgs::msg::Transform @@ -77,7 +137,7 @@ pnp(apriltag_detection_t* const detection, const std::array& intr, do cv::Mat rvec, tvec; cv::solvePnP(objectPoints, imagePoints, cameraMatrix, {}, rvec, tvec); - return tf_from_cv(tvec, rvec); + return toMsg(tvec, rvec); } const std::unordered_map pose_estimation_methods{