#!/usr/bin/env python # -*- python -*- # -*- coding: utf-8 -*- # 1st experiment # Look at Vz (Settling time, Overshoot, rise time, final value for Steady-State error, # # 2nd experiment # Look at Va (Settling time, Overshoot, rise time, final value for Steady-State error, # # 3rd experiment # Look at h (Overshoot, Steady-State error) import csv import argparse import sys def CommentStripper (iterator): for line in iterator: if line [:1] == '#': continue if not line.strip (): continue yield line if __name__ == '__main__': parser = argparse.ArgumentParser(description='ROSACE Case Study checker.', epilog='More info on ROSACE Case Study: https://svn.onera.fr/schedmcore/branches/ROSACE_CaseStudy/') parser.add_argument('csv_file', type=argparse.FileType('r'), help='The file containing results in CSV format.') parser.add_argument('--check-flight-mode',dest='flight_mode', default='LevelChange', choices=['VerticalSpeed','AirSpeed','LevelChange'], help='Indicate which flight mode to check for. (default: %(default)s)') parser.add_argument('--enable-graph',dest='withGraph',action='store_true',default=False, help='Enable graphical output for easier visual check (requires matplotlib)') args = parser.parse_args() reader = csv.reader(CommentStripper(args.csv_file)) data = [[float(item) for number, item in enumerate(row)] for row in reader] # the figure title font size ffontsize = 15 # the tolerance for each criterion property P1,P2,P3,P4 # cf Table II "Requirements and Verification in Simulink" on page 4 of the paper requirements = dict() requirements['verticalspeed'] = {'P1':{'name':'5% settling time', 'value':10.0}, 'P2':{'name':'Overshoot', 'value':10.0}, 'P3':{'name':'Rise time', 'value':6.0}, 'P4':{'name':'Steady-state error', 'value':5.0}, 'name':'Vz'} # concerns Vz requirements['airspeed'] = {'P1':{'name':'5% settling time', 'value':20.0}, 'P2':{'name':'Overshoot', 'value':10.0}, 'P3':{'name':'Rise time', 'value':12.0}, 'P4':{'name':'Steady-state error', 'value':5.0}, 'name':'Va'} # concerns Va requirements['levelchange'] = {'P2':{'name':'Overshoot', 'value':10.0}, 'P4':{'name':'Steady-state error', 'value':5.0}, 'name':'h'} # concerns h if args.flight_mode.lower() == "verticalspeed": ftitle = 'ROSACE Vertical Speed control scenario' print("Checking for Vertical Speed control...") # Vz maximum value max_Vz = max(row[4] for row in data) # Vz steady-state value (if system is stable) steady_state_Vz = (data[-1][4]) # 5% of Vz steady-state value settling_time_5_value = abs(0.05*steady_state_Vz) # 10% of Vz steady-state value rise_time_10_value = 0.1*steady_state_Vz # 90% of Vz steady-state value rise_time_90_value = 0.9*steady_state_Vz # Finding the time where Vz attains 10% of Vz steady-state value indexes = [i for i,x in enumerate(row[4] for row in data) if x < rise_time_10_value] rise_time_10 = data[indexes[-1]][0] # Finding the time where Vz attains 90% of Vz steady-state value indexes = [i for i,x in enumerate(row[4] for row in data) if x < rise_time_90_value] rise_time_90 = data[indexes[-1]][0] # Rise-time computation rise_time = rise_time_90 - rise_time_10 # Finding the settling-time where Vz remains within 5% of Vz steady-state value indexes = [i for i,x in enumerate(row[4] for row in data) if abs(x-steady_state_Vz) > settling_time_5_value] settling_time = data[indexes[-1]][0] # Overshoot in % overshoot = (max_Vz - steady_state_Vz)/(steady_state_Vz*100) # Steady-state error in % steady_state_error = (2.5 - steady_state_Vz)*100/(2.5) fmMode = args.flight_mode.lower() print('Properties for %s output' % requirements[fmMode]['name']) print('P1 (%20s) = %2.2fs (%r, <%2.2fs)' % (requirements[fmMode]['P1']['name'], settling_time, settling_time settling_time_5_value] settling_time = data[indexes[-1]][0] # Overshoot in % overshoot = (max_Va - steady_state_Va)/(steady_state_Va*100) # Steady-state error in % steady_state_error = (5 - steady_state_Va)*100/(5) fmMode = args.flight_mode.lower() print('Properties for %s output' % requirements[fmMode]['name']) print('P1 (%20s) = %2.2fs (%r, <%2.2fs)' % (requirements[fmMode]['P1']['name'], settling_time, settling_time