state-observation 1.7.0
Loading...
Searching...
No Matches
rigid-body-kinematics.hpp
Go to the documentation of this file.
1
13#ifndef StATEOBSERVATIONRIGIDBODYKINEMATICS_H
14#define StATEOBSERVATIONRIGIDBODYKINEMATICS_H
15
16#include <Eigen/SVD>
17
18#include <state-observation/api.h>
22
23namespace stateObservation
24{
25namespace kine
26{
27inline void integrateKinematics(Vector3 & position, const Vector3 & velocity, double dt);
28
29inline void integrateKinematics(Vector3 & position, Vector3 & velocity, const Vector3 & acceleration, double dt);
30
31inline void integrateKinematics(Matrix3 & orientation, const Vector3 & rotationVelocity, double dt);
32
33inline void integrateKinematics(Matrix3 & orientation,
36 double dt);
37
38inline void integrateKinematics(Quaternion & orientation, const Vector3 & rotationVelocity, double dt);
39
40inline void integrateKinematics(Quaternion & orientation,
43 double dt);
44
48inline void integrateKinematics(Vector3 & position,
50 const Vector3 & acceleration,
51 Matrix3 & orientation,
54 double dt);
55
59inline void integrateKinematics(Vector3 & position,
61 const Vector3 & acceleration,
62 Quaternion & orientation,
65 double dt);
66
68inline void integrateKinematics(Vector3 & position,
69 const Vector3 & velocity,
70 Matrix3 & orientation,
72 double dt);
73
75inline void integrateKinematics(Vector3 & position,
76 const Vector3 & velocity,
77 Quaternion & orientation,
79 double dt);
80
84
87
90
93
96
99
102
104inline double scalarComponent(const Quaternion & q);
105
108
112
114
117inline Matrix3 rollPitchYawToRotationMatrix(double roll, double pitch, double yaw);
118
120
123inline Quaternion rollPitchYawToQuaternion(double roll, double pitch, double yaw);
124
126
129
131inline Matrix3 skewSymmetric(const Vector3 & v, Matrix3 & R);
132
134inline Matrix3 skewSymmetric(const Vector3 & v);
135
138
141
144
147
155
161inline bool isPureYaw(const Matrix3 & R);
162
170
180
191 const Matrix3 & R2,
192 const Vector3 & v = Vector3::UnitX()) noexcept(false);
193
201
209
217
225
234
239
247
252
257
262
267inline bool isRotationMatrix(const Matrix3 &, double precision = 2 * cst::epsilon1);
268
277
280
283
285
287
296
301
305
307
309
317
318template<rotationType = rotationVector>
320{
321};
322
323template<>
325{
328 static const Index pos = 0;
329 static const Index ori = 3;
330 static const Index linVel = 6;
331 static const Index angVel = 9;
332 static const Index linAcc = 12;
333 static const Index angAcc = 15;
334 static const Index size = 18;
335};
336
337template<>
339{
342 static const Index pos = 0;
343 static const Index ori = 3;
344 static const Index linVel = 7;
345 static const Index angVel = 10;
346 static const Index linAcc = 13;
347 static const Index angAcc = 16;
348 static const Index size = 19;
349};
350
352constexpr double quatNormTol = 1e-6;
353
355{
356public:
360 explicit Orientation(bool initialize = true);
361
363 explicit Orientation(const Vector3 & v);
364
365 explicit Orientation(const Quaternion & q);
366
367 explicit Orientation(const Matrix3 & m);
368
369 explicit Orientation(const AngleAxis & aa);
370
371 Orientation(const Quaternion & q, const Matrix3 & m);
372
373 Orientation(const double & roll, const double & pitch, const double & yaw);
374
376
377 inline Orientation & operator=(const Vector3 & v);
378
380
381 inline Orientation & operator=(const Matrix3 & m);
382
384
385 inline Orientation & setValue(const Quaternion & q, const Matrix3 & m);
386
387 inline Orientation & fromVector4(const Vector4 & v);
388
390
391 template<typename t = Quaternion>
393
395 inline const Matrix3 & toMatrix3() const;
396 inline const Quaternion & toQuaternion() const;
397
398 inline operator const Matrix3 &() const;
399 inline operator const Quaternion &() const;
400
401 inline Vector4 toVector4() const;
402
403 inline Vector3 toRotationVector() const;
404 inline Vector3 toRollPitchYaw() const;
405 inline AngleAxis toAngleAxis() const;
406
409
410 inline Orientation operator*(const Orientation & R2) const;
411
413 inline const Orientation & setToProductNoAlias(const Orientation & R1, const Orientation & R2);
414
415 inline Orientation inverse() const;
416
422
426
435
444
446 inline Vector3 operator*(const Vector3 & v) const;
447
450 inline bool isSet() const;
451
454 inline void reset();
455
458 inline bool isMatrixSet() const;
461 inline bool isQuaternionSet() const;
462
465 inline void setMatrix(bool b = true);
466 inline void setQuaternion(bool b = true);
467
469
478
480 inline void synchronize();
481
483 static inline Orientation zeroRotation();
484
487
489
490protected:
491 void check_() const;
492
493 inline const Matrix3 & quaternionToMatrix_() const;
494 inline const Quaternion & matrixToQuaternion_() const;
495
498};
499
500namespace internal
501{
502
503template<class T>
505{
506public:
508
517 const CheckedVector3 & linVel,
518 const CheckedVector3 & linAcc,
519 const Orientation & orientation,
520 const CheckedVector3 & angVel,
521 const CheckedVector3 & angAcc);
522 struct Flags
523 {
524 typedef unsigned char Byte;
525
526 static const Byte position = BOOST_BINARY(000001);
527 static const Byte orientation = BOOST_BINARY(000010);
528 static const Byte linVel = BOOST_BINARY(000100);
529 static const Byte angVel = BOOST_BINARY(001000);
530 static const Byte linAcc = BOOST_BINARY(010000);
531 static const Byte angAcc = BOOST_BINARY(100000);
532
533 static const Byte pose = position | orientation;
534 static const Byte vel = linVel | angVel;
535 static const Byte acc = linAcc | angAcc;
536 static const Byte all = pose | vel | acc;
537 };
538
541
544
547
548 inline void reset();
549
555 T & fromVector(const Vector & v, typename Flags::Byte = Flags::all);
556
560 template<typename t = Quaternion>
562
566 static inline T zeroKinematics(typename Flags::Byte = Flags::all);
567
572 inline Vector toVector(typename Flags::Byte) const;
573 inline Vector toVector() const;
574};
575} // namespace internal
576
577struct LocalKinematics;
578
584struct Kinematics : public internal::KinematicsInternal<Kinematics>
585{
586
588
594 Kinematics(const Vector & v, Flags::Byte = Flags::all);
595
600
609 const CheckedVector3 & linVel,
610 const CheckedVector3 & linAcc,
611 const Orientation & orientation,
612 const CheckedVector3 & angVel,
613 const CheckedVector3 & angAcc);
614
618 explicit inline Kinematics(const LocalKinematics & locK);
619
624
629 inline const Kinematics & integrate(double dt);
630
639 inline const Kinematics & update(const Kinematics & newValue, double dt, Flags::Byte = Flags::all);
640
645 inline Kinematics getInverse() const;
646
648 inline Kinematics operator*(const Kinematics &) const;
649
655
659
662
665
667
668protected:
670};
671
677struct LocalKinematics : public internal::KinematicsInternal<LocalKinematics>
678{
680
686 inline LocalKinematics(const Vector & v, Flags::Byte flags);
687
692
701 const CheckedVector3 & linVel,
702 const CheckedVector3 & linAcc,
703 const Orientation & orientation,
704 const CheckedVector3 & angVel,
705 const CheckedVector3 & angAcc);
706
710 explicit inline LocalKinematics(const Kinematics & kin);
711
715 inline LocalKinematics & operator=(const Kinematics & kine);
716
720 template<typename t = Quaternion>
721 LocalKinematics & setZero(Flags::Byte = Flags::all);
722
727 inline const LocalKinematics & integrate(double dt);
728
737 inline const LocalKinematics & update(const LocalKinematics & newValue, double dt, Flags::Byte = Flags::all);
738
744
747
753
757
761
766
767protected:
773};
774
775} // namespace kine
776} // namespace stateObservation
777
778inline std::ostream & operator<<(std::ostream & os, const stateObservation::kine::Kinematics & k);
779
780inline std::ostream & operator<<(std::ostream & os, const stateObservation::kine::LocalKinematics & k);
781
782#include <state-observation/tools/rigid-body-kinematics.hxx>
783
784#endif // StATEOBSERVATIONRIGIDBODYKINEMATICS_H
Definition rigid-body-kinematics.hpp:355
Orientation(bool initialize=true)
Orientation & operator=(const Vector3 &v)
Orientation(const Quaternion &q, const Matrix3 &m)
const Quaternion & matrixToQuaternion_() const
void reset()
resets the Orientation object.
bool isSet() const
checks that the orientation has been assigned a value.
CheckedQuaternion q_
Definition rigid-body-kinematics.hpp:496
CheckedMatrix3 & getMatrixRefUnsafe()
no checks are performed for these functions, use with caution
Orientation & setValue(const Quaternion &q, const Matrix3 &m)
Orientation(const AngleAxis &aa)
CheckedQuaternion & getQuaternionRefUnsafe()
get a reference to the quaternion representation of the orientation without calling the check functio...
const Matrix3 & toMatrix3() const
get a const reference on the matrix or the quaternion
Orientation & operator=(const Matrix3 &m)
Orientation(const Vector3 &v)
this is the rotation vector and NOT Euler angles
Vector3 operator*(const Vector3 &v) const
Rotate a vector.
void synchronize()
synchronizes the representations (quaternion and rotation matrix)
bool isMatrixSet() const
checks that the matrix representation of the orientation has been assigned a value.
const Orientation & integrate(Vector3 dt_x_omega)
Vector3 differentiateRightSide(Orientation R_k1) const
gives the log (rotation vector) of the "right-side" difference of orientation: log of (*this)....
const Matrix3 & quaternionToMatrix_() const
Vector3 differentiate(Orientation R_k1) const
gives the log (rotation vector) of the "left-side" difference of orientation: log of R_k1*(*this)....
static Orientation zeroRotation()
retruns a zero rotation
Orientation operator*(const Orientation &R2) const
Orientation(const double &roll, const double &pitch, const double &yaw)
Orientation & operator=(const Quaternion &q)
Orientation & operator=(const AngleAxis &aa)
Orientation(const Orientation &multiplier1, const Orientation &multiplier2)
Orientation & fromVector4(const Vector4 &v)
static Orientation randomRotation()
Returns a uniformly distributed random rotation.
const Quaternion & toQuaternion() const
const Orientation & setToProductNoAlias(const Orientation &R1, const Orientation &R2)
Noalias versions of the operator*.
bool isQuaternionSet() const
checks that the quaternion representation of the orientation has been assigned a value.
Orientation(const Quaternion &q)
CheckedMatrix3 m_
Definition rigid-body-kinematics.hpp:497
const Orientation & integrateRightSide(Vector3 dt_x_omega)
Definition rigid-body-kinematics.hpp:505
KinematicsInternal()
Definition rigid-body-kinematics.hpp:507
KinematicsInternal(const CheckedVector3 &position, const CheckedVector3 &linVel, const CheckedVector3 &linAcc, const Orientation &orientation, const CheckedVector3 &angVel, const CheckedVector3 &angAcc)
constructor of a Kinematics object given each variable independently.
T & fromVector(const Vector &v, typename Flags::Byte=Flags::all)
static T zeroKinematics(typename Flags::Byte=Flags::all)
returns an object corresponding to zero kinematics on the desired variables.
T & setZero(typename Flags::Byte=Flags::all)
CheckedVector3 angVel
Definition rigid-body-kinematics.hpp:543
CheckedVector3 angAcc
Definition rigid-body-kinematics.hpp:546
CheckedVector3 linVel
Definition rigid-body-kinematics.hpp:542
Vector toVector(typename Flags::Byte) const
CheckedVector3 position
Definition rigid-body-kinematics.hpp:539
CheckedVector3 linAcc
Definition rigid-body-kinematics.hpp:545
Orientation orientation
Definition rigid-body-kinematics.hpp:540
Definitions of types and some structures.
Gathers many kinds of algorithms.
Vector regulateRotationVector(const Vector3 &v)
bool isRotationMatrix(const Matrix3 &, double precision=2 *cst::epsilon1)
Checks if it is a rotation matrix (right-hand orthonormal) or not.
Matrix4 invertHomoMatrix(const Matrix4 &m)
Matrix3 mergeRoll1Pitch1WithYaw2(const Matrix3 &R1, const Matrix3 &R2, const Vector3 &v=Vector3::UnitX())
Merge the roll and pitch with the yaw from a rotation matrix (minimizes the deviation of the v vector...
Quaternion rotationVectorToQuaternion(const Vector3 &v)
Transforms the rotation vector into quaternion.
Matrix3 mergeTiltWithYaw(const Vector3 &Rtez, const Matrix3 &R2, const Vector3 &v=Vector3::UnitX()) noexcept(false)
Merge the roll and pitch from the tilt (R^T e_z) with the yaw from a rotation matrix (minimizes the d...
Vector3 rotationMatrixToRollPitchYaw(const Matrix3 &R, Vector3 &v)
Matrix4 vector6ToHomogeneousMatrix(const Vector6 &v)
transforms a 6d vector (position theta mu) into a homogeneous matrix
Vector3 derivateRotationFD(const Quaternion &q1, const Quaternion &q2, double dt)
derivates a quaternion using finite difference to get a angular velocity vector
Matrix3 derivateRtvMultiplicative(const Matrix3 &R, const Vector3 &v)
void derivateRotationMultiplicative(const Vector3 &deltaR, Matrix3 &dRdR, Matrix3 &dRddeltaR)
Quaternion zeroRotationQuaternion()
Get the Identity Quaternion.
double rotationMatrixToAngle(const Matrix3 &rotation, const Vector3 &axis, const Vector3 &v)
take 3x3 matrix represeting a rotation and gives the angle that vector v turns around the axis with t...
Vector6 derivatePoseThetaUFD(const Vector6 &v1, const Vector6 &v2, double dt)
Matrix3 orthogonalizeRotationMatrix(const Matrix3 &M)
Projects the Matrix to so(3)
Vector6 homogeneousMatrixToVector6(const Matrix4 &M)
transforms a homogeneous matrix into 6d vector (position theta mu)
AngleAxis rotationVectorToAngleAxis(const Vector3 &v)
Transforms the rotation vector into angle axis.
Quaternion rollPitchYawToQuaternion(double roll, double pitch, double yaw)
Vector3 getInvariantHorizontalVector(const Matrix3 &R)
Gets a vector that remains horizontal with this rotation. This vector is NOT normalized.
void integrateKinematics(Vector3 &position, const Vector3 &velocity, double dt)
Vector6 derivateHomogeneousMatrixFD(const Matrix4 &m1, const Matrix4 &m2, double dt)
bool isPureYaw(const Matrix3 &R)
checks if this matrix is a pure yaw matrix or not
Vector3 vectorComponent(const Quaternion &q)
vector part of the quaternion
Vector3 rotationMatrixToRotationVector(const Matrix3 &R)
Transforms the rotation matrix into rotation vector.
double randomAngle()
get a randomAngle between -pi and pu
Matrix3 rotationVectorToRotationMatrix(const Vector3 &v)
Transforms the rotation vector into rotation matrix.
rotationType
Definition rigid-body-kinematics.hpp:311
@ matrix
Definition rigid-body-kinematics.hpp:312
@ rotationVector
Definition rigid-body-kinematics.hpp:313
@ quaternion
Definition rigid-body-kinematics.hpp:314
@ angleaxis
Definition rigid-body-kinematics.hpp:315
Matrix3 mergeRoll1Pitch1WithYaw2AxisAgnostic(const Matrix3 &R1, const Matrix3 &R2)
Merge the roll and pitch with the yaw from a rotation matrix with optimal reference vector.
Matrix3 rollPitchYawToRotationMatrix(double roll, double pitch, double yaw)
Vector invertState(const Vector &state)
double scalarComponent(const Quaternion &q)
scalar component of a quaternion
constexpr double quatNormTol
relative tolereance to the square of quaternion norm.
Definition rigid-body-kinematics.hpp:352
Matrix3 mergeTiltWithYawAxisAgnostic(const Vector3 &Rtez, const Matrix3 &R2)
Merge the roll and pitch from the tilt (R^T e_z) with the yaw from a rotation matrix (minimizes the d...
Matrix3 twoVectorsToRotationMatrix(const Vector3 &v1, const Vector3 Rv1)
Builds the smallest angle matrix allowing to get from a NORMALIZED vector v1 to its imahe Rv1 This is...
Quaternion randomRotationQuaternion()
Get a uniformly random Quaternion.
Vector3 quaternionToRotationVector(const Quaternion &q)
Tranbsform a quaternion into rotation vector.
void fixedPointRotationToTranslation(const Matrix3 &R, const Vector3 &rotationVelocity, const Vector3 &rotationAcceleration, const Vector3 &fixedPoint, Vector3 &outputTranslation, Vector3 &outputLinearVelocity, Vector3 &outputLinearAcceleration)
transforms a rotation into translation given a constraint of a fixed point
Matrix3 skewSymmetric2(const Vector3 &v, Matrix3 &R)
transform a 3d vector into a squared skew symmetric 3x3 matrix
IndexedVectorArray reconstructStateTrajectory(const IndexedVectorArray &positionOrientation, double dt)
Vector3 getInvariantOrthogonalVector(const Matrix3 &Rhat, const Vector3 &Rtez)
Gets a vector that is orthogonal to and such that is orthogonal to the tilt . This vector is NOT n...
double rotationMatrixToYawAxisAgnostic(const Matrix3 &rotation)
take 3x3 matrix represeting a rotation and gives a corresponding angle around upward vertical axis
Matrix3 skewSymmetric(const Vector3 &v, Matrix3 &R)
transform a 3d vector into a skew symmetric 3x3 matrix
double rotationMatrixToYaw(const Matrix3 &rotation, const Vector2 &v)
take 3x3 matrix represeting a rotation and gives the angle that vector v turns around the upward vert...
Definition bidim-elastic-inv-pendulum-dyn-sys.hpp:21
Eigen::Matrix4d Matrix4
4x4 Scalar Matrix
Definition definitions.hpp:115
Eigen::AngleAxis< double > AngleAxis
Euler Axis/Angle representation of orientation.
Definition definitions.hpp:133
Eigen::Quaterniond Quaternion
Quaternion.
Definition definitions.hpp:127
Eigen::Vector3d Vector3
3D vector
Definition definitions.hpp:85
Eigen::Vector4d Vector4
4D vector
Definition definitions.hpp:91
Eigen::Matrix3d Matrix3
3x3 Scalar Matrix
Definition definitions.hpp:109
Eigen::MatrixXd Matrix
Dynamic sized Matrix.
Definition definitions.hpp:100
Eigen::Matrix< double, 6, 1 > Vector6
6D vector
Definition definitions.hpp:97
Eigen::Index Index
Definition definitions.hpp:138
Eigen::Matrix< double, 2, 1 > Vector2
2d Vector
Definition definitions.hpp:82
Eigen::VectorXd Vector
Dynamic sized scalar vector.
Definition definitions.hpp:76
std::ostream & operator<<(std::ostream &os, const stateObservation::kine::Kinematics &k)
Class facilitating the manipulation of the kinematics of a frame within another and the associated op...
Definition rigid-body-kinematics.hpp:585
Kinematics(const Kinematics &multiplier1, const Kinematics &multiplier2)
constructor of a Kinematics object resulting from the composition of two others.
const Kinematics & update(const Kinematics &newValue, double dt, Flags::Byte=Flags::all)
updates the current kinematics (k) with the new ones (k+1).
Kinematics & setToDiffNoAlias(const Kinematics &multiplier1, const Kinematics &multiplier2)
Vector3 tempVec_
Definition rigid-body-kinematics.hpp:669
Kinematics & setToDiffNoAliasLinPart(const Kinematics &multiplier1, const Kinematics &multiplier2)
Linear part of the setToDiffNoAlias(const Kinematics &, const Kinematics &) function.
Kinematics()
Definition rigid-body-kinematics.hpp:587
const Kinematics & integrate(double dt)
integrates the current kinematics over the timestep dt.
Kinematics(const Vector &v, Flags::Byte=Flags::all)
Kinematics & operator=(const LocalKinematics &locK)
fills the Kinematics object given its equivalent in the local frame.
Kinematics(const LocalKinematics &locK)
constructor of a Kinematics object given its equivalent in the local frame.
Kinematics & setToDiffNoAliasAngPart(const Kinematics &multiplier1, const Kinematics &multiplier2)
Angular part of the setToDiffNoAlias(const Kinematics &, const Kinematics &) function.
Kinematics getInverse() const
returns the inverse of the current kinematics.
Kinematics & setToProductNoAlias(const Kinematics &operand1, const Kinematics &operand2)
computes the composition of two Kinematics object.
Kinematics(const CheckedVector3 &position, const CheckedVector3 &linVel, const CheckedVector3 &linAcc, const Orientation &orientation, const CheckedVector3 &angVel, const CheckedVector3 &angAcc)
constructor of a Kinematics object given each variable independently.
Kinematics operator*(const Kinematics &) const
composition of transformation
Class facilitating the manipulation of the local kinematics of a frame within another and the associa...
Definition rigid-body-kinematics.hpp:678
Vector3 tempVec_
Definition rigid-body-kinematics.hpp:768
LocalKinematics & setToProductNoAlias(const LocalKinematics &operand1, const LocalKinematics &operand2)
computes the composition of two LocalKinematics object.
Vector3 tempVec_5
Definition rigid-body-kinematics.hpp:772
LocalKinematics & setToDiffNoAliasLinPart(const LocalKinematics &multiplier1, const LocalKinematics &multiplier2)
Linear part of the setToDiffNoAlias(const LocalKinematics &, const LocalKinematics &) function.
LocalKinematics & operator=(const Kinematics &kine)
fills the LocalKinematics object given its equivalent in the global frame.
LocalKinematics getInverse() const
returns the inverse of the current local kinematics.
LocalKinematics operator*(const LocalKinematics &) const
composition of transformation
Vector3 tempVec_2
Definition rigid-body-kinematics.hpp:769
LocalKinematics()
Definition rigid-body-kinematics.hpp:679
LocalKinematics & setToDiffNoAliasAngPart(const LocalKinematics &multiplier1, const LocalKinematics &multiplier2)
Angular part of the setToDiffNoAlias(const LocalKinematics &, const LocalKinematics &) function.
LocalKinematics & setToDiffNoAlias(const LocalKinematics &multiplier1, const LocalKinematics &multiplier2)
LocalKinematics(const Vector &v, Flags::Byte flags)
Vector3 tempVec_4
Definition rigid-body-kinematics.hpp:771
Vector3 tempVec_3
Definition rigid-body-kinematics.hpp:770
const LocalKinematics & integrate(double dt)
integrates the current local kinematics over the timestep dt.
LocalKinematics(const CheckedVector3 &position, const CheckedVector3 &linVel, const CheckedVector3 &linAcc, const Orientation &orientation, const CheckedVector3 &angVel, const CheckedVector3 &angAcc)
constructor of a Kinematics object given each variable independently.
LocalKinematics(const Kinematics &kin)
constructor of a LocalKinematics object given its equivalent in the global frame.
LocalKinematics & setZero(Flags::Byte=Flags::all)
LocalKinematics(const LocalKinematics &multiplier1, const LocalKinematics &multiplier2)
constructor of a LocalKinematics object resulting from the composition of two others.
const LocalKinematics & update(const LocalKinematics &newValue, double dt, Flags::Byte=Flags::all)
updates the current local kinematics (k) with the new ones (k+1).
Definition rigid-body-kinematics.hpp:320
Definition rigid-body-kinematics.hpp:523
unsigned char Byte
Definition rigid-body-kinematics.hpp:524
static const Byte vel
Definition rigid-body-kinematics.hpp:534
static const Byte all
Definition rigid-body-kinematics.hpp:536
static const Byte pose
Definition rigid-body-kinematics.hpp:533
static const Byte orientation
Definition rigid-body-kinematics.hpp:527
static const Byte linVel
Definition rigid-body-kinematics.hpp:528
static const Byte linAcc
Definition rigid-body-kinematics.hpp:530
static const Byte angAcc
Definition rigid-body-kinematics.hpp:531
static const Byte position
Definition rigid-body-kinematics.hpp:526
static const Byte acc
Definition rigid-body-kinematics.hpp:535
static const Byte angVel
Definition rigid-body-kinematics.hpp:529