process replay: clean up common code (#24855)

* regen and process replay clean up

* test_fuzzy actually uses fingerprint hardcoding

fix

* revert

* revert

* this can be a url or path so just print full variable
pull/24254/head
Shane Smiskol 3 years ago committed by GitHub
parent a9038bc3fd
commit 170ed3d761
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 35
      selfdrive/test/process_replay/process_replay.py
  2. 19
      selfdrive/test/process_replay/regen.py
  3. 14
      selfdrive/test/process_replay/regen_all.py
  4. 3
      selfdrive/test/process_replay/test_processes.py

@ -347,7 +347,7 @@ def replay_process(cfg, lr, fingerprint=None):
else: else:
return cpp_replay_process(cfg, lr, fingerprint) return cpp_replay_process(cfg, lr, fingerprint)
def setup_env(simulation=False): def setup_env(simulation=False, CP=None):
params = Params() params = Params()
params.clear_all() params.clear_all()
params.put_bool("OpenpilotEnabledToggle", True) params.put_bool("OpenpilotEnabledToggle", True)
@ -358,12 +358,22 @@ def setup_env(simulation=False):
os.environ["NO_RADAR_SLEEP"] = "1" os.environ["NO_RADAR_SLEEP"] = "1"
os.environ["REPLAY"] = "1" os.environ["REPLAY"] = "1"
os.environ['SKIP_FW_QUERY'] = ""
os.environ['FINGERPRINT'] = ""
if simulation: if simulation:
os.environ["SIMULATION"] = "1" os.environ["SIMULATION"] = "1"
elif "SIMULATION" in os.environ: elif "SIMULATION" in os.environ:
del os.environ["SIMULATION"] del os.environ["SIMULATION"]
# Regen or python process
if CP is not None:
if CP.fingerprintSource == "fw" and CP.carFingerprint in FW_VERSIONS:
params.put("CarParamsCache", CP.as_builder().to_bytes())
else:
os.environ['SKIP_FW_QUERY'] = "1"
os.environ['FINGERPRINT'] = CP.carFingerprint
def python_replay_process(cfg, lr, fingerprint=None): def python_replay_process(cfg, lr, fingerprint=None):
sub_sockets = [s for _, sub in cfg.pub_sub.items() for s in sub] sub_sockets = [s for _, sub in cfg.pub_sub.items() for s in sub]
pub_sockets = [s for s in cfg.pub_sub.keys() if s != 'can'] pub_sockets = [s for s in cfg.pub_sub.keys() if s != 'can']
@ -378,30 +388,13 @@ def python_replay_process(cfg, lr, fingerprint=None):
all_msgs = sorted(lr, key=lambda msg: msg.logMonoTime) all_msgs = sorted(lr, key=lambda msg: msg.logMonoTime)
pub_msgs = [msg for msg in all_msgs if msg.which() in list(cfg.pub_sub.keys())] pub_msgs = [msg for msg in all_msgs if msg.which() in list(cfg.pub_sub.keys())]
setup_env()
# TODO: remove after getting new route for civic & accord
migration = {
"HONDA CIVIC 2016 TOURING": "HONDA CIVIC 2016",
"HONDA ACCORD 2018 SPORT 2T": "HONDA ACCORD 2018",
"HONDA ACCORD 2T 2018": "HONDA ACCORD 2018",
"Mazda CX-9 2021": "MAZDA CX-9 2021",
}
if fingerprint is not None: if fingerprint is not None:
os.environ['SKIP_FW_QUERY'] = "1" os.environ['SKIP_FW_QUERY'] = "1"
os.environ['FINGERPRINT'] = fingerprint os.environ['FINGERPRINT'] = fingerprint
setup_env()
else: else:
os.environ['SKIP_FW_QUERY'] = "" CP = [m for m in lr if m.which() == 'carParams'][0].carParams
os.environ['FINGERPRINT'] = "" setup_env(CP=CP)
for msg in lr:
if msg.which() == 'carParams':
car_fingerprint = migration.get(msg.carParams.carFingerprint, msg.carParams.carFingerprint)
if msg.carParams.fingerprintSource == "fw" 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
assert(type(managed_processes[cfg.proc_name]) is PythonProcess) assert(type(managed_processes[cfg.proc_name]) is PythonProcess)
managed_processes[cfg.proc_name].prepare() managed_processes[cfg.proc_name].prepare()

@ -15,7 +15,6 @@ from cereal.visionipc import VisionIpcServer, VisionStreamType
from common.params import Params from common.params import Params
from common.realtime import Ratekeeper, DT_MDL, DT_DMON, sec_since_boot from common.realtime import Ratekeeper, DT_MDL, DT_DMON, sec_since_boot
from common.transformations.camera import eon_f_frame_size, eon_d_frame_size, tici_f_frame_size, tici_d_frame_size from common.transformations.camera import eon_f_frame_size, eon_d_frame_size, tici_f_frame_size, tici_d_frame_size
from selfdrive.car.fingerprints import FW_VERSIONS
from selfdrive.manager.process import ensure_running from selfdrive.manager.process import ensure_running
from selfdrive.manager.process_config import managed_processes from selfdrive.manager.process_config import managed_processes
from selfdrive.test.process_replay.process_replay import FAKEDATA, setup_env, check_enabled from selfdrive.test.process_replay.process_replay import FAKEDATA, setup_env, check_enabled
@ -181,28 +180,12 @@ def regen_segment(lr, frs=None, outdir=FAKEDATA, disable_tqdm=False):
if frs is None: if frs is None:
frs = dict() frs = dict()
setup_env()
params = Params() params = Params()
os.environ["LOG_ROOT"] = outdir os.environ["LOG_ROOT"] = outdir
os.environ['SKIP_FW_QUERY'] = ""
os.environ['FINGERPRINT'] = ""
# TODO: remove after getting new route for Mazda
fp_migration = {
"Mazda CX-9 2021": "MAZDA CX-9 2021",
}
# TODO: remove after getting new route for Subaru
fingerprint_problem = ["SUBARU IMPREZA LIMITED 2019"]
for msg in lr: for msg in lr:
if msg.which() == 'carParams': if msg.which() == 'carParams':
car_fingerprint = fp_migration.get(msg.carParams.carFingerprint, msg.carParams.carFingerprint) setup_env(CP=msg.carParams)
if len(msg.carParams.carFw) and (car_fingerprint in FW_VERSIONS) and (car_fingerprint not in fingerprint_problem):
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': elif msg.which() == 'liveCalibration':
params.put("CalibrationParams", msg.as_builder().to_bytes()) params.put("CalibrationParams", msg.as_builder().to_bytes())

@ -8,26 +8,28 @@ from tqdm import tqdm
from selfdrive.test.process_replay.helpers import OpenpilotPrefix from selfdrive.test.process_replay.helpers import OpenpilotPrefix
from selfdrive.test.process_replay.regen import regen_and_save from selfdrive.test.process_replay.regen import regen_and_save
from selfdrive.test.process_replay.test_processes import FAKEDATA, original_segments as segments from selfdrive.test.process_replay.test_processes import FAKEDATA, original_segments as segments
from tools.lib.route import SegmentName
def regen_job(segment):
def regen_job(segment, disable_tqdm):
with OpenpilotPrefix(): with OpenpilotPrefix():
route = segment[1].rsplit('--', 1)[0] sn = SegmentName(segment[1])
sidx = int(segment[1].rsplit('--', 1)[1]) fake_dongle_id = 'regen' + ''.join(random.choice('0123456789ABCDEF') for _ in range(11))
fake_dongle_id = 'regen' + ''.join(random.choice('0123456789ABCDEF') for i in range(11))
try: try:
relr = regen_and_save(route, sidx, upload=True, use_route_meta=False, outdir=os.path.join(FAKEDATA, fake_dongle_id), disable_tqdm=True) relr = regen_and_save(sn.route_name.canonical_name, sn.segment_num, upload=True, use_route_meta=False, outdir=os.path.join(FAKEDATA, fake_dongle_id), disable_tqdm=disable_tqdm)
relr = '|'.join(relr.split('/')[-2:]) relr = '|'.join(relr.split('/')[-2:])
return f' ("{segment[0]}", "{relr}"), ' return f' ("{segment[0]}", "{relr}"), '
except Exception as e: except Exception as e:
return f" {segment} failed: {str(e)}" return f" {segment} failed: {str(e)}"
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Generate new segments from old ones") parser = argparse.ArgumentParser(description="Generate new segments from old ones")
parser.add_argument("-j", "--jobs", type=int, default=1) parser.add_argument("-j", "--jobs", type=int, default=1)
args = parser.parse_args() args = parser.parse_args()
with concurrent.futures.ProcessPoolExecutor(max_workers=args.jobs) as pool: with concurrent.futures.ProcessPoolExecutor(max_workers=args.jobs) as pool:
p = list(pool.map(regen_job, segments)) p = list(pool.map(regen_job, segments, [args.jobs > 1] * args.jobs))
msg = "Copy these new segments into test_processes.py:" msg = "Copy these new segments into test_processes.py:"
for seg in tqdm(p, desc="Generating segments"): for seg in tqdm(p, desc="Generating segments"):
msg += "\n" + str(seg) msg += "\n" + str(seg)

@ -93,8 +93,7 @@ def test_process(cfg, lr, ref_log_path, ignore_fields=None, ignore_msgs=None):
# check to make sure openpilot is engaged in the route # check to make sure openpilot is engaged in the route
if cfg.proc_name == "controlsd": if cfg.proc_name == "controlsd":
if not check_enabled(log_msgs): if not check_enabled(log_msgs):
segment = os.path.basename(ref_log_path).split("/")[-1].split("_")[0] raise Exception(f"Route never enabled: {ref_log_path}")
raise Exception(f"Route never enabled: {segment}")
try: try:
return compare_logs(ref_log_msgs, log_msgs, ignore_fields + cfg.ignore, ignore_msgs, cfg.tolerance), log_msgs return compare_logs(ref_log_msgs, log_msgs, ignore_fields + cfg.ignore, ignore_msgs, cfg.tolerance), log_msgs

Loading…
Cancel
Save