Paparazzi UAS v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
guidance_v.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2008-2009 Antoine Drouin <poinix@gmail.com>
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
27#include "generated/airframe.h"
30
35#include "modules/core/abi.h"
36
37#include "state.h"
38
40
41
42#ifndef GUIDANCE_V_NOMINAL_HOVER_THROTTLE
43#define GUIDANCE_V_NOMINAL_HOVER_THROTTLE 0.4
44#endif
46
47
48#ifndef GUIDANCE_V_CLIMB_RC_DEADBAND
49#define GUIDANCE_V_CLIMB_RC_DEADBAND MAX_PPRZ/10
50#endif
51
52#ifndef GUIDANCE_V_MAX_RC_CLIMB_SPEED
53#define GUIDANCE_V_MAX_RC_CLIMB_SPEED GUIDANCE_V_REF_MIN_ZD
54#endif
55
56#ifndef GUIDANCE_V_MAX_RC_DESCENT_SPEED
57#define GUIDANCE_V_MAX_RC_DESCENT_SPEED GUIDANCE_V_REF_MAX_ZD
58#endif
59
61
63
64#define GUIDANCE_V_GUIDED_MODE_ZHOLD 0
65#define GUIDANCE_V_GUIDED_MODE_CLIMB 1
66#define GUIDANCE_V_GUIDED_MODE_THROTTLE 2
67
69
70#ifndef GUIDANCE_V_RC_ID
71#define GUIDANCE_V_RC_ID ABI_BROADCAST
72#endif
76
77
78#if PERIODIC_TELEMETRY
80
81static void send_tune_vert(struct transport_tx *trans, struct link_device *dev)
82{
88}
89#endif
90
110
112{
113 /* used in RC_DIRECT directly and as saturation in CLIMB and HOVER */
115
116 /* used in RC_CLIMB */
119
124
125 if (guidance_v.rc_zd_sp > 0) {
127 } else {
129 }
130}
131
133{
134
135 if (new_mode == guidance_v.mode) {
136 return;
137 }
138
139 switch (new_mode) {
143 break;
144
147 guidance_v.zd_sp = 0;
148 /* Falls through. */
152 break;
153
154 default:
155 break;
156
157 }
158
160
161}
162
163void guidance_v_notify_in_flight(bool in_flight)
164{
165 if (in_flight) {
167 }
168}
169
172{
173 // cos(30°) = 0.8660254
174 static const int32_t max_bank_coef = BFP_OF_REAL(0.8660254f, INT32_TRIG_FRAC);
175
176 struct Int32RMat *att = stateGetNedToBodyRMat_i();
177 /* thrust vector:
178 * int32_rmat_vmult(&thrust_vect, &att, &zaxis)
179 * same as last colum of rmat with INT32_TRIG_FRAC
180 * struct Int32Vect thrust_vect = {att.m[2], att.m[5], att.m[8]};
181 *
182 * Angle between two vectors v1 and v2:
183 * angle = acos(dot(v1, v2) / (norm(v1) * norm(v2)))
184 * since here both are already of unit length:
185 * angle = acos(dot(v1, v2))
186 * since we we want the cosine of the angle we simply need
187 * thrust_coeff = dot(v1, v2)
188 * also can be simplified considering: v1 is zaxis with (0,0,1)
189 * dot(v1, v2) = v1.z * v2.z = v2.z
190 */
191 int32_t coef = att->m[8];
192 if (coef < max_bank_coef) {
193 coef = max_bank_coef;
194 }
195 return coef;
196}
197
198
199void guidance_v_thrust_adapt(bool in_flight)
200{
202
203 if (in_flight) {
204 /* Only run adaptive throttle estimation if we are in flight and
205 * the desired vertical velocity (zd) was updated (i.e. we ran hover_loop before).
206 * This means that the estimation is not updated when using direct throttle commands.
207 *
208 * FIXME... SATURATIONS NOT TAKEN INTO ACCOUNT, AKA SUPERVISION and co
209 * FIXME get this out of here !!!! and don't get stab cmd directly
210 */
211 if (desired_zd_updated) {
214 }
215 } else {
216 /* reset estimate while not in_flight */
218 }
219}
220
222{
223 guidance_v_thrust_adapt(in_flight);
224
225 /* reset flag indicating if desired zd was updated */
226 desired_zd_updated = false;
227 /* reset setpoint */
229
230 switch (guidance_v.mode) {
231
233 guidance_v.z_sp = stateGetPositionNed_i()->z; // for display only
235 break;
236
241 break;
242
246 break;
247
250 /* Falls through. */
253 break;
254
255 case GUIDANCE_V_MODE_NAV: {
257 break;
258 }
259
260 default:
261 break;
262 }
263 return guidance_v.thrust;
264}
265
266
268{
269 /* set current altitude as setpoint */
271
272 /* reset guidance reference */
275
276 /* reset speed setting */
277 guidance_v.zd_sp = 0;
278}
279
281{
282 gv_set_ref(pos, speed, accel);
283 guidance_v.z_ref = pos;
284 guidance_v.zd_ref = speed;
285 guidance_v.zdd_ref = accel;
286}
287
288
290{
291 /* convert our reference to generic representation */
296 /* set flag to indicate that desired zd was updated */
297 desired_zd_updated = true;
298}
299
327
329{
330 /* set current altitude as setpoint */
332
333 /* reset guidance reference */
336}
337
339{
340 struct ThrustSetpoint sp;
343 {
345 // Altitude Hold
346 guidance_v.zd_sp = 0;
349 sp = guidance_v_run_pos(in_flight, &guidance_v);
350 break;
352 // Climb
355 sp = guidance_v_run_speed(in_flight, &guidance_v);
356 break;
358 // Throttle
359 guidance_v.z_sp = stateGetPositionNed_i()->z; // for display only
361 break;
362 default:
363 break;
364 }
365 return sp;
366}
367
368void guidance_v_set_z(float z)
369{
370 /* disable vertical velocity setpoints */
372 /* set altitude setpoint */
374 /* reset speed setting */
375 guidance_v.zd_sp = 0;
376}
377
378void guidance_v_set_vz(float vz)
379{
380 /* enable vertical velocity setpoints */
382 /* set speed setting */
384}
385
387{
388 /* enable vertical velocity setpoints */
390
391 /* reset guidance reference */
395}
396
397
Main include for ABI (AirBorneInterface).
Event structure to store callbacks in a linked list.
Definition abi_common.h:67
#define UNUSED(x)
int32_t m[3 *3]
#define INT32_POS_FRAC
#define INT32_TRIG_FRAC
#define INT32_SPEED_FRAC
#define INT32_ACCEL_FRAC
#define BFP_OF_REAL(_vr, _frac)
#define POS_BFP_OF_REAL(_af)
#define SPEED_BFP_OF_REAL(_af)
rotation matrix
int32_t z
Down.
static struct NedCoor_i * stateGetAccelNed_i(void)
Get acceleration in NED coordinates (int).
Definition state.h:1177
static struct Int32RMat * stateGetNedToBodyRMat_i(void)
Get vehicle body attitude rotation matrix (int).
Definition state.h:1282
static struct NedCoor_i * stateGetPositionNed_i(void)
Get position in local NED coordinates (int).
Definition state.h:794
static struct NedCoor_f * stateGetPositionNed_f(void)
Get position in local NED coordinates (float).
Definition state.h:839
static struct NedCoor_i * stateGetSpeedNed_i(void)
Get ground speed in local NED coordinates (int).
Definition state.h:1004
Guidance controllers (horizontal and vertical) for Hybrid UAV configurations.
Guidance in a module file.
void guidance_v_run_enter(void)
struct ThrustSetpoint guidance_v_run_pos(bool in_flight UNUSED, struct VerticalGuidance *gv)
struct ThrustSetpoint guidance_v_run_speed(bool in_flight UNUSED, struct VerticalGuidance *gv)
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_zdd_ref
reference model vertical accel in meters/s^2 (output) fixed point representation with GV_ZDD_REF_FRAC...
int64_t gv_z_ref
reference model altitude in meters (output) fixed point representation with GV_Z_REF_FRAC Q37....
void gv_set_ref(int32_t alt, int32_t speed, int32_t accel)
void gv_update_ref_from_z_sp(int32_t z_sp)
void gv_update_ref_from_zd_sp(int32_t zd_sp, int32_t z_pos)
update vertical reference from speed setpoint.
int32_t gv_zd_ref
reference model vertical speed in meters/sec (output) fixed point representation with GV_ZD_REF_FRAC ...
#define GV_ZD_REF_FRAC
number of bits for the fractional part of gv_zd_ref
#define GV_Z_REF_FRAC
number of bits for the fractional part of gv_z_ref
#define GV_ZDD_REF_FRAC
number of bits for the fractional part of gv_zdd_ref
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.
Generic interface for radio control modules.
static void send_tune_vert(struct transport_tx *trans, struct link_device *dev)
Definition guidance_v.c:81
void guidance_v_thrust_adapt(bool in_flight)
Definition guidance_v.c:199
#define GUIDANCE_V_MAX_RC_DESCENT_SPEED
Definition guidance_v.c:57
void guidance_v_set_vz(float vz)
Set z velocity setpoint.
Definition guidance_v.c:378
void guidance_v_z_enter(void)
Definition guidance_v.c:267
void guidance_v_notify_in_flight(bool in_flight)
Definition guidance_v.c:163
struct ThrustSetpoint guidance_v_from_nav(bool in_flight)
Set guidance setpoint from NAV and run hover loop.
Definition guidance_v.c:300
static void rc_cb(uint8_t sender_id UNUSED, struct RadioControl *rc)
Definition guidance_v.c:111
#define GUIDANCE_V_MAX_RC_CLIMB_SPEED
Definition guidance_v.c:53
static bool desired_zd_updated
Definition guidance_v.c:62
#define GUIDANCE_V_NOMINAL_HOVER_THROTTLE
Definition guidance_v.c:43
#define GUIDANCE_V_GUIDED_MODE_ZHOLD
Definition guidance_v.c:64
void guidance_v_set_z(float z)
Set z position setpoint.
Definition guidance_v.c:368
void guidance_v_guided_enter(void)
Enter GUIDED mode control.
Definition guidance_v.c:328
#define GUIDANCE_V_GUIDED_MODE_THROTTLE
Definition guidance_v.c:66
static int32_t get_vertical_thrust_coeff(void)
get the cosine of the angle between thrust vector and gravity vector
Definition guidance_v.c:171
void guidance_v_set_ref(int32_t pos, int32_t speed, int32_t accel)
Set guidance ref parameters.
Definition guidance_v.c:280
#define GUIDANCE_V_GUIDED_MODE_CLIMB
Definition guidance_v.c:65
void guidance_v_set_th(float th)
Set throttle setpoint.
Definition guidance_v.c:386
struct ThrustSetpoint guidance_v_guided_run(bool in_flight)
Run GUIDED mode control.
Definition guidance_v.c:338
void guidance_v_mode_changed(uint8_t new_mode)
Definition guidance_v.c:132
static abi_event rc_ev
Definition guidance_v.c:74
struct VerticalGuidance guidance_v
Definition guidance_v.c:60
#define GUIDANCE_V_CLIMB_RC_DEADBAND
Definition guidance_v.c:49
void guidance_v_update_ref(void)
Definition guidance_v.c:289
void guidance_v_init(void)
Definition guidance_v.c:91
static int guidance_v_guided_mode
Definition guidance_v.c:68
struct ThrustSetpoint guidance_v_run(bool in_flight)
Guidance vertical run functions.
Definition guidance_v.c:221
#define GUIDANCE_V_RC_ID
Definition guidance_v.c:71
Vertical guidance for rotorcrafts.
#define GuidanceVSetRef
Definition guidance_v.h:129
float nominal_throttle
nominal throttle for hover.
Definition guidance_v.h:102
int32_t z_sp
altitude setpoint in meters (input).
Definition guidance_v.h:50
int32_t zd_sp
vertical speed setpoint in meter/s (input).
Definition guidance_v.h:56
struct ThrustSetpoint thrust
Final thrust setpoint summation of feed-forward and feed-back commands, can be a total thrust or incr...
Definition guidance_v.h:96
int32_t z_ref
altitude reference in meters.
Definition guidance_v.h:62
#define GUIDANCE_V_MODE_CLIMB
Definition guidance_v.h:38
#define GUIDANCE_V_MODE_RC_CLIMB
Definition guidance_v.h:37
int32_t zd_ref
vertical speed reference in meter/s.
Definition guidance_v.h:68
#define GUIDANCE_V_MODE_KILL
Definition guidance_v.h:35
int32_t th_sp
input thrust setpoint.
Definition guidance_v.h:90
int32_t rc_zd_sp
Vertical speed setpoint from radio control.
Definition guidance_v.h:85
#define GUIDANCE_V_MODE_RC_DIRECT
Definition guidance_v.h:36
#define GUIDANCE_V_MODE_NAV
Definition guidance_v.h:40
#define GUIDANCE_V_MODE_HOVER
Definition guidance_v.h:39
int32_t thrust_coeff
Definition guidance_v.h:104
int32_t zdd_ref
vertical acceleration reference in meter/s^2.
Definition guidance_v.h:74
#define GUIDANCE_V_MODE_GUIDED
Definition guidance_v.h:41
int32_t rc_delta_t
Direct throttle from radio control.
Definition guidance_v.h:79
struct RotorcraftNavigation nav
Definition navigation.c:51
Rotorcraft navigation functions.
uint32_t throttle
throttle command (in pprz_t)
Definition navigation.h:130
float climb
climb setpoint (in m/s)
Definition navigation.h:137
#define NAV_VERTICAL_MODE_CLIMB
Definition navigation.h:93
#define NAV_VERTICAL_MODE_MANUAL
Definition navigation.h:92
float nav_altitude
current altitude setpoint (in meters): might differ from fp_altitude depending on altitude shift from...
Definition navigation.h:139
#define NAV_VERTICAL_MODE_ALT
Definition navigation.h:94
#define NAV_VERTICAL_MODE_GUIDED
Definition navigation.h:95
struct Stabilization stabilization
General stabilization interface for rotorcrafts.
#define THRUST_SP_SET_ZERO(_sp)
#define THRUST_AXIS_Z
int32_t cmd[COMMANDS_NB]
output command vector, range from [-MAX_PPRZ:MAX_PPRZ] (store for messages)
struct ThrustSetpoint th_sp_from_thrust_i(int32_t thrust, uint8_t axis)
API to get/set the generic vehicle states.
static const struct usb_device_descriptor dev
Definition usb_ser_hw.c:74
Thrust setpoint // TODO to a setpoint header Structure to store the desired thrust vector with differ...
union ThrustSetpoint::@284 sp
int8_t register_periodic_telemetry(struct periodic_telemetry *_pt, uint8_t _id, telemetry_cb _cb)
Register a telemetry callback function.
Definition telemetry.c:51
Periodic telemetry system header (includes downlink utility and generated code).
#define DefaultPeriodic
Set default periodic telemetry.
Definition telemetry.h:66
int int32_t
Typedef defining 32 bit int type.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.