r = Route(args.route[0]) logs = [ q_log if r_log is None else r_log for (q_log, r_log) in zip(r.qlog_paths(), r.log_paths()) ] if len(args.route) == 2 and logs: n = int(args.route[1]) logs = [logs[n]] min_level = LEVELS[args.level] if logs: for log in logs: if log: lr = LogReader(log) for m in lr: if m.which() == 'logMessage': print_logmessage(m.logMonoTime, m.logMessage, min_level) elif m.which() == 'errorLogMessage' and 'qlog' in log: print_logmessage(m.logMonoTime, m.errorLogMessage, min_level) elif m.which() == 'androidLog': print_androidlog(m.logMonoTime, m.androidLog) else: sm = messaging.SubMaster(['logMessage', 'androidLog'], addr=args.addr) while True: sm.update() if sm.updated['logMessage']:
plt.figure() plt.title(f"{typ}") plt.pie(sizes, labels=labels, autopct='%1.1f%%') if __name__ == "__main__": parser = argparse.ArgumentParser( description='Check qlog size based on a rlog') parser.add_argument('route', help='route to use') parser.add_argument('segment', type=int, help='segment number to use') args = parser.parse_args() r = Route(args.route) rlog = r.log_paths()[args.segment] msgs = list(LogReader(rlog)) msgs_by_type = defaultdict(list) for m in msgs: msgs_by_type[m.which()].append(m.as_builder().to_bytes()) qlog_by_type = defaultdict(list) for name, service in service_list.items(): if service.decimation is None: continue for i, msg in enumerate(msgs_by_type[name]): if i % service.decimation == 0: qlog_by_type[name].append(msg) make_pie(msgs_by_type, 'rlog')
def check_seg(i): # check each camera file size counts = [] first_frames = [] for camera, fps, size, encode_idx_name in CAMERAS: if not record_front and "dcamera" in camera: continue eon_dcam = EON and (camera == 'dcamera.hevc') file_path = f"{route_prefix_path}--{i}/{camera}" # check file exists self.assertTrue(os.path.exists(file_path), f"segment #{i}: '{file_path}' missing") # TODO: this ffprobe call is really slow # check frame count cmd = f"ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames \ -of default=nokey=1:noprint_wrappers=1 {file_path}" if TICI: cmd = "LD_LIBRARY_PATH=/usr/local/lib " + cmd expected_frames = fps * SEGMENT_LENGTH frame_tolerance = 1 if eon_dcam else 0 probe = subprocess.check_output(cmd, shell=True, encoding='utf8') frame_count = int(probe.split('\n')[0].strip()) counts.append(frame_count) self.assertTrue(abs(expected_frames - frame_count) <= frame_tolerance, f"segment #{i}: {camera} failed frame count check: expected {expected_frames}, got {frame_count}") # sanity check file size file_size = os.path.getsize(file_path) self.assertTrue(math.isclose(file_size, size, rel_tol=FILE_SIZE_TOLERANCE)) # Check encodeIdx if encode_idx_name is not None: rlog_path = f"{route_prefix_path}--{i}/rlog.bz2" msgs = [m for m in LogReader(rlog_path) if m.which() == encode_idx_name] encode_msgs = [getattr(m, encode_idx_name) for m in msgs] valid = [m.valid for m in msgs] segment_idxs = [m.segmentId for m in encode_msgs] encode_idxs = [m.encodeId for m in encode_msgs] frame_idxs = [m.frameId for m in encode_msgs] # Check frame count self.assertEqual(frame_count, len(segment_idxs)) self.assertEqual(frame_count, len(encode_idxs)) # Check for duplicates or skips self.assertEqual(0, segment_idxs[0]) self.assertEqual(len(set(segment_idxs)), len(segment_idxs)) self.assertTrue(all(valid)) if not eon_dcam: self.assertEqual(expected_frames * i, encode_idxs[0]) first_frames.append(frame_idxs[0]) self.assertEqual(len(set(encode_idxs)), len(encode_idxs)) self.assertEqual(1, len(set(first_frames))) if TICI: expected_frames = fps * SEGMENT_LENGTH self.assertEqual(min(counts), expected_frames) shutil.rmtree(f"{route_prefix_path}--{i}")
def check_seg(i): # check each camera file size counts = [] for camera, fps, size, encode_idx_name in CAMERAS: if not record_front and "dcamera" in camera: continue file_path = f"{route_prefix_path}--{i}/{camera}" # check file size self.assertTrue(os.path.exists(file_path)) file_size = os.path.getsize(file_path) self.assertTrue( math.isclose(file_size, size, rel_tol=FILE_SIZE_TOLERANCE)) # TODO: this ffprobe call is really slow # check frame count cmd = f"ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames \ -of default=nokey=1:noprint_wrappers=1 {file_path}" if TICI: cmd = "LD_LIBRARY_PATH=/usr/local/lib " + cmd expected_frames = fps * SEGMENT_LENGTH frame_tolerance = 1 if (EON and camera == 'dcamera.hevc') else 0 probe = subprocess.check_output(cmd, shell=True, encoding='utf8') frame_count = int(probe.split('\n')[0].strip()) counts.append(frame_count) if EON: self.assertTrue( abs(expected_frames - frame_count) <= frame_tolerance, f"{camera} failed frame count check: expected {expected_frames}, got {frame_count}" ) else: # loggerd waits for the slowest camera, so check count is at least the expected count, # then check the min of the frame counts is exactly the expected frame count self.assertTrue( frame_count >= expected_frames, f"{camera} failed frame count check: expected {expected_frames}, got {frame_count}" ) # Check encodeIdx if encode_idx_name is not None: rlog_path = f"{route_prefix_path}--{i}/rlog.bz2" idxs = [ getattr(m, encode_idx_name).segmentId for m in LogReader(rlog_path) if m.which() == encode_idx_name ] self.assertEqual(frame_count, len(idxs)) # Check for duplicates or skips self.assertEqual(0, idxs[0]) self.assertEqual(len(idxs) - 1, idxs[-1]) self.assertEqual(len(set(idxs)), len(idxs)) if TICI: expected_frames = fps * SEGMENT_LENGTH self.assertEqual(min(counts), expected_frames) shutil.rmtree(f"{route_prefix_path}--{i}")
def regen_segment(lr, frs=None, outdir=FAKEDATA): lr = list(lr) if frs is None: frs = dict() setup_env() params = Params() os.environ["LOG_ROOT"] = outdir os.environ['SKIP_FW_QUERY'] = "" os.environ['FINGERPRINT'] = "" # TODO: remove after getting new route for mazda migration = { "Mazda CX-9 2021": "MAZDA CX-9 2021", } for msg in lr: if msg.which() == 'carParams': car_fingerprint = migration.get(msg.carParams.carFingerprint, msg.carParams.carFingerprint) if len(msg.carParams.carFw) and (car_fingerprint in FW_VERSIONS): params.put("CarParamsCache", msg.carParams.as_builder().to_bytes()) else: os.environ['SKIP_FW_QUERY'] = "1" os.environ['FINGERPRINT'] = car_fingerprint elif msg.which() == 'liveCalibration': params.put("CalibrationParams", msg.as_builder().to_bytes()) vs, cam_procs = replay_cameras(lr, frs) fake_daemons = { 'sensord': [ multiprocessing.Process(target=replay_sensor_events, args=('sensorEvents', lr)), ], 'pandad': [ multiprocessing.Process(target=replay_service, args=('can', lr)), multiprocessing.Process(target=replay_service, args=('ubloxRaw', lr)), multiprocessing.Process(target=replay_panda_states, args=('pandaStates', lr)), ], 'managerState': [ multiprocessing.Process(target=replay_manager_state, args=('managerState', lr)), ], 'thermald': [ multiprocessing.Process(target=replay_device_state, args=('deviceState', lr)), ], 'camerad': [ *cam_procs, ], } try: # start procs up ignore = list(fake_daemons.keys()) + ['ui', 'manage_athenad', 'uploader'] ensure_running(managed_processes.values(), started=True, not_run=ignore) for procs in fake_daemons.values(): for p in procs: p.start() for _ in tqdm(range(60)): # ensure all procs are running for d, procs in fake_daemons.items(): for p in procs: if not p.is_alive(): raise Exception(f"{d}'s {p.name} died") time.sleep(1) finally: # kill everything for p in managed_processes.values(): p.stop() for procs in fake_daemons.values(): for p in procs: p.terminate() del vs segment = params.get("CurrentRoute", encoding='utf-8') + "--0" seg_path = os.path.join(outdir, segment) # check to make sure openpilot is engaged in the route if not check_enabled(LogReader(os.path.join(seg_path, "rlog.bz2"))): raise Exception(f"Route never enabled: {segment}") return seg_path
def regen_segment(lr, frs=None, outdir=FAKEDATA, disable_tqdm=False): lr = migrate_carparams(list(lr)) if frs is None: frs = dict() params = Params() os.environ["LOG_ROOT"] = outdir for msg in lr: if msg.which() == 'carParams': setup_env(CP=msg.carParams) elif msg.which() == 'liveCalibration': params.put("CalibrationParams", msg.as_builder().to_bytes()) vs, cam_procs = replay_cameras(lr, frs, disable_tqdm=disable_tqdm) fake_daemons = { 'sensord': [ multiprocessing.Process(target=replay_sensor_events, args=('sensorEvents', lr)), ], 'pandad': [ multiprocessing.Process(target=replay_service, args=('can', lr)), multiprocessing.Process(target=replay_service, args=('ubloxRaw', lr)), multiprocessing.Process(target=replay_panda_states, args=('pandaStates', lr)), ], 'managerState': [ multiprocessing.Process(target=replay_manager_state, args=('managerState', lr)), ], 'thermald': [ multiprocessing.Process(target=replay_device_state, args=('deviceState', lr)), ], 'camerad': [ *cam_procs, ], } try: # TODO: make first run of onnxruntime CUDA provider fast managed_processes["modeld"].start() managed_processes["dmonitoringmodeld"].start() time.sleep(5) # start procs up ignore = list(fake_daemons.keys()) + [ 'ui', 'manage_athenad', 'uploader', 'soundd' ] ensure_running(managed_processes.values(), started=True, params=Params(), CP=car.CarParams(), not_run=ignore) for procs in fake_daemons.values(): for p in procs: p.start() for _ in tqdm(range(60), disable=disable_tqdm): # ensure all procs are running for d, procs in fake_daemons.items(): for p in procs: if not p.is_alive(): raise Exception(f"{d}'s {p.name} died") time.sleep(1) finally: # kill everything for p in managed_processes.values(): p.stop() for procs in fake_daemons.values(): for p in procs: p.terminate() del vs segment = params.get("CurrentRoute", encoding='utf-8') + "--0" seg_path = os.path.join(outdir, segment) # check to make sure openpilot is engaged in the route if not check_enabled(LogReader(os.path.join(seg_path, "rlog"))): raise Exception(f"Route never enabled: {segment}") return seg_path
#!/usr/bin/env python3 import os import numpy as np from tools.lib.logreader import LogReader from tools.lib.framereader import FrameReader from tools.lib.cache import cache_path_for_file_path from selfdrive.test.process_replay.camera_replay import camera_replay if __name__ == "__main__": lr = LogReader(os.path.expanduser('~/rlog.bz2')) fr = FrameReader(os.path.expanduser('~/fcamera.hevc')) desire = np.load(os.path.expanduser('~/desire.npy')) calib = np.load(os.path.expanduser('~/calib.npy')) try: msgs = camera_replay(list(lr), fr, desire=desire, calib=calib) finally: cache_path = cache_path_for_file_path( os.path.expanduser('~/fcamera.hevc')) if os.path.isfile(cache_path): os.remove(cache_path) output_size = len( np.frombuffer(msgs[0].model.rawPredictions, dtype=np.float32)) output_data = np.zeros((len(msgs), output_size), dtype=np.float32) for i, msg in enumerate(msgs): output_data[i] = np.frombuffer(msg.model.rawPredictions, dtype=np.float32) np.save(os.path.expanduser('~/modeldata.npy'), output_data)
finally: spinner.close() managed_processes['modeld'].stop() managed_processes['dmonitoringmodeld'].stop() return log_msgs if __name__ == "__main__": update = "--update" in sys.argv replay_dir = os.path.dirname(os.path.abspath(__file__)) ref_commit_fn = os.path.join(replay_dir, "model_replay_ref_commit") # load logs lr = list(LogReader(get_url(TEST_ROUTE, SEGMENT))) frs = { 'roadCameraState': FrameReader(get_url(TEST_ROUTE, SEGMENT, log_type="fcamera")), 'driverCameraState': FrameReader(get_url(TEST_ROUTE, SEGMENT, log_type="dcamera")), } if TICI: frs['wideRoadCameraState'] = FrameReader( get_url(TEST_ROUTE, SEGMENT, log_type="ecamera")) # run replay log_msgs = model_replay(lr, frs) # get diff failed = False