AerialVehicleControl.jl
cont_attitude_FSF_SU2_robust.c
Go to the documentation of this file.
1 /*******************************************************************************
2 * Copyright (C) Marcus Greiff 2020
3 *
4 * @file cont_attitude_FSF_SU2_continuous.c
5 * @author Marcus Greiff
6 * @date June 2020
7 *******************************************************************************/
9 
11  ref_state_qw_t * reference,
12  dyn_state_qw_t * state,
13  con_state_qw_fsf_t * controller
14 ){
15  int i;
16  double robustnessGain, normeA;
17  matrix_double_t Xm, Xrm, Xem, XeCm, eXm, eAm, Wm, Wrm, ewm, Arm;
18  matrix_double_t tmp41Am, tmp41Bm, tmp41Cm, XeCmhatWrmXem;
19  matrix_double_t tmp31Am, tmp31Bm, tmp31Cm, tmp33Am;
20  matrix_double_t Jm, Sm, Rrm, Rm;
21 
22  /* Assert controller tuning feasibility */
23  if (0 == assert_attitude_FSF_SU2(controller)) return 0;
24 
25  matrix_allocate(&Xem, 4, 1);
26  matrix_allocate(&XeCm, 4, 1);
27  matrix_allocate(&eXm, 3, 1);
28  matrix_allocate(&ewm, 3, 1);
29  matrix_allocate(&eAm, 3, 1);
30  matrix_allocate(&tmp41Am, 4, 1);
31  matrix_allocate(&tmp41Bm, 4, 1);
32  matrix_allocate(&tmp41Cm, 4, 1);
33  matrix_allocate(&tmp31Am, 3, 1);
34  matrix_allocate(&tmp31Bm, 3, 1);
35  matrix_allocate(&tmp31Cm, 3, 1);
36  matrix_allocate(&tmp33Am, 3, 3);
37  matrix_allocate(&XeCmhatWrmXem, 4, 1);
38  matrix_allocate(&Sm, 3, 3);
39  matrix_allocate(&Rrm, 3, 3);
40  matrix_allocate(&Rm, 3, 3);
41 
42  matrix_define(&Xm, 4, 1, state->quaternion);
43  matrix_define(&Wm, 3, 1, state->omega);
44  matrix_define(&Xrm, 4, 1, reference->quaternion);
45  matrix_define(&Wrm, 3, 1, reference->omega);
46  matrix_define(&Arm, 3, 1, reference->alpha);
47  matrix_define(&Jm, 3, 3, controller->inertia);
48 
49  /* Attitude error */
50  cont_SU2_conjugate(&Xrm, &tmp41Am);
51  cont_SU2_product(&tmp41Am, &Xm, &Xem);
52  cont_SU2_vee(&Xem, &eXm);
53  for (i = 0; i < 3; i++ ) eXm.pData[i] /= 2.0;
54 
55  /* Attitude rate error */
56  cont_SU2_conjugate(&Xem, &XeCm);
57  cont_SU2_hat(&Wrm, &tmp41Am);
58  cont_SU2_product(&XeCm, &tmp41Am, &tmp41Bm);
59  cont_SU2_product(&tmp41Bm, &Xem, &XeCmhatWrmXem);
60  cont_SU2_vee(&XeCmhatWrmXem, &tmp31Am);
61  mat_sub(&Wm, &tmp31Am, &ewm);
62 
63  /* Compute the robustness term */
64  matrix_copy(&eXm, &tmp31Am);
65  matrix_copy(&Jm, &tmp33Am);
66  mat_sol(&tmp33Am, &tmp31Am);
67  for (i = 0; i < 3; i++) eAm.pData[i] = ewm.pData[i] + controller->gain_kc * tmp31Am.pData[i];
68  normeA = 0.0;
69  for (i = 0; i < 3; i++) normeA += pow(eAm.pData[i], 2.0);
70  normeA = sqrt(normeA);
71  robustnessGain = pow(controller->gain_L, 2.0);
72  robustnessGain /= (controller->gain_L * normeA + controller->gain_eps);
73 
74  /* Compute feed-forward term */
75  cont_SO3_hat(&Wm, &Sm);
76  mat_mul(&Jm, &Wm, &tmp31Am);
77  mat_mul(&Sm, &tmp31Am, &tmp31Cm);
78  cont_SU2_hat(&Arm, &tmp41Am);
79  cont_SU2_product(&XeCm, &tmp41Am, &tmp41Bm);
80  cont_SU2_product(&tmp41Bm, &Xem, &tmp41Cm);
81 
82  for (i = 0; i < 3; i++) tmp31Am.pData[i] = (ewm.pData[i] / 2.0);
83  cont_SU2_hat(&tmp31Am, &tmp41Am);
84  cont_SU2_product(&tmp41Am, &XeCmhatWrmXem, &tmp41Bm);
85  mat_sub_inplace(&tmp41Cm, &tmp41Bm);
86  cont_SU2_product(&XeCmhatWrmXem, &tmp41Am, &tmp41Bm);
87  mat_add_inplace(&tmp41Cm, &tmp41Bm);
88  cont_SU2_vee(&tmp41Cm, &tmp31Am);
89  mat_mul(&Jm, &tmp31Am, &tmp31Bm);
90 
91  /* Add the P-, D-parts and feedforward part to the control signal torques*/
92  for (i = 0; i < 3; i++ ){
93  controller->torque[i] = tmp31Cm.pData[i];
94  controller->torque[i] += tmp31Bm.pData[i];
95  controller->torque[i] -= controller->gain_kR * eXm.pData[i];
96  controller->torque[i] -= controller->gain_kw * ewm.pData[i];
97  controller->torque[i] -= robustnessGain * eAm.pData[i];
98  }
99 
100  /* Update distances for debugging purposes */
101  mat_mul(&Jm, &ewm, &tmp31Am);
102  cont_quat_2_SO3(&Xm, &Rm );
103  cont_quat_2_SO3(&Xrm, &Rrm);
104 
105  controller->dist_Psi = cont_SO3_distance(&Rrm, &Rm);
106  controller->dist_Gamma = cont_SU2_distance(&Xrm, &Xm);
107  controller->dist_lyapunov = controller->gain_kR * controller->dist_Gamma;
108  controller->dist_lyapunov += controller->gain_kc * cont_dot_product(&eXm, &ewm);
109  controller->dist_lyapunov += 0.5 * cont_dot_product(&ewm, &tmp31Am);
110 
111  /* Free allocated memory */
112  free(Xem.pData);
113  free(XeCm.pData);
114  free(eXm.pData);
115  free(ewm.pData);
116  free(eAm.pData);
117  free(tmp41Am.pData);
118  free(tmp41Bm.pData);
119  free(tmp41Cm.pData);
120  free(tmp31Am.pData);
121  free(tmp31Bm.pData);
122  free(tmp31Cm.pData);
123  free(tmp33Am.pData);
124  free(XeCmhatWrmXem.pData);
125  free(Sm.pData);
126  free(Rm.pData);
127  free(Rrm.pData);
128  return 1;
129 }
matrix_double_s::pData
double * pData
Definition: cont_types.h:59
mat_sol
void mat_sol(matrix_double_t *Amat, matrix_double_t *Bmat)
Compute, without changing A, the eigenvalues of a real symmetric A to B, asserts that this is done co...
Definition: cont_matrix_math.c:264
con_state_qw_fsf_s::torque
double torque[3]
Definition: cont_types.h:70
con_state_qw_fsf_s::gain_kc
double gain_kc
Definition: cont_types.h:73
matrix_allocate
void matrix_allocate(matrix_double_t *matrix, int numRows, int numCols)
Allocate memory for a matrix struct of given dimensions.
Definition: cont_types.c:65
update_attitude_FSF_SU2_robust
int update_attitude_FSF_SU2_robust(ref_state_qw_t *reference, dyn_state_qw_t *state, con_state_qw_fsf_t *controller)
Update using the continuous full state feedback (FSF) on SU(2)
Definition: cont_attitude_FSF_SU2_robust.c:10
ref_state_qw_s::alpha
double alpha[3]
Definition: cont_types.h:114
ref_state_qw_s::omega
double omega[3]
Definition: cont_types.h:113
con_state_qw_fsf_s::gain_L
double gain_L
Definition: cont_types.h:76
matrix_double_s
Matrix object used for all matrix manipulation.
Definition: cont_types.h:50
dyn_state_qw_s::omega
double omega[3]
Definition: cont_types.h:61
con_state_qw_fsf_s::gain_kw
double gain_kw
Definition: cont_types.h:74
mat_add_inplace
void mat_add_inplace(matrix_double_t *Amat, matrix_double_t *Bmat)
In-place matrix addition, A <– A + B, asserts that this is done correctly.
Definition: cont_matrix_math.c:249
cont_SO3_hat
int cont_SO3_hat(matrix_double_t *in, matrix_double_t *out)
The hat operator on SO3.
Definition: cont_math.c:186
cont_SU2_hat
int cont_SU2_hat(matrix_double_t *in, matrix_double_t *out)
The hat map on SU(2)
Definition: cont_math.c:69
ref_state_qw_s
Reference signal structure for the attitude FSF on S(3) or SU(2)
Definition: cont_types.h:111
cont_attitude_FSF_SU2_robust.h
cont_SO3_distance
double cont_SO3_distance(matrix_double_t *R1, matrix_double_t *R2)
The distance Phi(R1, R2) defined on SO3.
Definition: cont_math.c:302
con_state_qw_fsf_s
Complete state of the attitude FSF on SO(3) or SU(2)
Definition: cont_types.h:67
cont_SU2_product
int cont_SU2_product(matrix_double_t *q, matrix_double_t *p, matrix_double_t *out)
Product of two elements of SU(2)
Definition: cont_math.c:28
con_state_qw_fsf_s::dist_Psi
double dist_Psi
Definition: cont_types.h:81
matrix_copy
void matrix_copy(matrix_double_t *Amat, matrix_double_t *Bmat)
Copy one metrix into another Bmat <– Amat, overwriting Bmat.
Definition: cont_types.c:54
con_state_qw_fsf_s::gain_eps
double gain_eps
Definition: cont_types.h:75
matrix_define
void matrix_define(matrix_double_t *matrix, int numRows, int numCols, double *data)
Define a matrix to use already allocated memory.
Definition: cont_types.c:75
dyn_state_qw_s
Dynamical states, assumed known in the attitude FSF on SO(3) or SU(2)
Definition: cont_types.h:59
mat_mul
void mat_mul(matrix_double_t *Amat, matrix_double_t *Bmat, matrix_double_t *Cmat)
and asserts that this is done correctly
Definition: cont_matrix_math.c:258
cont_SU2_vee
int cont_SU2_vee(matrix_double_t *in, matrix_double_t *out)
The vee map on SU(2)
Definition: cont_math.c:53
dyn_state_qw_s::quaternion
double quaternion[4]
Definition: cont_types.h:60
mat_sub_inplace
void mat_sub_inplace(matrix_double_t *Amat, matrix_double_t *Bmat)
In-place subtraction addition, A <– A - B, asserts that this is done correctly.
Definition: cont_matrix_math.c:255
cont_dot_product
double cont_dot_product(matrix_double_t *vecA, matrix_double_t *vecB)
Evaluates the dot product of two vectors.
Definition: cont_math.c:343
mat_sub
void mat_sub(matrix_double_t *Amat, matrix_double_t *Bmat, matrix_double_t *Cmat)
Matrix subtraction, C <– A - B, and asserts that this is done correctly.
Definition: cont_matrix_math.c:252
cont_quat_2_SO3
int cont_quat_2_SO3(matrix_double_t *q, matrix_double_t *R)
Embedding relating SU(2) to SO(3)
Definition: cont_math.c:157
cont_SU2_distance
double cont_SU2_distance(matrix_double_t *q1, matrix_double_t *q2)
Evaluate distance Gamma(q1, q2) in [0,2] defined on SU2.
Definition: cont_math.c:138
con_state_qw_fsf_s::dist_Gamma
double dist_Gamma
Definition: cont_types.h:82
con_state_qw_fsf_s::gain_kR
double gain_kR
Definition: cont_types.h:72
assert_attitude_FSF_SU2
int assert_attitude_FSF_SU2(con_state_qw_fsf_t *controller)
Assert that the SU(2) controller is feasible.
Definition: cont_attitude_utils.c:35
con_state_qw_fsf_s::inertia
double inertia[9]
Definition: cont_types.h:71
cont_SU2_conjugate
int cont_SU2_conjugate(matrix_double_t *qin, matrix_double_t *qout)
Conjugate an element of SU(2)
Definition: cont_math.c:10
con_state_qw_fsf_s::dist_lyapunov
double dist_lyapunov
Definition: cont_types.h:83
ref_state_qw_s::quaternion
double quaternion[4]
Definition: cont_types.h:112