AerialVehicleControl.jl
cont_attitude_FSF_SU2_discontinuous.c
Go to the documentation of this file.
1 /*******************************************************************************
2 * Copyright (C) Marcus Greiff 2020
3 *
4 * @file cont_attitude_FSF_SU2_discontinuous.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  matrix_double_t Xm, Xrm, Xem, XeCm, eXm, Wm, Wrm, ewm, Arm;
17  matrix_double_t tmp41Am, tmp41Bm, tmp41Cm, XeCmhatWrmXem;
18  matrix_double_t tmp31Am, tmp31Bm, tmp31Cm;
19  matrix_double_t Jm, Sm, Rrm, Rm;
20 
21  /* Assert controller tuning feasibility */
22  if (0 == assert_attitude_FSF_SU2(controller)) return 0;
23 
24  matrix_allocate(&Xem, 4, 1);
25  matrix_allocate(&XeCm, 4, 1);
26  matrix_allocate(&eXm, 3, 1);
27  matrix_allocate(&ewm, 3, 1);
28  matrix_allocate(&tmp41Am, 4, 1);
29  matrix_allocate(&tmp41Bm, 4, 1);
30  matrix_allocate(&tmp41Cm, 4, 1);
31  matrix_allocate(&tmp31Am, 3, 1);
32  matrix_allocate(&tmp31Bm, 3, 1);
33  matrix_allocate(&tmp31Cm, 3, 1);
34  matrix_allocate(&XeCmhatWrmXem, 4, 1);
35  matrix_allocate(&Sm, 3, 3);
36  matrix_allocate(&Rrm, 3, 3);
37  matrix_allocate(&Rm, 3, 3);
38 
39  matrix_define(&Xm, 4, 1, state->quaternion);
40  matrix_define(&Wm, 3, 1, state->omega);
41  matrix_define(&Xrm, 4, 1, reference->quaternion);
42  matrix_define(&Wrm, 3, 1, reference->omega);
43  matrix_define(&Arm, 3, 1, reference->alpha);
44  matrix_define(&Jm, 3, 3, controller->inertia);
45 
46  /* Attitude error */
47  cont_SU2_conjugate(&Xrm, &tmp41Am);
48  cont_SU2_product(&tmp41Am, &Xm, &Xem);
49  cont_SU2_vee(&Xem, &eXm);
50 
51  for (i = 0; i < 3; i++ ) eXm.pData[i] *= (cont_sign_func(Xem.pData[0]) / 2.0);
52 
53  /* Attitude rate error */
54  cont_SU2_conjugate(&Xem, &XeCm);
55  cont_SU2_hat(&Wrm, &tmp41Am);
56  cont_SU2_product(&XeCm, &tmp41Am, &tmp41Bm);
57  cont_SU2_product(&tmp41Bm, &Xem, &XeCmhatWrmXem);
58  cont_SU2_vee(&XeCmhatWrmXem, &tmp31Am);
59  mat_sub(&Wm, &tmp31Am, &ewm);
60 
61  /* Compute feed-forward term */
62  cont_SO3_hat(&Wm, &Sm);
63  mat_mul(&Jm, &Wm, &tmp31Am);
64  mat_mul(&Sm, &tmp31Am, &tmp31Cm);
65  cont_SU2_hat(&Arm, &tmp41Am);
66  cont_SU2_product(&XeCm, &tmp41Am, &tmp41Bm);
67  cont_SU2_product(&tmp41Bm, &Xem, &tmp41Cm);
68 
69  for (i = 0; i < 3; i++) tmp31Am.pData[i] = (ewm.pData[i] / 2.0);
70  cont_SU2_hat(&tmp31Am, &tmp41Am);
71  cont_SU2_product(&tmp41Am, &XeCmhatWrmXem, &tmp41Bm);
72  mat_sub_inplace(&tmp41Cm, &tmp41Bm);
73  cont_SU2_product(&XeCmhatWrmXem, &tmp41Am, &tmp41Bm);
74  mat_add_inplace(&tmp41Cm, &tmp41Bm);
75  cont_SU2_vee(&tmp41Cm, &tmp31Am);
76  mat_mul(&Jm, &tmp31Am, &tmp31Bm);
77 
78  /* Add the P-, D-parts and feedforward part to the control signal torques*/
79  for (i = 0; i < 3; i++ ){
80  controller->torque[i] = tmp31Cm.pData[i];
81  controller->torque[i] += tmp31Bm.pData[i];
82  controller->torque[i] -= controller->gain_kR * eXm.pData[i];
83  controller->torque[i] -= controller->gain_kw * ewm.pData[i];
84  }
85 
86  /* Update distances for debugging purposes */
87  mat_mul(&Jm, &ewm, &tmp31Am);
88  cont_quat_2_SO3(&Xm, &Rm );
89  cont_quat_2_SO3(&Xrm, &Rrm);
90 
91  controller->dist_Psi = cont_SO3_distance(&Rrm, &Rm);
92  controller->dist_Gamma = cont_SU2_distance(&Xrm, &Xm);
93  if (cont_sign_func(Xem.pData[0]) == 1.0){
94  controller->dist_lyapunov = controller->gain_kR * controller->dist_Gamma;
95  } else {
96  controller->dist_lyapunov = controller->gain_kR *(2.0 - controller->dist_Gamma);
97  }
98  controller->dist_lyapunov += controller->gain_kc * cont_dot_product(&eXm, &ewm);
99  controller->dist_lyapunov += 0.5 * cont_dot_product(&ewm, &tmp31Am);
100 
101  /* Free allocated memory */
102  free(Xem.pData);
103  free(XeCm.pData);
104  free(eXm.pData);
105  free(ewm.pData);
106  free(tmp41Am.pData);
107  free(tmp41Bm.pData);
108  free(tmp41Cm.pData);
109  free(tmp31Am.pData);
110  free(tmp31Bm.pData);
111  free(tmp31Cm.pData);
112  free(XeCmhatWrmXem.pData);
113  free(Sm.pData);
114  free(Rm.pData);
115  free(Rrm.pData);
116  return 1;
117 }
matrix_double_s::pData
double * pData
Definition: cont_types.h:59
con_state_qw_fsf_s::torque
double torque[3]
Definition: cont_types.h:70
cont_sign_func
double cont_sign_func(double in)
Takes the sign of the input, returning +1 if the input is zero.
Definition: cont_math.c:370
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
cont_attitude_FSF_SU2_discontinuous.h
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
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_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_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
update_attitude_FSF_SU2_discontinuous
int update_attitude_FSF_SU2_discontinuous(ref_state_qw_t *reference, dyn_state_qw_t *state, con_state_qw_fsf_t *controller)
Update using the discontinuous full state feedback (FSF) on SU(2)
Definition: cont_attitude_FSF_SU2_discontinuous.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