# create a second axis for onother data set # to better visualize different scaled measures fig1_ax2 = fig1_ax1.twinx() fig1_ax2.set_ylabel("angular velocity (deg/s)", color='r') fig1_ax2.tick_params("y", colors='r') fig1_ax2.plot(times, -angular_velocities[2], color='r') fig1_ax2.set_ylim(ylim) fig1_ax2.set_xlim(xlim) plt.legend() if __name__ == "__main__": window_size = 20 # currently default format is unmodified fullinertial but other formats are / will be supported times, coordinates, altitudes, gps_speed, heading, accelerations, angular_velocities = parse_input( sys.argv[1], [InputType.UNMOD_FULLINERTIAL]) converts_measurement_units(accelerations, np.array([0.1]), gps_speed, coordinates, heading) normalize_timestamp(times) data_preprocessing_plot("Before") # reduce accelerations disturbance times, accelerations = reduce_disturbance(times, accelerations, window_size) # reduce angular velocities disturbance _, angular_velocities = reduce_disturbance(times, angular_velocities, window_size) # slice gps_speed to remove null values
def get_trajectory_from_path(path): """ parse input file from path, clean data and integrate positions :param path: string input file :return: 3 numpy array: 3xn position, 1xn times, 4xn angular position as quaternions """ window_size = 20 # currently default format is unmodified fullinertial but other formats are / will be supported times, coordinates, altitudes, gps_speed, heading, accelerations, angular_velocities = parse_input( path, [InputType.UNMOD_FULLINERTIAL]) converts_measurement_units(accelerations, angular_velocities, gps_speed, coordinates, heading) # get positions from GNSS data gnss_positions, headings_2 = get_positions(coordinates, altitudes) # reduce accelerations disturbance times, accelerations = reduce_disturbance(times, accelerations, window_size) # reduce angular velocities disturbance _, angular_velocities = reduce_disturbance(times, angular_velocities, window_size) # truncate other array to match length of acc, thetas, times array gnss_positions = gnss_positions[:, round(window_size / 2):-round(window_size / 2)] # with "final" times now get velocities and real_velocities = get_velocities(times, gnss_positions) # scalar speed from GNSS position (better than from dataset because avoids Kalmar filter) real_speeds = np.linalg.norm(real_velocities, axis=0) # get time windows where vehicle is stationary stationary_times = get_stationary_times(gps_speed) # clear gyroscope drift angular_velocities = clear_gyro_drift(angular_velocities, stationary_times) # set times start to 0 normalize_timestamp(times) # correct z-axis alignment accelerations, angular_velocities = correct_z_orientation( accelerations, angular_velocities, stationary_times) # remove g accelerations[2] -= accelerations[ 2, stationary_times[0][0]:stationary_times[0][-1]].mean() # correct alignment in xy plane #accelerations = correct_xy_orientation(accelerations, angular_velocities) motion_time = get_first_motion_time(stationary_times, gnss_positions) initial_angular_position = get_initial_angular_position( gnss_positions, motion_time) # convert to laboratory frame of reference accelerations, angular_positions = rotate_accelerations( times, accelerations, angular_velocities, heading, initial_angular_position) # rotate to align y to north, x to east accelerations = align_to_world(gnss_positions, accelerations, motion_time) # angular position doesn't need to be aligned to world if starting angular position is already aligned and following # angular positions are calculated from that initial_speed = np.array([[gps_speed[0]], [0], [0]]) # integrate acceleration with gss velocities correction correct_velocities = cumulative_integrate(times, accelerations, initial_speed, adjust_data=real_velocities, adjust_frequency=1) if sign_inversion_is_necessary(correct_velocities): accelerations *= -1 correct_velocities *= -1 correct_position = cumulative_integrate(times, correct_velocities, adjust_data=gnss_positions, adjust_frequency=1) return correct_position, times, angular_positions
You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. """ import numpy as np import matplotlib.pyplot as plt from src.input_manager import parse_input, InputType from src.clean_data_utils import converts_measurement_units from src.gnss_utils import get_positions from plots_scripts.plot_utils import plot_vectors if __name__ == "__main__": # load dataset crash_01_dataset = 'tests/test_fixtures/split_log_1321_1322_USB0_unmodified-fullinertial.txt' times, coordinates, altitudes, gps_speed, heading, accelerations, angular_velocities = parse_input( crash_01_dataset, [InputType.UNMOD_FULLINERTIAL]) converts_measurement_units(accelerations, angular_velocities, gps_speed, coordinates) #get cartesian position from world one gnss_positions, headings = get_positions(coordinates, altitudes) # creates empty array to fill approx_points = np.zeros((2, len(times))) # size of step using iterating array step = round(len(times) / 10) for i in range(0, len(times), step): # creates local slice of times and positions local_times = times[i:i + step] local_positions = gnss_positions[0:2, i:i + step] # calculate coefficients of polynomial approximation for x-coordinates poly_x = np.polyfit(local_times, local_positions[0], deg=1) # calculate coefficients of polynomial approximation for y-coordinates
from src.gnss_utils import get_positions, get_velocities, get_accelerations from src.input_manager import parse_input, InputType from src.integrate import cumulative_integrate if __name__ == '__main__': window_size = 20 # for benchmarking import time start_time = time.time() #input path parking_fullinertial_unmod = 'tests/test_fixtures/parking.tsv' crash = False times, coordinates, altitudes, gps_speed, heading, accelerations, angular_velocities = parse_input( parking_fullinertial_unmod, [InputType.UNMOD_FULLINERTIAL]) converts_measurement_units(accelerations, angular_velocities, gps_speed, coordinates, heading) period = times[1] - times[0] times, gps_speed, accelerations, angular_velocities, coordinates, heading = \ truncate_if_crash(crash, times, gps_speed, accelerations, angular_velocities, coordinates, heading) # get positions from GNSS data gnss_positions, headings_2 = get_positions(coordinates, altitudes) gnss_distance = np.linalg.norm(np.array([gnss_positions[:, i] - gnss_positions[:, i - 1] for i, x in enumerate(gnss_positions[:, 1:].T, 1)]), axis=1).cumsum() # insert initial distance gnss_distance = np.insert(gnss_distance, 0, 0) # reshape to 1xn shape gnss_distance = np.reshape(gnss_distance, (1, len(gnss_distance)))
def setUp(self): filepath = 'tests/test_fixtures/crash_01.txt' self.times, self.gps_speed, self.accelerations, self.angular_velocities = parse_input( filepath, [InputType.INERTIAL]) converts_measurement_units(self.accelerations, self.angular_velocities, self.gps_speed)