コード例 #1
0
def validate_ekf_transition_update(show_plot=True):
    # Load pickle
    validation_run = load_pickle(EKF_PICKLE)
    ground_truth_states = validation_run['states']
    u = validation_run['controls']
    dt = validation_run['t'][1:] - validation_run['t'][:-1]
    T = validation_run['t'].shape[0]

    # Initialize EKF localization
    ekf_loc = EkfLocalization(ground_truth_states[0],
                              NoiseParams['Sigma0'],
                              NoiseParams['R'],
                              params.MapParams,
                              validation_run['tf_base_to_camera'],
                              NoiseParams['g'])

    # Simulate controls
    open_loop_states = np.zeros((T, ekf_loc.x.shape[0]))
    open_loop_states[0] = ekf_loc.x
    for i in range(T - 1):
        ekf_loc.transition_update(u[i], dt[i])
        open_loop_states[i+1] = ekf_loc.x

    # Plot
    plt.clf()
    plt.plot(ground_truth_states[:,0], ground_truth_states[:,1], label="ground truth", color="black")
    plt.plot(open_loop_states[:,0], open_loop_states[:,1], label="open loop", color="green")
    plt.axis("equal")
    if show_plot:
        plt.legend(loc=0)
        plt.savefig("ekf_open_loop.png")
        print("Plot saved to ekf_open_loop.png")
コード例 #2
0
def validate_ekf_localization(show_plot=True):
    # Plot open loop
    validate_ekf_transition_update(False)

    # Load pickle
    validation_run = load_pickle(EKF_PICKLE)
    u = validation_run['controls']
    t = validation_run['t']
    T = t.shape[0]
    t_scans = validation_run['t_scans']
    T_scans = t_scans.shape[0]
    scans = validation_run['scans']

    # Initialize EKF localization
    ekf_loc = EkfLocalization(validation_run['states'][0],
                              NoiseParams['Sigma0'],
                              NoiseParams['R'],
                              params.MapParams,
                              validation_run['tf_base_to_camera'],
                              NoiseParams['g'])

    # Iterate over states
    ekf_states = np.zeros((T, ekf_loc.x.shape[0]))
    ekf_states[0] = ekf_loc.x
    scan_states = np.zeros((T_scans, ekf_loc.x.shape[0]))
    scan_idx = 0
    for i in range(T - 1):
        t1 = t[i+1]
        t0 = t[i]

        # Iterate over scans
        while scan_idx < T_scans and t_scans[scan_idx] < t1:
            # Transition update
            ekf_loc.transition_update(u[i], t_scans[scan_idx] - t0)
            t0 = t_scans[scan_idx]

            # Measurement update
            alpha, r, Q_raw, _, _ = ExtractLines(scans[0,scan_idx,:],
                                                 scans[1,scan_idx,:],
                                                 LineExtractionParams,
                                                 NoiseParams['var_theta'],
                                                 NoiseParams['var_rho'])
            z_raw = np.vstack((alpha, r))
            ekf_loc.measurement_update(z_raw, Q_raw)
            scan_states[scan_idx] = ekf_loc.x
            scan_idx += 1

        # Transition update
        ekf_loc.transition_update(u[i], t1 - t0)
        ekf_states[i+1] = ekf_loc.x

    # Plot
    plt.plot(ekf_states[:,0], ekf_states[:,1], label="EKF (known map)", color="red")
    plt.scatter(scan_states[:,0], scan_states[:,1], marker = "x", label="measurement update", color="blue")
    if show_plot:
        plt.legend(loc=0)
        plt.savefig("ekf_localization.png")
        print("Plot saved to ekf_localization.png")