melodic/include/tf2/LinearMath/Transform.h
Go to the documentation of this file.
1 #include "sick_scan/sick_scan_base.h" /* Base definitions included in all header files, added by add_sick_scan_base_header.py. Do not edit this line. */
2 /*
3 Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/
4 
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose,
8 including commercial applications, and to alter it and redistribute it freely,
9 subject to the following restrictions:
10 
11 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
14 */
15 
16 
17 
18 #ifndef tf2_Transform_H
19 #define tf2_Transform_H
20 
21 
22 #include "Matrix3x3.h"
23 
24 
25 namespace tf2
26 {
27 
28 #define TransformData TransformDoubleData
29 
30 
33 class Transform {
34 
36  Matrix3x3 m_basis;
39 
40 public:
41 
43  Transform() {}
47  explicit TF2SIMD_FORCE_INLINE Transform(const Quaternion& q,
48  const Vector3& c = Vector3(tf2Scalar(0), tf2Scalar(0), tf2Scalar(0)))
49  : m_basis(q),
50  m_origin(c)
51  {}
52 
56  explicit TF2SIMD_FORCE_INLINE Transform(const Matrix3x3& b,
57  const Vector3& c = Vector3(tf2Scalar(0), tf2Scalar(0), tf2Scalar(0)))
58  : m_basis(b),
59  m_origin(c)
60  {}
63  : m_basis(other.m_basis),
64  m_origin(other.m_origin)
65  {
66  }
69  {
70  m_basis = other.m_basis;
71  m_origin = other.m_origin;
72  return *this;
73  }
74 
79  TF2SIMD_FORCE_INLINE void mult(const Transform& t1, const Transform& t2) {
80  m_basis = t1.m_basis * t2.m_basis;
81  m_origin = t1(t2.m_origin);
82  }
83 
84 /* void multInverseLeft(const Transform& t1, const Transform& t2) {
85  Vector3 v = t2.m_origin - t1.m_origin;
86  m_basis = tf2MultTransposeLeft(t1.m_basis, t2.m_basis);
87  m_origin = v * t1.m_basis;
88  }
89  */
90 
93  {
94  return Vector3(m_basis[0].dot(x) + m_origin.x(),
95  m_basis[1].dot(x) + m_origin.y(),
96  m_basis[2].dot(x) + m_origin.z());
97  }
98 
101  {
102  return (*this)(x);
103  }
104 
107  {
108  return getRotation() * q;
109  }
110 
112  TF2SIMD_FORCE_INLINE Matrix3x3& getBasis() { return m_basis; }
114  TF2SIMD_FORCE_INLINE const Matrix3x3& getBasis() const { return m_basis; }
115 
119  TF2SIMD_FORCE_INLINE const Vector3& getOrigin() const { return m_origin; }
120 
122  Quaternion getRotation() const {
123  Quaternion q;
124  m_basis.getRotation(q);
125  return q;
126  }
127 
128 
131  void setFromOpenGLMatrix(const tf2Scalar *m)
132  {
134  m_origin.setValue(m[12],m[13],m[14]);
135  }
136 
139  void getOpenGLMatrix(tf2Scalar *m) const
140  {
142  m[12] = m_origin.x();
143  m[13] = m_origin.y();
144  m[14] = m_origin.z();
145  m[15] = tf2Scalar(1.0);
146  }
147 
150  TF2SIMD_FORCE_INLINE void setOrigin(const Vector3& origin)
151  {
152  m_origin = origin;
153  }
154 
155  TF2SIMD_FORCE_INLINE Vector3 invXform(const Vector3& inVec) const;
156 
157 
159  TF2SIMD_FORCE_INLINE void setBasis(const Matrix3x3& basis)
160  {
161  m_basis = basis;
162  }
163 
166  {
167  m_basis.setRotation(q);
168  }
169 
170 
172  void setIdentity()
173  {
175  m_origin.setValue(tf2Scalar(0.0), tf2Scalar(0.0), tf2Scalar(0.0));
176  }
177 
180  Transform& operator*=(const Transform& t)
181  {
182  m_origin += m_basis * t.m_origin;
183  m_basis *= t.m_basis;
184  return *this;
185  }
186 
188  Transform inverse() const
189  {
190  Matrix3x3 inv = m_basis.transpose();
191  return Transform(inv, inv * -m_origin);
192  }
193 
197  Transform inverseTimes(const Transform& t) const;
198 
200  Transform operator*(const Transform& t) const;
201 
203  static const Transform& getIdentity()
204  {
205  static const Transform identityTransform(Matrix3x3::getIdentity());
206  return identityTransform;
207  }
208 
209  void serialize(struct TransformData& dataOut) const;
210 
211  void serializeFloat(struct TransformFloatData& dataOut) const;
212 
213  void deSerialize(const struct TransformData& dataIn);
214 
215  void deSerializeDouble(const struct TransformDoubleData& dataIn);
216 
217  void deSerializeFloat(const struct TransformFloatData& dataIn);
218 
219 };
220 
221 
223 Transform::invXform(const Vector3& inVec) const
224 {
225  Vector3 v = inVec - m_origin;
226  return (m_basis.transpose() * v);
227 }
228 
230 Transform::inverseTimes(const Transform& t) const
231 {
232  Vector3 v = t.getOrigin() - m_origin;
233  return Transform(m_basis.transposeTimes(t.m_basis),
234  v * m_basis);
235 }
236 
238 Transform::operator*(const Transform& t) const
239 {
240  return Transform(m_basis * t.m_basis,
241  (*this)(t.m_origin));
242 }
243 
245 TF2SIMD_FORCE_INLINE bool operator==(const Transform& t1, const Transform& t2)
246 {
247  return ( t1.getBasis() == t2.getBasis() &&
248  t1.getOrigin() == t2.getOrigin() );
249 }
250 
251 
253 struct TransformFloatData
254 {
255  Matrix3x3FloatData m_basis;
256  Vector3FloatData m_origin;
257 };
258 
259 struct TransformDoubleData
260 {
261  Matrix3x3DoubleData m_basis;
262  Vector3DoubleData m_origin;
263 };
264 
265 
266 
268 {
269  m_basis.serialize(dataOut.m_basis);
270  m_origin.serialize(dataOut.m_origin);
271 }
272 
273 TF2SIMD_FORCE_INLINE void Transform::serializeFloat(TransformFloatData& dataOut) const
274 {
275  m_basis.serializeFloat(dataOut.m_basis);
276  m_origin.serializeFloat(dataOut.m_origin);
277 }
278 
279 
281 {
282  m_basis.deSerialize(dataIn.m_basis);
283  m_origin.deSerialize(dataIn.m_origin);
284 }
285 
286 TF2SIMD_FORCE_INLINE void Transform::deSerializeFloat(const TransformFloatData& dataIn)
287 {
288  m_basis.deSerializeFloat(dataIn.m_basis);
289  m_origin.deSerializeFloat(dataIn.m_origin);
290 }
291 
292 TF2SIMD_FORCE_INLINE void Transform::deSerializeDouble(const TransformDoubleData& dataIn)
293 {
294  m_basis.deSerializeDouble(dataIn.m_basis);
295  m_origin.deSerializeDouble(dataIn.m_origin);
296 }
297 
298 }
299 
300 #endif
301 
302 
303 
304 
305 
306 
tf2::Transform::m_origin
Vector3 m_origin
Storage for the translation.
Definition: melodic/include/tf2/LinearMath/Transform.h:38
tf2::Transform::serializeFloat
void serializeFloat(struct TransformFloatData &dataOut) const
Definition: melodic/include/tf2/LinearMath/Transform.h:273
tf2::dot
TF2SIMD_FORCE_INLINE tf2Scalar dot(const Quaternion &q1, const Quaternion &q2)
Calculate the dot product between two quaternions.
Definition: melodic/include/tf2/LinearMath/Quaternion.h:391
tf2::TransformFloatData::m_origin
Vector3FloatData m_origin
Definition: melodic/include/tf2/LinearMath/Transform.h:256
geometry_msgs::Vector3
::geometry_msgs::Vector3_< std::allocator< void > > Vector3
Definition: kinetic/include/geometry_msgs/Vector3.h:58
Matrix3x3.h
tf2::Transform::getOpenGLMatrix
void getOpenGLMatrix(tf2Scalar *m) const
tf2::Transform::deSerializeFloat
void deSerializeFloat(const struct TransformFloatData &dataIn)
tf2::Transform::serialize
void serialize(struct TransformData &dataOut) const
Definition: melodic/include/tf2/LinearMath/Transform.h:267
tf2::Transform::inverse
Transform inverse() const
tf2::Matrix3x3::deSerializeFloat
void deSerializeFloat(const struct Matrix3x3FloatData &dataIn)
Definition: Matrix3x3.h:681
tf2::Matrix3x3::getRotation
void getRotation(Quaternion &q) const
tf2::Transform::Transform
Transform()
tf2::Transform::setRotation
TF2SIMD_FORCE_INLINE void setRotation(const Quaternion &q)
tf2::Transform::m_basis
Matrix3x3 m_basis
Storage for the rotation.
Definition: melodic/include/tf2/LinearMath/Transform.h:36
tf2::Transform::operator*
TF2SIMD_FORCE_INLINE Quaternion operator*(const Quaternion &q) const
tf2::Transform::getOrigin
TF2SIMD_FORCE_INLINE Vector3 & getOrigin()
tf2::Transform::operator*=
Transform & operator*=(const Transform &t)
tf2::Transform::invXform
TF2SIMD_FORCE_INLINE Vector3 invXform(const Vector3 &inVec) const
Definition: melodic/include/tf2/LinearMath/Transform.h:223
tf2::Matrix3x3::getIdentity
static const Matrix3x3 & getIdentity()
tf2::Matrix3x3::getOpenGLSubMatrix
void getOpenGLSubMatrix(tf2Scalar *m) const
tf2::Matrix3x3::setRotation
void setRotation(const Quaternion &q)
tf2::Matrix3x3::transposeTimes
Matrix3x3 transposeTimes(const Matrix3x3 &m) const
Definition: Matrix3x3.h:577
tf2::TransformDoubleData::m_origin
Vector3DoubleData m_origin
Definition: melodic/include/tf2/LinearMath/Transform.h:262
tf2::Transform::operator()
TF2SIMD_FORCE_INLINE Vector3 operator()(const Vector3 &x) const
tf2::Matrix3x3::deSerialize
void deSerialize(const struct Matrix3x3Data &dataIn)
Definition: Matrix3x3.h:675
tf2::Transform::operator=
TF2SIMD_FORCE_INLINE Transform & operator=(const Transform &other)
tf2::Transform::getIdentity
static const Transform & getIdentity()
tf2::operator==
TF2SIMD_FORCE_INLINE bool operator==(const Matrix3x3 &m1, const Matrix3x3 &m2)
Equality operator between two matrices It will test all elements are equal.
Definition: Matrix3x3.h:640
tf2::Matrix3x3::deSerializeDouble
void deSerializeDouble(const struct Matrix3x3DoubleData &dataIn)
Definition: Matrix3x3.h:687
tf2::Transform::deSerialize
void deSerialize(const struct TransformData &dataIn)
tf2::Transform::setOrigin
TF2SIMD_FORCE_INLINE void setOrigin(const Vector3 &origin)
tf2::TransformDoubleData::m_basis
Matrix3x3DoubleData m_basis
Definition: melodic/include/tf2/LinearMath/Transform.h:261
Vector3
tf2::Transform::setBasis
TF2SIMD_FORCE_INLINE void setBasis(const Matrix3x3 &basis)
tf2::Transform::setFromOpenGLMatrix
void setFromOpenGLMatrix(const tf2Scalar *m)
tf2::Transform::getRotation
Quaternion getRotation() const
TF2SIMD_FORCE_INLINE
#define TF2SIMD_FORCE_INLINE
Definition: Scalar.h:130
tf2::Transform::inverseTimes
Transform inverseTimes(const Transform &t) const
Definition: melodic/include/tf2/LinearMath/Transform.h:230
geometry_msgs::Transform
::geometry_msgs::Transform_< std::allocator< void > > Transform
Definition: kinetic/include/geometry_msgs/Transform.h:55
tf2::Matrix3x3::setIdentity
void setIdentity()
sick_scan_xd_api_test.c
c
Definition: sick_scan_xd_api_test.py:445
tf2
geometry_msgs::Quaternion
::geometry_msgs::Quaternion_< std::allocator< void > > Quaternion
Definition: kinetic/include/geometry_msgs/Quaternion.h:63
tf2::Matrix3x3::setFromOpenGLSubMatrix
void setFromOpenGLSubMatrix(const tf2Scalar *m)
tf2::Matrix3x3::serializeFloat
void serializeFloat(struct Matrix3x3FloatData &dataOut) const
Definition: Matrix3x3.h:668
sick_scan_base.h
TransformData
#define TransformData
Definition: melodic/include/tf2/LinearMath/Transform.h:28
tf2::Transform::deSerializeDouble
void deSerializeDouble(const struct TransformDoubleData &dataIn)
tf2::Matrix3x3::serialize
void serialize(struct Matrix3x3Data &dataOut) const
Definition: Matrix3x3.h:662
tf2::Matrix3x3::transpose
Matrix3x3 transpose() const
Definition: Matrix3x3.h:549
tf2Scalar
double tf2Scalar
The tf2Scalar type abstracts floating point numbers, to easily switch between double and single float...
Definition: Scalar.h:160
tf2::TransformFloatData::m_basis
Matrix3x3FloatData m_basis
Definition: melodic/include/tf2/LinearMath/Transform.h:255
tf2::Transform::mult
TF2SIMD_FORCE_INLINE void mult(const Transform &t1, const Transform &t2)
t
geometry_msgs::TransformStamped t
tf2::Transform::getBasis
TF2SIMD_FORCE_INLINE Matrix3x3 & getBasis()
tf2::Transform::setIdentity
void setIdentity()


sick_scan_xd
Author(s): Michael Lehning , Jochen Sprickerhof , Martin Günther
autogenerated on Fri Oct 25 2024 02:47:12