Compare commits

..

58 Commits

Author SHA1 Message Date
Jason Wen 62254e411b invoke platform selector on show event 2025-02-01 00:26:35 -05:00
Jason Wen 40df537d7a missed header 2025-02-01 00:19:44 -05:00
Jason Wen 2d60a61d5e bros 2025-02-01 00:05:59 -05:00
Jason Wen 7afc72942c add year list to bundle 2025-02-01 00:03:59 -05:00
Jason Wen 23ec81d67a move loadPlatformList to sp util 2025-01-31 23:57:16 -05:00
Jason Wen 9500489695 split set platform 2025-01-31 23:51:56 -05:00
Jason Wen 29d39ffe71 it's a json now 2025-01-31 23:42:59 -05:00
Jason Wen 726b3774b6 bump opendbc 2025-01-31 23:40:27 -05:00
Jason Wen 3f9502ca6b slight cleanup 2025-01-31 23:38:13 -05:00
Jason Wen 3a9d27b610 do not include dashcamOnly yet 2025-01-30 23:16:20 -05:00
Jason Wen b9b7e8b556 Fix name 2025-01-30 22:37:10 -05:00
Jason Wen b1315797c5 extract platform from CarPlatformBundle directly 2025-01-30 22:35:31 -05:00
Jason Wen 158eaf4dda introduce getPlatformBundle 2025-01-30 22:20:58 -05:00
Jason Wen 59afe4df1a pass all fields to a platform in json 2025-01-30 22:14:46 -05:00
Jason Wen 33e06a86f9 include all dashcamOnly platforms 2025-01-30 08:34:11 -05:00
Jason Wen 84e3a6d0ed add brand to parser 2025-01-30 00:37:35 -05:00
Jason Wen 25fa50b42c generate no car docs platforms 2025-01-30 00:31:42 -05:00
Jason Wen 1a67ce35ff start cleanup 2025-01-29 23:22:37 -05:00
Jason Wen ad131fef49 generate car.CarParams.brand in json 2025-01-29 23:20:52 -05:00
Jason Wen be0e64ab45 Merge branch 'master-new' into fcr 2025-01-27 22:50:21 -05:00
Jason Wen 767880ffaf ui: Display default driving model name (#623)
* ui: Display default driving model if in use

* add ref commit and tests

* fix commit

* update msg

* update msg

* fix lint

* use sha256 hash instead
2025-01-27 22:49:28 -05:00
Jason Wen 77ea048865 Encoding 2025-01-26 17:49:54 -05:00
Jason Wen 2c5753940b Need to be str 2025-01-26 08:24:29 -05:00
Jason Wen f93404294b use toList 2025-01-26 00:15:50 -05:00
Jason Wen b2843947bc need that param too 2025-01-26 00:13:23 -05:00
Jason Wen 10848c91cb old qt 2025-01-26 00:13:02 -05:00
Jason Wen 06b7718bcc show demo car 2025-01-26 00:03:37 -05:00
Jason Wen 3fcd3e192c tldr 2025-01-26 00:01:07 -05:00
Jason Wen 6e99de6acb set while initializing 2025-01-25 23:56:26 -05:00
Jason Wen 6a797cdd0e confirm/cancel 2025-01-25 23:46:04 -05:00
Jason Wen 1073f54245 Merge branch 'master-new' into fcr
# Conflicts:
#	opendbc_repo
2025-01-25 23:43:23 -05:00
Jason Wen c706fc3f55 different prompt in onroad/offroad 2025-01-25 23:42:30 -05:00
Jason Wen 3abe1c9168 Sync: commaai/openpilot:master into sunnypilot/sunnypilot:master-new (#622) 2025-01-25 23:14:35 -05:00
Jason Wen 8801d1eb8e test_processes: update ref logs to 7e5a84b 2025-01-25 22:51:46 -05:00
Jason Wen 7e5a84b897 Merge branch 'upstream/openpilot/master' into sync-20250125
# Conflicts:
#	opendbc_repo
#	panda
#	selfdrive/modeld/fill_model_msg.py
#	selfdrive/pandad/pandad.cc
#	selfdrive/test/process_replay/ref_commit
#	selfdrive/ui/qt/home.h
#	selfdrive/ui/qt/offroad/developer_panel.cc
#	selfdrive/ui/qt/offroad/developer_panel.h
#	selfdrive/ui/tests/test_ui/run.py
#	selfdrive/ui/translations/main_ar.ts
#	selfdrive/ui/translations/main_de.ts
#	selfdrive/ui/translations/main_es.ts
#	selfdrive/ui/translations/main_ko.ts
#	selfdrive/ui/translations/main_pt-BR.ts
#	selfdrive/ui/translations/main_th.ts
#	selfdrive/ui/translations/main_tr.ts
#	selfdrive/ui/translations/main_zh-CHS.ts
#	selfdrive/ui/translations/main_zh-CHT.ts
2025-01-25 22:50:03 -05:00
Jason Wen e4e3a7404c more precision search 2025-01-25 22:47:48 -05:00
Jason Wen 5bed14233c set actual fingerprint 2025-01-25 22:36:12 -05:00
Jason Wen 2d25bdca0e bump opendbc 2025-01-25 22:31:25 -05:00
Jason Wen 2e15bfbe92 single list is fine 2025-01-25 22:22:51 -05:00
Jason Wen 999feae5f3 search with user input 2025-01-25 21:25:06 -05:00
Mauricio Alvarez Leon c57f535238 add adb toggle to developerPanel (#34459)
* add adb toggle to developerPanel

* translations + toggleOrder

* initial docs

* move adb.sh into toggle

* finish up docs

* QProcess

* adbToggle h

* translations

* vanish translations

* description

* tr

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2025-01-25 13:24:24 -08:00
Andrei Radulescu 754882c985 reset: auto-format is back (#34479)
* Revert "update factory reset"

This reverts commit 533206be2f.

* keep reset message

* Update selfdrive/ui/qt/setup/reset.h

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2025-01-25 12:29:48 -08:00
Jason Wen 8998ed067e symlink dat 2025-01-25 14:04:30 -05:00
Shane Smiskol 1d86afdf83 carName -> brand (#34474)
* bump

* brand

* body is lower
2025-01-25 01:39:06 -06:00
Shane Smiskol dc7fa59e35 Toyota: tweak longitudinal gains (#34473)
bump
2025-01-25 01:36:03 -06:00
Jason Wen f418fbddb9 symlink for OP 2025-01-25 02:02:38 -05:00
Kacper Rączy 93a8a18b6d locationd: frequency based bad observation resiliance and recovery (#34476)
* Improve it

* Fix static

* Fix test_consistent_timing_spikes test

* Fix tests

* Comment

* Remove crap
2025-01-25 05:38:20 +00:00
Jason Wen 7544a47505 QFrame 2025-01-24 22:45:30 -05:00
Jason Wen c51e74e6af ui: Vehicle panel in settings (#617)
* ui: Vehicle panel in settings

* fix click
2025-01-24 21:57:46 -05:00
Jason Wen 45de7664bc ui: move alpha longitudinal control toggle to Developer panel (#34467)
* ui: move alpha longitudinal control toggle to Developer panel

* show toggle in ui preview

* Revert "show toggle in ui preview"

This reverts commit 4b12964726b966a906840099ecc1d584e307b614.

* write to CarParamsPersistent on ui init

* no need for new msg

* missed

* no icon
2025-01-24 18:24:56 -08:00
Shane Smiskol a90720690c Toyota: fix acceleration discontinuity when stopping (#34472)
bump
2025-01-24 17:16:55 -08:00
Shane Smiskol 540c45bfec Log git diff inside submodules (#34469)
get diffs inside submodules
2025-01-24 16:27:24 -08:00
Adeeb Shihadeh 45276652b8 update translations 2025-01-24 16:23:23 -08:00
Shane Smiskol 7803ff4f62 Revert "update translations"
my lupdate is broken?!

This reverts commit 9982b03e47.
2025-01-24 13:50:36 -08:00
Shane Smiskol 9982b03e47 update translations 2025-01-24 13:49:59 -08:00
Adeeb Shihadeh d0f5e5a09d Revert "Move alpha longitudinal control toggle to developer panel (#34223)"
This reverts commit d4a6f62c40.
2025-01-24 10:47:14 -08:00
Dean Lee 2e1436a515 camerad/ife.h: add #pragma once (#34464)
add #pragma once
2025-01-24 10:24:51 -08:00
Dean Lee 26cedc5ff1 bridge: remove deprecated services check (#34463)
Remove deprecated services check from get_services
2025-01-24 10:24:20 -08:00
149 changed files with 2141 additions and 1066 deletions
+1 -1
View File
@@ -86,7 +86,7 @@ jobs:
run: >-
sudo apt-get install -y imagemagick
scenes="homescreen settings_device settings_network settings_network_advanced settings_software settings_sunnylink settings_toggles settings_sunnypilot settings_sunnypilot_mads settings_trips settings_developer offroad_alert update_available prime onroad onroad_disengaged onroad_override onroad_sidebar onroad_wide onroad_wide_sidebar onroad_alert_small onroad_alert_mid onroad_alert_full driver_camera body keyboard keyboard_uppercase"
scenes="homescreen settings_device settings_network settings_network_advanced settings_software settings_sunnylink settings_toggles settings_sunnypilot settings_sunnypilot_mads settings_trips settings_vehicle settings_developer offroad_alert update_available prime onroad onroad_disengaged onroad_override onroad_sidebar onroad_wide onroad_wide_sidebar onroad_alert_small onroad_alert_mid onroad_alert_full driver_camera body keyboard keyboard_uppercase"
A=($scenes)
DIFF=""
+2 -2
View File
@@ -6,12 +6,12 @@
ExitHandler do_exit;
static std::vector<std::string> get_services(std::string whitelist_str, bool zmq_to_msgq) {
static std::vector<std::string> get_services(const std::string &whitelist_str, bool zmq_to_msgq) {
std::vector<std::string> service_list;
for (const auto& it : services) {
std::string name = it.second.name;
bool in_whitelist = whitelist_str.find(name) != std::string::npos;
if (name == "plusFrame" || name == "uiLayoutState" || (zmq_to_msgq && !in_whitelist)) {
if (zmq_to_msgq && !in_whitelist) {
continue;
}
service_list.push_back(name);
+1
View File
@@ -0,0 +1 @@
#define DEFAULT_MODEL "Notre Dame (Default)"
+1
View File
@@ -206,6 +206,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"CarParamsSP", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
{"CarParamsSPCache", CLEAR_ON_MANAGER_START},
{"CarParamsSPPersistent", PERSISTENT},
{"CarPlatformBundle", PERSISTENT},
{"EnableGithubRunner", PERSISTENT | BACKUP},
{"ModelRunnerTypeCache", CLEAR_ON_ONROAD_TRANSITION},
{"OffroadMode", CLEAR_ON_MANAGER_START},
+16
View File
@@ -29,6 +29,22 @@ Here's an example command for connecting to your device using its tethered conne
For doing development work on device, it's recommended to use [SSH agent forwarding](https://docs.github.com/en/developers/overview/using-ssh-agent-forwarding).
## ADB
In order to use ADB on your device, you'll need to enable it in the device's settings.
* Enable ADB in your device's settings
* Connect to your device
* `adb shell` over USB
* `adb connect` over WiFi
* Here's an example command for connecting to your device using its tethered connection: `adb connect 192.168.43.1:5555`
> [!NOTE]
> The default port for ADB is 5555 on the comma 3/3X.
For more info on ADB, see the [Android Debug Bridge (ADB) documentation](https://developer.android.com/tools/adb).
### Notes
The public keys are only fetched from your GitHub account once. In order to update your device's authorized keys, you'll need to re-enter your GitHub username.
+11 -11
View File
@@ -42,19 +42,19 @@ class CarSpecificEvents:
self.cruise_buttons: deque = deque([], maxlen=HYUNDAI_PREV_BUTTON_SAMPLES)
def update(self, CS: car.CarState, CS_prev: car.CarState, CC: car.CarControl):
if self.CP.carName in ('body', 'mock'):
if self.CP.brand in ('body', 'mock'):
events = Events()
elif self.CP.carName in ('subaru', 'mazda'):
elif self.CP.brand in ('subaru', 'mazda'):
events = self.create_common_events(CS, CS_prev)
elif self.CP.carName == 'ford':
elif self.CP.brand == 'ford':
events = self.create_common_events(CS, CS_prev, extra_gears=[GearShifter.manumatic])
elif self.CP.carName == 'nissan':
elif self.CP.brand == 'nissan':
events = self.create_common_events(CS, CS_prev, extra_gears=[GearShifter.brake])
elif self.CP.carName == 'chrysler':
elif self.CP.brand == 'chrysler':
events = self.create_common_events(CS, CS_prev, extra_gears=[GearShifter.low])
# Low speed steer alert hysteresis logic
@@ -65,7 +65,7 @@ class CarSpecificEvents:
if self.low_speed_alert:
events.add(EventName.belowSteerSpeed)
elif self.CP.carName == 'honda':
elif self.CP.brand == 'honda':
events = self.create_common_events(CS, CS_prev, pcm_enable=False)
if self.CP.pcmCruise and CS.vEgo < self.CP.minEnableSpeed:
@@ -86,7 +86,7 @@ class CarSpecificEvents:
if self.CP.minEnableSpeed > 0 and CS.vEgo < 0.001:
events.add(EventName.manualRestart)
elif self.CP.carName == 'toyota':
elif self.CP.brand == 'toyota':
events = self.create_common_events(CS, CS_prev)
if self.CP.openpilotLongitudinalControl:
@@ -101,7 +101,7 @@ class CarSpecificEvents:
# while in standstill, send a user alert
events.add(EventName.manualRestart)
elif self.CP.carName == 'gm':
elif self.CP.brand == 'gm':
# The ECM allows enabling on falling edge of set, but only rising edge of resume
events = self.create_common_events(CS, CS_prev, extra_gears=[GearShifter.sport, GearShifter.low,
GearShifter.eco, GearShifter.manumatic],
@@ -120,7 +120,7 @@ class CarSpecificEvents:
if CS.vEgo < self.CP.minSteerSpeed:
events.add(EventName.belowSteerSpeed)
elif self.CP.carName == 'volkswagen':
elif self.CP.brand == 'volkswagen':
events = self.create_common_events(CS, CS_prev, extra_gears=[GearShifter.eco, GearShifter.sport, GearShifter.manumatic],
pcm_enable=self.CP.pcmCruise,
enable_buttons=(ButtonType.setCruise, ButtonType.resumeCruise))
@@ -143,7 +143,7 @@ class CarSpecificEvents:
# if CC.eps_timer_soft_disable_alert: # type: ignore[attr-defined]
# events.add(EventName.steerTimeLimit)
elif self.CP.carName == 'hyundai':
elif self.CP.brand == 'hyundai':
# On some newer model years, the CANCEL button acts as a pause/resume button based on the PCM state
# To avoid re-engaging when openpilot cancels, check user engagement intention via buttons
# Main button also can trigger an engagement on these cars
@@ -160,7 +160,7 @@ class CarSpecificEvents:
events.add(EventName.belowSteerSpeed)
else:
raise ValueError(f"Unsupported car: {self.CP.carName}")
raise ValueError(f"Unsupported car: {self.CP.brand}")
return events
+5 -2
View File
@@ -1,4 +1,5 @@
#!/usr/bin/env python3
import json
import os
import time
import threading
@@ -104,7 +105,9 @@ class Car:
with car.CarParams.from_bytes(cached_params_raw) as _cached_params:
cached_params = _cached_params
self.CI = get_car(*self.can_callbacks, obd_callback(self.params), experimental_long_allowed, num_pandas, cached_params)
fixed_fingerprint = json.loads(self.params.get("CarPlatformBundle", encoding='utf-8') or "{}").get("platform", None)
self.CI = get_car(*self.can_callbacks, obd_callback(self.params), experimental_long_allowed, num_pandas, cached_params, fixed_fingerprint)
interfaces.setup_car_interface_sp(self.CI.CP, self.CI.CP_SP, self.params)
self.RI = get_radar_interface(self.CI.CP, self.CI.CP_SP)
self.CP = self.CI.CP
@@ -199,7 +202,7 @@ class Car:
# Update carState from CAN
CS = self.CI.update(can_list)
if self.CP.carName == 'mock':
if self.CP.brand == 'mock':
CS = self.mock_carstate.update(CS)
# Update radar tracks from CAN
+4 -4
View File
@@ -367,11 +367,11 @@ class TestCarModelBase(unittest.TestCase):
if self.safety.get_vehicle_moving() != prev_panda_vehicle_moving:
self.assertEqual(not CS.standstill, self.safety.get_vehicle_moving())
if not (self.CP.carName == "honda" and not (self.CP.flags & HondaFlags.BOSCH)):
if not (self.CP.brand == "honda" and not (self.CP.flags & HondaFlags.BOSCH)):
if self.safety.get_cruise_engaged_prev() != prev_panda_cruise_engaged:
self.assertEqual(CS.cruiseState.enabled, self.safety.get_cruise_engaged_prev())
if self.CP.carName == "honda":
if self.CP.brand == "honda":
if self.safety.get_acc_main_on() != prev_panda_acc_main_on:
self.assertEqual(CS.cruiseState.available, self.safety.get_acc_main_on())
@@ -426,7 +426,7 @@ class TestCarModelBase(unittest.TestCase):
# On most pcmCruise cars, openpilot's state is always tied to the PCM's cruise state.
# On Honda Nidec, we always engage on the rising edge of the PCM cruise state, but
# openpilot brakes to zero even if the min ACC speed is non-zero (i.e. the PCM disengages).
if self.CP.carName == "honda" and not (self.CP.flags & HondaFlags.BOSCH):
if self.CP.brand == "honda" and not (self.CP.flags & HondaFlags.BOSCH):
# only the rising edges are expected to match
if CS.cruiseState.enabled and not CS_prev.cruiseState.enabled:
checks['controlsAllowed'] += not self.safety.get_controls_allowed()
@@ -448,7 +448,7 @@ class TestCarModelBase(unittest.TestCase):
if button_enable and not mismatch:
self.safety.set_controls_allowed(False)
if self.CP.carName == "honda":
if self.CP.brand == "honda":
checks['mainOn'] += CS.cruiseState.available != self.safety.get_acc_main_on()
CS_prev = CS
+1 -1
View File
@@ -14,7 +14,7 @@ def main():
cloudlog.info("plannerd is waiting for CarParams")
params = Params()
CP = messaging.log_from_bytes(params.get("CarParams", block=True), car.CarParams)
cloudlog.info("plannerd got CarParams: %s", CP.carName)
cloudlog.info("plannerd got CarParams: %s", CP.brand)
ldw = LaneDepartureWarning()
longitudinal_planner = LongitudinalPlanner(CP)
-11
View File
@@ -1,11 +0,0 @@
#!/usr/bin/env bash
set -e
PORT=5555
setprop service.adb.tcp.port $PORT
sudo systemctl start adbd
IP=$(echo $SSH_CONNECTION | awk '{ print $3}')
echo "then, connect on your computer:"
echo "adb connect $IP:$PORT"
+15 -12
View File
@@ -24,14 +24,16 @@ MIN_STD_SANITY_CHECK = 1e-5 # m or rad
MAX_FILTER_REWIND_TIME = 0.8 # s
MAX_SENSOR_TIME_DIFF = 0.1 # s
YAWRATE_CROSS_ERR_CHECK_FACTOR = 30
INPUT_INVALID_THRESHOLD = 0.5 # 0 bad inputs ignored
TIMING_INVALID_THRESHOLD = 2.5 # 2 bad timings ignored
INPUT_INVALID_DECAY = 0.9993 # ~10 secs to resume after exceeding allowed bad inputs by one (at 100hz)
TIMING_INVALID_DECAY = 0.9990 # ~2 secs to resume after exceeding allowed bad timings by one (at 100hz)
INPUT_INVALID_LIMIT = 2.0 # 1 (camodo) / 9 (sensor) bad input[s] ignored
INPUT_INVALID_RECOVERY = 10.0 # ~10 secs to resume after exceeding allowed bad inputs by one
POSENET_STD_INITIAL_VALUE = 10.0
POSENET_STD_HIST_HALF = 20
def calculate_invalid_input_decay(invalid_limit, recovery_time, frequency):
return (1 - 1 / (2 * invalid_limit)) ** (1 / (recovery_time * frequency))
def init_xyz_measurement(measurement: capnp._DynamicStructBuilder, values: np.ndarray, stds: np.ndarray, valid: bool):
assert len(values) == len(stds) == 3
measurement.x, measurement.y, measurement.z = map(float, values)
@@ -269,11 +271,11 @@ def main():
filter_initialized = False
critcal_services = ["accelerometer", "gyroscope", "cameraOdometry"]
observation_timing_invalid = defaultdict(int)
observation_input_invalid = defaultdict(int)
input_invalid_decay = {s: INPUT_INVALID_DECAY ** (100. / SERVICE_LIST[s].frequency) for s in critcal_services}
timing_invalid_decay = {s: TIMING_INVALID_DECAY ** (100. / SERVICE_LIST[s].frequency) for s in critcal_services}
input_invalid_limit = {s: round(INPUT_INVALID_LIMIT * (SERVICE_LIST[s].frequency / 20.)) for s in critcal_services}
input_invalid_threshold = {s: input_invalid_limit[s] - 0.5 for s in critcal_services}
input_invalid_decay = {s: calculate_invalid_input_decay(input_invalid_limit[s], INPUT_INVALID_RECOVERY, SERVICE_LIST[s].frequency) for s in critcal_services}
initial_pose = params.get("LocationFilterInitialState")
if initial_pose is not None:
@@ -306,19 +308,20 @@ def main():
continue
if res == HandleLogResult.TIMING_INVALID:
observation_timing_invalid[which] += 1
print(f"Observation {which} ignored due to failed timing check")
observation_input_invalid[which] += 1
print(observation_input_invalid[which])
elif res == HandleLogResult.INPUT_INVALID:
print(f"Observation {which} ignored due to failed sanity check")
observation_input_invalid[which] += 1
else:
observation_input_invalid[which] *= input_invalid_decay[which]
observation_timing_invalid[which] *= timing_invalid_decay[which]
else:
filter_initialized = sm.all_checks() and sensor_all_checks(acc_msgs, gyro_msgs, sensor_valid, sensor_recv_time, sensor_alive, SIMULATION)
if sm.updated["cameraOdometry"]:
critical_service_inputs_valid = all(observation_input_invalid[s] < INPUT_INVALID_THRESHOLD for s in critcal_services)
critical_service_timing_valid = all(observation_timing_invalid[s] < TIMING_INVALID_THRESHOLD for s in critcal_services)
inputs_valid = sm.all_valid() and critical_service_inputs_valid and critical_service_timing_valid
critical_service_inputs_valid = all(observation_input_invalid[s] < input_invalid_threshold[s] for s in critcal_services)
inputs_valid = sm.all_valid() and critical_service_inputs_valid
sensors_valid = sensor_all_checks(acc_msgs, gyro_msgs, sensor_valid, sensor_recv_time, sensor_alive, SIMULATION)
msg = estimator.get_msg(sensors_valid, inputs_valid, filter_initialized)
@@ -1,56 +0,0 @@
import capnp
import cereal.messaging as messaging
from openpilot.common.params import Params
from openpilot.system.manager.process_config import managed_processes
class TestLocationdProc:
LLD_MSGS = ['gpsLocationExternal', 'cameraOdometry', 'carState', 'liveCalibration',
'accelerometer', 'gyroscope', 'magnetometer']
def setup_method(self):
self.pm = messaging.PubMaster(self.LLD_MSGS)
self.params = Params()
self.params.put_bool("UbloxAvailable", True)
managed_processes['locationd'].prepare()
managed_processes['locationd'].start()
def teardown_method(self):
managed_processes['locationd'].stop()
def get_msg(self, name, t):
try:
msg = messaging.new_message(name)
except capnp.lib.capnp.KjException:
msg = messaging.new_message(name, 0)
if name == "gpsLocationExternal":
msg.gpsLocationExternal.flags = 1
msg.gpsLocationExternal.hasFix = True
msg.gpsLocationExternal.verticalAccuracy = 1.0
msg.gpsLocationExternal.speedAccuracy = 1.0
msg.gpsLocationExternal.bearingAccuracyDeg = 1.0
msg.gpsLocationExternal.vNED = [0.0, 0.0, 0.0]
msg.gpsLocationExternal.latitude = float(self.lat)
msg.gpsLocationExternal.longitude = float(self.lon)
msg.gpsLocationExternal.unixTimestampMillis = t * 1e6
msg.gpsLocationExternal.altitude = float(self.alt)
#if name == "gnssMeasurements":
# msg.gnssMeasurements.measTime = t
# msg.gnssMeasurements.positionECEF.value = [self.x , self.y, self.z]
# msg.gnssMeasurements.positionECEF.std = [0,0,0]
# msg.gnssMeasurements.positionECEF.valid = True
# msg.gnssMeasurements.velocityECEF.value = []
# msg.gnssMeasurements.velocityECEF.std = [0,0,0]
# msg.gnssMeasurements.velocityECEF.valid = True
elif name == 'cameraOdometry':
msg.cameraOdometry.rot = [0.0, 0.0, 0.0]
msg.cameraOdometry.rotStd = [0.0, 0.0, 0.0]
msg.cameraOdometry.trans = [0.0, 0.0, 0.0]
msg.cameraOdometry.transStd = [0.0, 0.0, 0.0]
msg.logMonoTime = t
msg.valid = True
return msg
@@ -23,8 +23,10 @@ class Scenario(Enum):
BASE = 'base'
GYRO_OFF = 'gyro_off'
GYRO_SPIKE_MIDWAY = 'gyro_spike_midway'
GYRO_CONSISTENT_SPIKES = 'gyro_consistent_spikes'
ACCEL_OFF = 'accel_off'
ACCEL_SPIKE_MIDWAY = 'accel_spike_midway'
ACCEL_CONSISTENT_SPIKES = 'accel_consistent_spikes'
SENSOR_TIMING_SPIKE_MIDWAY = 'timing_spikes'
SENSOR_TIMING_CONSISTENT_SPIKES = 'timing_consistent_spikes'
@@ -63,18 +65,20 @@ def run_scenarios(scenario, logs):
elif scenario == Scenario.GYRO_OFF:
logs = sorted([x for x in logs if x.which() != 'gyroscope'], key=lambda x: x.logMonoTime)
elif scenario == Scenario.GYRO_SPIKE_MIDWAY:
elif scenario == Scenario.GYRO_SPIKE_MIDWAY or scenario == Scenario.GYRO_CONSISTENT_SPIKES:
def gyro_spike(msg):
msg.gyroscope.gyroUncalibrated.v[0] += 3.0
logs = modify_logs_midway(logs, 'gyroscope', 1, gyro_spike)
count = 1 if scenario == Scenario.GYRO_SPIKE_MIDWAY else CONSISTENT_SPIKES_COUNT
logs = modify_logs_midway(logs, 'gyroscope', count, gyro_spike)
elif scenario == Scenario.ACCEL_OFF:
logs = sorted([x for x in logs if x.which() != 'accelerometer'], key=lambda x: x.logMonoTime)
elif scenario == Scenario.ACCEL_SPIKE_MIDWAY:
elif scenario == Scenario.ACCEL_SPIKE_MIDWAY or scenario == Scenario.ACCEL_CONSISTENT_SPIKES:
def acc_spike(msg):
msg.accelerometer.acceleration.v[0] += 10.0
logs = modify_logs_midway(logs, 'accelerometer', 1, acc_spike)
msg.accelerometer.acceleration.v[0] += 100.0
count = 1 if scenario == Scenario.ACCEL_SPIKE_MIDWAY else CONSISTENT_SPIKES_COUNT
logs = modify_logs_midway(logs, 'accelerometer', count, acc_spike)
elif scenario == Scenario.SENSOR_TIMING_SPIKE_MIDWAY or scenario == Scenario.SENSOR_TIMING_CONSISTENT_SPIKES:
def timing_spike(msg):
@@ -121,7 +125,7 @@ class TestLocationdScenarios:
assert np.allclose(replayed_data['roll'], 0.0)
assert np.all(replayed_data['sensors_flag'] == 0.0)
def test_gyro_spikes(self):
def test_gyro_spike(self):
"""
Test: a gyroscope spike in the middle of the segment
Expected Result:
@@ -132,8 +136,17 @@ class TestLocationdScenarios:
orig_data, replayed_data = run_scenarios(Scenario.GYRO_SPIKE_MIDWAY, self.logs)
assert np.allclose(orig_data['yaw_rate'], replayed_data['yaw_rate'], atol=np.radians(0.35))
assert np.allclose(orig_data['roll'], replayed_data['roll'], atol=np.radians(0.55))
assert np.diff(replayed_data['inputs_flag'])[499] == -1.0
assert np.diff(replayed_data['inputs_flag'])[704] == 1.0
assert np.all(replayed_data['inputs_flag'] == orig_data['inputs_flag'])
assert np.all(replayed_data['sensors_flag'] == orig_data['sensors_flag'])
def test_consistent_gyro_spikes(self):
"""
Test: consistent timing spikes for N gyroscope messages in the middle of the segment
Expected Result: inputsOK becomes False after N of bad measurements
"""
orig_data, replayed_data = run_scenarios(Scenario.GYRO_CONSISTENT_SPIKES, self.logs)
assert np.diff(replayed_data['inputs_flag'])[501] == -1.0
assert np.diff(replayed_data['inputs_flag'])[708] == 1.0
def test_accel_off(self):
"""
@@ -148,7 +161,7 @@ class TestLocationdScenarios:
assert np.allclose(replayed_data['roll'], 0.0)
assert np.all(replayed_data['sensors_flag'] == 0.0)
def test_accel_spikes(self):
def test_accel_spike(self):
"""
ToDo:
Test: an accelerometer spike in the middle of the segment
@@ -173,5 +186,5 @@ class TestLocationdScenarios:
Expected Result: inputsOK becomes False after N of bad measurements
"""
orig_data, replayed_data = run_scenarios(Scenario.SENSOR_TIMING_CONSISTENT_SPIKES, self.logs)
assert np.diff(replayed_data['inputs_flag'])[500] == -1.0
assert np.diff(replayed_data['inputs_flag'])[787] == 1.0
assert np.diff(replayed_data['inputs_flag'])[501] == -1.0
assert np.diff(replayed_data['inputs_flag'])[707] == 1.0
+1 -1
View File
@@ -71,7 +71,7 @@ class TorqueEstimator(ParameterEstimator):
self.offline_friction = 0.0
self.offline_latAccelFactor = 0.0
self.resets = 0.0
self.use_params = CP.carName in ALLOWED_CARS and CP.lateralTuning.which() == 'torque'
self.use_params = CP.brand in ALLOWED_CARS and CP.lateralTuning.which() == 'torque'
if CP.lateralTuning.which() == 'torque':
self.offline_friction = CP.lateralTuning.torque.friction
+1 -1
View File
@@ -194,7 +194,7 @@ def main(demo=False):
CP = get_demo_car_params()
else:
CP = messaging.log_from_bytes(params.get("CarParams", block=True), car.CarParams)
cloudlog.info("modeld got CarParams: %s", CP.carName)
cloudlog.info("modeld got CarParams: %s", CP.brand)
# TODO this needs more thought, use .2s extra for now to estimate other delays
steer_delay = CP.steerActuatorDelay + .2
+7 -6
View File
@@ -202,7 +202,7 @@ void fill_panda_can_state(cereal::PandaState::PandaCanState::Builder &cs, const
cs.setCanCoreResetCnt(can_health.can_core_reset_cnt);
}
std::optional<bool> send_panda_states(PubMaster *pm, const std::vector<Panda *> &pandas, bool spoofing_started, PandaSafety *panda_safety) {
std::optional<bool> send_panda_states(PubMaster *pm, const std::vector<Panda *> &pandas, bool spoofing_started, bool always_offroad) {
bool ignition_local = false;
const uint32_t pandas_cnt = pandas.size();
@@ -250,7 +250,7 @@ std::optional<bool> send_panda_states(PubMaster *pm, const std::vector<Panda *>
health.ignition_line_pkt = 0;
}
ignition_local |= ((health.ignition_line_pkt != 0) || (health.ignition_can_pkt != 0)) && !panda_safety->getOffroadMode();
ignition_local |= ((health.ignition_line_pkt != 0) || (health.ignition_can_pkt != 0)) && !always_offroad;
pandaStates.push_back(health);
}
@@ -337,15 +337,14 @@ void send_peripheral_state(Panda *panda, PubMaster *pm) {
pm->send("peripheralState", msg);
}
void process_panda_state(std::vector<Panda *> &pandas, PubMaster *pm, bool engaged, bool engaged_mads, bool spoofing_started,
PandaSafety *panda_safety) {
void process_panda_state(std::vector<Panda *> &pandas, PubMaster *pm, bool engaged, bool engaged_mads, bool spoofing_started, bool always_offroad) {
std::vector<std::string> connected_serials;
for (Panda *p : pandas) {
connected_serials.push_back(p->hw_serial());
}
{
auto ignition_opt = send_panda_states(pm, pandas, spoofing_started, panda_safety);
auto ignition_opt = send_panda_states(pm, pandas, spoofing_started, always_offroad);
if (!ignition_opt) {
LOGE("Failed to get ignition_opt");
return;
@@ -445,6 +444,7 @@ void pandad_run(std::vector<Panda *> &pandas) {
Panda *peripheral_panda = pandas[0];
bool engaged = false;
bool engaged_mads = false;
bool always_offroad = false;
// Main loop: receive CAN data and process states
while (!do_exit && check_all_connected(pandas)) {
@@ -460,7 +460,8 @@ void pandad_run(std::vector<Panda *> &pandas) {
sm.update(0);
engaged = sm.allAliveAndValid({"selfdriveState"}) && sm["selfdriveState"].getSelfdriveState().getEnabled();
engaged_mads = process_mads_heartbeat(&sm);
process_panda_state(pandas, &pm, engaged, engaged_mads, spoofing_started, &panda_safety);
always_offroad = panda_safety.getOffroadMode();
process_panda_state(pandas, &pm, engaged, engaged_mads, spoofing_started, always_offroad);
panda_safety.configureSafetyMode();
}
+1 -1
View File
@@ -154,7 +154,7 @@ def modeld_lagging_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubM
def wrong_car_mode_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
text = "Enable Adaptive Cruise to Engage"
if CP.carName == "honda":
if CP.brand == "honda":
text = "Enable Main Switch to Engage"
return NoEntryAlert(text)
+1 -1
View File
@@ -99,7 +99,7 @@ class SelfdriveD(CruiseHelper):
self.is_metric = self.params.get_bool("IsMetric")
self.is_ldw_enabled = self.params.get_bool("IsLdwEnabled")
car_recognized = self.CP.carName != 'mock'
car_recognized = self.CP.brand != 'mock'
# cleanup old params
if not self.CP.experimentalLongitudinalAvailable:
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6e1555145a4482e4148c2e7a5cdbf370720a3cf684f18686a50bf25de0b55650
size 356302
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:10b30201502cc65fa2b9aae2b8dc40cdbb3f546472bd6a00e0ab27b983cdfbad
size 356188
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0720a28167410da8dc5aa940f9ff916dcd3e1863ba4fb5b91c73ddf8c7e10c6c
size 256451
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ba147551edbc729a3bfc8c8e910584ef23ceaeb2a9092b8c07509b2dd913ee1a
size 256718
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:221caa376d9052d375dc82225f6c6f894fa684f4be2f387bf2cf46927ed3cd15
size 332404
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:07527a8ccdeb5f67e20b6e67a538466910cbac6ad2120cdedead2f14cf8291c1
size 332427
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d02a7e8de6fcc2f0d2c8371116d9acef752e53f3a0c701f89a8c12927c666678
size 268879
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a432f535c7205b5226839229401fe766566f5a353102233afee330f6dc73aca9
size 268997
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b17cefe94984aa855dc21f63afabf3514619cc0b4dc5eafc9c3f3594577a655c
size 435709
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7b44e54fc9b5a6ea7f2059f249da82556ce29de0292f8bb5e168fae1dadc2ffb
size 436895
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:333ea99fc2d88f0ec405f2ea5f1d86881a5879dc77ceee14700da1063a1319ac
size 308602
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dc115d7e482da0ddf40ecb373223186eed8d2f0e891cf67093db0d0b529c494e
size 308571
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:426f453cd17daaa3db48d98a8e2a34f7f113b91bdfe3da2dbe6d8c13c72f37f6
size 392249
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:470aeed5d3abc6fb21eecaadfde6b16bb86bbd2278801c52d2cc37fbef55c62a
size 392209
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:88e0d29b9a909c9cb97e47f62e0b42bb5761ac65d6836eb4d415982954df28f0
size 334267
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a67b104d4346028b5f5ad5e8855004bf44f474b93fff6ad6c50bcc148233d086
size 334360
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:77a887290be2730ba5b3d558de4a7c72598c3a20372038f5c9de08b57a84c33b
size 470504
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:28bc16380fcc42f1adf080debb22c7c9e6f3029570d35e50ffd0e43ae738eae3
size 470530
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6e152e4ffbfb1fa9cfaf3971859ea47ca5815735a3c391dc9b8c6e233a26658d
size 260279
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:853a2c5eb4cf8c20fc63521104d12fa91dbb19c43295de078190bb53db784ed9
size 260887
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:03aa9d65b2da189437de176269c698deb3fecd6167e958caf3530737cf15a431
size 217479
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:413c8d3858fa5305645ffb68c72656cb84c8b2c4b0a77b97b8daffe96dad1979
size 217456
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bd67adc5e5ea3353ef7cdd306b2e3b0f1b02862739ef3e313f0e4a20372c696a
size 293071
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a76ada20f3e01b5ed78ea99dba471eea21df2b916448329985d6cd270ab2e5bb
size 293051
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:70fe8b2843fb4721d72e9c7fc524825b067e0b550afec181b636ef329687fc4a
size 260872
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5422c2056596fce06cacbfe92fb2071e30701ff39cfacc1229b6ff759f0f1841
size 261132
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e5142666f3f837848db872917bd344b05209ddab82c2671a75b13682b709a9f8
size 100116
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cbf479de8c1c036c98b23d201b642f95db1bc741fd41dfc36aea6a9b6566bed0
size 100041
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2808066b4828ae0591957ab3b5ea654843c5a6f3051a0b734e0869dd903f82dc
size 262864
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:46099f53f298c388539e620a5ee5b49da6e3175f40ab3e9266f7ba8c92ae449b
size 262846
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cb2755f77239c319a9528b00fb17f1696c67085b825e2d08cbbe8d47545316cd
size 258556
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:de5017e468253e1fd378599099c074037dd8414d42d4788414b3d567033fc963
size 259373
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4643cd4e30aec5e5256f6da72748f959310f99ba763bbbf6981f077c64391327
size 268090
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0e8685b0704428a6de956da7e5416e0ee5431a2854071b05243cfd0675bcf6b1
size 268220
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c4a4a300062f80c37686b58ee1382569dcf8e51be523a67d0134e9de8660f8ab
size 305130
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8cd0eaec58af3cc43ae84d12247f43ddfdfd58410a88cc55c9c91a0b502a7079
size 305145
@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a3b26b9065a9f9f8afeea2f5e754e7b4443d234bedfa1752cd30bfecdf864878
size 255666
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0cf4727c6115f64890ce3ebc7f328312fb98e9b0d4749e8f54bbe82f02d13f94
size 255769

Some files were not shown because too many files have changed in this diff Show More