Paparazzi UAS v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
Loading...
Searching...
No Matches
guidance_v_adapt.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2009-2013 The Paparazzi Team
3 *
4 * This file is part of paparazzi.
5 *
6 * paparazzi is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
9 * any later version.
10 *
11 * paparazzi is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with paparazzi; see the file COPYING. If not, write to
18 * the Free Software Foundation, 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
20 */
21
31#include "paparazzi.h"
33#include "generated/airframe.h"
34
35
43#ifndef GUIDANCE_V_ADAPT_INITIAL_HOVER_THROTTLE
44#ifdef GUIDANCE_V_NOMINAL_HOVER_THROTTLE
45#define GUIDANCE_V_ADAPT_INITIAL_HOVER_THROTTLE GUIDANCE_V_NOMINAL_HOVER_THROTTLE
46#else
47#define GUIDANCE_V_ADAPT_INITIAL_HOVER_THROTTLE 0.3
48#endif
49#endif
51
52
56#ifndef GUIDANCE_V_ADAPT_MIN_HOVER_THROTTLE
57#define GUIDANCE_V_ADAPT_MIN_HOVER_THROTTLE 0.2
58#endif
60
61
65#ifndef GUIDANCE_V_ADAPT_MAX_HOVER_THROTTLE
66#define GUIDANCE_V_ADAPT_MAX_HOVER_THROTTLE 0.75
67#endif
69
70
75#ifndef GUIDANCE_V_ADAPT_NOISE_FACTOR
76#define GUIDANCE_V_ADAPT_NOISE_FACTOR 1.0
77#endif
78
79
83#ifndef GUIDANCE_V_ADAPT_MAX_ACCEL
84#define GUIDANCE_V_ADAPT_MAX_ACCEL 4.0
85#endif
86
90#ifndef GUIDANCE_V_ADAPT_MAX_CMD
91#define GUIDANCE_V_ADAPT_MAX_CMD 0.9
92#endif
93#ifndef GUIDANCE_V_ADAPT_MIN_CMD
94#define GUIDANCE_V_ADAPT_MIN_CMD 0.1
95#endif
96
97
98
102
103/* System noises */
104#ifndef GV_ADAPT_SYS_NOISE_F
105#define GV_ADAPT_SYS_NOISE_F 0.00005
106#endif
107#define GV_ADAPT_SYS_NOISE BFP_OF_REAL(GV_ADAPT_SYS_NOISE_F, GV_ADAPT_P_FRAC)
108
109/* Measuremement noises */
110#define GV_ADAPT_MEAS_NOISE_HOVER_F (50.0*GUIDANCE_V_ADAPT_NOISE_FACTOR)
111#define GV_ADAPT_MEAS_NOISE_HOVER BFP_OF_REAL(GV_ADAPT_MEAS_NOISE_HOVER_F, GV_ADAPT_P_FRAC)
112#define GV_ADAPT_MEAS_NOISE_OF_ZD (100.0*GUIDANCE_V_ADAPT_NOISE_FACTOR)
113
114/* Initial Covariance */
115#define GV_ADAPT_P0_F 0.1
119
121{
124}
125
126#define K_FRAC 12
127
134{
135
139
140 /* Update only if accel and commands are in a valid range */
141 /* This also ensures we don't divide by zero */
144 return;
145 }
146
147 /* We don't propagate state, it's constant ! */
148 /* We propagate our covariance */
150
151 /* Compute our measurement. If zdd_meas is in the range +/-5g, meas is less than 30 bits */
152 const int32_t g_m_zdd = ((int32_t)BFP_OF_REAL(9.81,
154 if (g_m_zdd > 0) {
156 } else {
158 }
159
160 /* Compute a residual */
162
163 /* Covariance Error E = P + R */
165 if (zd_ref < 0) { ref = -ref; }
167
168 /* Kalman gain K = P / (P + R) = P / E */
169 int32_t K = (gv_adapt_P << K_FRAC) / E;
170
171 /* Update Covariance Pnew = P - K * P */
173 /* Don't let covariance climb over initial value */
174 if (gv_adapt_P > gv_adapt_P0) {
176 }
177
178 /* Update State */
180
181 /* Output bounds.
182 * Don't let it climb over a value that would
183 * give less than #GUIDANCE_V_ADAPT_MIN_HOVER_THROTTLE % throttle
184 * or more than #GUIDANCE_V_ADAPT_MAX_HOVER_THROTTLE % throttle.
185 */
186 static const int32_t max_out = BFP_OF_REAL(9.81, GV_ADAPT_X_FRAC) /
188 static const int32_t min_out = BFP_OF_REAL(9.81, GV_ADAPT_X_FRAC) /
191}
#define ACCEL_BFP_OF_REAL(_af)
#define INT32_SPEED_FRAC
#define INT32_ACCEL_FRAC
#define BFP_OF_REAL(_vr, _frac)
#define E
void gv_adapt_run(int32_t zdd_meas, int32_t thrust_applied, int32_t zd_ref)
Adaptation function.
void gv_adapt_init(void)
int32_t gv_adapt_P
Covariance.
#define GUIDANCE_V_ADAPT_MAX_HOVER_THROTTLE
Maximum hover throttle as factor of MAX_PPRZ.
#define GUIDANCE_V_ADAPT_INITIAL_HOVER_THROTTLE
Initial hover throttle as factor of MAX_PPRZ.
#define GUIDANCE_V_ADAPT_MAX_ACCEL
Filter is not fed if accel values are more than +/- MAX_ACCEL.
#define K_FRAC
static const int32_t gv_adapt_P0
#define GV_ADAPT_MEAS_NOISE_OF_ZD
#define GV_ADAPT_SYS_NOISE
static const int32_t gv_adapt_X0
#define GUIDANCE_V_ADAPT_MIN_CMD
#define GV_ADAPT_P0_F
#define GV_ADAPT_MEAS_NOISE_HOVER
int32_t gv_adapt_X
State of the estimator.
int32_t gv_adapt_Xmeas
Measurement.
#define GUIDANCE_V_ADAPT_MIN_HOVER_THROTTLE
Minimum hover throttle as factor of MAX_PPRZ.
#define GUIDANCE_V_ADAPT_MAX_CMD
Filter is not fed if command values are out of a % of 0/MAX_PPRZ.
Adaptation block of the vertical guidance.
#define GV_ADAPT_X_FRAC
#define GV_ADAPT_P_FRAC
uint16_t foo
Definition main_demo5.c:58
PRINT_CONFIG_VAR(ONELOOP_ANDI_FILT_CUTOFF)
#define MAX_PPRZ
Definition paparazzi.h:8
Paparazzi fixed point algebra.
uint16_t ref[TCOUPLE_NB]
static float K[9]
int int32_t
Typedef defining 32 bit int type.