AerialVehicleControl.jl
cont_attitude_FSF_SO3_robust.c
Go to the documentation of this file.
1 /*******************************************************************************
2 * Copyright (C) Marcus Greiff 2020
3 *
4 * @file cont_attitude_FSF_SO3_robust.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 Rm, Rrm, RrTm, Rem, ReTm;
18  matrix_double_t Sm;
19  matrix_double_t Ewm, ERm, EAm, tmp31Am, tmp31Bm, tmp31Cm, tmp33Am;
20  matrix_double_t Qm, Qrm, Wm, Wrm, Arm, Tm, Jm;
21 
22  /* Assert controller tuning feasibility */
23  if (0 == assert_attitude_FSF_SO3(controller)) return 0;
24 
25  matrix_allocate(&Rm, 3, 3);
26  matrix_allocate(&Rrm, 3, 3);
27  matrix_allocate(&RrTm, 3, 3);
28  matrix_allocate(&Rem, 3, 3);
29  matrix_allocate(&ReTm, 3, 3);
30  matrix_allocate(&Sm, 3, 3);
31  matrix_allocate(&Ewm, 3, 1);
32  matrix_allocate(&ERm, 3, 1);
33  matrix_allocate(&EAm, 3, 1);
34  matrix_allocate(&tmp31Am, 3, 1);
35  matrix_allocate(&tmp31Bm, 3, 1);
36  matrix_allocate(&tmp31Cm, 3, 1);
37  matrix_allocate(&tmp33Am, 3, 3);
38 
39  matrix_define(&Qm, 4, 1, state->quaternion);
40  matrix_define(&Wm, 3, 1, state->omega);
41  matrix_define(&Qrm, 4, 1, reference->quaternion);
42  matrix_define(&Wrm, 3, 1, reference->omega);
43  matrix_define(&Arm, 3, 1, reference->alpha);
44  matrix_define(&Tm, 3, 1, controller->torque);
45  matrix_define(&Jm, 3, 3, controller->inertia);
46 
47  /* Compute the attitude error */
48  cont_quat_2_SO3(&Qm, &Rm );
49  cont_quat_2_SO3(&Qrm, &Rrm);
50  mat_trans(&Rrm, &RrTm);
51  mat_mul(&RrTm, &Rm, &Rem);
52  mat_trans(&Rem, &ReTm);
53  mat_sub(&Rem, &ReTm, &Sm);
54  cont_SO3_vee(&Sm, &ERm);
55  for (i = 0; i < 3; i++) ERm.pData[i] /= 2.0;
56 
57  /* Compute the attitude rate error*/
58  mat_mul(&ReTm, &Wrm, &tmp31Am);
59  mat_sub(&Wm, &tmp31Am, &Ewm);
60 
61  /* Compute the robustness term */
62  matrix_copy(&ERm, &tmp31Am);
63  matrix_copy(&Jm, &tmp33Am);
64  mat_sol(&tmp33Am, &tmp31Am);
65  for (i = 0; i < 3; i++) EAm.pData[i] = Ewm.pData[i] + controller->gain_kc * tmp31Am.pData[i];
66  normeA = 0.0;
67  for (i = 0; i < 3; i++) normeA += pow(EAm.pData[i], 2.0);
68  normeA = sqrt(normeA);
69  robustnessGain = pow(controller->gain_L, 2.0);
70  robustnessGain /= (controller->gain_L * normeA + controller->gain_eps);
71 
72  /* Compute the feed-forward term */
73  cont_SO3_hat(&Wm, &Sm);
74  mat_mul(&Jm, &Wm, &tmp31Am);
75  mat_mul(&Sm, &tmp31Am, &tmp31Cm);
76  mat_mul(&ReTm, &Wrm, &tmp31Am);
77  mat_mul(&Sm, &tmp31Am, &tmp31Bm);
78  mat_mul(&ReTm, &Arm, &tmp31Am);
79  mat_sub_inplace(&tmp31Am, &tmp31Bm);
80  mat_mul(&Jm, &tmp31Am, &tmp31Bm);
81 
82  /* Add the P-, D-parts and feedforward part to the control signal torques*/
83  for (i = 0; i < 3; i++ ){
84  controller->torque[i] = tmp31Cm.pData[i];
85  controller->torque[i] += tmp31Bm.pData[i];
86  controller->torque[i] -= controller->gain_kR * ERm.pData[i];
87  controller->torque[i] -= controller->gain_kw * Ewm.pData[i];
88  controller->torque[i] -= robustnessGain * EAm.pData[i];
89  }
90 
91  /* Update distances for debugging purposes */
92  mat_mul(&Jm, &Ewm, &tmp31Am);
93  controller->dist_Psi = cont_SO3_distance(&Rrm, &Rm);
94  controller->dist_Gamma = cont_SU2_distance(&Qrm, &Qm);
95  controller->dist_lyapunov = controller->gain_kR * controller->dist_Psi;
96  controller->dist_lyapunov += controller->gain_kc * cont_dot_product(&ERm, &Ewm);
97  controller->dist_lyapunov += 0.5 * cont_dot_product(&Ewm, &tmp31Am);
98 
99  /* Free all allocated memory */
100  free(Rm.pData);
101  free(Rrm.pData);
102  free(RrTm.pData);
103  free(Rem.pData);
104  free(ReTm.pData);
105  free(Sm.pData);
106  free(Ewm.pData);
107  free(ERm.pData);
108  free(EAm.pData);
109  free(tmp31Am.pData);
110  free(tmp31Bm.pData);
111  free(tmp31Cm.pData);
112  free(tmp33Am.pData);
113 
114  return 1;
115 }
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
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
cont_attitude_FSF_SO3_robust.h
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
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
mat_trans
void mat_trans(matrix_double_t *Amat, matrix_double_t *ATmat)
Matrix transposition, A^T <– transpose(A), asserts that this is done correctly.
Definition: cont_matrix_math.c:261
ref_state_qw_s
Reference signal structure for the attitude FSF on S(3) or SU(2)
Definition: cont_types.h:111
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
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
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
update_attitude_FSF_SO3_robust
int update_attitude_FSF_SO3_robust(ref_state_qw_t *reference, dyn_state_qw_t *state, con_state_qw_fsf_t *controller)
Update using the robust full state feedback (FSF) on SO(3)
Definition: cont_attitude_FSF_SO3_robust.c:10
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
con_state_qw_fsf_s::inertia
double inertia[9]
Definition: cont_types.h:71
assert_attitude_FSF_SO3
int assert_attitude_FSF_SO3(con_state_qw_fsf_t *controller)
Assert that the SO(3) controller is feasible.
Definition: cont_attitude_utils.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
cont_SO3_vee
int cont_SO3_vee(matrix_double_t *in, matrix_double_t *out)
The hat operator on SO3.
Definition: cont_math.c:207