Paparazzi UAS  v6.3_unstable
Paparazzi is a free software Unmanned Aircraft System.
navigation.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2018 Gautier Hattenberger <gautier.hattenberger@enac.fr>
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, see
18  * <http://www.gnu.org/licenses/>.
19  */
20 
27 #ifndef NAVIGATION_H
28 #define NAVIGATION_H
29 
30 #include "std.h"
32 #include "state.h"
33 #include "modules/nav/waypoints.h"
35 #include "autopilot.h"
36  // FIXME
38 #ifndef CARROT
39 #define CARROT 0.f
40 #endif
41 
42 #ifndef CARROT_DIST
43 #define CARROT_DIST 2.f
44 #endif
45 
47 #ifndef NAVIGATION_FREQUENCY
48 #if PERIODIC_FREQUENCY == 512
49 #define NAVIGATION_FREQUENCY 16
50 #else // if not 512, assume a multiple of 20 (e.g. 200, 500, 1000, ...)
51 #define NAVIGATION_FREQUENCY 20
52 #endif
53 #endif
54 
55 
57 #ifndef DEFAULT_CIRCLE_RADIUS
58 #define DEFAULT_CIRCLE_RADIUS 6.0f
59 #endif
60 
62 #ifndef ARRIVED_AT_WAYPOINT
63 #define ARRIVED_AT_WAYPOINT 3.0f
64 #endif
65 
67 #ifndef FAILSAFE_MODE_DISTANCE
68 #define FAILSAFE_MODE_DISTANCE (1.2*MAX_DIST_FROM_HOME)
69 #endif
70 
72 #define NAV_MODE_WAYPOINT 0
73 #define NAV_MODE_ROUTE 1
74 #define NAV_MODE_CIRCLE 2
75 #define NAV_MODE_HEADING 3
76 #define NAV_MODE_MANUAL 4
77 
78 typedef void (*nav_rover_goto)(struct EnuCoor_f *wp);
79 typedef void (*nav_rover_route)(struct EnuCoor_f *wp_start, struct EnuCoor_f *wp_end);
80 typedef bool (*nav_rover_approaching)(struct EnuCoor_f *wp_to, struct EnuCoor_f *wp_from, float approaching_time);
81 typedef void (*nav_rover_circle)(struct EnuCoor_f *wp_center, float radius);
82 typedef void (*nav_rover_oval_init)(void);
83 typedef void (*nav_rover_oval)(struct EnuCoor_f *wp1, struct EnuCoor_f *wp2, float radius);
84 
85 
89  // mode
90  uint8_t mode; // nav mode
91 
92  // commands
93  struct EnuCoor_f target;
94  struct EnuCoor_f carrot;
95  float heading;
96  float radius;
97  float speed;
98  float turn;
99  float shift;
100 
101  // misc
105  bool exception_flag[10];
106  struct EnuCoor_f last_pos;
107 
108  // pointers to basic nav functions
115 };
116 
117 extern struct RoverNavigation nav;
118 
126 // TODO: eight, survey
127 
128 
129 /*****************************************************************
130  * macros to ensure compatibility between fixedwing and rotorcraft
131  *****************************************************************/
132 
134 #define GetPosX() (stateGetPositionEnu_f()->x)
136 #define GetPosY() (stateGetPositionEnu_f()->y)
138 #define GetPosAlt() (stateGetPositionEnu_f()->z+state.ned_origin_f.hmsl)
140 #define GetPosHeight() (stateGetPositionEnu_f()->z)
147 #define GetAltRef() (state.ned_origin_f.hmsl)
148 
149 
151 #define NormCourse(x) { \
152  while (x < 0) x += 360; \
153  while (x >= 360) x -= 360; \
154  }
156 #define NormCourseRad(x) { \
157  while (x < 0) x += 2*M_PI; \
158  while (x >= 2*M_PI) x -= 2*M_PI; \
159  }
160 
161 extern void nav_init(void);
162 extern void nav_run(void);
163 extern void nav_parse_BLOCK(uint8_t *buf);
164 extern void nav_parse_MOVE_WP(uint8_t *buf);
165 
166 extern void set_exception_flag(uint8_t flag_num);
167 
168 extern float get_dist2_to_waypoint(uint8_t wp_id);
169 extern float get_dist2_to_point(struct EnuCoor_f *p);
170 extern void compute_dist2_to_home(void);
171 extern void nav_home(void);
172 extern void nav_set_manual(float speed, float turn);
173 
174 extern void nav_reset_reference(void) __attribute__((unused));
175 extern void nav_reset_alt(void) __attribute__((unused));
176 extern void nav_periodic_task(void);
177 
178 extern bool nav_is_in_flight(void);
179 
181 extern void nav_set_heading_rad(float rad);
182 extern void nav_set_heading_deg(float deg);
183 extern void nav_set_heading_towards(float x, float y);
185 extern void nav_set_heading_towards_target(void);
186 extern void nav_set_heading_current(void);
187 
188 extern void nav_set_failsafe(void);
189 
190 /* switching motors on/off */
191 static inline void NavKillThrottle(void)
192 {
194 }
195 static inline void NavResurrect(void)
196 {
198 }
199 
200 
201 #define NavSetManual(_roll, _pitch, _yaw) _Pragma("GCC error \"Manual mode in flight plan for fixedwing is not available\"")
202 #define NavSetFailsafe nav_set_failsafe
203 
204 #define NavSetGroundReferenceHere nav_reset_reference
205 #define NavSetAltitudeReferenceHere nav_reset_alt
206 
207 #define NavSetWaypointHere waypoint_set_here_2d
208 #define NavCopyWaypoint waypoint_copy
209 #define NavCopyWaypointPositionOnly waypoint_position_copy
210 
211 
213 bool nav_check_wp_time(struct EnuCoor_f *wp, float stay_time);
214 #define NavCheckWaypointTime(wp, time) nav_check_wp_time(&waypoints[wp].enu_f, time)
215 
216 
217 /***********************************************************
218  * macros used by flight plan to set different modes
219  **********************************************************/
220 
221 // command direct turn rate from FP roll [-1.; 1.]
222 #define NavAttitude(_roll) { \
223  nav.mode = NAV_MODE_MANUAL; \
224  nav.turn = _roll; \
225  BoundAbs(nav.turn, 1.f); \
226 }
227 
228 // command direct motor speed from FP throttle [-1.; 1.]
229 #define NavVerticalThrottleMode(_speed) { \
230  nav.speed = _speed; \
231  BoundAbs(nav.speed, 1.f); \
232 }
233 
235 #define NavHeading nav_set_heading_rad
236 
237 
238 
239 /***********************************************************
240  * built in navigation routines
241  **********************************************************/
242 
243 /*********** Navigation to waypoint *************************************/
244 static inline void NavGotoWaypoint(uint8_t wp)
245 {
246  nav.mode = NAV_MODE_WAYPOINT;
247  VECT3_COPY(nav.target, waypoints[wp].enu_f);
248  //nav.dist2_to_wp = get_dist2_to_waypoint(wp); FIXME
249 }
250 
251 /*********** Navigation along a line *************************************/
252 static inline void NavSegment(uint8_t wp_start, uint8_t wp_end)
253 {
254  nav.mode = NAV_MODE_ROUTE;
255  if (nav.nav_route) {
256  nav.nav_route(&waypoints[wp_start].enu_f, &waypoints[wp_end].enu_f);
257  }
258 }
259 
260 static inline bool NavApproaching(uint8_t wp, float approaching_time)
261 {
262  if (nav.nav_approaching) {
263  return nav.nav_approaching(&waypoints[wp].enu_f, NULL, approaching_time);
264  }
265  else {
266  return true;
267  }
268 }
269 
270 static inline bool NavApproachingFrom(uint8_t to, uint8_t from, float approaching_time)
271 {
272  if (nav.nav_approaching) {
273  return nav.nav_approaching(&waypoints[to].enu_f, &waypoints[from].enu_f, approaching_time);
274  }
275  else {
276  return true;
277  }
278 }
279 
280 /*********** Navigation on a circle **************************************/
281 static inline void NavCircleWaypoint(uint8_t wp_center, float radius)
282 {
283  nav.mode = NAV_MODE_CIRCLE;
284  if (nav.nav_circle) {
285  nav.nav_circle(&waypoints[wp_center].enu_f, radius);
286  }
287 }
288 
289 /*********** Navigation along an oval *************************************/
290 static inline void nav_oval_init(void)
291 {
292  if (nav.nav_oval_init) {
293  nav.nav_oval_init();
294  }
295 }
296 
297 static inline void Oval(uint8_t wp1, uint8_t wp2, float radius)
298 {
299  if (nav.nav_oval) {
300  nav.nav_oval(&waypoints[wp1].enu_f, &waypoints[wp2].enu_f, radius);
301  }
302 }
303 
304 
307 #define navigation_IncreaseShift(x) { if (x==0) nav.shift = 0; else nav.shift += x; }
308 
309 #define navigation_SetNavRadius(x) { if (x==1) nav.radius = DEFAULT_CIRCLE_RADIUS; else if (x==-1) nav.radius = -DEFAULT_CIRCLE_RADIUS; else nav.radius = x; }
310 
311 
312 /* follow another aircraft TODO */
313 #define NavFollow nav_follow(_id, _dist, _height) {}
314 
315 
319 #define NavGlide(_start_wp, _wp) {}
320 #define NavVerticalAutoThrottleMode(_pitch) {}
321 #define NavVerticalAutoPitchMode(_throttle) {}
322 #define NavVerticalAltitudeMode(_alt, _pre_climb) {}
323 #define NavVerticalClimbMode(_climb) {}
324 
325 
326 #endif /* NAVIGATION_H */
uint8_t autopilot_get_mode(void)
get autopilot mode
Definition: autopilot.c:216
void 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:232
Core autopilot interface common to all firmwares.
Common flight_plan functions shared between fixedwing and rotorcraft.
struct point waypoints[NB_WAYPOINT]
size == nb_waypoint, waypoint 0 is a dummy waypoint
Definition: common_nav.c:39
#define VECT3_COPY(_a, _b)
Definition: pprz_algebra.h:140
static float p[2][2]
void nav_oval(uint8_t p1, uint8_t p2, float radius)
Definition: nav.c:763
static void nav_goto(struct EnuCoor_f *wp)
static void nav_route(struct EnuCoor_f *wp_start, struct EnuCoor_f *wp_end)
static void nav_circle(struct EnuCoor_f *wp_center, float radius)
static bool nav_approaching(struct EnuCoor_f *wp, struct EnuCoor_f *from, float approaching_time)
Paparazzi floating point math for geodetic calculations.
vector in East North Up coordinates Units: meters
#define AP_MODE_NAV
void nav_home(void)
Home mode navigation (circle around HOME)
Definition: nav.c:424
void nav_reset_reference(void)
Reset the geographic reference to the current GPS fix.
Definition: navigation.c:238
void nav_register_oval(navigation_oval_init _nav_oval_init, navigation_oval nav_oval)
Definition: navigation.c:424
void nav_set_heading_current(void)
Set heading to the current yaw angle.
Definition: navigation.c:395
void nav_set_manual(int32_t roll, int32_t pitch, int32_t yaw)
Set manual roll, pitch and yaw without stabilization.
Definition: navigation.c:318
void nav_reset_alt(void)
Reset the altitude reference to the current GPS alt.
Definition: navigation.c:245
void nav_set_heading_towards_waypoint(uint8_t wp)
Set heading in the direction of a waypoint.
Definition: navigation.c:383
void compute_dist2_to_home(void)
Computes squared distance to the HOME waypoint potentially sets too_far_from_home.
Definition: navigation.c:346
bool nav_is_in_flight(void)
Definition: navigation.c:278
void nav_run(void)
Definition: navigation.c:169
void nav_set_heading_towards(float x, float y)
Set heading to point towards x,y position in local coordinates.
Definition: navigation.c:370
struct RotorcraftNavigation nav
Definition: navigation.c:51
void nav_init(void)
Navigation Initialisation.
Definition: nav.c:532
void nav_parse_MOVE_WP(uint8_t *buf)
Definition: navigation.c:125
void nav_register_circle(navigation_circle nav_circle)
Definition: navigation.c:419
void nav_register_goto_wp(navigation_goto nav_goto, navigation_route nav_route, navigation_approaching nav_approaching)
Register functions.
Definition: navigation.c:412
navigation_oval nav_oval
Definition: navigation.h:158
navigation_approaching nav_approaching
Definition: navigation.h:155
void nav_parse_BLOCK(uint8_t *buf)
Definition: navigation.c:119
navigation_circle nav_circle
Definition: navigation.h:156
void nav_set_heading_towards_target(void)
Set heading in the direction of the target.
Definition: navigation.c:389
float get_dist2_to_point(struct EnuCoor_f *p)
Returns squared horizontal distance to given point.
Definition: navigation.c:328
navigation_oval_init nav_oval_init
Definition: navigation.h:157
void nav_set_heading_rad(float rad)
heading utility functions
Definition: navigation.c:357
void nav_set_heading_deg(float deg)
Set nav_heading in degrees.
Definition: navigation.c:364
navigation_route nav_route
Definition: navigation.h:154
bool nav_check_wp_time(struct EnuCoor_f *wp, uint16_t stay_time)
Check the time spent in a radius of 'ARRIVED_AT_WAYPOINT' around a wp
Definition: navigation.c:184
void nav_periodic_task(void)
Navigation main: call to the code generated from the XML flight plan.
Definition: nav.c:445
float get_dist2_to_waypoint(uint8_t wp_id)
Returns squared horizontal distance to given waypoint.
Definition: navigation.c:338
struct EnuCoor_f target
final target position (in meters)
Definition: navigation.h:126
void nav_set_failsafe(void)
Definition: navigation.c:400
float failsafe_mode_dist2
maximum squared distance to home wp before going to failsafe mode
Definition: navigation.h:104
float turn
turn rate setpoint
Definition: navigation.h:98
void(* nav_rover_oval_init)(void)
Definition: navigation.h:82
static void NavGotoWaypoint(uint8_t wp)
Definition: navigation.h:244
struct EnuCoor_f carrot
carrot position
Definition: navigation.h:94
#define NAV_MODE_CIRCLE
Definition: navigation.h:74
uint8_t mode
Definition: navigation.h:90
float shift
lateral shift (in meters)
Definition: navigation.h:99
static void Oval(uint8_t wp1, uint8_t wp2, float radius)
Definition: navigation.h:297
#define NAV_MODE_ROUTE
Definition: navigation.h:73
float speed
speed setpoint
Definition: navigation.h:97
float dist2_to_home
squared distance to home waypoint
Definition: navigation.h:102
nav_rover_route nav_route
Definition: navigation.h:110
struct EnuCoor_f target
final target
Definition: navigation.h:93
bool too_far_from_home
too_far flag
Definition: navigation.h:103
void(* nav_rover_goto)(struct EnuCoor_f *wp)
Definition: navigation.h:78
void(* nav_rover_circle)(struct EnuCoor_f *wp_center, float radius)
Definition: navigation.h:81
static bool NavApproachingFrom(uint8_t to, uint8_t from, float approaching_time)
Definition: navigation.h:270
struct EnuCoor_f last_pos
last stage position
Definition: navigation.h:106
nav_rover_circle nav_circle
Definition: navigation.h:112
static void NavSegment(uint8_t wp_start, uint8_t wp_end)
Definition: navigation.h:252
nav_rover_oval nav_oval
Definition: navigation.h:114
static void nav_oval_init(void)
Definition: navigation.h:290
nav_rover_goto nav_goto
Definition: navigation.h:109
float heading
heading setpoint (in radians)
Definition: navigation.h:95
static void NavKillThrottle(void)
Definition: navigation.h:191
#define NAV_MODE_WAYPOINT
Nav modes.
Definition: navigation.h:72
static void NavResurrect(void)
Definition: navigation.h:195
nav_rover_oval_init nav_oval_init
Definition: navigation.h:113
static void NavCircleWaypoint(uint8_t wp_center, float radius)
Definition: navigation.h:281
void(* nav_rover_route)(struct EnuCoor_f *wp_start, struct EnuCoor_f *wp_end)
Definition: navigation.h:79
void(* nav_rover_oval)(struct EnuCoor_f *wp1, struct EnuCoor_f *wp2, float radius)
Definition: navigation.h:83
nav_rover_approaching nav_approaching
Definition: navigation.h:111
bool(* nav_rover_approaching)(struct EnuCoor_f *wp_to, struct EnuCoor_f *wp_from, float approaching_time)
Definition: navigation.h:80
bool exception_flag[10]
array of flags that might be used in flight plans
Definition: navigation.h:105
static bool NavApproaching(uint8_t wp, float approaching_time)
Definition: navigation.h:260
void set_exception_flag(uint8_t flag_num)
Definition: navigation.c:57
float radius
radius setpoint
Definition: navigation.h:96
General Navigation structure.
Definition: navigation.h:88
API to get/set the generic vehicle states.
#define TRUE
Definition: std.h:4
#define FALSE
Definition: std.h:5
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.
Definition: vl53l1_types.h:98