AerialVehicleControl.jl
cont_attitude_FSF_SO3_continuous.c
Go to the documentation of this file.
1 /*******************************************************************************
2 * Copyright (C) Marcus Greiff 2020
3 *
4 * @file cont_attitude_FSF_SO3_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 Rm, Rrm, RrTm, Rem, ReTm;
17  matrix_double_t Sm;
18  matrix_double_t Ewm, ERm, tmp31Am, tmp31Bm, tmp31Cm;
19  matrix_double_t Qm, Qrm, Wm, Wrm, Arm, Tm, Jm;
20 
21  /* Assert controller tuning feasibility */
22  if (0 == assert_attitude_FSF_SO3(controller)) return 0;
23 
24  matrix_allocate(&Rm, 3, 3);
25  matrix_allocate(&Rrm, 3, 3);
26  matrix_allocate(&RrTm, 3, 3);
27  matrix_allocate(&Rem, 3, 3);
28  matrix_allocate(&ReTm, 3, 3);
29  matrix_allocate(&Sm, 3, 3);
30  matrix_allocate(&Ewm, 3, 1);
31  matrix_allocate(&ERm, 3, 1);
32  matrix_allocate(&tmp31Am, 3, 1);
33  matrix_allocate(&tmp31Bm, 3, 1);
34  matrix_allocate(&tmp31Cm, 3, 1);
35 
36  matrix_define(&Qm, 4, 1, state->quaternion);
37  matrix_define(&Wm, 3, 1, state->omega);
38  matrix_define(&Qrm, 4, 1, reference->quaternion);
39  matrix_define(&Wrm, 3, 1, reference->omega);
40  matrix_define(&Arm, 3, 1, reference->alpha);
41  matrix_define(&Tm, 3, 1, controller->torque);
42  matrix_define(&Jm, 3, 3, controller->inertia);
43 
44  /* Compute the attitude error */
45  cont_quat_2_SO3(&Qm, &Rm );
46  cont_quat_2_SO3(&Qrm, &Rrm);
47  mat_trans(&Rrm, &RrTm);
48  mat_mul(&RrTm, &Rm, &Rem);
49  mat_trans(&Rem, &ReTm);
50  mat_sub(&Rem, &ReTm, &Sm);
51  cont_SO3_vee(&Sm, &ERm);
52  for (i = 0; i < 3; i++) ERm.pData[i] /= 2.0;
53 
54  /* Compute the attitude rate error*/
55  mat_mul(&ReTm, &Wrm, &tmp31Am);
56  mat_sub(&Wm, &tmp31Am, &Ewm);
57 
58  /* Compute the feed-forward term */
59  cont_SO3_hat(&Wm, &Sm);
60  mat_mul(&Jm, &Wm, &tmp31Am);
61  mat_mul(&Sm, &tmp31Am, &tmp31Cm);
62  mat_mul(&ReTm, &Wrm, &tmp31Am);
63  mat_mul(&Sm, &tmp31Am, &tmp31Bm);
64  mat_mul(&ReTm, &Arm, &tmp31Am);
65  mat_sub_inplace(&tmp31Am, &tmp31Bm);
66  mat_mul(&Jm, &tmp31Am, &tmp31Bm);
67 
68  /* Add the P-, D-parts and feedforward part to the control signal torques*/
69  for (i = 0; i < 3; i++ ){
70  controller->torque[i] = tmp31Cm.pData[i];
71  controller->torque[i] += tmp31Bm.pData[i];
72  controller->torque[i] -= controller->gain_kR * ERm.pData[i];
73  controller->torque[i] -= controller->gain_kw * Ewm.pData[i];
74  }
75 
76  /* Update distances for debugging purposes */
77  mat_mul(&Jm, &Ewm, &tmp31Am);
78  controller->dist_Psi = cont_SO3_distance(&Rrm, &Rm);
79  controller->dist_Gamma = cont_SU2_distance(&Qrm, &Qm);
80  controller->dist_lyapunov = controller->gain_kR * controller->dist_Psi;
81  controller->dist_lyapunov += controller->gain_kc * cont_dot_product(&ERm, &Ewm);
82  controller->dist_lyapunov += 0.5 * cont_dot_product(&Ewm, &tmp31Am);
83 
84  /* Free all allocated memory */
85  free(Rm.pData);
86  free(Rrm.pData);
87  free(RrTm.pData);
88  free(Rem.pData);
89  free(ReTm.pData);
90  free(Sm.pData);
91  free(Ewm.pData);
92  free(ERm.pData);
93  free(tmp31Am.pData);
94  free(tmp31Bm.pData);
95  free(tmp31Cm.pData);
96 
97  return 1;
98 }
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
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
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_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
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
update_attitude_FSF_SO3_continuous
int update_attitude_FSF_SO3_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 SO(3)
Definition: cont_attitude_FSF_SO3_continuous.c:10
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
cont_attitude_FSF_SO3_continuous.h
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