12 #include "mf_common/EulerPose.h" 13 #include <geometry_msgs/TransformStamped.h> 14 #include <geometry_msgs/Pose.h> 15 #include <geometry_msgs/Quaternion.h> 16 #include <geometry_msgs/Point.h> 17 #include <tf2/LinearMath/Matrix3x3.h> 18 #include <tf2/LinearMath/Vector3.h> 19 #include <tf2_geometry_msgs/tf2_geometry_msgs.h> 20 #include <eigen3/Eigen/Dense> 28 inline geometry_msgs::Pose
to_pose(
const geometry_msgs::TransformStamped &transform)
30 geometry_msgs::Pose pose;
31 pose.position.x = transform.transform.translation.x;
32 pose.position.y = transform.transform.translation.y;
33 pose.position.z = transform.transform.translation.z;
34 pose.orientation.x = transform.transform.rotation.x;
35 pose.orientation.y = transform.transform.rotation.y;
36 pose.orientation.z = transform.transform.rotation.z;
37 pose.orientation.w = transform.transform.rotation.w;
48 while (angle >= M_PI && angle < -M_PI) {
61 inline float distance2(
const geometry_msgs::Point &p1,
const geometry_msgs::Point &p2)
63 return pow(p1.x-p2.x, 2) + pow(p1.y-p2.y, 2) + pow(p1.z-p2.z, 2);
69 inline float distance(
const geometry_msgs::Point &p1,
const geometry_msgs::Point &p2)
77 inline float distance(
const geometry_msgs::Pose &p1,
const geometry_msgs::Pose &p2)
79 return distance(p1.position, p2.position);
94 const geometry_msgs::Pose &pose1,
95 const geometry_msgs::Pose &pose2,
98 geometry_msgs::Pose new_pose;
102 tf2::convert(pose1.position, p1);
103 tf2::convert(pose2.position, p2);
104 tf2::toMsg(p1 + (p2-p1) * t, new_pose.position);
107 tf2::Quaternion q1, q2;
108 tf2::convert(pose1.orientation, q1);
109 tf2::convert(pose2.orientation, q2);
110 tf2::convert(
slerp(q1, q2, t), new_pose.orientation);
125 const tf2::Quaternion &q0,
126 const tf2::Quaternion &q1,
130 tf2::Quaternion v0, v1;
131 tf2::convert(q0, v0);
132 tf2::convert(q1, v1);
140 double dot = v0.dot(v1);
151 const double DOT_THRESHOLD = 0.9995;
152 if (dot > DOT_THRESHOLD) {
155 tf2::Quaternion result = v0 + (v1 - v0) * t;
161 double theta_0 = acos(dot);
162 double theta = theta_0*t;
163 double sin_theta = sin(theta);
164 double sin_theta_0 = sin(theta_0);
166 double s0 = cos(theta) - dot * sin_theta / sin_theta_0;
167 double s1 = sin_theta / sin_theta_0;
169 return (v0 * s0) + (v1 * s1);
180 inline void to_euler(
const tf2::Quaternion &quat,
double &roll,
double &pitch,
double &yaw)
182 tf2::Matrix3x3(quat).getRPY(roll, pitch, yaw);
193 inline void to_euler(
const geometry_msgs::Quaternion &quat,
double &roll,
double &pitch,
double &yaw)
195 tf2::Quaternion _quat(quat.x, quat.y, quat.z, quat.w);
207 inline void to_quaternion(
double roll,
double pitch,
double yaw, tf2::Quaternion &quat)
209 quat.setRPY(roll, pitch, yaw);
220 inline void to_quaternion(
double roll,
double pitch,
double yaw, geometry_msgs::Quaternion &quat)
222 tf2::Quaternion _quat;
223 _quat.setRPY(roll, pitch, yaw);
224 tf2::convert(_quat, quat);
237 float x,
float y,
float z,
float angle,
238 geometry_msgs::Quaternion &quat)
240 tf2::Vector3 vect(x, y, z);
241 tf2::Quaternion _quat(vect, angle);
242 tf2::convert(_quat, quat);
255 template <
class VectorT>
259 mat.setRPY(roll, pitch, yaw);
260 tf2::Vector3 column = mat.getColumn(0);
262 orientation << column.getX(), column.getY(), column.getZ();
274 const geometry_msgs::Pose &p1,
275 const geometry_msgs::Pose &p2,
276 geometry_msgs::Pose &diff)
278 diff.position.x = p1.position.x - p2.position.x;
279 diff.position.y = p1.position.y - p2.position.y;
280 diff.position.z = p1.position.z - p2.position.z;
282 double roll1, pitch1, yaw1;
283 double roll2, pitch2, yaw2;
284 to_euler(p1.orientation, roll1, pitch1, yaw1);
285 to_euler(p2.orientation, roll2, pitch2, yaw2);
286 to_quaternion(roll1 - roll2, pitch1 - pitch2, yaw1 - yaw2, diff.orientation);
298 const geometry_msgs::Pose &p1,
299 const geometry_msgs::Pose &p2,
300 mf_common::EulerPose &diff)
302 diff.x = p1.position.x - p2.position.x;
303 diff.y = p1.position.y - p2.position.y;
304 diff.z = p1.position.z - p2.position.z;
306 double roll1, pitch1, yaw1;
307 double roll2, pitch2, yaw2;
308 to_euler(p1.orientation, roll1, pitch1, yaw1);
309 to_euler(p2.orientation, roll2, pitch2, yaw2);
310 diff.roll = roll1 - roll2;
311 diff.pitch = pitch1 - pitch2;
312 diff.yaw = yaw1 - yaw2;
323 const std::vector<T> &v,
324 Eigen::DiagonalMatrix<T, Eigen::Dynamic> &D)
326 Eigen::Matrix<T, Eigen::Dynamic, 1> vec(v.size());
328 for (
int k = 0; k < v.size(); k++)
331 D = vec.asDiagonal();
340 template <
class T,
class MatrixT>
342 const std::vector<T> &v,
346 D = MatrixT::Zero(n, n);
348 for (
int k = 0; k <
n; k++) {
void diff_pose(const geometry_msgs::Pose &p1, const geometry_msgs::Pose &p2, geometry_msgs::Pose &diff)
Computes the difference between two poses.
void to_quaternion(double roll, double pitch, double yaw, tf2::Quaternion &quat)
Converts Roll-Pitch-Yaw Euler angles to a quaternion.
geometry_msgs::Pose interpolate(const geometry_msgs::Pose &pose1, const geometry_msgs::Pose &pose2, float t)
Interpolates linearily two poses.
float distance(const geometry_msgs::Point &p1, const geometry_msgs::Point &p2)
Computes the the euclidean distance between two positions.
void fill_diag_mat(const std::vector< T > &v, Eigen::DiagonalMatrix< T, Eigen::Dynamic > &D)
Fills a Eigen DiagonalMatrix from a std::Vector.
tf2::Quaternion slerp(const tf2::Quaternion &q0, const tf2::Quaternion &q1, float t)
Spherical Linear Interpolation of two quaternions.
float distance2(const geometry_msgs::Point &p1, const geometry_msgs::Point &p2)
Computes the square of the euclidean distance between two positions.
geometry_msgs::Pose to_pose(const geometry_msgs::TransformStamped &transform)
Converts a TransformStamped message to a Pose message.
T modulo_2pi(T angle)
Brings back an angle into [-pi, pi)
void get_orientation(float roll, float pitch, float yaw, VectorT &orientation)
Get orientation vector (x vector of the frame) given by Roll-Pitch-Yaw.
void to_euler(const tf2::Quaternion &quat, double &roll, double &pitch, double &yaw)
Converts a quaternion to Roll-Pitch-Yaw Euler angles.