Пример #1
0
def run_tracking_experiment(useSaved=False, plotResults=False, saveResults=False):
    import game    

    # Game frame rate
    expStepTime = 1.0/frameRateExperiment
    expNumSteps = int(float(finalTime)/expStepTime)
    expNumFrames = expNumSteps + 1

    if useSaved:
        if os.path.isfile(os.path.join(os.environ['MANTRA_TEMP'], taskName+'_exp.csv')):
            (t_exp, r_exp, y_exp, w_exp, u_exp) = tools.read_data_csv(dirName=os.environ['MANTRA_TEMP'], fileName=taskName+'_exp.csv')
        else:
            print "useSaved is set to True, but no saved data is found in Resources/Temp.\nFirst use run_tracking_experiment to generate new data.\n"    
    else:        
        # Make forcing functions
        frame_exp = range(0, expNumFrames, 1)
        t_exp = [expStepTime*frame for frame in frame_exp]
        print "Generating reference signal.\n"
        r_exp = tools.generate_fmu_signal(referenceModel, moFile, t_exp, referenceParams, expStepTime, saveDir=os.environ['MANTRA_TEMP'], odeSolver=odeSolver, printVerbose=printVerbose)
        print "Generating disturbance input.\n"
        w_exp = tools.generate_fmu_signal(disturbanceModel, moFile, t_exp, disturbanceParams, expStepTime, saveDir=os.environ['MANTRA_TEMP'], odeSolver=odeSolver, printVerbose=printVerbose)

        # Assign variables into 'game' module from TrackingTask 
        game.backgroundVisible = backgroundVisible
        game.previewTime = previewTime
        game.stepTime = expStepTime
        game.frameRate = frameRateExperiment
        game.frame_hist = frame_exp
        game.odeSolver = odeSolver
        game.t_hist = t_exp
        game.r_hist = r_exp
        game.w_hist = w_exp
        game.u_hist = len(t_exp)*[0]
        game.y_hist = len(t_exp)*[0]
        game.u_current = 0 # persistent variable needed for keyboard input

        # Run tracking experiment
        (u_exp, y_exp) = game.run_tracking_experiment(elementModel=elementModel, modelicaFile=os.environ['MANTRA_MOFILE'])

        # Save results
        tools.write_data_csv(dirName=os.environ['MANTRA_TEMP'], fileName=taskName+'_exp.csv', dataCols=(t_exp, r_exp, y_exp, w_exp, u_exp))
        if saveResults:
            functionName = 'RunTrackingExperiment'
            timeStamp = time.strftime("%Y.%m.%d-%H.%M.%S", time.localtime())
            fileName = eval(saveFormat)
            tools.write_data_csv(dirName=os.environ['MANTRA_DATA'], fileName=fileName+'.csv', dataCols=(t_exp, r_exp, y_exp, w_exp, u_exp))

    if plotResults:
        tools.plot_variable_trajectories(t_exp, ((r_exp, y_exp, 'Reference State', 'Measured State'), (w_exp, u_exp, 'Disturbance Input', 'Control Input')), "Experimental Tracking Task")

    # Stop OMC Server
    fmi.stop_openmodelica_server()
Пример #2
0
def run_tracking_simulation(FMUMODEL=False, modifiedParams=False, inputData=False, plotResults=False, saveResults=False, runOnce=False):
    if not FMUMODEL: # if FMU not provided, then compile FMU
        fmuName = fmi.compile_fmu_openmodelica(taskModel, moFile, saveDir=os.environ['MANTRA_TEMP'], printVerbose=printVerbose)
        FMUMODEL = fmi.load_fmu_pyfmi(fmuName, logFile, printVerbose=printVerbose)
    
    if modifiedParams: # go through modifiedParams dict
        for oneKey in modifiedParams.keys():
            paramString = controllerName + '.' + oneKey
            FMUMODEL.set(paramString, modifiedParams[oneKey])

    if inputData:
        (t_data, r_data, y_data, w_data, u_data) = inputData
        controlVecs = numpy.transpose(numpy.vstack((t_data, r_data, y_data, w_data)))
        controlInput = ([controllerName+'.r', controllerName+'.y', controllerName+'.w'], controlVecs)
    else: 
        controlInput = False 

    # Simulate model
    fmuOpts = fmi.set_fmu_options(True, resultFile, stepTime, solverName=odeSolver)
    fmuResults = FMUMODEL.simulate(options=fmuOpts, start_time=0, final_time=finalTime)
    FMUMODEL.reset()

    # Extract data
    t_sim = fmuResults['time']
    r_sim = fmuResults[controllerName+'.r']
    y_sim = fmuResults[controllerName+'.y']
    w_sim = fmuResults[controllerName+'.w']
    u_sim = fmuResults[controllerName+'.u']

    # Save results
    tools.write_data_csv(dirName=os.environ['MANTRA_TEMP'], fileName=taskName+'_sim.csv', dataCols=(t_sim, r_sim, y_sim, w_sim, u_sim))
    if saveResults:
        functionName = 'RunTrackingSimulation'
        timeStamp = time.strftime("%Y.%m.%d-%H.%M.%S", time.localtime())
        fileName = eval(saveFormat)
        tools.write_data_csv(dirName=os.environ['MANTRA_DATA'], fileName=fileName+'.csv', dataCols=(t_sim, r_sim, y_sim, w_sim, u_sim))

    if plotResults:
        tools.plot_variable_trajectories(t_sim, ((r_sim, y_sim, 'Reference State', 'Measured State'), (w_sim, u_sim, 'Disturbance Input', 'Control Input')), "Simulated Tracking Task")

    # Stop OMC Server if only running once
    if runOnce:
        fmi.stop_openmodelica_server()