Formula Student Autonomous Systems
The code for the main driverless system
Loading...
Searching...
No Matches
quaternion.cpp
Go to the documentation of this file.
1#include "quaternion.hpp"
2
4{
5 double ret;
6 ret = std::sqrt(a.w * a.w + a.x * a.x + a.y * a.y + a.z * a.z);
7 return ret;
8}
9
11{
12 quaternion ret;
13 ret.w = a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z;
14 ret.x = a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y;
15 ret.y = a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x;
16 ret.z = a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w;
17 return ret;
18}
19
21{
22 quaternion ret;
23 ret.w = a.w;
24 ret.x = -a.x;
25 ret.y = -a.y;
26 ret.z = -a.z;
27 return ret;
28}
29
31{
32 double norm = quatNorm(a);
33 quaternion ret;
34 ret.w = a.w / norm;
35 ret.x = a.x / norm;
36 ret.y = a.y / norm;
37 ret.z = a.z / norm;
38 return ret;
39}
40
42{
43 quaternion ret;
44 ret = quatMult(a, quatInversion(b));
45 return ret;
46}
47
49{
50 double x = a.x();
51 double y = a.y();
52 double z = a.z();
53
54 quaternion quatX;
55 quatX.w = std::cos(x / 2);
56 quatX.x = std::sin(x / 2);
57 quatX.y = 0.0;
58 quatX.z = 0.0;
59
60 quaternion quatY;
61 quatY.w = std::cos(y / 2);
62 quatY.x = 0.0;
63 quatY.y = std::sin(y / 2);
64 quatY.z = 0.0;
65
66 quaternion quatZ;
67 quatX.w = std::cos(z / 2);
68 quatX.x = 0.0;
69 quatX.y = 0.0;
70 quatX.z = std::sin(z / 2);
71
72 quaternion ret;
73 ret.w = 1.0;
74 ret.x = 0.0;
75 ret.y = 0.0;
76 ret.z = 0.0;
77
78 ret = quatMult(quatX, ret);
79 ret = quatMult(quatY, ret);
80 ret = quatMult(quatZ, ret);
81 return ret;
82}
83
85{
86 Eigen::Quaterniond q(mat);
87 quaternion ret;
88 ret.w = q.w();
89 ret.x = q.x();
90 ret.y = q.y();
91 ret.z = q.z();
92 return ret;
93}
94
96{
97 Eigen::Quaterniond q;
98 q.w() = a.w;
99 q.x() = a.x;
100 q.y() = a.y;
101 q.z() = a.z;
102 Eigen::Matrix3d ret = q.toRotationMatrix();
103 return ret;
104}
105
107{
108 double sinr_cosp = 2 * (a.w * a.x + a.y * a.z);
109 double cosr_cosp = 1 - 2 * (a.x * a.x + a.y * a.y);
110 double roll = std::atan2(sinr_cosp, cosr_cosp);
111
112 double sinp = 2 * (a.w * a.y - a.z * a.x);
113 double pitch = std::asin(sinp);
114
115 double siny_cosp = 2 * (a.w * a.z + a.x * a.y);
116 double cosy_cosp = 1 - 2 * (a.y * a.y + a.z * a.z);
117 double yaw = std::atan2(siny_cosp, cosy_cosp);
118
119 Eigen::Vector3d ret(roll, pitch, yaw);
120 return ret;
121}
Eigen::Matrix3d rotationMatrixFromQuaternion(quaternion a)
quaternion quatMult(quaternion a, quaternion b)
quaternion quatInversion(quaternion a)
Eigen::Vector3d eulerAnglesFromQuat(quaternion a)
quaternion quatNormalize(quaternion a)
double quatNorm(quaternion a)
Definition quaternion.cpp:3
quaternion quatFromEulerAngles(Eigen::Vector3d a)
quaternion getRelativeQuat(quaternion a, quaternion b)
quaternion quatFromRotationMatrix(Eigen::Matrix3d mat)