ModelSpace
All Classes Namespaces Functions Variables Enumerations Pages
dynamicsfunctions.hpp
1/******************************************************************************
2* Copyright (c) ATTX LLC 2024. All Rights Reserved.
3*
4* This software and associated documentation (the "Software") are the
5* proprietary and confidential information of ATTX, LLC. The Software is
6* furnished under a license agreement between ATTX and the user organization
7* and may be used or copied only in accordance with the terms of the agreement.
8* Refer to 'license/attx_license.adoc' for standard license terms.
9*
10* EXPORT CONTROL NOTICE: THIS SOFTWARE MAY INCLUDE CONTENT CONTROLLED UNDER THE
11* INTERNATIONAL TRAFFIC IN ARMS REGULATIONS (ITAR) OR THE EXPORT ADMINISTRATION
12* REGULATIONS (EAR99). No part of the Software may be used, reproduced, or
13* transmitted in any form or by any means, for any purpose, without the express
14* written permission of ATTX, LLC.
15******************************************************************************/
16
17#ifndef DYNAMICS_FUNCTIONS_HPP
18#define DYNAMICS_FUNCTIONS_HPP
19
20#include "core/Matrix.hpp"
21
22#define NUM_INPUT_STATES 6
23
24namespace clockwerk {
25
26 /// @brief Function to perform a simple approximate SNC update
27 /// @param t_step The size of the timestep for which process noise is applied
28 /// @param Qc The continuous time process noise matrix
29 /// @param B The application matrix describing channels on which noise should be applied
30 /// @param Qd Implicit return of the discrete time process noise matrix
31 template <typename T, unsigned int N, unsigned int Qn>
32 void calcSimpleSncMatrix(T t_step, const Matrix<T, Qn, Qn> &Qc,
33 const Matrix<T, N, Qn> &B, Matrix<T, N, N> &Qd) {
34 // First generate our omega matrix from our time and B matrix
35 Matrix<T, N, Qn> omega;
36 multiply(t_step, B, omega);
37
38 // Now generate our discrete time Q matrix
39 Qd = omega*Qc*omega.transpose();
40 }
41
42 /// @brief Function to calculate A matrix for system with point mass, J2, J3 gravity
43 /// @param state The state of the system, [x, y, z, xDot, yDot, zDot]
44 /// @param mu Gravitational parameter of the system
45 /// @param J2 J2 parameter of the system
46 /// @param J3 J3 parameter of the system
47 /// @param R Radius of the reference planet
48 /// @param A Implicit return of A matrix for the system
49 /// @note Overloaded to take multiple array sizes for ease of use
50 template <typename T>
51 int calcDfDzGravityJ2J3(const std::array<T, NUM_INPUT_STATES> &state,
52 T mu, T J2, T J3, T R, clockwerk::Matrix<T, NUM_INPUT_STATES, NUM_INPUT_STATES> &A) {
53 // Zero out our matrix
54 A.setToZeros();
55
56 // Now pre-calculate some simple parameters
57 T R2 = R*R;
58 T R3 = R2*R;
59 T x2 = state[0]*state[0];
60 T y2 = state[1]*state[1];
61 T z2 = state[2]*state[2];
62 T z3 = z2*state[2];
63 T z4 = z2*z2;
64 T r = std::sqrt(x2 + y2 + z2);
65 T r2 = r*r;
66 T r4 = r2*r2;
67 T r6 = r4*r2;
68 T r8 = r4*r4;
69 T r9 = r8*r;
70 T r11 = r9*r2;
71
72 // Define the most basic common terms
73 T common_mu_r6_over_r17;
74 int err = clockwerk::safeDivide(0.5*mu, r11, common_mu_r6_over_r17);
75 if(err) {return err;}
76 T J2R2 = J2*R2;
77 T J3R3 = J3*R3;
78 T tmp_1 = 105.0*r2*(J2R2*z2 - J3R3*state[2]);
79
80 // Calculate each element of our matrix
81 A[0][3] = 1.0;
82 A[1][4] = 1.0;
83 A[2][5] = 1.0;
84 A[3][0] = -common_mu_r6_over_r17*(2.0*r8 + r6*(3.0*J2R2 - 6.0*x2) - 15.0*J2R2*r4*(x2 + z2) + J3R3*(15.0*r4*state[2] - 35.0*r2*z3 + 315.0*x2*z3) + tmp_1*x2);
85 A[3][1] = A[4][0] = 3.0*common_mu_r6_over_r17*state[0]*state[1]*(2.0*r6 + 5.0*J2R2*r4 - 105.0*J3R3*z3 - 35.0*J2R2*r2*z2 + 35.0*J3R3*r2*state[2]);
86 A[3][2] = A[5][0] = 3.0*common_mu_r6_over_r17*state[0]*(2.0*r6*state[2] - 5.0*J3R3*r4 - 105.0*J3R3*z4 + 15.0*J2R2*r4*state[2] - 35.0*J2R2*r2*z3 + 70.0*J3R3*r2*z2);
87 A[4][1] = -common_mu_r6_over_r17*(2.0*r8 + r6*(3.0*J2R2 - 6.0*y2) - 15.0*J2R2*r4*(y2 + z2) + J3R3*(15.0*r4*state[2] - 35.0*r2*z3 + 315.0*y2*z3) + tmp_1*r2);
88 A[4][2] = A[5][1] = 3.0*common_mu_r6_over_r17*state[1]*(2.0*r6*state[2] - 5.0*J3R3*r4 - 105.0*J3R3*z4 + 15.0*J2R2*r4*state[2] - 35.0*J2R2*r2*z3 + 70.0*J3R3*r2*z2);
89 A[5][2] = -common_mu_r6_over_r17*(2.0*r8 - 6.0*r6*z2 + J3R3*state[2]*(315.0*z4 + 75.0*r4 - 350.0*r2*z2) + J2R2*(9.0*r6 + 105.0*r2*z4 - 90.0*r4*z2));
90
91 return NO_ERROR;
92 }
93
94 /// @brief Function to calculate A matrix for system with point mass, J2, J3 gravity
95 /// @param state The state of the system, [x, y, z, xDot, yDot, zDot] -- all others ignored
96 /// @param mu Gravitational parameter of the system
97 /// @param J2 J2 parameter of the system
98 /// @param J3 J3 parameter of the system
99 /// @param R Radius of the reference planet
100 /// @param A Implicit return of A matrix for the system
101 /// @note Overloaded to take multiple array sizes for ease of use
102 template <typename T>
103 int calcDfDzGravityJ2J3(const std::array<T, NUM_INPUT_STATES + NUM_INPUT_STATES*NUM_INPUT_STATES> &state,
104 T mu, T J2, T J3, T R, clockwerk::Matrix<T, NUM_INPUT_STATES, NUM_INPUT_STATES> &A) {
105 // Zero out our matrix
106 A.setToZeros();
107
108 // Now pre-calculate some simple parameters
109 T R2 = R*R;
110 T R3 = R2*R;
111 T x2 = state[0]*state[0];
112 T y2 = state[1]*state[1];
113 T z2 = state[2]*state[2];
114 T z3 = z2*state[2];
115 T z4 = z2*z2;
116 T r = std::sqrt(x2 + y2 + z2);
117 T r2 = r*r;
118 T r4 = r2*r2;
119 T r6 = r4*r2;
120 T r8 = r4*r4;
121 T r9 = r8*r;
122 T r11 = r9*r2;
123
124 // Define the most basic common terms
125 T common_mu_r6_over_r17;
126 int err = clockwerk::safeDivide(0.5*mu, r11, common_mu_r6_over_r17);
127 if(err) {return err;}
128 T J2R2 = J2*R2;
129 T J3R3 = J3*R3;
130 T tmp_1 = 105.0*r2*(J2R2*z2 - J3R3*state[2]);
131
132 // Calculate each element of our matrix
133 A[0][3] = 1.0;
134 A[1][4] = 1.0;
135 A[2][5] = 1.0;
136 A[3][0] = -common_mu_r6_over_r17*(2.0*r8 + r6*(3.0*J2R2 - 6.0*x2) - 15.0*J2R2*r4*(x2 + z2) + J3R3*(15.0*r4*state[2] - 35.0*r2*z3 + 315.0*x2*z3) + tmp_1*x2);
137 A[3][1] = A[4][0] = 3.0*common_mu_r6_over_r17*state[0]*state[1]*(2.0*r6 + 5.0*J2R2*r4 - 105.0*J3R3*z3 - 35.0*J2R2*r2*z2 + 35.0*J3R3*r2*state[2]);
138 A[3][2] = A[5][0] = 3.0*common_mu_r6_over_r17*state[0]*(2.0*r6*state[2] - 5.0*J3R3*r4 - 105.0*J3R3*z4 + 15.0*J2R2*r4*state[2] - 35.0*J2R2*r2*z3 + 70.0*J3R3*r2*z2);
139 A[4][1] = -common_mu_r6_over_r17*(2.0*r8 + r6*(3.0*J2R2 - 6.0*y2) - 15.0*J2R2*r4*(y2 + z2) + J3R3*(15.0*r4*state[2] - 35.0*r2*z3 + 315.0*y2*z3) + tmp_1*r2);
140 A[4][2] = A[5][1] = 3.0*common_mu_r6_over_r17*state[1]*(2.0*r6*state[2] - 5.0*J3R3*r4 - 105.0*J3R3*z4 + 15.0*J2R2*r4*state[2] - 35.0*J2R2*r2*z3 + 70.0*J3R3*r2*z2);
141 A[5][2] = -common_mu_r6_over_r17*(2.0*r8 - 6.0*r6*z2 + J3R3*state[2]*(315.0*z4 + 75.0*r4 - 350.0*r2*z2) + J2R2*(9.0*r6 + 105.0*r2*z4 - 90.0*r4*z2));
142
143 return NO_ERROR;
144 }
145
146}
147
148#endif
Matrix math implementation.
Definition Matrix.hpp:54
#define NO_ERROR
Definition clockwerkerrors.h:31
#define NUM_INPUT_STATES
Definition dynamicsfunctions.hpp:22