22 ******************************************************************************
33 *
44 * @file vtolautotakeofffsm.cpp
5- * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2015.
5+ * @author The LibrePilot Project, http://www.librepilot.org Copyright (C) 2018
6+ * The OpenPilot Team, http://www.openpilot.org Copyright (C) 2015.
67 * @brief This autotakeoff state machine is a helper state machine to the
78 * VtolAutoTakeoffController.
89 * @see The GNU Public License (GPL) Version 3
@@ -60,11 +61,11 @@ extern "C" {
6061
6162
6263// Private constants
63- #define TIMER_COUNT_PER_SECOND (1000 / vtolPathFollowerSettings->UpdatePeriod)
64- #define TIMEOUT_SLOWSTART (2 * TIMER_COUNT_PER_SECOND)
65- #define TIMEOUT_THRUSTUP (1 * TIMER_COUNT_PER_SECOND)
66- #define TIMEOUT_THRUSTDOWN (5 * TIMER_COUNT_PER_SECOND)
67- #define AUTOTAKEOFFING_SLOWDOWN_HEIGHT -5 .0f
64+ #define TIMER_COUNT_PER_SECOND (1000 / vtolPathFollowerSettings->UpdatePeriod)
65+ #define TIMEOUT_SLOWSTART (2 * TIMER_COUNT_PER_SECOND)
66+ #define TIMEOUT_THRUSTUP (1 * TIMER_COUNT_PER_SECOND)
67+ #define TIMEOUT_THRUSTDOWN (5 * TIMER_COUNT_PER_SECOND)
68+ #define AUTOTAKEOFF_SLOWDOWN_HEIGHT -5 .0f
6869
6970VtolAutoTakeoffFSM::PathFollowerFSM_AutoTakeoffStateHandler_T VtolAutoTakeoffFSM::sAutoTakeoffStateTable [AUTOTAKEOFF_STATE_SIZE] = {
7071 [AUTOTAKEOFF_STATE_INACTIVE] = { .setup = &VtolAutoTakeoffFSM::setup_inactive, .run = 0 },
@@ -246,14 +247,8 @@ void VtolAutoTakeoffFSM::setState(StatusVtolAutoTakeoffStateOptions newState, St
246247 mAutoTakeoffData ->currentState = newState;
247248
248249 if (newState != STATUSVTOLAUTOTAKEOFF_STATE_INACTIVE) {
249- PositionStateData positionState;
250- PositionStateGet (&positionState);
251- float takeOffDown = 0 .0f ;
252- if (mAutoTakeoffData ->takeOffLocation .Status == TAKEOFFLOCATION_STATUS_VALID) {
253- takeOffDown = mAutoTakeoffData ->takeOffLocation .Down ;
254- }
255- mAutoTakeoffData ->fsmAutoTakeoffStatus .AltitudeAtState [newState] = positionState.Down - takeOffDown;
256- assessAltitude ();
250+ float altitudeAboveTakeoff = assessAltitude ();
251+ mAutoTakeoffData ->fsmAutoTakeoffStatus .AltitudeAtState [newState] = altitudeAboveTakeoff;
257252 }
258253
259254 // Restart state timer counter
@@ -266,6 +261,7 @@ void VtolAutoTakeoffFSM::setState(StatusVtolAutoTakeoffStateOptions newState, St
266261 (this ->*sAutoTakeoffStateTable [mAutoTakeoffData ->currentState ].setup )();
267262 }
268263
264+ // Update StatusVtolAutoTakeoff UAVObject with new status
269265 updateVtolAutoTakeoffFSMStatus ();
270266}
271267
@@ -276,6 +272,7 @@ void VtolAutoTakeoffFSM::setStateTimeout(int32_t count)
276272 mAutoTakeoffData ->stateTimeoutCount = count;
277273}
278274
275+ // Update StatusVtolAutoTakeoff UAVObject
279276void VtolAutoTakeoffFSM::updateVtolAutoTakeoffFSMStatus ()
280277{
281278 mAutoTakeoffData ->fsmAutoTakeoffStatus .State = mAutoTakeoffData ->currentState ;
@@ -288,7 +285,7 @@ void VtolAutoTakeoffFSM::updateVtolAutoTakeoffFSMStatus()
288285}
289286
290287
291- void VtolAutoTakeoffFSM::assessAltitude (void )
288+ float VtolAutoTakeoffFSM::assessAltitude (void )
292289{
293290 float positionDown;
294291
@@ -298,11 +295,13 @@ void VtolAutoTakeoffFSM::assessAltitude(void)
298295 takeOffDown = mAutoTakeoffData ->takeOffLocation .Down ;
299296 }
300297 float positionDownRelativeToTakeoff = positionDown - takeOffDown;
301- if (positionDownRelativeToTakeoff < AUTOTAKEOFFING_SLOWDOWN_HEIGHT ) {
298+ if (positionDownRelativeToTakeoff < AUTOTAKEOFF_SLOWDOWN_HEIGHT ) {
302299 mAutoTakeoffData ->flLowAltitude = false ;
303300 } else {
304301 mAutoTakeoffData ->flLowAltitude = true ;
305302 }
303+ // Return the altitude above takeoff, which is the negation of positionDownRelativeToTakeoff
304+ return -positionDownRelativeToTakeoff;
306305}
307306
308307// Action the required state from plans.c
@@ -347,10 +346,10 @@ void VtolAutoTakeoffFSM::setup_checkstate(void)
347346 // Assumptions that do not need to be checked if flight mode is AUTOTAKEOFF
348347 // 1. Already armed
349348 // 2. Not in flight. This was checked in plans.c
350- // 3. User has placed throttle position to more than 50 % to allow autotakeoff
349+ // 3. User has placed throttle position to more than 30 % to allow autotakeoff
351350
352351 // If pathplanner, we need additional checks
353- // E.g. if inflight, this mode is just positon hol
352+ // E.g. if inflight, this mode is just position hold
354353 StabilizationDesiredData stabDesired;
355354
356355 StabilizationDesiredGet (&stabDesired);
@@ -407,15 +406,13 @@ void VtolAutoTakeoffFSM::run_slowstart(__attribute__((unused)) uint8_t flTimeout
407406 }
408407}
409408
410- // STATE: THRUSTUP spools up motors to vtol min over 5 seconds for effect.
409+ // STATE: THRUSTUP spools up motors to vtol min over 1 second for effect.
411410// PID loops may be cumulating I terms but that problem needs to be solved
412411#define THRUSTUP_FINAL_THRUST_AS_RATIO_OF_VTOLMAX 0 .8f
413412void VtolAutoTakeoffFSM::setup_thrustup (void )
414413{
415414 setStateTimeout (TIMEOUT_THRUSTUP);
416415 mAutoTakeoffData ->flZeroStabiHorizontal = false ;
417- StabilizationDesiredData stabDesired;
418- StabilizationDesiredGet (&stabDesired);
419416 mAutoTakeoffData ->sum2 = THRUSTUP_FINAL_THRUST_AS_RATIO_OF_VTOLMAX * vtolPathFollowerSettings->ThrustLimits .Max ;
420417 mAutoTakeoffData ->sum1 = (mAutoTakeoffData ->sum2 - mAutoTakeoffData ->boundThrustMax ) / (float )TIMEOUT_THRUSTUP;
421418 mAutoTakeoffData ->boundThrustMin = vtolPathFollowerSettings->ThrustLimits .Min ;
0 commit comments