Moved updateGPSRescueState to imuUpdateAttitude. gps_rescue.c tidy.

This commit is contained in:
Curtis Bangert 2018-06-13 11:17:21 -04:00
parent 11d8171c36
commit 953e2ad0e9
3 changed files with 93 additions and 91 deletions

View File

@ -924,10 +924,6 @@ static FAST_CODE_NOINLINE void subTaskMainSubprocesses(timeUs_t currentTimeUs)
} }
#endif #endif
#ifdef USE_GPS_RESCUE
updateGPSRescueState();
#endif
#ifdef USE_SDCARD #ifdef USE_SDCARD
afatfs_poll(); afatfs_poll();
#endif #endif

View File

@ -108,80 +108,82 @@ void updateGPSRescueState(void)
sensorUpdate(); sensorUpdate();
switch (rescueState.phase) { switch (rescueState.phase) {
case RESCUE_IDLE: case RESCUE_IDLE:
idleTasks(); idleTasks();
break; break;
case RESCUE_INITIALIZE: case RESCUE_INITIALIZE:
if (hoverThrottle == 0) { //no actual throttle data yet, let's use the default. if (hoverThrottle == 0) { //no actual throttle data yet, let's use the default.
hoverThrottle = gpsRescueConfig()->throttleHover; hoverThrottle = gpsRescueConfig()->throttleHover;
} }
rescueState.phase = RESCUE_ATTAIN_ALT; rescueState.phase = RESCUE_ATTAIN_ALT;
FALLTHROUGH; FALLTHROUGH;
case RESCUE_ATTAIN_ALT: case RESCUE_ATTAIN_ALT:
// Get to a safe altitude at a low velocity ASAP // Get to a safe altitude at a low velocity ASAP
if (ABS(rescueState.intent.targetAltitude - rescueState.sensor.currentAltitude) < 1000) { if (ABS(rescueState.intent.targetAltitude - rescueState.sensor.currentAltitude) < 1000) {
rescueState.phase = RESCUE_CROSSTRACK; rescueState.phase = RESCUE_CROSSTRACK;
} }
rescueState.intent.targetGroundspeed = 500; rescueState.intent.targetGroundspeed = 500;
rescueState.intent.targetAltitude = MAX(gpsRescueConfig()->initialAltitude * 100, rescueState.sensor.maxAltitude + 1500); rescueState.intent.targetAltitude = MAX(gpsRescueConfig()->initialAltitude * 100, rescueState.sensor.maxAltitude + 1500);
rescueState.intent.crosstrack = true; rescueState.intent.crosstrack = true;
rescueState.intent.minAngleDeg = 10; rescueState.intent.minAngleDeg = 10;
rescueState.intent.maxAngleDeg = 15; rescueState.intent.maxAngleDeg = 15;
break; break;
case RESCUE_CROSSTRACK: case RESCUE_CROSSTRACK:
if (rescueState.sensor.distanceToHome < gpsRescueConfig()->descentDistance) { if (rescueState.sensor.distanceToHome < gpsRescueConfig()->descentDistance) {
rescueState.phase = RESCUE_LANDING_APPROACH; rescueState.phase = RESCUE_LANDING_APPROACH;
} }
// We can assume at this point that we are at or above our RTH height, so we need to try and point to home and tilt while maintaining alt // We can assume at this point that we are at or above our RTH height, so we need to try and point to home and tilt while maintaining alt
// Is our altitude way off? We should probably kick back to phase RESCUE_ATTAIN_ALT // Is our altitude way off? We should probably kick back to phase RESCUE_ATTAIN_ALT
rescueState.intent.targetGroundspeed = gpsRescueConfig()->rescueGroundspeed; rescueState.intent.targetGroundspeed = gpsRescueConfig()->rescueGroundspeed;
rescueState.intent.targetAltitude = MAX(gpsRescueConfig()->initialAltitude * 100, rescueState.sensor.maxAltitude + 1500); rescueState.intent.targetAltitude = MAX(gpsRescueConfig()->initialAltitude * 100, rescueState.sensor.maxAltitude + 1500);
rescueState.intent.crosstrack = true; rescueState.intent.crosstrack = true;
rescueState.intent.minAngleDeg = 15; rescueState.intent.minAngleDeg = 15;
rescueState.intent.maxAngleDeg = gpsRescueConfig()->angle; rescueState.intent.maxAngleDeg = gpsRescueConfig()->angle;
break; break;
case RESCUE_LANDING_APPROACH: case RESCUE_LANDING_APPROACH:
// We are getting close to home in the XY plane, get Z where it needs to be to move to landing phase // We are getting close to home in the XY plane, get Z where it needs to be to move to landing phase
if (rescueState.sensor.distanceToHome < 10 && rescueState.sensor.currentAltitude <= 1000) { if (rescueState.sensor.distanceToHome < 10 && rescueState.sensor.currentAltitude <= 1000) {
rescueState.phase = RESCUE_LANDING; rescueState.phase = RESCUE_LANDING;
} }
// Only allow new altitude and new speed to be equal or lower than the current values (to prevent parabolic movement on overshoot) // Only allow new altitude and new speed to be equal or lower than the current values (to prevent parabolic movement on overshoot)
int32_t newAlt = gpsRescueConfig()->initialAltitude * 100 * rescueState.sensor.distanceToHome / gpsRescueConfig()->descentDistance; int32_t newAlt = gpsRescueConfig()->initialAltitude * 100 * rescueState.sensor.distanceToHome / gpsRescueConfig()->descentDistance;
int32_t newSpeed = gpsRescueConfig()->rescueGroundspeed * rescueState.sensor.distanceToHome / gpsRescueConfig()->descentDistance; int32_t newSpeed = gpsRescueConfig()->rescueGroundspeed * rescueState.sensor.distanceToHome / gpsRescueConfig()->descentDistance;
rescueState.intent.targetAltitude = constrain(newAlt, 100, rescueState.intent.targetAltitude); rescueState.intent.targetAltitude = constrain(newAlt, 100, rescueState.intent.targetAltitude);
rescueState.intent.targetGroundspeed = constrain(newSpeed, 100, rescueState.intent.targetGroundspeed); rescueState.intent.targetGroundspeed = constrain(newSpeed, 100, rescueState.intent.targetGroundspeed);
rescueState.intent.crosstrack = true; rescueState.intent.crosstrack = true;
rescueState.intent.minAngleDeg = 10; rescueState.intent.minAngleDeg = 10;
rescueState.intent.maxAngleDeg = 20; rescueState.intent.maxAngleDeg = 20;
break; break;
case RESCUE_LANDING: case RESCUE_LANDING:
// We have reached the XYZ envelope to be considered at "home". We need to land gently and check our accelerometer for abnormal data. // We have reached the XYZ envelope to be considered at "home". We need to land gently and check our accelerometer for abnormal data.
// At this point, do not let the target altitude go up anymore, so if we overshoot, we dont' move in a parabolic trajectory // At this point, do not let the target altitude go up anymore, so if we overshoot, we dont' move in a parabolic trajectory
// If we are over 120% of average magnitude, just disarm since we're pretty much home // If we are over 120% of average magnitude, just disarm since we're pretty much home
if (rescueState.sensor.accMagnitude > rescueState.sensor.accMagnitudeAvg * 1.5) { if (rescueState.sensor.accMagnitude > rescueState.sensor.accMagnitudeAvg * 1.5) {
disarm(); disarm();
rescueState.phase = RESCUE_COMPLETE; rescueState.phase = RESCUE_COMPLETE;
} }
rescueState.intent.targetGroundspeed = 0; rescueState.intent.targetGroundspeed = 0;
rescueState.intent.targetAltitude = 0; rescueState.intent.targetAltitude = 0;
rescueState.intent.crosstrack = true; rescueState.intent.crosstrack = true;
rescueState.intent.minAngleDeg = 0; rescueState.intent.minAngleDeg = 0;
rescueState.intent.maxAngleDeg = 15; rescueState.intent.maxAngleDeg = 15;
break; break;
case RESCUE_COMPLETE: case RESCUE_COMPLETE:
rescueStop(); rescueStop();
break; break;
case RESCUE_ABORT: case RESCUE_ABORT:
disarm(); disarm();
rescueStop(); rescueStop();
break; break;
default:
break;
} }
performSanityChecks(); performSanityChecks();

View File

@ -41,6 +41,7 @@
#include "flight/imu.h" #include "flight/imu.h"
#include "flight/mixer.h" #include "flight/mixer.h"
#include "flight/pid.h" #include "flight/pid.h"
#include "flight/gps_rescue.h"
#include "io/gps.h" #include "io/gps.h"
@ -521,6 +522,9 @@ void imuUpdateAttitude(timeUs_t currentTimeUs)
acc.accADC[Y] = 0; acc.accADC[Y] = 0;
acc.accADC[Z] = 0; acc.accADC[Z] = 0;
} }
#ifdef USE_GPS_RESCUE
updateGPSRescueState();
#endif
} }
bool shouldInitializeGPSHeading() bool shouldInitializeGPSHeading()