#!/usr/bin/env python3 # pylint: skip-file # flake8: noqa # type: ignore import math import multiprocessing import numpy as np from tqdm import tqdm from selfdrive.locationd.paramsd import ParamsLearner, States from tools.lib.logreader import LogReader from tools.lib.route import Route ROUTE = "b2f1615665781088|2021-03-14--17-27-47" PLOT = True def load_segment(segment_name): print(f"Loading {segment_name}") if segment_name is None: return [] try: return list(LogReader(segment_name)) except ValueError as e: print(f"Error parsing {segment_name}: {e}") return [] if __name__ == "__main__": route = Route(ROUTE) msgs = [] with multiprocessing.Pool(24) as pool: for d in pool.map(load_segment, route.log_paths()): msgs += d for m in msgs: if m.which() == 'carParams': CP = m.carParams break params = { 'carFingerprint': CP.carFingerprint, 'steerRatio': CP.steerRatio, 'stiffnessFactor': 1.0, 'angleOffsetAverageDeg': 0.0, } for m in msgs: if m.which() == 'liveParameters': params['steerRatio'] = m.liveParameters.steerRatio params['angleOffsetAverageDeg'] = m.liveParameters.angleOffsetAverageDeg break for m in msgs: if m.which() == 'carState': last_carstate = m break print(params) learner = ParamsLearner(CP, params['steerRatio'], params['stiffnessFactor'], math.radians(params['angleOffsetAverageDeg'])) msgs = [m for m in tqdm(msgs) if m.which() in ('liveLocationKalman', 'carState', 'liveParameters')] msgs = sorted(msgs, key=lambda m: m.logMonoTime) ts = [] ts_log = [] results = [] results_log = [] for m in tqdm(msgs): if m.which() == 'carState': last_carstate = m elif m.which() == 'liveLocationKalman': t = last_carstate.logMonoTime / 1e9 learner.handle_log(t, 'carState', last_carstate.carState) t = m.logMonoTime / 1e9 learner.handle_log(t, 'liveLocationKalman', m.liveLocationKalman) x = learner.kf.x sr = float(x[States.STEER_RATIO]) st = float(x[States.STIFFNESS]) ao_avg = math.degrees(x[States.ANGLE_OFFSET]) ao = ao_avg + math.degrees(x[States.ANGLE_OFFSET_FAST]) r = [sr, st, ao_avg, ao] if any(math.isnan(v) for v in r): print("NaN", t) ts.append(t) results.append(r) elif m.which() == 'liveParameters': t = m.logMonoTime / 1e9 mm = m.liveParameters r = [mm.steerRatio, mm.stiffnessFactor, mm.angleOffsetAverageDeg, mm.angleOffsetDeg] if any(math.isnan(v) for v in r): print("NaN in log", t) ts_log.append(t) results_log.append(r) results = np.asarray(results) results_log = np.asarray(results_log) if PLOT: import matplotlib.pyplot as plt plt.figure() plt.subplot(3, 2, 1) plt.plot(ts, results[:, 0], label='Steer Ratio') plt.grid() plt.ylim([0, 20]) plt.legend() plt.subplot(3, 2, 3) plt.plot(ts, results[:, 1], label='Stiffness') plt.ylim([0, 2]) plt.grid() plt.legend() plt.subplot(3, 2, 5) plt.plot(ts, results[:, 2], label='Angle offset (average)') plt.plot(ts, results[:, 3], label='Angle offset (instant)') plt.ylim([-5, 5]) plt.grid() plt.legend() plt.subplot(3, 2, 2) plt.plot(ts_log, results_log[:, 0], label='Steer Ratio') plt.grid() plt.ylim([0, 20]) plt.legend() plt.subplot(3, 2, 4) plt.plot(ts_log, results_log[:, 1], label='Stiffness') plt.ylim([0, 2]) plt.grid() plt.legend() plt.subplot(3, 2, 6) plt.plot(ts_log, results_log[:, 2], label='Angle offset (average)') plt.plot(ts_log, results_log[:, 3], label='Angle offset (instant)') plt.ylim([-5, 5]) plt.grid() plt.legend() plt.show()