2
3
4
5
6
7
8
9
10
11
12
13
14
15
17
18
19
20
26#include "core/Matrix.hpp"
27#include "core/CartesianVector.hpp"
28#include "core/safemath.hpp"
29#include "core/clockwerkerrors.h"
74 DCM<T>() :
Matrix<T, 3, 3>({{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}) {};
78 DCM<T>(
const T(&initial)[3][3]) :
Matrix<T, 3, 3>(initial) {};
82 DCM<T>(
const DCM<T> &initial) :
Matrix<T, 3, 3>(initial) {};
86 DCM<T>(
const std::array<std::array<T, 3>, 3> &initial) :
Matrix<T, 3, 3>(initial) {};
97 DCM<T> inverse()
const {
DCM<T> tmp; inverse(tmp);
return tmp;}
117 int toEuler321(Euler321<T> &euler_f1_f2)
const;
118 Euler321<T> toEuler321();
124 Quaternion<T> toQuaternion();
129 int toMRP(MRP<T> &mrp_f1_f2)
const;
133 template <
typename T>
136 Matrix<T, 3, 3>::transpose(result);
140 template <
typename T>
143 dcmdot_f1_f2.values[0][0] = omega_f1_f2__f1.values[2][0]*
Matrix<T, 3, 3>::values[1][0] - omega_f1_f2__f1.values[1][0]*
Matrix<T, 3, 3>::values[2][0];
144 dcmdot_f1_f2.values[0][1] = omega_f1_f2__f1.values[2][0]*
Matrix<T, 3, 3>::values[1][1] - omega_f1_f2__f1.values[1][0]*
Matrix<T, 3, 3>::values[2][1];
145 dcmdot_f1_f2.values[0][2] = omega_f1_f2__f1.values[2][0]*
Matrix<T, 3, 3>::values[1][2] - omega_f1_f2__f1.values[1][0]*
Matrix<T, 3, 3>::values[2][2];
146 dcmdot_f1_f2.values[1][0] = omega_f1_f2__f1.values[0][0]*
Matrix<T, 3, 3>::values[2][0] - omega_f1_f2__f1.values[2][0]*
Matrix<T, 3, 3>::values[0][0];
147 dcmdot_f1_f2.values[1][1] = omega_f1_f2__f1.values[0][0]*
Matrix<T, 3, 3>::values[2][1] - omega_f1_f2__f1.values[2][0]*
Matrix<T, 3, 3>::values[0][1];
148 dcmdot_f1_f2.values[1][2] = omega_f1_f2__f1.values[0][0]*
Matrix<T, 3, 3>::values[2][2] - omega_f1_f2__f1.values[2][0]*
Matrix<T, 3, 3>::values[0][2];
149 dcmdot_f1_f2.values[2][0] = omega_f1_f2__f1.values[1][0]*
Matrix<T, 3, 3>::values[0][0] - omega_f1_f2__f1.values[0][0]*
Matrix<T, 3, 3>::values[1][0];
150 dcmdot_f1_f2.values[2][1] = omega_f1_f2__f1.values[1][0]*
Matrix<T, 3, 3>::values[0][1] - omega_f1_f2__f1.values[0][0]*
Matrix<T, 3, 3>::values[1][1];
151 dcmdot_f1_f2.values[2][2] = omega_f1_f2__f1.values[1][0]*
Matrix<T, 3, 3>::values[0][2] - omega_f1_f2__f1.values[0][0]*
Matrix<T, 3, 3>::values[1][2];
154 template <
typename T>
163 if(
Matrix<T, 3, 3>::values[0][0] == 0) {
166 euler_f1_f2.values[0][0] = atan2(
Matrix<T, 3, 3>::values[0][1],
Matrix<T, 3, 3>::values[0][0]);
167 if(
Matrix<T, 3, 3>::values[0][2] > 1 ||
Matrix<T, 3, 3>::values[0][2] < -1) {
170 euler_f1_f2.values[1][0] = -asin(
Matrix<T, 3, 3>::values[0][2]);
171 if(
Matrix<T, 3, 3>::values[2][2] == 0) {
174 euler_f1_f2.values[2][0] = atan2(
Matrix<T, 3, 3>::values[1][2],
Matrix<T, 3, 3>::values[2][2]);
180 Euler321<T>
DCM<T>::toEuler321() {
186 template <
typename T>
193 Matrix<T, 3, 3>::trace(tmpTrace);
194 quat_f1_f2.values[0][0] = 1 + tmpTrace;
195 quat_f1_f2.values[1][0] = 1 + 2*
Matrix<T, 3, 3>::values[0][0] - tmpTrace;
196 quat_f1_f2.values[2][0] = 1 + 2*
Matrix<T, 3, 3>::values[1][1] - tmpTrace;
197 quat_f1_f2.values[3][0] = 1 + 2*
Matrix<T, 3, 3>::values[2][2] - tmpTrace;
200 std::pair<
unsigned int,
unsigned int> indices;
202 quat_f1_f2.max(value, indices);
205 switch(indices.first) {
207 err = safeSqrt(0.25*quat_f1_f2.values[0][0], quat_f1_f2.values[0][0]);
208 if(err) {
return err;}
209 err = safeDivide(0.25*(
Matrix<T, 3, 3>::values[1][2] -
Matrix<T, 3, 3>::values[2][1]),
210 quat_f1_f2.values[0][0],
211 quat_f1_f2.values[1][0]);
212 if(err) {
return err;}
213 err = safeDivide(0.25*(
Matrix<T, 3, 3>::values[2][0] -
Matrix<T, 3, 3>::values[0][2]),
214 quat_f1_f2.values[0][0],
215 quat_f1_f2.values[2][0]);
216 if(err) {
return err;}
217 err = safeDivide(0.25*(
Matrix<T, 3, 3>::values[0][1] -
Matrix<T, 3, 3>::values[1][0]),
218 quat_f1_f2.values[0][0],
219 quat_f1_f2.values[3][0]);
220 if(err) {
return err;}
221 quat_f1_f2.normalize();
224 err = safeSqrt(0.25*quat_f1_f2.values[1][0], quat_f1_f2.values[1][0]);
225 if(err) {
return err;}
226 err = safeDivide(0.25*(
Matrix<T, 3, 3>::values[1][2] -
Matrix<T, 3, 3>::values[2][1]),
227 quat_f1_f2.values[1][0],
228 quat_f1_f2.values[0][0]);
229 if(err) {
return err;}
230 err = safeDivide(0.25*(
Matrix<T, 3, 3>::values[0][1] +
Matrix<T, 3, 3>::values[1][0]),
231 quat_f1_f2.values[1][0],
232 quat_f1_f2.values[2][0]);
233 if(err) {
return err;}
234 err = safeDivide(0.25*(
Matrix<T, 3, 3>::values[2][0] +
Matrix<T, 3, 3>::values[0][2]),
235 quat_f1_f2.values[1][0],
236 quat_f1_f2.values[3][0]);
237 if(err) {
return err;}
238 quat_f1_f2.normalize();
241 err = safeSqrt(0.25*quat_f1_f2.values[2][0], quat_f1_f2.values[2][0]);
242 if(err) {
return err;}
243 err = safeDivide(0.25*(
Matrix<T, 3, 3>::values[2][0] -
Matrix<T, 3, 3>::values[0][2]),
244 quat_f1_f2.values[2][0],
245 quat_f1_f2.values[0][0]);
246 if(err) {
return err;}
247 err = safeDivide(0.25*(
Matrix<T, 3, 3>::values[0][1] +
Matrix<T, 3, 3>::values[1][0]),
248 quat_f1_f2.values[2][0],
249 quat_f1_f2.values[1][0]);
250 err = safeDivide(0.25*(
Matrix<T, 3, 3>::values[1][2] +
Matrix<T, 3, 3>::values[2][1]),
251 quat_f1_f2.values[2][0],
252 quat_f1_f2.values[3][0]);
253 if(err) {
return err;}
254 quat_f1_f2.normalize();
257 err = safeSqrt(0.25*quat_f1_f2.values[3][0], quat_f1_f2.values[3][0]);
258 if(err) {
return err;}
259 err = safeDivide(0.25*(
Matrix<T, 3, 3>::values[0][1] -
Matrix<T, 3, 3>::values[1][0]),
260 quat_f1_f2.values[3][0],
261 quat_f1_f2.values[0][0]);
262 if(err) {
return err;}
263 err = safeDivide(0.25*(
Matrix<T, 3, 3>::values[2][0] +
Matrix<T, 3, 3>::values[0][2]),
264 quat_f1_f2.values[3][0],
265 quat_f1_f2.values[1][0]);
266 if(err) {
return err;}
267 err = safeDivide(0.25*(
Matrix<T, 3, 3>::values[1][2] +
Matrix<T, 3, 3>::values[2][1]),
268 quat_f1_f2.values[3][0],
269 quat_f1_f2.values[2][0]);
270 if(err) {
return err;}
271 quat_f1_f2.normalize();
283 Quaternion<T>
DCM<T>::toQuaternion() {
289 template <
typename T>
290 int DCM<T>::
toMRP(MRP<T> &mrp_f1_f2)
const {
297 Matrix<T, 3, 3>::trace(trace);
298 err = safeSqrt(trace + 1, tau);
301 err = safeDivide(1, tau*(tau+2), tau);
302 if(err) {
return err;}
303 mrp_f1_f2.values[0][0] = tau*(
Matrix<T, 3, 3>::values[1][2] -
Matrix<T, 3, 3>::values[2][1]);
304 mrp_f1_f2.values[1][0] = tau*(
Matrix<T, 3, 3>::values[2][0] -
Matrix<T, 3, 3>::values[0][2]);
305 mrp_f1_f2.values[2][0] = tau*(
Matrix<T, 3, 3>::values[0][1] -
Matrix<T, 3, 3>::values[1][0]);
311 MRP<T>
DCM<T>::toMRP() {
Standard vector class derived from Matrix.
Definition CartesianVector.hpp:39
Class defining a direction cosine matrix inherited from Matrix.
Definition DCM.hpp:71
int inverse(DCM< T > &result) const
Function to return the inverse of the matrix.
Definition DCM.hpp:134
void rate(const CartesianVector< T, 3 > &omega_f1_f2__f1, Matrix< T, 3, 3 > &dcmdot_f1_f2)
Function to calculate the rate of change in the current representation based on the omega vector.
Definition DCM.hpp:141
int toMRP(MRP< T > &mrp_f1_f2) const
Overloaded functions to convert current attitude to MRP.
Definition DCM.hpp:290
int toQuaternion(Quaternion< T > &q_f1_f2) const
Overloaded functions to convert current attitude to quaternion.
Definition DCM.hpp:187
int toEuler321(Euler321< T > &euler_f1_f2) const
Function to convert current attitude to 321 Euler sequence.
Definition DCM.hpp:155
Matrix math implementation.
Definition Matrix.hpp:54
#define NO_ERROR
Definition clockwerkerrors.h:31
#define ERROR_DIMENSIONS
Definition clockwerkerrors.h:38
#define ERROR_INVALID_RANGE
Definition clockwerkerrors.h:50
#define ERROR_DIVIDE_BY_ZERO
Definition clockwerkerrors.h:46