Biorbd
Quaternion.h
1 #ifndef BIORBD_UTILS_QUATERNION_H
2 #define BIORBD_UTILS_QUATERNION_H
3 
4 #include <memory>
5 #include "Utils/Vector3d.h"
6 #include "Utils/Scalar.h"
7 
8 #include "biorbdConfig.h"
9 namespace biorbd {
10 namespace utils {
11 class Vector3d;
12 class Vector;
13 class RotoTrans;
14 class Rotation;
15 class String;
16 
23 #ifdef SWIG
24 class BIORBD_API Quaternion
25 #else
26 class BIORBD_API Quaternion : public RigidBodyDynamics::Math::Vector4d
27 #endif
28 {
29 public:
34  Quaternion (
35  double kStabilizer = 1);
36 
41  Quaternion(
42  const biorbd::utils::Quaternion &other);
43 
49  Quaternion (
50  const RigidBodyDynamics::Math::Vector4d &vec4,
51  double kStabilizer = 1);
52 
61  Quaternion (
62  const biorbd::utils::Scalar& w,
63  const biorbd::utils::Scalar& x,
64  const biorbd::utils::Scalar& y,
65  const biorbd::utils::Scalar& z,
66  double kStabilizer = 1);
67 
74  Quaternion (
75  const biorbd::utils::Scalar& w,
76  const biorbd::utils::Vector3d &vec3,
77  double kStabilizer = 1);
78 
83  biorbd::utils::Scalar w() const;
84 
89  biorbd::utils::Scalar x() const;
90 
95  biorbd::utils::Scalar y() const;
96 
101  biorbd::utils::Scalar z() const;
102 
107  void setKStab(double newKStab);
108 
116  double kStab() const;
117 
118 #ifndef SWIG
119 
120 #ifdef BIORBD_USE_EIGEN3_MATH
121 
126  template<typename OtherDerived>
127  biorbd::utils::Quaternion& operator=(
128  const Eigen::MatrixBase <OtherDerived>& other){
129  this->Eigen::Vector4d::operator=(other);
130  // I don't understand why the next line doesn't SegFault...
131  this->m_Kstab = static_cast<biorbd::utils::Quaternion>(other).m_Kstab;
132  return *this;
133  }
134 
135 #endif
136 
137 #endif
138 
143  biorbd::utils::Quaternion operator*(
144  const biorbd::utils::Quaternion& other) const;
145 
150  biorbd::utils::Quaternion operator*(
151  const biorbd::utils::Scalar& scalar) const;
152 
157  biorbd::utils::Quaternion operator*(
158  float scalar) const;
159 
160 #ifdef BIORBD_USE_CASADI_MATH
161  biorbd::utils::Quaternion operator*(
166  double scalar) const;
167 #endif
168 
173  biorbd::utils::Quaternion operator+(
174  const biorbd::utils::Quaternion& other) const;
175 
180  biorbd::utils::Quaternion operator-(
181  const biorbd::utils::Quaternion& other) const;
182 
191  static biorbd::utils::Quaternion fromGLRotate (
192  const biorbd::utils::Scalar& angle,
193  const biorbd::utils::Scalar& x,
194  const biorbd::utils::Scalar& y,
195  const biorbd::utils::Scalar& z,
196  double kStab = 1);
197 
204  static biorbd::utils::Quaternion fromAxisAngle (
205  const biorbd::utils::Scalar& angle,
206  const biorbd::utils::Vector3d &axis,
207  double kStab = 1);
208 
214  static biorbd::utils::Quaternion fromMatrix (
215  const biorbd::utils::RotoTrans& rt,
216  double kStab = 1);
217 
223  static biorbd::utils::Quaternion fromMatrix (
224  const biorbd::utils::Rotation &mat,
225  double kStab = 1);
226 
232  static biorbd::utils::Quaternion fromZYXAngles (
233  const biorbd::utils::Vector3d &zyx_angles,
234  double kStab = 1);
235 
241  static biorbd::utils::Quaternion fromYXZAngles (
242  const biorbd::utils::Vector3d &yxz_angles,
243  double kStab = 1);
244 
250  static biorbd::utils::Quaternion fromXYZAngles (
251  const biorbd::utils::Vector3d &xyz_angles,
252  double kStab = 1);
253 
264  biorbd::utils::Rotation toMatrix(
265  bool skipAsserts = false) const;
266 
267 #ifndef BIORBD_USE_CASADI_MATH
274  double alpha,
275  const Quaternion &quat) const;
276 #endif
277 
282  biorbd::utils::Quaternion conjugate() const;
283 
290  biorbd::utils::Quaternion timeStep (
291  const biorbd::utils::Vector3d &omega,
292  double dt);
293 
299  biorbd::utils::Vector3d rotate (
300  const biorbd::utils::Vector3d &vec) const;
301 
310  biorbd::utils::Quaternion omegaToQDot(
311  const biorbd::utils::Vector3d& omega) const;
312 
325  biorbd::utils::Vector3d eulerDotToOmega(
326  const biorbd::utils::Vector3d &eulerDot,
327  const biorbd::utils::Vector3d &euler,
328  const biorbd::utils::String& seq);
329 
334  void derivate(
335  const biorbd::utils::Vector &w);
336 
340  void normalize();
341 
342 protected:
343  double m_Kstab;
344 
345 };
346 
347 }}
348 
349 #endif // BIORBD_UTILS_QUATERNION_H
biorbd::utils::Quaternion
Definition: Quaternion.h:28
biorbd::utils::Vector
Wrapper of the Eigen VectorXd.
Definition: Vector.h:20
biorbd::utils::Vector3d
Wrapper around Eigen Vector3d and attach it to a parent.
Definition: Vector3d.h:24
biorbd::utils::RotoTrans
Homogenous matrix to describe translations and rotations simultaneously.
Definition: RotoTrans.h:34
biorbd::utils::Quaternion::m_Kstab
double m_Kstab
Stabilization factor for the derivation.
Definition: Quaternion.h:343
biorbd::utils::Rotation
Rotation matrix.
Definition: Rotation.h:34
biorbd::utils::String
Wrapper around the std::string class with augmented functionality.
Definition: String.h:17