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
nav_vertical_raster.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2008-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
29
31#include "state.h"
32#include "autopilot.h"
33#include "generated/flight_plan.h"
34
35/************** Vertical Raster **********************************************/
36
42
47
49{
50 radius = fabs(radius);
51 float alt = waypoints[l1].a;
52 waypoints[l2].a = alt;
53
54 float l2_l1_x = WaypointX(l1) - WaypointX(l2);
55 float l2_l1_y = WaypointY(l1) - WaypointY(l2);
56 float d = sqrt(l2_l1_x * l2_l1_x + l2_l1_y * l2_l1_y);
57
58 /* Unit vector from l1 to l2 */
59 float u_x = l2_l1_x / d;
60 float u_y = l2_l1_y / d;
61
62 /* The half circle centers and the other leg */
63 struct point l2_c1 = { WaypointX(l1) + radius * u_y,
64 WaypointY(l1) + radius * -u_x,
65 alt
66 };
67 struct point l2_c2 = { WaypointX(l1) + 1.732 * radius * u_x,
68 WaypointY(l1) + 1.732 * radius * u_y,
69 alt
70 };
71 struct point l2_c3 = { WaypointX(l1) + radius * -u_y,
72 WaypointY(l1) + radius * u_x,
73 alt
74 };
75
76 struct point l1_c1 = { WaypointX(l2) + radius * -u_y,
77 WaypointY(l2) + radius * u_x,
78 alt
79 };
80 struct point l1_c2 = { WaypointX(l2) + 1.732 * radius * -u_x,
81 WaypointY(l2) + 1.732 * radius * -u_y,
82 alt
83 };
84 struct point l1_c3 = { WaypointX(l2) + radius * u_y,
85 WaypointY(l2) + radius * -u_x,
86 alt
87 };
88 float qdr_out_2_1 = M_PI / 3. - atan2(u_y, u_x);
89
90 float qdr_out_2_2 = -M_PI / 3. - atan2(u_y, u_x);
91 float qdr_out_2_3 = M_PI - atan2(u_y, u_x);
92
93 /* Vertical target */
94 NavVerticalAutoThrottleMode(0); /* No pitch */
96
97 switch (line_status) {
98 case LR12: /* From wp l2 to wp l1 */
104 }
105 break;
106 case LQC21:
107 nav_circle_XY(l2_c1.x, l2_c1.y, radius);
111 }
112 break;
113 case LTC2:
114 nav_circle_XY(l2_c2.x, l2_c2.y, -radius);
115 if (NavQdrCloseTo(DegOfRad(qdr_out_2_2) + 10) && stateGetPositionUtm_f()->alt >= (waypoints[l1].a - 10)) {
118 }
119 break;
120 case LQC22:
121 nav_circle_XY(l2_c3.x, l2_c3.y, radius);
125 }
126 break;
127 case LR21: /* From wp l1 to wp l2 */
128 NavSegment(l1, l2);
133 }
134 break;
135 case LQC12:
136 nav_circle_XY(l1_c1.x, l1_c1.y, radius);
137 if (NavQdrCloseTo(DegOfRad(qdr_out_2_1 + M_PI) - 10)) {
140 }
141 break;
142 case LTC1:
143 nav_circle_XY(l1_c2.x, l1_c2.y, -radius);
144 if (NavQdrCloseTo(DegOfRad(qdr_out_2_2 + M_PI) + 10) && stateGetPositionUtm_f()->alt >= (waypoints[l1].a - 5)) {
147 }
148 break;
149 case LQC11:
150 nav_circle_XY(l1_c3.x, l1_c3.y, radius);
151 if (NavQdrCloseTo(DegOfRad(qdr_out_2_3 + M_PI) - 10)) {
154 }
155 default:
156 break;
157 }
158 return true; /* This pattern never ends */
159}
Core autopilot interface common to all firmwares.
struct point waypoints[NB_WAYPOINT]
size == nb_waypoint, waypoint 0 is a dummy waypoint
Definition common_nav.c:44
#define WaypointX(_wp)
Definition common_nav.h:45
#define WaypointAlt(_wp)
waypoint altitude in m above MSL
Definition common_nav.h:48
float a
Definition common_nav.h:42
#define WaypointY(_wp)
Definition common_nav.h:46
static struct UtmCoor_f * stateGetPositionUtm_f(void)
Get position in UTM coordinates (float).
Definition state.h:821
uint16_t foo
Definition main_demo5.c:58
void nav_init_stage(void)
needs to be implemented by fixedwing and rotorcraft seperately
Definition nav.c:92
void nav_circle_XY(float x, float y, float radius)
Navigates around (x, y).
Definition nav.c:108
Fixedwing Navigation library.
#define NavApproachingFrom(wp, from, time)
Definition nav.h:172
#define NavQdrCloseTo(x)
True if x (in degrees) is close to the current QDR (less than 10 degrees)
Definition nav.h:161
#define NavSegment(_start, _end)
Definition nav.h:167
#define NavVerticalAltitudeMode(_alt, _pre_climb)
Set the vertical mode to altitude control with the specified altitude setpoint and climb pre-command.
Definition nav.h:191
#define NavVerticalAutoThrottleMode(_pitch)
Set the climb control to auto-throttle with the specified pitch pre-command.
Definition nav.h:177
line_status
Status along the pattern.
Definition nav_line.c:53
bool nav_vertical_raster_run(uint8_t l1, uint8_t l2, float radius, float AltSweep)
line_status
Copy of nav line.
void nav_vertical_raster_setup(void)
#define CARROT
default approaching_time for a wp
Definition navigation.h:70
API to get/set the generic vehicle states.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.