Paparazzi UAS  v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
autopilot_static.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2008-2012 The Paparazzi Team
3  * Copyright (C) 2016 Gautier Hattenberger <gautier.hattenberger@enac.fr>
4  *
5  * This file is part of paparazzi.
6  *
7  * paparazzi is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  *
12  * paparazzi is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with paparazzi; see the file COPYING. If not, write to
19  * the Free Software Foundation, 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22 
30 #include "autopilot.h"
31 #include "autopilot_arming.h"
32 
34 #include "modules/core/commands.h"
37 #include "modules/core/settings.h"
40 
44 
45 #if USE_STABILIZATION_RATE
47 #endif
48 
50 
51 #include "generated/settings.h"
52 
53 #if USE_GPS
54 #include "modules/gps/gps.h"
55 #else
56 #if NO_GPS_NEEDED_FOR_NAV
57 #define GpsIsLost() FALSE
58 #else
59 #define GpsIsLost() TRUE
60 #endif
61 #endif
62 
63 /* Geofence exceptions */
65 
67 #ifndef FAILSAFE_MODE_TOO_FAR_FROM_HOME
68 #define FAILSAFE_MODE_TOO_FAR_FROM_HOME AP_MODE_FAILSAFE
69 #endif
70 
71 
72 #ifndef MODE_STARTUP
73 #define MODE_STARTUP AP_MODE_KILL
74 PRINT_CONFIG_MSG("Using default AP_MODE_KILL as MODE_STARTUP")
75 #endif
76 
77 #ifndef UNLOCKED_HOME_MODE
78 #if MODE_AUTO1 == AP_MODE_HOME
79 #define UNLOCKED_HOME_MODE TRUE
80 PRINT_CONFIG_MSG("Enabled UNLOCKED_HOME_MODE since MODE_AUTO1 is AP_MODE_HOME")
81 #elif MODE_AUTO2 == AP_MODE_HOME
82 #define UNLOCKED_HOME_MODE TRUE
83 PRINT_CONFIG_MSG("Enabled UNLOCKED_HOME_MODE since MODE_AUTO2 is AP_MODE_HOME")
84 #else
85 #define UNLOCKED_HOME_MODE FALSE
86 #endif
87 #endif
88 
89 #if MODE_MANUAL == AP_MODE_NAV
90 #error "MODE_MANUAL mustn't be AP_MODE_NAV"
91 #endif
92 
93 
95 {
96  /* Mode is finally set by autopilot_static_set_mode if MODE_STARTUP is not KILL.
97  * For autopilot_static_set_mode to do anything, the requested mode needs to differ
98  * from previous mode, so we set it to a safe KILL first.
99  */
101 
102  /* set startup mode, propagates through to guidance h/v */
104 
105  /* init arming */
107 }
108 
109 
110 #define NAV_PRESCALER (PERIODIC_FREQUENCY / NAVIGATION_FREQUENCY)
112 {
113 
114  RunOnceEvery(NAV_PRESCALER, compute_dist2_to_home());
115 
120  } else {
122  }
123  }
124  }
125 
126  if (autopilot.mode == AP_MODE_HOME) {
127  RunOnceEvery(NAV_PRESCALER, nav_home());
128  } else {
129  // otherwise always call nav_periodic_task so that carrot is always updated in GCS for other modes
130  RunOnceEvery(NAV_PRESCALER, nav_periodic_task());
131  }
132 
133 
134  /* If in FAILSAFE mode and either already not in_flight anymore
135  * or just "detected" ground, go to KILL mode.
136  */
138  if (!autopilot_in_flight()) {
140  }
141 
142 #if FAILSAFE_GROUND_DETECT
143  INFO("Using FAILSAFE_GROUND_DETECT: KILL")
146  }
147 #endif
148  }
149 
150  /* Reset ground detection _after_ running flight plan
151  */
152  if (!autopilot_in_flight()) {
153  autopilot.ground_detected = false;
155  }
156 
157  /* Set fixed "failsafe" commands from airframe file if in KILL mode.
158  * If in FAILSAFE mode, run normal loops with failsafe attitude and
159  * downwards velocity setpoints.
160  */
161  if (autopilot.mode == AP_MODE_KILL) {
162  SetCommands(commands_failsafe);
163  } else {
167  }
168  autopilot.throttle = commands[COMMAND_THRUST];
169 
170 }
171 
177 {
179  // safety modes are always accessible via settings
181  } else {
182  if (radio_control.status != RC_OK &&
184  // without RC, only nav-like modes are accessible
186  }
187  }
188  // with RC, other modes can only be changed from the RC
189 }
190 
191 
192 void autopilot_static_set_mode(uint8_t new_autopilot_mode)
193 {
194  if (new_autopilot_mode != autopilot.mode) {
195  /* horizontal mode */
196  switch (new_autopilot_mode) {
197  case AP_MODE_FAILSAFE:
198 #ifndef KILL_AS_FAILSAFE
201  break;
202 #endif
203  case AP_MODE_KILL:
206  break;
207  case AP_MODE_RC_DIRECT:
209  break;
211  case AP_MODE_RATE_DIRECT:
212  case AP_MODE_RATE_Z_HOLD:
213 #if USE_STABILIZATION_RATE
215 #else
216  return;
217 #endif
218  break;
224  break;
225  case AP_MODE_FORWARD:
227  break;
230  break;
232  case AP_MODE_HOVER_CLIMB:
235  break;
236  case AP_MODE_HOME:
237  case AP_MODE_NAV:
239  break;
240  case AP_MODE_MODULE:
241 #ifdef GUIDANCE_H_MODE_MODULE_SETTING
243 #endif
244  break;
245  case AP_MODE_FLIP:
247  break;
248  case AP_MODE_GUIDED:
250  break;
251  default:
252  break;
253  }
254  /* vertical mode */
255  switch (new_autopilot_mode) {
256  case AP_MODE_FAILSAFE:
257 #ifndef KILL_AS_FAILSAFE
260  break;
261 #endif
262  case AP_MODE_KILL:
264  stabilization_cmd[COMMAND_THRUST] = 0;
266  break;
267  case AP_MODE_RC_DIRECT:
268  case AP_MODE_RATE_DIRECT:
272  case AP_MODE_FORWARD:
274  break;
278  break;
280  case AP_MODE_HOVER_CLIMB:
282  break;
283  case AP_MODE_RATE_Z_HOLD:
287  break;
288  case AP_MODE_HOME:
289  case AP_MODE_NAV:
291  break;
292  case AP_MODE_MODULE:
293 #ifdef GUIDANCE_V_MODE_MODULE_SETTING
295 #endif
296  break;
297  case AP_MODE_FLIP:
299  break;
300  case AP_MODE_GUIDED:
302  break;
303  default:
304  break;
305  }
306  //if switching to rate mode but rate mode is not defined, the function returned
307  autopilot.mode = new_autopilot_mode;
308  }
309 }
310 
311 
312 void autopilot_static_set_motors_on(bool motors_on)
313 {
314  if (autopilot.mode != AP_MODE_KILL && motors_on) {
315  autopilot.motors_on = true;
316  } else {
317  autopilot.motors_on = false;
318  }
320 }
321 
323 {
324 
325  if (kill_switch_is_on()) {
327  } else {
328 #ifdef RADIO_AUTO_MODE
329  INFO("Using RADIO_AUTO_MODE to switch between AUTO1 and AUTO2.")
330  uint8_t new_autopilot_mode = ap_mode_of_two_switches();
331 #else
332 #ifdef RADIO_MODE_2x3
333  uint8_t new_autopilot_mode = ap_mode_of_3x2way_switch();
334 #else
335  uint8_t new_autopilot_mode = ap_mode_of_3way_switch();
336 #endif
337 #endif
338 
339  /* don't enter NAV mode if GPS is lost (this also prevents mode oscillations) */
340  if (!(new_autopilot_mode == AP_MODE_NAV && GpsIsLost())) {
341  /* always allow to switch to manual */
342  if (new_autopilot_mode == MODE_MANUAL) {
343  autopilot_static_set_mode(new_autopilot_mode);
344  }
345  /* if in HOME or FAILSAFE mode, don't allow switching to non-manual modes */
346  else if (((autopilot.mode != AP_MODE_HOME) && (autopilot.mode != AP_MODE_FAILSAFE))
347 
349  /* Allowed to leave home mode when UNLOCKED_HOME_MODE */
351 #endif
352  ) {
353  autopilot_static_set_mode(new_autopilot_mode);
354  }
355  }
356  }
357 
358  /* an arming sequence is used to start/stop motors.
359  */
362 
363  /* if not in FAILSAFE or HOME mode, read RC and set commands accordingly */
365 
366  /* if there are some commands that should always be set from RC, do it */
367 #ifdef SetAutoCommandsFromRC
368  SetAutoCommandsFromRC(commands, radio_control.values);
369 #endif
370 
371  /* if not in NAV_MODE set commands from the rc */
372 #ifdef SetCommandsFromRC
373  if (autopilot.mode != AP_MODE_NAV) {
374  SetCommandsFromRC(commands, radio_control.values);
375  }
376 #endif
377 
380  }
381 
382 }
383 
385 #ifndef RC_LOST_MODE
386 #define RC_LOST_MODE AP_MODE_FAILSAFE
387 #endif
388 
390 {
400  }
401 
402 #if FAILSAFE_ON_BAT_CRITICAL
403  if (autopilot_get_mode() != AP_MODE_KILL &&
406  }
407 #endif
408 
409 #if USE_GPS
410  if (autopilot_get_mode() == AP_MODE_NAV &&
412 #if NO_GPS_LOST_WITH_RC_VALID
414 #endif
415 #ifdef NO_GPS_LOST_WITH_DATALINK_TIME
416  datalink_time > NO_GPS_LOST_WITH_DATALINK_TIME &&
417 #endif
418  GpsIsLost()) {
420  }
421 
422  if (autopilot_get_mode() == AP_MODE_HOME &&
425  }
426 #endif
427 
428 }
429 
bool autopilot_set_mode(uint8_t new_autopilot_mode)
set autopilot mode
Definition: autopilot.c:193
uint8_t autopilot_get_mode(void)
get autopilot mode
Definition: autopilot.c:217
void autopilot_set_in_flight(bool in_flight)
set in_flight flag
Definition: autopilot.c:325
bool autopilot_set_motors_on(bool motors_on)
turn motors on/off, eventually depending of the current mode set kill_throttle accordingly FIXME is i...
Definition: autopilot.c:245
struct pprz_autopilot autopilot
Global autopilot structure.
Definition: autopilot.c:49
bool autopilot_get_motors_on(void)
get motors status
Definition: autopilot.c:290
bool autopilot_in_flight(void)
get in_flight flag
Definition: autopilot.c:335
Core autopilot interface common to all firmwares.
bool motors_on
motor status
Definition: autopilot.h:68
bool ground_detected
automatic detection of landing
Definition: autopilot.h:73
pprz_t throttle
throttle level as will be displayed in GCS
Definition: autopilot.h:66
bool detect_ground_once
enable automatic detection of ground (one shot)
Definition: autopilot.h:74
bool kill_throttle
allow autopilot to use throttle
Definition: autopilot.h:69
uint8_t mode
current autopilot mode
Definition: autopilot.h:63
bool in_flight
in flight status
Definition: autopilot.h:70
Arming procedure for rotorcraft Several options can be selected:
static void autopilot_arming_set(bool motors_on)
static void autopilot_arming_check_motors_on(void)
State machine to check if motors should be turned ON or OFF using the kill switch.
static void autopilot_arming_init(void)
Autopilot guided mode interface.
const pprz_t commands_failsafe[COMMANDS_NB]
Definition: commands.c:31
pprz_t commands[COMMANDS_NB]
Definition: commands.c:30
Hardware independent code for commands handling.
#define GUIDANCE_V_MODE_MODULE_SETTING
#define GUIDANCE_H_MODE_MODULE_SETTING
struct Electrical electrical
Definition: electrical.c:92
Interface for electrical status: supply voltage, current, battery status, etc.
bool bat_critical
battery critical status
Definition: electrical.h:51
void autopilot_static_init(void)
Static autopilot API.
void autopilot_static_periodic(void)
void autopilot_static_SetModeHandler(float new_autopilot_mode)
void autopilot_static_set_motors_on(bool motors_on)
void autopilot_failsafe_checks(void)
Failsafe checks.
void autopilot_static_on_rc_frame(void)
Function to be called when a message from FBW is available.
void autopilot_static_set_mode(uint8_t new_autopilot_mode)
#define AP_MODE_HOME
Device independent GPS code (interface)
#define GpsIsLost()
Definition: gps.h:185
PRINT_CONFIG_MSG("USE_INS_NAV_INIT defaulting to TRUE")
Hardware independent API for actuators (servos, motor controllers).
void nav_home(void)
Home mode navigation (circle around HOME)
Definition: nav.c:424
void nav_periodic_task(void)
Navigation main: call to the code generated from the XML flight plan.
Definition: nav.c:445
Optional exceptions triggeringg HOME_MODE 1) GEOFENCE_DATALINK_LOST_TIME: go to HOME mode if datalink...
static bool higher_than_max_altitude(void)
Definition: nav_geofence.h:66
static bool datalink_lost(void)
Definition: nav_geofence.h:45
struct RadioControl radio_control
Definition: radio_control.c:33
Generic interface for radio control modules.
#define RC_REALLY_LOST
Definition: radio_control.h:51
pprz_t values[RADIO_CONTROL_NB_CHANNEL]
Definition: radio_control.h:67
uint8_t status
Definition: radio_control.h:61
#define RC_OK
Definition: radio_control.h:49
static bool kill_switch_is_on(void)
#define FAILSAFE_MODE_TOO_FAR_FROM_HOME
Mode that is set when the plane is really too far from home.
#define NAV_PRESCALER
#define MODE_STARTUP
#define RC_LOST_MODE
mode to enter when RC is lost while using a mode with RC input (not AP_MODE_NAV)
#define UNLOCKED_HOME_MODE
#define AP_MODE_HOVER_DIRECT
#define AP_MODE_RATE_DIRECT
#define AP_MODE_RATE_RC_CLIMB
#define AP_MODE_HOVER_CLIMB
#define AP_MODE_HOVER_Z_HOLD
#define AP_MODE_RC_DIRECT
#define AP_MODE_ATTITUDE_DIRECT
#define AP_MODE_FORWARD
#define AP_MODE_ATTITUDE_CLIMB
#define AP_MODE_NAV
#define AP_MODE_GUIDED
#define AP_MODE_ATTITUDE_Z_HOLD
#define MODE_MANUAL
Default RC mode.
#define AP_MODE_KILL
Static autopilot modes.
#define AP_MODE_FAILSAFE
#define AP_MODE_ATTITUDE_RC_CLIMB
#define AP_MODE_RATE_Z_HOLD
#define AP_MODE_CARE_FREE_DIRECT
#define AP_MODE_MODULE
#define AP_MODE_FLIP
uint8_t ap_mode_of_3way_switch(void)
get autopilot mode as set by RADIO_MODE 3-way switch
#define SetRotorcraftCommands(_cmd, _in_flight, _motors_on)
#define FAILSAFE_DESCENT_SPEED
Set descent speed in failsafe mode.
void guidance_h_read_rc(bool in_flight)
Definition: guidance_h.c:224
void guidance_h_mode_changed(uint8_t new_mode)
Definition: guidance_h.c:151
void guidance_h_run(bool in_flight)
Definition: guidance_h.c:283
#define GUIDANCE_H_MODE_FORWARD
Definition: guidance_h.h:63
#define GUIDANCE_H_MODE_NAV
Definition: guidance_h.h:60
#define GUIDANCE_H_MODE_HOVER
Definition: guidance_h.h:59
#define GUIDANCE_H_MODE_ATTITUDE
Definition: guidance_h.h:58
#define GUIDANCE_H_MODE_GUIDED
Definition: guidance_h.h:66
#define GUIDANCE_H_MODE_RC_DIRECT
Definition: guidance_h.h:61
#define GUIDANCE_H_MODE_CARE_FREE
Definition: guidance_h.h:62
#define GUIDANCE_H_MODE_KILL
Definition: guidance_h.h:56
#define GUIDANCE_H_MODE_RATE
Definition: guidance_h.h:57
#define GUIDANCE_H_MODE_FLIP
Definition: guidance_h.h:65
void guidance_v_read_rc(void)
Definition: guidance_v.c:105
void guidance_v_set_vz(float vz)
Set z velocity setpoint.
Definition: guidance_v.c:403
void guidance_v_run(bool in_flight)
Definition: guidance_v.c:224
void guidance_v_mode_changed(uint8_t new_mode)
Definition: guidance_v.c:127
#define GUIDANCE_V_MODE_FLIP
Definition: guidance_v.h:41
#define GUIDANCE_V_MODE_CLIMB
Definition: guidance_v.h:37
#define GUIDANCE_V_MODE_RC_CLIMB
Definition: guidance_v.h:36
#define GUIDANCE_V_MODE_KILL
Definition: guidance_v.h:34
#define GUIDANCE_V_MODE_RC_DIRECT
Definition: guidance_v.h:35
#define GUIDANCE_V_MODE_NAV
Definition: guidance_v.h:39
#define GUIDANCE_V_MODE_HOVER
Definition: guidance_v.h:38
#define GUIDANCE_V_MODE_GUIDED
Definition: guidance_v.h:42
void compute_dist2_to_home(void)
Computes squared distance to the HOME waypoint potentially sets too_far_from_home.
Definition: navigation.c:324
struct RotorcraftNavigation nav
Definition: navigation.c:51
Rotorcraft navigation functions.
float dist2_to_home
squared distance to home waypoint
Definition: navigation.h:142
float failsafe_mode_dist2
maximum squared distance to home wp before going to failsafe mode
Definition: navigation.h:144
bool too_far_from_home
too_far flag
Definition: navigation.h:143
General attitude stabilization interface for rotorcrafts.
void stabilization_attitude_set_failsafe_setpoint(void)
Persistent settings interface.
static uint8_t mode
mode holds the current sonar mode mode = 0 used at high altitude, uses 16 wave patterns mode = 1 used...
Definition: sonar_bebop.c:69
int32_t stabilization_cmd[COMMANDS_NB]
Stabilization commands.
Definition: stabilization.c:34
General stabilization interface for rotorcrafts.
Dummy stabilization for rotorcrafts.
Rate stabilization for rotorcrafts.
#define FALSE
Definition: std.h:5
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.
Definition: vl53l1_types.h:98