Ejemplo n.º 1
0
            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']:
Ejemplo n.º 2
0
    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')
Ejemplo n.º 3
0
    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}")
Ejemplo n.º 4
0
        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}")
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
#!/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)
Ejemplo n.º 8
0
    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