Flight Phases - Estia-advanced-programming/pandora-public GitHub Wiki
For those interested, you can read research paper [1] or thesis [2] for free.
In this project, we will implement a very simplistic heuristic: we will simply look at the yaw
value. If it is relatively constant, it is a cruise phase. Whatever happens before the first cruise phase is the take off phase, whatever remains after the last cruise phase is the landing phase.
Fig. 1 Illustration of flight phases simple heuristic in our project. Top: Flight path. Middle: Yaw values. A green line indicates the beginning of a plateau. A red line indicates the end of a plateau. (Note that the green and red lines in the middle are merged on this example) Bottom: Yaw delta values
- Take the yaw values
- Take the delta values (simple difference between
i
andi-1
) - Consider delta values that are
- smaller than 1
- for yaw values that are different from -1 (default values when the sensors are not turned on yet)
- after at least 10 delta values were greater than 1 (To make sure we do not get first plateau happening before any yaw consequent modification)
- A plateau is defined as a portion in time for which values delta values are < 1 and for at least 60 seconds
Note With this pseudo-algorithm and its heuristics, most flight analyses make sense. Only one flight (RU) will have an undetected take off phase.
def findPlateaux(values, timestamp) :
## PREPARE THE DATA #########################
# get the delta
delta = delta(values) # no need for delta time division
# get the indexes we are interested in
# we want the index for which
# * yaw values != -1
# * delta values < 1
# * after at least 10 deltas > 1 happened (to make sure the sensors were correctly switched on!)
indexes = delta.where(<1 and values != -1 and turbulences_happened = True) # !Important: threshold of 1
# get the distance between these indexes
distance_index = diff(indexes)
start, end = None
array = []
## MAIN LOOP #########################
loop on i:
if start_plateau_detected:
save(start)
if end_plateau_detected:
save(end)
save_in_array([start, end])
## FILTERING #########################
# filter the saved plateaus to know if they
# are long enough in time to be considered
for start, end in array:
if time_between(start, end) > 60 # !Important: threshold of 60
save_in_results([start, end])
return results
def OtherFuntion(...)
plateaus = findPlateaux(yaws, timestamp)
take_off = before(plateaus.first())
landing = after(plateaus.last())
cruise = plateaus.first.start() to plateaus.last.end()
[1] Goblet, Valentine & Fala, Nicoletta & Marais, Karen. (2015). Identifying Phases of Flight in General Aviation Operations. 10.2514/6.2015-2851. link
[2] Goblet, Valentine Pascale. "Phase of flight identification in general aviation operations." (2016). link