test car models improvements (#23668)

* run on all routes

* min segment length

* invalid

* revert that
old-commit-hash: c8429f913e
commatwo_master
Adeeb Shihadeh 3 years ago committed by GitHub
parent 65e2f0e360
commit 12dcbe8617
  1. 30
      selfdrive/test/test_models.py
  2. 21
      selfdrive/test/test_routes.py
  3. 46
      tools/plotjuggler/layouts/controls_mismatch_debug.xml

@ -4,10 +4,12 @@ import os
import importlib import importlib
import unittest import unittest
from collections import defaultdict, Counter from collections import defaultdict, Counter
from typing import List, Optional, Tuple
from parameterized import parameterized_class from parameterized import parameterized_class
from cereal import log, car from cereal import log, car
from common.params import Params from common.params import Params
from common.realtime import DT_CTRL
from selfdrive.boardd.boardd import can_capnp_to_can_list, can_list_to_can_capnp from selfdrive.boardd.boardd import can_capnp_to_can_list, can_list_to_can_capnp
from selfdrive.car.fingerprints import all_known_cars from selfdrive.car.fingerprints import all_known_cars
from selfdrive.car.car_helpers import interfaces from selfdrive.car.car_helpers import interfaces
@ -27,8 +29,6 @@ PandaType = log.PandaState.PandaType
NUM_JOBS = int(os.environ.get("NUM_JOBS", "1")) NUM_JOBS = int(os.environ.get("NUM_JOBS", "1"))
JOB_ID = int(os.environ.get("JOB_ID", "0")) JOB_ID = int(os.environ.get("JOB_ID", "0"))
ROUTES = {rt.car_fingerprint: rt.route for rt in routes}
# TODO: get updated routes for these cars # TODO: get updated routes for these cars
ignore_can_valid = [ ignore_can_valid = [
HYUNDAI.SANTA_FE, HYUNDAI.SANTA_FE,
@ -39,25 +39,34 @@ ignore_addr_checks_valid = [
HYUNDAI.GENESIS_G70_2020, HYUNDAI.GENESIS_G70_2020,
] ]
@parameterized_class(('car_model'), [(car,) for i, car in enumerate(sorted(all_known_cars())) if i % NUM_JOBS == JOB_ID]) # build list of test cases
routes_by_car = defaultdict(set)
for r in routes:
routes_by_car[r.car_fingerprint].add(r.route)
test_cases: List[Tuple[str, Optional[str]]] = []
for i, c in enumerate(sorted(all_known_cars())):
if i % NUM_JOBS == JOB_ID:
test_cases.extend((c, r) for r in routes_by_car.get(c, (None, )))
@parameterized_class(('car_model', 'route'), test_cases)
class TestCarModel(unittest.TestCase): class TestCarModel(unittest.TestCase):
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
if cls.car_model not in ROUTES: if cls.route is None:
# TODO: get routes for missing cars and remove this
if cls.car_model in non_tested_cars: if cls.car_model in non_tested_cars:
print(f"Skipping tests for {cls.car_model}: missing route") print(f"Skipping tests for {cls.car_model}: missing route")
raise unittest.SkipTest raise unittest.SkipTest
else: raise Exception(f"missing test route for {cls.car_model}")
raise Exception(f"missing test route for car {cls.car_model}")
params = Params() params = Params()
params.clear_all() params.clear_all()
for seg in [2, 1, 0]: for seg in [2, 1, 0]:
try: try:
lr = LogReader(get_url(ROUTES[cls.car_model], seg)) lr = LogReader(get_url(cls.route, seg))
except Exception: except Exception:
continue continue
@ -73,16 +82,17 @@ class TestCarModel(unittest.TestCase):
if msg.carParams.openpilotLongitudinalControl: if msg.carParams.openpilotLongitudinalControl:
params.put_bool("DisableRadar", True) params.put_bool("DisableRadar", True)
if len(can_msgs): if len(can_msgs) > int(50 / DT_CTRL):
break break
else: else:
raise Exception("Route not found or no CAN msgs found. Is it uploaded?") raise Exception(f"Route {repr(cls.route)} not found or no CAN msgs found. Is it uploaded?")
cls.can_msgs = sorted(can_msgs, key=lambda msg: msg.logMonoTime) cls.can_msgs = sorted(can_msgs, key=lambda msg: msg.logMonoTime)
cls.CarInterface, cls.CarController, cls.CarState = interfaces[cls.car_model] cls.CarInterface, cls.CarController, cls.CarState = interfaces[cls.car_model]
cls.CP = cls.CarInterface.get_params(cls.car_model, fingerprint, []) cls.CP = cls.CarInterface.get_params(cls.car_model, fingerprint, [])
assert cls.CP assert cls.CP
assert cls.CP.carFingerprint == cls.car_model
def setUp(self): def setUp(self):
self.CI = self.CarInterface(self.CP, self.CarController, self.CarState) self.CI = self.CarInterface(self.CP, self.CarController, self.CarState)

@ -2,7 +2,6 @@
from collections import namedtuple from collections import namedtuple
from selfdrive.car.chrysler.values import CAR as CHRYSLER from selfdrive.car.chrysler.values import CAR as CHRYSLER
from selfdrive.car.ford.values import CAR as FORD
from selfdrive.car.gm.values import CAR as GM from selfdrive.car.gm.values import CAR as GM
from selfdrive.car.honda.values import CAR as HONDA from selfdrive.car.honda.values import CAR as HONDA
from selfdrive.car.hyundai.values import CAR as HYUNDAI from selfdrive.car.hyundai.values import CAR as HYUNDAI
@ -34,7 +33,7 @@ routes = [
TestRoute("8190c7275a24557b|2020-01-29--08-33-58", CHRYSLER.PACIFICA_2019_HYBRID), TestRoute("8190c7275a24557b|2020-01-29--08-33-58", CHRYSLER.PACIFICA_2019_HYBRID),
TestRoute("3d84727705fecd04|2021-05-25--08-38-56", CHRYSLER.PACIFICA_2020), TestRoute("3d84727705fecd04|2021-05-25--08-38-56", CHRYSLER.PACIFICA_2020),
TestRoute("f1b4c567731f4a1b|2018-04-30--10-15-35", FORD.FUSION), #TestRoute("f1b4c567731f4a1b|2018-04-30--10-15-35", FORD.FUSION),
TestRoute("7cc2a8365b4dd8a9|2018-12-02--12-10-44", GM.ACADIA), TestRoute("7cc2a8365b4dd8a9|2018-12-02--12-10-44", GM.ACADIA),
TestRoute("aa20e335f61ba898|2019-02-05--16-59-04", GM.BUICK_REGAL), TestRoute("aa20e335f61ba898|2019-02-05--16-59-04", GM.BUICK_REGAL),
@ -115,8 +114,6 @@ routes = [
TestRoute("5f5afb36036506e4|2019-05-14--02-09-54", TOYOTA.COROLLA_TSS2), TestRoute("5f5afb36036506e4|2019-05-14--02-09-54", TOYOTA.COROLLA_TSS2),
TestRoute("5ceff72287a5c86c|2019-10-19--10-59-02", TOYOTA.COROLLAH_TSS2), TestRoute("5ceff72287a5c86c|2019-10-19--10-59-02", TOYOTA.COROLLAH_TSS2),
TestRoute("d2525c22173da58b|2021-04-25--16-47-04", TOYOTA.PRIUS), TestRoute("d2525c22173da58b|2021-04-25--16-47-04", TOYOTA.PRIUS),
TestRoute("b0f5a01cf604185c|2017-12-18--20-32-32", TOYOTA.RAV4),
TestRoute("b0c9d2329ad1606b|2019-04-02--13-24-43", TOYOTA.RAV4),
TestRoute("b14c5b4742e6fc85|2020-07-28--19-50-11", TOYOTA.RAV4), TestRoute("b14c5b4742e6fc85|2020-07-28--19-50-11", TOYOTA.RAV4),
TestRoute("32a7df20486b0f70|2020-02-06--16-06-50", TOYOTA.RAV4H), TestRoute("32a7df20486b0f70|2020-02-06--16-06-50", TOYOTA.RAV4H),
TestRoute("cdf2f7de565d40ae|2019-04-25--03-53-41", TOYOTA.RAV4_TSS2), TestRoute("cdf2f7de565d40ae|2019-04-25--03-53-41", TOYOTA.RAV4_TSS2),
@ -198,19 +195,3 @@ routes = [
TestRoute("6c14ee12b74823ce|2021-06-30--11-49-02", TESLA.AP1_MODELS), TestRoute("6c14ee12b74823ce|2021-06-30--11-49-02", TESLA.AP1_MODELS),
TestRoute("bb50caf5f0945ab1|2021-06-19--17-20-18", TESLA.AP2_MODELS), TestRoute("bb50caf5f0945ab1|2021-06-19--17-20-18", TESLA.AP2_MODELS),
] ]
forced_dashcam_routes = [
# Ford fusion
"f1b4c567731f4a1b|2018-04-18--11-29-37",
"f1b4c567731f4a1b|2018-04-30--10-15-35",
# Mazda CX5
"32a319f057902bb3|2020-04-27--15-18-58",
# Mazda CX9
"10b5a4b380434151|2020-08-26--17-11-45",
# Mazda3
"74f1038827005090|2020-08-26--20-05-50",
# Mazda6
"fb53c640f499b73d|2021-06-01--04-17-56",
# CX-9 2021
"f6d5b1a9d7a1c92e|2021-07-08--06-56-59",
]

@ -0,0 +1,46 @@
<?xml version='1.0' encoding='UTF-8'?>
<root>
<tabbed_widget name="Main Window" parent="main_window">
<Tab containers="1" tab_name="tab1">
<Container>
<DockSplitter sizes="0.332965;0.334071;0.332965" orientation="-" count="3">
<DockArea name="...">
<plot style="Lines" mode="TimeSeries">
<range left="0.000000" top="1.025000" bottom="-0.025000" right="59.900659"/>
<limitY/>
<curve name="/controlsState/enabled" color="#1f77b4"/>
<curve name="/pandaStates/0/controlsAllowed" color="#d62728"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" mode="TimeSeries">
<range left="0.000000" top="-10.627637" bottom="-15.150799" right="59.900659"/>
<limitY/>
<curve name="/controlsState/cumLagMs" color="#9467bd"/>
</plot>
</DockArea>
<DockArea name="...">
<plot style="Lines" mode="TimeSeries">
<range left="0.000447" top="1.025000" bottom="-0.025000" right="59.900939"/>
<limitY/>
<curve name="/carState/gasPressed" color="#1ac938"/>
<curve name="/carState/brakePressed" color="#ff7f0e"/>
</plot>
</DockArea>
</DockSplitter>
</Container>
</Tab>
<currentTabIndex index="0"/>
</tabbed_widget>
<use_relative_time_offset enabled="1"/>
<!-- - - - - - - - - - - - - - - -->
<!-- - - - - - - - - - - - - - - -->
<Plugins>
<plugin ID="DataLoad Rlog"/>
<plugin ID="Cereal Subscriber"/>
</Plugins>
<!-- - - - - - - - - - - - - - - -->
<!-- - - - - - - - - - - - - - - -->
<!-- - - - - - - - - - - - - - - -->
</root>
Loading…
Cancel
Save