test_onroad: cleanup with time series LogReader (#34613)

pull/34600/head
Adeeb Shihadeh 2 months ago committed by GitHub
parent b3d5ab6a38
commit a30d3f7d72
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 23
      selfdrive/test/test_onroad.py
  2. 15
      tools/lib/log_time_series.py

@ -23,6 +23,7 @@ from openpilot.selfdrive.test.helpers import set_params_enabled, release_only
from openpilot.system.hardware import HARDWARE from openpilot.system.hardware import HARDWARE
from openpilot.system.hardware.hw import Paths from openpilot.system.hardware.hw import Paths
from openpilot.tools.lib.logreader import LogReader from openpilot.tools.lib.logreader import LogReader
from openpilot.tools.lib.log_time_series import msgs_to_time_series
""" """
CPU usage budget CPU usage budget
@ -119,8 +120,8 @@ class TestOnroad:
if "DEBUG" in os.environ: if "DEBUG" in os.environ:
segs = filter(lambda x: os.path.exists(os.path.join(x, "rlog.zst")), Path(Paths.log_root()).iterdir()) segs = filter(lambda x: os.path.exists(os.path.join(x, "rlog.zst")), Path(Paths.log_root()).iterdir())
segs = sorted(segs, key=lambda x: x.stat().st_mtime) segs = sorted(segs, key=lambda x: x.stat().st_mtime)
print(segs[-3]) cls.lr = list(LogReader(os.path.join(segs[-1], "rlog.zst")))
cls.lr = list(LogReader(os.path.join(segs[-3], "rlog.zst"))) cls.ts = msgs_to_time_series(cls.lr)
return return
# setup env # setup env
@ -174,7 +175,8 @@ class TestOnroad:
cls.lrs = [list(LogReader(os.path.join(str(s), "rlog.zst"))) for s in cls.segments] cls.lrs = [list(LogReader(os.path.join(str(s), "rlog.zst"))) for s in cls.segments]
cls.lr = list(LogReader(os.path.join(str(cls.segments[0]), "rlog.zst"))) cls.lr = cls.lrs[0]
cls.ts = msgs_to_time_series(cls.lr)
cls.log_path = cls.segments[0] cls.log_path = cls.segments[0]
cls.log_sizes = {} cls.log_sizes = {}
@ -186,7 +188,6 @@ class TestOnroad:
for m in cls.lr: for m in cls.lr:
cls.msgs[m.which()].append(m) cls.msgs[m.which()].append(m)
def test_service_frequencies(self, subtests): def test_service_frequencies(self, subtests):
for s, msgs in self.msgs.items(): for s, msgs in self.msgs.items():
if s in ('initData', 'sentinel'): if s in ('initData', 'sentinel'):
@ -200,7 +201,7 @@ class TestOnroad:
assert len(msgs) >= math.floor(SERVICE_LIST[s].frequency*int(TEST_DURATION*0.8)) assert len(msgs) >= math.floor(SERVICE_LIST[s].frequency*int(TEST_DURATION*0.8))
def test_manager_starting_time(self): def test_manager_starting_time(self):
st = self.msgs['managerState'][0].logMonoTime / 1e9 st = self.ts['managerState']['t'][0]
assert (st - self.manager_st) < 10, f"manager.py took {st - self.manager_st}s to publish the first 'managerState' msg" assert (st - self.manager_st) < 10, f"manager.py took {st - self.manager_st}s to publish the first 'managerState' msg"
def test_cloudlog_size(self): def test_cloudlog_size(self):
@ -228,7 +229,7 @@ class TestOnroad:
result += "-------------- UI Draw Timing ------------------\n" result += "-------------- UI Draw Timing ------------------\n"
result += "------------------------------------------------\n" result += "------------------------------------------------\n"
ts = [m.uiDebug.drawTimeMillis for m in self.msgs['uiDebug']] ts = self.ts['uiDebug']['drawTimeMillis']
result += f"min {min(ts):.2f}ms\n" result += f"min {min(ts):.2f}ms\n"
result += f"max {max(ts):.2f}ms\n" result += f"max {max(ts):.2f}ms\n"
result += f"std {np.std(ts):.2f}ms\n" result += f"std {np.std(ts):.2f}ms\n"
@ -315,12 +316,13 @@ class TestOnroad:
assert self.gpu_procs == {"weston", "ui", "camerad", "selfdrive.modeld.modeld", "selfdrive.modeld.dmonitoringmodeld"} assert self.gpu_procs == {"weston", "ui", "camerad", "selfdrive.modeld.modeld", "selfdrive.modeld.dmonitoringmodeld"}
def test_camera_frame_timings(self, subtests): def test_camera_frame_timings(self, subtests):
# test timing within a single camera
result = "\n" result = "\n"
result += "------------------------------------------------\n" result += "------------------------------------------------\n"
result += "----------------- SOF Timing ------------------\n" result += "----------------- SOF Timing ------------------\n"
result += "------------------------------------------------\n" result += "------------------------------------------------\n"
for name in ['roadCameraState', 'wideRoadCameraState', 'driverCameraState']: for name in ['roadCameraState', 'wideRoadCameraState', 'driverCameraState']:
ts = [getattr(m, m.which()).timestampSof for m in self.lr if name in m.which()] ts = self.ts[name]['timestampSof']
d_ms = np.diff(ts) / 1e6 d_ms = np.diff(ts) / 1e6
d50 = np.abs(d_ms-50) d50 = np.abs(d_ms-50)
result += f"{name} sof delta vs 50ms: min {min(d50):.2f}ms\n" result += f"{name} sof delta vs 50ms: min {min(d50):.2f}ms\n"
@ -402,12 +404,7 @@ class TestOnroad:
@release_only @release_only
def test_startup(self): def test_startup(self):
startup_alert = None startup_alert = self.ts['selfdriveState']['alertText1'][0]
for msg in self.lrs[0]:
# can't use onroadEvents because the first msg can be dropped while loggerd is starting up
if msg.which() == "selfdriveState":
startup_alert = msg.selfdriveState.alertText1
break
expected = EVENTS[log.OnroadEvent.EventName.startup][ET.PERMANENT].alert_text_1 expected = EVENTS[log.OnroadEvent.EventName.startup][ET.PERMANENT].alert_text_1
assert startup_alert == expected, "wrong startup alert" assert startup_alert == expected, "wrong startup alert"

@ -19,7 +19,7 @@ def flatten_type_dict(d, sep="/", prefix=None):
def get_message_dict(message, typ): def get_message_dict(message, typ):
valid = message.valid valid = message.valid
message = message._get(typ) message = message._get(typ)
if not hasattr(message, 'to_dict'): if not hasattr(message, 'to_dict') or typ in ('qcomGnss', 'ubloxGnss'):
# TODO: support these # TODO: support these
#print("skipping", typ) #print("skipping", typ)
return return
@ -30,7 +30,7 @@ def get_message_dict(message, typ):
return msg_dict return msg_dict
def append_dict(path, t, d, values, arrays=False): def append_dict(path, t, d, values):
if path not in values: if path not in values:
group = {} group = {}
group["t"] = [] group["t"] = []
@ -40,14 +40,9 @@ def append_dict(path, t, d, values, arrays=False):
else: else:
group = values[path] group = values[path]
if arrays: group["t"].append(t)
group["t"] += t.tolist() for k, v in d.items():
for k, v in d.items(): group[k].append(v)
group[k] += v.tolist()
else:
group["t"].append(t)
for k, v in d.items():
group[k].append(v)
def potentially_ragged_array(arr, dtype=None, **kwargs): def potentially_ragged_array(arr, dtype=None, **kwargs):

Loading…
Cancel
Save