My Project
Loading...
Searching...
No Matches
attitude-utils.hpp
1#ifndef ATTITUDE_UTILS_H
2#define ATTITUDE_UTILS_H
3
4#include <memory>
5
6#include "style/decimal.hpp"
7
8namespace found {
9
10// At first, I wanted to have two separate Attitude classes, one storing Euler angles and converting
11// to Quaterinon, and another storing as Quaternion and converting to Euler. But abstract classes
12// make everything more annoying, because you need vectors of pointers...ugh!
13
18struct Vec2 {
20 const decimal x;
22 const decimal y;
23
24 // Magnitude
25
26 decimal Magnitude() const;
27 decimal MagnitudeSq() const;
28
29 // Unit Vector of this
30
31 Vec2 Normalize() const;
32
33 // Operations
34
35 decimal operator*(const Vec2 &) const;
36 Vec2 operator*(const decimal &) const;
37 Vec2 operator-(const Vec2 &) const;
38 Vec2 operator+(const Vec2 &) const;
39};
40
41class Mat3; // define above so we can use in Vec3 class
42
47class Vec3 {
48 public:
50 decimal x;
52 decimal y;
54 decimal z;
55
56 // TODO: Implement this constructor
63 Vec3(decimal de, decimal ra);
64
72 Vec3(decimal x, decimal y, decimal z) : x(x), y(y), z(z) {}
73
77 Vec3() {}
78
79 // Magnitude
80
81 decimal Magnitude() const;
82 decimal MagnitudeSq() const;
83
84 // Unit Vector
85
86 Vec3 Normalize() const;
87
88 // TODO: Accessor Methods
89
99 decimal getRightAscension() const;
109 decimal getDeclination() const;
110
111 // Operations
112
113 decimal operator*(const Vec3 &) const;
114 Vec3 operator*(const decimal &) const;
115 Vec3 operator*(const Mat3 &) const;
116 Vec3 operator-(const Vec3 &) const;
117 Vec3 CrossProduct(const Vec3 &) const;
118 Mat3 OuterProduct(const Vec3 &) const;
119};
120
125class Mat3 {
126 public:
128 decimal x[9];
129
130 // Accessor
131
132 decimal At(int i, int j) const;
133 Vec3 Column(int) const;
134 Vec3 Row(int) const;
135 decimal Trace() const;
136 decimal Det() const;
137
138 // Operations
139
140 Mat3 operator+(const Mat3 &) const;
141 Mat3 operator*(const Mat3 &) const;
142 Vec3 operator*(const Vec3 &) const;
143 Mat3 operator*(const decimal &) const;
144
145 // Transformations
146
147 Mat3 Transpose() const;
148 Mat3 Inverse() const;
149};
150
151// Identity Matrix
152
153extern const Mat3 kIdentityMat3;
154
155// Buffer-Vector Functions
156
157int64_t SerializeLengthVec3();
158void SerializeVec3(const Vec3 &, unsigned char *);
159Vec3 DeserializeVec3(const unsigned char *);
160
161// Distance between Vectors
162
163decimal Distance(const Vec2 &, const Vec2 &);
164decimal Distance(const Vec3 &, const Vec3 &);
165
174 public:
182 EulerAngles(decimal ra, decimal de, decimal roll)
183 : ra(ra), de(de), roll(roll) {}
184
186 decimal ra;
188 decimal de;
190 decimal roll;
191};
192
199 public:
200 Quaternion() = default;
201 explicit Quaternion(const Vec3 &);
202 Quaternion(const Vec3 &, decimal);
203
214 Quaternion(decimal real, decimal i, decimal j, decimal k)
215 : real(real), i(i), j(j), k(k) {}
216
217 Quaternion operator*(const Quaternion &other) const;
218 Quaternion Conjugate() const;
219 Vec3 Vector() const;
220 void SetVector(const Vec3 &);
221 Vec3 Rotate(const Vec3 &) const;
222 decimal Angle() const;
223 void SetAngle(decimal);
224 EulerAngles ToSpherical() const;
225 bool IsUnit(decimal tolerance) const;
226 Quaternion Canonicalize() const;
227
229 decimal real;
231 decimal i;
233 decimal j;
235 decimal k;
236};
237
238
248class Attitude {
249 public:
250 Attitude() = default;
251 explicit Attitude(const Quaternion &); // NOLINT
252 explicit Attitude(const Mat3 &dcm);
253
255 Mat3 GetDCM() const;
256 EulerAngles ToSpherical() const;
257 Vec3 Rotate(const Vec3 &) const;
258
259 private:
260 enum AttitudeType {
261 NullType,
262 QuaternionType,
263 DCMType,
264 };
265
266 Quaternion quaternion;
267 Mat3 dcm; // direction cosine matrix
268 AttitudeType type;
269};
270
271// DCM-Quaternion-Spherical Conversions
272
275Quaternion SphericalToQuaternion(decimal ra, decimal dec, decimal roll);
276
277// Spherical-Vector Conversions
278
279Vec3 SphericalToSpatial(decimal ra, decimal de);
280void SpatialToSpherical(const Vec3 &, decimal &ra, decimal &de);
281
282// Angle Between Vectors
283
284decimal Angle(const Vec3 &, const Vec3 &);
285decimal AngleUnit(const Vec3 &, const Vec3 &);
286
287// Angle Conversions
288
289decimal RadToDeg(decimal);
290decimal DegToRad(decimal);
291decimal RadToArcSec(decimal);
292decimal ArcSecToRad(decimal);
293
294// TODO: quaternion and euler angle conversion, conversion between ascension/declination to rec9tu
295
296} // namespace found
297
298#endif
Definition attitude-utils.hpp:248
Quaternion GetQuaternion() const
Definition attitude-utils.cpp:717
EulerAngles ToSpherical() const
Definition attitude-utils.cpp:773
Vec3 Rotate(const Vec3 &) const
Definition attitude-utils.cpp:755
Mat3 GetDCM() const
Definition attitude-utils.cpp:735
Definition attitude-utils.hpp:173
decimal ra
Right ascension. How far we yaw left. Yaw is performed first.
Definition attitude-utils.hpp:186
EulerAngles(decimal ra, decimal de, decimal roll)
Definition attitude-utils.hpp:182
decimal de
Declination. How far we pitch up (or down if negative). Pitch is performed second,...
Definition attitude-utils.hpp:188
decimal roll
How far we roll counterclockwise. Roll is performed last (after yaw and pitch).
Definition attitude-utils.hpp:190
Definition attitude-utils.hpp:125
decimal Det() const
Definition attitude-utils.cpp:599
decimal Trace() const
Definition attitude-utils.cpp:589
Mat3 operator+(const Mat3 &) const
Matrix Addition.
Definition attitude-utils.cpp:532
decimal At(int i, int j) const
Definition attitude-utils.cpp:505
Vec3 Row(int) const
Definition attitude-utils.cpp:527
Mat3 Transpose() const
Definition attitude-utils.cpp:575
decimal x[9]
The matrix entries.
Definition attitude-utils.hpp:128
Mat3 Inverse() const
Definition attitude-utils.cpp:611
Vec3 Column(int) const
Definition attitude-utils.cpp:516
Mat3 operator*(const Mat3 &) const
Matrix Multiplication.
Definition attitude-utils.cpp:541
Definition attitude-utils.hpp:198
Quaternion(decimal real, decimal i, decimal j, decimal k)
Definition attitude-utils.hpp:214
decimal Angle() const
Definition attitude-utils.cpp:85
Vec3 Vector() const
The vector formed by imaginary components of the quaternion. The axis of the represented rotation.
Definition attitude-utils.cpp:29
Vec3 Rotate(const Vec3 &) const
Definition attitude-utils.cpp:75
bool IsUnit(decimal tolerance) const
Definition attitude-utils.cpp:111
decimal j
The j component.
Definition attitude-utils.hpp:233
decimal real
The real component.
Definition attitude-utils.hpp:229
Quaternion Conjugate() const
Effectively computes a quaternion representing the inverse rotation of the original.
Definition attitude-utils.cpp:24
Quaternion Canonicalize() const
Definition attitude-utils.cpp:123
decimal i
The i component.
Definition attitude-utils.hpp:231
void SetAngle(decimal)
Definition attitude-utils.cpp:100
Quaternion operator*(const Quaternion &other) const
Multiply two quaternions using the usual definition of quaternion multiplication (effectively compose...
Definition attitude-utils.cpp:15
EulerAngles ToSpherical() const
Definition attitude-utils.cpp:141
decimal k
The k component.
Definition attitude-utils.hpp:235
void SetVector(const Vec3 &)
Definition attitude-utils.cpp:38
Definition attitude-utils.hpp:47
Mat3 OuterProduct(const Vec3 &) const
Definition attitude-utils.cpp:406
decimal z
The z coordinate.
Definition attitude-utils.hpp:54
Vec3(decimal de, decimal ra)
decimal y
The y coordinate.
Definition attitude-utils.hpp:52
decimal getDeclination() const
Vec3()
Definition attitude-utils.hpp:77
decimal Magnitude() const
Definition attitude-utils.cpp:307
decimal getRightAscension() const
decimal operator*(const Vec3 &) const
Dot product (Scalar product)
Definition attitude-utils.cpp:346
Vec3 operator-(const Vec3 &) const
Vector Subtraction.
Definition attitude-utils.cpp:376
decimal MagnitudeSq() const
Definition attitude-utils.cpp:289
Vec3(decimal x, decimal y, decimal z)
Definition attitude-utils.hpp:72
Vec3 CrossProduct(const Vec3 &) const
Definition attitude-utils.cpp:389
decimal x
The x coordinate.
Definition attitude-utils.hpp:50
Vec3 Normalize() const
Definition attitude-utils.cpp:338
Definition converters.hpp:10
decimal ArcSecToRad(decimal arcSec)
Definition attitude-utils.cpp:276
decimal AngleUnit(const Vec3 &vec1, const Vec3 &vec2)
Definition attitude-utils.cpp:460
const Mat3 kIdentityMat3
3x3 identity matrix
Definition attitude-utils.cpp:625
void SpatialToSpherical(const Vec3 &vec, decimal &ra, decimal &de)
Definition attitude-utils.cpp:220
decimal RadToArcSec(decimal rad)
Definition attitude-utils.cpp:262
Vec3 SphericalToSpatial(const decimal ra, const decimal de)
Definition attitude-utils.cpp:201
Vec3 DeserializeVec3(const unsigned char *buffer)
Definition attitude-utils.cpp:834
decimal Distance(const Vec2 &v1, const Vec2 &v2)
Definition attitude-utils.cpp:475
decimal DegToRad(decimal deg)
Definition attitude-utils.cpp:245
int64_t SerializeLengthVec3()
Definition attitude-utils.cpp:794
Mat3 QuaternionToDCM(const Quaternion &quat)
Definition attitude-utils.cpp:663
void SerializeVec3(const Vec3 &vec, unsigned char *buffer)
Definition attitude-utils.cpp:812
Quaternion DCMToQuaternion(const Mat3 &dcm)
Definition attitude-utils.cpp:682
Quaternion SphericalToQuaternion(decimal ra, decimal dec, decimal roll)
Definition attitude-utils.cpp:173
decimal RadToDeg(decimal rad)
Definition attitude-utils.cpp:234
decimal Angle(const Vec3 &vec1, const Vec3 &vec2)
Definition attitude-utils.cpp:444
Definition attitude-utils.hpp:18
Vec2 operator+(const Vec2 &) const
Vector Addition.
Definition attitude-utils.cpp:366
Vec2 operator-(const Vec2 &) const
Vector Subtraction.
Definition attitude-utils.cpp:371
const decimal y
The y coordinate.
Definition attitude-utils.hpp:22
Vec2 Normalize() const
Definition attitude-utils.cpp:326
decimal operator*(const Vec2 &) const
Dot product (Scalar product)
Definition attitude-utils.cpp:351
const decimal x
The x coordinate.
Definition attitude-utils.hpp:20
decimal MagnitudeSq() const
Definition attitude-utils.cpp:298
decimal Magnitude() const
Definition attitude-utils.cpp:316