123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- // SPDX-License-Identifier: BSD-2-Clause
- #ifndef ROS_UTILS_HPP
- #define ROS_UTILS_HPP
- #include <Eigen/Dense>
- #include <ros/ros.h>
- #include <nav_msgs/Odometry.h>
- #include <geometry_msgs/Pose.h>
- #include <geometry_msgs/TransformStamped.h>
- namespace hdl_graph_slam {
- /**
- * @brief convert Eigen::Matrix to geometry_msgs::TransformStamped
- * @param stamp timestamp
- * @param pose Eigen::Matrix to be converted
- * @param frame_id tf frame_id
- * @param child_frame_id tf child frame_id
- * @return converted TransformStamped
- */
- static geometry_msgs::TransformStamped matrix2transform(const ros::Time& stamp, const Eigen::Matrix4f& pose, const std::string& frame_id, const std::string& child_frame_id) {
- Eigen::Quaternionf quat(pose.block<3, 3>(0, 0));
- quat.normalize();
- geometry_msgs::Quaternion odom_quat;
- odom_quat.w = quat.w();
- odom_quat.x = quat.x();
- odom_quat.y = quat.y();
- odom_quat.z = quat.z();
- geometry_msgs::TransformStamped odom_trans;
- odom_trans.header.stamp = stamp;
- odom_trans.header.frame_id = frame_id;
- odom_trans.child_frame_id = child_frame_id;
- odom_trans.transform.translation.x = pose(0, 3);
- odom_trans.transform.translation.y = pose(1, 3);
- odom_trans.transform.translation.z = pose(2, 3);
- odom_trans.transform.rotation = odom_quat;
- return odom_trans;
- }
- static Eigen::Isometry3d pose2isometry(const geometry_msgs::Pose& pose) {
- Eigen::Isometry3d mat = Eigen::Isometry3d::Identity();
- mat.translation() = Eigen::Vector3d(pose.position.x, pose.position.y, pose.position.z);
- mat.linear() = Eigen::Quaterniond(pose.orientation.w, pose.orientation.x, pose.orientation.y, pose.orientation.z).toRotationMatrix();
- return mat;
- }
- static Eigen::Isometry3d tf2isometry(const tf::StampedTransform& trans) {
- Eigen::Isometry3d mat = Eigen::Isometry3d::Identity();
- mat.translation() = Eigen::Vector3d(trans.getOrigin().x(), trans.getOrigin().y(), trans.getOrigin().z());
- mat.linear() = Eigen::Quaterniond(trans.getRotation().w(), trans.getRotation().x(), trans.getRotation().y(), trans.getRotation().z()).toRotationMatrix();
- return mat;
- }
- static geometry_msgs::Pose isometry2pose(const Eigen::Isometry3d& mat) {
- Eigen::Quaterniond quat(mat.linear());
- Eigen::Vector3d trans = mat.translation();
- geometry_msgs::Pose pose;
- pose.position.x = trans.x();
- pose.position.y = trans.y();
- pose.position.z = trans.z();
- pose.orientation.w = quat.w();
- pose.orientation.x = quat.x();
- pose.orientation.y = quat.y();
- pose.orientation.z = quat.z();
- return pose;
- }
- static Eigen::Isometry3d odom2isometry(const nav_msgs::OdometryConstPtr& odom_msg) {
- const auto& orientation = odom_msg->pose.pose.orientation;
- const auto& position = odom_msg->pose.pose.position;
- Eigen::Quaterniond quat;
- quat.w() = orientation.w;
- quat.x() = orientation.x;
- quat.y() = orientation.y;
- quat.z() = orientation.z;
- Eigen::Isometry3d isometry = Eigen::Isometry3d::Identity();
- isometry.linear() = quat.toRotationMatrix();
- isometry.translation() = Eigen::Vector3d(position.x, position.y, position.z);
- return isometry;
- }
- } // namespace hdl_graph_slam
- #endif // ROS_UTILS_HPP
|