pose.cpp
Go to the documentation of this file.
1 /*
2  * pose.cpp
3  *
4  * Created on: Mar 14, 2012
5  * Author: Pablo IƱigo Blasco
6  *
7  * To understand better how this is implemented see the references:
8  * - http://www.mrpt.org/2D_3D_Geometry
9  *
10  */
11 
22 #include <mrpt/poses/CPose2D.h>
23 #include <mrpt/poses/CPose3D.h>
24 #include <mrpt/poses/CPosePDFGaussian.h>
25 #include <mrpt/poses/CPose3DPDFGaussian.h>
26 #include <mrpt/poses/CPosePDFGaussianInf.h>
27 #include <mrpt/poses/CPose3DPDFGaussianInf.h>
28 #include <mrpt/math/CQuaternion.h>
29 #include <mrpt/math/lightweight_geom_data.h>
30 #include <geometry_msgs/PoseWithCovariance.h>
31 #include <geometry_msgs/Pose.h>
32 #include <geometry_msgs/Quaternion.h>
33 #include <mrpt/math/CMatrixFixedNumeric.h>
34 #include <tf/tf.h>
35 
36 #include <mrpt/version.h>
37 #if MRPT_VERSION<0x199
38 #include <mrpt/utils/mrpt_macros.h>
39 #else
40 #include <mrpt/core/exceptions.h>
41 #endif
42 
43 #include "mrpt_bridge/pose.h"
44 
46  const tf::Matrix3x3& _src, mrpt::math::CMatrixDouble33& _des)
47 {
48  for (int r = 0; r < 3; r++)
49  for (int c = 0; c < 3; c++) _des(r, c) = _src[r][c];
50  return _des;
51 }
52 
54  const mrpt::math::CMatrixDouble33& _src, tf::Matrix3x3& _des)
55 {
56  for (int r = 0; r < 3; r++)
57  for (int c = 0; c < 3; c++) _des[r][c] = _src(r, c);
58  return _des;
59 }
60 
62  const mrpt::poses::CPose3DPDFGaussian& _src, tf::Transform& _des)
63 {
64  return convert(_src.mean, _des);
65 }
66 
68  const mrpt::poses::CPose3DPDFGaussian& _src,
70 {
71  convert(_src.mean, _des.pose);
72 
73  // Read REP103: http://ros.org/reps/rep-0103.html#covariance-representation
74  // # Row-major representation of the 6x6 covariance matrix
75  // # The orientation parameters use a fixed-axis representation.
76  // # In order, the parameters are:
77  // # (x, y, z, rotation about X axis, rotation about Y axis, rotation about
78  // Z axis)
79  // float64[36] covariance
80  // Old comment: "MRPT uses non-fixed axis for 6x6 covariance: should use a
81  // transform Jacobian here!"
82  // JL ==> Nope! non-fixed z-y-x equals fixed x-y-z rotations.
83 
84  const unsigned int indxs_map[6] = {0, 1, 2,
85  5, 4, 3}; // X,Y,Z,YAW,PITCH,ROLL
86 
87  for (int i = 0; i < 6; i++)
88  {
89  for (int j = 0; j < 6; j++)
90  {
91  _des.covariance[indxs_map[i] * 6 + indxs_map[j]] = _src.cov(i, j);
92  }
93  }
94  return _des;
95 }
96 
98  const mrpt::poses::CPose3DPDFGaussianInf& _src,
100 {
101  mrpt::poses::CPose3DPDFGaussian mrpt_gaussian;
102  mrpt_gaussian.copyFrom(_src);
103  convert(mrpt_gaussian, _des);
104 
105  return _des;
106 }
107 
109  const mrpt::poses::CPose3D& _src, tf::Transform& _des)
110 {
111  tf::Vector3 origin(_src[0], _src[1], _src[2]);
113  _src.getRotationMatrix(R);
114  tf::Matrix3x3 basis;
115  _des.setBasis(convert(R, basis));
116  _des.setOrigin(origin);
117 
118  return _des;
119 }
120 mrpt::poses::CPose3D& mrpt_bridge::convert(
121  const tf::Transform& _src, mrpt::poses::CPose3D& _des)
122 {
123  const tf::Vector3& t = _src.getOrigin();
124  _des.x() = t[0], _des.y() = t[1], _des.z() = t[2];
125  const tf::Matrix3x3& basis = _src.getBasis();
127  convert(basis, R);
128  _des.setRotationMatrix(R);
129 
130  return _des;
131 }
132 
134  const mrpt::poses::CPose3D& _src, geometry_msgs::Pose& _des)
135 {
136  _des.position.x = _src[0];
137  _des.position.y = _src[1];
138  _des.position.z = _src[2];
139 
141  _src.getAsQuaternion(q);
142 
143  _des.orientation.x = q.x();
144  _des.orientation.y = q.y();
145  _des.orientation.z = q.z();
146  _des.orientation.w = q.r();
147 
148  return _des;
149 }
150 
153  const mrpt::poses::CPose2D& _src, geometry_msgs::Pose& _des)
154 {
155  _des.position.x = _src.x();
156  _des.position.y = _src.y();
157  _des.position.z = 0;
158 
159  const double yaw = _src.phi();
160  if (std::abs(yaw) < 1e-10)
161  {
162  _des.orientation.x = 0.;
163  _des.orientation.y = 0.;
164  _des.orientation.z = .5 * yaw;
165  _des.orientation.w = 1.;
166  }
167  else
168  {
169  const double s = ::sin(yaw * .5);
170  const double c = ::cos(yaw * .5);
171  _des.orientation.x = 0.;
172  _des.orientation.y = 0.;
173  _des.orientation.z = s;
174  _des.orientation.w = c;
175  }
176 
177  return _des;
178 }
179 
180 mrpt::poses::CPose2D& mrpt_bridge::convert(
181  const geometry_msgs::Pose& _src, mrpt::poses::CPose2D& _des)
182 {
183  _des.x(_src.position.x);
184  _des.y(_src.position.y);
185 
187  convert(_src.orientation, quat);
188 
189  double roll, pitch, yaw;
190  quat.rpy(roll, pitch, yaw);
191 
192  _des.phi(yaw);
193 
194  return _des;
195 }
196 
198  const mrpt::poses::CPosePDFGaussian& _src,
200 {
201  convert(_src.mean, _des.pose);
202 
203  // Read REP103: http://ros.org/reps/rep-0103.html#covariance-representation
204  // Old comment: "MRPT uses non-fixed axis for 6x6 covariance: should use a
205  // transform Jacobian here!"
206  // JL ==> Nope! non-fixed z-y-x equals fixed x-y-z rotations.
207 
208  // geometry_msgs/PoseWithCovariance msg stores the covariance matrix in
209  // row-major representation
210  // Indexes are :
211  // [ 0 1 2 3 4 5 ]
212  // [ 6 7 8 9 10 11 ]
213  // [ 12 13 14 15 16 17 ]
214  // [ 18 19 20 21 22 23 ]
215  // [ 24 25 26 27 28 29 ]
216  // [ 30 31 32 33 34 35 ]
217 
218  _des.covariance[0] = _src.cov(0, 0);
219  _des.covariance[1] = _src.cov(0, 1);
220  _des.covariance[5] = _src.cov(0, 2);
221  _des.covariance[6] = _src.cov(1, 0);
222  _des.covariance[7] = _src.cov(1, 1);
223  _des.covariance[11] = _src.cov(1, 2);
224  _des.covariance[30] = _src.cov(2, 0);
225  _des.covariance[31] = _src.cov(2, 1);
226  _des.covariance[35] = _src.cov(2, 2);
227 
228  return _des;
229 }
230 
232  const mrpt::poses::CPosePDFGaussianInf& _src,
234 {
235  mrpt::poses::CPosePDFGaussian mrpt_gaussian;
236  mrpt_gaussian.copyFrom(_src);
237 
238  convert(mrpt_gaussian, _des);
239  return _des;
240 }
241 
242 mrpt::poses::CPose3DPDFGaussian& mrpt_bridge::convert(
244  mrpt::poses::CPose3DPDFGaussian& _des)
245 {
246  convert(_src.pose, _des.mean);
247 
248  const unsigned int indxs_map[6] = {0, 1, 2, 5, 4, 3};
249 
250  for (int i = 0; i < 6; i++)
251  {
252  for (int j = 0; j < 6; j++)
253  {
254  _des.cov(i, j) = _src.covariance[indxs_map[i] * 6 + indxs_map[j]];
255  }
256  }
257 
258  return _des;
259 }
260 
261 mrpt::poses::CPose3DPDFGaussianInf& mrpt_bridge::convert(
263  mrpt::poses::CPose3DPDFGaussianInf& _des)
264 {
265  mrpt::poses::CPose3DPDFGaussian mrpt_gaussian;
266  convert(
267  _src, mrpt_gaussian); // Intermediate transform => CPose3DPDFGaussian
268  _des.copyFrom(mrpt_gaussian);
269 
270  return _des;
271 }
272 
273 mrpt::poses::CPosePDFGaussian& mrpt_bridge::convert(
275  mrpt::poses::CPosePDFGaussian& _des)
276 {
277  convert(_src.pose, _des.mean);
278 
279  _des.cov(0, 0) = _src.covariance[0];
280  _des.cov(0, 1) = _src.covariance[1];
281  _des.cov(0, 2) = _src.covariance[5];
282  _des.cov(1, 0) = _src.covariance[0 + 6];
283  _des.cov(1, 1) = _src.covariance[1 + 6];
284  _des.cov(1, 2) = _src.covariance[5 + 6];
285  _des.cov(2, 0) = _src.covariance[0 + 30];
286  _des.cov(2, 1) = _src.covariance[1 + 30];
287  _des.cov(2, 2) = _src.covariance[5 + 30];
288 
289  return _des;
290 }
291 
292 mrpt::poses::CPosePDFGaussianInf& mrpt_bridge::convert(
294  mrpt::poses::CPosePDFGaussianInf& _des)
295 {
296  mrpt::poses::CPosePDFGaussian mrpt_gaussian;
297  convert(_src, mrpt_gaussian); // intermediate transform: PoseWithCovariance
298  // => CPosePDFGaussian
299  _des.copyFrom(mrpt_gaussian);
300 
301  return _des;
302 }
303 
306 {
307  _des.x(_src.x);
308  _des.y(_src.y);
309  _des.z(_src.z);
310  _des.r(_src.w);
311  return _des;
312 }
313 
316 {
317  _des.x = _src.x();
318  _des.y = _src.y();
319  _des.z = _src.z();
320  _des.w = _src.r();
321 
322  return _des;
323 }
324 
325 mrpt::poses::CPose3D& mrpt_bridge::convert(
326  const geometry_msgs::Pose& _src, mrpt::poses::CPose3D& _des)
327 {
329  _src.orientation.w, _src.orientation.x, _src.orientation.y,
330  _src.orientation.z);
331  _des = mrpt::poses::CPose3D(
332  q, _src.position.x, _src.position.y, _src.position.z);
333 
334  return _des;
335 }
336 
338  const mrpt::math::TPose3D& _src, tf::Transform& _des)
339 {
340  return mrpt_bridge::convert(mrpt::poses::CPose3D(_src), _des);
341 }
342 
344  const mrpt::poses::CPose2D& _src, tf::Transform& _des)
345 {
346  return mrpt_bridge::convert(mrpt::poses::CPose3D(_src), _des);
347 }
349  const mrpt::math::TPose2D& _src, tf::Transform& _des)
350 {
351  return mrpt_bridge::convert(
352  mrpt::poses::CPose3D(mrpt::math::TPose3D(_src)), _des);
353 }
TFSIMD_FORCE_INLINE Matrix3x3 & getBasis()
XmlRpcServer s
math::CQuaternion< double > CQuaternionDouble
Definition: pose.h:50
TFSIMD_FORCE_INLINE const tfScalar & x() const
TFSIMD_FORCE_INLINE const tfScalar & z() const
bool convert(const mrpt_msgs::ObservationRangeBeacon &_msg, const mrpt::poses::CPose3D &_pose, mrpt::obs::CObservationBeaconRanges &_obj)
TFSIMD_FORCE_INLINE const tfScalar & y() const
TFSIMD_FORCE_INLINE void setBasis(const Matrix3x3 &basis)
TFSIMD_FORCE_INLINE Vector3 & getOrigin()
TFSIMD_FORCE_INLINE void setOrigin(const Vector3 &origin)


mrpt_bridge
Author(s): Markus Bader , Raphael Zack
autogenerated on Sat Apr 28 2018 02:49:17