parent
f0bd519ba9
commit
f3863ae6e1
1 changed files with 149 additions and 0 deletions
@ -0,0 +1,149 @@ |
|||||||
|
#!/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')] |
||||||
|
|
||||||
|
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() |
||||||
|
|
Loading…
Reference in new issue