def test_free_integration():
    '''
    test Sim
    '''
    #### do not need an IMU model
    imu = None

    #### Algorithm
    from demo_algorithms import free_integration
    ini_pos_vel_att = np.genfromtxt(log_dir+"ini.txt", delimiter=',')
    ini_pos_vel_att[0:2] *= attitude.D2R  # For Lat and Lon, deg to rad
    ini_pos_vel_att[6:9] *= attitude.D2R  # Attitude from deg to rad
    if not using_external_g:
        ini_pos_vel_att = ini_pos_vel_att[0:9]
    # create the algorithm object
    algo = free_integration.FreeIntegration(ini_pos_vel_att, earth_rot=False)

    from demo_algorithms import inclinometer_acc
    algo2 = inclinometer_acc.TiltAcc()

    #### start simulation
    sim = ins_sim.Sim([fs, 0.0, 0.0],
                      log_dir,
                      ref_frame=0,
                      imu=imu,
                      mode=None,
                      env=None,
                      algorithm=[algo, algo2])
    # run the simulation
    sim.run(1)
    # generate simulation results, summary
    sim.results('', end_point=True, extra_opt='ned')
    # plot
    sim.plot(['pos', 'vel', 'att_euler', 'accel', 'gyro'],
             opt={'pos':'error', 'vel':'error', 'att_euler':'error'})
示例#2
0
def test_free_integration():
    '''
    test Sim
    '''
    #### IMU model, typical for IMU381
    imu_err = {'gyro_b': np.array([0.0, 0.0, 0.0]),
               'gyro_arw': np.array([0.25, 0.25, 0.25]) * 1.0,
               'gyro_b_stability': np.array([3.5, 3.5, 3.5]) * 1.0,
               'gyro_b_corr': np.array([100.0, 100.0, 100.0]),
               'accel_b': np.array([0.0e-3, 0.0e-3, 0.0e-3]),
               'accel_vrw': np.array([0.03119, 0.03009, 0.04779]) * 1.0,
               'accel_b_stability': np.array([4.29e-5, 5.72e-5, 8.02e-5]) * 1.0,
               'accel_b_corr': np.array([200.0, 200.0, 200.0]),
               'mag_std': np.array([0.2, 0.2, 0.2]) * 1.0
              }
    odo_err = {'scale': 0.999,
               'stdv': 0.1}
    # do not generate GPS and magnetometer data
    imu = imu_model.IMU(accuracy=imu_err, axis=6, gps=False, odo=True, odo_opt=odo_err)

    #### Algorithm
    # Free integration in a virtual inertial frame
    from demo_algorithms import free_integration_odo
    from demo_algorithms import free_integration
    '''
    Free integration requires initial states (position, velocity and attitude). You should provide
    theses values when you create the algorithm object.
    '''
    ini_pos_vel_att = np.genfromtxt(motion_def_path+"//motion_def-90deg_turn.csv",\
                                    delimiter=',', skip_header=1, max_rows=1)
    ini_pos_vel_att[0] = ini_pos_vel_att[0] * D2R
    ini_pos_vel_att[1] = ini_pos_vel_att[1] * D2R
    ini_pos_vel_att[6:9] = ini_pos_vel_att[6:9] * D2R
    # add initial states error if needed
    ini_vel_err = np.array([0.0, 0.0, 0.0]) # initial velocity error in the body frame, m/s
    ini_att_err = np.array([0.0, 0.0, 0.0]) # initial Euler angles error, deg
    ini_pos_vel_att[3:6] += ini_vel_err
    ini_pos_vel_att[6:9] += ini_att_err * D2R
    # create the algorith object
    algo1 = free_integration_odo.FreeIntegration(ini_pos_vel_att)
    algo2 = free_integration.FreeIntegration(ini_pos_vel_att)

    #### start simulation
    sim = ins_sim.Sim([fs, 0.0, 0.0],
                      motion_def_path+"//motion_def-90deg_turn.csv",
                      ref_frame=1,
                      imu=imu,
                      mode=None,
                      env=None,
                      algorithm=[algo1, algo2])
    # run the simulation for 1000 times
    sim.run(10)
    # generate simulation results, summary
    # do not save data since the simulation runs for 1000 times and generates too many results
    sim.results(err_stats_start=-1, gen_kml=True)
示例#3
0
def test_free_integration():
    '''
    test Sim
    '''
    #### do not need an IMU model
    imu = None

    #### Algorithm
    # Free integration in a virtual inertial frame
    from demo_algorithms import free_integration
    ini_pos_vel_att = np.genfromtxt(log_dir + "ini.txt")
    # add initial states error if needed
    ini_vel_err = np.array([0.0, 0.0, 0.0
                            ])  # initial velocity error in the body frame, m/s
    ini_att_err = np.array([0.0, 0.0, 0.0])  # initial Euler angles error, deg
    ini_pos_vel_att[0:2] = ini_pos_vel_att[0:2] * attitude.D2R
    ini_pos_vel_att[3:6] += ini_vel_err
    ini_pos_vel_att[6:9] = (ini_pos_vel_att[6:9] + ini_att_err) * attitude.D2R
    if not using_external_g:
        ini_pos_vel_att = ini_pos_vel_att[0:9]
    # create the algorithm object
    algo = free_integration.FreeIntegration(ini_pos_vel_att, earth_rot=False)

    from demo_algorithms import inclinometer_acc
    algo2 = inclinometer_acc.TiltAcc()

    #### start simulation
    sim = ins_sim.Sim([fs, 0.0, 0.0],
                      log_dir,
                      ref_frame=0,
                      imu=imu,
                      mode=None,
                      env=None,
                      algorithm=[algo, algo2])
    # run the simulation
    sim.run(1)
    # generate simulation results, summary
    sim.results('', end_point=True, extra_opt='ned')
    # plot
    sim.plot(['pos', 'vel', 'att_euler', 'accel'],
             opt={
                 'pos': 'error',
                 'vel': 'error',
                 'att_euler': 'error'
             })
def test_gen_data_from_files(data_dir):
    '''
    test data generation from files.
    '''
    #### start simulation
    #### Algorithm
    # Free integration in a virtual inertial frame
    from demo_algorithms import free_integration
    '''
    Free integration requires initial states (position, velocity and attitude). You should provide
    theses values when you create the algorithm object.
    '''
    ini_pos_vel_att = np.genfromtxt(motion_def_path+"//motion_def-90deg_turn.csv",\
                                    delimiter=',', skip_header=1, max_rows=1)
    ini_pos_vel_att[0] = ini_pos_vel_att[0] * D2R
    ini_pos_vel_att[1] = ini_pos_vel_att[1] * D2R
    ini_pos_vel_att[6:9] = ini_pos_vel_att[6:9] * D2R
    # add initial states error if needed
    ini_vel_err = np.array([0.0, 0.0, 0.0
                            ])  # initial velocity error in the body frame, m/s
    ini_att_err = np.array([0.0, 0.0, 0.0])  # initial Euler angles error, deg
    ini_pos_vel_att[3:6] += ini_vel_err
    ini_pos_vel_att[6:9] += ini_att_err * D2R
    # create the algorith object
    algo = free_integration.FreeIntegration(ini_pos_vel_att)

    #### start simulation
    sim = ins_sim.Sim([fs, 0.0, 0.0],
                      data_dir,
                      ref_frame=0,
                      imu=None,
                      mode=None,
                      env=None,
                      algorithm=None)
    # run the simulation for 1000 times
    sim.run(1)
    # generate simulation results, summary
    # do not save data since the simulation runs for 1000 times and generates too many results
    sim.results('', err_stats_start=-1, gen_kml=True)
    sim.plot(['att_euler'])
示例#5
0
文件: run.py 项目: blueshu/simulation
def run_simulation(data, fileName, request_body):
    '''
    An Allan analysis demo for Sim.
    '''
    #### Customized IMU model parameters, typical for IMU381
    rateJSON = json.loads(data.rateJSON, object_hook=JSONObject)
    accelJSON = json.loads(data.accelJSON, object_hook=JSONObject)
    axisNum = 6
    gpsFlag = False
    gpsObj = {}
    imu_err = {
        'gyro_b':
        np.array(
            [float(rateJSON.b[0]),
             float(rateJSON.b[1]),
             float(rateJSON.b[2])]),
        'gyro_arw':
        np.array([
            float(rateJSON.arw[0]),
            float(rateJSON.arw[1]),
            float(rateJSON.arw[2])
        ]) * 1.0,
        'gyro_b_stability':
        np.array([
            float(rateJSON.b_drift[0]),
            float(rateJSON.b_drift[1]),
            float(rateJSON.b_drift[2])
        ]) * 1.0,
        'gyro_b_corr':
        np.array([
            float(rateJSON.b_corr[0]),
            float(rateJSON.b_corr[1]),
            float(rateJSON.b_corr[2])
        ]),
        'accel_b':
        np.array([
            float(accelJSON.b[0]),
            float(accelJSON.b[1]),
            float(accelJSON.b[2])
        ]),
        'accel_vrw':
        np.array([
            float(accelJSON.vrw[0]),
            float(accelJSON.vrw[1]),
            float(accelJSON.vrw[2])
        ]) * 1.0,
        'accel_b_stability':
        np.array([
            float(accelJSON.b_drift[0]),
            float(accelJSON.b_drift[1]),
            float(accelJSON.b_drift[2])
        ]) * 1.0,
        'accel_b_corr':
        np.array([
            float(accelJSON.b_corr[0]),
            float(accelJSON.b_corr[1]),
            float(accelJSON.b_corr[2])
        ])
    }

    if 'magJSON' in request_body:
        axisNum = 9
        magJSON = json.loads(data.magJSON, object_hook=JSONObject)
        imu_err['mag_std'] = np.array([
            float(magJSON.std[0]),
            float(magJSON.std[1]),
            float(magJSON.std[2])
        ]) * 1.0
        if 'si' in data.magJSON:
            imu_err['mag_si'] = np.array([[
                float(magJSON.si[0]),
                float(magJSON.si[1]),
                float(magJSON.si[2])
            ],
                                          [
                                              float(magJSON.si[3]),
                                              float(magJSON.si[4]),
                                              float(magJSON.si[5])
                                          ],
                                          [
                                              float(magJSON.si[6]),
                                              float(magJSON.si[7]),
                                              float(magJSON.si[8])
                                          ]])
        if 'hi' in data.magJSON:
            imu_err['mag_hi'] = np.array([
                float(magJSON.hi[0]),
                float(magJSON.hi[1]),
                float(magJSON.hi[2])
            ])
    if 'gpsJSON' in request_body:
        gpsFlag = True
        gpsJSON = json.loads(data.gpsJSON, object_hook=JSONObject)
        gpsObj['stdp'] = np.array([
            float(gpsJSON.stdp[0]),
            float(gpsJSON.stdp[1]),
            float(gpsJSON.stdp[2])
        ])
        gpsObj['stdv'] = np.array([
            float(gpsJSON.stdv[0]),
            float(gpsJSON.stdv[1]),
            float(gpsJSON.stdv[2])
        ])
        gpsObj['avail'] = 0.95
    # do not generate GPS and magnetometer data
    imu = imu_model.IMU(accuracy=imu_err,
                        axis=axisNum,
                        gps=gpsFlag,
                        gps_opt=gpsObj)
    if data.algorithmName == 'Allan':
        Allanfs = 100.0  # IMU sample frequency
        #### Allan analysis algorithm
        from demo_algorithms import allan_analysis
        algo = allan_analysis.Allan()
        #### start simulation
        sim = ins_sim.Sim([Allanfs, Allanfs, 0.0],
                          motion_def_path + "//motion_def-Allan.csv",
                          ref_frame=data.ref_frame,
                          imu=imu,
                          mode=None,
                          env=None,
                          algorithm=algo,
                          fileName=fileName,
                          data=data)
        sim.run(data.algorithmRunTimes)
        # generate simulation results, summary, and save data to files
        sim.results(fileName, gen_kml=True,
                    update_flag=True)  # save data files
        # plot data
        #sim.plot(['ad_accel', 'ad_gyro'])

    elif data.algorithmName == 'FreeIntegration':
        Freefs = 100.0  # IMU sample frequency
        # Free integration in a virtual inertial frame
        ini_pos_vel_att = np.fromstring(data.algorithmParams,
                                        dtype=float,
                                        sep=',')
        #ini_pos_vel_att[0] = ini_pos_vel_att[0] * D2R
        #ini_pos_vel_att[1] = ini_pos_vel_att[1] * D2R
        #ini_pos_vel_att[6:9] = ini_pos_vel_att[6:9] * D2R
        # add initial states error if needed
        #ini_vel_err = np.array([0.0, 0.0, 0.0]) # initial velocity error in the body frame, m/s
        #ini_att_err = np.array([0.0, 0.0, 0.0]) # initial Euler angles error, deg
        #ini_pos_vel_att[3:6] += ini_vel_err
        #ini_pos_vel_att[6:9] += ini_att_err * D2R

        from demo_algorithms import free_integration
        algo = free_integration.FreeIntegration(ini_pos_vel_att)
        staticsFlag = data.algorithmStatistics == 'end-point'
        sim = ins_sim.Sim([Freefs, Freefs, 0.0],
                          motion_def_path + "//motion_def-90deg_turn.csv",
                          ref_frame=data.ref_frame,
                          imu=imu,
                          mode=None,
                          env=None,
                          algorithm=algo,
                          fileName=fileName,
                          data=data)
        # run the simulation for 1000 times
        sim.run(data.algorithmRunTimes)
        # generate simulation results, summary
        # do not save data since the simulation runs for 1000 times and generates too many results
        sim.results(fileName,
                    gen_kml=True,
                    end_point=staticsFlag,
                    update_flag=True,
                    extra_opt='ned')

    elif data.algorithmName == 'VG':
        VGfs = 200.0  # IMU sample frequency
        from demo_algorithms import aceinna_vg
        cfg_file = os.path.abspath(
            './/demo_algorithms//dmu380_sim_lib//ekfSim_tilt.cfg')
        algo = aceinna_vg.DMU380Sim(cfg_file)
        sim = ins_sim.Sim(
            [VGfs, VGfs, VGfs],
            "//mnt//share//jd_figure8.csv",
            ref_frame=data.ref_frame,
            imu=imu,
            mode=None,
            env=None,  #'[0.1 0.01 0.11]g-random',
            algorithm=algo,
            fileName=fileName,
            data=data)
        sim.run(data.algorithmRunTimes)
        # generate simulation results, summary, and save data to files
        sim.results(
            fileName,
            gen_kml=True,
            update_flag=True,
        )  # do not save data

    elif data.algorithmName == 'INS':
        INSfs = 200.0  # IMU sample frequency
        from demo_algorithms import aceinna_ins
        cfg_file = os.path.abspath(
            './/demo_algorithms//dmu380_sim_lib//ekfSim_ins.cfg')
        algo = aceinna_ins.DMU380Sim(cfg_file)
        sim = ins_sim.Sim(
            [INSfs, INSfs, INSfs],
            "//mnt//share//jd_figure8.csv",
            ref_frame=data.ref_frame,
            imu=imu,
            mode=None,
            env=None,  #'[0.1 0.01 0.11]g-random',
            algorithm=algo,
            fileName=fileName,
            data=data)
        sim.run(data.algorithmRunTimes)
        # generate simulation results, summary, and save data to files
        sim.results(
            fileName,
            gen_kml=True,
            update_flag=True,
        )  # do not save data
    # motion_path_filename = "\motion_def_linemerge.csv"
    # motion_path_filename = "\motion_def-90deg_turn.csv"

    # motion_path_filename = "\motion_def_linemerge.csv"
    motion_path_filename = "\motion_def_70_mph_straight_20sec.csv"
    # motion_path_filename = "\motion_def_70_mph_straight.csv"
    # motion_path_filename = "//motion_def-long_drive.csv"
    print(motion_def_path + motion_path_filename)

    # Create IMU model with parameters and initial state vector
    imu_model = imu_creation(arw_input=arw, bias_input=gyro_bias)
    initial_state_vector = initial_state(motion_path_filename)
    print(initial_state_vector)
    # choose algorithm in library (here we use multiple)
    algo1 = free_integration_odo.FreeIntegration(initial_state_vector)
    algo2 = free_integration.FreeIntegration(initial_state_vector)

    # Create the simulation object that will be simulated
    sim_object_1 = create_sim_object(algo1, motion_path_filename)
    # sim_object_2 = create_sim_object(algo2)

    # run the simulation for a number of times
    sim_object_1.run(5)
    # sim_object_2.run(10)

    # -----------------------------RESULTS SECTION--------------------------------------------
    # generate simulation results, summary
    # do not save data since the simulation runs for 1000 times and generates too many results
    sim_object_1.results('', err_stats_start=-1, gen_kml=True)
    # sim_object_2.results(err_stats_start=-1, gen_kml=True)
    # sim_object_1.plot(['ref_pos'])