AerialVehicleControl.jl
cont_attitude_FSF_SU2_continuous.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  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  for (i = 0; i < 3; i++ ) eXm.pData[i] /= 2.0;
51 
52  /* Attitude rate error */
53  cont_SU2_conjugate(&Xem, &XeCm);
54  cont_SU2_hat(&Wrm, &tmp41Am);
55  cont_SU2_product(&XeCm, &tmp41Am, &tmp41Bm);
56  cont_SU2_product(&tmp41Bm, &Xem, &XeCmhatWrmXem);
57  cont_SU2_vee(&XeCmhatWrmXem, &tmp31Am);
58  mat_sub(&Wm, &tmp31Am, &ewm);
59 
60  /* Compute feed-forward term */
61  cont_SO3_hat(&Wm, &Sm);
62  mat_mul(&Jm, &Wm, &tmp31Am);
63  mat_mul(&Sm, &tmp31Am, &tmp31Cm);
64  cont_SU2_hat(&Arm, &tmp41Am);
65  cont_SU2_product(&XeCm, &tmp41Am, &tmp41Bm);
66  cont_SU2_product(&tmp41Bm, &Xem, &tmp41Cm);
67 
68  for (i = 0; i < 3; i++) tmp31Am.pData[i] = (ewm.pData[i] / 2.0);
69  cont_SU2_hat(&tmp31Am, &tmp41Am);
70  cont_SU2_product(&tmp41Am, &XeCmhatWrmXem, &tmp41Bm);
71  mat_sub_inplace(&tmp41Cm, &tmp41Bm);
72  cont_SU2_product(&XeCmhatWrmXem, &tmp41Am, &tmp41Bm);
73  mat_add_inplace(&tmp41Cm, &tmp41Bm);
74  cont_SU2_vee(&tmp41Cm, &tmp31Am);
75  mat_mul(&Jm, &tmp31Am, &tmp31Bm);
76 
77  /* Add the P-, D-parts and feedforward part to the control signal torques*/
78  for (i = 0; i < 3; i++ ){
79  controller->torque[i] = tmp31Cm.pData[i];
80  controller->torque[i] += tmp31Bm.pData[i];
81  controller->torque[i] -= controller->gain_kR * eXm.pData[i];
82  controller->torque[i] -= controller->gain_kw * ewm.pData[i];
83  }
84 
85  /* Update distances for debugging purposes */
86  mat_mul(&Jm, &ewm, &tmp31Am);
87  cont_quat_2_SO3(&Xm, &Rm );
88  cont_quat_2_SO3(&Xrm, &Rrm);
89 
90  controller->dist_Psi = cont_SO3_distance(&Rrm, &Rm);
91  controller->dist_Gamma = cont_SU2_distance(&Xrm, &Xm);
92  controller->dist_lyapunov = controller->gain_kR * controller->dist_Gamma;
93  controller->dist_lyapunov += controller->gain_kc * cont_dot_product(&eXm, &ewm);
94  controller->dist_lyapunov += 0.5 * cont_dot_product(&ewm, &tmp31Am);
95 
96  /* Free allocated memory */
97  free(Xem.pData);
98  free(XeCm.pData);
99  free(eXm.pData);
100  free(ewm.pData);
101  free(tmp41Am.pData);
102  free(tmp41Bm.pData);
103  free(tmp41Cm.pData);
104  free(tmp31Am.pData);
105  free(tmp31Bm.pData);
106  free(tmp31Cm.pData);
107  free(XeCmhatWrmXem.pData);
108  free(Sm.pData);
109  free(Rm.pData);
110  free(Rrm.pData);
111  return 1;
112 }
update_attitude_FSF_SU2_continuous
int update_attitude_FSF_SU2_continuous(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_continuous.c:10
matrix_double_s::pData
double * pData
Definition: cont_types.h:59
cont_attitude_FSF_SU2_continuous.h
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
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
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