#!/usr/bin/env python3 import time from tqdm import tqdm import selfdrive.manager as manager from cereal.messaging import PubMaster, recv_one, sub_sock from tools.lib.framereader import FrameReader def rreplace(s, old, new, occurrence): li = s.rsplit(old, occurrence) return new.join(li) def regen_model(msgs, pm, frame_reader, model_sock): # Send some livecalibration messages to initalize visiond for msg in msgs: if msg.which() == 'liveCalibration': pm.send('liveCalibration', msg.as_builder()) out_msgs = [] fidx = 0 for msg in tqdm(msgs): w = msg.which() if w == 'frame': msg = msg.as_builder() img = frame_reader.get(fidx, pix_fmt="rgb24")[0][:, ::-1] msg.frame.image = img.flatten().tobytes() pm.send(w, msg) model = recv_one(model_sock) fidx += 1 out_msgs.append(model) elif w == 'liveCalibration': pm.send(w, msg.as_builder()) return out_msgs def inject_model(msgs, segment_name): if segment_name.count('--') == 2: segment_name = rreplace(segment_name, '--', '/', 1) frame_reader = FrameReader('cd:/'+segment_name.replace("|", "/") + "/fcamera.hevc") manager.start_managed_process('camerad') manager.start_managed_process('modeld') # TODO do better than just wait for modeld to boot time.sleep(5) pm = PubMaster(['liveCalibration', 'frame']) model_sock = sub_sock('model') try: out_msgs = regen_model(msgs, pm, frame_reader, model_sock) except (KeyboardInterrupt, SystemExit, Exception) as e: manager.kill_managed_process('modeld') time.sleep(2) manager.kill_managed_process('camerad') raise e manager.kill_managed_process('modeld') time.sleep(2) manager.kill_managed_process('camerad') new_msgs = [] midx = 0 for msg in msgs: if (msg.which() == 'model') and (midx < len(out_msgs)): model = out_msgs[midx].as_builder() model.logMonoTime = msg.logMonoTime model = model.as_reader() new_msgs.append(model) midx += 1 else: new_msgs.append(msg) print(len(new_msgs), len(list(msgs))) assert abs(len(new_msgs) - len(list(msgs))) < 2 return new_msgs