mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-31 12:23:23 +08:00
[fixewing][modules] convert nav_spiral to module
This commit is contained in:
@@ -164,7 +164,6 @@ twog_1.0 + aspirin + ETS baro + ETS speed
|
|||||||
<define name="NO_XBEE_API_INIT" value="TRUE"/>
|
<define name="NO_XBEE_API_INIT" value="TRUE"/>
|
||||||
<define name="TRIGGER_DELAY" value="1."/>
|
<define name="TRIGGER_DELAY" value="1."/>
|
||||||
<define name="DEFAULT_CIRCLE_RADIUS" value="70."/>
|
<define name="DEFAULT_CIRCLE_RADIUS" value="70."/>
|
||||||
<define name="MIN_CIRCLE_RADIUS" value="35.0"/>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section name="GLS_APPROACH" prefix="APP_">
|
<section name="GLS_APPROACH" prefix="APP_">
|
||||||
|
|||||||
@@ -227,9 +227,6 @@
|
|||||||
|
|
||||||
<define name="DEFAULT_CIRCLE_RADIUS" value="50.0"/>
|
<define name="DEFAULT_CIRCLE_RADIUS" value="50.0"/>
|
||||||
|
|
||||||
<!-- only for spiral -->
|
|
||||||
<define name="MIN_CIRCLE_RADIUS" value="35.0"/>
|
|
||||||
|
|
||||||
<!-- The Glide definitions are used for calculating the touch down point during auto landing -->
|
<!-- The Glide definitions are used for calculating the touch down point during auto landing -->
|
||||||
<!--
|
<!--
|
||||||
-->
|
-->
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ $(TARGET).srcs += $(SRC_SUBSYSTEMS)/navigation/nav_survey_rectangle.c $(SRC_SUBS
|
|||||||
$(TARGET).srcs += $(SRC_SUBSYSTEMS)/navigation/discsurvey.c
|
$(TARGET).srcs += $(SRC_SUBSYSTEMS)/navigation/discsurvey.c
|
||||||
$(TARGET).srcs += $(SRC_SUBSYSTEMS)/navigation/OSAMNav.c
|
$(TARGET).srcs += $(SRC_SUBSYSTEMS)/navigation/OSAMNav.c
|
||||||
$(TARGET).srcs += $(SRC_SUBSYSTEMS)/navigation/snav.c
|
$(TARGET).srcs += $(SRC_SUBSYSTEMS)/navigation/snav.c
|
||||||
$(TARGET).srcs += $(SRC_SUBSYSTEMS)/navigation/spiral.c
|
|
||||||
$(TARGET).srcs += $(SRC_SUBSYSTEMS)/navigation/poly_survey_adv.c
|
$(TARGET).srcs += $(SRC_SUBSYSTEMS)/navigation/poly_survey_adv.c
|
||||||
$(TARGET).srcs += $(SRC_SUBSYSTEMS)/navigation/gls.c
|
$(TARGET).srcs += $(SRC_SUBSYSTEMS)/navigation/gls.c
|
||||||
$(TARGET).srcs += $(SRC_SUBSYSTEMS)/navigation/border_line.c
|
$(TARGET).srcs += $(SRC_SUBSYSTEMS)/navigation/border_line.c
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<!DOCTYPE module SYSTEM "module.dtd">
|
||||||
|
|
||||||
|
<module name="nav_spiral" dir="nav">
|
||||||
|
<doc>
|
||||||
|
<description>
|
||||||
|
Fixedwing navigation in a spiral/helix.
|
||||||
|
creating a helix:
|
||||||
|
- start radius to end radius, increasing after reaching alphamax
|
||||||
|
- Alphamax is calculated from given segments
|
||||||
|
- IMPORTANT: numer of segments has to be larger than 2!
|
||||||
|
</description>
|
||||||
|
<define name="NAV_SPIRAL_MIN_CIRCLE_RADIUS" value="120" description="minium circle radius in meters"/>
|
||||||
|
</doc>
|
||||||
|
<header>
|
||||||
|
<file name="nav_spiral.h"/>
|
||||||
|
</header>
|
||||||
|
<makefile>
|
||||||
|
<file name="nav_spiral.c"/>
|
||||||
|
</makefile>
|
||||||
|
</module>
|
||||||
@@ -0,0 +1,172 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2011-2013 The Paparazzi Team
|
||||||
|
*
|
||||||
|
* This file is part of paparazzi.
|
||||||
|
*
|
||||||
|
* paparazzi is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* paparazzi is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with paparazzi; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file modules/nav/nav_spiral.c
|
||||||
|
*
|
||||||
|
* Fixedwing navigation in a spiral/helix.
|
||||||
|
*
|
||||||
|
* creating a helix:
|
||||||
|
* - start radius to end radius, increasing after reaching alphamax
|
||||||
|
* - Alphamax is calculated from given segments
|
||||||
|
* - IMPORTANT: numer of segments has to be larger than 2!
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "modules/nav/nav_spiral.h"
|
||||||
|
|
||||||
|
#include "subsystems/nav.h"
|
||||||
|
#include "state.h"
|
||||||
|
#include "autopilot.h"
|
||||||
|
#include "generated/flight_plan.h"
|
||||||
|
|
||||||
|
#ifdef DIGITAL_CAM
|
||||||
|
#include "modules/digital_cam/dc.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NAV_SPIRAL_MIN_CIRCLE_RADIUS
|
||||||
|
#define NAV_SPIRAL_MIN_CIRCLE_RADIUS 60
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct NavSpiral nav_spiral;
|
||||||
|
|
||||||
|
bool_t nav_spiral_start(uint8_t center_wp, uint8_t edge_wp, float radius_start, float radius_inc, float segments)
|
||||||
|
{
|
||||||
|
VECT2_COPY(nav_spiral.center, waypoints[center_wp]); // center of the helix
|
||||||
|
nav_spiral.center.z = waypoints[center_wp].a;
|
||||||
|
nav_spiral.radius_start = radius_start; // start radius of the helix
|
||||||
|
nav_spiral.segments = segments;
|
||||||
|
nav_spiral.radius_min = NAV_SPIRAL_MIN_CIRCLE_RADIUS;
|
||||||
|
if (nav_spiral.radius_start < nav_spiral.radius_min)
|
||||||
|
nav_spiral.radius_start = nav_spiral.radius_min;
|
||||||
|
nav_spiral.radius_increment = radius_inc; // multiplier for increasing the spiral
|
||||||
|
|
||||||
|
struct FloatVect2 edge;
|
||||||
|
VECT2_DIFF(edge, waypoints[edge_wp], nav_spiral.center);
|
||||||
|
|
||||||
|
FLOAT_VECT2_NORM(nav_spiral.radius, edge);
|
||||||
|
|
||||||
|
// get a copy of the current position
|
||||||
|
struct EnuCoor_f pos_enu;
|
||||||
|
memcpy(&pos_enu, stateGetPositionEnu_f(), sizeof(struct EnuCoor_f));
|
||||||
|
|
||||||
|
VECT3_DIFF(nav_spiral.trans_current, pos_enu, nav_spiral.center);
|
||||||
|
|
||||||
|
nav_spiral.dist_from_center = FLOAT_VECT3_NORM(nav_spiral.trans_current);
|
||||||
|
|
||||||
|
// nav_spiral.alpha_limit denotes angle, where the radius will be increased
|
||||||
|
nav_spiral.alpha_limit = 2*M_PI / nav_spiral.segments;
|
||||||
|
//current position
|
||||||
|
nav_spiral.fly_from.x = stateGetPositionEnu_f()->x;
|
||||||
|
nav_spiral.fly_from.y = stateGetPositionEnu_f()->y;
|
||||||
|
|
||||||
|
if(nav_spiral.dist_from_center > nav_spiral.radius)
|
||||||
|
nav_spiral.status = Outside;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool_t nav_spiral_run(void)
|
||||||
|
{
|
||||||
|
struct EnuCoor_f pos_enu;
|
||||||
|
memcpy(&pos_enu, stateGetPositionEnu_f(), sizeof(struct EnuCoor_f));
|
||||||
|
|
||||||
|
VECT2_DIFF(nav_spiral.trans_current, pos_enu, nav_spiral.center);
|
||||||
|
nav_spiral.dist_from_center = FLOAT_VECT3_NORM(nav_spiral.trans_current);
|
||||||
|
|
||||||
|
float DistanceStartEstim;
|
||||||
|
float CircleAlpha;
|
||||||
|
|
||||||
|
switch(nav_spiral.status)
|
||||||
|
{
|
||||||
|
case Outside:
|
||||||
|
//flys until center of the helix is reached an start helix
|
||||||
|
nav_route_xy(nav_spiral.fly_from.x, nav_spiral.fly_from.y, nav_spiral.center.x, nav_spiral.center.y);
|
||||||
|
// center reached?
|
||||||
|
if (nav_approaching_xy(nav_spiral.center.x, nav_spiral.center.y, nav_spiral.fly_from.x, nav_spiral.fly_from.y, 0)) {
|
||||||
|
// nadir image
|
||||||
|
#ifdef DIGITAL_CAM
|
||||||
|
dc_send_command(DC_SHOOT);
|
||||||
|
#endif
|
||||||
|
nav_spiral.status = StartCircle;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case StartCircle:
|
||||||
|
// Starts helix
|
||||||
|
// storage of current coordinates
|
||||||
|
// calculation needed, State switch to Circle
|
||||||
|
nav_circle_XY(nav_spiral.center.y, nav_spiral.center.y, nav_spiral.radius_start);
|
||||||
|
if(nav_spiral.dist_from_center >= nav_spiral.radius_start){
|
||||||
|
VECT2_COPY(nav_spiral.last_circle, pos_enu);
|
||||||
|
nav_spiral.status = Circle;
|
||||||
|
// Start helix
|
||||||
|
#ifdef DIGITAL_CAM
|
||||||
|
dc_Circle(360/nav_spiral.segments);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Circle: {
|
||||||
|
nav_circle_XY(nav_spiral.center.x, nav_spiral.center.y, nav_spiral.radius_start);
|
||||||
|
// Trigonometrische Berechnung des bereits geflogenen Winkels alpha
|
||||||
|
// equation:
|
||||||
|
// alpha = 2 * asin ( |Starting position angular - current positon| / (2* nav_spiral.radius_start)
|
||||||
|
// if alphamax already reached, increase radius.
|
||||||
|
|
||||||
|
//DistanceStartEstim = |Starting position angular - current positon|
|
||||||
|
struct FloatVect2 pos_diff;
|
||||||
|
VECT2_DIFF(pos_diff, nav_spiral.last_circle, pos_enu);
|
||||||
|
FLOAT_VECT2_NORM(DistanceStartEstim, pos_diff);
|
||||||
|
CircleAlpha = (2.0 * asin (DistanceStartEstim / (2 * nav_spiral.radius_start)));
|
||||||
|
if (CircleAlpha >= nav_spiral.alpha_limit) {
|
||||||
|
VECT2_COPY(nav_spiral.last_circle, pos_enu);
|
||||||
|
nav_spiral.status = IncSpiral;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IncSpiral:
|
||||||
|
// increasing circle radius as long as it is smaller than max helix radius
|
||||||
|
if(nav_spiral.radius_start + nav_spiral.radius_increment < nav_spiral.radius)
|
||||||
|
{
|
||||||
|
nav_spiral.radius_start = nav_spiral.radius_start + nav_spiral.radius_increment;
|
||||||
|
#ifdef DIGITAL_CAM
|
||||||
|
if (dc_cam_tracing) {
|
||||||
|
// calculating Cam angle for camera alignment
|
||||||
|
nav_spiral.trans_current.z = pos_enu.z - nav_spiral.center.z;
|
||||||
|
dc_cam_angle = atan(nav_spiral.radius_start/nav_spiral.trans_current.z) * 180 / M_PI;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nav_spiral.radius_start = nav_spiral.radius;
|
||||||
|
#ifdef DIGITAL_CAM
|
||||||
|
// Stopps DC
|
||||||
|
dc_stop();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
nav_spiral.status = Circle;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
NavVerticalAutoThrottleMode(0.); /* No pitch */
|
||||||
|
NavVerticalAltitudeMode(nav_spiral.center.z, 0.); /* No preclimb */
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2011-2013 The Paparazzi Team
|
||||||
|
*
|
||||||
|
* This file is part of paparazzi.
|
||||||
|
*
|
||||||
|
* paparazzi is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* paparazzi is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with paparazzi; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file modules/nav/nav_spiral.h
|
||||||
|
*
|
||||||
|
* Fixedwing navigation in a spiral/helix.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NAV_SPIRAL_H
|
||||||
|
#define NAV_SPIRAL_H
|
||||||
|
|
||||||
|
#include "std.h"
|
||||||
|
#include "math/pprz_algebra_float.h"
|
||||||
|
|
||||||
|
enum SpiralStatus { Outside, StartCircle, Circle, IncSpiral };
|
||||||
|
|
||||||
|
struct NavSpiral {
|
||||||
|
struct FloatVect3 trans_current;
|
||||||
|
struct FloatVect2 fly_from;
|
||||||
|
struct FloatVect2 last_circle;
|
||||||
|
struct FloatVect3 center;
|
||||||
|
float dist_from_center;
|
||||||
|
float alpha_limit;
|
||||||
|
float segments;
|
||||||
|
float radius;
|
||||||
|
float radius_min;
|
||||||
|
float radius_start;
|
||||||
|
float radius_increment;
|
||||||
|
enum SpiralStatus status;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct NavSpiral nav_spiral;
|
||||||
|
|
||||||
|
extern bool_t nav_spiral_run(void);
|
||||||
|
extern bool_t nav_spiral_start(uint8_t center_wp, uint8_t edge_wp, float radius_start,
|
||||||
|
float radius_inc, float segments);
|
||||||
|
|
||||||
|
#endif // NAV_SPIRAL_H
|
||||||
@@ -1,193 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2011 The Paparazzi Team
|
|
||||||
*
|
|
||||||
* This file is part of paparazzi.
|
|
||||||
*
|
|
||||||
* paparazzi is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* paparazzi is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with paparazzi; see the file COPYING. If not, write to
|
|
||||||
* the Free Software Foundation, 59 Temple Place - Suite 330,
|
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file subsystems/navigation/spiral.c
|
|
||||||
*
|
|
||||||
* Fixedwing navigation in a spiral/helix from Uni Stuttgart.
|
|
||||||
*
|
|
||||||
* creating a helix:
|
|
||||||
* - start radius to end radius, increasing after reaching alphamax
|
|
||||||
* - Alphamax is calculated from given segments
|
|
||||||
* - IMPORTANT: numer of segments has to be larger than 2!
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "subsystems/navigation/spiral.h"
|
|
||||||
|
|
||||||
#include "subsystems/nav.h"
|
|
||||||
#include "state.h"
|
|
||||||
#include "autopilot.h"
|
|
||||||
#include "generated/flight_plan.h"
|
|
||||||
|
|
||||||
#ifdef DIGITAL_CAM
|
|
||||||
#include "modules/digital_cam/dc.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum SpiralStatus { Outside, StartCircle, Circle, IncSpiral };
|
|
||||||
static enum SpiralStatus CSpiralStatus;
|
|
||||||
// static float SpiralTheta;
|
|
||||||
// static float Fly2X;
|
|
||||||
// static float Fly2Y;
|
|
||||||
|
|
||||||
static float FlyFromX;
|
|
||||||
static float FlyFromY;
|
|
||||||
static float TransCurrentX;
|
|
||||||
static float TransCurrentY;
|
|
||||||
static float TransCurrentZ;
|
|
||||||
static float EdgeCurrentX;
|
|
||||||
static float EdgeCurrentY;
|
|
||||||
static float LastCircleX;
|
|
||||||
static float LastCircleY;
|
|
||||||
static float DistanceFromCenter;
|
|
||||||
static float Spiralradius;
|
|
||||||
static uint8_t Center;
|
|
||||||
static uint8_t Edge;
|
|
||||||
static float SRad;
|
|
||||||
static float IRad;
|
|
||||||
static float Alphalimit;
|
|
||||||
static float Segmente;
|
|
||||||
static float ZPoint;
|
|
||||||
static float nav_radius_min;
|
|
||||||
|
|
||||||
#ifndef MIN_CIRCLE_RADIUS
|
|
||||||
#define MIN_CIRCLE_RADIUS 120
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
bool_t InitializeSpiral(uint8_t CenterWP, uint8_t EdgeWP, float StartRad, float IncRad, float Segments, float ZKoord)
|
|
||||||
{
|
|
||||||
Center = CenterWP; // center of the helix
|
|
||||||
Edge = EdgeWP; // edge point on the maximaum radius
|
|
||||||
SRad = StartRad; // start radius of the helix
|
|
||||||
Segmente = Segments;
|
|
||||||
ZPoint = ZKoord;
|
|
||||||
nav_radius_min = MIN_CIRCLE_RADIUS;
|
|
||||||
if (SRad < nav_radius_min) SRad = nav_radius_min;
|
|
||||||
IRad = IncRad; // multiplier for increasing the spiral
|
|
||||||
|
|
||||||
EdgeCurrentX = WaypointX(Edge) - WaypointX(Center);
|
|
||||||
EdgeCurrentY = WaypointY(Edge) - WaypointY(Center);
|
|
||||||
|
|
||||||
Spiralradius = sqrt(EdgeCurrentX*EdgeCurrentX+EdgeCurrentY*EdgeCurrentY);
|
|
||||||
|
|
||||||
TransCurrentX = stateGetPositionEnu_f()->x - WaypointX(Center);
|
|
||||||
TransCurrentY = stateGetPositionEnu_f()->y - WaypointY(Center);
|
|
||||||
TransCurrentZ = stateGetPositionEnu_f()->z - ZPoint;
|
|
||||||
DistanceFromCenter = sqrt(TransCurrentX*TransCurrentX+TransCurrentY*TransCurrentY);
|
|
||||||
|
|
||||||
// SpiralTheta = atan2(TransCurrentY,TransCurrentX);
|
|
||||||
// Fly2X = Spiralradius*cos(SpiralTheta+M_PI)+WaypointX(Center);
|
|
||||||
// Fly2Y = Spiralradius*sin(SpiralTheta+M_PI)+WaypointY(Center);
|
|
||||||
|
|
||||||
// Alphalimit denotes angle, where the radius will be increased
|
|
||||||
Alphalimit = 2*M_PI / Segments;
|
|
||||||
//current position
|
|
||||||
FlyFromX = stateGetPositionEnu_f()->x;
|
|
||||||
FlyFromY = stateGetPositionEnu_f()->y;
|
|
||||||
|
|
||||||
if(DistanceFromCenter > Spiralradius)
|
|
||||||
CSpiralStatus = Outside;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool_t SpiralNav(void)
|
|
||||||
{
|
|
||||||
TransCurrentX = stateGetPositionEnu_f()->x - WaypointX(Center);
|
|
||||||
TransCurrentY = stateGetPositionEnu_f()->y - WaypointY(Center);
|
|
||||||
DistanceFromCenter = sqrt(TransCurrentX*TransCurrentX+TransCurrentY*TransCurrentY);
|
|
||||||
|
|
||||||
float DistanceStartEstim;
|
|
||||||
float CircleAlpha;
|
|
||||||
|
|
||||||
switch(CSpiralStatus)
|
|
||||||
{
|
|
||||||
case Outside:
|
|
||||||
//flys until center of the helix is reached an start helix
|
|
||||||
nav_route_xy(FlyFromX,FlyFromY,WaypointX(Center), WaypointY(Center));
|
|
||||||
// center reached?
|
|
||||||
if (nav_approaching_xy(WaypointX(Center), WaypointY(Center), FlyFromX, FlyFromY, 0)) {
|
|
||||||
// nadir image
|
|
||||||
#ifdef DIGITAL_CAM
|
|
||||||
dc_send_command(DC_SHOOT);
|
|
||||||
#endif
|
|
||||||
CSpiralStatus = StartCircle;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case StartCircle:
|
|
||||||
// Starts helix
|
|
||||||
// storage of current coordinates
|
|
||||||
// calculation needed, State switch to Circle
|
|
||||||
nav_circle_XY(WaypointX(Center), WaypointY(Center), SRad);
|
|
||||||
if(DistanceFromCenter >= SRad){
|
|
||||||
LastCircleX = stateGetPositionEnu_f()->x;
|
|
||||||
LastCircleY = stateGetPositionEnu_f()->y;
|
|
||||||
CSpiralStatus = Circle;
|
|
||||||
// Start helix
|
|
||||||
#ifdef DIGITAL_CAM
|
|
||||||
dc_Circle(360/Segmente);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Circle: {
|
|
||||||
nav_circle_XY(WaypointX(Center), WaypointY(Center), SRad);
|
|
||||||
// Trigonometrische Berechnung des bereits geflogenen Winkels alpha
|
|
||||||
// equation:
|
|
||||||
// alpha = 2 * asin ( |Starting position angular - current positon| / (2* SRad)
|
|
||||||
// if alphamax already reached, increase radius.
|
|
||||||
|
|
||||||
//DistanceStartEstim = |Starting position angular - current positon|
|
|
||||||
DistanceStartEstim = sqrt (((LastCircleX-stateGetPositionEnu_f()->x)*(LastCircleX-stateGetPositionEnu_f()->x))
|
|
||||||
+ ((LastCircleY-stateGetPositionEnu_f()->y)*(LastCircleY-stateGetPositionEnu_f()->y)));
|
|
||||||
CircleAlpha = (2.0 * asin (DistanceStartEstim / (2 * SRad)));
|
|
||||||
if (CircleAlpha >= Alphalimit) {
|
|
||||||
LastCircleX = stateGetPositionEnu_f()->x;
|
|
||||||
LastCircleY = stateGetPositionEnu_f()->y;
|
|
||||||
CSpiralStatus = IncSpiral;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case IncSpiral:
|
|
||||||
// increasing circle radius as long as it is smaller than max helix radius
|
|
||||||
if(SRad + IRad < Spiralradius)
|
|
||||||
{
|
|
||||||
SRad = SRad + IRad;
|
|
||||||
#ifdef DIGITAL_CAM
|
|
||||||
if (dc_cam_tracing) {
|
|
||||||
// calculating Cam angle for camera alignment
|
|
||||||
TransCurrentZ = stateGetPositionEnu_f()->z - ZPoint;
|
|
||||||
dc_cam_angle = atan(SRad/TransCurrentZ) * 180 / M_PI;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
SRad = Spiralradius;
|
|
||||||
#ifdef DIGITAL_CAM
|
|
||||||
// Stopps DC
|
|
||||||
dc_stop();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
CSpiralStatus = Circle;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2011 The Paparazzi Team
|
|
||||||
*
|
|
||||||
* This file is part of paparazzi.
|
|
||||||
*
|
|
||||||
* paparazzi is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* paparazzi is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with paparazzi; see the file COPYING. If not, write to
|
|
||||||
* the Free Software Foundation, 59 Temple Place - Suite 330,
|
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file subsystems/navigation/spiral.h
|
|
||||||
*
|
|
||||||
* Fixedwing navigation in a spiral/helix from Uni Stuttgart.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef SPIRAL_H
|
|
||||||
#define SPIRAL_H
|
|
||||||
|
|
||||||
#include "std.h"
|
|
||||||
|
|
||||||
extern bool_t SpiralNav(void);
|
|
||||||
extern bool_t InitializeSpiral(uint8_t CenterWP, uint8_t EdgeWP, float StartRad, float IncRad,
|
|
||||||
float Segments, float ZKoord );
|
|
||||||
|
|
||||||
#endif // SPIRAL_H
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user