IQ.Pilot Release Commit @ aedea0e
This commit is contained in:
@@ -50,7 +50,7 @@ class LaneSwapEngine:
|
||||
"sec": 0.0,
|
||||
"tick": 0,
|
||||
"gate": 0.0,
|
||||
"preset": self._kv.get("AutoLaneChangeTimer", return_default=True),
|
||||
"preset": self._kv.get("IQLaneChangeTimer", return_default=True),
|
||||
"bsm_hold": False,
|
||||
"braked": False,
|
||||
"ready": False,
|
||||
@@ -59,8 +59,8 @@ class LaneSwapEngine:
|
||||
self.reload_setup()
|
||||
|
||||
def _pull_setup(self) -> None:
|
||||
self._mem["bsm_hold"] = self._kv.get_bool("AutoLaneChangeBsmDelay")
|
||||
self._mem["preset"] = self._kv.get("AutoLaneChangeTimer", return_default=True)
|
||||
self._mem["bsm_hold"] = self._kv.get_bool("IQLaneChangeBsmDelay")
|
||||
self._mem["preset"] = self._kv.get("IQLaneChangeTimer", return_default=True)
|
||||
|
||||
def _idle_phase(self) -> bool:
|
||||
return (
|
||||
|
||||
@@ -12,16 +12,40 @@ import pytest
|
||||
from openpilot.selfdrive.controls.lib.latcontrol_torque import NNTorqueModel
|
||||
from openpilot.selfdrive.controls.lib.latcontrol_torque import TORQUE_NN_MODEL_PATH
|
||||
|
||||
# A minimal valid NNFF model (Twilsonco format: column-vector mean/std, dense_N_W/b
|
||||
# layers). Used as a fallback so the loader logic is still exercised when no trained
|
||||
# models are shipped (they are removed pending retraining and re-added over time).
|
||||
_SYNTHETIC_MODEL = {
|
||||
"input_size": 4,
|
||||
"output_size": 1,
|
||||
"input_mean": [[0.0], [0.0], [0.0], [0.0]],
|
||||
"input_std": [[1.0], [1.0], [1.0], [1.0]],
|
||||
"layers": [
|
||||
{"dense_1_W": [[0.5, 0.5, 0.5, 0.5], [0.5, 0.5, 0.5, 0.5]], "dense_1_b": [[0.0], [0.0]], "activation": "sigmoid"},
|
||||
{"dense_2_W": [[2.0, 2.0]], "dense_2_b": [[-1.0]], "activation": "identity"},
|
||||
],
|
||||
}
|
||||
|
||||
MODEL_FILES = sorted(f for f in os.listdir(TORQUE_NN_MODEL_PATH) if f.endswith(".json"))
|
||||
SAMPLE = [f for f in ("HYUNDAI_IONIQ_5.json", "TOYOTA_RAV4_TSS2_2022.json", "MOCK.json") if f in MODEL_FILES] \
|
||||
or MODEL_FILES[:3]
|
||||
if MODEL_FILES:
|
||||
_MODEL_DIR = TORQUE_NN_MODEL_PATH
|
||||
_NAMES = MODEL_FILES
|
||||
else:
|
||||
import tempfile
|
||||
_MODEL_DIR = tempfile.mkdtemp(prefix="nnff_synthetic_")
|
||||
with open(os.path.join(_MODEL_DIR, "SYNTHETIC.json"), "w") as _f:
|
||||
json.dump(_SYNTHETIC_MODEL, _f)
|
||||
_NAMES = ["SYNTHETIC.json"]
|
||||
|
||||
SAMPLE = [f for f in ("HYUNDAI_IONIQ_5.json", "TOYOTA_RAV4_TSS2_2022.json", "MOCK.json") if f in _NAMES] \
|
||||
or _NAMES[:3]
|
||||
|
||||
|
||||
def _path(name):
|
||||
return os.path.join(TORQUE_NN_MODEL_PATH, name)
|
||||
return os.path.join(_MODEL_DIR, name)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("name", MODEL_FILES, ids=[n[:-5] for n in MODEL_FILES])
|
||||
@pytest.mark.parametrize("name", _NAMES, ids=[n[:-5] for n in _NAMES])
|
||||
def test_every_model_loads_and_is_finite(name):
|
||||
m = NNTorqueModel(_path(name))
|
||||
assert m.input_size >= 2
|
||||
|
||||
@@ -18,7 +18,12 @@ from openpilot.selfdrive.controls.lib.latcontrol_torque import NeuralNetworkFeed
|
||||
from openpilot.selfdrive.controls.lib.latcontrol_torque import TORQUE_NN_MODEL_PATH
|
||||
|
||||
_REAL_MODEL = next((f for f in sorted(os.listdir(TORQUE_NN_MODEL_PATH))
|
||||
if f.endswith(".json") and f != "MOCK.json"))
|
||||
if f.endswith(".json") and f != "MOCK.json"), None)
|
||||
|
||||
# Models are shipped separately and re-added as retrained; with none present,
|
||||
# NNFF is a no-op (falls back to stock torque FF), so the assembly tests skip.
|
||||
pytestmark = pytest.mark.skipif(_REAL_MODEL is None,
|
||||
reason="no NNFF models present (nuked pending retraining)")
|
||||
|
||||
|
||||
def _torque_fn():
|
||||
|
||||
Reference in New Issue
Block a user