16 #ifndef TF_MATRIX3x3_H 17 #define TF_MATRIX3x3_H 28 #define Matrix3x3Data Matrix3x3DoubleData 65 m_el[0] = other.
m_el[0];
66 m_el[1] = other.
m_el[1];
67 m_el[2] = other.
m_el[2];
74 m_el[0] = other.
m_el[0];
75 m_el[1] = other.
m_el[1];
76 m_el[2] = other.
m_el[2];
85 return Vector3(m_el[0][i],m_el[1][i],m_el[2][i]);
122 m_el[0].setValue(m[0],m[4],m[8]);
123 m_el[1].setValue(m[1],m[5],m[9]);
124 m_el[2].setValue(m[2],m[6],m[10]);
141 m_el[0].setValue(xx,xy,xz);
142 m_el[1].setValue(yx,yy,yz);
143 m_el[2].setValue(zx,zy,zz);
153 tfScalar xs = q.x() * s, ys = q.y() * s, zs = q.z() * s;
154 tfScalar wx = q.w() * xs, wy = q.w() * ys, wz = q.w() * zs;
155 tfScalar xx = q.x() * xs, xy = q.x() * ys, xz = q.x() * zs;
156 tfScalar yy = q.y() * ys, yz = q.y() * zs, zz = q.z() * zs;
158 xy + wz,
tfScalar(1.0) - (xx + zz), yz - wx,
159 xz - wy, yz + wx,
tfScalar(1.0) - (xx + yy));
194 setValue(cj * ch, sj * sc - cs, sj * cc + ss,
195 cj * sh, sj * ss + cc, sj * cs - sc,
196 -sj, cj * si, cj * ci);
222 return identityMatrix;
247 tfScalar trace = m_el[0].x() + m_el[1].y() + m_el[2].z();
256 temp[0]=((m_el[2].y() - m_el[1].z()) * s);
257 temp[1]=((m_el[0].z() - m_el[2].x()) * s);
258 temp[2]=((m_el[1].x() - m_el[0].y()) * s);
262 int i = m_el[0].x() < m_el[1].y() ?
263 (m_el[1].y() < m_el[2].z() ? 2 : 1) :
264 (m_el[0].x() < m_el[2].z() ? 2 : 0);
272 temp[3] = (m_el[k][j] - m_el[j][k]) * s;
273 temp[j] = (m_el[j][i] + m_el[i][j]) * s;
274 temp[k] = (m_el[k][i] + m_el[i][k]) * s;
276 q.setValue(temp[0],temp[1],temp[2],temp[3]);
309 if (
tfFabs(m_el[2].x()) >= 1)
320 euler_out.roll = delta;
321 euler_out2.roll = delta;
328 euler_out.roll = delta;
329 euler_out2.roll = delta;
334 euler_out.pitch = -
tfAsin(m_el[2].x());
335 euler_out2.pitch =
TFSIMD_PI - euler_out.pitch;
337 euler_out.roll =
tfAtan2(m_el[2].y()/
tfCos(euler_out.pitch),
338 m_el[2].z()/
tfCos(euler_out.pitch));
339 euler_out2.roll =
tfAtan2(m_el[2].y()/
tfCos(euler_out2.pitch),
340 m_el[2].z()/
tfCos(euler_out2.pitch));
342 euler_out.yaw =
tfAtan2(m_el[1].x()/
tfCos(euler_out.pitch),
343 m_el[0].x()/
tfCos(euler_out.pitch));
344 euler_out2.yaw =
tfAtan2(m_el[1].x()/
tfCos(euler_out2.pitch),
345 m_el[0].x()/
tfCos(euler_out2.pitch));
348 if (solution_number == 1)
351 pitch = euler_out.pitch;
352 roll = euler_out.roll;
356 yaw = euler_out2.yaw;
357 pitch = euler_out2.pitch;
358 roll = euler_out2.roll;
377 return Matrix3x3(m_el[0].x() * s.x(), m_el[0].y() * s.y(), m_el[0].z() * s.z(),
378 m_el[1].x() * s.x(), m_el[1].y() * s.y(), m_el[1].z() * s.z(),
379 m_el[2].x() * s.x(), m_el[2].y() * s.y(), m_el[2].z() * s.z());
398 return m_el[0].x() * v.x() + m_el[1].x() * v.y() + m_el[2].x() * v.z();
402 return m_el[0].y() * v.x() + m_el[1].y() * v.y() + m_el[2].y() * v.z();
406 return m_el[0].z() * v.x() + m_el[1].z() * v.y() + m_el[2].z() * v.z();
457 tfScalar theta = (m_el[q][q] - m_el[p][p]) / (2 * mpq);
463 t = (theta >= 0) ? 1 / (theta +
tfSqrt(1 + theta2))
464 : 1 / (theta -
tfSqrt(1 + theta2));
465 cos = 1 /
tfSqrt(1 + t * t);
471 t = 1 / (theta * (2 +
tfScalar(0.5) / theta2));
477 m_el[p][q] = m_el[q][p] = 0;
478 m_el[p][p] -= t * mpq;
479 m_el[q][q] += t * mpq;
482 m_el[r][p] = m_el[p][r] = cos * mrp - sin * mrq;
483 m_el[r][q] = m_el[q][r] = cos * mrq + sin * mrp;
486 for (
int i = 0; i < 3; i++)
491 row[p] = cos * mrp - sin * mrq;
492 row[q] = cos * mrq + sin * mrp;
509 return m_el[r1][c1] * m_el[r2][c2] - m_el[r1][c2] * m_el[r2][c1];
537 return tfTriple((*
this)[0], (*
this)[1], (*
this)[2]);
561 return Matrix3x3(
cofac(1, 1, 2, 2),
cofac(0, 2, 2, 1),
cofac(0, 1, 1, 2),
562 cofac(1, 2, 2, 0),
cofac(0, 0, 2, 2),
cofac(0, 2, 1, 0),
563 cofac(1, 0, 2, 1),
cofac(0, 1, 2, 0),
cofac(0, 0, 1, 1));
569 Vector3 co(
cofac(1, 1, 2, 2),
cofac(1, 2, 2, 0),
cofac(1, 0, 2, 1));
574 co.y() * s,
cofac(0, 0, 2, 2) * s,
cofac(0, 2, 1, 0) * s,
575 co.z() * s,
cofac(0, 1, 2, 0) * s,
cofac(0, 0, 1, 1) * s);
582 m_el[0].x() * m[0].x() +
m_el[1].x() * m[1].x() +
m_el[2].x() * m[2].x(),
583 m_el[0].x() * m[0].y() +
m_el[1].x() * m[1].y() +
m_el[2].x() * m[2].y(),
584 m_el[0].x() * m[0].z() +
m_el[1].x() * m[1].z() +
m_el[2].x() * m[2].z(),
585 m_el[0].y() * m[0].x() +
m_el[1].y() * m[1].x() +
m_el[2].y() * m[2].x(),
586 m_el[0].y() * m[0].y() +
m_el[1].y() * m[1].y() +
m_el[2].y() * m[2].y(),
587 m_el[0].y() * m[0].z() +
m_el[1].y() * m[1].z() +
m_el[2].y() * m[2].z(),
588 m_el[0].z() * m[0].x() +
m_el[1].z() * m[1].x() +
m_el[2].z() * m[2].x(),
589 m_el[0].z() * m[0].y() +
m_el[1].z() * m[1].y() +
m_el[2].z() * m[2].y(),
590 m_el[0].z() * m[0].z() +
m_el[1].z() * m[1].z() +
m_el[2].z() * m[2].z());
644 return ( m1[0][0] == m2[0][0] && m1[1][0] == m2[1][0] && m1[2][0] == m2[2][0] &&
645 m1[0][1] == m2[0][1] && m1[1][1] == m2[1][1] && m1[2][1] == m2[2][1] &&
646 m1[0][2] == m2[0][2] && m1[1][2] == m2[1][2] && m1[2][2] == m2[2][2] );
666 for (
int i=0;i<3;i++)
672 for (
int i=0;i<3;i++)
679 for (
int i=0;i<3;i++)
685 for (
int i=0;i<3;i++)
691 for (
int i=0;i<3;i++)
697 #endif //TF_MATRIX3x3_H TFSIMD_FORCE_INLINE Vector3 getColumn(int i) const
Get a column of the matrix as a vector.
Matrix3x3 transposeTimes(const Matrix3x3 &m) const
TFSIMD_FORCE_INLINE Vector3 operator*(const Matrix3x3 &m, const Vector3 &v)
void getRotation(Quaternion &q) const
Get the matrix represented as a quaternion.
Matrix3x3(const tfScalar &xx, const tfScalar &xy, const tfScalar &xz, const tfScalar &yx, const tfScalar &yy, const tfScalar &yz, const tfScalar &zx, const tfScalar &zy, const tfScalar &zz)
Constructor with row major formatting.
Matrix3x3 absolute() const
Return the matrix with all values non negative.
ROS_DEPRECATED void setEulerZYX(const tfScalar &yaw, const tfScalar &pitch, const tfScalar &roll)
Set the matrix from euler angles using YPR around ZYX respectively.
The Quaternion implements quaternion to perform linear algebra rotations in combination with Matrix3x...
Matrix3x3 scaled(const Vector3 &s) const
Create a scaled copy of the matrix.
void deSerializeDouble(const struct Matrix3x3DoubleData &dataIn)
double tfScalar
The tfScalar type abstracts floating point numbers, to easily switch between double and single floati...
void diagonalize(Matrix3x3 &rot, tfScalar threshold, int maxSteps)
diagonalizes this matrix by the Jacobi method.
TFSIMD_FORCE_INLINE bool operator==(const Matrix3x3 &m1, const Matrix3x3 &m2)
Equality operator between two matrices It will test all elements are equal.
Matrix3x3 adjoint() const
Return the adjoint of the matrix.
Matrix3x3 inverse() const
Return the inverse of the matrix.
Matrix3x3 transpose() const
Return the transpose of the matrix.
void setEulerYPR(tfScalar eulerZ, tfScalar eulerY, tfScalar eulerX)
Set the matrix from euler angles YPR around ZYX axes.
TFSIMD_FORCE_INLINE tfScalar tfTriple(const Vector3 &v1, const Vector3 &v2, const Vector3 &v3)
void serialize(struct Matrix3x3Data &dataOut) const
TFSIMD_FORCE_INLINE Matrix3x3 & operator=(const Matrix3x3 &other)
Assignment Operator.
void setValue(const tfScalar &xx, const tfScalar &xy, const tfScalar &xz, const tfScalar &yx, const tfScalar &yy, const tfScalar &yz, const tfScalar &zx, const tfScalar &zy, const tfScalar &zz)
Set the values of the matrix explicitly (row major)
void getEulerYPR(tfScalar &yaw, tfScalar &pitch, tfScalar &roll, unsigned int solution_number=1) const
Get the matrix represented as euler angles around YXZ, roundtrip with setEulerYPR.
The Matrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with Q...
tfScalar determinant() const
Return the determinant of the matrix.
TFSIMD_FORCE_INLINE tfScalar tdotz(const Vector3 &v) const
void setRotation(const Quaternion &q)
Set the matrix from a quaternion.
void setIdentity()
Set the matrix to the identity.
tfScalar cofac(int r1, int c1, int r2, int c2) const
Calculate the matrix cofactor.
TFSIMD_FORCE_INLINE tfScalar tfCos(tfScalar x)
void serializeFloat(struct Matrix3x3FloatData &dataOut) const
TFSIMD_FORCE_INLINE Vector3 & operator[](int i)
Get a mutable reference to a row of the matrix as a vector.
Matrix3x3()
No initializaion constructor.
void setRPY(tfScalar roll, tfScalar pitch, tfScalar yaw)
Set the matrix using RPY about XYZ fixed axes.
TFSIMD_FORCE_INLINE tfScalar tdotx(const Vector3 &v) const
Matrix3x3 & operator*=(const Matrix3x3 &m)
Multiply by the target matrix on the right.
Matrix3x3 timesTranspose(const Matrix3x3 &m) const
#define TFSIMD_FORCE_INLINE
tfScalar length2() const
Return the length squared of the quaternion.
TFSIMD_FORCE_INLINE tfScalar tfAtan2(tfScalar x, tfScalar y)
void deSerializeFloat(const struct Matrix3x3FloatData &dataIn)
Vector3DoubleData m_el[3]
TFSIMD_FORCE_INLINE tfScalar dot(const Quaternion &q1, const Quaternion &q2)
Calculate the dot product between two quaternions.
ROS_DEPRECATED void getEulerZYX(tfScalar &yaw, tfScalar &pitch, tfScalar &roll, unsigned int solution_number=1) const
Get the matrix represented as euler angles around ZYX.
TFSIMD_FORCE_INLINE tfScalar tfSqrt(tfScalar x)
TFSIMD_FORCE_INLINE const Vector3 & operator[](int i) const
Get a const reference to a row of the matrix as a vector.
TFSIMD_FORCE_INLINE tfScalar tdoty(const Vector3 &v) const
void getOpenGLSubMatrix(tfScalar *m) const
Fill the values of the matrix into a 9 element array.
TFSIMD_FORCE_INLINE const Vector3 & getRow(int i) const
Get a row of the matrix as a vector.
TFSIMD_FORCE_INLINE tfScalar tfAsin(tfScalar x)
void setFromOpenGLSubMatrix(const tfScalar *m)
Set from a carray of tfScalars.
void getRPY(tfScalar &roll, tfScalar &pitch, tfScalar &yaw, unsigned int solution_number=1) const
Get the matrix represented as roll pitch and yaw about fixed axes XYZ.
Vector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-byte...
TFSIMD_FORCE_INLINE tfScalar tfSin(tfScalar x)
TFSIMD_FORCE_INLINE tfScalar tfFabs(tfScalar x)
void deSerialize(const struct Matrix3x3Data &dataIn)
Vector3 m_el[3]
Data storage for the matrix, each vector is a row of the matrix.
TFSIMD_FORCE_INLINE Matrix3x3(const Matrix3x3 &other)
Copy constructor.
static const Matrix3x3 & getIdentity()
Matrix3x3(const Quaternion &q)
Constructor from Quaternion.