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/matrixmath.hpp"
72 MRP<T>(
const T(&initial)[3]);
76 MRP<T>(
const MRP<T> &initial);
80 MRP<T>(
const std::array<T, 3> &initial);
107 DCM<T> toDCM()
const;
113 Quaternion<T> toQuaternion()
const;
116 template <
typename T>
120 template <
typename T>
121 MRP<T>::MRP(
const T(&initial)[3]) :
124 template <
typename T>
125 MRP<T>::MRP(
const MRP<T> &initial) :
128 template <
typename T>
129 MRP<T>::MRP(
const std::array<T, 3> &initial) :
132 template <
typename T>
136 dot(*
this, *
this, divisor);
144 template <
typename T>
147 T s1Squared, s2Squared, s3Squared, s1s2, s1s3, s2s3;
158 mrpdot_f1_f2.values[0][0] = 0.25*(1 - sigSquared + 2.0*s1Squared)*omega_f1_f2__f1.values[0][0] +
159 0.5*((s1s2 -
CartesianVector<T, 3>::values[2][0])*omega_f1_f2__f1.values[1][0] + (s1s3 +
CartesianVector<T, 3>::values[1][0])*omega_f1_f2__f1.values[2][0]);
160 mrpdot_f1_f2.values[1][0] = 0.25*(1 - sigSquared + 2.0*s2Squared)*omega_f1_f2__f1.values[1][0] +
161 0.5*((s1s2 +
CartesianVector<T, 3>::values[2][0])*omega_f1_f2__f1.values[0][0] + (s2s3 -
CartesianVector<T, 3>::values[0][0])*omega_f1_f2__f1.values[2][0]);
162 mrpdot_f1_f2.values[2][0] = 0.25*(1 - sigSquared + 2.0*s3Squared)*omega_f1_f2__f1.values[2][0] +
163 0.5*((s1s3 -
CartesianVector<T, 3>::values[1][0])*omega_f1_f2__f1.values[0][0] + (s2s3 +
CartesianVector<T, 3>::values[0][0])*omega_f1_f2__f1.values[1][0]);
166 template <
typename T>
167 int MRP<T>::
toDCM(
DCM<T> &dcm_f1_f2)
const {
169 T s1Squared, s2Squared, s3Squared, s1s2, s1s3, s2s3,
170 onePlusSigSquared, oneMinusSigSquared, oneMinusSigSquaredSquared,
180 onePlusSigSquared = 1 + sigSquared;
181 oneMinusSigSquared = 1 - sigSquared;
182 oneMinusSigSquaredSquared = oneMinusSigSquared*oneMinusSigSquared;
185 dcm_f1_f2.values[0][0] = 4*(s1Squared - s2Squared - s3Squared) + oneMinusSigSquaredSquared;
186 dcm_f1_f2.values[0][1] = 8*s1s2 + 4*
CartesianVector<T, 3>::values[2][0]*oneMinusSigSquared;
187 dcm_f1_f2.values[0][2] = 8*s1s3 - 4*
CartesianVector<T, 3>::values[1][0]*oneMinusSigSquared;
188 dcm_f1_f2.values[1][0] = 8*s1s2 - 4*
CartesianVector<T, 3>::values[2][0]*oneMinusSigSquared;
189 dcm_f1_f2.values[1][1] = 4*(s2Squared - s1Squared - s3Squared) + oneMinusSigSquaredSquared;
190 dcm_f1_f2.values[1][2] = 8*s2s3 + 4*
CartesianVector<T, 3>::values[0][0]*oneMinusSigSquared;
191 dcm_f1_f2.values[2][0] = 8*s1s3 + 4*
CartesianVector<T, 3>::values[1][0]*oneMinusSigSquared;
192 dcm_f1_f2.values[2][1] = 8*s2s3 - 4*
CartesianVector<T, 3>::values[0][0]*oneMinusSigSquared;
193 dcm_f1_f2.values[2][2] = 4*(s3Squared - s1Squared - s2Squared) + oneMinusSigSquaredSquared;
196 int err = safeDivide(1, onePlusSigSquared*onePlusSigSquared, multiplier);
197 if(err) {
return err;}
198 multiply(multiplier, dcm_f1_f2, dcm_f1_f2);
202 template <
typename T>
203 DCM<T> MRP<T>::toDCM()
const {
209 template <
typename T>
210 int MRP<T>::
toQuaternion(Quaternion<T> &quat_f1_f2)
const {
215 divisor = 1 + sigSquared;
219 err = safeDivide(1 - sigSquared, divisor, quat_f1_f2.values[0][0]);
220 if(err) {
return err;}
221 err = safeDivide(2*
CartesianVector<T, 3>::values[0][0], divisor, quat_f1_f2.values[1][0]);
222 if(err) {
return err;}
223 err = safeDivide(2*
CartesianVector<T, 3>::values[1][0], divisor, quat_f1_f2.values[2][0]);
224 if(err) {
return err;}
225 err = safeDivide(2*
CartesianVector<T, 3>::values[2][0], divisor, quat_f1_f2.values[3][0]);
226 if(err) {
return err;}
230 template <
typename T>
231 Quaternion<T> MRP<T>::toQuaternion()
const {
Standard vector class derived from Matrix.
Definition CartesianVector.hpp:39
Class defining a direction cosine matrix inherited from Matrix.
Definition DCM.hpp:71
void shadow()
Function to convert current MRP to its shadow set.
Definition MRP.hpp:133
int toDCM(DCM< T > &dcm_f1_f2) const
Function to convert current attitude to DCM.
Definition MRP.hpp:167
int toQuaternion(Quaternion< T > &quat_f1_f2) const
Function to convert current attitude to Quaternion.
Definition MRP.hpp:210
void rate(const CartesianVector< T, 3 > &omega_f1_f2__f1, Matrix< T, 3, 1 > &mrpdot_f1_f2)
Function to calculate the rate of change in the current representation based on the omega vector.
Definition MRP.hpp:145
Matrix math implementation.
Definition Matrix.hpp:54
#define NO_ERROR
Definition clockwerkerrors.h:31