|
|
|
@ -8,9 +8,11 @@ from tqdm import tqdm |
|
|
|
|
|
|
|
|
|
import cereal.messaging as messaging |
|
|
|
|
from cereal import log |
|
|
|
|
from cereal.visionipc.visionipc_pyx import VisionIpcServer, VisionStreamType # pylint: disable=no-name-in-module, import-error |
|
|
|
|
from common.spinner import Spinner |
|
|
|
|
from common.timeout import Timeout |
|
|
|
|
from common.transformations.camera import get_view_frame_from_road_frame |
|
|
|
|
from common.transformations.camera import get_view_frame_from_road_frame, eon_f_frame_size, tici_f_frame_size |
|
|
|
|
from selfdrive.hardware import PC |
|
|
|
|
from selfdrive.manager.process_config import managed_processes |
|
|
|
|
from selfdrive.test.openpilotci import BASE_URL, get_url |
|
|
|
|
from selfdrive.test.process_replay.compare_logs import compare_logs, save_log |
|
|
|
@ -29,25 +31,20 @@ def replace_calib(msg, calib): |
|
|
|
|
return msg |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def camera_replay(lr, fr, desire=None, calib=None): |
|
|
|
|
def model_replay(lr, fr, desire=None, calib=None): |
|
|
|
|
|
|
|
|
|
spinner = Spinner() |
|
|
|
|
spinner.update("starting model replay") |
|
|
|
|
|
|
|
|
|
vipc_server = None |
|
|
|
|
pm = messaging.PubMaster(['roadCameraState', 'liveCalibration', 'lateralPlan']) |
|
|
|
|
sm = messaging.SubMaster(['modelV2']) |
|
|
|
|
|
|
|
|
|
# TODO: add dmonitoringmodeld |
|
|
|
|
print("preparing procs") |
|
|
|
|
managed_processes['camerad'].prepare() |
|
|
|
|
managed_processes['modeld'].prepare() |
|
|
|
|
try: |
|
|
|
|
print("starting procs") |
|
|
|
|
managed_processes['camerad'].start() |
|
|
|
|
managed_processes['modeld'].start() |
|
|
|
|
time.sleep(5) |
|
|
|
|
sm.update(1000) |
|
|
|
|
print("procs started") |
|
|
|
|
|
|
|
|
|
desires_by_index = {v:k for k,v in log.LateralPlan.Desire.schema.enumerants.items()} |
|
|
|
|
|
|
|
|
@ -68,26 +65,33 @@ def camera_replay(lr, fr, desire=None, calib=None): |
|
|
|
|
pm.send('lateralPlan', dat) |
|
|
|
|
|
|
|
|
|
f = msg.as_builder() |
|
|
|
|
img = fr.get(frame_idx, pix_fmt="rgb24")[0][:,:,::-1] |
|
|
|
|
f.roadCameraState.image = img.flatten().tobytes() |
|
|
|
|
frame_idx += 1 |
|
|
|
|
|
|
|
|
|
pm.send(msg.which(), f) |
|
|
|
|
|
|
|
|
|
img = fr.get(frame_idx, pix_fmt="yuv420p")[0] |
|
|
|
|
if vipc_server is None: |
|
|
|
|
w, h = {int(3*w*h/2): (w, h) for (w, h) in [tici_f_frame_size, eon_f_frame_size]}[len(img)] |
|
|
|
|
vipc_server = VisionIpcServer("camerad") |
|
|
|
|
vipc_server.create_buffers(VisionStreamType.VISION_STREAM_YUV_BACK, 40, False, w, h) |
|
|
|
|
vipc_server.start_listener() |
|
|
|
|
time.sleep(1) # wait for modeld to connect |
|
|
|
|
|
|
|
|
|
vipc_server.send(VisionStreamType.VISION_STREAM_YUV_BACK, img.flatten().tobytes(), f.roadCameraState.frameId, |
|
|
|
|
f.roadCameraState.timestampSof, f.roadCameraState.timestampEof) |
|
|
|
|
|
|
|
|
|
with Timeout(seconds=15): |
|
|
|
|
log_msgs.append(messaging.recv_one(sm.sock['modelV2'])) |
|
|
|
|
|
|
|
|
|
spinner.update("modeld replay %d/%d" % (frame_idx, fr.frame_count)) |
|
|
|
|
|
|
|
|
|
frame_idx += 1 |
|
|
|
|
if frame_idx >= fr.frame_count: |
|
|
|
|
break |
|
|
|
|
except KeyboardInterrupt: |
|
|
|
|
pass |
|
|
|
|
|
|
|
|
|
print("replay done") |
|
|
|
|
finally: |
|
|
|
|
spinner.close() |
|
|
|
|
managed_processes['modeld'].stop() |
|
|
|
|
time.sleep(2) |
|
|
|
|
managed_processes['camerad'].stop() |
|
|
|
|
|
|
|
|
|
return log_msgs |
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
@ -100,7 +104,7 @@ if __name__ == "__main__": |
|
|
|
|
lr = LogReader(get_url(TEST_ROUTE, 0)) |
|
|
|
|
fr = FrameReader(get_url(TEST_ROUTE, 0, log_type="fcamera")) |
|
|
|
|
|
|
|
|
|
log_msgs = camera_replay(list(lr), fr) |
|
|
|
|
log_msgs = model_replay(list(lr), fr) |
|
|
|
|
|
|
|
|
|
failed = False |
|
|
|
|
if not update: |
|
|
|
@ -111,8 +115,9 @@ if __name__ == "__main__": |
|
|
|
|
ignore = ['logMonoTime', 'valid', |
|
|
|
|
'modelV2.frameDropPerc', |
|
|
|
|
'modelV2.modelExecutionTime'] |
|
|
|
|
tolerance = None if not PC else 1e-3 |
|
|
|
|
results: Any = {TEST_ROUTE: {}} |
|
|
|
|
results[TEST_ROUTE]["modeld"] = compare_logs(cmp_log, log_msgs, ignore_fields=ignore) |
|
|
|
|
results[TEST_ROUTE]["modeld"] = compare_logs(cmp_log, log_msgs, tolerance=tolerance, ignore_fields=ignore) |
|
|
|
|
diff1, diff2, failed = format_diff(results, ref_commit) |
|
|
|
|
|
|
|
|
|
print(diff2) |