Demonstration: Urban Flight

Copyright © 2024, United States Government, as represented by the Administrator of the National Aeronautics and Space Administration. All rights reserved.

The “"Fault Model Design tools - fmdtools version 2"” software is licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. 

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
import fmdtools.sim.propagate as propagate
from fmdtools.analyze import tabulate

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import pandas as pd
import numpy as np

Model Overview

The urban flight drone represents a drone flying over an urban area with buildings and places to land (or not land).

This drone model variant is defined in model_urban.py, along with some visualization functions.

from model_urban import Drone
mdl = Drone(sp={'end_condition': 'scenario_finished'})
mdl
drone Drone
- t=Time(time=-0.1, timers={})
- m=Mode(mode='nominal', faults=set(), sub_faults=False)
FLOWS:
- force_st=Force(s=(support=1.0))
- force_lin=Force(s=(support=1.0))
- hsig_dofs=HSig(s=(hstate='nominal'))
- hsig_bat=HSig(s=(hstate='nominal'))
- rsig_traj=RSig(s=(mode='continue'))
- ee_1=EE(s=(rate=1.0, effort=1.0))
- ee_mot=EE(s=(rate=1.0, effort=1.0))
- ee_ctl=EE(s=(rate=1.0, effort=1.0))
- ctl=Control(s=(forward=1.0, upward=1.0))
- dofs=DOFs(s=(vertvel=1.0, planvel=1.0, planpwr=1.0, uppwr=1.0, x=0.0, y=0.0, z=0.0))
- des_traj=DesTraj(s=(dx=1.0, dy=0.0, dz=0.0, power=1.0))
- environment=UrbanDroneEnvironment(s=(safe=True, allowed=True, landed=True, occupied=False), c=(), ga=())
FXNS:
- manage_health=ManageHealth(m=(mode='nominal', faults=set(), sub_faults=False))
- store_ee=StoreEE(s=(soc=100.0), m=(mode='nominal', faults=set(), sub_faults=False))
- dist_ee=DistEE(s=(ee_tr=1.0, ee_te=1.0), m=(mode='nominal', faults=set(), sub_faults=False))
- affect_dof=AffectDOF(s=(e_to=1.0, e_ti=1.0, ct=1.0, mt=1.0, pt=1.0, lrstab=0.0, frstab=0.0), m=(mode='nominal', fau...
- ctl_dof=CtlDOF(s=(cs=1.0, power=1.0), m=(mode='nominal', faults=set(), sub_faults=False))
- plan_path=PlanPath(s=(pt=0, goal=(0.0, 0.0, 50.0), dist=0.0, ground_height=0.0, goals={0: [0, 0, 0], 1: (0, 0, np.f...
- hold_payload=HoldPayload(s=(force_gr=1.0), m=(mode='nominal', faults=set(), sub_faults=False))

This is the model structure:

from model_static import pos
mg = mdl.as_modelgraph()
pos = {**pos, **{'drone.flows.environment': [0.75, -0.5], 'drone.flows.rsig_traj': [-0.5, 0.35], 'drone.flows.hsig_dofs': [-0.25, 0.25], 'drone.flows.hsig_bat': [-0.55, -0.35], 'drone.fxns.manage_health': [-0.45, 0.0]}}
mg.set_pos(**pos)
fig, ax = mg.draw()
../../_images/f3b9936677aded3611d43f045ad1753a4f993ca727223932b0c0de860152e87d.png

We can also view the grid environment using its show methods:

collections={"all_occupied": {"color": "red"}, "all_allowed": {"color": "blue"}, "start": {"color": "purple"}, "end": {"color": "orange"}}
fig, ax = mdl.flows['environment'].c.show({"height": {}}, collections=collections)
../../_images/f8f5da3f3c5763d05c4f8ef5449439abb0da75ba16e33657ed0a6f40afd982dd.png

Which shows the Start, End, and allowed/unsafe locations in the 1000x1000-m grid. In this display, line thickness corresponds to building height, and hatching corresponds to whether or not the space is occupied. We can also display this using show.coord3d:

fig, ax = mdl.flows['environment'].c.show_z("height", collections=collections)
../../_images/26995f40bda8bfa242ab947c86db66338c941175ad7a08c7d446cc3a933bcf4d.png

Nominal Simulation

Below we show how this drone performs in the nominal scenario.

results_nom, hist_nom = propagate.nominal(mdl)
fig, axs = hist_nom.plot_line("fxns.store_ee.s.soc",
                            'flows.ee_1.s.rate',
                            'flows.dofs.s.z',
                            'fxns.plan_path.m.mode',
                            'fxns.plan_path.s.pt',
                            'flows.des_traj.s.power')
../../_images/99dc826885ff1b2b0ea91c565802ecfe12012fe2e52611a4ba010bef841c6d62.png

As shown, the flight ends fairly quickly (in 2.5 minutes), with the drone successively proceeding through points in the flight plan.

We can also view this flightpath in 3-d space using History.plot_trajectories:

fig, ax = hist_nom.plot_trajectories('dofs.s.x', 'dofs.s.y', 'dofs.s.z', time_groups=['nominal'], time_ticks=0.1)
../../_images/0bb308d8e33933b385acdb4297749cf1db3ab177bd79418f65a01a9d0901d8b3.png

Trajectory plots can be overlaid on top of environment plots. In this case, we defined the method plot_env_with_traj and plot_env_with_traj_z for this case.

from model_urban import plot_env_with_traj, plot_env_with_traj_z
plot_env_with_traj_z(hist_nom, mdl)
(<Figure size 400x400 with 1 Axes>,
 <Axes3D: title={'center': 'trajectory'}, xlabel='x', ylabel='y', zlabel='z'>)
../../_images/970b049e2651e86634042823deff9781953d2f1d00f7a99b7c37f67025aa68ff.png
plot_env_with_traj(hist_nom, mdl)
(<Figure size 500x500 with 2 Axes>,
 <Axes: title={'center': 'trajectory'}, xlabel='x', ylabel='y'>)
../../_images/a043dfca44b45504a12225a10b2756b73cb388367e7e34d99365765a1e10d59e.png

As shown, this is a rather simple straight-line path where the drone flies at full speed. If we wanted a more complex scenario, we could make the path more complex by adding multiple destinations or planning the path based on allowed flight/landing locations.

As it is, we may also want to adjust the timestep/speed to get more resolution, since the drone only has a few discrete timesteps in the air.

The results for the simulation are:

results_nom
tend.classify.rate:                  1.0
tend.classify.cost:                  0.0
tend.classify.expected_cost:         0.0
tend.classify.repcost:                 0
tend.classify.unsafe_flight_time:      0
tend.classify.body_strikes:          0.0
tend.classify.head_strikes:          0.0
tend.classify.property_restrictions:   0
tend.classify.safecost:              0.0
tend.classify.landcost:                0
tend.classify.p_safety:              0.0
tend.classify.severities.hazardous:  0.0
tend.classify.severities.minor:      1.0

Resilience model

A number of different fault modes have been set up in the model to allow us to simulate various hazardous behaviors.

mdl.fxns['affect_dof'].get_faults(only_present=False)
{'drone.fxns.affect_dof': {},
 'drone.fxns.affect_dof.ca': {},
 'drone.fxns.affect_dof.ca.comps.lf': {'ctlbreak': Fault(prob=2.0000000000000003e-06, cost=1000, phases=(), disturbances=(), units='sim'),
  'ctldn': Fault(prob=2.0000000000000003e-06, cost=500, phases=(), disturbances=(), units='sim'),
  'ctlup': Fault(prob=2.0000000000000003e-06, cost=500, phases=(), disturbances=(), units='sim'),
  'mechbreak': Fault(prob=1.0000000000000002e-06, cost=500, phases=(), disturbances=(), units='sim'),
  'mechfriction': Fault(prob=5.000000000000001e-07, cost=500, phases=(), disturbances=(), units='sim'),
  'openc': Fault(prob=1.0000000000000002e-06, cost=200, phases=(), disturbances=(), units='sim'),
  'propbreak': Fault(prob=3.0000000000000004e-07, cost=200, phases=(), disturbances=(), units='sim'),
  'propstuck': Fault(prob=2.0000000000000002e-07, cost=200, phases=(), disturbances=(), units='sim'),
  'propwarp': Fault(prob=1.0000000000000001e-07, cost=200, phases=(), disturbances=(), units='sim'),
  'short': Fault(prob=1.0000000000000002e-06, cost=200, phases=(), disturbances=(), units='sim')},
 'drone.fxns.affect_dof.ca.comps.lr': {'ctlbreak': Fault(prob=2.0000000000000003e-06, cost=1000, phases=(), disturbances=(), units='sim'),
  'ctldn': Fault(prob=2.0000000000000003e-06, cost=500, phases=(), disturbances=(), units='sim'),
  'ctlup': Fault(prob=2.0000000000000003e-06, cost=500, phases=(), disturbances=(), units='sim'),
  'mechbreak': Fault(prob=1.0000000000000002e-06, cost=500, phases=(), disturbances=(), units='sim'),
  'mechfriction': Fault(prob=5.000000000000001e-07, cost=500, phases=(), disturbances=(), units='sim'),
  'openc': Fault(prob=1.0000000000000002e-06, cost=200, phases=(), disturbances=(), units='sim'),
  'propbreak': Fault(prob=3.0000000000000004e-07, cost=200, phases=(), disturbances=(), units='sim'),
  'propstuck': Fault(prob=2.0000000000000002e-07, cost=200, phases=(), disturbances=(), units='sim'),
  'propwarp': Fault(prob=1.0000000000000001e-07, cost=200, phases=(), disturbances=(), units='sim'),
  'short': Fault(prob=1.0000000000000002e-06, cost=200, phases=(), disturbances=(), units='sim')},
 'drone.fxns.affect_dof.ca.comps.rf': {'ctlbreak': Fault(prob=2.0000000000000003e-06, cost=1000, phases=(), disturbances=(), units='sim'),
  'ctldn': Fault(prob=2.0000000000000003e-06, cost=500, phases=(), disturbances=(), units='sim'),
  'ctlup': Fault(prob=2.0000000000000003e-06, cost=500, phases=(), disturbances=(), units='sim'),
  'mechbreak': Fault(prob=1.0000000000000002e-06, cost=500, phases=(), disturbances=(), units='sim'),
  'mechfriction': Fault(prob=5.000000000000001e-07, cost=500, phases=(), disturbances=(), units='sim'),
  'openc': Fault(prob=1.0000000000000002e-06, cost=200, phases=(), disturbances=(), units='sim'),
  'propbreak': Fault(prob=3.0000000000000004e-07, cost=200, phases=(), disturbances=(), units='sim'),
  'propstuck': Fault(prob=2.0000000000000002e-07, cost=200, phases=(), disturbances=(), units='sim'),
  'propwarp': Fault(prob=1.0000000000000001e-07, cost=200, phases=(), disturbances=(), units='sim'),
  'short': Fault(prob=1.0000000000000002e-06, cost=200, phases=(), disturbances=(), units='sim')},
 'drone.fxns.affect_dof.ca.comps.rr': {'ctlbreak': Fault(prob=2.0000000000000003e-06, cost=1000, phases=(), disturbances=(), units='sim'),
  'ctldn': Fault(prob=2.0000000000000003e-06, cost=500, phases=(), disturbances=(), units='sim'),
  'ctlup': Fault(prob=2.0000000000000003e-06, cost=500, phases=(), disturbances=(), units='sim'),
  'mechbreak': Fault(prob=1.0000000000000002e-06, cost=500, phases=(), disturbances=(), units='sim'),
  'mechfriction': Fault(prob=5.000000000000001e-07, cost=500, phases=(), disturbances=(), units='sim'),
  'openc': Fault(prob=1.0000000000000002e-06, cost=200, phases=(), disturbances=(), units='sim'),
  'propbreak': Fault(prob=3.0000000000000004e-07, cost=200, phases=(), disturbances=(), units='sim'),
  'propstuck': Fault(prob=2.0000000000000002e-07, cost=200, phases=(), disturbances=(), units='sim'),
  'propwarp': Fault(prob=1.0000000000000001e-07, cost=200, phases=(), disturbances=(), units='sim'),
  'short': Fault(prob=1.0000000000000002e-06, cost=200, phases=(), disturbances=(), units='sim')}}

For example, here we inject a mechanical fault in the left-rear rotor during flight:

results_fault, hist_fault = propagate.one_fault(mdl, "affect_dof.ca.comps.lr", "mechbreak", time=1.4)
fig, axs = hist_fault.plot_line("fxns.store_ee.s.soc",
                                'flows.ee_1.s.rate',
                                'flows.dofs.s.z',
                                'fxns.plan_path.m.mode',
                                'fxns.plan_path.s.pt',
                                'flows.des_traj.s.power')
../../_images/401e6dfc0debf95b312df8069082fed4f72b675e9ae66a2b8c575caeb8718365.png
plot_env_with_traj_z(hist_fault, mdl)
(<Figure size 400x400 with 1 Axes>,
 <Axes3D: title={'center': 'trajectory'}, xlabel='x', ylabel='y', zlabel='z'>)
../../_images/15ddaacfedd13dc442362f405b9a821e7153ac8bcfdff03c108192dd6540bb5d.png
plot_env_with_traj(hist_fault, mdl)
(<Figure size 500x500 with 2 Axes>,
 <Axes: title={'center': 'trajectory'}, xlabel='x', ylabel='y'>)
../../_images/de7d1ed4a3807469902a1f0002fd7bf6f895a8e0157315404c8e580d5bb7646d.png
results_fault.faulty
tend.classify.rate: 1.0000000000000002e-06
tend.classify.cost:               2300.0
tend.classify.expected_cost: 230.00000000000003
tend.classify.repcost:              1500
tend.classify.unsafe_flight_time:      8
tend.classify.body_strikes:          0.0
tend.classify.head_strikes:          0.0
tend.classify.property_restrictions:   0
tend.classify.safecost:            800.0
tend.classify.landcost:                0
tend.classify.p_safety:              0.0
tend.classify.severities.hazardous:  0.0
tend.classify.severities.minor: 1.0000000000000002e-06

Systematic Fault Injection

Here we inject a large list of faults in the system and evaluate their relative consequences in terms of metrics calculated in classify:

from fmdtools.analyze.phases import PhaseMap, from_hist
phasemaps = from_hist(hist_nom, fxn_modephases=[], dt=mdl.sp.dt)
phasemaps['plan_path']
PhaseMap({np.str_('taxi'): [np.float64(0.0), np.float64(1.0)], np.str_('move'): [np.float64(1.1), np.float64(1.6)], np.str_('land'): [np.float64(1.7), np.float64(2.4)], 'taxi1': [np.float64(2.5), np.float64(2.6)]}, {})
from model_urban import make_move_quad
move_quad=make_move_quad(hist_nom, phasemaps['plan_path'].phases['move'])
move_quad
{'samp': 'quadrature',
 'quad': {'nodes': [np.float64(-0.20000000000000018),
   np.float64(0.1999999999999993)],
  'weights': [0.006, 1.0]}}

Constructing the fault domain:

from fmdtools.sim.sample import FaultDomain, FaultSample

fd = FaultDomain(mdl)
fd.add_all_fxn_modes(*[f for f in mdl.fxns if f not in ['affect_dof', 'store_ee']])
fd.add_singlecomp_modes()
fd
FaultDomain with faults:
 -('drone.fxns.manage_health', 'lostfunction')
 -('drone.fxns.dist_ee', 'break')
 -('drone.fxns.dist_ee', 'degr')
 -('drone.fxns.dist_ee', 'short')
 -('drone.fxns.ctl_dof', 'degctl')
 -('drone.fxns.ctl_dof', 'noctl')
 -('drone.fxns.plan_path', 'degloc')
 -('drone.fxns.plan_path', 'noloc')
 -('drone.fxns.plan_path.ca.comps.vision', 'lack_of_detection')
 -('drone.fxns.plan_path.ca.comps.vision', 'undesired_detection')
 -...more

Sampling the fault domain:

fs = FaultSample(fd, phasemap = phasemaps['plan_path'])
fs.add_fault_phases("move", method = "quad",
                    args=(move_quad['quad']['nodes'], move_quad['quad']['weights']))

fs
FaultSample of scenarios: 
 - drone_fxns_manage_health_lostfunction_t1p3
 - drone_fxns_manage_health_lostfunction_t1p4
 - drone_fxns_store_ee_lowcharge_t1p3
 - drone_fxns_store_ee_lowcharge_t1p4
 - drone_fxns_store_ee_nocharge_t1p3
 - drone_fxns_store_ee_nocharge_t1p4
 - drone_fxns_store_ee_ca_comps_s1p1_break_t1p3
 - drone_fxns_store_ee_ca_comps_s1p1_break_t1p4
 - drone_fxns_store_ee_ca_comps_s1p1_degr_t1p3
 - drone_fxns_store_ee_ca_comps_s1p1_degr_t1p4
 - ... (118 total)
fs.scenarios()
[SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.manage_health': ['lostfunction']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.manage_health', fault='lostfunction', rate=np.float64(8.946322067594433e-11), name='drone_fxns_manage_health_lostfunction_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.manage_health': ['lostfunction']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.manage_health', fault='lostfunction', rate=np.float64(1.4910536779324056e-08), name='drone_fxns_manage_health_lostfunction_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.store_ee': ['lowcharge']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.store_ee', fault='lowcharge', rate=np.float64(2.504970178926441e-07), name='drone_fxns_store_ee_lowcharge_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.store_ee': ['lowcharge']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.store_ee', fault='lowcharge', rate=np.float64(4.1749502982107356e-05), name='drone_fxns_store_ee_lowcharge_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.store_ee': ['nocharge']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.store_ee', fault='nocharge', rate=np.float64(7.157057654075547e-08), name='drone_fxns_store_ee_nocharge_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.store_ee': ['nocharge']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.store_ee', fault='nocharge', rate=np.float64(1.1928429423459245e-05), name='drone_fxns_store_ee_nocharge_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.store_ee.ca.comps.s1p1': ['break']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.store_ee.ca.comps.s1p1', fault='break', rate=np.float64(6.560636182902585e-10), name='drone_fxns_store_ee_ca_comps_s1p1_break_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.store_ee.ca.comps.s1p1': ['break']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.store_ee.ca.comps.s1p1', fault='break', rate=np.float64(1.0934393638170977e-07), name='drone_fxns_store_ee_ca_comps_s1p1_break_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.store_ee.ca.comps.s1p1': ['degr']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.store_ee.ca.comps.s1p1', fault='degr', rate=np.float64(6.560636182902585e-10), name='drone_fxns_store_ee_ca_comps_s1p1_degr_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.store_ee.ca.comps.s1p1': ['degr']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.store_ee.ca.comps.s1p1', fault='degr', rate=np.float64(1.0934393638170977e-07), name='drone_fxns_store_ee_ca_comps_s1p1_degr_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.store_ee.ca.comps.s1p1': ['lowcharge']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.store_ee.ca.comps.s1p1', fault='lowcharge', rate=np.float64(2.186878727634195e-09), name='drone_fxns_store_ee_ca_comps_s1p1_lowcharge_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.store_ee.ca.comps.s1p1': ['lowcharge']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.store_ee.ca.comps.s1p1', fault='lowcharge', rate=np.float64(3.6447978793903254e-07), name='drone_fxns_store_ee_ca_comps_s1p1_lowcharge_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.store_ee.ca.comps.s1p1': ['nocharge']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.store_ee.ca.comps.s1p1', fault='nocharge', rate=np.float64(4.59244532803181e-09), name='drone_fxns_store_ee_ca_comps_s1p1_nocharge_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.store_ee.ca.comps.s1p1': ['nocharge']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.store_ee.ca.comps.s1p1', fault='nocharge', rate=np.float64(7.654075546719683e-07), name='drone_fxns_store_ee_ca_comps_s1p1_nocharge_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.store_ee.ca.comps.s1p1': ['short']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.store_ee.ca.comps.s1p1', fault='short', rate=np.float64(6.560636182902585e-10), name='drone_fxns_store_ee_ca_comps_s1p1_short_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.store_ee.ca.comps.s1p1': ['short']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.store_ee.ca.comps.s1p1', fault='short', rate=np.float64(1.0934393638170977e-07), name='drone_fxns_store_ee_ca_comps_s1p1_short_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.dist_ee': ['break']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.dist_ee', fault='break', rate=np.float64(1.1928429423459246e-08), name='drone_fxns_dist_ee_break_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.dist_ee': ['break']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.dist_ee', fault='break', rate=np.float64(1.988071570576541e-06), name='drone_fxns_dist_ee_break_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.dist_ee': ['degr']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.dist_ee', fault='degr', rate=np.float64(2.982107355864811e-08), name='drone_fxns_dist_ee_degr_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.dist_ee': ['degr']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.dist_ee', fault='degr', rate=np.float64(4.970178926441353e-06), name='drone_fxns_dist_ee_degr_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.dist_ee': ['short']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.dist_ee', fault='short', rate=np.float64(1.7892644135188866e-08), name='drone_fxns_dist_ee_short_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.dist_ee': ['short']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.dist_ee', fault='short', rate=np.float64(2.9821073558648112e-06), name='drone_fxns_dist_ee_short_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['ctlbreak']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lf', fault='ctlbreak', rate=np.float64(1.1928429423459246e-08), name='drone_fxns_affect_dof_ca_comps_lf_ctlbreak_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['ctlbreak']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lf', fault='ctlbreak', rate=np.float64(1.988071570576541e-06), name='drone_fxns_affect_dof_ca_comps_lf_ctlbreak_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['ctldn']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lf', fault='ctldn', rate=np.float64(1.1928429423459246e-08), name='drone_fxns_affect_dof_ca_comps_lf_ctldn_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['ctldn']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lf', fault='ctldn', rate=np.float64(1.988071570576541e-06), name='drone_fxns_affect_dof_ca_comps_lf_ctldn_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['ctlup']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lf', fault='ctlup', rate=np.float64(1.1928429423459246e-08), name='drone_fxns_affect_dof_ca_comps_lf_ctlup_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['ctlup']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lf', fault='ctlup', rate=np.float64(1.988071570576541e-06), name='drone_fxns_affect_dof_ca_comps_lf_ctlup_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['mechbreak']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lf', fault='mechbreak', rate=np.float64(5.964214711729623e-09), name='drone_fxns_affect_dof_ca_comps_lf_mechbreak_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['mechbreak']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lf', fault='mechbreak', rate=np.float64(9.940357852882705e-07), name='drone_fxns_affect_dof_ca_comps_lf_mechbreak_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['mechfriction']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lf', fault='mechfriction', rate=np.float64(2.9821073558648116e-09), name='drone_fxns_affect_dof_ca_comps_lf_mechfriction_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['mechfriction']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lf', fault='mechfriction', rate=np.float64(4.970178926441353e-07), name='drone_fxns_affect_dof_ca_comps_lf_mechfriction_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['openc']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lf', fault='openc', rate=np.float64(5.964214711729623e-09), name='drone_fxns_affect_dof_ca_comps_lf_openc_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['openc']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lf', fault='openc', rate=np.float64(9.940357852882705e-07), name='drone_fxns_affect_dof_ca_comps_lf_openc_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['propbreak']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lf', fault='propbreak', rate=np.float64(1.7892644135188868e-09), name='drone_fxns_affect_dof_ca_comps_lf_propbreak_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['propbreak']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lf', fault='propbreak', rate=np.float64(2.9821073558648115e-07), name='drone_fxns_affect_dof_ca_comps_lf_propbreak_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['propstuck']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lf', fault='propstuck', rate=np.float64(1.1928429423459246e-09), name='drone_fxns_affect_dof_ca_comps_lf_propstuck_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['propstuck']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lf', fault='propstuck', rate=np.float64(1.988071570576541e-07), name='drone_fxns_affect_dof_ca_comps_lf_propstuck_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['propwarp']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lf', fault='propwarp', rate=np.float64(5.964214711729623e-10), name='drone_fxns_affect_dof_ca_comps_lf_propwarp_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['propwarp']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lf', fault='propwarp', rate=np.float64(9.940357852882705e-08), name='drone_fxns_affect_dof_ca_comps_lf_propwarp_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['short']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lf', fault='short', rate=np.float64(5.964214711729623e-09), name='drone_fxns_affect_dof_ca_comps_lf_short_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lf': ['short']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lf', fault='short', rate=np.float64(9.940357852882705e-07), name='drone_fxns_affect_dof_ca_comps_lf_short_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['ctlbreak']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lr', fault='ctlbreak', rate=np.float64(1.1928429423459246e-08), name='drone_fxns_affect_dof_ca_comps_lr_ctlbreak_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['ctlbreak']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lr', fault='ctlbreak', rate=np.float64(1.988071570576541e-06), name='drone_fxns_affect_dof_ca_comps_lr_ctlbreak_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['ctldn']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lr', fault='ctldn', rate=np.float64(1.1928429423459246e-08), name='drone_fxns_affect_dof_ca_comps_lr_ctldn_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['ctldn']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lr', fault='ctldn', rate=np.float64(1.988071570576541e-06), name='drone_fxns_affect_dof_ca_comps_lr_ctldn_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['ctlup']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lr', fault='ctlup', rate=np.float64(1.1928429423459246e-08), name='drone_fxns_affect_dof_ca_comps_lr_ctlup_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['ctlup']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lr', fault='ctlup', rate=np.float64(1.988071570576541e-06), name='drone_fxns_affect_dof_ca_comps_lr_ctlup_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['mechbreak']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lr', fault='mechbreak', rate=np.float64(5.964214711729623e-09), name='drone_fxns_affect_dof_ca_comps_lr_mechbreak_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['mechbreak']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lr', fault='mechbreak', rate=np.float64(9.940357852882705e-07), name='drone_fxns_affect_dof_ca_comps_lr_mechbreak_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['mechfriction']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lr', fault='mechfriction', rate=np.float64(2.9821073558648116e-09), name='drone_fxns_affect_dof_ca_comps_lr_mechfriction_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['mechfriction']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lr', fault='mechfriction', rate=np.float64(4.970178926441353e-07), name='drone_fxns_affect_dof_ca_comps_lr_mechfriction_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['openc']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lr', fault='openc', rate=np.float64(5.964214711729623e-09), name='drone_fxns_affect_dof_ca_comps_lr_openc_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['openc']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lr', fault='openc', rate=np.float64(9.940357852882705e-07), name='drone_fxns_affect_dof_ca_comps_lr_openc_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['propbreak']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lr', fault='propbreak', rate=np.float64(1.7892644135188868e-09), name='drone_fxns_affect_dof_ca_comps_lr_propbreak_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['propbreak']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lr', fault='propbreak', rate=np.float64(2.9821073558648115e-07), name='drone_fxns_affect_dof_ca_comps_lr_propbreak_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['propstuck']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lr', fault='propstuck', rate=np.float64(1.1928429423459246e-09), name='drone_fxns_affect_dof_ca_comps_lr_propstuck_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['propstuck']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lr', fault='propstuck', rate=np.float64(1.988071570576541e-07), name='drone_fxns_affect_dof_ca_comps_lr_propstuck_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['propwarp']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lr', fault='propwarp', rate=np.float64(5.964214711729623e-10), name='drone_fxns_affect_dof_ca_comps_lr_propwarp_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['propwarp']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lr', fault='propwarp', rate=np.float64(9.940357852882705e-08), name='drone_fxns_affect_dof_ca_comps_lr_propwarp_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['short']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.lr', fault='short', rate=np.float64(5.964214711729623e-09), name='drone_fxns_affect_dof_ca_comps_lr_short_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.lr': ['short']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.lr', fault='short', rate=np.float64(9.940357852882705e-07), name='drone_fxns_affect_dof_ca_comps_lr_short_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['ctlbreak']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rf', fault='ctlbreak', rate=np.float64(1.1928429423459246e-08), name='drone_fxns_affect_dof_ca_comps_rf_ctlbreak_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['ctlbreak']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rf', fault='ctlbreak', rate=np.float64(1.988071570576541e-06), name='drone_fxns_affect_dof_ca_comps_rf_ctlbreak_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['ctldn']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rf', fault='ctldn', rate=np.float64(1.1928429423459246e-08), name='drone_fxns_affect_dof_ca_comps_rf_ctldn_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['ctldn']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rf', fault='ctldn', rate=np.float64(1.988071570576541e-06), name='drone_fxns_affect_dof_ca_comps_rf_ctldn_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['ctlup']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rf', fault='ctlup', rate=np.float64(1.1928429423459246e-08), name='drone_fxns_affect_dof_ca_comps_rf_ctlup_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['ctlup']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rf', fault='ctlup', rate=np.float64(1.988071570576541e-06), name='drone_fxns_affect_dof_ca_comps_rf_ctlup_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['mechbreak']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rf', fault='mechbreak', rate=np.float64(5.964214711729623e-09), name='drone_fxns_affect_dof_ca_comps_rf_mechbreak_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['mechbreak']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rf', fault='mechbreak', rate=np.float64(9.940357852882705e-07), name='drone_fxns_affect_dof_ca_comps_rf_mechbreak_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['mechfriction']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rf', fault='mechfriction', rate=np.float64(2.9821073558648116e-09), name='drone_fxns_affect_dof_ca_comps_rf_mechfriction_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['mechfriction']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rf', fault='mechfriction', rate=np.float64(4.970178926441353e-07), name='drone_fxns_affect_dof_ca_comps_rf_mechfriction_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['openc']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rf', fault='openc', rate=np.float64(5.964214711729623e-09), name='drone_fxns_affect_dof_ca_comps_rf_openc_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['openc']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rf', fault='openc', rate=np.float64(9.940357852882705e-07), name='drone_fxns_affect_dof_ca_comps_rf_openc_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['propbreak']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rf', fault='propbreak', rate=np.float64(1.7892644135188868e-09), name='drone_fxns_affect_dof_ca_comps_rf_propbreak_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['propbreak']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rf', fault='propbreak', rate=np.float64(2.9821073558648115e-07), name='drone_fxns_affect_dof_ca_comps_rf_propbreak_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['propstuck']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rf', fault='propstuck', rate=np.float64(1.1928429423459246e-09), name='drone_fxns_affect_dof_ca_comps_rf_propstuck_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['propstuck']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rf', fault='propstuck', rate=np.float64(1.988071570576541e-07), name='drone_fxns_affect_dof_ca_comps_rf_propstuck_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['propwarp']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rf', fault='propwarp', rate=np.float64(5.964214711729623e-10), name='drone_fxns_affect_dof_ca_comps_rf_propwarp_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['propwarp']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rf', fault='propwarp', rate=np.float64(9.940357852882705e-08), name='drone_fxns_affect_dof_ca_comps_rf_propwarp_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['short']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rf', fault='short', rate=np.float64(5.964214711729623e-09), name='drone_fxns_affect_dof_ca_comps_rf_short_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rf': ['short']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rf', fault='short', rate=np.float64(9.940357852882705e-07), name='drone_fxns_affect_dof_ca_comps_rf_short_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['ctlbreak']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rr', fault='ctlbreak', rate=np.float64(1.1928429423459246e-08), name='drone_fxns_affect_dof_ca_comps_rr_ctlbreak_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['ctlbreak']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rr', fault='ctlbreak', rate=np.float64(1.988071570576541e-06), name='drone_fxns_affect_dof_ca_comps_rr_ctlbreak_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['ctldn']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rr', fault='ctldn', rate=np.float64(1.1928429423459246e-08), name='drone_fxns_affect_dof_ca_comps_rr_ctldn_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['ctldn']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rr', fault='ctldn', rate=np.float64(1.988071570576541e-06), name='drone_fxns_affect_dof_ca_comps_rr_ctldn_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['ctlup']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rr', fault='ctlup', rate=np.float64(1.1928429423459246e-08), name='drone_fxns_affect_dof_ca_comps_rr_ctlup_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['ctlup']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rr', fault='ctlup', rate=np.float64(1.988071570576541e-06), name='drone_fxns_affect_dof_ca_comps_rr_ctlup_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['mechbreak']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rr', fault='mechbreak', rate=np.float64(5.964214711729623e-09), name='drone_fxns_affect_dof_ca_comps_rr_mechbreak_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['mechbreak']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rr', fault='mechbreak', rate=np.float64(9.940357852882705e-07), name='drone_fxns_affect_dof_ca_comps_rr_mechbreak_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['mechfriction']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rr', fault='mechfriction', rate=np.float64(2.9821073558648116e-09), name='drone_fxns_affect_dof_ca_comps_rr_mechfriction_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['mechfriction']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rr', fault='mechfriction', rate=np.float64(4.970178926441353e-07), name='drone_fxns_affect_dof_ca_comps_rr_mechfriction_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['openc']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rr', fault='openc', rate=np.float64(5.964214711729623e-09), name='drone_fxns_affect_dof_ca_comps_rr_openc_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['openc']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rr', fault='openc', rate=np.float64(9.940357852882705e-07), name='drone_fxns_affect_dof_ca_comps_rr_openc_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['propbreak']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rr', fault='propbreak', rate=np.float64(1.7892644135188868e-09), name='drone_fxns_affect_dof_ca_comps_rr_propbreak_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['propbreak']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rr', fault='propbreak', rate=np.float64(2.9821073558648115e-07), name='drone_fxns_affect_dof_ca_comps_rr_propbreak_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['propstuck']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rr', fault='propstuck', rate=np.float64(1.1928429423459246e-09), name='drone_fxns_affect_dof_ca_comps_rr_propstuck_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['propstuck']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rr', fault='propstuck', rate=np.float64(1.988071570576541e-07), name='drone_fxns_affect_dof_ca_comps_rr_propstuck_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['propwarp']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rr', fault='propwarp', rate=np.float64(5.964214711729623e-10), name='drone_fxns_affect_dof_ca_comps_rr_propwarp_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['propwarp']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rr', fault='propwarp', rate=np.float64(9.940357852882705e-08), name='drone_fxns_affect_dof_ca_comps_rr_propwarp_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['short']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.affect_dof.ca.comps.rr', fault='short', rate=np.float64(5.964214711729623e-09), name='drone_fxns_affect_dof_ca_comps_rr_short_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.affect_dof.ca.comps.rr': ['short']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.affect_dof.ca.comps.rr', fault='short', rate=np.float64(9.940357852882705e-07), name='drone_fxns_affect_dof_ca_comps_rr_short_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.ctl_dof': ['degctl']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.ctl_dof', fault='degctl', rate=np.float64(2.862823061630219e-08), name='drone_fxns_ctl_dof_degctl_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.ctl_dof': ['degctl']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.ctl_dof', fault='degctl', rate=np.float64(4.7713717693836985e-06), name='drone_fxns_ctl_dof_degctl_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.ctl_dof': ['noctl']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.ctl_dof', fault='noctl', rate=np.float64(7.157057654075547e-09), name='drone_fxns_ctl_dof_noctl_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.ctl_dof': ['noctl']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.ctl_dof', fault='noctl', rate=np.float64(1.1928429423459246e-06), name='drone_fxns_ctl_dof_noctl_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.plan_path': ['degloc']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.plan_path', fault='degloc', rate=np.float64(2.862823061630219e-08), name='drone_fxns_plan_path_degloc_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.plan_path': ['degloc']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.plan_path', fault='degloc', rate=np.float64(4.7713717693836985e-06), name='drone_fxns_plan_path_degloc_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.plan_path': ['noloc']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.plan_path', fault='noloc', rate=np.float64(7.157057654075547e-09), name='drone_fxns_plan_path_noloc_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.plan_path': ['noloc']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.plan_path', fault='noloc', rate=np.float64(1.1928429423459246e-06), name='drone_fxns_plan_path_noloc_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.plan_path.ca.comps.vision': ['lack_of_detection']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.plan_path.ca.comps.vision', fault='lack_of_detection', rate=np.float64(5.4671968190854867e-05), name='drone_fxns_plan_path_ca_comps_vision_lack_of_detection_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.plan_path.ca.comps.vision': ['lack_of_detection']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.plan_path.ca.comps.vision', fault='lack_of_detection', rate=np.float64(0.009111994698475812), name='drone_fxns_plan_path_ca_comps_vision_lack_of_detection_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.plan_path.ca.comps.vision': ['undesired_detection']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.plan_path.ca.comps.vision', fault='undesired_detection', rate=np.float64(5.4671968190854867e-05), name='drone_fxns_plan_path_ca_comps_vision_undesired_detection_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.plan_path.ca.comps.vision': ['undesired_detection']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.plan_path.ca.comps.vision', fault='undesired_detection', rate=np.float64(0.009111994698475812), name='drone_fxns_plan_path_ca_comps_vision_undesired_detection_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.hold_payload': ['break']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.hold_payload', fault='break', rate=np.float64(6.560636182902584e-12), name='drone_fxns_hold_payload_break_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.hold_payload': ['break']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.hold_payload', fault='break', rate=np.float64(1.0934393638170975e-09), name='drone_fxns_hold_payload_break_t1p4', time=np.float64(1.4), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.3: Injection(faults={'drone.fxns.hold_payload': ['deform']}, disturbances={})}, times=(np.float64(1.3),), function='drone.fxns.hold_payload', fault='deform', rate=np.float64(2.6242544731610336e-11), name='drone_fxns_hold_payload_deform_t1p3', time=np.float64(1.3), phase=np.str_('taxi')),
 SingleFaultScenario(sequence={1.4: Injection(faults={'drone.fxns.hold_payload': ['deform']}, disturbances={})}, times=(np.float64(1.4),), function='drone.fxns.hold_payload', fault='deform', rate=np.float64(4.37375745526839e-09), name='drone_fxns_hold_payload_deform_t1p4', time=np.float64(1.4), phase=np.str_('taxi'))]

Simulating faults:

endresults, hists = propagate.fault_sample(mdl, fs, staged=False)
SCENARIOS COMPLETE: 100%|██████████| 118/118 [00:35<00:00,  3.36it/s]

Below we look at the simulated trajectories that occur as a result of these fault modes;

plot_env_with_traj_z(hists , mdl)
(<Figure size 400x400 with 1 Axes>,
 <Axes3D: title={'center': 'trajectory'}, xlabel='x', ylabel='y', zlabel='z'>)
../../_images/6fcf1adeedf11f720679c09cb6fdd0b82bf2f0fdc0a3312d418761143f9ab1c4.png

We can look at the results for each individual mode below. Note that by default these modes are grouped across the two injection times.

statsfmea = tabulate.FMEA(endresults, fs,
                          average_metric=['rate', 'unsafe_flight_time', 'cost', 'repcost',
                                            'landcost', 'body_strikes',
                                            'head_strikes', 'property_restrictions'],
                          rates='rate')
fmeatab = statsfmea.as_table(sort_by="cost")
fmeatab
average_rate average_unsafe_flight_time average_cost average_repcost average_landcost average_body_strikes average_head_strikes average_property_restrictions
drone.fxns.plan_path.ca.comps.vision lack_of_detection 4.583333e-03 13.5 1350.0 0.0 0.0 0.00000 0.0000 0.0
undesired_detection 4.583333e-03 0.0 0.0 0.0 0.0 0.00000 0.0000 0.0
drone.fxns.store_ee lowcharge 2.100000e-05 11.0 1200.0 100.0 0.0 0.00000 0.0000 0.0
nocharge 6.000000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.dist_ee degr 2.500000e-06 148.0 16100.0 1300.0 0.0 0.00000 0.0000 0.0
drone.fxns.ctl_dof degctl 2.400000e-06 8.5 2350.0 1500.0 0.0 0.00000 0.0000 0.0
drone.fxns.plan_path degloc 2.400000e-06 8.5 2350.0 1500.0 0.0 0.00000 0.0000 0.0
drone.fxns.dist_ee short 1.500000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lf ctlup 1.000000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rr ctldn 1.000000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lr ctlbreak 1.000000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rr ctlbreak 1.000000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
ctlup 1.000000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lr ctlup 1.000000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lf ctlbreak 1.000000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.dist_ee break 1.000000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rf ctlup 1.000000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lf ctldn 1.000000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rf ctlbreak 1.000000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lr ctldn 1.000000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rf ctldn 1.000000e-06 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.plan_path noloc 6.000000e-07 8.5 2350.0 1500.0 0.0 0.00000 0.0000 0.0
drone.fxns.ctl_dof noctl 6.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rr openc 5.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lr mechbreak 5.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rr mechbreak 5.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lf short 5.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rr short 5.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lr openc 5.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rf short 5.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lr short 5.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lf mechbreak 5.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rf openc 5.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
mechbreak 5.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lf openc 5.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.store_ee.ca.comps.s1p1 nocharge 3.850000e-07 13.5 1450.0 100.0 0.0 0.00000 0.0000 0.0
drone.fxns.affect_dof.ca.comps.rr mechfriction 2.500000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rf mechfriction 2.500000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lr mechfriction 2.500000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lf mechfriction 2.500000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.store_ee.ca.comps.s1p1 lowcharge 1.833333e-07 13.5 1450.0 100.0 0.0 0.00000 0.0000 0.0
drone.fxns.affect_dof.ca.comps.lf propbreak 1.500000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rf propbreak 1.500000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rr propbreak 1.500000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lr propbreak 1.500000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lf propstuck 1.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rf propstuck 1.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rr propstuck 1.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lr propstuck 1.000000e-07 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.store_ee.ca.comps.s1p1 degr 5.500000e-08 13.5 1450.0 100.0 0.0 0.00000 0.0000 0.0
break 5.500000e-08 13.5 1450.0 100.0 0.0 0.00000 0.0000 0.0
short 5.500000e-08 13.5 1450.0 100.0 0.0 0.00000 0.0000 0.0
drone.fxns.affect_dof.ca.comps.rf propwarp 5.000000e-08 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.rr propwarp 5.000000e-08 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lr propwarp 5.000000e-08 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.affect_dof.ca.comps.lf propwarp 5.000000e-08 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
drone.fxns.manage_health lostfunction 7.500000e-09 13.5 2350.0 1000.0 0.0 0.00000 0.0000 0.0
drone.fxns.hold_payload deform 2.200000e-09 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5
break 5.500000e-10 8.5 9750.0 1500.0 5000.0 0.00015 0.0001 0.5