Files
dragonpilot/selfdrive/test/process_replay
ZwX1616 331c7b103a image processing refactor and test (#32249)
* it's something

* backup

* 16:10

* cleanup

* this is fine

* close

* remove some junk

* no heck

* disos

* real 10

* for some reason this is flipped

* 20hz

* no return

* ae

* tear

* need curve laster

* correct real gains

* fix time

* cleanup

* why the scam

* disable for now

* 0.7

* hdr

* that doesnt work

* what

* hugeoof

* clean up

* cleanup

* fix regs

* welp cant

* is this corrent

* it is sq

* remove

* back

* stg10bit

* back2ten

* Revert "remove"

This reverts commit 18712ab7e103c12621c929cd0f772ecb9b348247.

* 20hz and swb

* correct height

* 10bit

* ui hack for now

* slight

* perfect

* blk64

* ccm

* fix page faults

* template

* set 4x

* is this fine

* try

* this seems to work

* Revert "this seems to work"

This reverts commit d3c9023d3f14bd9394fed2d6276dba777ed0e606.

* needs to be static

* close

* 64 is optimal

* 2

* take

* not 1

* offset

* whats going on

* i have no idea

* less resistence

* box defs

* no

* reduce blur artifacts

* simplify

* fix

* fake short is too much for bright

* can be subzero

* should not use lsvc

* no wasted bit

* cont no slow

* no less than 10bit

* it is based

* wrong

* right

* quart

* shift

* raise noise floor

* 4.5/4.7

* same ballpark

* int is fine

* shane owes me m4a4

* Revert "shane owes me m4a4"

This reverts commit b4283fee18efebedae628a6cfd926ff1416dcfe5.

* back

* Revert "4.5/4.7"

This reverts commit e38f96e90cb5370bd378f6b66def9e7e3ed0ce5d.

* default

* oof

* clean up

* simpilfy

* from sensorinfo

* no div

* better name

* not the wrong one

* not anymore relevant

* too

* not call it debayer

* cl headers

* arg is 2nd

* gone is is_bggr

* define

* no is hdr

* rgb_tmp

* p1

* clean up

* 4

* cant for

* fix somewhre else

* const

* ap

* rects

* just set staruc

* nnew tmp

* pull it for now

* 12

* common rect

* Revert "not anymore relevant"

This reverts commit 1d574673a16cc31b7a255609e07775c3579eef15.

* Revert "too"

This reverts commit c2d4dcc52a859fe799362f9fcc2ffda99b264e50.

* Revert "Revert "too""

This reverts commit 0abbabe1fde51592f1619058638b4ac6a6dee4b3.

* no tol is fine

* rename

* sensor id

* unsgin

* flag

* some linalg

* cast

* should be h ref

* cap

---------

Co-authored-by: Comma Device <device@comma.ai>
2024-04-18 21:45:59 -07:00
..
2024-04-09 11:19:43 -07:00
2024-04-17 23:50:42 -07:00

Process replay

Process replay is a regression test designed to identify any changes in the output of a process. This test replays a segment through individual processes and compares the output to a known good replay. Each make is represented in the test with a segment.

If the test fails, make sure that you didn't unintentionally change anything. If there are intentional changes, the reference logs will be updated.

Use test_processes.py to run the test locally. Use FILEREADER_CACHE='1' test_processes.py to cache log files.

Currently the following processes are tested:

  • controlsd
  • radard
  • plannerd
  • calibrationd
  • dmonitoringd
  • locationd
  • paramsd
  • ubloxd
  • torqued

Usage

Usage: test_processes.py [-h] [--whitelist-procs PROCS] [--whitelist-cars CARS] [--blacklist-procs PROCS]
                         [--blacklist-cars CARS] [--ignore-fields FIELDS] [--ignore-msgs MSGS] [--update-refs] [--upload-only]
Regression test to identify changes in a process's output
optional arguments:
  -h, --help            show this help message and exit
  --whitelist-procs PROCS               Whitelist given processes from the test (e.g. controlsd)
  --whitelist-cars WHITELIST_CARS       Whitelist given cars from the test (e.g. HONDA)
  --blacklist-procs BLACKLIST_PROCS     Blacklist given processes from the test (e.g. controlsd)
  --blacklist-cars BLACKLIST_CARS       Blacklist given cars from the test (e.g. HONDA)
  --ignore-fields IGNORE_FIELDS         Extra fields or msgs to ignore (e.g. carState.events)
  --ignore-msgs IGNORE_MSGS             Msgs to ignore (e.g. onroadEvents)
  --update-refs                         Updates reference logs using current commit
  --upload-only                         Skips testing processes and uploads logs from previous test run

Forks

openpilot forks can use this test with their own reference logs, by default test_proccess.py saves logs locally.

To generate new logs:

./test_processes.py

Then, check in the new logs using git-lfs. Make sure to also update the ref_commit file to the current commit.

API

Process replay test suite exposes programmatic APIs for simultaneously running processes or groups of processes on provided logs.

def replay_process_with_name(name: Union[str, Iterable[str]], lr: LogIterable, *args, **kwargs) -> List[capnp._DynamicStructReader]:

def replay_process(
  cfg: Union[ProcessConfig, Iterable[ProcessConfig]], lr: LogIterable, frs: Optional[Dict[str, Any]] = None, 
  fingerprint: Optional[str] = None, return_all_logs: bool = False, custom_params: Optional[Dict[str, Any]] = None, disable_progress: bool = False
) -> List[capnp._DynamicStructReader]:

Example usage:

from openpilot.selfdrive.test.process_replay import replay_process_with_name
from openpilot.tools.lib.logreader import LogReader

lr = LogReader(...)

# provide a name of the process to replay
output_logs = replay_process_with_name('locationd', lr)

# or list of names
output_logs = replay_process_with_name(['ubloxd', 'locationd'], lr)

Supported processes:

  • controlsd
  • radard
  • plannerd
  • calibrationd
  • dmonitoringd
  • locationd
  • paramsd
  • ubloxd
  • torqued
  • modeld
  • dmonitoringmodeld

Certain processes may require an initial state, which is usually supplied within Params and persisting from segment to segment (e.g CalibrationParams, LiveParameters). The custom_params is dictionary used to prepopulate Params with arbitrary values. The get_custom_params_from_lr helper is provided to fetch meaningful values from log files.

from openpilot.selfdrive.test.process_replay import get_custom_params_from_lr

previous_segment_lr = LogReader(...)
current_segment_lr = LogReader(...)

custom_params = get_custom_params_from_lr(previous_segment_lr, 'last')

output_logs = replay_process_with_name('calibrationd', lr, custom_params=custom_params)

Replaying processes that use VisionIPC (e.g. modeld, dmonitoringmodeld) require additional frs dictionary with camera states as keys and FrameReader objects as values.

from openpilot.tools.lib.framereader import FrameReader

frs = {
  'roadCameraState': FrameReader(...),
  'wideRoadCameraState': FrameReader(...),
  'driverCameraState': FrameReader(...),
}

output_logs = replay_process_with_name(['modeld', 'dmonitoringmodeld'], lr, frs=frs)

To capture stdout/stderr of the replayed process, captured_output_store can be provided.

output_store = dict()
# pass dictionary by reference, it will be filled with standard outputs - even if process replay fails
output_logs = replay_process_with_name(['radard', 'plannerd'], lr, captured_output_store=output_store)

# entries with captured output in format { 'out': '...', 'err': '...' } will be added to provided dictionary for each replayed process
print(output_store['radard']['out']) # radard stdout
print(output_store['radard']['err']) # radard stderr