paparazzi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[paparazzi-commits] [4879]


From: OSAM-UAV Team
Subject: [paparazzi-commits] [4879]
Date: Mon, 26 Apr 2010 22:01:51 +0000

Revision: 4879
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=4879
Author:   osam
Date:     2010-04-26 22:01:51 +0000 (Mon, 26 Apr 2010)
Log Message:
-----------


Modified Paths:
--------------
    paparazzi3/trunk/sw/airborne/OSAMNav.c
    paparazzi3/trunk/sw/airborne/OSAMNav.h

Modified: paparazzi3/trunk/sw/airborne/OSAMNav.c
===================================================================
--- paparazzi3/trunk/sw/airborne/OSAMNav.c      2010-04-26 01:29:25 UTC (rev 
4878)
+++ paparazzi3/trunk/sw/airborne/OSAMNav.c      2010-04-26 22:01:51 UTC (rev 
4879)
@@ -182,7 +182,7 @@
                throttlePy = 
-sqrt((TDistance*TDistance)-(throttlePx*throttlePx));
 
        //Find ThrottleLine
-       ThrottleSlope = -MLaunch;
+       ThrottleSlope = tan(atan2(Currenty,Currentx)+(3.14/2));
        ThrottleB = (throttlePy - (ThrottleSlope*throttlePx));
 
        //Determine whether the UAV is below or above the throttle line
@@ -209,15 +209,15 @@
        float Currenty = estimator_y-throttlePy;
        bool_t CurrentAboveLine;
        float ThrottleB;
-       
-       NavVerticalAutoThrottleMode(0);
-       NavVerticalAltitudeMode(BungeeAlt+Takeoff_Height, 0.);
 
        switch(CTakeoffStatus)
        {
        case Launch:
-               //Follow Launch Line
+               //Follow Launch Line    
+               NavVerticalAutoThrottleMode(0);
+               NavVerticalAltitudeMode(BungeeAlt+Takeoff_Height, 0.);
                nav_route_xy(initialx,initialy,throttlePx,throttlePy);
+               
                kill_throttle = 1;
 
                //recalculate lines if below min speed
@@ -230,7 +230,7 @@
                        Currentx = initialx-(waypoints[BungeeWaypoint].x);
                        Currenty = initialy-(waypoints[BungeeWaypoint].y);
 
-                       //Find Launch line slope and Throttle line slope
+                       //Find Launch line slope
                        float MLaunch = Currenty/Currentx;
        
                        //Find Throttle Point (the point where the throttle 
line and launch line intersect)
@@ -245,9 +245,15 @@
                                throttlePy = 
-sqrt((TDistance*TDistance)-(throttlePx*throttlePx));
 
                        //Find ThrottleLine
-                       ThrottleSlope = -MLaunch;
+                       ThrottleSlope = tan(atan2(Currenty,Currentx)+(3.14/2));
                        ThrottleB = (throttlePy - (ThrottleSlope*throttlePx));
 
+                       //Determine whether the UAV is below or above the 
throttle line
+                       if(Currenty > ((ThrottleSlope*Currentx)+ThrottleB))
+                               AboveLine = TRUE;
+                       else
+                               AboveLine = FALSE;      
+
                        //Translate the throttle point back
                        throttlePx = throttlePx+(waypoints[BungeeWaypoint].x);
                        throttlePy = throttlePy+(waypoints[BungeeWaypoint].y);
@@ -264,14 +270,17 @@
                {
                        CTakeoffStatus = Throttle;
                        kill_throttle = 0;
+                       nav_init_stage();
                }
                break;
        case Throttle:
                //Follow Launch Line
+               NavVerticalAutoThrottleMode(AGR_CLIMB_PITCH);
+               NavVerticalThrottleMode(9600*(1));
                nav_route_xy(initialx,initialy,throttlePx,throttlePy);
                kill_throttle = 0;
                
-               if((estimator_z > BungeeAlt+Takeoff_Height) && 
(estimator_hspeed_mod > Takeoff_Speed))
+               if((estimator_z > BungeeAlt+Takeoff_Height-10) && 
(estimator_hspeed_mod > Takeoff_Speed))
                {
                        CTakeoffStatus = Finished;
                        return FALSE;
@@ -336,7 +345,7 @@
        CSurveyStatus = Init;
 
        //Don't initialize if Polygon is too big or if the orientation is not 
between 0 and 90
-       if(Size <= PolygonSize && Orientation >= 0 && Orientation <= 90)
+       if(Size <= PolygonSize && Orientation >= -90 && Orientation <= 90)
        {
                //Initialize Corners
                for(i = 0; i < Size; i++)
@@ -690,7 +699,6 @@
        return TRUE;
 }
 
-
 /************** Vertical Raster **********************************************/
 
 /** Copy of nav line. The only difference is it changes altitude every sweep, 
but doesn't come out of circle until
@@ -764,7 +772,7 @@
     break;
   case LTC2:
     nav_circle_XY(l2_c2.x, l2_c2.y, -radius);
-    if (NavQdrCloseTo(DegOfRad(qdr_out_2_2)+10) && estimator_z >= 
(waypoints[l1].a-5)) {
+    if (NavQdrCloseTo(DegOfRad(qdr_out_2_2)+10) && estimator_z >= 
(waypoints[l1].a-10)) {
       line_status = LQC22;
       nav_init_stage();
     }
@@ -808,7 +816,277 @@
   return TRUE; /* This pattern never ends */
 }
 
+/************** SkidLanding **********************************************/
 /*
+Landing Routine
+ */
+ 
+enum LandingStatus { CircleDown, LandingWait, Final, Approach };
+static enum LandingStatus CLandingStatus;
+static uint8_t AFWaypoint;
+static uint8_t TDWaypoint;
+static float LandRadius;
+static struct Point2D LandCircle;
+static float LandAppAlt;
+static float LandCircleQDR;
+static float ApproachQDR;
+static float FinalLandAltitude;
+static uint8_t FinalLandCount;
+
+bool_t InitializeSkidLanding(uint8_t AFWP, uint8_t TDWP, float radius)
+{
+       AFWaypoint = AFWP;
+       TDWaypoint = TDWP;
+       CLandingStatus = CircleDown;
+       LandRadius = radius;
+       LandAppAlt = estimator_z;
+       FinalLandAltitude = Landing_FinalHeight;
+       FinalLandCount = 1;
+       waypoints[AFWaypoint].a = waypoints[TDWaypoint].a + Landing_AFHeight;
+       
+       float x_0 = waypoints[TDWaypoint].x - waypoints[AFWaypoint].x;
+       float y_0 = waypoints[TDWaypoint].y - waypoints[AFWaypoint].y;  
+
+       /* Unit vector from AF to TD */
+       float d = sqrt(x_0*x_0+y_0*y_0);
+       float x_1 = x_0 / d;
+       float y_1 = y_0 / d;
+
+       LandCircle.x = waypoints[AFWaypoint].x + y_1 * LandRadius;
+       LandCircle.y = waypoints[AFWaypoint].y - x_1 * LandRadius;      
+       
+       LandCircleQDR = atan2(waypoints[AFWaypoint].x-LandCircle.x, 
waypoints[AFWaypoint].y-LandCircle.y);
+
+       if(LandRadius > 0)
+       {
+               ApproachQDR = LandCircleQDR-RadOfDeg(90);
+               LandCircleQDR = LandCircleQDR-RadOfDeg(45);
+       }
+       else
+       {
+               ApproachQDR = LandCircleQDR+RadOfDeg(90);
+               LandCircleQDR = LandCircleQDR+RadOfDeg(45);
+       }
+       
+       
+       return FALSE;
+}
+
+bool_t SkidLanding(void)
+{
+       switch(CLandingStatus)
+       {
+       case CircleDown:
+               NavVerticalAutoThrottleMode(0); /* No pitch */
+               
+               if(NavCircleCount() < .1)
+               {
+                       NavVerticalAltitudeMode(LandAppAlt, 0);
+               }
+               else
+                       NavVerticalAltitudeMode(waypoints[AFWaypoint].a, 0);
+                       
+               nav_circle_XY(LandCircle.x, LandCircle.y, LandRadius);  
+               
+               if(estimator_z < waypoints[AFWaypoint].a + 5)
+               {
+                       CLandingStatus = LandingWait;
+                       nav_init_stage();
+               }
+               
+       break;
+       
+       case LandingWait:
+               NavVerticalAutoThrottleMode(0); /* No pitch */
+               NavVerticalAltitudeMode(waypoints[AFWaypoint].a, 0);
+               nav_circle_XY(LandCircle.x, LandCircle.y, LandRadius);
+               
+               if(NavCircleCount() > 0.5 && 
NavQdrCloseTo(DegOfRad(ApproachQDR)))
+               {
+                       CLandingStatus = Approach;
+                       nav_init_stage();
+               }
+       break;
+       
+       case Approach:
+               kill_throttle = 1;
+               NavVerticalAutoThrottleMode(0); /* No pitch */
+               NavVerticalAltitudeMode(waypoints[AFWaypoint].a, 0);
+               nav_circle_XY(LandCircle.x, LandCircle.y, LandRadius);
+               
+               if(NavQdrCloseTo(DegOfRad(LandCircleQDR)))
+               {
+                       CLandingStatus = Final;
+                       nav_init_stage();
+               }
+       break;
+       
+       case Final:
+               kill_throttle = 1;
+               NavVerticalAutoThrottleMode(0);
+               
NavVerticalAltitudeMode(waypoints[TDWaypoint].a+FinalLandAltitude, 0);
+               
nav_route_xy(waypoints[AFWaypoint].x,waypoints[AFWaypoint].y,waypoints[TDWaypoint].x,waypoints[TDWaypoint].y);
+               if(stage_time >= Landing_FinalStageTime*FinalLandCount)
+               {
+                       FinalLandAltitude = FinalLandAltitude/2;
+                       FinalLandCount++;
+               }
+       break;
+       
+       default:
+       
+       break;
+       }
+       return TRUE;
+}
+
+enum FLStatus { FLInitialize, FLCircleS, FLLine, FLFinished };
+static enum FLStatus CFLStatus = FLInitialize;
+static struct Point2D FLCircle;
+static struct Point2D FLFROMWP;
+static struct Point2D FLTOWP;
+static float FLQDR;
+static float FLRadius;
+
+bool_t FlightLine(uint8_t From_WP, uint8_t To_WP, float radius, float 
Space_Before, float Space_After)
+{
+       struct Point2D V;
+       struct Point2D P;
+       float dv;
+
+       switch(CFLStatus)
+       {
+       case FLInitialize:
+
+               //Translate WPs so From_WP is origin
+               V.x = waypoints[To_WP].x - waypoints[From_WP].x;
+               V.y = waypoints[To_WP].y - waypoints[From_WP].y;
+
+               //Record Aircraft Position
+               P.x = estimator_x;
+               P.y = estimator_y;
+
+               //Rotate Aircraft Position so V is aligned with x axis
+               TranslateAndRotateFromWorld(&P, atan2(V.y,V.x), 
waypoints[From_WP].x, waypoints[From_WP].y);
+
+               //Find which side of the flight line the aircraft is on
+               if(P.y > 0)
+                       FLRadius = -radius;
+               else
+                       FLRadius = radius;
+
+               //Find unit vector of V
+               dv = sqrt(V.x*V.x+V.y*V.y);
+               V.x = V.x / dv;
+               V.y = V.y / dv;
+
+               //Find begin and end points of flight line
+               FLFROMWP.x = -V.x*Space_Before;
+               FLFROMWP.y = -V.y*Space_Before;
+
+               FLTOWP.x = V.x*(dv+Space_After);
+               FLTOWP.y = V.y*(dv+Space_After);
+
+               //Find center of circle
+               FLCircle.x = FLFROMWP.x + V.y * FLRadius;
+               FLCircle.y = FLFROMWP.y - V.x * FLRadius;
+
+               //Find the angle to exit the circle
+               FLQDR = atan2(FLFROMWP.x-FLCircle.x, FLFROMWP.y-FLCircle.y);
+
+               //Translate back
+               FLFROMWP.x = FLFROMWP.x + waypoints[From_WP].x;
+               FLFROMWP.y = FLFROMWP.y + waypoints[From_WP].y;
+
+               FLTOWP.x = FLTOWP.x + waypoints[From_WP].x;
+               FLTOWP.y = FLTOWP.y + waypoints[From_WP].y;
+
+               FLCircle.x = FLCircle.x + waypoints[From_WP].x;
+               FLCircle.y = FLCircle.y + waypoints[From_WP].y;
+
+               CFLStatus = FLCircleS;
+               nav_init_stage();
+
+               break;  
+
+       case FLCircleS:
+
+               NavVerticalAutoThrottleMode(0); /* No pitch */
+               NavVerticalAltitudeMode(waypoints[From_WP].a, 0);
+               
+               nav_circle_XY(FLCircle.x, FLCircle.y, FLRadius);        
+       
+               if(NavCircleCount() > 0.2 && NavQdrCloseTo(DegOfRad(FLQDR)))
+               {
+                       CFLStatus = FLLine;
+                       nav_init_stage();
+               }
+               break;  
+       
+       case FLLine:
+
+               NavVerticalAutoThrottleMode(0); /* No pitch */
+               NavVerticalAltitudeMode(waypoints[From_WP].a, 0);
+               nav_route_xy(FLFROMWP.x,FLFROMWP.y,FLTOWP.x,FLTOWP.y);
+
+               if(nav_approaching_xy(FLTOWP.x,FLTOWP.y,FLFROMWP.x,FLFROMWP.y, 
0))
+               {
+                       CFLStatus = FLFinished;
+                       nav_init_stage();
+               }                       
+       break;  
+
+       case FLFinished:
+               CFLStatus = FLInitialize;
+               nav_init_stage();
+               return FALSE; 
+       break;  
+
+       default:        
+       break;
+       }
+       return TRUE;
+
+}
+
+static uint8_t FLBlockCount = 0;
+
+bool_t FlightLineBlock(uint8_t First_WP, uint8_t Last_WP, float radius, float 
Space_Before, float Space_After)
+{
+       if(First_WP < Last_WP)
+       {       
+               FlightLine(First_WP+FLBlockCount, First_WP+FLBlockCount+1, 
radius, Space_Before, Space_After);
+
+               if(CFLStatus == FLInitialize)
+               {
+                       FLBlockCount++;
+                       if(First_WP+FLBlockCount >= Last_WP)
+                       {
+                               FLBlockCount = 0;
+                               return FALSE;
+                       }
+               }
+       }
+       else    
+       {
+               FlightLine(First_WP-FLBlockCount, First_WP-FLBlockCount-1, 
radius, Space_Before, Space_After);          
+
+               if(CFLStatus == FLInitialize)
+               {
+                       FLBlockCount++;
+                       if(First_WP-FLBlockCount <= Last_WP)
+                       {
+                               FLBlockCount = 0;
+                               return FALSE;
+                       }
+               }
+       }
+
+       return TRUE;
+}
+
+
+/*
 Translates point so (transX, transY) are (0,0) then rotates the point around z 
by Zrot
 */
 void TranslateAndRotateFromWorld(struct Point2D *p, float Zrot, float transX, 
float transY)

Modified: paparazzi3/trunk/sw/airborne/OSAMNav.h
===================================================================
--- paparazzi3/trunk/sw/airborne/OSAMNav.h      2010-04-26 01:29:25 UTC (rev 
4878)
+++ paparazzi3/trunk/sw/airborne/OSAMNav.h      2010-04-26 22:01:51 UTC (rev 
4879)
@@ -16,6 +16,9 @@
 extern bool_t InitializeBungeeTakeoff(uint8_t BungeeWP);
 extern bool_t BungeeTakeoff(void);
 
+extern bool_t InitializeSkidLanding(uint8_t AFWP, uint8_t TDWP, float radius);
+extern bool_t SkidLanding(void);
+
 #define PolygonSize 10
 #define MaxFloat   1000000000
 #define MinFloat   -1000000000
@@ -25,6 +28,12 @@
 extern uint16_t PolySurveySweepNum;
 extern uint16_t PolySurveySweepBackNum;
 
+extern bool_t InitializeVerticalRaster( void );
+extern bool_t VerticalRaster(uint8_t wp1, uint8_t wp2, float radius, float 
AltSweep);
+
+extern bool_t FlightLine(uint8_t From_WP, uint8_t To_WP, float radius, float 
Space_Before, float Space_After);
+extern bool_t FlightLineBlock(uint8_t First_WP, uint8_t Last_WP, float radius, 
float Space_Before, float Space_After);
+
 void TranslateAndRotateFromWorld(struct Point2D *p, float Zrot, float transX, 
float transY);
 void RotateAndTranslateToWorld(struct Point2D *p, float Zrot, float transX, 
float transY);
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]