00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <eigen_conversions/eigen_msg.h>
00032
00033 namespace tf {
00034
00035 void pointMsgToEigen(const geometry_msgs::Point &m, Eigen::Vector3d &e)
00036 {
00037 e(0) = m.x;
00038 e(1) = m.y;
00039 e(2) = m.z;
00040 }
00041
00042 void pointEigenToMsg(const Eigen::Vector3d &e, geometry_msgs::Point &m)
00043 {
00044 m.x = e(0);
00045 m.y = e(1);
00046 m.z = e(2);
00047 }
00048
00049 namespace {
00050 template<typename T>
00051 void poseMsgToEigenImpl(const geometry_msgs::Pose &m, T &e)
00052 {
00053 e = Eigen::Translation3d(m.position.x,
00054 m.position.y,
00055 m.position.z) *
00056 Eigen::Quaterniond(m.orientation.w,
00057 m.orientation.x,
00058 m.orientation.y,
00059 m.orientation.z);
00060 }
00061
00062 template<typename T>
00063 void poseEigenToMsgImpl(const T &e, geometry_msgs::Pose &m)
00064 {
00065 m.position.x = e.translation()[0];
00066 m.position.y = e.translation()[1];
00067 m.position.z = e.translation()[2];
00068 Eigen::Quaterniond q = (Eigen::Quaterniond)e.linear();
00069 m.orientation.x = q.x();
00070 m.orientation.y = q.y();
00071 m.orientation.z = q.z();
00072 m.orientation.w = q.w();
00073 if (m.orientation.w < 0) {
00074 m.orientation.x *= -1;
00075 m.orientation.y *= -1;
00076 m.orientation.z *= -1;
00077 m.orientation.w *= -1;
00078 }
00079 }
00080
00081 template<typename T>
00082 void transformMsgToEigenImpl(const geometry_msgs::Transform &m, T &e)
00083 {
00084 e = Eigen::Translation3d(m.translation.x,
00085 m.translation.y,
00086 m.translation.z) *
00087 Eigen::Quaterniond(m.rotation.w,
00088 m.rotation.x,
00089 m.rotation.y,
00090 m.rotation.z);
00091 }
00092
00093 template<typename T>
00094 void transformEigenToMsgImpl(const T &e, geometry_msgs::Transform &m)
00095 {
00096 m.translation.x = e.translation()[0];
00097 m.translation.y = e.translation()[1];
00098 m.translation.z = e.translation()[2];
00099 Eigen::Quaterniond q = (Eigen::Quaterniond)e.linear();
00100 m.rotation.x = q.x();
00101 m.rotation.y = q.y();
00102 m.rotation.z = q.z();
00103 m.rotation.w = q.w();
00104 if (m.rotation.w < 0) {
00105 m.rotation.x *= -1;
00106 m.rotation.y *= -1;
00107 m.rotation.z *= -1;
00108 m.rotation.w *= -1;
00109 }
00110 }
00111 }
00112
00113 void poseMsgToEigen(const geometry_msgs::Pose &m, Eigen::Affine3d &e)
00114 {
00115 poseMsgToEigenImpl(m, e);
00116 }
00117
00118 void poseMsgToEigen(const geometry_msgs::Pose &m, Eigen::Isometry3d &e)
00119 {
00120 poseMsgToEigenImpl(m, e);
00121 }
00122
00123 void poseEigenToMsg(const Eigen::Affine3d &e, geometry_msgs::Pose &m)
00124 {
00125 poseEigenToMsgImpl(e, m);
00126 }
00127
00128 void poseEigenToMsg(const Eigen::Isometry3d &e, geometry_msgs::Pose &m)
00129 {
00130 poseEigenToMsgImpl(e, m);
00131 }
00132
00133 void quaternionMsgToEigen(const geometry_msgs::Quaternion &m, Eigen::Quaterniond &e)
00134 {
00135 e = Eigen::Quaterniond(m.w, m.x, m.y, m.z);
00136 }
00137
00138 void quaternionEigenToMsg(const Eigen::Quaterniond &e, geometry_msgs::Quaternion &m)
00139 {
00140 m.x = e.x();
00141 m.y = e.y();
00142 m.z = e.z();
00143 m.w = e.w();
00144 }
00145
00146 void transformMsgToEigen(const geometry_msgs::Transform &m, Eigen::Affine3d &e)
00147 {
00148 transformMsgToEigenImpl(m, e);
00149 }
00150
00151 void transformMsgToEigen(const geometry_msgs::Transform &m, Eigen::Isometry3d &e)
00152 {
00153 transformMsgToEigenImpl(m, e);
00154 }
00155
00156 void transformEigenToMsg(const Eigen::Affine3d &e, geometry_msgs::Transform &m)
00157 {
00158 transformEigenToMsgImpl(e, m);
00159 }
00160
00161 void transformEigenToMsg(const Eigen::Isometry3d &e, geometry_msgs::Transform &m)
00162 {
00163 transformEigenToMsgImpl(e, m);
00164 }
00165
00166 void vectorMsgToEigen(const geometry_msgs::Vector3 &m, Eigen::Vector3d &e)
00167 {
00168 e(0) = m.x;
00169 e(1) = m.y;
00170 e(2) = m.z;
00171 }
00172
00173 void vectorEigenToMsg(const Eigen::Vector3d &e, geometry_msgs::Vector3 &m)
00174 {
00175 m.x = e(0);
00176 m.y = e(1);
00177 m.z = e(2);
00178 }
00179
00180 void twistMsgToEigen(const geometry_msgs::Twist &m, Eigen::Matrix<double,6,1> &e)
00181 {
00182 e[0] = m.linear.x;
00183 e[1] = m.linear.y;
00184 e[2] = m.linear.z;
00185 e[3] = m.angular.x;
00186 e[4] = m.angular.y;
00187 e[5] = m.angular.z;
00188 }
00189
00190 void twistEigenToMsg(const Eigen::Matrix<double,6,1> &e, geometry_msgs::Twist &m)
00191 {
00192 m.linear.x = e[0];
00193 m.linear.y = e[1];
00194 m.linear.z = e[2];
00195 m.angular.x = e[3];
00196 m.angular.y = e[4];
00197 m.angular.z = e[5];
00198 }
00199
00200 void wrenchMsgToEigen(const geometry_msgs::Wrench &m, Eigen::Matrix<double,6,1> &e)
00201 {
00202 e[0] = m.force.x;
00203 e[1] = m.force.y;
00204 e[2] = m.force.z;
00205 e[3] = m.torque.x;
00206 e[4] = m.torque.y;
00207 e[5] = m.torque.z;
00208 }
00209
00210 void wrenchEigenToMsg(const Eigen::Matrix<double,6,1> &e, geometry_msgs::Wrench &m)
00211 {
00212 m.force.x = e[0];
00213 m.force.y = e[1];
00214 m.force.z = e[2];
00215 m.torque.x = e[3];
00216 m.torque.y = e[4];
00217 m.torque.z = e[5];
00218 }
00219
00220 }