* 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>
old-commit-hash: 331c7b103a
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