From deaad0f8fdc37da864fb83d6b37ae09b97f1e9d4 Mon Sep 17 00:00:00 2001 From: Vehicle Researcher Date: Thu, 6 Jun 2019 04:38:45 +0000 Subject: [PATCH] openpilot v0.5.13 release --- .gitignore | 3 + README.md | 17 +- RELEASES.md | 10 + cereal/car.capnp | 4 +- cereal/log.capnp | 23 +- common/clock.pyx | 16 + common/file_helpers.py | 103 + common/params.py | 61 +- common/realtime.py | 59 +- common/vin.py | 95 + installer/updater/updater | Bin 2501608 -> 2501608 bytes requirements_openpilot.txt | 1 + selfdrive/boardd/Makefile | 2 +- selfdrive/boardd/boardd.cc | 98 +- selfdrive/can/libdbc_py.py | 4 +- selfdrive/can/parser.cc | 22 +- selfdrive/can/parser.py | 10 +- selfdrive/can/tests/test_packer_honda.py | 5 +- selfdrive/car/car_helpers.py | 134 +- selfdrive/car/chrysler/carcontroller.py | 9 +- selfdrive/car/chrysler/carstate.py | 4 +- selfdrive/car/chrysler/interface.py | 37 +- selfdrive/car/chrysler/radar_interface.py | 11 +- selfdrive/car/ford/carstate.py | 2 +- selfdrive/car/ford/interface.py | 29 +- selfdrive/car/ford/radar_interface.py | 12 +- selfdrive/car/gm/carcontroller.py | 28 +- selfdrive/car/gm/carstate.py | 3 +- selfdrive/car/gm/gmcan.py | 9 +- selfdrive/car/gm/interface.py | 39 +- selfdrive/car/gm/radar_interface.py | 11 +- selfdrive/car/honda/carcontroller.py | 15 +- selfdrive/car/honda/carstate.py | 12 +- selfdrive/car/honda/hondacan.py | 9 +- selfdrive/car/honda/interface.py | 53 +- selfdrive/car/honda/radar_interface.py | 7 +- selfdrive/car/hyundai/carcontroller.py | 14 +- selfdrive/car/hyundai/carstate.py | 6 +- selfdrive/car/hyundai/interface.py | 35 +- selfdrive/car/hyundai/radar_interface.py | 2 +- selfdrive/car/mock/interface.py | 11 +- selfdrive/car/mock/radar_interface.py | 2 +- selfdrive/car/subaru/carcontroller.py | 5 +- selfdrive/car/subaru/carstate.py | 6 +- selfdrive/car/subaru/interface.py | 32 +- selfdrive/car/subaru/radar_interface.py | 2 +- selfdrive/car/toyota/carcontroller.py | 6 +- selfdrive/car/toyota/carstate.py | 4 +- selfdrive/car/toyota/interface.py | 35 +- selfdrive/car/toyota/radar_interface.py | 11 +- selfdrive/car/toyota/values.py | 10 +- selfdrive/common/messaging.h | 15 + selfdrive/common/version.h | 2 +- selfdrive/controls/controlsd.py | 80 +- selfdrive/controls/lib/alertmanager.py | 4 +- selfdrive/controls/lib/alerts.py | 32 +- selfdrive/controls/lib/cluster/LICENSE | 13 + selfdrive/controls/lib/cluster/Makefile | 28 + selfdrive/controls/lib/cluster/README | 79 + .../lib/cluster}/__init__.py | 0 .../controls/lib/cluster/fastcluster.cpp | 218 ++ selfdrive/controls/lib/cluster/fastcluster.h | 77 + .../controls/lib/cluster/fastcluster_R_dm.cpp | 115 ++ .../controls/lib/cluster/fastcluster_dm.cpp | 1794 +++++++++++++++++ .../controls/lib/cluster/fastcluster_py.py | 30 + selfdrive/controls/lib/cluster/test.cpp | 35 + selfdrive/controls/lib/latcontrol_indi.py | 2 +- selfdrive/controls/lib/latcontrol_pid.py | 2 +- selfdrive/controls/lib/longcontrol.py | 2 +- selfdrive/controls/lib/pathplanner.py | 11 +- selfdrive/controls/lib/planner.py | 26 +- selfdrive/controls/lib/radar_helpers.py | 26 +- selfdrive/controls/plannerd.py | 39 +- selfdrive/controls/radard.py | 72 +- selfdrive/controls/tests/test_clustering.py | 138 ++ .../controls/tests/test_following_distance.py | 2 +- selfdrive/debug/cpu_usage_stat.py | 1 + selfdrive/locationd/kalman/chi2_lookup.py | 21 + .../locationd/kalman/chi2_lookup_table.npy | Bin 0 -> 156928 bytes selfdrive/locationd/kalman/ekf_sym.py | 16 +- selfdrive/locationd/locationd_local.py | 36 +- selfdrive/locationd/ubloxd_main.cc | 6 +- selfdrive/loggerd/config.py | 10 + selfdrive/loggerd/deleter.py | 5 +- selfdrive/loggerd/loggerd | Bin 1703704 -> 1703704 bytes selfdrive/loggerd/tests/fill_eon.py | 5 +- selfdrive/logmessaged.py | 1 + selfdrive/manager.py | 15 +- selfdrive/mapd/default_speeds.json | 106 - selfdrive/mapd/default_speeds_generator.py | 240 --- selfdrive/mapd/mapd.py | 297 --- selfdrive/mapd/mapd_helpers.py | 364 ---- selfdrive/registration.py | 78 +- selfdrive/sensord/gpsd | Bin 1171544 -> 1171544 bytes selfdrive/sensord/sensord | Bin 1159016 -> 1159016 bytes selfdrive/service_list.yaml | 18 +- selfdrive/test/plant/maneuver.py | 24 +- selfdrive/test/plant/plant.py | 16 +- selfdrive/thermald.py | 55 +- selfdrive/ui/start.py | 7 + selfdrive/ui/start.sh | 6 - selfdrive/ui/ui.c | 283 ++- selfdrive/version.py | 48 +- selfdrive/visiond/camera_qcom.c | 18 +- selfdrive/visiond/visiond.cc | 10 +- 105 files changed, 3745 insertions(+), 1921 deletions(-) create mode 100644 common/clock.pyx create mode 100644 common/file_helpers.py create mode 100755 common/vin.py create mode 100644 selfdrive/common/messaging.h create mode 100644 selfdrive/controls/lib/cluster/LICENSE create mode 100644 selfdrive/controls/lib/cluster/Makefile create mode 100644 selfdrive/controls/lib/cluster/README rename selfdrive/{mapd => controls/lib/cluster}/__init__.py (100%) create mode 100644 selfdrive/controls/lib/cluster/fastcluster.cpp create mode 100644 selfdrive/controls/lib/cluster/fastcluster.h create mode 100644 selfdrive/controls/lib/cluster/fastcluster_R_dm.cpp create mode 100644 selfdrive/controls/lib/cluster/fastcluster_dm.cpp create mode 100644 selfdrive/controls/lib/cluster/fastcluster_py.py create mode 100644 selfdrive/controls/lib/cluster/test.cpp create mode 100644 selfdrive/controls/tests/test_clustering.py mode change 100644 => 100755 selfdrive/debug/cpu_usage_stat.py create mode 100644 selfdrive/locationd/kalman/chi2_lookup.py create mode 100644 selfdrive/locationd/kalman/chi2_lookup_table.npy delete mode 100644 selfdrive/mapd/default_speeds.json delete mode 100755 selfdrive/mapd/default_speeds_generator.py delete mode 100755 selfdrive/mapd/mapd.py delete mode 100644 selfdrive/mapd/mapd_helpers.py create mode 100755 selfdrive/ui/start.py delete mode 100755 selfdrive/ui/start.sh diff --git a/.gitignore b/.gitignore index 623c45d79..cfd789ec1 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,6 @@ selfdrive/visiond/visiond /src/ one +openpilot +xx + diff --git a/README.md b/README.md index 90a182443..772e41a9b 100644 --- a/README.md +++ b/README.md @@ -92,8 +92,6 @@ Supported Cars | Kia | Sorento 2018 | All | Yes | Stock | 0mph | 0mph | Custom6| | Kia | Stinger 2018 | SCC + LKAS | Yes | Stock | 0mph | 0mph | Custom6| | Lexus | RX Hybrid 2016-19 | All | Yes | Yes2| 0mph | 0mph | Toyota | -| Subaru | Crosstrek 2018 | EyeSight | Yes | Stock | 0mph | 0mph | Subaru | -| Subaru | Impreza 2019 | EyeSight | Yes | Stock | 0mph | 0mph | Subaru | | Toyota | Avalon 2016 | TSS-P | Yes | Yes2| 20mph1| 0mph | Toyota | | Toyota | Camry 20184 | All | Yes | Stock | 0mph5 | 0mph | Toyota | | Toyota | C-HR 2017-184 | All | Yes | Stock | 0mph | 0mph | Toyota | @@ -109,13 +107,13 @@ Supported Cars | Toyota | Rav4 2019 | All | Yes | Yes | 0mph | 0mph | Toyota | | Toyota | Rav4 Hybrid 2017-18 | All | Yes | Yes2| 0mph | 0mph | Toyota | -1[Comma Pedal](https://community.comma.ai/wiki/index.php/Comma_Pedal) is used to provide stop-and-go capability to some of the openpilot-supported cars that don't currently support stop-and-go. Here is how to [build a Comma Pedal](https://medium.com/@jfrux/comma-pedal-building-with-macrofab-6328bea791e8). ***NOTE: The Comma Pedal is not officially supported by [comma.ai](https://comma.ai)*** -2When disconnecting the Driver Support Unit (DSU), otherwise longitudinal control is stock ACC. For DSU locations, see [Toyota Wiki page](https://community.comma.ai/wiki/index.php/Toyota) -3[GM installation guide](https://zoneos.com/volt/). -4It needs an extra 120Ohm resistor ([pic1](https://i.imgur.com/CmdKtTP.jpg), [pic2](https://i.imgur.com/s2etUo6.jpg)) on bus 3 and giraffe switches set to 01X1 (11X1 for stock LKAS), where X depends on if you have the [comma power](https://comma.ai/shop/products/power/). -528mph for Camry 4CYL L, 4CYL LE and 4CYL SE which don't have Full-Speed Range Dynamic Radar Cruise Control. -6Open sourced [Hyundai Giraffe](https://github.com/commaai/neo/tree/master/giraffe/hyundai) is designed for the 2019 Sante Fe; pinout may differ for other Hyundais. -7Community built Giraffe, find more information [here](https://zoneos.com/shop/). +1[Comma Pedal](https://community.comma.ai/wiki/index.php/Comma_Pedal) is used to provide stop-and-go capability to some of the openpilot-supported cars that don't currently support stop-and-go. Here is how to [build a Comma Pedal](https://medium.com/@jfrux/comma-pedal-building-with-macrofab-6328bea791e8). ***NOTE: The Comma Pedal is not officially supported by [comma.ai](https://comma.ai)*** +2When disconnecting the Driver Support Unit (DSU), otherwise longitudinal control is stock ACC. For DSU locations, see [Toyota Wiki page](https://community.comma.ai/wiki/index.php/Toyota) +3[GM installation guide](https://zoneos.com/volt/). +4It needs an extra 120Ohm resistor ([pic1](https://i.imgur.com/CmdKtTP.jpg), [pic2](https://i.imgur.com/s2etUo6.jpg)) on bus 3 and giraffe switches set to 01X1 (11X1 for stock LKAS), where X depends on if you have the [comma power](https://comma.ai/shop/products/power/). +528mph for Camry 4CYL L, 4CYL LE and 4CYL SE which don't have Full-Speed Range Dynamic Radar Cruise Control. +6Open sourced [Hyundai Giraffe](https://github.com/commaai/neo/tree/master/giraffe/hyundai) is designed for the 2019 Sante Fe; pinout may differ for other Hyundais. +7Community built Giraffe, find more information [here](https://zoneos.com/shop/). Community Maintained Cars ------ @@ -173,7 +171,6 @@ Directory structure ├── locationd # Soon to be home of precise location ├── logcatd # Android logcat as a service ├── loggerd # Logger and uploader of car data - ├── mapd # Fetches map data and computes next global path ├── proclogd # Logs information from proc ├── sensord # IMU / GPS interface code ├── test # Car simulator running code through virtual maneuvers diff --git a/RELEASES.md b/RELEASES.md index 0ae93ba2b..50e71874b 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,3 +1,13 @@ +Version 0.5.13 (2019-05-31) +========================== + * Reduce panda power consumption by 70%, down to 80mW, when car is off (not for GM) + * Reduce EON power consumption by 40%, down to 1100mW, when car is off + * Reduce CPU utilization by 20% and improve stability + * Temporarily remove mapd functionalities to improve stability + * Add openpilot record-only mode for unsupported cars + * Synchronize controlsd to boardd to reduce latency + * Remove panda support for Subaru giraffe + Version 0.5.12 (2019-05-16) ========================== * Improve lateral control for the Prius and Prius Prime diff --git a/cereal/car.capnp b/cereal/car.capnp index fe0d84e25..b33ab97c8 100644 --- a/cereal/car.capnp +++ b/cereal/car.capnp @@ -74,6 +74,7 @@ struct CarEvent @0x9b1657f34caf3ad3 { invalidGiraffeHonda @49; vehicleModelInvalid @50; controlsFailed @51; + sensorDataInvalid @52; } } @@ -175,7 +176,7 @@ struct CarState { # ******* radar state @ 20hz ******* -struct RadarState { +struct RadarData @0x888ad6581cf0aacb { errors @0 :List(Error); points @1 :List(RadarPoint); @@ -333,6 +334,7 @@ struct CarParams { steerActuatorDelay @36 :Float32; # Steering wheel actuator delay in seconds openpilotLongitudinalControl @37 :Bool; # is openpilot doing the longitudinal control? + carVin @38 :Text; # VIN number queried during fingerprinting struct LateralPIDTuning { kpBP @0 :List(Float32); diff --git a/cereal/log.capnp b/cereal/log.capnp index 84f0a3e80..7276e20b5 100644 --- a/cereal/log.capnp +++ b/cereal/log.capnp @@ -305,12 +305,12 @@ struct LiveUI { awarenessStatus @3 :Float32; } -struct Live20Data { +struct RadarState @0x9a185389d6fdd05f { canMonoTimes @10 :List(UInt64); mdMonoTime @6 :UInt64; ftMonoTimeDEPRECATED @7 :UInt64; - l100MonoTime @11 :UInt64; - radarErrors @12 :List(Car.RadarState.Error); + controlsStateMonoTime @11 :UInt64; + radarErrors @12 :List(Car.RadarData.Error); # all deprecated warpMatrixDEPRECATED @0 :List(Float32); @@ -368,15 +368,15 @@ struct LiveTracks { oncoming @9 :Bool; } -struct Live100Data { +struct ControlsState @0x97ff69c53601abf1 { canMonoTimeDEPRECATED @16 :UInt64; canMonoTimes @21 :List(UInt64); - l20MonoTimeDEPRECATED @17 :UInt64; + radarStateMonoTimeDEPRECATED @17 :UInt64; mdMonoTimeDEPRECATED @18 :UInt64; planMonoTime @28 :UInt64; pathPlanMonoTime @50 :UInt64; - state @31 :ControlState; + state @31 :OpenpilotState; vEgo @0 :Float32; vEgoRaw @32 :Float32; aEgoDEPRECATED @1 :Float32; @@ -433,7 +433,7 @@ struct Live100Data { pidState @53 :LateralPIDState; } - enum ControlState { + enum OpenpilotState @0xdbe58b96d2d1ac61 { disabled @0; preEnabled @1; enabled @2; @@ -507,6 +507,7 @@ struct ModelData { points @0 :List(Float32); prob @1 :Float32; std @2 :Float32; + stds @3 :List(Float32); } struct LeadData { @@ -574,7 +575,7 @@ struct LogRotate { struct Plan { mdMonoTime @9 :UInt64; - l20MonoTime @10 :UInt64; + radarStateMonoTime @10 :UInt64; eventsDEPRECATED @13 :List(Car.CarEvent); # lateral, 3rd order polynomial @@ -648,6 +649,7 @@ struct PathPlan { paramsValid @10 :Bool; modelValid @12 :Bool; angleOffset @11 :Float32; + sensorValid @14 :Bool; } struct LiveLocationData { @@ -1643,6 +1645,7 @@ struct LiveParametersData { angleOffsetAverage @3 :Float32; stiffnessFactor @4 :Float32; steerRatio @5 :Float32; + sensorValid @6 :Bool; } struct LiveMapData { @@ -1690,13 +1693,13 @@ struct Event { sensorEventDEPRECATED @4 :SensorEventData; can @5 :List(CanData); thermal @6 :ThermalData; - live100 @7 :Live100Data; + controlsState @7 :ControlsState; liveEventDEPRECATED @8 :List(LiveEventData); model @9 :ModelData; features @10 :CalibrationFeatures; sensorEvents @11 :List(SensorEventData); health @12 :HealthData; - live20 @13 :Live20Data; + radarState @13 :RadarState; liveUIDEPRECATED @14 :LiveUI; encodeIdx @15 :EncodeIndex; liveTracks @16 :List(LiveTracks); diff --git a/common/clock.pyx b/common/clock.pyx new file mode 100644 index 000000000..6205eca10 --- /dev/null +++ b/common/clock.pyx @@ -0,0 +1,16 @@ +from posix.time cimport clock_gettime, timespec, CLOCK_BOOTTIME, CLOCK_MONOTONIC_RAW + +cdef double readclock(int clock_id): + cdef timespec ts + cdef double current + + clock_gettime(clock_id, &ts) + current = ts.tv_sec + (ts.tv_nsec / 1000000000.) + return current + + +def monotonic_time(): + return readclock(CLOCK_MONOTONIC_RAW) + +def sec_since_boot(): + return readclock(CLOCK_BOOTTIME) diff --git a/common/file_helpers.py b/common/file_helpers.py new file mode 100644 index 000000000..bdfe9d0ec --- /dev/null +++ b/common/file_helpers.py @@ -0,0 +1,103 @@ +import os +import shutil +import tempfile +from atomicwrites import AtomicWriter + +def mkdirs_exists_ok(path): + try: + os.makedirs(path) + except OSError: + if not os.path.isdir(path): + raise + +def rm_not_exists_ok(path): + try: + os.remove(path) + except OSError: + if os.path.exists(path): + raise + +def rm_tree_or_link(path): + if os.path.islink(path): + os.unlink(path) + elif os.path.isdir(path): + shutil.rmtree(path) + +def get_tmpdir_on_same_filesystem(path): + # TODO(mgraczyk): HACK, we should actually check for which filesystem. + normpath = os.path.normpath(path) + parts = normpath.split("/") + if len(parts) > 1: + if parts[1].startswith("raid"): + if len(parts) > 2 and parts[2] == "runner": + return "/{}/runner/tmp".format(parts[1]) + elif len(parts) > 2 and parts[2] == "aws": + return "/{}/aws/tmp".format(parts[1]) + else: + return "/{}/tmp".format(parts[1]) + elif parts[1] == "aws": + return "/aws/tmp" + elif parts[1] == "scratch": + return "/scratch/tmp" + return "/tmp" + +class AutoMoveTempdir(object): + def __init__(self, target_path, temp_dir=None): + self._target_path = target_path + self._path = tempfile.mkdtemp(dir=temp_dir) + + @property + def name(self): + return self._path + + def close(self): + os.rename(self._path, self._target_path) + + def __enter__(self): return self + + def __exit__(self, type, value, traceback): + if type is None: + self.close() + else: + shutil.rmtree(self._path) + +class NamedTemporaryDir(object): + def __init__(self, temp_dir=None): + self._path = tempfile.mkdtemp(dir=temp_dir) + + @property + def name(self): + return self._path + + def close(self): + shutil.rmtree(self._path) + + def __enter__(self): return self + + def __exit__(self, type, value, traceback): + self.close() + +def _get_fileobject_func(writer, temp_dir): + def _get_fileobject(): + file_obj = writer.get_fileobject(dir=temp_dir) + os.chmod(file_obj.name, 0o644) + return file_obj + return _get_fileobject + +def atomic_write_on_fs_tmp(path, **kwargs): + """Creates an atomic writer using a temporary file in a temporary directory + on the same filesystem as path. + """ + # TODO(mgraczyk): This use of AtomicWriter relies on implementation details to set the temp + # directory. + writer = AtomicWriter(path, **kwargs) + return writer._open(_get_fileobject_func(writer, get_tmpdir_on_same_filesystem(path))) + + +def atomic_write_in_dir(path, **kwargs): + """Creates an atomic writer using a temporary file in the same directory + as the destination file. + """ + writer = AtomicWriter(path, **kwargs) + return writer._open(_get_fileobject_func(writer, os.path.dirname(path))) + diff --git a/common/params.py b/common/params.py index 30ebaa060..cde03156f 100755 --- a/common/params.py +++ b/common/params.py @@ -41,7 +41,7 @@ def mkdirs_exists_ok(path): class TxType(Enum): PERSISTENT = 1 CLEAR_ON_MANAGER_START = 2 - CLEAR_ON_CAR_START = 3 + CLEAR_ON_PANDA_DISCONNECT = 3 class UnknownKeyName(Exception): @@ -49,32 +49,33 @@ class UnknownKeyName(Exception): keys = { - "AccessToken": TxType.PERSISTENT, - "CalibrationParams": TxType.PERSISTENT, - "CarParams": TxType.CLEAR_ON_CAR_START, - "CompletedTrainingVersion": TxType.PERSISTENT, - "ControlsParams": TxType.PERSISTENT, - "DoUninstall": TxType.CLEAR_ON_MANAGER_START, - "DongleId": TxType.PERSISTENT, - "GitBranch": TxType.PERSISTENT, - "GitCommit": TxType.PERSISTENT, - "GitRemote": TxType.PERSISTENT, - "HasAcceptedTerms": TxType.PERSISTENT, - "IsDriverMonitoringEnabled": TxType.PERSISTENT, - "IsFcwEnabled": TxType.PERSISTENT, - "IsGeofenceEnabled": TxType.PERSISTENT, - "IsMetric": TxType.PERSISTENT, - "IsUpdateAvailable": TxType.PERSISTENT, - "IsUploadVideoOverCellularEnabled": TxType.PERSISTENT, - "LimitSetSpeed": TxType.PERSISTENT, - "LiveParameters": TxType.PERSISTENT, - "LongitudinalControl": TxType.PERSISTENT, - "Passive": TxType.PERSISTENT, - "RecordFront": TxType.PERSISTENT, - "ShouldDoUpdate": TxType.CLEAR_ON_MANAGER_START, - "SpeedLimitOffset": TxType.PERSISTENT, - "TrainingVersion": TxType.PERSISTENT, - "Version": TxType.PERSISTENT, + "AccessToken": [TxType.PERSISTENT], + "CalibrationParams": [TxType.PERSISTENT], + "CarParams": [TxType.CLEAR_ON_MANAGER_START, TxType.CLEAR_ON_PANDA_DISCONNECT], + "CompletedTrainingVersion": [TxType.PERSISTENT], + "ControlsParams": [TxType.PERSISTENT], + "DoUninstall": [TxType.CLEAR_ON_MANAGER_START], + "DongleId": [TxType.PERSISTENT], + "GitBranch": [TxType.PERSISTENT], + "GitCommit": [TxType.PERSISTENT], + "GitRemote": [TxType.PERSISTENT], + "HasAcceptedTerms": [TxType.PERSISTENT], + "IsDriverMonitoringEnabled": [TxType.PERSISTENT], + "IsFcwEnabled": [TxType.PERSISTENT], + "IsGeofenceEnabled": [TxType.PERSISTENT], + "IsMetric": [TxType.PERSISTENT], + "IsUpdateAvailable": [TxType.PERSISTENT], + "IsUploadVideoOverCellularEnabled": [TxType.PERSISTENT], + "LimitSetSpeed": [TxType.PERSISTENT], + "LiveParameters": [TxType.PERSISTENT], + "LongitudinalControl": [TxType.PERSISTENT], + "Passive": [TxType.PERSISTENT], + "RecordFront": [TxType.PERSISTENT], + "ShouldDoUpdate": [TxType.CLEAR_ON_MANAGER_START], + "SpeedLimitOffset": [TxType.PERSISTENT], + "SubscriberInfo": [TxType.PERSISTENT], + "TrainingVersion": [TxType.PERSISTENT], + "Version": [TxType.PERSISTENT], } @@ -308,14 +309,14 @@ class Params(object): def _clear_keys_with_type(self, tx_type): with self.transaction(write=True) as txn: for key in keys: - if keys[key] == tx_type: + if tx_type in keys[key]: txn.delete(key) def manager_start(self): self._clear_keys_with_type(TxType.CLEAR_ON_MANAGER_START) - def car_start(self): - self._clear_keys_with_type(TxType.CLEAR_ON_CAR_START) + def panda_disconnect(self): + self._clear_keys_with_type(TxType.CLEAR_ON_PANDA_DISCONNECT) def delete(self, key): with self.transaction(write=True) as txn: diff --git a/common/realtime.py b/common/realtime.py index 7fe183fb2..21204db0d 100644 --- a/common/realtime.py +++ b/common/realtime.py @@ -2,58 +2,24 @@ import os import time import platform -import threading import subprocess import multiprocessing - from cffi import FFI + +# Build and load cython module +import pyximport +installer = pyximport.install(inplace=True, build_dir='/tmp') +from common.clock import monotonic_time, sec_since_boot # pylint: disable=no-name-in-module, import-error +pyximport.uninstall(*installer) +assert monotonic_time +assert sec_since_boot + + ffi = FFI() -ffi.cdef(""" - -typedef int clockid_t; -struct timespec { - long tv_sec; /* Seconds. */ - long tv_nsec; /* Nanoseconds. */ -}; -int clock_gettime (clockid_t clk_id, struct timespec *tp); - -long syscall(long number, ...); - -""" -) +ffi.cdef("long syscall(long number, ...);") libc = ffi.dlopen(None) -# see -CLOCK_MONOTONIC_RAW = 4 -CLOCK_BOOTTIME = 7 - -if platform.system() != 'Darwin' and hasattr(libc, 'clock_gettime'): - c_clock_gettime = libc.clock_gettime - - tlocal = threading.local() - def clock_gettime(clk_id): - if not hasattr(tlocal, 'ts'): - tlocal.ts = ffi.new('struct timespec *') - - ts = tlocal.ts - - r = c_clock_gettime(clk_id, ts) - if r != 0: - raise OSError("clock_gettime") - return ts.tv_sec + ts.tv_nsec * 1e-9 -else: - # hack. only for OS X < 10.12 - def clock_gettime(clk_id): - return time.time() - -def monotonic_time(): - return clock_gettime(CLOCK_MONOTONIC_RAW) - -def sec_since_boot(): - return clock_gettime(CLOCK_BOOTTIME) - - def set_realtime_priority(level): if os.getuid() != 0: print("not setting priority, not root") @@ -99,10 +65,9 @@ class Ratekeeper(object): lagged = False remaining = self._next_frame_time - sec_since_boot() self._next_frame_time += self._interval - if remaining < -self._print_delay_threshold: + if self._print_delay_threshold is not None and remaining < -self._print_delay_threshold: print("%s lagging by %.2f ms" % (self._process_name, -remaining * 1000)) lagged = True self._frame += 1 self._remaining = remaining return lagged - diff --git a/common/vin.py b/common/vin.py new file mode 100755 index 000000000..29357e34b --- /dev/null +++ b/common/vin.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python +import time +from common.realtime import sec_since_boot +import selfdrive.messaging as messaging +from selfdrive.boardd.boardd import can_list_to_can_capnp + +def get_vin(logcan, sendcan): + + # works on standard 11-bit addresses for diagnostic. Tested on Toyota and Subaru; + # Honda uses the extended 29-bit addresses, and unfortunately only works from OBDII + query_msg = [[0x7df, 0, '\x02\x09\x02'.ljust(8, "\x00"), 0], + [0x7e0, 0, '\x30'.ljust(8, "\x00"), 0]] + + cnts = [1, 2] # Number of messages to wait for at each iteration + vin_valid = True + + dat = [] + for i in range(len(query_msg)): + cnt = 0 + sendcan.send(can_list_to_can_capnp([query_msg[i]], msgtype='sendcan')) + got_response = False + t_start = sec_since_boot() + while sec_since_boot() - t_start < 0.05 and not got_response: + for a in messaging.drain_sock(logcan): + for can in a.can: + if can.src == 0 and can.address == 0x7e8: + vin_valid = vin_valid and is_vin_response_valid(can.dat, i, cnt) + dat += can.dat[2:] if i == 0 else can.dat[1:] + cnt += 1 + if cnt == cnts[i]: + got_response = True + time.sleep(0.01) + + return "".join(dat[3:]) if vin_valid else "" + +""" +if 'vin' not in gctx: + print "getting vin" + gctx['vin'] = query_vin()[3:] + print "got VIN %s" % (gctx['vin'],) + cloudlog.info("got VIN %s" % (gctx['vin'],)) + +# *** determine platform based on VIN **** +if vin.startswith("19UDE2F36G"): + print "ACURA ILX 2016" + self.civic = False +else: + # TODO: add Honda check explicitly + print "HONDA CIVIC 2016" + self.civic = True + +# *** special case VIN of Acura test platform +if vin == "19UDE2F36GA001322": + print "comma.ai test platform detected" + # it has a gas interceptor and a torque mod + self.torque_mod = True +""" + + +# sanity checks on response messages from vin query +def is_vin_response_valid(can_dat, step, cnt): + + can_dat = [ord(i) for i in can_dat] + + if len(can_dat) != 8: + # ISO-TP meesages are all 8 bytes + return False + + if step == 0: + # VIN does not fit in a single message and it's 20 bytes of data + if can_dat[0] != 0x10 or can_dat[1] != 0x14: + return False + + if step == 1 and cnt == 0: + # first response after a CONTINUE query is sent + if can_dat[0] != 0x21: + return False + + if step == 1 and cnt == 1: + # second response after a CONTINUE query is sent + if can_dat[0] != 0x22: + return False + + return True + + +if __name__ == "__main__": + import zmq + from selfdrive.services import service_list + context = zmq.Context() + logcan = messaging.sub_sock(context, service_list['can'].port) + sendcan = messaging.pub_sock(context, service_list['sendcan'].port) + time.sleep(1.) # give time to sendcan socket to start + + print get_vin(logcan, sendcan) diff --git a/installer/updater/updater b/installer/updater/updater index 0b8602b3550175fdd2b004d1a573ea8fa1b11488..84a8614d51fbb8e473418b62b18f62f5e185d489 100755 GIT binary patch delta 408565 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 z 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%0AInG>hcaA_5ltM98I9*seyb7I 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%0A0?)W_HD)1bMVJV{6lj02R6UXRU0!nkx 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 delta 406617 zcmZ_X4cP2Nc|Pzt_!TH>M3es2&CQu}U0(0y@0sV$ z$IR@R_dN$F{$H@8sQx$0_BiL4`-=M4Iluhy_rJE62p``3zs=V#Ub*9OPdL`P^`VU) zA*A7FA0mCvo%=rVNvEFwpSv|~pt|3~Wc9nh zYWoi#DE-X4q+f&a536pbzWP-de_!}Vc9(wVuXbMf#KVre{U@@mhw_bk$@1iP(p}v2 zArF>*`R~b_-V=UANBZDCI}beMF#q-k$g+p>JAO}=Kl32zLtN&L>J=U!9w_WwzO%#O zPp@8deb?Fl$;+$p*X=Dm+EeD-gZu~M9Ut_kjXzPShKum{r`=yROwjN`G+gtmoxeHc z+3J}z;)pF;J)Ht?L6<$!w$clCgDMNskh;6s!6-xK{D>b|J-@U zp@;3)E#y;KNc|CJ{ET1iJp8a@j>~=_%QnjA;G(zD)p9I_^LNObJOt17AJsG0FLiY5 z&g%|4?C=TN)O!4I^$zRu1n>M%T;>^j$eVP3wDZ6x9kW|>>la`5q|Y7Tn@_36SHC9W z5zW{8Ue+FN3D!D_mekE}kLB z2jm7kB=3K-dau>5MdQ8@>WRB(h^V0lkIDP+gxrRw@R&S=Cp&*|!ajaV)d@CjMm~k-*`dQ+TK4)oRL6=(Y+%d;U6kd{N@D+Iu7yfR!ksN|_TO#i$%gJ$q27N-Go;V;^4;I@_`Q*Q!3mUD>N=1(4J`Z{<)f)HnZNxpE4-1>_2KKX?= zNO#CD|6A!UdH;)**V}eLh4dQPFeJC?hU%B6@d^34Uy$QN@(2&SsJ!{uP@kLXi6d%I zPaKo0Cr-)L6KCYj6ITzAZ(M$CsV81;3eA(MCoVKDjP@L>C+?CP_~7r8@Bd|Az9O3n z-shz|Q1Tk-xXx|Kj)Ba}%S%ARl~4E-sV& z!uQB2=#WRBk=`Xg?TgZTzemTG;38SDsNwiGO7D{!aGU)0OXPTm{Ai4Km8)ZmDhyNs z$CeZROa^)6`5Dru#iWcPR4MpVY4aMZ@4JG7wL%v906+HyZ8*HEYNYW=D0H$}-uaRSuHfba+pk94AjjL}9r%dcgoosobYEmt z=%GP8sC{7vZjle+LvkBFBOkz%#<%8nghELT6L|N*?HdZhD9otPIZysEOhoQrd`9lVOLC|FGsEhaxp(^k1{m*KR2ZV*l6&wGxr+?_8SHHV0P$;Rvd;=EI zKJ6#SaHAIa>I^yFCC@Q_v~jurmMF|Ng=WNx3R@&Z0>yDuU<*{od<$G=Pl1?2sgN)O2| z$M^;L4C5p6lTN5}s`VFBVfA8pfrQ*>8mga6kelC@i)%?9og{M#@|#~Fy{x@n|7!c4 zgoYJ0oH>vUV&C>+?7m#OL4F3to8&jZyIbDuzwtlHCm3uM>isv}t@>*<)vqDBfCuDi zd`PawC**f_9w_&JMuo(X7tYC#c%bwpdG;Xb=6>xrbo;}kcgT<4U3zyv`rdAg3-_qu zs{6_Yms~yZfPIG?KPK<&Eq$t7eQ$RsE<95Od~fINAsYhn3r*=Mxw@f@e1Zos9?^b7 zzG^V3pytdXS5IJ*s|Rq%)dRTXcmQ8`RHzn3v*^a;YE4YY)tZ=+t2Ggms|QXRuhyU1 ze(Du1so}PV%Nr`mJ6J?3@9iIm)c8s?k*?to$zyC-&|F55z8rDxtzJ6lz^%Ik; zZ5*s!e*OqG$BT8LS%X5&aYU}>I3`zfT#&0LF3C$DbKHAW`xQA|EEe*s;2yaeKO*m7 z{DS-pxF1o$IzV2yAin`#l3xlpAKiX{Lmnq{y5#p@d{6r3{NFnePfQI*93;I@em;U+ z^6YRqen5UsPx`Rs)%@Fs%7WJ_2yw>2(x>D-Twq47E)bBb{E)oKuh-v#3J2j%6Y_I# z;glWYGjes|oLoKFs`6(2t53j#o+6)EblY>Op3ERu7cj}y1uXLKK3V4XH!k;|x`4eY zH2Y6oz#&%`aLLu1^T^M6w!H9&eE+^L3u7wmd4%){`DuOWA^8o@lD;6{ALAo(l^^?5 zP#4I_&%gzio<0-kypOMS_YW)RNP#1{Fzl#ebb)_?D{4>|5C^umrMiGYt}bAbUxn@6+wx}ror$@(whHzBQy1=&s|(xY>cT_vo00F4 zSNU@PkEoz7FeXHFS&;79UnEdv?ke(dqw_j=YAM!h)oEowp;|B=jF5Gxb zJIDQr9N%TXLwaAiI{!~@mjzc9aQ@GJD&1p8(1d)5oPazlWKKlxhiFKt5aCTM$um5e zaZvk-ulbmKr6&1R@DBOq(tXjV!Woy!Ae;O&xI=yd+#^39J|aICK5o2Pe`@=ki9$dP zx8Vsw^6$bItZ?HBabnD zM1C6FpHd-0VMe~^N8|+p^6_QTL-GZ37UU=Gl;b1mo9}IJM^H=+_k2t?B;*5JASDlQ zfsA|x&s+Zb>d!B6fn}>u{m2Oo;*jYp;nsKMP$F5#T~=+DZaCHdm>(hKtJGt$eJ zSNrX@g)FRE1tG4vQo1;_{l0Je8|emlh8&Z8f8=z@?^}Dl-+NRDu846037loFy5`a`Mgo5sRB-Dd;-)B&mQNvL;$qNMJmt%ZLzCRvdL4GO5M_bn>k}9X!euP7C}pL<0v_0g~nIpuSbq=9MPUj6G5iNyX0?0kVW1_PG94W^v(JI90U!hp^u=U z#z*9ThMWnxi=1i8tNB-jpj8m!LkL=sj}R1TJRzSWCnKNMIraL>cU7poAP*6=V#f`M z-)~Q42sg>EKu)*vX8o&Azy%t5)S$di{&@sB+di>Pn|f)es2f>QDVo|AtAIR$x%@ug1%@dt7rn@?@er3vql zci}zqZ{xy!atq^a`1<^BqcEff7w(Y{;ZyPvd`3Qohi&)8t+>;uT@VvA#N<puz$TJ#zI|b1m`+<8AUE;K5w-7~==E*Xv(xzXS!38h(tRF?o*h z6Y>HclCR*4EpPUp@l3hs;;llx{eFfEr{o=s&&a#*CHXIrQtAg@RTxpjvk){PFA+4=ctGwTXR+<|{xhE?7gw}hsJshL$X|${jNHcfoZN*M z$fYDnQD@*F-UFW>?B3LdV# zdH(A609#H$vM$u0f7Q2U_{TI-as%Jh=HwpUL_r>7d`X`AD2QjYU-cUhWRklW-yt8s zd*o*!r%&F&1N$}=x+u8h??BLyypQo7xdR`QPmnW}zB&I7(J-S1X0unzDr)hEuRYijv$-de2%g7`UtmgE7(7vvFqMP4Gu zcxHRbvSxg>{!A(?5!5CBC4ww+@rQD1`s60uA^&gW3~H~}zuJBl8iv&1z(?f2M$m-Z z!}uxr7#?hSv;Xcv&|<4l@4p!uBJu@1A^$(*WaKHv=j6*j#QDFV!fpr2SGpn>M@tva zYR{zsH_7jZoG!VE@x5o!`M-mLLk(THOWuQz$SwGoyblkQtMk8&LZ}Kj|2y!A{6PoF zH<6IL7@v|4;W@d#7lH~ZjL=Y$kKv}>o`MOyLq3D|$wTSBu&J;>gG>JKgX9wr$zzQ7 z$P@UOd|%{D8?V;C+I}e-X4IfOB;OxFIeCtpC3y)ix4qtfk4BJqcKel@ehbmZn^Iwfpn!acpauCD<0JA3 zJR_gN^U9m`uRZ~1D6FUIqjm;2AdlZ`foX8WaR7?UsIQ}VYW zCmHy&UKNhze&RC?PixlxjRDKLms`{EJ=P1^+#qhUs#!b9>;A}1oxF+L_Q z8n4!0N`+4&C?_`^xrmnJU3f|UCFF=>+EeLZyit3-{?+yypwOX)uOp~OKE`;9d;+)0 zzkwWg%bWcdqG7OAsQ2Fj?vei!g2v=2#!tvI_>BBt55oCBq(X^?1-Up@PC-omW86?m z-o^Ng+=4HU@!NCrQv{XN;GkheK7bp~ZRgyHoDR8%@m=NW{69j$QU#p<{|iAj`4rSSA^#nMX5>qZ56DaSg4}p)GnLif|D!_ZI621&c@LhE?9>BZgk3)_{9%Foe+w1+O3eI++atlEN@&rLc zjgQEmft(3>Ugb3Vf4Yl8z5fI9V-U0;U*d)$jVI(UL{8?=`M*F=P7TTn@{B3~g# z9NV5s<>uO(=NIC&2!GUMwk4Mmwe1P!@~1rx=l=l}7HAlfNAMAO9}h4gPceQj)sVQ2~Wsv(Wll=L}>5}{6`Es@Q zs9?bRfe7|@=Fjj zB%k1hJdKaZ{|Y(N7tr}XK+udDl!xRIf+BY0#2Qc6-aNk$Uqw*9F4WIo{cH$9OO2Q0 zHzG&4?WtTM$6)tS=uqJn1oggSG;WjMh8&l?iyVKTDR|^RLC~1oM$km#GxEET z6H4El|Az=#P=oTA{C^RYl8=#-X?)r8YW|JKLJdbCXhvQlDA4$V{8`9}H!k;| z>B=ccHic&UDbL7{L(r1kLQbLa75PgZkMqCrqV`<62r@O^B_HC3Eb3IR2|8$k>56hV>36Y}$sleN7%|05`G7uH^o&k?jD zH(n^$ka%%>DwUh$pJ;Nb_1C3B7ePIZ_sKtt8*<2PsQ2Hu5tNXJ2ud}cli!M*f;@R4&j01T3(fu)C$#7Cb_AK^ zOWaUL<2~~KLQek#I{%9o$wg#SgL0SrHwYS%cah_1e5_oZ|L@n67oMsD&i^)oW*QI4 zP2@!6L*&HdzAB_tcm#rS@(F^L8ZXHohaB;e_EaupjxUT|7et5r$q4F^r???Y<2LzG z$Z;F5*1y_*1%d|Dpxh&WE`rA7#*5`tPBcE-_Im%l2tna?p>hjB3ysI*uS8Bt?jk4K zg*W?uNd*r?7s=^)6|c$YjujzvC1PG9=g`5y&`8or630r>>uhZ-M|e-Am6mRIv1AZXeuY&;sE{Ej*LXqxKe(Y4d5Ih`Xiuebv+`#Bt53k)o*)-pmm18M zNbhO9PyRsUIOG;`+>OiqrwYSOq1k^O1dYfC2pVgAO8yw+1mxqF;QSxnt012^B0mg4 z33-ScN;RI7KOH%RPlXggC3yxHFK^G~(FiihbByn3ya!*O|BpvdpBf4T*&27rUyPg~ zd5Ija?Y>Zjal0T+M9`Fcg`kB-qzj&90>SsUX9)famqY0}1-FzA^ z$=`$=abh)<_4-%a&qR<>7k1$t^0N@sBkv%`(zw0l&Hj5Qg50e_eFI$t4K(hNpNpI^ zc@H_0d%N8KGb(%#K_R(?poPX`@(YlYlJ}95ok-_@RajEP#Rw|NT?DN(ZoHyBl^;h= zN4YxxdkE^P0?z-+E%GZ6WRp*j<7j+9?tdOZ9u)!vjWj+X{|a(uDc;8g4<5aZ-CO3j~=O?~>n&9BbR_^}j+;f4i{d z4*3rdG$8N1O#Y@d)cA<}r&Ug~|0Y!EBWSAefczJ@p#`~%oJixzNp$}IHG(o~7$GRv zctO77VEHCiD@*$C>BcQD@8xJ!O4a)#tqol{@m+f||RG5HG-G$nU%Lov+f;Zvf?V-Dd;pDHY<;aUX6l;<*M#$+#&w~ZfHQ>LC#R)qf`9$6Z{lG6Kb#! zG}U-O{tM(R$Q|TF%GLQ_6%tjz`Ty4l%E$)@$~9h)?|7noqbqXXLy$PN{U(%~^y=0Cr94dqeay33Ae*|u5M4ljLtnq2%)%sW4?;r#P)UZTQsPTyWP~;@! zE99ixUhh9u$hQlXKNUd*dFK^!E=!GzKWR_pvyfwwTUAc8|2w-V)ce0j?jWeojvKNy z?vlR{Im17p^Zx)r9yKT*lfN86Q}PjVW*QII-aLQx@A*Vfv@X=oU;U$*2#PhHlAn&8 zoIF6zlHEt4q{5pKBu;D3WrXpD#yjM1M^2ACMUHQ23O4z>5#*9D5j4=aNB#lijHPeR z|0@Jds6qLR{KE(e$<32+BGP!=@@oDsMo`)+RI49BnZ}poA4g6}ZX;*4E3em|@#^** zUxA8qdgYc_PmLODZG?Dm1<#zZExRyrw;sIdV*mcYP}S06`XcfuO#| z9rB+dXFx7qDR;*ZzCQn}!iXAvfuIR_2SHPf2jss-&Z6zUun-ir3u{lvcN`+0AR~8> zlWV*n-@VDH*58T>9)iSc+jFVhB!38Qs7pRUPEX_g+UxbNw%@)8a;PCdkgM?_`2olY z$Rp&0Ti)zHRfx6<_5OPTf)ersL8-=b@+TvwAYZ;x{r#VN7n=QF{fDNTuj&mw9YH3! zI9aZVj>dcB&qhw)qw{|kK{hogcgc@M(2%^398cq8emZi*>FueU%AD%&|LnRTI^=IgP>(#o4Otqu$={9~ zxAC3#ziY1@gPl9>+Q;{3;JYz!OrGF^6Y>l`BmV$$Lh=IR7t%K;p%R6d8a|AmlzfHp z8M*l?xht0B7bB-^dG$%q$8R#LR-rlxA;@@Ldk#N=pbmK-&Uol}1j*;H`R z;E;Rp0r^$9A&-2D@gwpXd{TMyNvJ+({tiJiY6#H~kVo(Z`Hjel$y1C^Hr`xcGFoA8V}&>lh8c~T2O_mVhvYdt+VW=qJp@6?R-xX11sYQF6+9<@7;*}7;}p3jN^I(7=m&t%+RnT58x&F(~u+H*q%xgpNt0iLgrNe zB_t|58$mtt^k(^qW@+3dk8q;{@(k`ZUafz%{r(si9#cb!hKa^!->pabS8NZ?suu+CXDEGh z{#S(&HGB|36LJqhQ;i4Y7a(WR@@oFa2#Q*TjVI(6BPb)EA}7~)LH_YNr(S<6Dg+1; zZ*I?}a+CZD+)$T%ft;Sk`;|BAUws089zhN@#0YXVJ|zDNaz^ASa>g5%`%e|7n?kew zu0>Elo+BvKctrjUFK|O8c?lP9X-{R29Mh+Qahlw( z9r7{$i-Y82`yi)Rd%gbE z_Dj)VQ9};5$-4-0$qS4hkWVr9-j+A}?+FMRZx!nOw?fc_+(FQc{BY!iioYzgQE&K|EKT)`O6UGkrx<0A{VcbQ!pX-Pe#y;3eFqkCt#rQ1^KIy6O(sv;bhnD zi;N1dLC})Ci=aZ|EArEkWBh4*DtpK=8?V;C+J36grG^oLEOHA$eT_ThW8@6Bz21Kg zf`;3LEgzA;8$lEDA#$b~56I7}a+>|Wpu!kIk;W79ow%Wle2Sc0_U8Gkb3O|Fb)o+J6Cy&8L!M&1tMMWE)yNr<=RShQT!2r> zZ$MB$zQp)Y;}Q9{k>e*+C=rxuJSWc)RFJQbQ)*nit(nTr`TvIqGG$@CEsfXWM5OT^ z`JKq=lXs9~x4fEvRd8DcA^sadL-HPiJdKaZ#gpU%Ov&v!r(S=vT@@-1$@f4|MDF5- zVvVQddm|^WyjlP16VOA@k{Xnkb z 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≦uGelHqqYDr!q7KLiEsnwMKbA1sk|E+k54r%L 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

HwS=

`?!uW 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 diff --git a/requirements_openpilot.txt b/requirements_openpilot.txt index 880073ee7..a36aa048e 100644 --- a/requirements_openpilot.txt +++ b/requirements_openpilot.txt @@ -4,6 +4,7 @@ Cython==0.27.3 Flask==1.0.2 #PyGObject==3.28.2 This is installed on the EON, but requires a ton of dependencies to install +PyJWT==1.4.1 PyYAML==3.12 appdirs==1.4.0 atomicwrites==1.1.5 diff --git a/selfdrive/boardd/Makefile b/selfdrive/boardd/Makefile index 7dfbb225c..7bd22add3 100644 --- a/selfdrive/boardd/Makefile +++ b/selfdrive/boardd/Makefile @@ -64,7 +64,7 @@ boardd: $(OBJS) boardd.o: boardd.cc @echo "[ CXX ] $@" - $(CXX) $(CXXFLAGS) \ + $(CXX) $(CXXFLAGS) -MMD \ -I$(PHONELIBS)/android_system_core/include \ $(CEREAL_CFLAGS) \ $(CEREAL_CXXFLAGS) \ diff --git a/selfdrive/boardd/boardd.cc b/selfdrive/boardd/boardd.cc index 3b293307a..3ee867083 100644 --- a/selfdrive/boardd/boardd.cc +++ b/selfdrive/boardd/boardd.cc @@ -21,6 +21,7 @@ #include "cereal/gen/cpp/log.capnp.h" #include "cereal/gen/cpp/car.capnp.h" +#include "common/messaging.h" #include "common/params.h" #include "common/swaglog.h" #include "common/timing.h" @@ -34,7 +35,6 @@ #define SAFETY_NOOUTPUT 0 #define SAFETY_HONDA 1 #define SAFETY_TOYOTA 2 -#define SAFETY_ELM327 0xE327 #define SAFETY_GM 3 #define SAFETY_HONDA_BOSCH 4 #define SAFETY_FORD 5 @@ -46,7 +46,7 @@ #define SAFETY_TOYOTA_IPAS 0x1335 #define SAFETY_TOYOTA_NOLIMITS 0x1336 #define SAFETY_ALLOUTPUT 0x1337 -#define SAFETY_ELM327 0xE327 +#define SAFETY_ELM327 0xE327 // diagnostic only namespace { @@ -138,6 +138,9 @@ void *safety_setter_thread(void *s) { // set in the mutex to avoid race safety_setter_thread_handle = -1; + // set if long_control is allowed by openpilot. Hardcoded to True for now + libusb_control_transfer(dev_handle, 0x40, 0xdf, 1, 0, NULL, 0, TIMEOUT); + libusb_control_transfer(dev_handle, 0x40, 0xdc, safety_setting, safety_param, NULL, 0, TIMEOUT); pthread_mutex_unlock(&usb_lock); @@ -173,12 +176,8 @@ bool usb_connect() { LOGW("not enabling charging on x86_64"); #endif - // no output is the default - if (getenv("RECVMOCK")) { - libusb_control_transfer(dev_handle, 0x40, 0xdc, SAFETY_ELM327, 0, NULL, 0, TIMEOUT); - } else { - libusb_control_transfer(dev_handle, 0x40, 0xdc, SAFETY_NOOUTPUT, 0, NULL, 0, TIMEOUT); - } + // diagnostic only is the default, needed for VIN query + libusb_control_transfer(dev_handle, 0x40, 0xdc, SAFETY_ELM327, 0, NULL, 0, TIMEOUT); if (safety_setter_thread_handle == -1) { err = pthread_create(&safety_setter_thread_handle, NULL, safety_setter_thread, NULL); @@ -223,6 +222,8 @@ void can_recv(void *s) { int recv; uint32_t f1, f2; + uint64_t start_time = nanos_since_boot(); + // do recv pthread_mutex_lock(&usb_lock); @@ -245,12 +246,13 @@ void can_recv(void *s) { // create message capnp::MallocMessageBuilder msg; cereal::Event::Builder event = msg.initRoot(); - event.setLogMonoTime(nanos_since_boot()); + event.setLogMonoTime(start_time); + size_t num_msg = recv / 0x10; - auto canData = event.initCan(recv/0x10); + auto canData = event.initCan(num_msg); // populate message - for (int i = 0; i<(recv/0x10); i++) { + for (int i = 0; i < num_msg; i++) { if (data[i*4] & 4) { // extended canData[i].setAddress(data[i*4] >> 3); @@ -380,59 +382,14 @@ void can_send(void *s) { free(send); } - // **** threads **** -void *thermal_thread(void *crap) { - int err; - LOGD("start thermal thread"); - - // thermal = 8005 - void *context = zmq_ctx_new(); - void *subscriber = zmq_socket(context, ZMQ_SUB); - zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", 0); - zmq_connect(subscriber, "tcp://127.0.0.1:8005"); - - // run as fast as messages come in - while (!do_exit) { - // recv from thermal - zmq_msg_t msg; - zmq_msg_init(&msg); - err = zmq_msg_recv(&msg, subscriber, 0); - assert(err >= 0); - - // format for board, make copy due to alignment issues, will be freed on out of scope - // copied from send thread... - auto amsg = kj::heapArray((zmq_msg_size(&msg) / sizeof(capnp::word)) + 1); - memcpy(amsg.begin(), zmq_msg_data(&msg), zmq_msg_size(&msg)); - - capnp::FlatArrayMessageReader cmsg(amsg); - cereal::Event::Reader event = cmsg.getRoot(); - - uint16_t target_fan_speed = event.getThermal().getFanSpeed(); - //LOGW("setting fan speed %d", target_fan_speed); - - pthread_mutex_lock(&usb_lock); - libusb_control_transfer(dev_handle, 0xc0, 0xd3, target_fan_speed, 0, NULL, 0, TIMEOUT); - pthread_mutex_unlock(&usb_lock); - - zmq_msg_close(&msg); - } - - // turn the fan off when we exit - libusb_control_transfer(dev_handle, 0xc0, 0xd3, 0, 0, NULL, 0, TIMEOUT); - - return NULL; -} - void *can_send_thread(void *crap) { LOGD("start send thread"); // sendcan = 8017 void *context = zmq_ctx_new(); - void *subscriber = zmq_socket(context, ZMQ_SUB); - zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", 0); - zmq_connect(subscriber, "tcp://127.0.0.1:8017"); + void *subscriber = sub_sock(context, "tcp://127.0.0.1:8017"); // drain sendcan to delete any stale messages from previous runs zmq_msg_t msg; @@ -457,11 +414,24 @@ void *can_recv_thread(void *crap) { void *publisher = zmq_socket(context, ZMQ_PUB); zmq_bind(publisher, "tcp://*:8006"); - // run at ~200hz + // run at 100hz + const uint64_t dt = 10000000ULL; + uint64_t next_frame_time = nanos_since_boot() + dt; + while (!do_exit) { can_recv(publisher); - // 5ms - usleep(5*1000); + + uint64_t cur_time = nanos_since_boot(); + int64_t remaining = next_frame_time - cur_time; + if (remaining > 0){ + useconds_t sleep = remaining / 1000; + usleep(sleep); + } else { + LOGW("missed cycle"); + next_frame_time = cur_time; + } + + next_frame_time += dt; } return NULL; } @@ -686,16 +656,8 @@ int main() { can_recv_thread, NULL); assert(err == 0); - pthread_t thermal_thread_handle; - err = pthread_create(&thermal_thread_handle, NULL, - thermal_thread, NULL); - assert(err == 0); - // join threads - err = pthread_join(thermal_thread_handle, NULL); - assert(err == 0); - err = pthread_join(can_recv_thread_handle, NULL); assert(err == 0); diff --git a/selfdrive/can/libdbc_py.py b/selfdrive/can/libdbc_py.py index cf712cf63..61cf8cd05 100644 --- a/selfdrive/can/libdbc_py.py +++ b/selfdrive/can/libdbc_py.py @@ -78,9 +78,9 @@ typedef struct { void* can_init(int bus, const char* dbc_name, size_t num_message_options, const MessageParseOptions* message_options, size_t num_signal_options, const SignalParseOptions* signal_options, bool sendcan, - const char* tcp_addr); + const char* tcp_addr, int timeout); -void can_update(void* can, uint64_t sec, bool wait); +int can_update(void* can, uint64_t sec, bool wait); size_t can_query(void* can, uint64_t sec, bool *out_can_valid, size_t out_values_size, SignalValue* out_values); diff --git a/selfdrive/can/parser.cc b/selfdrive/can/parser.cc index b6845b47d..eb828cd8e 100644 --- a/selfdrive/can/parser.cc +++ b/selfdrive/can/parser.cc @@ -190,12 +190,13 @@ class CANParser { CANParser(int abus, const std::string& dbc_name, const std::vector &options, const std::vector &sigoptions, - bool sendcan, const std::string& tcp_addr) + bool sendcan, const std::string& tcp_addr, int timeout=-1) : bus(abus) { // connect to can on 8006 context = zmq_ctx_new(); subscriber = zmq_socket(context, ZMQ_SUB); zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", 0); + zmq_setsockopt(subscriber, ZMQ_RCVTIMEO, &timeout, sizeof(int)); std::string tcp_addr_str; @@ -325,8 +326,9 @@ class CANParser { } } - void update(uint64_t sec, bool wait) { + int update(uint64_t sec, bool wait) { int err; + int result = 0; // recv from can zmq_msg_t msg; @@ -338,6 +340,11 @@ class CANParser { if (first) { err = zmq_msg_recv(&msg, subscriber, 0); first = false; + + // When we timeout on the first message, return error + if (err < 0){ + result = -1; + } } else { err = zmq_msg_recv(&msg, subscriber, ZMQ_DONTWAIT); } @@ -352,13 +359,12 @@ class CANParser { cereal::Event::Reader event = cmsg.getRoot(); auto cans = event.getCan(); - UpdateCans(sec, cans); } UpdateValid(sec); - zmq_msg_close(&msg); + return result; } std::vector query(uint64_t sec) { @@ -401,18 +407,18 @@ extern "C" { void* can_init(int bus, const char* dbc_name, size_t num_message_options, const MessageParseOptions* message_options, size_t num_signal_options, const SignalParseOptions* signal_options, - bool sendcan, const char* tcp_addr) { + bool sendcan, const char* tcp_addr, int timeout) { CANParser* ret = new CANParser(bus, std::string(dbc_name), (message_options ? std::vector(message_options, message_options+num_message_options) : std::vector{}), (signal_options ? std::vector(signal_options, signal_options+num_signal_options) - : std::vector{}), sendcan, std::string(tcp_addr)); + : std::vector{}), sendcan, std::string(tcp_addr), timeout); return (void*)ret; } -void can_update(void* can, uint64_t sec, bool wait) { +int can_update(void* can, uint64_t sec, bool wait) { CANParser* cp = (CANParser*)can; - cp->update(sec, wait); + return cp->update(sec, wait); } size_t can_query(void* can, uint64_t sec, bool *out_can_valid, size_t out_values_size, SignalValue* out_values) { diff --git a/selfdrive/can/parser.py b/selfdrive/can/parser.py index 2e8384f63..31af2df04 100644 --- a/selfdrive/can/parser.py +++ b/selfdrive/can/parser.py @@ -6,7 +6,7 @@ from selfdrive.can.libdbc_py import libdbc, ffi class CANParser(object): - def __init__(self, dbc_name, signals, checks=None, bus=0, sendcan=False, tcp_addr="127.0.0.1"): + def __init__(self, dbc_name, signals, checks=None, bus=0, sendcan=False, tcp_addr="127.0.0.1", timeout=-1): if checks is None: checks = [] @@ -61,7 +61,7 @@ class CANParser(object): } for msg_address, freq in message_options.items()]) self.can = libdbc.can_init(bus, dbc_name, len(message_options_c), message_options_c, - len(signal_options_c), signal_options_c, sendcan, tcp_addr) + len(signal_options_c), signal_options_c, sendcan, tcp_addr, timeout) self.p_can_valid = ffi.new("bool*") @@ -94,8 +94,10 @@ class CANParser(object): return ret def update(self, sec, wait): - libdbc.can_update(self.can, sec, wait) - return self.update_vl(sec) + """Returns if the update was successfull (e.g. no rcv timeout happened)""" + r = libdbc.can_update(self.can, sec, wait) + return bool(r >= 0), self.update_vl(sec) + class CANDefine(object): def __init__(self, dbc_name): diff --git a/selfdrive/can/tests/test_packer_honda.py b/selfdrive/can/tests/test_packer_honda.py index 58b841f5a..87d62244e 100644 --- a/selfdrive/can/tests/test_packer_honda.py +++ b/selfdrive/can/tests/test_packer_honda.py @@ -41,8 +41,9 @@ class TestPackerMethods(unittest.TestCase): random.randint(0, 65536), random.randint(0, 65536), random.randint(0, 65536)) car_fingerprint = HONDA_BOSCH[0] idx = random.randint(0, 65536) - m_old = hondacan.create_ui_commands(self.honda_cp_old, pcm_speed, hud, car_fingerprint, idx) - m = hondacan.create_ui_commands(self.honda_cp, pcm_speed, hud, car_fingerprint, idx) + is_metric = (random.randint(0, 2) % 2 == 0) + m_old = hondacan.create_ui_commands(self.honda_cp_old, pcm_speed, hud, car_fingerprint, is_metric, idx) + m = hondacan.create_ui_commands(self.honda_cp, pcm_speed, hud, car_fingerprint, is_metric, idx) self.assertEqual(m_old, m) button_val = random.randint(0, 65536) diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index 58cde11bd..ef807abb6 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -1,20 +1,34 @@ import os import time +from common.vin import is_vin_response_valid from common.basedir import BASEDIR from common.realtime import sec_since_boot from common.fingerprints import eliminate_incompatible_cars, all_known_cars +from selfdrive.boardd.boardd import can_list_to_can_capnp from selfdrive.swaglog import cloudlog import selfdrive.messaging as messaging -def load_interfaces(x): + +def get_startup_alert(car_recognized, controller_available): + alert = 'startup' + if not car_recognized: + alert = 'startupNoCar' + elif car_recognized and not controller_available: + alert = 'startupNoControl' + return alert + + +def load_interfaces(brand_names): ret = {} - for interface in x: - try: - imp = __import__('selfdrive.car.%s.interface' % interface, fromlist=['CarInterface']).CarInterface - except ImportError: - imp = None - for car in x[interface]: - ret[car] = imp + for brand_name in brand_names: + path = ('selfdrive.car.%s' % brand_name) + CarInterface = __import__(path + '.interface', fromlist=['CarInterface']).CarInterface + if os.path.exists(BASEDIR + '/' + path.replace('.', '/') + '/carcontroller.py'): + CarController = __import__(path + '.carcontroller', fromlist=['CarController']).CarController + else: + CarController = None + for model_name in brand_names[brand_name]: + ret[model_name] = (CarInterface, CarController) return ret @@ -22,17 +36,17 @@ def _get_interface_names(): # read all the folders in selfdrive/car and return a dict where: # - keys are all the car names that which we have an interface for # - values are lists of spefic car models for a given car - interface_names = {} + brand_names = {} for car_folder in [x[0] for x in os.walk(BASEDIR + '/selfdrive/car')]: try: - car_name = car_folder.split('/')[-1] - model_names = __import__('selfdrive.car.%s.values' % car_name, fromlist=['CAR']).CAR + brand_name = car_folder.split('/')[-1] + model_names = __import__('selfdrive.car.%s.values' % brand_name, fromlist=['CAR']).CAR model_names = [getattr(model_names, c) for c in model_names.__dict__.keys() if not c.startswith("__")] - interface_names[car_name] = model_names + brand_names[brand_name] = model_names except (ImportError, IOError): pass - return interface_names + return brand_names # imports from directory selfdrive/car// @@ -41,68 +55,96 @@ interfaces = load_interfaces(_get_interface_names()) # BOUNTY: every added fingerprint in selfdrive/car/*/values.py is a $100 coupon code on shop.comma.ai # **** for use live only **** -def fingerprint(logcan, timeout): +def fingerprint(logcan, sendcan): if os.getenv("SIMULATOR2") is not None: - return ("simulator2", None) + return ("simulator2", None, "") elif os.getenv("SIMULATOR") is not None: - return ("simulator", None) + return ("simulator", None, "") + finger = {} cloudlog.warning("waiting for fingerprint...") candidate_cars = all_known_cars() - finger = {} - st = None - st_passive = sec_since_boot() # only relevant when passive + can_seen_ts = None can_seen = False + + # works on standard 11-bit addresses for diagnostic. Tested on Toyota and Subaru; + # Honda uses the extended 29-bit addresses, and unfortunately only works from OBDII + vin_query_msg = [[0x7df, 0, '\x02\x09\x02'.ljust(8, "\x00"), 0], + [0x7e0, 0, '\x30'.ljust(8, "\x00"), 0]] + + vin_cnts = [1, 2] # number of messages to wait for at each iteration + vin_step = 0 + vin_cnt = 0 + vin_responded = False + vin_never_responded = True + vin_dat = [] + vin = "" + while 1: for a in messaging.drain_sock(logcan): for can in a.can: can_seen = True + + # have we got a VIN query response? + if can.src == 0 and can.address == 0x7e8: + vin_never_responded = False + # basic sanity checks on ISO-TP response + if is_vin_response_valid(can.dat, vin_step, vin_cnt): + vin_dat += can.dat[2:] if vin_step == 0 else can.dat[1:] + vin_cnt += 1 + if vin_cnt == vin_cnts[vin_step]: + vin_responded = True + vin_step += 1 + # ignore everything not on bus 0 and with more than 11 bits, - # which are ussually sporadic and hard to include in fingerprints - if can.src == 0 and can.address < 0x800: + # which are ussually sporadic and hard to include in fingerprints. + # also exclude VIN query response on 0x7e8 + if can.src == 0 and can.address < 0x800 and can.address != 0x7e8: finger[can.address] = len(can.dat) candidate_cars = eliminate_incompatible_cars(can, candidate_cars) - if st is None and can_seen: - st = sec_since_boot() # start time + if can_seen_ts is None and can_seen: + can_seen_ts = sec_since_boot() # start time ts = sec_since_boot() # if we only have one car choice and the time_fingerprint since we got our first # message has elapsed, exit. Toyota needs higher time_fingerprint, since DSU does not # broadcast immediately - if len(candidate_cars) == 1 and st is not None: - # TODO: better way to decide to wait more if Toyota + if len(candidate_cars) == 1 and can_seen_ts is not None: time_fingerprint = 1.0 if ("TOYOTA" in candidate_cars[0] or "LEXUS" in candidate_cars[0]) else 0.1 - if (ts-st) > time_fingerprint: + if (ts - can_seen_ts) > time_fingerprint: break - # bail if no cars left or we've been waiting too long - elif len(candidate_cars) == 0 or (timeout and (ts - st_passive) > timeout): - return None, finger + # bail if no cars left or we've been waiting for more than 2s since can_seen + elif len(candidate_cars) == 0 or (can_seen_ts is not None and (ts - can_seen_ts) > 2.): + return None, finger, "" + + # keep sending VIN qury if ECU isn't responsing. + # sendcan is probably not ready due to the zmq slow joiner syndrome + if can_seen and (vin_never_responded or (vin_responded and vin_step < len(vin_cnts))): + sendcan.send(can_list_to_can_capnp([vin_query_msg[vin_step]], msgtype='sendcan')) + vin_responded = False + vin_cnt = 0 time.sleep(0.01) + # only report vin if procedure is finished + if vin_step == len(vin_cnts) and vin_cnt == vin_cnts[-1]: + vin = "".join(vin_dat[3:]) + cloudlog.warning("fingerprinted %s", candidate_cars[0]) - return (candidate_cars[0], finger) + cloudlog.warning("VIN %s", vin) + return candidate_cars[0], finger, vin -def get_car(logcan, sendcan=None, passive=True): - # TODO: timeout only useful for replays so controlsd can start before unlogger - timeout = 2. if passive else None - candidate, fingerprints = fingerprint(logcan, timeout) +def get_car(logcan, sendcan): + + candidate, fingerprints, vin = fingerprint(logcan, sendcan) if candidate is None: cloudlog.warning("car doesn't match any fingerprints: %r", fingerprints) - if passive: - candidate = "mock" - else: - return None, None + candidate = "mock" - interface_cls = interfaces[candidate] + CarInterface, CarController = interfaces[candidate] + params = CarInterface.get_params(candidate, fingerprints, vin) - if interface_cls is None: - cloudlog.warning("car matched %s, but interface wasn't available or failed to import" % candidate) - return None, None - - params = interface_cls.get_params(candidate, fingerprints) - - return interface_cls(params, sendcan), params + return CarInterface(params, CarController), params diff --git a/selfdrive/car/chrysler/carcontroller.py b/selfdrive/car/chrysler/carcontroller.py index c6a1f9d29..eea51f8f6 100644 --- a/selfdrive/car/chrysler/carcontroller.py +++ b/selfdrive/car/chrysler/carcontroller.py @@ -1,5 +1,4 @@ from cereal import car -from selfdrive.boardd.boardd import can_list_to_can_capnp from selfdrive.car import apply_toyota_steer_torque_limits from selfdrive.car.chrysler.chryslercan import create_lkas_hud, create_lkas_command, \ create_wheel_buttons, \ @@ -38,12 +37,11 @@ class CarController(object): self.packer = CANPacker(dbc_name) - def update(self, sendcan, enabled, CS, frame, actuators, - pcm_cancel_cmd, hud_alert, audible_alert): + def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, hud_alert, audible_alert): # this seems needed to avoid steering faults and to force the sync with the EPS counter frame = CS.lkas_counter if self.prev_frame == frame: - return + return [] # *** compute control surfaces *** # steer torque @@ -97,4 +95,5 @@ class CarController(object): self.ccframe += 1 self.prev_frame = frame - sendcan.send(can_list_to_can_capnp(can_sends, msgtype='sendcan')) + + return can_sends diff --git a/selfdrive/car/chrysler/carstate.py b/selfdrive/car/chrysler/carstate.py index 94effcf93..7f4ad675d 100644 --- a/selfdrive/car/chrysler/carstate.py +++ b/selfdrive/car/chrysler/carstate.py @@ -60,7 +60,7 @@ def get_can_parser(CP): ("ACC_2", 50), ] - return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0) + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0, timeout=100) def get_camera_parser(CP): signals = [ @@ -72,7 +72,7 @@ def get_camera_parser(CP): ] checks = [] - return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2) + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2, timeout=100) class CarState(object): diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index 2c3d7455a..cef9698fd 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -7,14 +7,9 @@ from selfdrive.controls.lib.vehicle_model import VehicleModel from selfdrive.car.chrysler.carstate import CarState, get_can_parser, get_camera_parser from selfdrive.car.chrysler.values import ECU, check_ecu_msgs, CAR -try: - from selfdrive.car.chrysler.carcontroller import CarController -except ImportError: - CarController = None - class CarInterface(object): - def __init__(self, CP, sendcan=None): + def __init__(self, CP, CarController): self.CP = CP self.VM = VehicleModel(CP) @@ -30,9 +25,8 @@ class CarInterface(object): self.cp = get_can_parser(CP) self.cp_cam = get_camera_parser(CP) - # sending if read only is False - if sendcan is not None: - self.sendcan = sendcan + self.CC = None + if CarController is not None: self.CC = CarController(self.cp.dbc_name, CP.carFingerprint, CP.enableCamera) @staticmethod @@ -44,7 +38,7 @@ class CarInterface(object): return 1.0 @staticmethod - def get_params(candidate, fingerprint): + def get_params(candidate, fingerprint, vin=""): # kg of standard extra cargo to count for drive, gas, etc... std_cargo = 136 @@ -53,6 +47,7 @@ class CarInterface(object): ret.carName = "chrysler" ret.carFingerprint = candidate + ret.carVin = vin ret.safetyModel = car.CarParams.SafetyModels.chrysler @@ -140,8 +135,10 @@ class CarInterface(object): def update(self, c): # ******************* do can recv ******************* canMonoTimes = [] - self.cp.update(int(sec_since_boot() * 1e9), False) - self.cp_cam.update(int(sec_since_boot() * 1e9), False) + can_valid, _ = self.cp.update(int(sec_since_boot() * 1e9), True) + cam_valid, _ = self.cp_cam.update(int(sec_since_boot() * 1e9), False) + can_rcv_error = not can_valid or not cam_valid + self.CS.update(self.cp, self.cp_cam) # create message @@ -217,10 +214,12 @@ class CarInterface(object): events = [] if not self.CS.can_valid: self.can_invalid_count += 1 - if self.can_invalid_count >= 5: - events.append(create_event('commIssue', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) else: self.can_invalid_count = 0 + + if can_rcv_error or self.can_invalid_count >= 5: + events.append(create_event('commIssue', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) + if not (ret.gearShifter in ('drive', 'low')): events.append(create_event('wrongGear', [ET.NO_ENTRY, ET.SOFT_DISABLE])) if ret.doorOpen: @@ -263,11 +262,11 @@ class CarInterface(object): def apply(self, c): if (self.CS.frame == -1): - return False # if we haven't seen a frame 220, then do not update. + return [] # if we haven't seen a frame 220, then do not update. self.frame = self.CS.frame - self.CC.update(self.sendcan, c.enabled, self.CS, self.frame, - c.actuators, c.cruiseControl.cancel, c.hudControl.visualAlert, - c.hudControl.audibleAlert) + can_sends = self.CC.update(c.enabled, self.CS, self.frame, + c.actuators, c.cruiseControl.cancel, c.hudControl.visualAlert, + c.hudControl.audibleAlert) - return False + return can_sends diff --git a/selfdrive/car/chrysler/radar_interface.py b/selfdrive/car/chrysler/radar_interface.py index 54bd1b314..e5359fad8 100755 --- a/selfdrive/car/chrysler/radar_interface.py +++ b/selfdrive/car/chrysler/radar_interface.py @@ -13,7 +13,7 @@ RADAR_MSGS_D = range(0x2a2, 0x2b4+2, 2) # d_ messages LAST_MSG = max(RADAR_MSGS_C + RADAR_MSGS_D) NUMBER_MSGS = len(RADAR_MSGS_C) + len(RADAR_MSGS_D) -def _create_radard_can_parser(): +def _create_radar_can_parser(): dbc_f = 'chrysler_pacifica_2017_hybrid_private_fusion.dbc' msg_n = len(RADAR_MSGS_C) # list of [(signal name, message name or number, initial values), (...)] @@ -54,7 +54,7 @@ class RadarInterface(object): def __init__(self, CP): self.pts = {} self.delay = 0.0 # Delay of radar #TUNE - self.rcp = _create_radard_can_parser() + self.rcp = _create_radar_can_parser() context = zmq.Context() self.logcan = messaging.sub_sock(context, service_list['can'].port) @@ -65,11 +65,12 @@ class RadarInterface(object): while 1: tm = int(sec_since_boot() * 1e9) - updated_messages.update(self.rcp.update(tm, True)) + _, vls = self.rcp.update(tm, True) + updated_messages.update(vls) if LAST_MSG in updated_messages: break - ret = car.RadarState.new_message() + ret = car.RadarData.new_message() errors = [] if not self.rcp.can_valid: errors.append("commIssue") @@ -81,7 +82,7 @@ class RadarInterface(object): trackId = _address_to_track(ii) if trackId not in self.pts: - self.pts[trackId] = car.RadarState.RadarPoint.new_message() + self.pts[trackId] = car.RadarData.RadarPoint.new_message() self.pts[trackId].trackId = trackId self.pts[trackId].aRel = float('nan') self.pts[trackId].yvRel = float('nan') diff --git a/selfdrive/car/ford/carstate.py b/selfdrive/car/ford/carstate.py index 2c7a27eb3..2e26eb7c6 100644 --- a/selfdrive/car/ford/carstate.py +++ b/selfdrive/car/ford/carstate.py @@ -29,7 +29,7 @@ def get_can_parser(CP): checks = [ ] - return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0) + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0, timeout=100) class CarState(object): diff --git a/selfdrive/car/ford/interface.py b/selfdrive/car/ford/interface.py index a46681eb4..439e561a4 100755 --- a/selfdrive/car/ford/interface.py +++ b/selfdrive/car/ford/interface.py @@ -8,14 +8,9 @@ from selfdrive.controls.lib.vehicle_model import VehicleModel from selfdrive.car.ford.carstate import CarState, get_can_parser from selfdrive.car.ford.values import MAX_ANGLE -try: - from selfdrive.car.ford.carcontroller import CarController -except ImportError: - CarController = None - class CarInterface(object): - def __init__(self, CP, sendcan=None): + def __init__(self, CP, CarController): self.CP = CP self.VM = VehicleModel(CP) @@ -30,9 +25,8 @@ class CarInterface(object): self.cp = get_can_parser(CP) - # sending if read only is False - if sendcan is not None: - self.sendcan = sendcan + self.CC = None + if CarController is not None: self.CC = CarController(self.cp.dbc_name, CP.enableCamera, self.VM) @staticmethod @@ -44,7 +38,7 @@ class CarInterface(object): return 1.0 @staticmethod - def get_params(candidate, fingerprint): + def get_params(candidate, fingerprint, vin=""): # kg of standard extra cargo to count for drive, gas, etc... std_cargo = 136 @@ -53,6 +47,7 @@ class CarInterface(object): ret.carName = "ford" ret.carFingerprint = candidate + ret.carVin = vin ret.safetyModel = car.CarParams.SafetyModels.ford @@ -138,7 +133,8 @@ class CarInterface(object): # ******************* do can recv ******************* canMonoTimes = [] - self.cp.update(int(sec_since_boot() * 1e9), False) + can_valid, _ = self.cp.update(int(sec_since_boot() * 1e9), True) + can_rcv_error = not can_valid self.CS.update(self.cp) @@ -174,11 +170,12 @@ class CarInterface(object): events = [] if not self.CS.can_valid: self.can_invalid_count += 1 - if self.can_invalid_count >= 5: - events.append(create_event('commIssue', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) else: self.can_invalid_count = 0 + if can_rcv_error or self.can_invalid_count >= 5: + events.append(create_event('commIssue', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) + if self.CS.steer_error: events.append(create_event('steerUnavailable', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE, ET.PERMANENT])) @@ -212,8 +209,8 @@ class CarInterface(object): # to be called @ 100hz def apply(self, c): - self.CC.update(self.sendcan, c.enabled, self.CS, self.frame, c.actuators, - c.hudControl.visualAlert, c.cruiseControl.cancel) + can_sends = self.CC.update(c.enabled, self.CS, self.frame, c.actuators, + c.hudControl.visualAlert, c.cruiseControl.cancel) self.frame += 1 - return False + return can_sends diff --git a/selfdrive/car/ford/radar_interface.py b/selfdrive/car/ford/radar_interface.py index c42bc3e8f..a49ad413c 100755 --- a/selfdrive/car/ford/radar_interface.py +++ b/selfdrive/car/ford/radar_interface.py @@ -11,7 +11,7 @@ import selfdrive.messaging as messaging RADAR_MSGS = range(0x500, 0x540) -def _create_radard_can_parser(): +def _create_radar_can_parser(): dbc_f = 'ford_fusion_2018_adas.dbc' msg_n = len(RADAR_MSGS) signals = list(zip(['X_Rel'] * msg_n + ['Angle'] * msg_n + ['V_Rel'] * msg_n, @@ -31,7 +31,7 @@ class RadarInterface(object): self.delay = 0.0 # Delay of radar # Nidec - self.rcp = _create_radard_can_parser() + self.rcp = _create_radar_can_parser() context = zmq.Context() self.logcan = messaging.sub_sock(context, service_list['can'].port) @@ -42,12 +42,14 @@ class RadarInterface(object): updated_messages = set() while 1: tm = int(sec_since_boot() * 1e9) - updated_messages.update(self.rcp.update(tm, True)) + _, vls = self.rcp.update(tm, True) + updated_messages.update(vls) + # TODO: do not hardcode last msg if 0x53f in updated_messages: break - ret = car.RadarState.new_message() + ret = car.RadarData.new_message() errors = [] if not self.rcp.can_valid: errors.append("commIssue") @@ -69,7 +71,7 @@ class RadarInterface(object): # radar point only valid if there have been enough valid measurements if self.validCnt[ii] > 0: if ii not in self.pts: - self.pts[ii] = car.RadarState.RadarPoint.new_message() + self.pts[ii] = car.RadarData.RadarPoint.new_message() self.pts[ii].trackId = self.track_id self.track_id += 1 self.pts[ii].dRel = cpt['X_Rel'] # from front of car diff --git a/selfdrive/car/gm/carcontroller.py b/selfdrive/car/gm/carcontroller.py index 26cfd84d3..000f7dde6 100644 --- a/selfdrive/car/gm/carcontroller.py +++ b/selfdrive/car/gm/carcontroller.py @@ -1,12 +1,13 @@ +from cereal import car from common.numpy_fast import interp from common.realtime import sec_since_boot from selfdrive.config import Conversions as CV -from selfdrive.boardd.boardd import can_list_to_can_capnp from selfdrive.car import apply_std_steer_torque_limits from selfdrive.car.gm import gmcan from selfdrive.car.gm.values import DBC, SUPERCRUISE_CARS from selfdrive.can.packer import CANPacker +VisualAlert = car.CarControl.HUDControl.VisualAlert class CarControllerParams(): def __init__(self, car_fingerprint): @@ -59,16 +60,21 @@ def actuator_hystereses(final_pedal, pedal_steady): return final_pedal, pedal_steady +def process_hud_alert(hud_alert): + # initialize to no alert + steer = 0 + if hud_alert == VisualAlert.steerRequired: + steer = 1 + return steer class CarController(object): - def __init__(self, canbus, car_fingerprint, allow_controls): + def __init__(self, canbus, car_fingerprint): self.pedal_steady = 0. self.start_time = sec_since_boot() self.chime = 0 self.steer_idx = 0 self.apply_steer_last = 0 self.car_fingerprint = car_fingerprint - self.allow_controls = allow_controls self.lka_icon_status_last = (False, False) # Setup detection helper. Routes commands to @@ -79,13 +85,8 @@ class CarController(object): self.packer_pt = CANPacker(DBC[car_fingerprint]['pt']) self.packer_ch = CANPacker(DBC[car_fingerprint]['chassis']) - def update(self, sendcan, enabled, CS, frame, actuators, \ - hud_v_cruise, hud_show_lanes, hud_show_car, chime, chime_cnt): - """ Controls thread """ - - # Sanity check. - if not self.allow_controls: - return + def update(self, enabled, CS, frame, actuators, \ + hud_v_cruise, hud_show_lanes, hud_show_car, chime, chime_cnt, hud_alert): P = self.params @@ -93,6 +94,9 @@ class CarController(object): can_sends = [] canbus = self.canbus + alert_out = process_hud_alert(hud_alert) + steer = alert_out + ### STEER ### if (frame % P.STEER_STEP) == 0: @@ -175,7 +179,7 @@ class CarController(object): lka_icon_status = (lka_active, lka_critical) if frame % P.CAMERA_KEEPALIVE_STEP == 0 \ or lka_icon_status != self.lka_icon_status_last: - can_sends.append(gmcan.create_lka_icon_command(canbus.sw_gmlan, lka_active, lka_critical)) + can_sends.append(gmcan.create_lka_icon_command(canbus.sw_gmlan, lka_active, lka_critical, steer)) self.lka_icon_status_last = lka_icon_status # Send chimes @@ -195,4 +199,4 @@ class CarController(object): # issued for the same chime type and duration self.chime = chime - sendcan.send(can_list_to_can_capnp(can_sends, msgtype='sendcan')) + return can_sends diff --git a/selfdrive/car/gm/carstate.py b/selfdrive/car/gm/carstate.py index 7a18f320c..350274f2f 100644 --- a/selfdrive/car/gm/carstate.py +++ b/selfdrive/car/gm/carstate.py @@ -47,7 +47,8 @@ def get_powertrain_can_parser(CP, canbus): ("CruiseState", "AcceleratorPedal2", 0), ] - return CANParser(DBC[CP.carFingerprint]['pt'], signals, [], canbus.powertrain) + return CANParser(DBC[CP.carFingerprint]['pt'], signals, [], canbus.powertrain, timeout=100) + class CarState(object): def __init__(self, CP, canbus): diff --git a/selfdrive/car/gm/gmcan.py b/selfdrive/car/gm/gmcan.py index 910cb1d95..64fd84f4a 100644 --- a/selfdrive/car/gm/gmcan.py +++ b/selfdrive/car/gm/gmcan.py @@ -134,8 +134,13 @@ def create_chime_command(bus, chime_type, duration, repeat_cnt): dat = [chime_type, duration, repeat_cnt, 0xff, 0] return [0x10400060, 0, "".join(map(chr, dat)), bus] -def create_lka_icon_command(bus, active, critical): - if active: +def create_lka_icon_command(bus, active, critical, steer): + if active and steer == 1: + if critical: + dat = "\x50\xc0\x14" + else: + dat = "\x50\x40\x18" + elif active: if critical: dat = "\x40\xc0\x14" else: diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index a21b12d31..d8177ccef 100755 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -8,10 +8,6 @@ from selfdrive.car.gm.values import DBC, CAR, STOCK_CONTROL_MSGS, AUDIO_HUD, \ SUPERCRUISE_CARS, AccState from selfdrive.car.gm.carstate import CarState, CruiseButtons, get_powertrain_can_parser -try: - from selfdrive.car.gm.carcontroller import CarController -except ImportError: - CarController = None class CanBus(object): def __init__(self): @@ -21,7 +17,7 @@ class CanBus(object): self.sw_gmlan = 3 class CarInterface(object): - def __init__(self, CP, sendcan=None): + def __init__(self, CP, CarController): self.CP = CP self.frame = 0 @@ -37,10 +33,9 @@ class CarInterface(object): self.pt_cp = get_powertrain_can_parser(CP, canbus) self.ch_cp_dbc_name = DBC[CP.carFingerprint]['chassis'] - # sending if read only is False - if sendcan is not None: - self.sendcan = sendcan - self.CC = CarController(canbus, CP.carFingerprint, CP.enableCamera) + self.CC = None + if CarController is not None: + self.CC = CarController(canbus, CP.carFingerprint) @staticmethod def compute_gb(accel, speed): @@ -51,16 +46,17 @@ class CarInterface(object): return 1.0 @staticmethod - def get_params(candidate, fingerprint): + def get_params(candidate, fingerprint, vin=""): ret = car.CarParams.new_message() ret.carName = "gm" ret.carFingerprint = candidate + ret.carVin = vin ret.enableCruise = False # Presence of a camera on the object bus is ok. - # Have to go passive if ASCM is online (ACC-enabled cars), + # Have to go to read_only if ASCM is online (ACC-enabled cars), # or camera is on powertrain bus (LKA cars without ACC). ret.enableCamera = not any(x for x in STOCK_CONTROL_MSGS[candidate] if x in fingerprint) ret.openpilotLongitudinalControl = ret.enableCamera @@ -195,8 +191,8 @@ class CarInterface(object): # returns a car.CarState def update(self, c): - - self.pt_cp.update(int(sec_since_boot() * 1e9), False) + can_valid, _ = self.pt_cp.update(int(sec_since_boot() * 1e9), True) + can_rcv_error = not can_valid self.CS.update(self.pt_cp) # create message @@ -281,10 +277,12 @@ class CarInterface(object): events = [] if not self.CS.can_valid: self.can_invalid_count += 1 - if self.can_invalid_count >= 5: - events.append(create_event('commIssue', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) else: self.can_invalid_count = 0 + + if can_rcv_error or self.can_invalid_count >= 5: + events.append(create_event('commIssue', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) + if self.CS.steer_error: events.append(create_event('steerUnavailable', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE, ET.PERMANENT])) if self.CS.steer_not_allowed: @@ -358,10 +356,11 @@ class CarInterface(object): # In GM, PCM faults out if ACC command overlaps user gas. enabled = c.enabled and not self.CS.user_gas_pressed - self.CC.update(self.sendcan, enabled, self.CS, self.frame, \ - c.actuators, - hud_v_cruise, c.hudControl.lanesVisible, \ - c.hudControl.leadVisible, \ - chime, chime_count) + can_sends = self.CC.update(enabled, self.CS, self.frame, \ + c.actuators, + hud_v_cruise, c.hudControl.lanesVisible, \ + c.hudControl.leadVisible, \ + chime, chime_count, c.hudControl.visualAlert) self.frame += 1 + return can_sends diff --git a/selfdrive/car/gm/radar_interface.py b/selfdrive/car/gm/radar_interface.py index e299ca6fc..7a8d9c471 100755 --- a/selfdrive/car/gm/radar_interface.py +++ b/selfdrive/car/gm/radar_interface.py @@ -19,7 +19,7 @@ NUM_SLOTS = 20 # messages that are present in DBC LAST_RADAR_MSG = RADAR_HEADER_MSG + NUM_SLOTS -def create_radard_can_parser(canbus, car_fingerprint): +def create_radar_can_parser(canbus, car_fingerprint): dbc_f = DBC[car_fingerprint]['radar'] if car_fingerprint in (CAR.VOLT, CAR.MALIBU, CAR.HOLDEN_ASTRA, CAR.ACADIA, CAR.CADILLAC_ATS): @@ -53,14 +53,14 @@ class RadarInterface(object): canbus = CanBus() print "Using %d as obstacle CAN bus ID" % canbus.obstacle - self.rcp = create_radard_can_parser(canbus, CP.carFingerprint) + self.rcp = create_radar_can_parser(canbus, CP.carFingerprint) context = zmq.Context() self.logcan = messaging.sub_sock(context, service_list['can'].port) def update(self): updated_messages = set() - ret = car.RadarState.new_message() + ret = car.RadarData.new_message() while 1: if self.rcp is None: @@ -68,7 +68,8 @@ class RadarInterface(object): return ret tm = int(sec_since_boot() * 1e9) - updated_messages.update(self.rcp.update(tm, True)) + _, vls = self.rcp.update(tm, True) + updated_messages.update(vls) if LAST_RADAR_MSG in updated_messages: break @@ -101,7 +102,7 @@ class RadarInterface(object): targetId = cpt['TrkObjectID'] currentTargets.add(targetId) if targetId not in self.pts: - self.pts[targetId] = car.RadarState.RadarPoint.new_message() + self.pts[targetId] = car.RadarData.RadarPoint.new_message() self.pts[targetId].trackId = targetId distance = cpt['TrkRange'] self.pts[targetId].dRel = distance # from front of car diff --git a/selfdrive/car/honda/carcontroller.py b/selfdrive/car/honda/carcontroller.py index a164f399f..bf7d158fc 100644 --- a/selfdrive/car/honda/carcontroller.py +++ b/selfdrive/car/honda/carcontroller.py @@ -1,6 +1,5 @@ from collections import namedtuple from common.realtime import sec_since_boot -from selfdrive.boardd.boardd import can_list_to_can_capnp from selfdrive.controls.lib.drive_helpers import rate_limit from common.numpy_fast import clip from selfdrive.car import create_gas_command @@ -75,26 +74,20 @@ HUDData = namedtuple("HUDData", class CarController(object): - def __init__(self, dbc_name, enable_camera=True): + def __init__(self, dbc_name): self.braking = False self.brake_steady = 0. self.brake_last = 0. self.apply_brake_last = 0 self.last_pump_ts = 0 - self.enable_camera = enable_camera self.packer = CANPacker(dbc_name) self.new_radar_config = False - def update(self, sendcan, enabled, CS, frame, actuators, \ + def update(self, enabled, CS, frame, actuators, \ pcm_speed, pcm_override, pcm_cancel_cmd, pcm_accel, \ hud_v_cruise, hud_show_lanes, hud_show_car, \ hud_alert, snd_beep, snd_chime): - """ Controls thread """ - - if not self.enable_camera: - return - # *** apply brake hysteresis *** brake, self.braking, self.brake_steady = actuator_hystereses(actuators.brake, self.braking, self.brake_steady, CS.v_ego, CS.CP.carFingerprint) @@ -161,7 +154,7 @@ class CarController(object): # Send dashboard UI commands. if (frame % 10) == 0: idx = (frame//10) % 4 - can_sends.extend(hondacan.create_ui_commands(self.packer, pcm_speed, hud, CS.CP.carFingerprint, idx)) + can_sends.extend(hondacan.create_ui_commands(self.packer, pcm_speed, hud, CS.CP.carFingerprint, CS.is_metric, idx)) if CS.CP.radarOffCan: # If using stock ACC, spam cancel command to kill gas when OP disengages. @@ -184,4 +177,4 @@ class CarController(object): # This prevents unexpected pedal range rescaling can_sends.append(create_gas_command(self.packer, apply_gas, idx)) - sendcan.send(can_list_to_can_capnp(can_sends, msgtype='sendcan')) + return can_sends diff --git a/selfdrive/car/honda/carstate.py b/selfdrive/car/honda/carstate.py index 72bca7e3e..f3374da57 100644 --- a/selfdrive/car/honda/carstate.py +++ b/selfdrive/car/honda/carstate.py @@ -46,7 +46,6 @@ def get_can_signals(CP): ("BRAKE_SWITCH", "POWERTRAIN_DATA", 0), ("CRUISE_BUTTONS", "SCM_BUTTONS", 0), ("ESP_DISABLED", "VSA_STATUS", 1), - ("HUD_LEAD", "ACC_HUD", 0), ("USER_BRAKE", "VSA_STATUS", 0), ("BRAKE_HOLD_ACTIVE", "VSA_STATUS", 0), ("STEER_STATUS", "STEER_STATUS", 5), @@ -124,6 +123,7 @@ def get_can_signals(CP): if CP.carFingerprint == CAR.CIVIC: signals += [("CAR_GAS", "GAS_PEDAL_2", 0), ("MAIN_ON", "SCM_FEEDBACK", 0), + ("IMPERIAL_UNIT", "HUD_SETTING", 0), ("EPB_STATE", "EPB_STATUS", 0)] elif CP.carFingerprint == CAR.ACURA_ILX: signals += [("CAR_GAS", "GAS_PEDAL_2", 0), @@ -152,7 +152,8 @@ def get_can_signals(CP): def get_can_parser(CP): signals, checks = get_can_signals(CP) - return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0) + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0, timeout=100) + def get_cam_can_parser(CP): signals = [] @@ -164,7 +165,7 @@ def get_cam_can_parser(CP): cam_bus = 1 if CP.carFingerprint in HONDA_BOSCH else 2 - return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, cam_bus) + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, cam_bus, timeout=100) class CarState(object): def __init__(self, CP): @@ -332,14 +333,15 @@ class CarState(object): self.user_brake = cp.vl["VSA_STATUS"]['USER_BRAKE'] self.pcm_acc_status = cp.vl["POWERTRAIN_DATA"]['ACC_STATUS'] - self.hud_lead = cp.vl["ACC_HUD"]['HUD_LEAD'] # Gets rid of Pedal Grinding noise when brake is pressed at slow speeds for some models - # TODO: this should be ok for all cars. Verify it. if self.CP.carFingerprint in (CAR.PILOT, CAR.PILOT_2019, CAR.RIDGELINE): if self.user_brake > 0.05: self.brake_pressed = 1 + # TODO: discover the CAN msg that has the imperial unit bit for all other cars + self.is_metric = not cp.vl["HUD_SETTING"]['IMPERIAL_UNIT'] if self.CP.carFingerprint in (CAR.CIVIC) else False + # carstate standalone tester if __name__ == '__main__': import zmq diff --git a/selfdrive/car/honda/hondacan.py b/selfdrive/car/honda/hondacan.py index 8f369feca..3955bfdcd 100644 --- a/selfdrive/car/honda/hondacan.py +++ b/selfdrive/car/honda/hondacan.py @@ -51,7 +51,7 @@ def create_steering_control(packer, apply_steer, lkas_active, car_fingerprint, i return packer.make_can_msg("STEERING_CONTROL", bus, values, idx) -def create_ui_commands(packer, pcm_speed, hud, car_fingerprint, idx): +def create_ui_commands(packer, pcm_speed, hud, car_fingerprint, is_metric, idx): commands = [] bus = 0 @@ -65,9 +65,10 @@ def create_ui_commands(packer, pcm_speed, hud, car_fingerprint, idx): 'CRUISE_SPEED': hud.v_cruise, 'ENABLE_MINI_CAR': hud.mini_car, 'HUD_LEAD': hud.car, - 'SET_ME_X03': 0x01 if car_fingerprint == CAR.ODYSSEY_CHN else 0x03, - 'SET_ME_X03_2': 0x02 if car_fingerprint == CAR.ODYSSEY_CHN else 0x03, - 'SET_ME_X01': 0x01, + 'HUD_DISTANCE': 3, # max distance setting on display + 'IMPERIAL_UNIT': int(not is_metric), + 'SET_ME_X01_2': 1, + 'SET_ME_X01': 1, } commands.append(packer.make_can_msg("ACC_HUD", 0, acc_hud_values, idx)) diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index 8c3a2bd76..b9b302d50 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -12,11 +12,6 @@ from selfdrive.car.honda.carstate import CarState, get_can_parser, get_cam_can_p from selfdrive.car.honda.values import CruiseButtons, CAR, HONDA_BOSCH, AUDIO_HUD, VISUAL_HUD from selfdrive.controls.lib.planner import _A_CRUISE_MAX_V_FOLLOWING -try: - from selfdrive.car.honda.carcontroller import CarController -except ImportError: - CarController = None - # msgs sent for steering controller by camera module on can 0. # those messages are mutually exclusive on CRV and non-CRV cars @@ -80,7 +75,7 @@ def get_compute_gb_acura(): class CarInterface(object): - def __init__(self, CP, sendcan=None): + def __init__(self, CP, CarController): self.CP = CP self.frame = 0 @@ -98,10 +93,9 @@ class CarInterface(object): self.CS = CarState(CP) self.VM = VehicleModel(CP) - # sending if read only is False - if sendcan is not None: - self.sendcan = sendcan - self.CC = CarController(self.cp.dbc_name, CP.enableCamera) + self.CC = None + if CarController is not None: + self.CC = CarController(self.cp.dbc_name) if self.CS.CP.carFingerprint == CAR.ACURA_ILX: self.compute_gb = get_compute_gb_acura() @@ -141,11 +135,12 @@ class CarInterface(object): return float(max(max_accel, a_target / A_ACC_MAX)) * min(speedLimiter, accelLimiter) @staticmethod - def get_params(candidate, fingerprint): + def get_params(candidate, fingerprint, vin=""): ret = car.CarParams.new_message() ret.carName = "honda" ret.carFingerprint = candidate + ret.carVin = vin if candidate in HONDA_BOSCH: ret.safetyModel = car.CarParams.SafetyModels.hondaBosch @@ -391,9 +386,9 @@ class CarInterface(object): def update(self, c): # ******************* do can recv ******************* canMonoTimes = [] - - self.cp.update(int(sec_since_boot() * 1e9), False) - self.cp_cam.update(int(sec_since_boot() * 1e9), False) + can_valid, _ = self.cp.update(int(sec_since_boot() * 1e9), True) + cam_valid, _ = self.cp_cam.update(int(sec_since_boot() * 1e9), False) + can_rcv_error = not can_valid or not cam_valid self.CS.update(self.cp, self.cp_cam) @@ -503,11 +498,12 @@ class CarInterface(object): events = [] if not self.CS.can_valid: self.can_invalid_count += 1 - if self.can_invalid_count >= 5: - events.append(create_event('commIssue', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) else: self.can_invalid_count = 0 + if can_rcv_error or self.can_invalid_count >= 5: + events.append(create_event('commIssue', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) + if not self.CS.cam_can_valid and self.CP.enableCamera: self.cam_can_invalid_count += 1 # wait 1.0s before throwing the alert to avoid it popping when you turn off the car @@ -612,17 +608,18 @@ class CarInterface(object): pcm_accel = int(clip(c.cruiseControl.accelOverride, 0, 1) * 0xc6) - self.CC.update(self.sendcan, c.enabled, self.CS, self.frame, - c.actuators, - c.cruiseControl.speedOverride, - c.cruiseControl.override, - c.cruiseControl.cancel, - pcm_accel, - hud_v_cruise, - c.hudControl.lanesVisible, - hud_show_car=c.hudControl.leadVisible, - hud_alert=hud_alert, - snd_beep=snd_beep, - snd_chime=snd_chime) + can_sends = self.CC.update(c.enabled, self.CS, self.frame, + c.actuators, + c.cruiseControl.speedOverride, + c.cruiseControl.override, + c.cruiseControl.cancel, + pcm_accel, + hud_v_cruise, + c.hudControl.lanesVisible, + hud_show_car=c.hudControl.leadVisible, + hud_alert=hud_alert, + snd_beep=snd_beep, + snd_chime=snd_chime) self.frame += 1 + return can_sends diff --git a/selfdrive/car/honda/radar_interface.py b/selfdrive/car/honda/radar_interface.py index 9977e763a..6b5d69208 100755 --- a/selfdrive/car/honda/radar_interface.py +++ b/selfdrive/car/honda/radar_interface.py @@ -43,7 +43,7 @@ class RadarInterface(object): canMonoTimes = [] updated_messages = set() - ret = car.RadarState.new_message() + ret = car.RadarData.new_message() # in Bosch radar and we are only steering for now, so sleep 0.05s to keep # radard at 20Hz and return no points @@ -53,7 +53,8 @@ class RadarInterface(object): while 1: tm = int(sec_since_boot() * 1e9) - updated_messages.update(self.rcp.update(tm, True)) + _, vls = self.rcp.update(tm, True) + updated_messages.update(vls) if 0x445 in updated_messages: break @@ -65,7 +66,7 @@ class RadarInterface(object): self.radar_wrong_config = cpt['RADAR_STATE'] == 0x69 elif cpt['LONG_DIST'] < 255: if ii not in self.pts or cpt['NEW_TRACK']: - self.pts[ii] = car.RadarState.RadarPoint.new_message() + self.pts[ii] = car.RadarData.RadarPoint.new_message() self.pts[ii].trackId = self.track_id self.track_id += 1 self.pts[ii].dRel = cpt['LONG_DIST'] # from front of car diff --git a/selfdrive/car/hyundai/carcontroller.py b/selfdrive/car/hyundai/carcontroller.py index 82dbc0aed..a1a688ff5 100644 --- a/selfdrive/car/hyundai/carcontroller.py +++ b/selfdrive/car/hyundai/carcontroller.py @@ -1,5 +1,4 @@ from selfdrive.car import apply_std_steer_torque_limits -from selfdrive.boardd.boardd import can_list_to_can_capnp from selfdrive.car.hyundai.hyundaican import create_lkas11, create_lkas12, \ create_1191, create_1156, \ create_clu11 @@ -18,23 +17,19 @@ class SteerLimitParams: STEER_DRIVER_FACTOR = 1 class CarController(object): - def __init__(self, dbc_name, car_fingerprint, enable_camera): + def __init__(self, dbc_name, car_fingerprint): self.apply_steer_last = 0 self.car_fingerprint = car_fingerprint self.lkas11_cnt = 0 self.cnt = 0 self.last_resume_cnt = 0 - self.enable_camera = enable_camera # True when giraffe switch 2 is low and we need to replace all the camera messages # otherwise we forward the camera msgs and we just replace the lkas cmd signals self.camera_disconnected = False self.packer = CANPacker(dbc_name) - def update(self, sendcan, enabled, CS, actuators, pcm_cancel_cmd, hud_alert): - - if not self.enable_camera: - return + def update(self, enabled, CS, actuators, pcm_cancel_cmd, hud_alert): ### Steering Torque apply_steer = actuators.steer * SteerLimitParams.STEER_MAX @@ -70,7 +65,6 @@ class CarController(object): self.last_resume_cnt = self.cnt can_sends.append(create_clu11(self.packer, CS.clu11, Buttons.RES_ACCEL)) - ### Send messages to canbus - sendcan.send(can_list_to_can_capnp(can_sends, msgtype='sendcan')) - self.cnt += 1 + + return can_sends diff --git a/selfdrive/car/hyundai/carstate.py b/selfdrive/car/hyundai/carstate.py index 041360f4b..6e5db74e5 100644 --- a/selfdrive/car/hyundai/carstate.py +++ b/selfdrive/car/hyundai/carstate.py @@ -93,7 +93,8 @@ def get_can_parser(CP): ("SAS11", 100) ] - return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0) + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0, timeout=100) + def get_camera_parser(CP): @@ -118,7 +119,8 @@ def get_camera_parser(CP): checks = [] - return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2) + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2, timeout=100) + class CarState(object): def __init__(self, CP): diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py index cc5d95d06..75597bcb2 100644 --- a/selfdrive/car/hyundai/interface.py +++ b/selfdrive/car/hyundai/interface.py @@ -7,14 +7,9 @@ from selfdrive.controls.lib.vehicle_model import VehicleModel from selfdrive.car.hyundai.carstate import CarState, get_can_parser, get_camera_parser from selfdrive.car.hyundai.values import CAMERA_MSGS, CAR, get_hud_alerts, FEATURES -try: - from selfdrive.car.hyundai.carcontroller import CarController -except ImportError: - CarController = None - class CarInterface(object): - def __init__(self, CP, sendcan=None): + def __init__(self, CP, CarController): self.CP = CP self.VM = VehicleModel(CP) self.idx = 0 @@ -32,10 +27,9 @@ class CarInterface(object): self.cp = get_can_parser(CP) self.cp_cam = get_camera_parser(CP) - # sending if read only is False - if sendcan is not None: - self.sendcan = sendcan - self.CC = CarController(self.cp.dbc_name, CP.carFingerprint, CP.enableCamera) + self.CC = None + if CarController is not None: + self.CC = CarController(self.cp.dbc_name, CP.carFingerprint) @staticmethod def compute_gb(accel, speed): @@ -46,7 +40,7 @@ class CarInterface(object): return 1.0 @staticmethod - def get_params(candidate, fingerprint): + def get_params(candidate, fingerprint, vin=""): # kg of standard extra cargo to count for drive, gas, etc... std_cargo = 136 @@ -55,6 +49,7 @@ class CarInterface(object): ret.carName = "hyundai" ret.carFingerprint = candidate + ret.carVin = vin ret.radarOffCan = True ret.safetyModel = car.CarParams.SafetyModels.hyundai ret.enableCruise = True # stock acc @@ -179,8 +174,10 @@ class CarInterface(object): def update(self, c): # ******************* do can recv ******************* canMonoTimes = [] - self.cp.update(int(sec_since_boot() * 1e9), False) - self.cp_cam.update(int(sec_since_boot() * 1e9), False) + can_rcv_error = not self.cp.update(int(sec_since_boot() * 1e9), True) + cam_rcv_error = not self.cp_cam.update(int(sec_since_boot() * 1e9), False) + can_rcv_error = can_rcv_error or cam_rcv_error + self.CS.update(self.cp, self.cp_cam) # create message ret = car.CarState.new_message() @@ -261,10 +258,12 @@ class CarInterface(object): events = [] if not self.CS.can_valid: self.can_invalid_count += 1 - if self.can_invalid_count >= 5: - events.append(create_event('commIssue', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) else: self.can_invalid_count = 0 + + if can_rcv_error or self.can_invalid_count >= 5: + events.append(create_event('commIssue', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) + if not ret.gearShifter == 'drive': events.append(create_event('wrongGear', [ET.NO_ENTRY, ET.SOFT_DISABLE])) if ret.doorOpen: @@ -310,7 +309,7 @@ class CarInterface(object): hud_alert = get_hud_alerts(c.hudControl.visualAlert, c.hudControl.audibleAlert) - self.CC.update(self.sendcan, c.enabled, self.CS, c.actuators, - c.cruiseControl.cancel, hud_alert) + can_sends = self.CC.update(c.enabled, self.CS, c.actuators, + c.cruiseControl.cancel, hud_alert) - return False + return can_sends diff --git a/selfdrive/car/hyundai/radar_interface.py b/selfdrive/car/hyundai/radar_interface.py index 3e458df57..75256683d 100644 --- a/selfdrive/car/hyundai/radar_interface.py +++ b/selfdrive/car/hyundai/radar_interface.py @@ -11,7 +11,7 @@ class RadarInterface(object): def update(self): - ret = car.RadarState.new_message() + ret = car.RadarData.new_message() time.sleep(0.05) # radard runs on RI updates return ret diff --git a/selfdrive/car/mock/interface.py b/selfdrive/car/mock/interface.py index bf9b8a5e7..a14e4f0be 100755 --- a/selfdrive/car/mock/interface.py +++ b/selfdrive/car/mock/interface.py @@ -5,6 +5,7 @@ from selfdrive.config import Conversions as CV from selfdrive.services import service_list from selfdrive.swaglog import cloudlog import selfdrive.messaging as messaging +from common.realtime import Ratekeeper # mocked car interface to work with chffrplus TS = 0.01 # 100Hz @@ -14,9 +15,10 @@ LPG = 2 * 3.1415 * YAW_FR * TS / (1 + 2 * 3.1415 * YAW_FR * TS) class CarInterface(object): - def __init__(self, CP, sendcan=None): + def __init__(self, CP, CarController): self.CP = CP + self.CC = CarController cloudlog.debug("Using Mock Car Interface") context = zmq.Context() @@ -30,6 +32,8 @@ class CarInterface(object): self.yaw_rate = 0. self.yaw_rate_meas = 0. + self.rk = Ratekeeper(100, print_delay_threshold=2. / 1000) + @staticmethod def compute_gb(accel, speed): return accel @@ -39,7 +43,7 @@ class CarInterface(object): return 1.0 @staticmethod - def get_params(candidate, fingerprint): + def get_params(candidate, fingerprint, vin=""): ret = car.CarParams.new_message() @@ -79,6 +83,7 @@ class CarInterface(object): # returns a car.CarState def update(self, c): + self.rk.keep_time() # get basic data from phone and gps since CAN isn't connected sensors = messaging.recv_sock(self.sensor) @@ -120,4 +125,4 @@ class CarInterface(object): def apply(self, c): # in mock no carcontrols - return False + return [] diff --git a/selfdrive/car/mock/radar_interface.py b/selfdrive/car/mock/radar_interface.py index a99494b1a..437bb0538 100755 --- a/selfdrive/car/mock/radar_interface.py +++ b/selfdrive/car/mock/radar_interface.py @@ -11,7 +11,7 @@ class RadarInterface(object): def update(self): - ret = car.RadarState.new_message() + ret = car.RadarData.new_message() time.sleep(0.05) # radard runs on RI updates return ret diff --git a/selfdrive/car/subaru/carcontroller.py b/selfdrive/car/subaru/carcontroller.py index 9a098ea53..83dbbd7c5 100644 --- a/selfdrive/car/subaru/carcontroller.py +++ b/selfdrive/car/subaru/carcontroller.py @@ -1,6 +1,5 @@ #from common.numpy_fast import clip from common.realtime import sec_since_boot -from selfdrive.boardd.boardd import can_list_to_can_capnp from selfdrive.car import apply_std_steer_torque_limits from selfdrive.car.subaru import subarucan from selfdrive.car.subaru.values import CAR, DBC @@ -36,7 +35,7 @@ class CarController(object): print(DBC) self.packer = CANPacker(DBC[car_fingerprint]['pt']) - def update(self, sendcan, enabled, CS, frame, actuators, pcm_cancel_cmd, visual_alert, left_line, right_line): + def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, visual_alert, left_line, right_line): """ Controls thread """ P = self.params @@ -73,4 +72,4 @@ class CarController(object): can_sends.append(subarucan.create_es_lkas(self.packer, CS.es_lkas_msg, visual_alert, left_line, right_line)) self.es_lkas_cnt = CS.es_lkas_msg["Counter"] - sendcan.send(can_list_to_can_capnp(can_sends, msgtype='sendcan')) + return can_sends diff --git a/selfdrive/car/subaru/carstate.py b/selfdrive/car/subaru/carstate.py index 722b17118..0d5deec01 100644 --- a/selfdrive/car/subaru/carstate.py +++ b/selfdrive/car/subaru/carstate.py @@ -37,7 +37,8 @@ def get_powertrain_can_parser(CP): ("BodyInfo", 10), ] - return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0) + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0, timeout=100) + def get_camera_can_parser(CP): signals = [ @@ -78,7 +79,8 @@ def get_camera_can_parser(CP): ("ES_DashStatus", 10), ] - return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2) + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2, timeout=100) + class CarState(object): def __init__(self, CP): diff --git a/selfdrive/car/subaru/interface.py b/selfdrive/car/subaru/interface.py index 077f591a1..874745a66 100644 --- a/selfdrive/car/subaru/interface.py +++ b/selfdrive/car/subaru/interface.py @@ -7,14 +7,9 @@ from selfdrive.controls.lib.vehicle_model import VehicleModel from selfdrive.car.subaru.values import CAR from selfdrive.car.subaru.carstate import CarState, get_powertrain_can_parser, get_camera_can_parser -try: - from selfdrive.car.subaru.carcontroller import CarController -except ImportError: - CarController = None - class CarInterface(object): - def __init__(self, CP, sendcan=None): + def __init__(self, CP, CarController): self.CP = CP self.frame = 0 @@ -30,9 +25,8 @@ class CarInterface(object): self.gas_pressed_prev = False - # sending if read only is False - if sendcan is not None: - self.sendcan = sendcan + self.CC = None + if CarController is not None: self.CC = CarController(CP.carFingerprint) @staticmethod @@ -44,11 +38,12 @@ class CarInterface(object): return 1.0 @staticmethod - def get_params(candidate, fingerprint): + def get_params(candidate, fingerprint, vin=""): ret = car.CarParams.new_message() ret.carName = "subaru" ret.carFingerprint = candidate + ret.carVin = vin ret.safetyModel = car.CarParams.SafetyModels.subaru ret.enableCruise = True @@ -119,9 +114,10 @@ class CarInterface(object): # returns a car.CarState def update(self, c): + can_rcv_error = not self.pt_cp.update(int(sec_since_boot() * 1e9), True) + cam_rcv_error = not self.cam_cp.update(int(sec_since_boot() * 1e9), False) + can_rcv_error = can_rcv_error or cam_rcv_error - self.pt_cp.update(int(sec_since_boot() * 1e9), False) - self.cam_cp.update(int(sec_since_boot() * 1e9), False) self.CS.update(self.pt_cp, self.cam_cp) # create message @@ -183,11 +179,12 @@ class CarInterface(object): events = [] if not self.CS.can_valid: self.can_invalid_count += 1 - if self.can_invalid_count >= 5: - events.append(create_event('commIssue', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) else: self.can_invalid_count = 0 + if can_rcv_error or self.can_invalid_count >= 5: + events.append(create_event('commIssue', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) + if ret.seatbeltUnlatched: events.append(create_event('seatbeltNotLatched', [ET.NO_ENTRY, ET.SOFT_DISABLE])) @@ -216,7 +213,8 @@ class CarInterface(object): return ret.as_reader() def apply(self, c): - self.CC.update(self.sendcan, c.enabled, self.CS, self.frame, c.actuators, - c.cruiseControl.cancel, c.hudControl.visualAlert, - c.hudControl.leftLaneVisible, c.hudControl.rightLaneVisible) + can_sends = self.CC.update(c.enabled, self.CS, self.frame, c.actuators, + c.cruiseControl.cancel, c.hudControl.visualAlert, + c.hudControl.leftLaneVisible, c.hudControl.rightLaneVisible) self.frame += 1 + return can_sends diff --git a/selfdrive/car/subaru/radar_interface.py b/selfdrive/car/subaru/radar_interface.py index 3e458df57..75256683d 100644 --- a/selfdrive/car/subaru/radar_interface.py +++ b/selfdrive/car/subaru/radar_interface.py @@ -11,7 +11,7 @@ class RadarInterface(object): def update(self): - ret = car.RadarState.new_message() + ret = car.RadarData.new_message() time.sleep(0.05) # radard runs on RI updates return ret diff --git a/selfdrive/car/toyota/carcontroller.py b/selfdrive/car/toyota/carcontroller.py index 0bd5d9002..91bcb677a 100644 --- a/selfdrive/car/toyota/carcontroller.py +++ b/selfdrive/car/toyota/carcontroller.py @@ -1,6 +1,5 @@ from cereal import car from common.numpy_fast import clip, interp -from selfdrive.boardd.boardd import can_list_to_can_capnp from selfdrive.car import apply_toyota_steer_torque_limits from selfdrive.car import create_gas_command from selfdrive.car.toyota.toyotacan import make_can_msg, create_video_target,\ @@ -124,7 +123,7 @@ class CarController(object): self.packer = CANPacker(dbc_name) - def update(self, sendcan, enabled, CS, frame, actuators, + def update(self, enabled, CS, frame, actuators, pcm_cancel_cmd, hud_alert, audible_alert, forwarding_camera, left_line, right_line, lead, left_lane_depart, right_lane_depart): @@ -270,5 +269,4 @@ class CarController(object): can_sends.append(make_can_msg(addr, vl, bus, False)) - - sendcan.send(can_list_to_can_capnp(can_sends, msgtype='sendcan')) + return can_sends diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index 88471b61a..cdb735d4f 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -68,7 +68,7 @@ def get_can_parser(CP): signals.append(("INTERCEPTOR_GAS", "GAS_SENSOR", 0)) checks.append(("GAS_SENSOR", 50)) - return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0) + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0, timeout=100) def get_cam_can_parser(CP): @@ -78,7 +78,7 @@ def get_cam_can_parser(CP): # use steering message to check if panda is connected to frc checks = [("STEERING_LKA", 42)] - return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2) + return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2, timeout=100) class CarState(object): diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index ea5b748d5..71ace4c1f 100755 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -8,14 +8,9 @@ from selfdrive.car.toyota.carstate import CarState, get_can_parser, get_cam_can_ from selfdrive.car.toyota.values import ECU, check_ecu_msgs, CAR, NO_STOP_TIMER_CAR from selfdrive.swaglog import cloudlog -try: - from selfdrive.car.toyota.carcontroller import CarController -except ImportError: - CarController = None - class CarInterface(object): - def __init__(self, CP, sendcan=None): + def __init__(self, CP, CarController): self.CP = CP self.VM = VehicleModel(CP) @@ -34,9 +29,8 @@ class CarInterface(object): self.forwarding_camera = False - # sending if read only is False - if sendcan is not None: - self.sendcan = sendcan + self.CC = None + if CarController is not None: self.CC = CarController(self.cp.dbc_name, CP.carFingerprint, CP.enableCamera, CP.enableDsu, CP.enableApgs) @staticmethod @@ -48,7 +42,7 @@ class CarInterface(object): return 1.0 @staticmethod - def get_params(candidate, fingerprint): + def get_params(candidate, fingerprint, vin=""): # kg of standard extra cargo to count for drive, gas, etc... std_cargo = 136 @@ -57,6 +51,7 @@ class CarInterface(object): ret.carName = "toyota" ret.carFingerprint = candidate + ret.carVin = vin ret.safetyModel = car.CarParams.SafetyModels.toyota @@ -256,7 +251,8 @@ class CarInterface(object): # ******************* do can recv ******************* canMonoTimes = [] - self.cp.update(int(sec_since_boot() * 1e9), False) + can_valid, _ = self.cp.update(int(sec_since_boot() * 1e9), True) + can_rcv_error = not can_valid # run the cam can update for 10s as we just need to know if the camera is alive if self.frame < 1000: @@ -341,11 +337,12 @@ class CarInterface(object): events = [] if not self.CS.can_valid: self.can_invalid_count += 1 - if self.can_invalid_count >= 5: - events.append(create_event('commIssue', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) else: self.can_invalid_count = 0 + if can_rcv_error or self.can_invalid_count >= 5: + events.append(create_event('commIssue', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) + if self.CS.cam_can_valid: self.cam_can_valid_count += 1 if self.cam_can_valid_count >= 5: @@ -403,11 +400,11 @@ class CarInterface(object): # to be called @ 100hz def apply(self, c): - self.CC.update(self.sendcan, c.enabled, self.CS, self.frame, - c.actuators, c.cruiseControl.cancel, c.hudControl.visualAlert, - c.hudControl.audibleAlert, self.forwarding_camera, - c.hudControl.leftLaneVisible, c.hudControl.rightLaneVisible, c.hudControl.leadVisible, - c.hudControl.leftLaneDepart, c.hudControl.rightLaneDepart) + can_sends = self.CC.update(c.enabled, self.CS, self.frame, + c.actuators, c.cruiseControl.cancel, c.hudControl.visualAlert, + c.hudControl.audibleAlert, self.forwarding_camera, + c.hudControl.leftLaneVisible, c.hudControl.rightLaneVisible, c.hudControl.leadVisible, + c.hudControl.leftLaneDepart, c.hudControl.rightLaneDepart) self.frame += 1 - return False + return can_sends diff --git a/selfdrive/car/toyota/radar_interface.py b/selfdrive/car/toyota/radar_interface.py index fc6f3e523..b8628c5bb 100755 --- a/selfdrive/car/toyota/radar_interface.py +++ b/selfdrive/car/toyota/radar_interface.py @@ -9,7 +9,7 @@ from selfdrive.services import service_list import selfdrive.messaging as messaging from selfdrive.car.toyota.values import NO_DSU_CAR, DBC, TSSP2_CAR -def _create_radard_can_parser(car_fingerprint): +def _create_radar_can_parser(car_fingerprint): dbc_f = DBC[car_fingerprint]['radar'] if car_fingerprint in TSSP2_CAR: @@ -48,7 +48,7 @@ class RadarInterface(object): self.valid_cnt = {key: 0 for key in self.RADAR_A_MSGS} - self.rcp = _create_radard_can_parser(CP.carFingerprint) + self.rcp = _create_radar_can_parser(CP.carFingerprint) self.no_dsu_car = CP.carFingerprint in NO_DSU_CAR context = zmq.Context() @@ -56,7 +56,7 @@ class RadarInterface(object): def update(self): - ret = car.RadarState.new_message() + ret = car.RadarData.new_message() if self.no_dsu_car: # TODO: make a adas dbc file for dsu-less models @@ -67,7 +67,8 @@ class RadarInterface(object): updated_messages = set() while 1: tm = int(sec_since_boot() * 1e9) - updated_messages.update(self.rcp.update(tm, True)) + _, vls = self.rcp.update(tm, True) + updated_messages.update(vls) if self.RADAR_B_MSGS[-1] in updated_messages: break @@ -94,7 +95,7 @@ class RadarInterface(object): # radar point only valid if it's a valid measurement and score is above 50 if cpt['VALID'] or (score > 50 and cpt['LONG_DIST'] < 255 and self.valid_cnt[ii] > 0): if ii not in self.pts or cpt['NEW_TRACK']: - self.pts[ii] = car.RadarState.RadarPoint.new_message() + self.pts[ii] = car.RadarData.RadarPoint.new_message() self.pts[ii].trackId = self.track_id self.track_id += 1 self.pts[ii].dRel = cpt['LONG_DIST'] # from front of car diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index b18ee66ab..dc8298192 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -141,10 +141,10 @@ FINGERPRINTS = { CAR.HIGHLANDER: [{ 36: 8, 37: 8, 114: 5, 119: 6, 120: 4, 170: 8, 180: 8, 186: 4, 238: 4, 355: 5, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 544: 4, 545: 5, 550: 8, 552: 4, 608: 8, 610: 5, 643: 7, 705: 8, 725: 2, 740: 5, 800: 8, 835: 8, 836: 8, 849: 4, 869: 7, 870: 7, 871: 2, 896: 8, 900: 6, 902: 6, 905: 8, 911: 8, 916: 3, 921: 8, 922: 8, 933: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 979: 2, 998: 5, 999: 7, 1000: 8, 1001: 8, 1008: 2, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1043: 8, 1044: 8, 1056: 8, 1059: 1, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1176: 8, 1177: 8, 1178: 8, 1179: 8, 1180: 8, 1181: 8, 1182: 8, 1183: 8, 1189: 8, 1190: 8, 1191: 8, 1192: 8, 1196: 8, 1197: 8, 1198: 8, 1199: 8, 1206: 8, 1207: 8, 1212: 8, 1227: 8, 1235: 8, 1237: 8, 1279: 8, 1408: 8, 1409: 8, 1410: 8, 1552: 8, 1553: 8, 1554: 8, 1556: 8, 1557: 8, 1561: 8, 1562: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1584: 8, 1589: 8, 1592: 8, 1593: 8, 1595: 8, 1599: 8, 1656: 8, 1666: 8, 1667: 8, 1728: 8, 1745: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8 }, - # 2019 Highlander XLE + # 2019 Highlander XLE { 36: 8, 37: 8, 114: 5, 119: 6, 120: 4, 170: 8, 180: 8, 186: 4, 238: 4, 355: 5, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 544: 4, 545: 5, 550: 8, 552: 4, 608: 8, 610: 5, 643: 7, 705: 8, 725: 2, 740: 5, 800: 8, 835: 8, 836: 8, 849: 4, 869: 7, 870: 7, 871: 2, 896: 8, 900: 6, 902: 6, 905: 8, 911: 8, 916: 3, 921: 8, 922: 8, 933: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 979: 2, 992: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1008: 2, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1043: 8, 1044: 8, 1056: 8, 1059: 1, 1076: 8, 1077: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1176: 8, 1177: 8, 1178: 8, 1179: 8, 1180: 8, 1181: 8, 1182: 8, 1183: 8, 1189: 8, 1190: 8, 1191: 8, 1192: 8, 1196: 8, 1197: 8, 1198: 8, 1199: 8, 1206: 8, 1207: 8, 1212: 8, 1227: 8, 1235: 8, 1237: 8, 1279: 8, 1408: 8, 1409: 8, 1410: 8, 1552: 8, 1553: 8, 1554: 8, 1556: 8, 1557: 8, 1561: 8, 1562: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1584: 8, 1589: 8, 1592: 8, 1593: 8, 1595: 8, 1599: 8, 1656: 8, 1728: 8, 1745: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8 - }, + }, # 2017 Highlander Limited { 36: 8, 37: 8, 114: 5, 119: 6, 120: 4, 170: 8, 180: 8, 186: 4, 238: 4, 355: 5, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 544: 4, 545: 5, 550: 8, 552: 4, 608: 8, 610: 5, 643: 7, 705: 8, 725: 2, 740: 5, 800: 8, 835: 8, 836: 8, 849: 4, 869: 7, 870: 7, 871: 2, 896: 8, 900: 6, 902: 6, 905: 8, 911: 8, 916: 3, 918: 7, 921: 8, 922: 8, 933: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 979: 2, 998: 5, 999: 7, 1000: 8, 1001: 8, 1005: 2, 1008: 2, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1043: 8, 1044: 8, 1056: 8, 1059: 1, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1176: 8, 1177: 8, 1178: 8, 1179: 8, 1180: 8, 1181: 8, 1182: 8, 1183: 8, 1189: 8, 1190: 8, 1191: 8, 1192: 8, 1196: 8, 1197: 8, 1198: 8, 1199: 8, 1206: 8, 1207: 8, 1212: 8, 1227: 8, 1235: 8, 1237: 8, 1264: 8, 1279: 8, 1408: 8, 1409: 8, 1410: 8, 1552: 8, 1553: 8, 1554: 8, 1556: 8, 1557: 8, 1561: 8, 1562: 8, 1568: 8, 1569: 8, 1570: 8, 1571: 8, 1572: 8, 1584: 8, 1589: 8, 1592: 8, 1593: 8, 1595: 8, 1599: 8, 1656: 8, 1728: 8, 1745: 8, 1779: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8 @@ -160,12 +160,12 @@ FINGERPRINTS = { { 36: 8, 37: 8, 170: 8, 180: 8, 186: 4, 355: 5, 401: 8, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 544: 4, 550: 8, 552: 4, 562: 6, 565: 8, 608: 8, 610: 8, 643: 7, 705: 8, 728: 8, 740: 5, 742: 8, 743: 8, 761: 8, 764: 8, 765: 8, 800: 8, 810: 2, 812: 8, 824: 8, 829: 2, 830: 7, 835: 8, 836: 8, 865: 8, 869: 7, 870: 7, 871: 2, 877: 8, 881: 8, 882: 8, 885: 8, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 921: 8, 933: 8, 934: 8, 935: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 976: 1, 998: 5, 999: 7, 1000: 8, 1001: 8, 1002: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 1063: 8, 1076: 8, 1077: 8,1114: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1172: 8, 1235: 8, 1279: 8, 1541: 8, 1552: 8, 1553:8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1594: 8, 1595: 8, 1649: 8, 1745: 8, 1775: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8 }, - # XLE + # XLE and AWD { - 36: 8, 37: 8, 170: 8, 180: 8, 186: 4, 401: 8, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 544: 4, 550: 8, 552: 4, 562: 6, 565: 8, 608: 8, 610: 8, 643: 7, 705: 8, 728: 8, 740: 5, 742: 8, 743: 8, 761: 8, 764: 8, 765: 8, 800: 8, 810: 2, 812: 8, 824: 8, 829: 2, 830: 7, 835: 8, 836: 8, 865: 8, 869: 7, 870: 7, 871: 2, 877: 8, 881: 8, 882: 8, 885: 8, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 921: 8, 933: 8, 934: 8, 935: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 976: 1, 998: 5, 999: 7, 1000: 8, 1001: 8, 1002: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 1063: 8, 1076: 8, 1077: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1172: 8, 1235: 8, 1237: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1594: 8, 1595: 8, 1649: 8, 1745: 8, 1775: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8 + 36: 8, 37: 8, 170: 8, 180: 8, 186: 4, 401: 8, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 544: 4, 550: 8, 552: 4, 562: 6, 565: 8, 608: 8, 610: 8, 643: 7, 658: 8, 705: 8, 728: 8, 740: 5, 742: 8, 743: 8, 761: 8, 764: 8, 765: 8, 800: 8, 810: 2, 812: 8, 814: 8, 818: 8, 822: 8, 824: 8, 829: 2, 830: 7, 835: 8, 836: 8, 865: 8, 869: 7, 870: 7, 871: 2, 877: 8, 881: 8, 882: 8, 885: 8, 889: 8, 891: 8, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 918: 8, 921: 8, 933: 8, 934: 8, 935: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 976: 1, 987: 8, 998: 5, 999: 7, 1000: 8, 1001: 8, 1002: 8, 1014: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 1063: 8, 1076: 8, 1077: 8, 1082: 8, 1084: 8, 1085: 8, 1086: 8, 1114: 8, 1132: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1172: 8, 1228: 8, 1235: 8, 1237: 8, 1263: 8, 1264: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1594: 8, 1595: 8, 1649: 8, 1696: 8, 1745: 8, 1775: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8 }], CAR.COROLLA_HATCH: [{ - 36: 8, 37: 8, 114: 5, 170: 8, 180: 8, 186: 4, 401: 8, 426: 6, 452: 8 , 464: 8, 466: 8, 467: 8, 544: 4, 550: 8, 552: 4, 562: 6, 608: 8, 610: 8, 643: 7 , 705: 8, 728: 8, 740: 5, 742: 8, 743: 8, 761: 8, 764: 8, 765: 8, 800: 8, 810: 2, 812: 8, 824: 8, 829: 2, 830: 7, 835: 8, 836: 8, 865: 8, 869: 7, 870: 7, 871: 2, 877: 8, 881: 8, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 921: 8, 933: 8, 934: 8, 935: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 976: 1, 998: 5, 999: 7, 1000:8, 1001: 8, 1002: 8, 1017:8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059:1, 1076: 8, 1077: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1172: 8, 1235: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1595: 8, 1745: 8, 1775: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8 + 36: 8, 37: 8, 114: 5, 170: 8, 180: 8, 186: 4, 401: 8, 426: 6, 452: 8, 464: 8, 466: 8, 467: 8, 544: 4, 550: 8, 552: 4, 562: 6, 608: 8, 610: 8, 643: 7, 705: 8, 728: 8, 740: 5, 742: 8, 743: 8, 761: 8, 764: 8, 765: 8, 800: 8, 810: 2, 812: 8, 824: 8, 829: 2, 830: 7, 835: 8, 836: 8, 865: 8, 869: 7, 870: 7, 871: 2, 877: 8, 881: 8, 896: 8, 898: 8, 900: 6, 902: 6, 905: 8, 921: 8, 933: 8, 934: 8, 935: 8, 944: 8, 945: 8, 951: 8, 955: 8, 956: 8, 976: 1, 998: 5, 999: 7, 1000: 8, 1001: 8, 1002: 8, 1017: 8, 1020: 8, 1041: 8, 1042: 8, 1044: 8, 1056: 8, 1059: 1, 1076: 8, 1077: 8, 1114: 8, 1161: 8, 1162: 8, 1163: 8, 1164: 8, 1165: 8, 1166: 8, 1167: 8, 1172: 8, 1235: 8, 1279: 8, 1541: 8, 1552: 8, 1553: 8, 1556: 8, 1557: 8, 1568: 8, 1570: 8, 1571: 8, 1572: 8, 1592: 8, 1595: 8, 1649: 8, 1745: 8, 1775: 8, 1779: 8, 1786: 8, 1787: 8, 1788: 8, 1789: 8, 1904: 8, 1912: 8, 1990: 8, 1998: 8 }] } diff --git a/selfdrive/common/messaging.h b/selfdrive/common/messaging.h new file mode 100644 index 000000000..725129508 --- /dev/null +++ b/selfdrive/common/messaging.h @@ -0,0 +1,15 @@ +// the c version of selfdrive/messaging.py + +#include + +// TODO: refactor to take in service instead of endpoint? +void *sub_sock(void *ctx, const char *endpoint) { + void* sock = zmq_socket(ctx, ZMQ_SUB); + assert(sock); + zmq_setsockopt(sock, ZMQ_SUBSCRIBE, "", 0); + int reconnect_ivl = 500; + zmq_setsockopt(sock, ZMQ_RECONNECT_IVL_MAX, &reconnect_ivl, sizeof(reconnect_ivl)); + zmq_connect(sock, endpoint); + return sock; +} + diff --git a/selfdrive/common/version.h b/selfdrive/common/version.h index f2f73bbe0..b925f4152 100644 --- a/selfdrive/common/version.h +++ b/selfdrive/common/version.h @@ -1 +1 @@ -#define COMMA_VERSION "0.5.12-release" +#define COMMA_VERSION "0.5.13-release" diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index bbc90976b..8e27c7c3b 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -12,7 +12,8 @@ from common.params import Params import selfdrive.messaging as messaging from selfdrive.config import Conversions as CV from selfdrive.services import service_list -from selfdrive.car.car_helpers import get_car +from selfdrive.boardd.boardd import can_list_to_can_capnp +from selfdrive.car.car_helpers import get_car, get_startup_alert from selfdrive.controls.lib.model_parser import CAMERA_OFFSET from selfdrive.controls.lib.drive_helpers import learn_angle_model_bias, \ get_events, \ @@ -30,7 +31,7 @@ from selfdrive.controls.lib.planner import _DT_MPC from selfdrive.locationd.calibration_helpers import Calibration, Filter ThermalStatus = log.ThermalData.ThermalStatus -State = log.Live100Data.ControlState +State = log.ControlsState.OpenpilotState def isActive(state): @@ -209,7 +210,7 @@ def state_transition(CS, CP, state, events, soft_disable_timer, v_cruise_kph, AM def state_control(rcv_times, plan, path_plan, CS, CP, state, events, v_cruise_kph, v_cruise_kph_last, AM, rk, - driver_status, LaC, LoC, VM, angle_model_bias, passive, is_metric, cal_perc): + driver_status, LaC, LoC, VM, angle_model_bias, read_only, is_metric, cal_perc): """Given the state, this function returns an actuators packet""" actuators = car.CarControl.Actuators.new_message() @@ -288,15 +289,15 @@ def state_control(rcv_times, plan, path_plan, CS, CP, state, events, v_cruise_kp def data_send(plan, path_plan, CS, CI, CP, VM, state, events, actuators, v_cruise_kph, rk, carstate, - carcontrol, live100, AM, driver_status, - LaC, LoC, angle_model_bias, passive, start_time, v_acc, a_acc, lac_log): - """Send actuators and hud commands to the car, send live100 and MPC logging""" + carcontrol, controlsstate, sendcan, AM, driver_status, + LaC, LoC, angle_model_bias, read_only, start_time, v_acc, a_acc, lac_log): + """Send actuators and hud commands to the car, send controlsstate and MPC logging""" plan_ts = plan.logMonoTime plan = plan.plan CC = car.CarControl.new_message() - if not passive: + if not read_only: CC.enabled = isEnabled(state) CC.actuators = actuators @@ -331,14 +332,15 @@ def data_send(plan, path_plan, CS, CI, CP, VM, state, events, actuators, v_cruis CC.hudControl.audibleAlert = AM.audible_alert # send car controls over can - CI.apply(CC) + can_sends = CI.apply(CC) + sendcan.send(can_list_to_can_capnp(can_sends, msgtype='sendcan')) force_decel = driver_status.awareness < 0. - # live100 + # controlsState dat = messaging.new_message() - dat.init('live100') - dat.live100 = { + dat.init('controlsState') + dat.controlsState = { "alertText1": AM.alert_text_1, "alertText2": AM.alert_text_2, "alertSize": AM.alert_size, @@ -381,10 +383,10 @@ def data_send(plan, path_plan, CS, CI, CP, VM, state, events, actuators, v_cruis } if CP.lateralTuning.which() == 'pid': - dat.live100.lateralControlState.pidState = lac_log + dat.controlsState.lateralControlState.pidState = lac_log else: - dat.live100.lateralControlState.indiState = lac_log - live100.send(dat.to_bytes()) + dat.controlsState.lateralControlState.indiState = lac_log + controlsstate.send(dat.to_bytes()) # carState cs_send = messaging.new_message() @@ -402,7 +404,7 @@ def data_send(plan, path_plan, CS, CI, CP, VM, state, events, actuators, v_cruis return CC -def controlsd_thread(gctx=None, rate=100): +def controlsd_thread(gctx=None): gc.disable() # start the loop @@ -412,18 +414,14 @@ def controlsd_thread(gctx=None, rate=100): params = Params() # Pub Sockets - live100 = messaging.pub_sock(context, service_list['live100'].port) + controlsstate = messaging.pub_sock(context, service_list['controlsState'].port) carstate = messaging.pub_sock(context, service_list['carState'].port) carcontrol = messaging.pub_sock(context, service_list['carControl'].port) is_metric = params.get("IsMetric") == "1" passive = params.get("Passive") != "0" - # No sendcan if passive - if not passive: - sendcan = messaging.pub_sock(context, service_list['sendcan'].port) - else: - sendcan = None + sendcan = messaging.pub_sock(context, service_list['sendcan'].port) # Sub sockets poller = zmq.Poller() @@ -436,18 +434,18 @@ def controlsd_thread(gctx=None, rate=100): logcan = messaging.sub_sock(context, service_list['can'].port) CC = car.CarControl.new_message() - CI, CP = get_car(logcan, sendcan, 1.0 if passive else None) + CI, CP = get_car(logcan, sendcan) + AM = AlertManager() - if CI is None: - raise Exception("unsupported car") + car_recognized = CP.carName != 'mock' + # If stock camera is disconnected, we loaded car controls and it's not chffrplus + controller_available = CP.enableCamera and CI.CC is not None and not passive + read_only = not car_recognized or not controller_available + if read_only: + CP.safetyModel = car.CarParams.SafetyModels.elm327 # diagnostic only - # if stock camera is connected, then force passive behavior - if not CP.enableCamera: - passive = True - sendcan = None - - if passive: - CP.safetyModel = car.CarParams.SafetyModels.noOutput + startup_alert = get_startup_alert(car_recognized, controller_available) + AM.add(startup_alert, False) LoC = LongControl(CP, CI.compute_gb) VM = VehicleModel(CP) @@ -457,12 +455,8 @@ def controlsd_thread(gctx=None, rate=100): else: LaC = LatControlINDI(CP) - AM = AlertManager() driver_status = DriverStatus() - if not passive: - AM.add("startup", False) - # Write CarParams for radard and boardd safety mode params.put("CarParams", CP.to_bytes()) params.put("LongitudinalControl", "1" if CP.openpilotLongitudinalControl else "0") @@ -484,8 +478,10 @@ def controlsd_thread(gctx=None, rate=100): plan.init('plan') path_plan = messaging.new_message() path_plan.init('pathPlan') + path_plan.pathPlan.sensorValid = True - rk = Ratekeeper(rate, print_delay_threshold=2. / 1000) + # controlsd is driven by can recv, expected at 100Hz + rk = Ratekeeper(100, print_delay_threshold=None) controls_params = params.get("ControlsParams") # Read angle offset from previous drive @@ -516,6 +512,8 @@ def controlsd_thread(gctx=None, rate=100): if not path_plan.pathPlan.valid or plan_age > 0.5 or path_plan_age > 0.5: events.append(create_event('plannerError', [ET.NO_ENTRY, ET.SOFT_DISABLE])) + if not path_plan.pathPlan.sensorValid: + events.append(create_event('sensorDataInvalid', [ET.NO_ENTRY, ET.PERMANENT])) if not path_plan.pathPlan.paramsValid: events.append(create_event('vehicleModelInvalid', [ET.WARNING])) if not path_plan.pathPlan.modelValid: @@ -529,7 +527,7 @@ def controlsd_thread(gctx=None, rate=100): if CS.brakePressed and plan.plan.vTargetFuture >= STARTING_TARGET_SPEED and not CP.radarOffCan and CS.vEgo < 0.3: events.append(create_event('noTarget', [ET.NO_ENTRY, ET.IMMEDIATE_DISABLE])) - if not passive: + if not read_only: # update control state state, soft_disable_timer, v_cruise_kph, v_cruise_kph_last = \ state_transition(CS, CP, state, events, soft_disable_timer, v_cruise_kph, AM) @@ -539,21 +537,21 @@ def controlsd_thread(gctx=None, rate=100): actuators, v_cruise_kph, driver_status, angle_model_bias, v_acc, a_acc, lac_log = \ state_control(rcv_times, plan.plan, path_plan.pathPlan, CS, CP, state, events, v_cruise_kph, v_cruise_kph_last, AM, rk, driver_status, - LaC, LoC, VM, angle_model_bias, passive, is_metric, cal_perc) + LaC, LoC, VM, angle_model_bias, read_only, is_metric, cal_perc) prof.checkpoint("State Control") # Publish data CC = data_send(plan, path_plan, CS, CI, CP, VM, state, events, actuators, v_cruise_kph, rk, carstate, carcontrol, - live100, AM, driver_status, LaC, LoC, angle_model_bias, passive, start_time, v_acc, a_acc, lac_log) + controlsstate, sendcan, AM, driver_status, LaC, LoC, angle_model_bias, read_only, start_time, v_acc, a_acc, lac_log) prof.checkpoint("Sent") - rk.keep_time() # Run at 100Hz + rk.monitor_time() prof.display() def main(gctx=None): - controlsd_thread(gctx, 100) + controlsd_thread(gctx) if __name__ == "__main__": diff --git a/selfdrive/controls/lib/alertmanager.py b/selfdrive/controls/lib/alertmanager.py index 5884e9870..5ce2bfac1 100644 --- a/selfdrive/controls/lib/alertmanager.py +++ b/selfdrive/controls/lib/alertmanager.py @@ -5,8 +5,8 @@ from common.realtime import sec_since_boot import copy -AlertSize = log.Live100Data.AlertSize -AlertStatus = log.Live100Data.AlertStatus +AlertSize = log.ControlsState.AlertSize +AlertStatus = log.ControlsState.AlertStatus class AlertManager(object): diff --git a/selfdrive/controls/lib/alerts.py b/selfdrive/controls/lib/alerts.py index 17caf7fbf..d6e3f4535 100644 --- a/selfdrive/controls/lib/alerts.py +++ b/selfdrive/controls/lib/alerts.py @@ -9,8 +9,8 @@ class Priority: HIGH = 4 HIGHEST = 5 -AlertSize = log.Live100Data.AlertSize -AlertStatus = log.Live100Data.AlertStatus +AlertSize = log.ControlsState.AlertSize +AlertStatus = log.ControlsState.AlertStatus AudibleAlert = car.CarControl.HUDControl.AudibleAlert VisualAlert = car.CarControl.HUDControl.VisualAlert @@ -171,6 +171,20 @@ ALERTS = [ AlertStatus.normal, AlertSize.mid, Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., 15.), + Alert( + "startupNoControl", + "Dashcam mode", + "Always keep hands on wheel and eyes on road", + AlertStatus.normal, AlertSize.mid, + Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., 15.), + + Alert( + "startupNoCar", + "Dashcam mode with unsupported car", + "Always keep hands on wheel and eyes on road", + AlertStatus.normal, AlertSize.mid, + Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., 15.), + Alert( "ethicalDilemma", "TAKE CONTROL IMMEDIATELY", @@ -277,6 +291,13 @@ ALERTS = [ AlertStatus.normal, AlertSize.mid, Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.), + Alert( + "sensorDataInvalidNoEntry", + "openpilot Unavailable", + "No Data from EON Sensors", + AlertStatus.normal, AlertSize.mid, + Priority.LOW, VisualAlert.none, AudibleAlert.chimeError, .4, 2., 3.), + # Cancellation alerts causing soft disabling Alert( "overheat", @@ -625,6 +646,13 @@ ALERTS = [ AlertStatus.normal, AlertSize.mid, Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2), + Alert( + "sensorDataInvalidPermanent", + "No Data from EON Sensors", + "Reboot your EON", + AlertStatus.normal, AlertSize.mid, + Priority.LOW_LOWEST, VisualAlert.none, AudibleAlert.none, 0., 0., .2), + Alert( "vehicleModelInvalid", "Vehicle Parameter Identification Failed", diff --git a/selfdrive/controls/lib/cluster/LICENSE b/selfdrive/controls/lib/cluster/LICENSE new file mode 100644 index 000000000..ab8b4db7d --- /dev/null +++ b/selfdrive/controls/lib/cluster/LICENSE @@ -0,0 +1,13 @@ +Copyright: + * fastcluster_dm.cpp & fastcluster_R_dm.cpp: + © 2011 Daniel Müllner + * fastcluster.(h|cpp) & demo.cpp & plotresult.r: + © 2018 Christoph Dalitz +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/selfdrive/controls/lib/cluster/Makefile b/selfdrive/controls/lib/cluster/Makefile new file mode 100644 index 000000000..ed5edfb59 --- /dev/null +++ b/selfdrive/controls/lib/cluster/Makefile @@ -0,0 +1,28 @@ +CC = clang +CXX = clang++ + +CPPFLAGS = -Wall -g -fPIC -std=c++11 -O2 + +OBJS = fastcluster.o test.o +DEPS := $(OBJS:.o=.d) + +all: libfastcluster.so + +test: libfastcluster.so test.o + $(CXX) -g -L. -lfastcluster -o $@ $+ + +valgrind: test + valgrind --leak-check=full ./test + + +libfastcluster.so: fastcluster.o + $(CXX) -g -shared -o $@ $+ + +%.o: %.cpp + $(CXX) $(CPPFLAGS) -MMD -c $*.cpp + +clean: + rm -f $(OBJS) $(DEPS) libfastcluster.so test + + +-include $(DEPS) diff --git a/selfdrive/controls/lib/cluster/README b/selfdrive/controls/lib/cluster/README new file mode 100644 index 000000000..acb18bc72 --- /dev/null +++ b/selfdrive/controls/lib/cluster/README @@ -0,0 +1,79 @@ +C++ interface to fast hierarchical clustering algorithms +======================================================== + +This is a simplified C++ interface to fast implementations of hierarchical +clustering by Daniel Müllner. The original library with interfaces to R +and Python is described in: + +Daniel Müllner: "fastcluster: Fast Hierarchical, Agglomerative Clustering +Routines for R and Python." Journal of Statistical Software 53 (2013), +no. 9, pp. 1–18, http://www.jstatsoft.org/v53/i09/ + + +Usage of the library +-------------------- + +For using the library, the following source files are needed: + +fastcluster_dm.cpp, fastcluster_R_dm.cpp + original code by Daniel Müllner + these are included by fastcluster.cpp via #include, and therefore + need not be compiled to object code + +fastcluster.[h|cpp] + simplified C++ interface + fastcluster.cpp is the only file that must be compiled + +The library provides the clustering function *hclust_fast* for +creating the dendrogram information in an encoding as used by the +R function *hclust*. For a description of the parameters, see fastcluster.h. +Its parameter *method* can be one of + +HCLUST_METHOD_SINGLE + single link with the minimum spanning tree algorithm (Rohlf, 1973) + +HHCLUST_METHOD_COMPLETE + complete link with the nearest-neighbor-chain algorithm (Murtagh, 1984) + +HCLUST_METHOD_AVERAGE + complete link with the nearest-neighbor-chain algorithm (Murtagh, 1984) + +HCLUST_METHOD_MEDIAN + median link with the generic algorithm (Müllner, 2011) + +For splitting the dendrogram into clusters, the two functions *cutree_k* +and *cutree_cdist* are provided. + +Note that output parameters must be allocated beforehand, e.g. + int* merge = new int[2*(npoints-1)]; +For a complete usage example, see lines 135-142 of demo.cpp. + + +Demonstration program +--------------------- + +A simple demo is implemented in demo.cpp, which can be compiled and run with + + make + ./hclust-demo -m complete lines.csv + +It creates two clusters of line segments such that the segment angle between +line segments of different clusters have a maximum (cosine) dissimilarity. +For visualizing the result, plotresult.r can be used as follows +(requires R to be installed): + + ./hclust-demo -m complete lines.csv | Rscript plotresult.r + + +Authors & Copyright +------------------- + +Daniel Müllner, 2011, +Christoph Dalitz, 2018, + + +License +------- + +This code is provided under a BSD-style license. +See the file LICENSE for details. diff --git a/selfdrive/mapd/__init__.py b/selfdrive/controls/lib/cluster/__init__.py similarity index 100% rename from selfdrive/mapd/__init__.py rename to selfdrive/controls/lib/cluster/__init__.py diff --git a/selfdrive/controls/lib/cluster/fastcluster.cpp b/selfdrive/controls/lib/cluster/fastcluster.cpp new file mode 100644 index 000000000..6b0af725c --- /dev/null +++ b/selfdrive/controls/lib/cluster/fastcluster.cpp @@ -0,0 +1,218 @@ +// +// C++ standalone verion of fastcluster by Daniel Müllner +// +// Copyright: Christoph Dalitz, 2018 +// Daniel Müllner, 2011 +// License: BSD style license +// (see the file LICENSE for details) +// + + +#include +#include +#include + + +extern "C" { +#include "fastcluster.h" +} + +// Code by Daniel Müllner +// workaround to make it usable as a standalone version (without R) +bool fc_isnan(double x) { return false; } +#include "fastcluster_dm.cpp" +#include "fastcluster_R_dm.cpp" + +extern "C" { +// +// Assigns cluster labels (0, ..., nclust-1) to the n points such +// that the cluster result is split into nclust clusters. +// +// Input arguments: +// n = number of observables +// merge = clustering result in R format +// nclust = number of clusters +// Output arguments: +// labels = allocated integer array of size n for result +// + void cutree_k(int n, const int* merge, int nclust, int* labels) { + + int k,m1,m2,j,l; + + if (nclust > n || nclust < 2) { + for (j=0; j last_merge(n, 0); + for (k=1; k<=(n-nclust); k++) { + // (m1,m2) = merge[k,] + m1 = merge[k-1]; + m2 = merge[n-1+k-1]; + if (m1 < 0 && m2 < 0) { // both single observables + last_merge[-m1-1] = last_merge[-m2-1] = k; + } + else if (m1 < 0 || m2 < 0) { // one is a cluster + if(m1 < 0) { j = -m1; m1 = m2; } else j = -m2; + // merging single observable and cluster + for(l = 0; l < n; l++) + if (last_merge[l] == m1) + last_merge[l] = k; + last_merge[j-1] = k; + } + else { // both cluster + for(l=0; l < n; l++) { + if( last_merge[l] == m1 || last_merge[l] == m2 ) + last_merge[l] = k; + } + } + } + + // assign cluster labels + int label = 0; + std::vector z(n,-1); + for (j=0; j= cdist + // + // Input arguments: + // n = number of observables + // merge = clustering result in R format + // height = cluster distance at each merge step + // cdist = cutoff cluster distance + // Output arguments: + // labels = allocated integer array of size n for result + // + void cutree_cdist(int n, const int* merge, double* height, double cdist, int* labels) { + + int k; + + for (k=0; k<(n-1); k++) { + if (height[k] >= cdist) { + break; + } + } + cutree_k(n, merge, n-k, labels); + } + + + // + // Hierarchical clustering with one of Daniel Muellner's fast algorithms + // + // Input arguments: + // n = number of observables + // distmat = condensed distance matrix, i.e. an n*(n-1)/2 array representing + // the upper triangle (without diagonal elements) of the distance + // matrix, e.g. for n=4: + // d00 d01 d02 d03 + // d10 d11 d12 d13 -> d01 d02 d03 d12 d13 d23 + // d20 d21 d22 d23 + // d30 d31 d32 d33 + // method = cluster metric (see enum method_code) + // Output arguments: + // merge = allocated (n-1)x2 matrix (2*(n-1) array) for storing result. + // Result follows R hclust convention: + // - observabe indices start with one + // - merge[i][] contains the merged nodes in step i + // - merge[i][j] is negative when the node is an atom + // height = allocated (n-1) array with distances at each merge step + // Return code: + // 0 = ok + // 1 = invalid method + // + int hclust_fast(int n, double* distmat, int method, int* merge, double* height) { + + // call appropriate culstering function + cluster_result Z2(n-1); + if (method == HCLUST_METHOD_SINGLE) { + // single link + MST_linkage_core(n, distmat, Z2); + } + else if (method == HCLUST_METHOD_COMPLETE) { + // complete link + NN_chain_core(n, distmat, NULL, Z2); + } + else if (method == HCLUST_METHOD_AVERAGE) { + // best average distance + double* members = new double[n]; + for (int i=0; i(n, distmat, members, Z2); + delete[] members; + } + else if (method == HCLUST_METHOD_MEDIAN) { + // best median distance (beware: O(n^3)) + generic_linkage(n, distmat, NULL, Z2); + } + else if (method == HCLUST_METHOD_CENTROID) { + // best centroid distance (beware: O(n^3)) + double* members = new double[n]; + for (int i=0; i(n, distmat, members, Z2); + delete[] members; + } + else { + return 1; + } + + int* order = new int[n]; + if (method == HCLUST_METHOD_MEDIAN || method == HCLUST_METHOD_CENTROID) { + generate_R_dendrogram(merge, height, order, Z2, n); + } else { + generate_R_dendrogram(merge, height, order, Z2, n); + } + delete[] order; // only needed for visualization + + return 0; + } + + + // Build condensed distance matrix + // Input arguments: + // n = number of observables + // m = dimension of observable + // Output arguments: + // out = allocated integer array of size n * (n - 1) / 2 for result + void hclust_pdist(int n, int m, double* pts, double* out) { + int ii = 0; + for (int i = 0; i < n; i++){ + for (int j = i + 1; j < n; j++){ + // Compute euclidian distance + double d = 0; + for (int k = 0; k < m; k ++){ + double error = pts[i * m + k] - pts[j * m + k]; + d += (error * error); + } + out[ii] = d;//sqrt(d); + ii++; + } + } + } + + void cluster_points_centroid(int n, int m, double* pts, double dist, int* idx) { + double* pdist = new double[n * (n - 1) / 2]; + int* merge = new int[2 * (n - 1)]; + double* height = new double[n - 1]; + + hclust_pdist(n, m, pts, pdist); + hclust_fast(n, pdist, HCLUST_METHOD_CENTROID, merge, height); + cutree_cdist(n, merge, height, dist, idx); + + delete[] pdist; + delete[] merge; + delete[] height; + } +} diff --git a/selfdrive/controls/lib/cluster/fastcluster.h b/selfdrive/controls/lib/cluster/fastcluster.h new file mode 100644 index 000000000..56c63b6a5 --- /dev/null +++ b/selfdrive/controls/lib/cluster/fastcluster.h @@ -0,0 +1,77 @@ +// +// C++ standalone verion of fastcluster by Daniel Muellner +// +// Copyright: Daniel Muellner, 2011 +// Christoph Dalitz, 2018 +// License: BSD style license +// (see the file LICENSE for details) +// + +#ifndef fastclustercpp_H +#define fastclustercpp_H + +// +// Assigns cluster labels (0, ..., nclust-1) to the n points such +// that the cluster result is split into nclust clusters. +// +// Input arguments: +// n = number of observables +// merge = clustering result in R format +// nclust = number of clusters +// Output arguments: +// labels = allocated integer array of size n for result +// +void cutree_k(int n, const int* merge, int nclust, int* labels); + +// +// Assigns cluster labels (0, ..., nclust-1) to the n points such +// that the hierarchical clsutering is stopped at cluster distance cdist +// +// Input arguments: +// n = number of observables +// merge = clustering result in R format +// height = cluster distance at each merge step +// cdist = cutoff cluster distance +// Output arguments: +// labels = allocated integer array of size n for result +// +void cutree_cdist(int n, const int* merge, double* height, double cdist, int* labels); + +// +// Hierarchical clustering with one of Daniel Muellner's fast algorithms +// +// Input arguments: +// n = number of observables +// distmat = condensed distance matrix, i.e. an n*(n-1)/2 array representing +// the upper triangle (without diagonal elements) of the distance +// matrix, e.g. for n=4: +// d00 d01 d02 d03 +// d10 d11 d12 d13 -> d01 d02 d03 d12 d13 d23 +// d20 d21 d22 d23 +// d30 d31 d32 d33 +// method = cluster metric (see enum method_code) +// Output arguments: +// merge = allocated (n-1)x2 matrix (2*(n-1) array) for storing result. +// Result follows R hclust convention: +// - observabe indices start with one +// - merge[i][] contains the merged nodes in step i +// - merge[i][j] is negative when the node is an atom +// height = allocated (n-1) array with distances at each merge step +// Return code: +// 0 = ok +// 1 = invalid method +// +int hclust_fast(int n, double* distmat, int method, int* merge, double* height); +enum hclust_fast_methods { + HCLUST_METHOD_SINGLE = 0, + HCLUST_METHOD_COMPLETE = 1, + HCLUST_METHOD_AVERAGE = 2, + HCLUST_METHOD_MEDIAN = 3, + HCLUST_METHOD_CENTROID = 5, +}; + +void hclust_pdist(int n, int m, double* pts, double* out); +void cluster_points_centroid(int n, int m, double* pts, double dist, int* idx); + + +#endif diff --git a/selfdrive/controls/lib/cluster/fastcluster_R_dm.cpp b/selfdrive/controls/lib/cluster/fastcluster_R_dm.cpp new file mode 100644 index 000000000..cbe126c15 --- /dev/null +++ b/selfdrive/controls/lib/cluster/fastcluster_R_dm.cpp @@ -0,0 +1,115 @@ +// +// Excerpt from fastcluster_R.cpp +// +// Copyright: Daniel Müllner, 2011 +// + +struct pos_node { + t_index pos; + int node; +}; + +void order_nodes(const int N, const int * const merge, const t_index * const node_size, int * const order) { + /* Parameters: + N : number of data points + merge : (N-1)×2 array which specifies the node indices which are + merged in each step of the clustering procedure. + Negative entries -1...-N point to singleton nodes, while + positive entries 1...(N-1) point to nodes which are themselves + parents of other nodes. + node_size : array of node sizes - makes it easier + order : output array of size N + + Runtime: Θ(N) + */ + auto_array_ptr queue(N/2); + + int parent; + int child; + t_index pos = 0; + + queue[0].pos = 0; + queue[0].node = N-2; + t_index idx = 1; + + do { + --idx; + pos = queue[idx].pos; + parent = queue[idx].node; + + // First child + child = merge[parent]; + if (child<0) { // singleton node, write this into the 'order' array. + order[pos] = -child; + ++pos; + } + else { /* compound node: put it on top of the queue and decompose it + in a later iteration. */ + queue[idx].pos = pos; + queue[idx].node = child-1; // convert index-1 based to index-0 based + ++idx; + pos += node_size[child-1]; + } + // Second child + child = merge[parent+N-1]; + if (child<0) { + order[pos] = -child; + } + else { + queue[idx].pos = pos; + queue[idx].node = child-1; + ++idx; + } + } while (idx>0); +} + +#define size_(r_) ( ((r_ +void generate_R_dendrogram(int * const merge, double * const height, int * const order, cluster_result & Z2, const int N) { + // The array "nodes" is a union-find data structure for the cluster + // identites (only needed for unsorted cluster_result input). + union_find nodes(sorted ? 0 : N); + if (!sorted) { + std::stable_sort(Z2[0], Z2[N-1]); + } + + t_index node1, node2; + auto_array_ptr node_size(N-1); + + for (t_index i=0; inode1; + node2 = Z2[i]->node2; + } + else { + node1 = nodes.Find(Z2[i]->node1); + node2 = nodes.Find(Z2[i]->node2); + // Merge the nodes in the union-find data structure by making them + // children of a new node. + nodes.Union(node1, node2); + } + // Sort the nodes in the output array. + if (node1>node2) { + t_index tmp = node1; + node1 = node2; + node2 = tmp; + } + /* Conversion between labeling conventions. + Input: singleton nodes 0,...,N-1 + compound nodes N,...,2N-2 + Output: singleton nodes -1,...,-N + compound nodes 1,...,N + */ + merge[i] = (node1(node1)-1 + : static_cast(node1)-N+1; + merge[i+N-1] = (node2(node2)-1 + : static_cast(node2)-N+1; + height[i] = Z2[i]->dist; + node_size[i] = size_(node1) + size_(node2); + } + + order_nodes(N, merge, node_size, order); +} diff --git a/selfdrive/controls/lib/cluster/fastcluster_dm.cpp b/selfdrive/controls/lib/cluster/fastcluster_dm.cpp new file mode 100644 index 000000000..8834bc24a --- /dev/null +++ b/selfdrive/controls/lib/cluster/fastcluster_dm.cpp @@ -0,0 +1,1794 @@ +/* + fastcluster: Fast hierarchical clustering routines for R and Python + + Copyright © 2011 Daniel Müllner + + + This library implements various fast algorithms for hierarchical, + agglomerative clustering methods: + + (1) Algorithms for the "stored matrix approach": the input is the array of + pairwise dissimilarities. + + MST_linkage_core: single linkage clustering with the "minimum spanning + tree algorithm (Rohlfs) + + NN_chain_core: nearest-neighbor-chain algorithm, suitable for single, + complete, average, weighted and Ward linkage (Murtagh) + + generic_linkage: generic algorithm, suitable for all distance update + formulas (Müllner) + + (2) Algorithms for the "stored data approach": the input are points in a + vector space. + + MST_linkage_core_vector: single linkage clustering for vector data + + generic_linkage_vector: generic algorithm for vector data, suitable for + the Ward, centroid and median methods. + + generic_linkage_vector_alternative: alternative scheme for updating the + nearest neighbors. This method seems faster than "generic_linkage_vector" + for the centroid and median methods but slower for the Ward method. + + All these implementation treat infinity values correctly. They throw an + exception if a NaN distance value occurs. +*/ + +// Older versions of Microsoft Visual Studio do not have the fenv header. +#ifdef _MSC_VER +#if (_MSC_VER == 1500 || _MSC_VER == 1600) +#define NO_INCLUDE_FENV +#endif +#endif +// NaN detection via fenv might not work on systems with software +// floating-point emulation (bug report for Debian armel). +#ifdef __SOFTFP__ +#define NO_INCLUDE_FENV +#endif +#ifdef NO_INCLUDE_FENV +#pragma message("Do not use fenv header.") +#else +#pragma message("Use fenv header. If there is a warning about unknown #pragma STDC FENV_ACCESS, this can be ignored.") +#pragma STDC FENV_ACCESS on +#include +#endif + +#include // for std::pow, std::sqrt +#include // for std::ptrdiff_t +#include // for std::numeric_limits<...>::infinity() +#include // for std::fill_n +#include // for std::runtime_error +#include // for std::string + +#include // also for DBL_MAX, DBL_MIN +#ifndef DBL_MANT_DIG +#error The constant DBL_MANT_DIG could not be defined. +#endif +#define T_FLOAT_MANT_DIG DBL_MANT_DIG + +#ifndef LONG_MAX +#include +#endif +#ifndef LONG_MAX +#error The constant LONG_MAX could not be defined. +#endif +#ifndef INT_MAX +#error The constant INT_MAX could not be defined. +#endif + +#ifndef INT32_MAX +#ifdef _MSC_VER +#if _MSC_VER >= 1600 +#define __STDC_LIMIT_MACROS +#include +#else +typedef __int32 int_fast32_t; +typedef __int64 int64_t; +#endif +#else +#define __STDC_LIMIT_MACROS +#include +#endif +#endif + +#define FILL_N std::fill_n +#ifdef _MSC_VER +#if _MSC_VER < 1600 +#undef FILL_N +#define FILL_N stdext::unchecked_fill_n +#endif +#endif + +// Suppress warnings about (potentially) uninitialized variables. +#ifdef _MSC_VER + #pragma warning (disable:4700) +#endif + +#ifndef HAVE_DIAGNOSTIC +#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ >= 6)) +#define HAVE_DIAGNOSTIC 1 +#endif +#endif + +#ifndef HAVE_VISIBILITY +#if __GNUC__ >= 4 +#define HAVE_VISIBILITY 1 +#endif +#endif + +/* Since the public interface is given by the Python respectively R interface, + * we do not want other symbols than the interface initalization routines to be + * visible in the shared object file. The "visibility" switch is a GCC concept. + * Hiding symbols keeps the relocation table small and decreases startup time. + * See http://gcc.gnu.org/wiki/Visibility + */ +#if HAVE_VISIBILITY +#pragma GCC visibility push(hidden) +#endif + +typedef int_fast32_t t_index; +#ifndef INT32_MAX +#define MAX_INDEX 0x7fffffffL +#else +#define MAX_INDEX INT32_MAX +#endif +#if (LONG_MAX < MAX_INDEX) +#error The integer format "t_index" must not have a greater range than "long int". +#endif +#if (INT_MAX > MAX_INDEX) +#error The integer format "int" must not have a greater range than "t_index". +#endif +typedef double t_float; + +/* Method codes. + + These codes must agree with the METHODS array in fastcluster.R and the + dictionary mthidx in fastcluster.py. +*/ +enum method_codes { + // non-Euclidean methods + METHOD_METR_SINGLE = 0, + METHOD_METR_COMPLETE = 1, + METHOD_METR_AVERAGE = 2, + METHOD_METR_WEIGHTED = 3, + METHOD_METR_WARD = 4, + METHOD_METR_WARD_D = METHOD_METR_WARD, + METHOD_METR_CENTROID = 5, + METHOD_METR_MEDIAN = 6, + METHOD_METR_WARD_D2 = 7, + + MIN_METHOD_CODE = 0, + MAX_METHOD_CODE = 7 +}; + +enum method_codes_vector { + // Euclidean methods + METHOD_VECTOR_SINGLE = 0, + METHOD_VECTOR_WARD = 1, + METHOD_VECTOR_CENTROID = 2, + METHOD_VECTOR_MEDIAN = 3, + + MIN_METHOD_VECTOR_CODE = 0, + MAX_METHOD_VECTOR_CODE = 3 +}; + +// self-destructing array pointer +template +class auto_array_ptr{ +private: + type * ptr; + auto_array_ptr(auto_array_ptr const &); // non construction-copyable + auto_array_ptr& operator=(auto_array_ptr const &); // non copyable +public: + auto_array_ptr() + : ptr(NULL) + { } + template + auto_array_ptr(index const size) + : ptr(new type[size]) + { } + template + auto_array_ptr(index const size, value const val) + : ptr(new type[size]) + { + FILL_N(ptr, size, val); + } + ~auto_array_ptr() { + delete [] ptr; } + void free() { + delete [] ptr; + ptr = NULL; + } + template + void init(index const size) { + ptr = new type [size]; + } + template + void init(index const size, value const val) { + init(size); + FILL_N(ptr, size, val); + } + inline operator type *() const { return ptr; } +}; + +struct node { + t_index node1, node2; + t_float dist; +}; + +inline bool operator< (const node a, const node b) { + return (a.dist < b.dist); +} + +class cluster_result { +private: + auto_array_ptr Z; + t_index pos; + +public: + cluster_result(const t_index size) + : Z(size) + , pos(0) + {} + + void append(const t_index node1, const t_index node2, const t_float dist) { + Z[pos].node1 = node1; + Z[pos].node2 = node2; + Z[pos].dist = dist; + ++pos; + } + + node * operator[] (const t_index idx) const { return Z + idx; } + + /* Define several methods to postprocess the distances. All these functions + are monotone, so they do not change the sorted order of distances. */ + + void sqrt() const { + for (node * ZZ=Z; ZZ!=Z+pos; ++ZZ) { + ZZ->dist = std::sqrt(ZZ->dist); + } + } + + void sqrt(const t_float) const { // ignore the argument + sqrt(); + } + + void sqrtdouble(const t_float) const { // ignore the argument + for (node * ZZ=Z; ZZ!=Z+pos; ++ZZ) { + ZZ->dist = std::sqrt(2*ZZ->dist); + } + } + + #ifdef R_pow + #define my_pow R_pow + #else + #define my_pow std::pow + #endif + + void power(const t_float p) const { + t_float const q = 1/p; + for (node * ZZ=Z; ZZ!=Z+pos; ++ZZ) { + ZZ->dist = my_pow(ZZ->dist,q); + } + } + + void plusone(const t_float) const { // ignore the argument + for (node * ZZ=Z; ZZ!=Z+pos; ++ZZ) { + ZZ->dist += 1; + } + } + + void divide(const t_float denom) const { + for (node * ZZ=Z; ZZ!=Z+pos; ++ZZ) { + ZZ->dist /= denom; + } + } +}; + +class doubly_linked_list { + /* + Class for a doubly linked list. Initially, the list is the integer range + [0, size]. We provide a forward iterator and a method to delete an index + from the list. + + Typical use: for (i=L.start; L succ; + +private: + auto_array_ptr pred; + // Not necessarily private, we just do not need it in this instance. + +public: + doubly_linked_list(const t_index size) + // Initialize to the given size. + : start(0) + , succ(size+1) + , pred(size+1) + { + for (t_index i=0; i(2*N-3-(r_))*(r_)>>1)+(c_)-1] ) +// Z is an ((N-1)x4)-array +#define Z_(_r, _c) (Z[(_r)*4 + (_c)]) + +/* + Lookup function for a union-find data structure. + + The function finds the root of idx by going iteratively through all + parent elements until a root is found. An element i is a root if + nodes[i] is zero. To make subsequent searches faster, the entry for + idx and all its parents is updated with the root element. + */ +class union_find { +private: + auto_array_ptr parent; + t_index nextparent; + +public: + union_find(const t_index size) + : parent(size>0 ? 2*size-1 : 0, 0) + , nextparent(size) + { } + + t_index Find (t_index idx) const { + if (parent[idx] != 0 ) { // a → b + t_index p = idx; + idx = parent[idx]; + if (parent[idx] != 0 ) { // a → b → c + do { + idx = parent[idx]; + } while (parent[idx] != 0); + do { + t_index tmp = parent[p]; + parent[p] = idx; + p = tmp; + } while (parent[p] != idx); + } + } + return idx; + } + + void Union (const t_index node1, const t_index node2) { + parent[node1] = parent[node2] = nextparent++; + } +}; + +class nan_error{}; +#ifdef FE_INVALID +class fenv_error{}; +#endif + +static void MST_linkage_core(const t_index N, const t_float * const D, + cluster_result & Z2) { +/* + N: integer, number of data points + D: condensed distance matrix N*(N-1)/2 + Z2: output data structure + + The basis of this algorithm is an algorithm by Rohlf: + + F. James Rohlf, Hierarchical clustering using the minimum spanning tree, + The Computer Journal, vol. 16, 1973, p. 93–95. +*/ + t_index i; + t_index idx2; + doubly_linked_list active_nodes(N); + auto_array_ptr d(N); + + t_index prev_node; + t_float min; + + // first iteration + idx2 = 1; + min = std::numeric_limits::infinity(); + for (i=1; i tmp) + d[i] = tmp; + else if (fc_isnan(tmp)) + throw (nan_error()); +#if HAVE_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + if (d[i] < min) { + min = d[i]; + idx2 = i; + } + } + Z2.append(prev_node, idx2, min); + } +} + +/* Functions for the update of the dissimilarity array */ + +inline static void f_single( t_float * const b, const t_float a ) { + if (*b > a) *b = a; +} +inline static void f_complete( t_float * const b, const t_float a ) { + if (*b < a) *b = a; +} +inline static void f_average( t_float * const b, const t_float a, const t_float s, const t_float t) { + *b = s*a + t*(*b); + #ifndef FE_INVALID +#if HAVE_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (fc_isnan(*b)) { + throw(nan_error()); + } +#if HAVE_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + #endif +} +inline static void f_weighted( t_float * const b, const t_float a) { + *b = (a+*b)*.5; + #ifndef FE_INVALID +#if HAVE_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (fc_isnan(*b)) { + throw(nan_error()); + } +#if HAVE_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + #endif +} +inline static void f_ward( t_float * const b, const t_float a, const t_float c, const t_float s, const t_float t, const t_float v) { + *b = ( (v+s)*a - v*c + (v+t)*(*b) ) / (s+t+v); + //*b = a+(*b)-(t*a+s*(*b)+v*c)/(s+t+v); + #ifndef FE_INVALID +#if HAVE_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (fc_isnan(*b)) { + throw(nan_error()); + } +#if HAVE_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + #endif +} +inline static void f_centroid( t_float * const b, const t_float a, const t_float stc, const t_float s, const t_float t) { + *b = s*a - stc + t*(*b); + #ifndef FE_INVALID + if (fc_isnan(*b)) { + throw(nan_error()); + } +#if HAVE_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + #endif +} +inline static void f_median( t_float * const b, const t_float a, const t_float c_4) { + *b = (a+(*b))*.5 - c_4; + #ifndef FE_INVALID +#if HAVE_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (fc_isnan(*b)) { + throw(nan_error()); + } +#if HAVE_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + #endif +} + +template +static void NN_chain_core(const t_index N, t_float * const D, t_members * const members, cluster_result & Z2) { +/* + N: integer + D: condensed distance matrix N*(N-1)/2 + Z2: output data structure + + This is the NN-chain algorithm, described on page 86 in the following book: + + Fionn Murtagh, Multidimensional Clustering Algorithms, + Vienna, Würzburg: Physica-Verlag, 1985. +*/ + t_index i; + + auto_array_ptr NN_chain(N); + t_index NN_chain_tip = 0; + + t_index idx1, idx2; + + t_float size1, size2; + doubly_linked_list active_nodes(N); + + t_float min; + + for (t_float const * DD=D; DD!=D+(static_cast(N)*(N-1)>>1); + ++DD) { +#if HAVE_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + if (fc_isnan(*DD)) { + throw(nan_error()); + } +#if HAVE_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + } + + #ifdef FE_INVALID + if (feclearexcept(FE_INVALID)) throw fenv_error(); + #endif + + for (t_index j=0; jidx2) { + t_index tmp = idx1; + idx1 = idx2; + idx2 = tmp; + } + + if (method==METHOD_METR_AVERAGE || + method==METHOD_METR_WARD) { + size1 = static_cast(members[idx1]); + size2 = static_cast(members[idx2]); + members[idx2] += members[idx1]; + } + + // Remove the smaller index from the valid indices (active_nodes). + active_nodes.remove(idx1); + + switch (method) { + case METHOD_METR_SINGLE: + /* + Single linkage. + + Characteristic: new distances are never longer than the old distances. + */ + // Update the distance matrix in the range [start, idx1). + for (i=active_nodes.start; i(members[i]); + for (i=active_nodes.start; i(members[i]) ); + // Update the distance matrix in the range (idx1, idx2). + for (; i(members[i]) ); + // Update the distance matrix in the range (idx2, N). + for (i=active_nodes.succ[idx2]; i(members[i]) ); + break; + + default: + throw std::runtime_error(std::string("Invalid method.")); + } + } + #ifdef FE_INVALID + if (fetestexcept(FE_INVALID)) throw fenv_error(); + #endif +} + +class binary_min_heap { + /* + Class for a binary min-heap. The data resides in an array A. The elements of + A are not changed but two lists I and R of indices are generated which point + to elements of A and backwards. + + The heap tree structure is + + H[2*i+1] H[2*i+2] + \ / + \ / + ≤ ≤ + \ / + \ / + H[i] + + where the children must be less or equal than their parent. Thus, H[0] + contains the minimum. The lists I and R are made such that H[i] = A[I[i]] + and R[I[i]] = i. + + This implementation is not designed to handle NaN values. + */ +private: + t_float * const A; + t_index size; + auto_array_ptr I; + auto_array_ptr R; + + // no default constructor + binary_min_heap(); + // noncopyable + binary_min_heap(binary_min_heap const &); + binary_min_heap & operator=(binary_min_heap const &); + +public: + binary_min_heap(t_float * const A_, const t_index size_) + : A(A_), size(size_), I(size), R(size) + { // Allocate memory and initialize the lists I and R to the identity. This + // does not make it a heap. Call heapify afterwards! + for (t_index i=0; i>1); idx>0; ) { + --idx; + update_geq_(idx); + } + } + + inline t_index argmin() const { + // Return the minimal element. + return I[0]; + } + + void heap_pop() { + // Remove the minimal element from the heap. + --size; + I[0] = I[size]; + R[I[0]] = 0; + update_geq_(0); + } + + void remove(t_index idx) { + // Remove an element from the heap. + --size; + R[I[size]] = R[idx]; + I[R[idx]] = I[size]; + if ( H(size)<=A[idx] ) { + update_leq_(R[idx]); + } + else { + update_geq_(R[idx]); + } + } + + void replace ( const t_index idxold, const t_index idxnew, + const t_float val) { + R[idxnew] = R[idxold]; + I[R[idxnew]] = idxnew; + if (val<=A[idxold]) + update_leq(idxnew, val); + else + update_geq(idxnew, val); + } + + void update ( const t_index idx, const t_float val ) const { + // Update the element A[i] with val and re-arrange the indices to preserve + // the heap condition. + if (val<=A[idx]) + update_leq(idx, val); + else + update_geq(idx, val); + } + + void update_leq ( const t_index idx, const t_float val ) const { + // Use this when the new value is not more than the old value. + A[idx] = val; + update_leq_(R[idx]); + } + + void update_geq ( const t_index idx, const t_float val ) const { + // Use this when the new value is not less than the old value. + A[idx] = val; + update_geq_(R[idx]); + } + +private: + void update_leq_ (t_index i) const { + t_index j; + for ( ; (i>0) && ( H(i)>1) ); i=j) + heap_swap(i,j); + } + + void update_geq_ (t_index i) const { + t_index j; + for ( ; (j=2*i+1)=H(i) ) { + ++j; + if ( j>=size || H(j)>=H(i) ) break; + } + else if ( j+1 +static void generic_linkage(const t_index N, t_float * const D, t_members * const members, cluster_result & Z2) { + /* + N: integer, number of data points + D: condensed distance matrix N*(N-1)/2 + Z2: output data structure + */ + + const t_index N_1 = N-1; + t_index i, j; // loop variables + t_index idx1, idx2; // row and column indices + + auto_array_ptr n_nghbr(N_1); // array of nearest neighbors + auto_array_ptr mindist(N_1); // distances to the nearest neighbors + auto_array_ptr row_repr(N); // row_repr[i]: node number that the + // i-th row represents + doubly_linked_list active_nodes(N); + binary_min_heap nn_distances(&*mindist, N_1); // minimum heap structure for + // the distance to the nearest neighbor of each point + t_index node1, node2; // node numbers in the output + t_float size1, size2; // and their cardinalities + + t_float min; // minimum and row index for nearest-neighbor search + t_index idx; + + for (i=0; ii} D(i,j) for i in range(N-1) + t_float const * DD = D; + for (i=0; i::infinity(); + for (idx=j=i+1; ji} D(i,j) + + Normally, we have equality. However, this minimum may become invalid due + to the updates in the distance matrix. The rules are: + + 1) If mindist[i] is equal to D(i, n_nghbr[i]), this is the correct + minimum and n_nghbr[i] is a nearest neighbor. + + 2) If mindist[i] is smaller than D(i, n_nghbr[i]), this might not be the + correct minimum. The minimum needs to be recomputed. + + 3) mindist[i] is never bigger than the true minimum. Hence, we never + miss the true minimum if we take the smallest mindist entry, + re-compute the value if necessary (thus maybe increasing it) and + looking for the now smallest mindist entry until a valid minimal + entry is found. This step is done in the lines below. + + The update process for D below takes care that these rules are + fulfilled. This makes sure that the minima in the rows D(i,i+1:)of D are + re-calculated when necessary but re-calculation is avoided whenever + possible. + + The re-calculation of the minima makes the worst-case runtime of this + algorithm cubic in N. We avoid this whenever possible, and in most cases + the runtime appears to be quadratic. + */ + idx1 = nn_distances.argmin(); + if (method != METHOD_METR_SINGLE) { + while ( mindist[idx1] < D_(idx1, n_nghbr[idx1]) ) { + // Recompute the minimum mindist[idx1] and n_nghbr[idx1]. + n_nghbr[idx1] = j = active_nodes.succ[idx1]; // exists, maximally N-1 + min = D_(idx1,j); + for (j=active_nodes.succ[j]; j(members[idx1]); + size2 = static_cast(members[idx2]); + members[idx2] += members[idx1]; + } + Z2.append(node1, node2, mindist[idx1]); + + // Remove idx1 from the list of active indices (active_nodes). + active_nodes.remove(idx1); + // Index idx2 now represents the new (merged) node with label N+i. + row_repr[idx2] = N+i; + + // Update the distance matrix + switch (method) { + case METHOD_METR_SINGLE: + /* + Single linkage. + + Characteristic: new distances are never longer than the old distances. + */ + // Update the distance matrix in the range [start, idx1). + for (j=active_nodes.start; j(members[j]) ); + if (n_nghbr[j] == idx1) + n_nghbr[j] = idx2; + } + // Update the distance matrix in the range (idx1, idx2). + for (; j(members[j]) ); + if (D_(j, idx2) < mindist[j]) { + nn_distances.update_leq(j, D_(j, idx2)); + n_nghbr[j] = idx2; + } + } + // Update the distance matrix in the range (idx2, N). + if (idx2(members[j]) ); + min = D_(idx2,j); + for (j=active_nodes.succ[j]; j(members[j]) ); + if (D_(idx2,j) < min) { + min = D_(idx2,j); + n_nghbr[idx2] = j; + } + } + nn_distances.update(idx2, min); + } + break; + + case METHOD_METR_CENTROID: { + /* + Centroid linkage. + + Shorter and longer distances can occur, not bigger than max(d1,d2) + but maybe smaller than min(d1,d2). + */ + // Update the distance matrix in the range [start, idx1). + t_float s = size1/(size1+size2); + t_float t = size2/(size1+size2); + t_float stc = s*t*mindist[idx1]; + for (j=active_nodes.start; j +static void MST_linkage_core_vector(const t_index N, + t_dissimilarity & dist, + cluster_result & Z2) { +/* + N: integer, number of data points + dist: function pointer to the metric + Z2: output data structure + + The basis of this algorithm is an algorithm by Rohlf: + + F. James Rohlf, Hierarchical clustering using the minimum spanning tree, + The Computer Journal, vol. 16, 1973, p. 93–95. +*/ + t_index i; + t_index idx2; + doubly_linked_list active_nodes(N); + auto_array_ptr d(N); + + t_index prev_node; + t_float min; + + // first iteration + idx2 = 1; + min = std::numeric_limits::infinity(); + for (i=1; i tmp) + d[i] = tmp; + else if (fc_isnan(tmp)) + throw (nan_error()); +#if HAVE_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + if (d[i] < min) { + min = d[i]; + idx2 = i; + } + } + Z2.append(prev_node, idx2, min); + } +} + +template +static void generic_linkage_vector(const t_index N, + t_dissimilarity & dist, + cluster_result & Z2) { + /* + N: integer, number of data points + dist: function pointer to the metric + Z2: output data structure + + This algorithm is valid for the distance update methods + "Ward", "centroid" and "median" only! + */ + const t_index N_1 = N-1; + t_index i, j; // loop variables + t_index idx1, idx2; // row and column indices + + auto_array_ptr n_nghbr(N_1); // array of nearest neighbors + auto_array_ptr mindist(N_1); // distances to the nearest neighbors + auto_array_ptr row_repr(N); // row_repr[i]: node number that the + // i-th row represents + doubly_linked_list active_nodes(N); + binary_min_heap nn_distances(&*mindist, N_1); // minimum heap structure for + // the distance to the nearest neighbor of each point + t_index node1, node2; // node numbers in the output + t_float min; // minimum and row index for nearest-neighbor search + + for (i=0; ii} D(i,j) for i in range(N-1) + for (i=0; i::infinity(); + t_index idx; + for (idx=j=i+1; j(i,j); + } + if (tmp(idx1,j); + for (j=active_nodes.succ[j]; j(idx1,j); + if (tmp(j, idx2); + if (tmp < mindist[j]) { + nn_distances.update_leq(j, tmp); + n_nghbr[j] = idx2; + } + else if (n_nghbr[j] == idx2) + n_nghbr[j] = idx1; // invalidate + } + // Find the nearest neighbor for idx2. + if (idx2(idx2,j); + for (j=active_nodes.succ[j]; j(idx2, j); + if (tmp < min) { + min = tmp; + n_nghbr[idx2] = j; + } + } + nn_distances.update(idx2, min); + } + } + } +} + +template +static void generic_linkage_vector_alternative(const t_index N, + t_dissimilarity & dist, + cluster_result & Z2) { + /* + N: integer, number of data points + dist: function pointer to the metric + Z2: output data structure + + This algorithm is valid for the distance update methods + "Ward", "centroid" and "median" only! + */ + const t_index N_1 = N-1; + t_index i, j=0; // loop variables + t_index idx1, idx2; // row and column indices + + auto_array_ptr n_nghbr(2*N-2); // array of nearest neighbors + auto_array_ptr mindist(2*N-2); // distances to the nearest neighbors + + doubly_linked_list active_nodes(N+N_1); + binary_min_heap nn_distances(&*mindist, N_1, 2*N-2, 1); // minimum heap + // structure for the distance to the nearest neighbor of each point + + t_float min; // minimum for nearest-neighbor searches + + // Initialize the minimal distances: + // Find the nearest neighbor of each point. + // n_nghbr[i] = argmin_{j>i} D(i,j) for i in range(N-1) + for (i=1; i::infinity(); + t_index idx; + for (idx=j=0; j(i,j); + } + if (tmp + +extern "C" { +#include "fastcluster.h" +} + + +int main(int argc, const char* argv[]){ + const int n = 11; + const int m = 3; + double* pts = new double[n*m]{59.26000137, -9.35999966, -5.42500019, + 91.61999817, -0.31999999, -2.75, + 31.38000031, 0.40000001, -0.2, + 89.57999725, -8.07999992, -18.04999924, + 53.42000122, 0.63999999, -0.175, + 31.38000031, 0.47999999, -0.2, + 36.33999939, 0.16, -0.2, + 53.33999939, 0.95999998, -0.175, + 59.26000137, -9.76000023, -5.44999981, + 33.93999977, 0.40000001, -0.22499999, + 106.74000092, -5.76000023, -18.04999924}; + + int * idx = new int[n]; + int * correct_idx = new int[n]{0, 1, 2, 3, 4, 2, 5, 4, 0, 5, 6}; + + cluster_points_centroid(n, m, pts, 2.5 * 2.5, idx); + + for (int i = 0; i < n; i++){ + assert(idx[i] == correct_idx[i]); + } + + delete[] idx; + delete[] correct_idx; + delete[] pts; +} diff --git a/selfdrive/controls/lib/latcontrol_indi.py b/selfdrive/controls/lib/latcontrol_indi.py index 2e95489bc..28e37b9e2 100644 --- a/selfdrive/controls/lib/latcontrol_indi.py +++ b/selfdrive/controls/lib/latcontrol_indi.py @@ -51,7 +51,7 @@ class LatControlINDI(object): y = np.matrix([[math.radians(angle_steers)], [math.radians(angle_steers_rate)]]) self.x = np.dot(self.A_K, self.x) + np.dot(self.K, y) - indi_log = log.Live100Data.LateralINDIState.new_message() + indi_log = log.ControlsState.LateralINDIState.new_message() indi_log.steerAngle = math.degrees(self.x[0]) indi_log.steerRate = math.degrees(self.x[1]) indi_log.steerAccel = math.degrees(self.x[2]) diff --git a/selfdrive/controls/lib/latcontrol_pid.py b/selfdrive/controls/lib/latcontrol_pid.py index 600990aaa..446806239 100644 --- a/selfdrive/controls/lib/latcontrol_pid.py +++ b/selfdrive/controls/lib/latcontrol_pid.py @@ -15,7 +15,7 @@ class LatControlPID(object): self.pid.reset() def update(self, active, v_ego, angle_steers, angle_steers_rate, steer_override, CP, VM, path_plan): - pid_log = log.Live100Data.LateralPIDState.new_message() + pid_log = log.ControlsState.LateralPIDState.new_message() pid_log.steerAngle = float(angle_steers) pid_log.steerRate = float(angle_steers_rate) diff --git a/selfdrive/controls/lib/longcontrol.py b/selfdrive/controls/lib/longcontrol.py index 0b1eefea7..84c17ef37 100644 --- a/selfdrive/controls/lib/longcontrol.py +++ b/selfdrive/controls/lib/longcontrol.py @@ -2,7 +2,7 @@ from cereal import log from common.numpy_fast import clip, interp from selfdrive.controls.lib.pid import PIController -LongCtrlState = log.Live100Data.LongControlState +LongCtrlState = log.ControlsState.LongControlState STOPPING_EGO_SPEED = 0.5 MIN_CAN_SPEED = 0.3 # TODO: parametrize this in car interface diff --git a/selfdrive/controls/lib/pathplanner.py b/selfdrive/controls/lib/pathplanner.py index 5a0330ff2..f3cdffdfd 100644 --- a/selfdrive/controls/lib/pathplanner.py +++ b/selfdrive/controls/lib/pathplanner.py @@ -20,10 +20,10 @@ def calc_states_after_delay(states, v_ego, steer_angle, curvature_factor, steer_ class PathPlanner(object): def __init__(self, CP): self.MP = ModelParser() - + self.l_poly = [0., 0., 0., 0.] self.r_poly = [0., 0., 0., 0.] - + self.last_cloudlog_t = 0 context = zmq.Context() @@ -49,13 +49,13 @@ class PathPlanner(object): self.angle_steers_des_prev = 0.0 self.angle_steers_des_time = 0.0 - def update(self, rcv_times, CP, VM, CS, md, live100, live_parameters): + def update(self, rcv_times, CP, VM, CS, md, controls_state, live_parameters): v_ego = CS.carState.vEgo angle_steers = CS.carState.steeringAngle - active = live100.live100.active + active = controls_state.controlsState.active angle_offset_average = live_parameters.liveParameters.angleOffsetAverage - angle_offset_bias = live100.live100.angleModelBias + angle_offset_average + angle_offset_bias = controls_state.controlsState.angleModelBias + angle_offset_average self.MP.update(v_ego, md) @@ -123,6 +123,7 @@ class PathPlanner(object): plan_send.pathPlan.angleOffset = float(angle_offset_average) plan_send.pathPlan.valid = bool(plan_valid) plan_send.pathPlan.paramsValid = bool(live_parameters.liveParameters.valid) + plan_send.pathPlan.sensorValid = bool(live_parameters.liveParameters.sensorValid) plan_send.pathPlan.modelValid = bool(not model_dead) self.plan.send(plan_send.to_bytes()) diff --git a/selfdrive/controls/lib/planner.py b/selfdrive/controls/lib/planner.py index f4b2bf88c..c8c3d1805 100755 --- a/selfdrive/controls/lib/planner.py +++ b/selfdrive/controls/lib/planner.py @@ -114,18 +114,18 @@ class Planner(object): self.v_acc_future = min([self.mpc1.v_mpc_future, self.mpc2.v_mpc_future, v_cruise_setpoint]) - def update(self, rcv_times, CS, CP, VM, PP, live20, live100, md, live_map_data): - """Gets called when new live20 is available""" + def update(self, rcv_times, CS, CP, VM, PP, radar_state, controls_state, md, live_map_data): + """Gets called when new radarState is available""" cur_time = sec_since_boot() v_ego = CS.carState.vEgo - long_control_state = live100.live100.longControlState - v_cruise_kph = live100.live100.vCruise - force_slow_decel = live100.live100.forceDecel + long_control_state = controls_state.controlsState.longControlState + v_cruise_kph = controls_state.controlsState.vCruise + force_slow_decel = controls_state.controlsState.forceDecel v_cruise_setpoint = v_cruise_kph * CV.KPH_TO_MS - lead_1 = live20.live20.leadOne - lead_2 = live20.live20.leadTwo + lead_1 = radar_state.radarState.leadOne + lead_2 = radar_state.radarState.leadTwo enabled = (long_control_state == LongCtrlState.pid) or (long_control_state == LongCtrlState.stopping) following = lead_1.status and lead_1.dRel < 45.0 and lead_1.vLeadK > v_ego and lead_1.aLeadK > 0.0 @@ -209,18 +209,18 @@ class Planner(object): if fcw: cloudlog.info("FCW triggered %s", self.fcw_checker.counters) - radar_dead = cur_time - rcv_times['live20'] > 0.5 + radar_dead = cur_time - rcv_times['radarState'] > 0.5 - radar_errors = list(live20.live20.radarErrors) - radar_fault = car.RadarState.Error.fault in radar_errors - radar_comm_issue = car.RadarState.Error.commIssue in radar_errors + radar_errors = list(radar_state.radarState.radarErrors) + radar_fault = car.RadarData.Error.fault in radar_errors + radar_comm_issue = car.RadarData.Error.commIssue in radar_errors # **** send the plan **** plan_send = messaging.new_message() plan_send.init('plan') plan_send.plan.mdMonoTime = md.logMonoTime - plan_send.plan.l20MonoTime = live20.logMonoTime + plan_send.plan.radarStateMonoTime = radar_state.logMonoTime # longitudal plan plan_send.plan.vCruise = self.v_cruise @@ -241,7 +241,7 @@ class Planner(object): plan_send.plan.radarValid = bool(radar_valid) plan_send.plan.radarCommIssue = bool(radar_comm_issue) - plan_send.plan.processingDelay = (plan_send.logMonoTime / 1e9) - rcv_times['live20'] + plan_send.plan.processingDelay = (plan_send.logMonoTime / 1e9) - rcv_times['radarState'] # Send out fcw fcw = fcw and (self.fcw_enabled or long_control_state != LongCtrlState.off) diff --git a/selfdrive/controls/lib/radar_helpers.py b/selfdrive/controls/lib/radar_helpers.py index 99f34dfd5..7efb9f334 100644 --- a/selfdrive/controls/lib/radar_helpers.py +++ b/selfdrive/controls/lib/radar_helpers.py @@ -1,6 +1,3 @@ -import os -import sys -import platform import numpy as np from common.numpy_fast import clip, interp @@ -121,27 +118,6 @@ class Track(object): return [self.dRel, self.yRel*2, self.vRel] -# ******************* Cluster ******************* -if platform.machine() == 'aarch64': - for x in sys.path: - pp = os.path.join(x, "phonelibs/hierarchy/lib") - if os.path.isfile(os.path.join(pp, "_hierarchy.so")): - sys.path.append(pp) - break - import _hierarchy #pylint: disable=import-error -else: - from scipy.cluster import _hierarchy - - -def fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None): - # supersimplified function to get fast clustering. Got it from scipy - Z = np.asarray(Z, order='c') - n = Z.shape[0] + 1 - T = np.zeros((n,), dtype='i') - _hierarchy.cluster_dist(Z, T, float(t), int(n)) - return T - - def mean(l): return sum(l) / len(l) @@ -215,7 +191,7 @@ class Cluster(object): def oncoming(self): return all([t.oncoming for t in self.tracks]) - def toLive20(self): + def toRadarState(self): return { "dRel": float(self.dRel) - RDR_TO_LDR, "yRel": float(self.yRel), diff --git a/selfdrive/controls/plannerd.py b/selfdrive/controls/plannerd.py index 5946f6192..c152d01fd 100755 --- a/selfdrive/controls/plannerd.py +++ b/selfdrive/controls/plannerd.py @@ -1,10 +1,11 @@ #!/usr/bin/env python +import gc import zmq from collections import defaultdict from cereal import car from common.params import Params -from common.realtime import sec_since_boot +from common.realtime import sec_since_boot, set_realtime_priority from selfdrive.swaglog import cloudlog from selfdrive.services import service_list from selfdrive.controls.lib.planner import Planner @@ -14,6 +15,11 @@ import selfdrive.messaging as messaging def plannerd_thread(): + gc.disable() + + # start the loop + set_realtime_priority(2) + context = zmq.Context() params = Params() @@ -31,26 +37,27 @@ def plannerd_thread(): poller = zmq.Poller() car_state_sock = messaging.sub_sock(context, service_list['carState'].port, conflate=True, poller=poller) - live100_sock = messaging.sub_sock(context, service_list['live100'].port, conflate=True, poller=poller) - live20_sock = messaging.sub_sock(context, service_list['live20'].port, conflate=True, poller=poller) + controls_state_sock = messaging.sub_sock(context, service_list['controlsState'].port, conflate=True, poller=poller) + radar_state_sock = messaging.sub_sock(context, service_list['radarState'].port, conflate=True, poller=poller) model_sock = messaging.sub_sock(context, service_list['model'].port, conflate=True, poller=poller) - live_map_data_sock = messaging.sub_sock(context, service_list['liveMapData'].port, conflate=True, poller=poller) live_parameters_sock = messaging.sub_sock(context, service_list['liveParameters'].port, conflate=True, poller=poller) + # live_map_data_sock = messaging.sub_sock(context, service_list['liveMapData'].port, conflate=True, poller=poller) car_state = messaging.new_message() car_state.init('carState') - live100 = messaging.new_message() - live100.init('live100') + controls_state = messaging.new_message() + controls_state.init('controlsState') model = messaging.new_message() model.init('model') - live20 = messaging.new_message() - live20.init('live20') + radar_state = messaging.new_message() + radar_state.init('radarState') live_map_data = messaging.new_message() live_map_data.init('liveMapData') live_parameters = messaging.new_message() live_parameters.init('liveParameters') live_parameters.liveParameters.valid = True + live_parameters.liveParameters.sensorValid = True live_parameters.liveParameters.steerRatio = CP.steerRatio live_parameters.liveParameters.stiffnessFactor = 1.0 @@ -61,20 +68,20 @@ def plannerd_thread(): msg = messaging.recv_one(socket) rcv_times[msg.which()] = sec_since_boot() - if socket is live100_sock: - live100 = msg + if socket is controls_state_sock: + controls_state = msg elif socket is car_state_sock: car_state = msg elif socket is live_parameters_sock: live_parameters = msg elif socket is model_sock: model = msg - PP.update(rcv_times, CP, VM, car_state, model, live100, live_parameters) - elif socket is live_map_data_sock: - live_map_data = msg - elif socket is live20_sock: - live20 = msg - PL.update(rcv_times, car_state, CP, VM, PP, live20, live100, model, live_map_data) + PP.update(rcv_times, CP, VM, car_state, model, controls_state, live_parameters) + elif socket is radar_state_sock: + radar_state = msg + PL.update(rcv_times, car_state, CP, VM, PP, radar_state, controls_state, model, live_map_data) + # elif socket is live_map_data_sock: + # live_map_data = msg def main(gctx=None): diff --git a/selfdrive/controls/radard.py b/selfdrive/controls/radard.py index 46d12ae8d..c4c135c1c 100755 --- a/selfdrive/controls/radard.py +++ b/selfdrive/controls/radard.py @@ -4,14 +4,15 @@ import numpy as np import numpy.matlib import importlib from collections import defaultdict, deque -from fastcluster import linkage_vector import selfdrive.messaging as messaging from selfdrive.services import service_list from selfdrive.controls.lib.latcontrol_helpers import calc_lookahead_offset from selfdrive.controls.lib.model_parser import ModelParser -from selfdrive.controls.lib.radar_helpers import Track, Cluster, fcluster, \ +from selfdrive.controls.lib.radar_helpers import Track, Cluster, \ RDR_TO_LDR, NO_FUSION_SCORE + +from selfdrive.controls.lib.cluster.fastcluster_py import cluster_points_centroid from selfdrive.controls.lib.vehicle_model import VehicleModel from selfdrive.swaglog import cloudlog from cereal import car @@ -45,8 +46,6 @@ class EKFV1D(EKF): ## fuses camera and radar data for best lead detection -# FIXME: radard has a memory leak of about 50MB/hr -# BOUNTY: $100 coupon on shop.comma.ai def radard_thread(gctx=None): set_realtime_priority(2) @@ -65,7 +64,7 @@ def radard_thread(gctx=None): # *** subscribe to features and model from visiond poller = zmq.Poller() model = messaging.sub_sock(context, service_list['model'].port, conflate=True, poller=poller) - live100 = messaging.sub_sock(context, service_list['live100'].port, conflate=True, poller=poller) + controls_state_sock = messaging.sub_sock(context, service_list['controlsState'].port, conflate=True, poller=poller) live_parameters_sock = messaging.sub_sock(context, service_list['liveParameters'].port, conflate=True, poller=poller) # Default parameters @@ -79,10 +78,10 @@ def radard_thread(gctx=None): RI = RadarInterface(CP) last_md_ts = 0 - last_l100_ts = 0 + last_controls_state_ts = 0 - # *** publish live20 and liveTracks - live20 = messaging.pub_sock(context, service_list['live20'].port) + # *** publish radarState and liveTracks + radarState = messaging.pub_sock(context, service_list['radarState'].port) liveTracks = messaging.pub_sock(context, service_list['liveTracks'].port) path_x = np.arange(0.0, 140.0, 0.1) # 140 meters is max @@ -108,7 +107,7 @@ def radard_thread(gctx=None): v_ego_hist_v = deque(maxlen=v_len) v_ego_t_aligned = 0. - rk = Ratekeeper(rate, print_delay_threshold=np.inf) + rk = Ratekeeper(rate, print_delay_threshold=None) while 1: rr = RI.update() @@ -116,29 +115,29 @@ def radard_thread(gctx=None): for pt in rr.points: ar_pts[pt.trackId] = [pt.dRel + RDR_TO_LDR, pt.yRel, pt.vRel, pt.measured] - # receive the live100s - l100 = None + # receive the controlsStates + controls_state = None md = None for socket, event in poller.poll(0): - if socket is live100: - l100 = messaging.recv_one(socket) + if socket is controls_state_sock: + controls_state = messaging.recv_one(socket) elif socket is model: md = messaging.recv_one(socket) elif socket is live_parameters_sock: live_parameters = messaging.recv_one(socket) VM.update_params(live_parameters.liveParameters.stiffnessFactor, live_parameters.liveParameters.steerRatio) - if l100 is not None: - active = l100.live100.active - v_ego = l100.live100.vEgo - steer_angle = l100.live100.angleSteers - steer_override = l100.live100.steerOverride + if controls_state is not None: + active = controls_state.controlsState.active + v_ego = controls_state.controlsState.vEgo + steer_angle = controls_state.controlsState.angleSteers + steer_override = controls_state.controlsState.steerOverride v_ego_hist_v.append(v_ego) v_ego_hist_t.append(float(rk.frame)/rate) - last_l100_ts = l100.logMonoTime + last_controls_state_ts = controls_state.logMonoTime if v_ego is None: continue @@ -231,16 +230,15 @@ def radard_thread(gctx=None): # If we have multiple points, cluster them if len(track_pts) > 1: - link = linkage_vector(track_pts, method='centroid') - cluster_idxs = fcluster(link, 2.5, criterion='distance') - clusters = [None]*max(cluster_idxs) + cluster_idxs = cluster_points_centroid(track_pts, 2.5) + clusters = [None] * (max(cluster_idxs) + 1) for idx in xrange(len(track_pts)): - cluster_i = cluster_idxs[idx]-1 - - if clusters[cluster_i] == None: + cluster_i = cluster_idxs[idx] + if clusters[cluster_i] is None: clusters[cluster_i] = Cluster() clusters[cluster_i].add(tracks[idens[idx]]) + elif len(track_pts) == 1: # TODO: why do we need this? clusters = [Cluster()] @@ -263,24 +261,24 @@ def radard_thread(gctx=None): lead2_clusters.sort(key=lambda x: x.dRel) lead2_len = len(lead2_clusters) - # *** publish live20 *** + # *** publish radarState *** dat = messaging.new_message() - dat.init('live20') - dat.live20.mdMonoTime = last_md_ts - dat.live20.canMonoTimes = list(rr.canMonoTimes) - dat.live20.radarErrors = list(rr.errors) - dat.live20.l100MonoTime = last_l100_ts + dat.init('radarState') + dat.radarState.mdMonoTime = last_md_ts + dat.radarState.canMonoTimes = list(rr.canMonoTimes) + dat.radarState.radarErrors = list(rr.errors) + dat.radarState.controlsStateMonoTime = last_controls_state_ts if lead_len > 0: - dat.live20.leadOne = lead_clusters[0].toLive20() + dat.radarState.leadOne = lead_clusters[0].toRadarState() if lead2_len > 0: - dat.live20.leadTwo = lead2_clusters[0].toLive20() + dat.radarState.leadTwo = lead2_clusters[0].toRadarState() else: - dat.live20.leadTwo.status = False + dat.radarState.leadTwo.status = False else: - dat.live20.leadOne.status = False + dat.radarState.leadOne.status = False - dat.live20.cumLagMs = -rk.remaining*1000. - live20.send(dat.to_bytes()) + dat.radarState.cumLagMs = -rk.remaining*1000. + radarState.send(dat.to_bytes()) # *** publish tracks for UI debugging (keep last) *** dat = messaging.new_message() diff --git a/selfdrive/controls/tests/test_clustering.py b/selfdrive/controls/tests/test_clustering.py new file mode 100644 index 000000000..14c0e23fe --- /dev/null +++ b/selfdrive/controls/tests/test_clustering.py @@ -0,0 +1,138 @@ +import time +import unittest +import numpy as np +from fastcluster import linkage_vector +from scipy.cluster import _hierarchy +from scipy.spatial.distance import pdist + +from selfdrive.controls.lib.cluster.fastcluster_py import hclust, ffi +from selfdrive.controls.lib.cluster.fastcluster_py import cluster_points_centroid + + +def fcluster(Z, t, criterion='inconsistent', depth=2, R=None, monocrit=None): + # supersimplified function to get fast clustering. Got it from scipy + Z = np.asarray(Z, order='c') + n = Z.shape[0] + 1 + T = np.zeros((n,), dtype='i') + _hierarchy.cluster_dist(Z, T, float(t), int(n)) + return T + + +TRACK_PTS = np.array([[59.26000137, -9.35999966, -5.42500019], + [91.61999817, -0.31999999, -2.75], + [31.38000031, 0.40000001, -0.2], + [89.57999725, -8.07999992, -18.04999924], + [53.42000122, 0.63999999, -0.175], + [31.38000031, 0.47999999, -0.2], + [36.33999939, 0.16, -0.2], + [53.33999939, 0.95999998, -0.175], + [59.26000137, -9.76000023, -5.44999981], + [33.93999977, 0.40000001, -0.22499999], + [106.74000092, -5.76000023, -18.04999924]]) + +CORRECT_LINK = np.array([[2., 5., 0.07999998, 2.], + [4., 7., 0.32984889, 2.], + [0., 8., 0.40078104, 2.], + [6., 9., 2.41209933, 2.], + [11., 14., 3.76342275, 4.], + [12., 13., 13.02297651, 4.], + [1., 3., 17.27626057, 2.], + [10., 17., 17.92918845, 3.], + [15., 16., 23.68525366, 8.], + [18., 19., 52.52351319, 11.]]) + +CORRECT_LABELS = np.array([7, 1, 4, 2, 6, 4, 5, 6, 7, 5, 3], dtype=np.int32) + + +def plot_cluster(pts, idx_old, idx_new): + import matplotlib.pyplot as plt + m = 'Set1' + + plt.figure() + plt.subplot(1, 2, 1) + plt.scatter(pts[:, 0], pts[:, 1], c=idx_old, cmap=m) + plt.title("Old") + plt.colorbar() + plt.subplot(1, 2, 2) + plt.scatter(pts[:, 0], pts[:, 1], c=idx_new, cmap=m) + plt.title("New") + plt.colorbar() + + plt.show() + + +def same_clusters(correct, other): + correct = np.asarray(correct) + other = np.asarray(other) + if len(correct) != len(other): + return False + + for i in range(len(correct)): + c = np.where(correct == correct[i]) + o = np.where(other == other[i]) + if not np.array_equal(c, o): + return False + return True + + +class TestClustering(unittest.TestCase): + def test_scipy_clustering(self): + old_link = linkage_vector(TRACK_PTS, method='centroid') + old_cluster_idxs = fcluster(old_link, 2.5, criterion='distance') + + np.testing.assert_allclose(old_link, CORRECT_LINK) + np.testing.assert_allclose(old_cluster_idxs, CORRECT_LABELS) + + def test_pdist(self): + pts = np.ascontiguousarray(TRACK_PTS, dtype=np.float64) + pts_ptr = ffi.cast("double *", pts.ctypes.data) + + n, m = pts.shape + out = np.zeros((n * (n - 1) / 2, ), dtype=np.float64) + out_ptr = ffi.cast("double *", out.ctypes.data) + hclust.hclust_pdist(n, m, pts_ptr, out_ptr) + + np.testing.assert_allclose(out, np.power(pdist(TRACK_PTS), 2)) + + def test_cpp_clustering(self): + pts = np.ascontiguousarray(TRACK_PTS, dtype=np.float64) + pts_ptr = ffi.cast("double *", pts.ctypes.data) + n, m = pts.shape + + labels = np.zeros((n, ), dtype=np.int32) + labels_ptr = ffi.cast("int *", labels.ctypes.data) + hclust.cluster_points_centroid(n, m, pts_ptr, 2.5**2, labels_ptr) + self.assertTrue(same_clusters(CORRECT_LABELS, labels)) + + def test_cpp_wrapper_clustering(self): + labels = cluster_points_centroid(TRACK_PTS, 2.5) + self.assertTrue(same_clusters(CORRECT_LABELS, labels)) + + def test_random_cluster(self): + np.random.seed(1337) + N = 1000 + + t_old = 0. + t_new = 0. + + for _ in range(N): + n = int(np.random.uniform(2, 32)) + x = np.random.uniform(-10, 50, (n, 1)) + y = np.random.uniform(-5, 5, (n, 1)) + vrel = np.random.uniform(-5, 5, (n, 1)) + pts = np.hstack([x, y, vrel]) + + t = time.time() + old_link = linkage_vector(pts, method='centroid') + old_cluster_idx = fcluster(old_link, 2.5, criterion='distance') + t_old += time.time() - t + + t = time.time() + cluster_idx = cluster_points_centroid(pts, 2.5) + t_new += time.time() - t + + self.assertTrue(same_clusters(old_cluster_idx, cluster_idx)) + + +if __name__ == "__main__": + unittest.main() diff --git a/selfdrive/controls/tests/test_following_distance.py b/selfdrive/controls/tests/test_following_distance.py index a3cb63601..228636e67 100644 --- a/selfdrive/controls/tests/test_following_distance.py +++ b/selfdrive/controls/tests/test_following_distance.py @@ -51,7 +51,7 @@ def run_following_distance_simulation(v_lead, t_end=200.0): CS.carState.aEgo = a_ego # Setup lead packet - lead = log.Live20Data.LeadData.new_message() + lead = log.RadarState.LeadData.new_message() lead.status = True lead.dRel = x_lead - x_ego lead.vLead = v_lead diff --git a/selfdrive/debug/cpu_usage_stat.py b/selfdrive/debug/cpu_usage_stat.py old mode 100644 new mode 100755 index 3ba96fd00..55723ff35 --- a/selfdrive/debug/cpu_usage_stat.py +++ b/selfdrive/debug/cpu_usage_stat.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python import psutil import time import os diff --git a/selfdrive/locationd/kalman/chi2_lookup.py b/selfdrive/locationd/kalman/chi2_lookup.py new file mode 100644 index 000000000..f45b4577f --- /dev/null +++ b/selfdrive/locationd/kalman/chi2_lookup.py @@ -0,0 +1,21 @@ +import numpy as np +import os + + +def gen_chi2_ppf_lookup(max_dim=200): + from scipy.stats import chi2 + table = np.zeros((max_dim, 98)) + for dim in range(1,max_dim): + table[dim] = chi2.ppf(np.arange(.01, .99, .01), dim) + #outfile = open('chi2_lookup_table', 'w') + np.save('chi2_lookup_table', table) + + +def chi2_ppf(p, dim): + table = np.load(os.path.dirname(os.path.realpath(__file__)) + '/chi2_lookup_table.npy') + result = np.interp(p, np.arange(.01, .99, .01), table[dim]) + return result + + +if __name__== "__main__": + gen_chi2_ppf_lookup() diff --git a/selfdrive/locationd/kalman/chi2_lookup_table.npy b/selfdrive/locationd/kalman/chi2_lookup_table.npy new file mode 100644 index 0000000000000000000000000000000000000000..6f1bd959c194cbc2f955d8658ac913c088ffcab6 GIT binary patch literal 156928 zcmeFY`8$;VAO0eEnijpEkqLLO$qScb3LS#uoLMch2 zMM`#&r6OzMzP_L1KJGu@{`ot<%yG>Rj5*FZugCN8d`WV0S-Wn_5{|YU{G+7N5Ia&pxs{o=XD2*AM!5?DrzCbyy6BzM8q2uD;q) zwf}z)0gnIs_`jdP|NR91zfa)$hLXJtmnlSK;`akBDfUFxU$^M3`ffzk$6LEKuk9u- z^Dlc%RoqXwM8!(fvO|dG40n;lYf%I}_nYdWoLFKcZgQWIUOb^pSPup3B@*3^0W)ha zClUXcc{@s6Q;5ee*m0}&T_ZLX4Y4cQ(}T!>+(cri--s6WpZXcB}ABC>HD(Y zM}+&)9NS<29ur(Q_eIz;D~R_j!OQZIRYag1=Xg+1HK9L}rYTzVj3_ZZLZ~gNB`&(f zR1a>iBlP~h8p(h0obaP9@K@T@6R|3Wi5|~i60j87|8r{t@r7GqRn_8aBCpB0oL2mX zc(Wqo*5%N*M2Sqyv*J6=MBU4GyW_6BBdBlosB$E?5Ix)7jJI5AC2p>^KJos}d*WGZ zN_}bN2V!dx&wIyjABn1veh^!5sWxlt+6SiSz1XAt}61%J?Q*S;R zA|y7*MDjHMAgrV(c5j~;Cd@Q%_CRBl5Qu-swR6W9aZx)!_TcTGM30kl&+VhXh^tH) zivh#m#NicBq-TbH6T6Z#0{7&O6O;GO7rzdfAeb$yl;5xUL&W}ej)MLq5zD?&I3zPg zNUK!buM?go{>uMI{4PF2FpP?Z5-76-Z-KBEZN(g+y;}e3_VB;N3HR+m;h6CmN&|ZdFlU67I_c)CXr8h~`rdm*{?YLp(h^ zFVMEVnb@D>+2`8&j_92YlBYSf65-1(r})2lPv{PIn3}BrNJL3EHQfIEiBO&TsQzis zXJYIBeoi}~cJ*rgbi!9+U2rk9^uG}a9T>m#rjxjCaM8i2yo)ezc1YNn*i9sTVT*hE z_7E4-;#WH@?kT_}cK4)*n5HT)OB-51ggWxNdI6i)1n4tXc_m2?SZ#516T^J?q9sd-nnL0+q zC(;GZW&R{KNJY=(Z~jH}Z$BXF-t&vFJskSLJK#6b`@y=oYyLOEba0F9JU32A6}E_m zt4|OS+cOtlKbjyoOVzDM*8L&kxqh*xNB$6nS$n#co}DDd&F2q0antSbk|WFKhND0M zQM4e!o1jbfhc-gq4u5nER+@wJIvlKKy;dtCARtTFAYSQ%^*U z%KzKF^DWVd{?+-$t;ChidA~cc9|_Mv9iGm;JXH{96c z*iEdhGU{a(^$_gu`F)$^`Ut(v34A|8`w3s)kFM`O3=pM)c0DzQg9Pi-$2qrCL&Sp% zoplNwKL~R|k1LuvLRiMGyEh&?N>mRPr#5~XBXpC`ZDvaUBAQpuRUfPRMX-~@UQc`f zCa7am_K(EJ30^I!-yKiJ3G48xfw(;rMBVM$j#lwM#O}ho`#)FyA;$cTT#EcAiJ|F` zb768*M1!AT(u(>i;_PmpqpXl=;*DqQmMM9E}fqxE)4~}=(C$6 zjK%IRzM7jOIITvawio>+LKli>iucVEA5V#Zrtm$DpSkFU?!8qNWUNAmeNV;jP6`j+ z#5MnQz0L!R$IG_}$nZj(b|_BvA}{=2RP){xmrXh#VpAYfu zT_TT}e6B)F%R|ui!=nLyMVuC1xmaVZ1a7%7-P`HP_~j$Q?`W$E_c7Y*^=WEIWlnc+ z_N!x6*Q=rGTur=eKN2H}}i^ogh*<`k&2={vnR4uQQkJm?UZrx0`Uinj&)Yh;fsL(}caja~q{AGlX@~ z+gGBIv&31!bt(UO%n`YtK$E4nI|5H@Z8(V{f{s@8Drnj`;Um(YMuYO zW`PJ_T;p;+W0822ps`gI91!U}?-lca1I3%P?D$ldpqpJMSap60EOa8&%NLfQS0#GA za3Ckf)>@Ch?Bqn+n+*&9)^XwDQ$>Ty8ZIRLr@d6xm>b8gEAuGjaKq-SXTn!S9_(G; zK=DoFfkf+7&lVnDZ0^#O(~aOoe7VBr$O&E~ex5kp>(2+1vwq=z{e1Yb(L0E`iytdI z4iVa4`SBuXW?jsdrFdiFTEDh!Dg4Y=#$VekfD+G?oyXe+@SEk&CGRc>fA?hDkX}I) zxN*yt`Uyem&&wA-CxqZJBEX9%VJP?RP^uFWfsezC@U`nAD0TOE)lV0NaJ${s`dU%& zM#)}yXdni?O8K)BVPaSkVa{LiN(@sWr>?io-JhPb#xo9EblVd=rzA zz!I0@xP^TZD5rgVrSwt)$yA@IM2aM;{3FINT*$K;@A*7N(UggjDti`JaTmB+3^-tvAY1x)3?&ZwDFfECAoqP~TSIP*Py zPhhYT9wlwAZCtL5?fY$x&S|UQ`mSf!s4A*REc4T{mQh2ruzJthTs3%lc1fAIsH4)t z_uwNL4LrTjc=OS$2HJgS9b&>1eBE0;c62Wl4{k|a{OO{N49VH`Z!5Y93lmMxBcg-E zOps6RhyD?wDu5$)&9PsEUZhm_w~gb3#MvJH?8ON}>8;{Jo%55#quo8~RNiUAYIh?y z_RbJS?e$JAwX;O-i@R>_qJN2mdb^|V*Ub|l1DQNkr~eVoW}1{OPZo%lpPDoG2Nnro z%eWtoCpo}lnda3avjjVyIc*BMy#(Hlqlz{xPW-A}m42MOPn*2(Y(BJt3(dKL-&Qnp z;U&jX6Ut_8WVL@MRsPeU+MX!a6Xh=D=Q^{F{;+!yDI{SzPmPK zR#gyPO(y@{x+4g``33J@10fju_rH8oB80*a)ys!%gfZc9Z}fM)Fn;>`if`H=0x!L` zh{6sLXg*JxQ}Gi;+UB{(h0~(on?L`MuoJ_|#aoKbXT%^#r^ZXX7sGa&z~*FSain?E z=>6W}*yJ*{L%2vB@0NeQrMM`LMJ(@7UL%1<#_J0jS0!M5`4x}(kObsk-FG@*E{QmI zQ{S)gl34T7aKqUSNwmGsRlmfPg8x8*F8?Vh6boOLUFeWP%-(B?=S-wgzVfL=Q=&9j zmgZ$&Mx>!=)%LYzl?)DhxZY{GCj;GUL!ah_WO29e1@-U&SyYzgCGTmI#k`Z?&)H>i zh_CIm-jy$h9SoPfP0I2($TKq?nJAAX;*BpK@+#o^T?5v`V+ttpEYNORP(aEDR*^@v zB1*GDDqH!LpnQpmE6GZr^jLG4=_sSA>c#BJXUfR=RQD*_Lj@m2ZNEQQN;VpQO=?5A zDmLhL`u(*~gMIPR>Qy(@aMOzjrSYqS^Y%hx))94Z`*h^;|53-+h!fAbj%YyV!4ZoF z0ZpuX?@{PN_Pu-MtWT2%1)TrsY+BBw0!%RnIf@qe_84~buhd5J)TV_uPj&F@OQX{B z7c@M4-an^1I7~cp>uCW+!h5<^eArU`MgS)8KH5oQuOVN_;rLr8tsfH(B9g&0C`R`AfKgof&z;D3YR32)4 zPEFaV@+kiK-@?7W@;D;8Vd~s21>AT+@d~V0z`b+wd-pRG(bcUmTzpLtN=qNN{kK#J z>%^L~vyUjD^iOV}#-lD^vkKIGFV&W|slblMZXH*Hqw}LjSxssX^ZdzCuB?utONt!q{p!f#{GGf1 zg*s9$q%?J?X<(lI?&W-x28@09GrapWP#*UB$tNdGyjoEpZCI@d2k(p8C(J2$bGgOc zyn=%3E|1(qR#D;UKeBUUKNV?@MmK3)(84p(%w65pT&k$qLc`vq&`j zckS#G*Cp^d;Q!e%krNH+^kVx0F6cFV-1Mk|8?%bm2g)Avpr*KB(&!#99<~!2E{S~5 zzYsw@-^UMY(OV%cc1zLta~t1jNddHvZ8fUv5WwleF)<4=$C598jm7L1Lh!|HVH6FL zOSKPdIQvx?$5g1tl`o0l#Mo;C`btsER&Ts7FfWQb7IDepu41retDlt17sJ2glQYxY z;%Gk2TxYaR9NAypySfX+@$|;9xje4~j8A>oJGxZ@vQHX`0}mvCn-x1txg=r3ejWG5 zO%k=cIqtoC@_v(k_d>3po{B!jxzoPy)GWI!aW*t=;~23P#nP2X^qh5z98h`o1Ykw9Z? zdh<^f1@9&$n_T2D=3aX(g6!GzMX}WHeDYA(dvueMr#v>)#V;or2j9+YO4pQEz;t}t zUFpLL7|5D&m3XfJN#@jldPa&UySB;qV3HzuGp(ln{ZT|ixlnGWn-ZRV6xuOLrYw!W&c&XP~q))La#Ttlw+z-c!ZP z>V2CPMAdMy{Y<6$DmC00eV`wGQVsrV?+LE2Q-k%BN3ywG>WDrt@c4nfI&QzZ;umpB z9SeS!v`re-QStH{2alu%_eEo>zjD$| zN)Lo{mgO!DePqW~J(=`2z(jbncQ&^nj#cOjxTP^bKQ53VyqWC()jGB@wj4NbUKPS0 z&WU#pbl~*i9kNT}P%`XBlu`oHB z^g|F4o+^)SjSAtNV%3iI1H#BiUAso_Bbn>P2fz1MiNZQMdavXne-pz@vVZxEnrhzdlz`CjLXMGIGS|Coo%6KFxr@U(!a7b8gXwbi z)q|3xLP?o&ag+i_)B1mkWPYh19<4Iqkw)p2_|i;IX=LAtT%Gh(8tX>py zPqWl#<)CF=tlqv!9_O|9F1{*|hvQHAq(vbGe9i2WJMF80^FkNuf?p`WN$bYDW=%y1 zxh+Y$Px8X{kM+kTyA*M8Q_gx>LJ4&r-%mZisf46hN;Q2^3AV$pJUw=i-0-JXD4<3e zE%BBiUQ`t{+~u0vd|CxplMknF9aBMs{%_*wCRGH88z;Vhq6&rSCATaj)KJx|lWMU- z4Z1h1awj9y5dUFDBD6>iygf^6n|`RFRmABmpQbu!QlA;j?dm8v!i?T_ne1hL*NBvN z>eyOi96T+o0gYB~(}dL;SbkM$S#Z1tE}aYcRoS3{s>d&0o)FT+8SC8@-<>s)Y!(^I znXHMWrWg5VzG&hWmHK&mPpgOeAJ z^}LPM!TNx4rahM~k_W6#`NZoYI&RCA$BHy~u6JXpKBhq-HKR|?OAo&Umj2?_)W=2E zti$DLeaxH5JKP>J!0K~>r>nROan)nn#3MZhUdIjPKj37-QmI={T#to=og!;_iaFq& zGE?Pj%Z=cS-up$bcyT&x_lX@JNzQK9tbI@Nw0XJxAh*5{w9iRs##|-mxuB(WZKEQP z%;t~jl@`N8QO+)AF6k2rWvaJWl0G41b#`=}I3f(=xf2~F;JP3nVNK3w>EBITRqQ3P z$N!vXVTB}`m00cDSyK2}dMD$^Z7FECKT6*yBMmR}wfFT;NJFqg+}&ne8a<5l7oY5q zLBZj#G4JYS;7}!1k;9OM*v(&Wy;5Z%HAMTXyGYJyk&JXnFF9QHI`z<|K@JjXqGHeK z^5CBhYpl9RazbCu0oy5gkl!d1uPqAjdi9ZES)qXEN3_B}sVG9h-hIa!GQZ#K5BcBk zRfO3-j$1qqO2~;jbHYDI39%n;Fh&KGajfm*!K?d}p?v;W|M6yJoP76vvcyOQoSHRD z>{3)v9Mtun`Ck>>X!ALlvr`qfe>F~|)v2QD^QR(NX*G1rPX-z}sv%fo%JqJ@8mbT4 z)}4Bw2BXW%oZt1T!C|}PheSDbIEZu}f4f#4)yrDCF2|7l>p9->>#;iY_`ZMr{!1NJ zJcG|p>S*A)83*U*T^g8E=_vYfMFU5z_GZ3p)j)3d1&?DQnrP@=@1?d%6YQiG#j=x{ z@UJNm*j%TH;_}01F+Jou328&}KGq4k3T8gm$IikL)rrQlfk0OAIli>Lqc0GXtYno-5l9GY~$;#b0)fiF1*E^k0Orkp87$ zu{F;K+rM@HG!5ZKSBcU1&rp86eXO7QW3?bm=|&r3FA77hq~P3>6QUS%F?5MY7sIBz zIVU=O#X&b&Big4a0Tpp^%eU_&u;`!TIDSYHFBENyI3=X;#d0!cE!o#9#gQW)$vKW_ z-EueJnKTBUl-{jeAp_IuThY!9GKkb_P`k2H7Vp;bmHc}y3vL;s)h&b^C>!^m+x18e z?ryE$2KD9PepiqqE1k@9%;jx$5(-e~VvB~vD8TXL=9<271^ip8hsY<~V$hB!ID**_MRiBN`~=U*v_0cGr)ZYjI(tOED!j<3^Y zDj;rrJRqQn|^%U^m9O*NjuhzI)!wWKhxh+_8-( zkcysAV&YRi6*6fDydIPM;XWjrS;5o-Q)cPO$zUzmzKD)J@>mOJJTA2FT-3syoBJD{ zIcP)vt#em-f;Oa%$JzR}Yh&Vavgnu=ndh0N#(jr$P<%aqNbH3UqPF^P=a$z+`!)&p zumD}qZ4{jDztF{@f$sW`>NHH;8J)I2MuW{EFFVH`8a{Xb+DbU;p)E1;OUgq%OkQ1< z_m0f@9{F=#F_-n>utiXGm$(6ZIxY>{BpJZ(%y$tjWja=r{V~{5K*t^)=XU{4h7g?D zb2f0+5Mnm2wVYcSxc$v?sJEJd-})B4UyPV&I3{bKP|8H*fl9%vPAsTvWCl9(7-7WR zZ8hhJ5f1CtiR$PYL!M`a@@Rj6=aEX;0OIE94Qfu!I^H?>Uo%$miQlW;pajqAk zf7GyLP5`U))xr3%Y30;^>UdG|lX2>rI<`mc>*Z}#$AvE~rgBlRfbGmX{O%q3MT3F_9)`azE@50eUP1LwARP24FiLKJ9 zEH;_rP@(T!Yb_}d{~5ZnI+y|}(le&yQy^rkdGX62$<`YvlyF_8Suz15wHmiO<& zu3e>~A^U{l+()vXb(q)ZB(<=0)4I-_^;(Ga=iVuvsD&toF|q8e76#5<_HYo@#&!RJ zaKm-l5O;pY5W1+1c zH+r^5508{(Yh>dI)2|^m`W`*#OvWNMb&YJIO!G4+sem4!rx3uUuUxC-;`;+y2e2I z#)gQxQ3jsBTr;`Hfr;dME|H?yOk{Hv*IyQAA+6w0W^Vd=lglMlvSGyumkZE;+^v4^uw62yeRfbrPLUPAdWt?rllzCJ~ z1u1oPoc|uGAfJ1;VzGrPwr&j*`1Mp3PWv)8hN-LJ%dYK$iymr75VzsW$RPQcD{pUT z7s(%Ao29R*sN>kr!9gXGkN;e#R};IUj*QVGr%#Z*Y_1zrbXHsgKDT&O*=seR>X+wn zI!*)D;d%~NYBiwfesnN!K?AbQZcTFLn)tP$ZvN&$P3#wN7ZlDXud9=d_YGP%gymW-ByX5jeSIfH#r*HDkvS`Okh= zmbW7`UGlz2^DHKN+Oln+CAdfzoZq5$5wp5j=KJ)B7HBZI+}CX#N5g`$UHjE{G{kqk zUB5|54-rbmiZMQV7a}Bh-dj3`HKMKF8XJOL6p~YsW(e^& z`f8)R40I=Cs5*fG+QZ{Y%Oe;lxP87u{RsmO>${EY{*ipMN=s7FjtTA=IU4&M6D~55 z56!=z4nEDc{CcQ=B~%%fv#KN}&H#lX`a#%K{-{67EE7~IECdiGVCpt)F3v02y*9L$eI_&zZtoZ%j77L|nK0UB*R+56Y+ z#NWYAT9rpNw*ER-%cj(TUy!6=4@b~jTVFA|gL6HY5YYjbCN*e*pBB$*i;qbWiE zVwYmykP^;^trXZv?gP2^Z02$#d1TbHO|xKH1=7)xBf(cyA#SC2P)kV-rK0?62Yu9V zvS-`rYI6P?s!G~CFt3L4kM=&NNqgAW?Gsw=VpbPjSv0(QucW_)jN<2IGh7HquXMSbAn5 zw|S9(i=DMDe1%bw^~J|mp;z;jo92T(1%R$ zOilm1KD?;{L$Rw2VAFZXHuH)B9!fsDu;qsVZe5I%eq}{R`R?jY@e6eP$mzA*{GE>U ziuKxcgdr}sjdey}HH7C&i}N+phUmXk7x#^vSEc=E zdlt*XX?tZsO`S-i>Q;{B;wDp-Rf|BJAC=t zBXv-A1Y~*gYoMXu)Lzj|1NkaVNgP>Z-dF3~SpHK387+CAWXQgzh81qS7OjcRYKQMk zlKi}9v-cf)Q40RJed5g8L_xy-gs1vfC|Fmp^XlYR3d$`v?UYob;$pd?;T2CR_I}?| zo|;9)H5cAsjR7jge;uz_uB`=E!%ALp(%)?m@twJlqlNZp#>o$)$J?TIT4<2$=aF~M zygvA7V;TRme>pkYh+ERuyKhh%Ee{sk={h<%Ot1Hu^45WO60^4{TL)V@%Z}E3*THD; zZI>_Fx+sn7JF4lUi`R@;f!jH{i26CB=r^Q`lzUD;B4{)ic6l{__ow0bi5+ewc{FTZ zv�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

2|Eb$b`${30 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 IZR-&756-ay5C8xG literal 0 HcmV?d00001 diff --git a/selfdrive/locationd/kalman/ekf_sym.py b/selfdrive/locationd/kalman/ekf_sym.py index 8b537c699..a1f282ab0 100644 --- a/selfdrive/locationd/kalman/ekf_sym.py +++ b/selfdrive/locationd/kalman/ekf_sym.py @@ -5,8 +5,7 @@ import numpy as np from numpy import dot from common.ffi_wrapper import compile_code, wrap_compiled from common.sympy_helpers import sympy_into_c -import scipy -from scipy.stats import chi2 +from chi2_lookup import chi2_ppf EXTERNAL_PATH = os.path.dirname(os.path.abspath(__file__)) @@ -19,12 +18,11 @@ def solve(a, b): return np.linalg.solve(a, b) def null(H, eps=1e-12): - from scipy import linalg - u, s, vh = linalg.svd(H) + u, s, vh = np.linalg.svd(H) padding = max(0,np.shape(H)[1]-np.shape(s)[0]) null_mask = np.concatenate(((s <= eps), np.ones((padding,),dtype=bool)),axis=0) - null_space = scipy.compress(null_mask, vh, axis=0) - return scipy.transpose(null_space) + null_space = np.compress(null_mask, vh, axis=0) + return np.transpose(null_space) def gen_code(name, f_sym, dt_sym, x_sym, obs_eqs, dim_x, dim_err, eskf_params=None, msckf_params=None, maha_test_kinds=[]): # optional state transition matrix, H modifier @@ -121,7 +119,7 @@ def gen_code(name, f_sym, dt_sym, x_sym, obs_eqs, dim_x, dim_err, eskf_params=No else: He_str = 'NULL' # ea_dim = 1 # not really dim of ea but makes c function work - maha_thresh = chi2.ppf(0.95, int(h_sym.shape[0])) # mahalanobis distance for outlier detection + maha_thresh = chi2_ppf(0.95, int(h_sym.shape[0])) # mahalanobis distance for outlier detection maha_test = kind in maha_test_kinds extra_post += """ void update_%d(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) { @@ -471,7 +469,7 @@ class EKF_sym(object): if self.msckf and kind in self.maha_test_kinds: a = np.linalg.inv(H.dot(P).dot(H.T) + R) maha_dist = y.T.dot(a.dot(y)) - if maha_dist > chi2.ppf(0.95, y.shape[0]): + if maha_dist > chi2_ppf(0.95, y.shape[0]): R = 10e16*R # *** same below this line *** @@ -513,7 +511,7 @@ class EKF_sym(object): a = np.linalg.inv(H.dot(P).dot(H.T) + R) maha_dist = y.T.dot(a.dot(y)) - if maha_dist > chi2.ppf(maha_thresh, y.shape[0]): + if maha_dist > chi2_ppf(maha_thresh, y.shape[0]): return False else: return True diff --git a/selfdrive/locationd/locationd_local.py b/selfdrive/locationd/locationd_local.py index cc5498cf3..627f87303 100755 --- a/selfdrive/locationd/locationd_local.py +++ b/selfdrive/locationd/locationd_local.py @@ -32,11 +32,13 @@ MAX_SR_TH = 1.9 LEARNING_RATE = 3 + class Localizer(object): def __init__(self, disabled_logs=None, dog=None): self.kf = LocLocalKalman() self.reset_kalman() + self.sensor_data_t = 0.0 self.max_age = .2 # seconds self.calibration_valid = False @@ -73,10 +75,10 @@ class Localizer(object): self.update_kalman(current_time, ObservationKind.CAMERA_ODO_TRANSLATION, np.concatenate([log.cameraOdometry.trans, log.cameraOdometry.transStd])) - def handle_live100(self, log, current_time): + def handle_controls_state(self, log, current_time): self.speed_counter += 1 if self.speed_counter % 5 == 0: - self.update_kalman(current_time, ObservationKind.ODOMETRIC_SPEED, np.array([log.live100.vEgo])) + self.update_kalman(current_time, ObservationKind.ODOMETRIC_SPEED, np.array([log.controlsState.vEgo])) def handle_sensors(self, log, current_time): for sensor_reading in log.sensorEvents: @@ -92,9 +94,10 @@ class Localizer(object): if typ in self.disabled_logs: return if typ == "sensorEvents": + self.sensor_data_t = current_time self.handle_sensors(log, current_time) - elif typ == "live100": - self.handle_live100(log, current_time) + elif typ == "controlsState": + self.handle_controls_state(log, current_time) elif typ == "cameraOdometry": self.handle_cam_odo(log, current_time) @@ -173,7 +176,7 @@ def locationd_thread(gctx, addr, disabled_logs): ctx = zmq.Context() poller = zmq.Poller() - live100_socket = messaging.sub_sock(ctx, service_list['live100'].port, poller, addr=addr, conflate=True) + controls_state_socket = messaging.sub_sock(ctx, service_list['controlsState'].port, poller, addr=addr, conflate=True) sensor_events_socket = messaging.sub_sock(ctx, service_list['sensorEvents'].port, poller, addr=addr, conflate=True) camera_odometry_socket = messaging.sub_sock(ctx, service_list['cameraOdometry'].port, poller, addr=addr, conflate=True) @@ -191,17 +194,19 @@ def locationd_thread(gctx, addr, disabled_logs): # Check if car model matches if params is not None: params = json.loads(params) - if params.get('carFingerprint', None) != CP.carFingerprint: + if (params.get('carFingerprint', None) != CP.carFingerprint) or (params.get('carVin', CP.carVin) != CP.carVin): cloudlog.info("Parameter learner found parameters for wrong car.") params = None if params is None: params = { 'carFingerprint': CP.carFingerprint, + 'carVin': CP.carVin, 'angleOffsetAverage': 0.0, 'stiffnessFactor': 1.0, 'steerRatio': VM.sR, } + params_reader.put("LiveParameters", json.dumps(params)) cloudlog.info("Parameter learner resetting to default values") cloudlog.info("Parameter starting with: %s" % str(params)) @@ -213,29 +218,33 @@ def locationd_thread(gctx, addr, disabled_logs): steer_ratio=params['steerRatio'], learning_rate=LEARNING_RATE) - i = 0 + i = 1 while True: for socket, event in poller.poll(timeout=1000): log = messaging.recv_one(socket) localizer.handle_log(log) - if socket is live100_socket: + if socket is controls_state_socket: if not localizer.kf.t: continue if i % LEARNING_RATE == 0: - # live100 is not updating the Kalman Filter, so update KF manually + # controlsState is not updating the Kalman Filter, so update KF manually localizer.kf.predict(1e-9 * log.logMonoTime) predicted_state = localizer.kf.x yaw_rate = -float(predicted_state[5]) - steering_angle = math.radians(log.live100.angleSteers) - params_valid = learner.update(yaw_rate, log.live100.vEgo, steering_angle) + steering_angle = math.radians(log.controlsState.angleSteers) + params_valid = learner.update(yaw_rate, log.controlsState.vEgo, steering_angle) + + log_t = 1e-9 * log.logMonoTime + sensor_data_age = log_t - localizer.sensor_data_t params = messaging.new_message() params.init('liveParameters') params.liveParameters.valid = bool(params_valid) + params.liveParameters.sensorValid = bool(sensor_data_age < 5.0) params.liveParameters.angleOffset = float(math.degrees(learner.ao)) params.liveParameters.angleOffsetAverage = float(math.degrees(learner.slow_ao)) params.liveParameters.stiffnessFactor = float(learner.x) @@ -245,8 +254,9 @@ def locationd_thread(gctx, addr, disabled_logs): if i % 6000 == 0: # once a minute params = learner.get_values() params['carFingerprint'] = CP.carFingerprint + params['carVin'] = CP.carVin params_reader.put("LiveParameters", json.dumps(params)) - params_reader.put("ControlsParams", json.dumps({'angle_model_bias': log.live100.angleModelBias})) + params_reader.put("ControlsParams", json.dumps({'angle_model_bias': log.controlsState.angleModelBias})) i += 1 elif socket is camera_odometry_socket: @@ -264,7 +274,7 @@ def main(gctx=None, addr="127.0.0.1"): disabled_logs = os.getenv("DISABLED_LOGS", "").split(",") # No speed for now - disabled_logs.append('live100') + disabled_logs.append('controlsState') if IN_CAR: addr = "192.168.5.11" diff --git a/selfdrive/locationd/ubloxd_main.cc b/selfdrive/locationd/ubloxd_main.cc index 1cfb8c5fb..3ea080ad9 100644 --- a/selfdrive/locationd/ubloxd_main.cc +++ b/selfdrive/locationd/ubloxd_main.cc @@ -72,7 +72,7 @@ int ubloxd_main(poll_ubloxraw_msg_func poll_func, send_gps_event_func send_func) // New message available if(parser.msg_class() == CLASS_NAV) { if(parser.msg_id() == MSG_NAV_PVT) { - LOGD("MSG_NAV_PVT"); + //LOGD("MSG_NAV_PVT"); auto words = parser.gen_solution(); if(words.size() > 0) { auto bytes = words.asBytes(); @@ -82,14 +82,14 @@ int ubloxd_main(poll_ubloxraw_msg_func poll_func, send_gps_event_func send_func) LOGW("Unknown nav msg id: 0x%02X", parser.msg_id()); } else if(parser.msg_class() == CLASS_RXM) { if(parser.msg_id() == MSG_RXM_RAW) { - LOGD("MSG_RXM_RAW"); + //LOGD("MSG_RXM_RAW"); auto words = parser.gen_raw(); if(words.size() > 0) { auto bytes = words.asBytes(); send_func(parser.msg_class(), parser.msg_id(), ubloxGnss, bytes.begin(), bytes.size(), 0); } } else if(parser.msg_id() == MSG_RXM_SFRBX) { - LOGD("MSG_RXM_SFRBX"); + //LOGD("MSG_RXM_SFRBX"); auto words = parser.gen_nav_data(); if(words.size() > 0) { auto bytes = words.asBytes(); diff --git a/selfdrive/loggerd/config.py b/selfdrive/loggerd/config.py index 9d1c3120f..14e1e67a9 100644 --- a/selfdrive/loggerd/config.py +++ b/selfdrive/loggerd/config.py @@ -7,3 +7,13 @@ else: ROOT = '/data/media/0/realdata/' SEGMENT_LENGTH = 60 + + +def get_available_percent(): + try: + statvfs = os.statvfs(ROOT) + available_percent = 100.0 * statvfs.f_bavail / statvfs.f_blocks + except OSError: + available_percent = 100.0 + + return available_percent diff --git a/selfdrive/loggerd/deleter.py b/selfdrive/loggerd/deleter.py index 01a91d774..86974a00c 100644 --- a/selfdrive/loggerd/deleter.py +++ b/selfdrive/loggerd/deleter.py @@ -3,14 +3,13 @@ import os import shutil import threading from selfdrive.swaglog import cloudlog -from selfdrive.loggerd.config import ROOT +from selfdrive.loggerd.config import ROOT, get_available_percent from selfdrive.loggerd.uploader import listdir_by_creation_date def deleter_thread(exit_event): while not exit_event.is_set(): - statvfs = os.statvfs(ROOT) - available_percent = 100.0 * statvfs.f_bavail / statvfs.f_blocks + available_percent = get_available_percent() if available_percent < 10.0: # remove the earliest directory we can diff --git a/selfdrive/loggerd/loggerd b/selfdrive/loggerd/loggerd index 110aafbb3d7f39f3fe3286d637c2184c5326861c..2fcf09831fe8d511f5214d5eca1a7e9bc5ac2490 100755 GIT binary patch delta 79 zcmWN=$qj%Y6hOhCg8K%pZD>)n;o&8=U?C<}K}*Cx$vn|N(O)PMQZh7#oPv^ynueB+ Zo`DhjIvvz`o8aUmXSv8#Zl4LeJ$_oK8ovMl delta 79 zcmWN=$qj%Y6hOhCg8K%pZO{~LczB5|Scr*L&=T=aGEWLm3KxouoC1xZq@t#wrK4wH ZWMam?PDkZ$6P;Y-DmS^y<1_KJ{s&r#8omGk diff --git a/selfdrive/loggerd/tests/fill_eon.py b/selfdrive/loggerd/tests/fill_eon.py index 2385e3aa5..8ebc5ceb2 100755 --- a/selfdrive/loggerd/tests/fill_eon.py +++ b/selfdrive/loggerd/tests/fill_eon.py @@ -3,7 +3,7 @@ import os -from selfdrive.loggerd.config import ROOT +from selfdrive.loggerd.config import ROOT, get_available_percent from selfdrive.loggerd.tests.loggerd_tests_common import create_random_file @@ -21,7 +21,6 @@ if __name__ == "__main__": segment_idx += 1 # Fill up to 99 percent - statvfs = os.statvfs(ROOT) - available_percent = 100.0 * statvfs.f_bavail / statvfs.f_blocks + available_percent = get_available_percent() if available_percent < 1.0: break diff --git a/selfdrive/logmessaged.py b/selfdrive/logmessaged.py index 971db8293..fb4a2bedf 100755 --- a/selfdrive/logmessaged.py +++ b/selfdrive/logmessaged.py @@ -28,6 +28,7 @@ def main(gctx): if levelnum >= le_level: # push to logentries + # TODO: push to athena instead le_handler.emit_raw(dat) # then we publish them diff --git a/selfdrive/manager.py b/selfdrive/manager.py index 6dcd982f7..30e413c30 100755 --- a/selfdrive/manager.py +++ b/selfdrive/manager.py @@ -93,7 +93,6 @@ managed_processes = { "plannerd": "selfdrive.controls.plannerd", "radard": "selfdrive.controls.radard", "ubloxd": ("selfdrive/locationd", ["./ubloxd"]), - "mapd": "selfdrive.mapd.mapd", "loggerd": ("selfdrive/loggerd", ["./loggerd"]), "logmessaged": "selfdrive.logmessaged", "tombstoned": "selfdrive.tombstoned", @@ -101,7 +100,7 @@ managed_processes = { "proclogd": ("selfdrive/proclogd", ["./proclogd"]), "boardd": ("selfdrive/boardd", ["./boardd"]), # not used directly "pandad": "selfdrive.pandad", - "ui": ("selfdrive/ui", ["./start.sh"]), + "ui": ("selfdrive/ui", ["./start.py"]), "calibrationd": "selfdrive.locationd.calibrationd", "locationd": "selfdrive.locationd.locationd_local", "visiond": ("selfdrive/visiond", ["./visiond"]), @@ -128,11 +127,9 @@ persistent_processes = [ 'logcatd', 'tombstoned', 'uploader', - 'deleter', 'ui', - 'gpsd', 'updated', - 'athena' + 'athena', ] car_started_processes = [ @@ -146,7 +143,8 @@ car_started_processes = [ 'visiond', 'proclogd', 'ubloxd', - 'mapd', + 'gpsd', + 'deleter', ] def register_managed_process(name, desc, car_started=False): @@ -318,6 +316,7 @@ def manager_thread(): # save boot log subprocess.call(["./loggerd", "--bootlog"], cwd=os.path.join(BASEDIR, "selfdrive/loggerd")) + # start persistent processes for p in persistent_processes: start_managed_process(p) @@ -356,8 +355,8 @@ def manager_thread(): kill_managed_process(p) # check the status of all processes, did any of them die? - for p in running: - cloudlog.debug(" running %s %s" % (p, running[p])) + running_list = [" running %s %s" % (p, running[p]) for p in running] + cloudlog.debug('\n'.join(running_list)) # is this still needed? if params.get("DoUninstall") == "1": diff --git a/selfdrive/mapd/default_speeds.json b/selfdrive/mapd/default_speeds.json deleted file mode 100644 index 7126c27fc..000000000 --- a/selfdrive/mapd/default_speeds.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "_comment": "These speeds are from https://wiki.openstreetmap.org/wiki/Speed_limits Special cases have been stripped", - "AR:urban": "40", - "AR:urban:primary": "60", - "AR:urban:secondary": "60", - "AR:rural": "110", - "AT:urban": "50", - "AT:rural": "100", - "AT:trunk": "100", - "AT:motorway": "130", - "BE:urban": "50", - "BE-VLG:rural": "70", - "BE-WAL:rural": "90", - "BE:trunk": "120", - "BE:motorway": "120", - "CH:urban[1]": "50", - "CH:rural": "80", - "CH:trunk": "100", - "CH:motorway": "120", - "CZ:pedestrian_zone": "20", - "CZ:living_street": "20", - "CZ:urban": "50", - "CZ:urban_trunk": "80", - "CZ:urban_motorway": "80", - "CZ:rural": "90", - "CZ:trunk": "110", - "CZ:motorway": "130", - "DK:urban": "50", - "DK:rural": "80", - "DK:motorway": "130", - "DE:living_street": "7", - "DE:residential": "30", - "DE:urban": "50", - "DE:rural": "100", - "DE:trunk": "none", - "DE:motorway": "none", - "FI:urban": "50", - "FI:rural": "80", - "FI:trunk": "100", - "FI:motorway": "120", - "FR:urban": "50", - "FR:rural": "80", - "FR:trunk": "110", - "FR:motorway": "130", - "GR:urban": "50", - "GR:rural": "90", - "GR:trunk": "110", - "GR:motorway": "130", - "HU:urban": "50", - "HU:rural": "90", - "HU:trunk": "110", - "HU:motorway": "130", - "IT:urban": "50", - "IT:rural": "90", - "IT:trunk": "110", - "IT:motorway": "130", - "JP:national": "60", - "JP:motorway": "100", - "LT:living_street": "20", - "LT:urban": "50", - "LT:rural": "90", - "LT:trunk": "120", - "LT:motorway": "130", - "PL:living_street": "20", - "PL:urban": "50", - "PL:rural": "90", - "PL:trunk": "100", - "PL:motorway": "140", - "RO:urban": "50", - "RO:rural": "90", - "RO:trunk": "100", - "RO:motorway": "130", - "RU:living_street": "20", - "RU:urban": "60", - "RU:rural": "90", - "RU:motorway": "110", - "SK:urban": "50", - "SK:rural": "90", - "SK:trunk": "90", - "SK:motorway": "90", - "SI:urban": "50", - "SI:rural": "90", - "SI:trunk": "110", - "SI:motorway": "130", - "ES:living_street": "20", - "ES:urban": "50", - "ES:rural": "50", - "ES:trunk": "90", - "ES:motorway": "120", - "SE:urban": "50", - "SE:rural": "70", - "SE:trunk": "90", - "SE:motorway": "110", - "GB:nsl_restricted": "30 mph", - "GB:nsl_single": "60 mph", - "GB:nsl_dual": "70 mph", - "GB:motorway": "70 mph", - "UA:urban": "50", - "UA:rural": "90", - "UA:trunk": "110", - "UA:motorway": "130", - "UZ:living_street": "30", - "UZ:urban": "70", - "UZ:rural": "100", - "UZ:motorway": "110" -} diff --git a/selfdrive/mapd/default_speeds_generator.py b/selfdrive/mapd/default_speeds_generator.py deleted file mode 100755 index 888c9e1df..000000000 --- a/selfdrive/mapd/default_speeds_generator.py +++ /dev/null @@ -1,240 +0,0 @@ -#!/usr/bin/env python -import json - -DEFAULT_OUTPUT_FILENAME = "default_speeds_by_region.json" - -def main(filename = DEFAULT_OUTPUT_FILENAME): - countries = [] - - """ - -------------------------------------------------- - US - United State of America - -------------------------------------------------- - """ - US = Country("US") # First step, create the country using the ISO 3166 two letter code - countries.append(US) # Second step, add the country to countries list - - """ Default rules """ - # Third step, add some default rules for the country - # Speed limit rules are based on OpenStreetMaps (OSM) tags. - # The dictionary {...} defines the tag_name: value - # if a road in OSM has a tag with the name tag_name and this value, the speed limit listed below will be applied. - # The text at the end is the speed limit (use no unit for km/h) - # Rules apply in the order in which they are written for each country - # Rules for specific regions (states) take priority over country rules - # If you modify existing country rules, you must update all existing states without that rule to use the old rule - US.add_rule({"highway": "motorway"}, "65 mph") # On US roads with the tag highway and value motorway, the speed limit will default to 65 mph - US.add_rule({"highway": "trunk"}, "55 mph") - US.add_rule({"highway": "primary"}, "55 mph") - US.add_rule({"highway": "secondary"}, "45 mph") - US.add_rule({"highway": "tertiary"}, "35 mph") - US.add_rule({"highway": "unclassified"}, "55 mph") - US.add_rule({"highway": "residential"}, "25 mph") - US.add_rule({"highway": "service"}, "25 mph") - US.add_rule({"highway": "motorway_link"}, "55 mph") - US.add_rule({"highway": "trunk_link"}, "55 mph") - US.add_rule({"highway": "primary_link"}, "55 mph") - US.add_rule({"highway": "secondary_link"}, "45 mph") - US.add_rule({"highway": "tertiary_link"}, "35 mph") - US.add_rule({"highway": "living_street"}, "15 mph") - - """ States """ - new_york = US.add_region("New York") # Fourth step, add a state/region to country - new_york.add_rule({"highway": "primary"}, "45 mph") # Fifth step , add rules to the state. See the text above for how to write rules - new_york.add_rule({"highway": "secondary"}, "55 mph") - new_york.add_rule({"highway": "tertiary"}, "55 mph") - new_york.add_rule({"highway": "residential"}, "30 mph") - new_york.add_rule({"highway": "primary_link"}, "45 mph") - new_york.add_rule({"highway": "secondary_link"}, "55 mph") - new_york.add_rule({"highway": "tertiary_link"}, "55 mph") - # All if not written by the state, the rules will default to the country rules - - #california = US.add_region("California") - # California uses only the default US rules - - michigan = US.add_region("Michigan") - michigan.add_rule({"highway": "motorway"}, "70 mph") - - oregon = US.add_region("Oregon") - oregon.add_rule({"highway": "motorway"}, "55 mph") - oregon.add_rule({"highway": "secondary"}, "35 mph") - oregon.add_rule({"highway": "tertiary"}, "30 mph") - oregon.add_rule({"highway": "service"}, "15 mph") - oregon.add_rule({"highway": "secondary_link"}, "35 mph") - oregon.add_rule({"highway": "tertiary_link"}, "30 mph") - - south_dakota = US.add_region("South Dakota") - south_dakota.add_rule({"highway": "motorway"}, "80 mph") - south_dakota.add_rule({"highway": "trunk"}, "70 mph") - south_dakota.add_rule({"highway": "primary"}, "65 mph") - south_dakota.add_rule({"highway": "trunk_link"}, "70 mph") - south_dakota.add_rule({"highway": "primary_link"}, "65 mph") - - wisconsin = US.add_region("Wisconsin") - wisconsin.add_rule({"highway": "trunk"}, "65 mph") - wisconsin.add_rule({"highway": "tertiary"}, "45 mph") - wisconsin.add_rule({"highway": "unclassified"}, "35 mph") - wisconsin.add_rule({"highway": "trunk_link"}, "65 mph") - wisconsin.add_rule({"highway": "tertiary_link"}, "45 mph") - - """ - -------------------------------------------------- - AU - Australia - -------------------------------------------------- - """ - AU = Country("AU") - countries.append(AU) - - """ Default rules """ - AU.add_rule({"highway": "motorway"}, "100") - AU.add_rule({"highway": "trunk"}, "80") - AU.add_rule({"highway": "primary"}, "80") - AU.add_rule({"highway": "secondary"}, "50") - AU.add_rule({"highway": "tertiary"}, "50") - AU.add_rule({"highway": "unclassified"}, "80") - AU.add_rule({"highway": "residential"}, "50") - AU.add_rule({"highway": "service"}, "40") - AU.add_rule({"highway": "motorway_link"}, "90") - AU.add_rule({"highway": "trunk_link"}, "80") - AU.add_rule({"highway": "primary_link"}, "80") - AU.add_rule({"highway": "secondary_link"}, "50") - AU.add_rule({"highway": "tertiary_link"}, "50") - AU.add_rule({"highway": "living_street"}, "30") - - """ - -------------------------------------------------- - CA - Canada - -------------------------------------------------- - """ - CA = Country("CA") - countries.append(CA) - - """ Default rules """ - CA.add_rule({"highway": "motorway"}, "100") - CA.add_rule({"highway": "trunk"}, "80") - CA.add_rule({"highway": "primary"}, "80") - CA.add_rule({"highway": "secondary"}, "50") - CA.add_rule({"highway": "tertiary"}, "50") - CA.add_rule({"highway": "unclassified"}, "80") - CA.add_rule({"highway": "residential"}, "40") - CA.add_rule({"highway": "service"}, "40") - CA.add_rule({"highway": "motorway_link"}, "90") - CA.add_rule({"highway": "trunk_link"}, "80") - CA.add_rule({"highway": "primary_link"}, "80") - CA.add_rule({"highway": "secondary_link"}, "50") - CA.add_rule({"highway": "tertiary_link"}, "50") - CA.add_rule({"highway": "living_street"}, "20") - - - """ - -------------------------------------------------- - DE - Germany - -------------------------------------------------- - """ - DE = Country("DE") - countries.append(DE) - - """ Default rules """ - DE.add_rule({"highway": "motorway"}, "none") - DE.add_rule({"highway": "living_street"}, "10") - DE.add_rule({"highway": "residential"}, "30") - DE.add_rule({"zone:traffic": "DE:rural"}, "100") - DE.add_rule({"zone:traffic": "DE:urban"}, "50") - DE.add_rule({"zone:maxspeed": "DE:30"}, "30") - DE.add_rule({"zone:maxspeed": "DE:urban"}, "50") - DE.add_rule({"zone:maxspeed": "DE:rural"}, "100") - DE.add_rule({"zone:maxspeed": "DE:motorway"}, "none") - DE.add_rule({"bicycle_road": "yes"}, "30") - - - """ - -------------------------------------------------- - EE - Estonia - -------------------------------------------------- - """ - EE = Country("EE") - countries.append(EE) - - """ Default rules """ - EE.add_rule({"highway": "motorway"}, "90") - EE.add_rule({"highway": "trunk"}, "90") - EE.add_rule({"highway": "primary"}, "90") - EE.add_rule({"highway": "secondary"}, "50") - EE.add_rule({"highway": "tertiary"}, "50") - EE.add_rule({"highway": "unclassified"}, "90") - EE.add_rule({"highway": "residential"}, "40") - EE.add_rule({"highway": "service"}, "40") - EE.add_rule({"highway": "motorway_link"}, "90") - EE.add_rule({"highway": "trunk_link"}, "70") - EE.add_rule({"highway": "primary_link"}, "70") - EE.add_rule({"highway": "secondary_link"}, "50") - EE.add_rule({"highway": "tertiary_link"}, "50") - EE.add_rule({"highway": "living_street"}, "20") - - - """ --- DO NOT MODIFY CODE BELOW THIS LINE --- """ - """ --- ADD YOUR COUNTRY OR STATE ABOVE --- """ - - # Final step - write_json(countries, filename) - -def write_json(countries, filename = DEFAULT_OUTPUT_FILENAME): - out_dict = {} - for country in countries: - out_dict.update(country.jsonify()) - json_string = json.dumps(out_dict, indent=2) - with open(filename, "wb") as f: - f.write(json_string) - - -class Region(object): - ALLOWABLE_TAG_KEYS = ["highway", "zone:traffic", "bicycle_road", "zone:maxspeed"] - ALLOWABLE_HIGHWAY_TYPES = ["motorway", "trunk", "primary", "secondary", "tertiary", "unclassified", "residential", "service", "motorway_link", "trunk_link", "primary_link", "secondary_link", "tertiary_link", "living_street"] - def __init__(self, name): - self.name = name - self.rules = [] - - def add_rule(self, tag_conditions, speed): - new_rule = {} - if not isinstance(tag_conditions, dict): - raise TypeError("Rule tag conditions must be dictionary") - if not all(tag_key in self.ALLOWABLE_TAG_KEYS for tag_key in tag_conditions): - raise ValueError("Rule tag keys must be in allowable tag kesy") # If this is by mistake, please update ALLOWABLE_TAG_KEYS - if 'highway' in tag_conditions: - if not tag_conditions['highway'] in self.ALLOWABLE_HIGHWAY_TYPES: - raise ValueError("Invalid Highway type {}".format(tag_conditions["highway"])) - new_rule['tags'] = tag_conditions - try: - new_rule['speed'] = str(speed) - except ValueError: - raise ValueError("Rule speed must be string") - self.rules.append(new_rule) - - def jsonify(self): - ret_dict = {} - ret_dict[self.name] = self.rules - return ret_dict - -class Country(Region): - ALLOWABLE_COUNTRY_CODES = ["AF","AX","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BQ","BA","BW","BV","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CW","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MK","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SZ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"] - def __init__(self, ISO_3166_alpha_2): - Region.__init__(self, ISO_3166_alpha_2) - if ISO_3166_alpha_2 not in self.ALLOWABLE_COUNTRY_CODES: - raise ValueError("Not valid IOS 3166 country code") - self.regions = {} - - def add_region(self, name): - self.regions[name] = Region(name) - return self.regions[name] - - def jsonify(self): - ret_dict = {} - ret_dict[self.name] = {} - for r_name, region in self.regions.items(): - ret_dict[self.name].update(region.jsonify()) - ret_dict[self.name]['Default'] = self.rules - return ret_dict - - -if __name__ == '__main__': - main() diff --git a/selfdrive/mapd/mapd.py b/selfdrive/mapd/mapd.py deleted file mode 100755 index b123fc68b..000000000 --- a/selfdrive/mapd/mapd.py +++ /dev/null @@ -1,297 +0,0 @@ -#!/usr/bin/env python - -# Add phonelibs openblas to LD_LIBRARY_PATH if import fails -from common.basedir import BASEDIR -try: - from scipy import spatial -except ImportError as e: - import os - import sys - - - openblas_path = os.path.join(BASEDIR, "phonelibs/openblas/") - os.environ['LD_LIBRARY_PATH'] += ':' + openblas_path - - args = [sys.executable] - args.extend(sys.argv) - os.execv(sys.executable, args) - -DEFAULT_SPEEDS_BY_REGION_JSON_FILE = BASEDIR + "/selfdrive/mapd/default_speeds_by_region.json" -from selfdrive.mapd import default_speeds_generator -default_speeds_generator.main(DEFAULT_SPEEDS_BY_REGION_JSON_FILE) - -import os -import sys -import time -import zmq -import threading -import numpy as np -import overpy -from collections import defaultdict - -from common.params import Params -from common.transformations.coordinates import geodetic2ecef -from selfdrive.services import service_list -import selfdrive.messaging as messaging -from selfdrive.mapd.mapd_helpers import MAPS_LOOKAHEAD_DISTANCE, Way, circle_through_points -import selfdrive.crash as crash -from selfdrive.version import version, dirty - - -OVERPASS_API_URL = "https://overpass.kumi.systems/api/interpreter" -OVERPASS_HEADERS = { - 'User-Agent': 'NEOS (comma.ai)', - 'Accept-Encoding': 'gzip' -} - -last_gps = None -query_lock = threading.Lock() -last_query_result = None -last_query_pos = None -cache_valid = False - -def build_way_query(lat, lon, radius=50): - """Builds a query to find all highways within a given radius around a point""" - pos = " (around:%f,%f,%f)" % (radius, lat, lon) - lat_lon = "(%f,%f)" % (lat, lon) - q = """( - way - """ + pos + """ - [highway][highway!~"^(footway|path|bridleway|steps|cycleway|construction|bus_guideway|escape)$"]; - >;);out;""" + """is_in""" + lat_lon + """;area._[admin_level~"[24]"]; - convert area ::id = id(), admin_level = t['admin_level'], - name = t['name'], "ISO3166-1:alpha2" = t['ISO3166-1:alpha2'];out; - """ - return q - - -def query_thread(): - global last_query_result, last_query_pos, cache_valid - api = overpy.Overpass(url=OVERPASS_API_URL, headers=OVERPASS_HEADERS, timeout=10.) - - while True: - time.sleep(1) - if last_gps is not None: - fix_ok = last_gps.flags & 1 - if not fix_ok: - continue - - if last_query_pos is not None: - cur_ecef = geodetic2ecef((last_gps.latitude, last_gps.longitude, last_gps.altitude)) - prev_ecef = geodetic2ecef((last_query_pos.latitude, last_query_pos.longitude, last_query_pos.altitude)) - dist = np.linalg.norm(cur_ecef - prev_ecef) - if dist < 1000: #updated when we are 1km from the edge of the downloaded circle - continue - - if dist > 3000: - cache_valid = False - - q = build_way_query(last_gps.latitude, last_gps.longitude, radius=3000) - try: - new_result = api.query(q) - - # Build kd-tree - nodes = [] - real_nodes = [] - node_to_way = defaultdict(list) - location_info = {} - - for n in new_result.nodes: - nodes.append((float(n.lat), float(n.lon), 0)) - real_nodes.append(n) - - for way in new_result.ways: - for n in way.nodes: - node_to_way[n.id].append(way) - - for area in new_result.areas: - if area.tags.get('admin_level', '') == "2": - location_info['country'] = area.tags.get('ISO3166-1:alpha2', '') - if area.tags.get('admin_level', '') == "4": - location_info['region'] = area.tags.get('name', '') - - nodes = np.asarray(nodes) - nodes = geodetic2ecef(nodes) - tree = spatial.cKDTree(nodes) - - query_lock.acquire() - last_query_result = new_result, tree, real_nodes, node_to_way, location_info - last_query_pos = last_gps - cache_valid = True - query_lock.release() - - except Exception as e: - print(e) - query_lock.acquire() - last_query_result = None - query_lock.release() - - -def mapsd_thread(): - global last_gps - - context = zmq.Context() - gps_sock = messaging.sub_sock(context, service_list['gpsLocation'].port, conflate=True) - gps_external_sock = messaging.sub_sock(context, service_list['gpsLocationExternal'].port, conflate=True) - map_data_sock = messaging.pub_sock(context, service_list['liveMapData'].port) - - cur_way = None - curvature_valid = False - curvature = None - upcoming_curvature = 0. - dist_to_turn = 0. - road_points = None - - while True: - gps = messaging.recv_one(gps_sock) - gps_ext = messaging.recv_one_or_none(gps_external_sock) - - if gps_ext is not None: - gps = gps_ext.gpsLocationExternal - else: - gps = gps.gpsLocation - - last_gps = gps - - fix_ok = gps.flags & 1 - if not fix_ok or last_query_result is None or not cache_valid: - cur_way = None - curvature = None - curvature_valid = False - upcoming_curvature = 0. - dist_to_turn = 0. - road_points = None - map_valid = False - else: - map_valid = True - lat = gps.latitude - lon = gps.longitude - heading = gps.bearing - speed = gps.speed - - query_lock.acquire() - cur_way = Way.closest(last_query_result, lat, lon, heading, cur_way) - if cur_way is not None: - pnts, curvature_valid = cur_way.get_lookahead(lat, lon, heading, MAPS_LOOKAHEAD_DISTANCE) - - xs = pnts[:, 0] - ys = pnts[:, 1] - road_points = [float(x) for x in xs], [float(y) for y in ys] - - if speed < 10: - curvature_valid = False - if curvature_valid and pnts.shape[0] <= 3: - curvature_valid = False - - # The curvature is valid when at least MAPS_LOOKAHEAD_DISTANCE of road is found - if curvature_valid: - # Compute the curvature for each point - with np.errstate(divide='ignore'): - circles = [circle_through_points(*p) for p in zip(pnts, pnts[1:], pnts[2:])] - circles = np.asarray(circles) - radii = np.nan_to_num(circles[:, 2]) - radii[radii < 10] = np.inf - curvature = 1. / radii - - # Index of closest point - closest = np.argmin(np.linalg.norm(pnts, axis=1)) - dist_to_closest = pnts[closest, 0] # We can use x distance here since it should be close - - # Compute distance along path - dists = list() - dists.append(0) - for p, p_prev in zip(pnts, pnts[1:, :]): - dists.append(dists[-1] + np.linalg.norm(p - p_prev)) - dists = np.asarray(dists) - dists = dists - dists[closest] + dist_to_closest - dists = dists[1:-1] - - close_idx = np.logical_and(dists > 0, dists < 500) - dists = dists[close_idx] - curvature = curvature[close_idx] - - if len(curvature): - # TODO: Determine left or right turn - curvature = np.nan_to_num(curvature) - - # Outlier rejection - new_curvature = np.percentile(curvature, 90, interpolation='lower') - - k = 0.6 - upcoming_curvature = k * upcoming_curvature + (1 - k) * new_curvature - in_turn_indices = curvature > 0.8 * new_curvature - - if np.any(in_turn_indices): - dist_to_turn = np.min(dists[in_turn_indices]) - else: - dist_to_turn = 999 - else: - upcoming_curvature = 0. - dist_to_turn = 999 - - query_lock.release() - - dat = messaging.new_message() - dat.init('liveMapData') - - if last_gps is not None: - dat.liveMapData.lastGps = last_gps - - if cur_way is not None: - dat.liveMapData.wayId = cur_way.id - - # Speed limit - max_speed = cur_way.max_speed() - if max_speed is not None: - dat.liveMapData.speedLimitValid = True - dat.liveMapData.speedLimit = max_speed - - # TODO: use the function below to anticipate upcoming speed limits - #max_speed_ahead, max_speed_ahead_dist = cur_way.max_speed_ahead(max_speed, lat, lon, heading, MAPS_LOOKAHEAD_DISTANCE) - #if max_speed_ahead is not None and max_speed_ahead_dist is not None: - # dat.liveMapData.speedLimitAheadValid = True - # dat.liveMapData.speedLimitAhead = float(max_speed_ahead) - # dat.liveMapData.speedLimitAheadDistance = float(max_speed_ahead_dist) - - - advisory_max_speed = cur_way.advisory_max_speed() - if advisory_max_speed is not None: - dat.liveMapData.speedAdvisoryValid = True - dat.liveMapData.speedAdvisory = advisory_max_speed - - # Curvature - dat.liveMapData.curvatureValid = curvature_valid - dat.liveMapData.curvature = float(upcoming_curvature) - dat.liveMapData.distToTurn = float(dist_to_turn) - if road_points is not None: - dat.liveMapData.roadX, dat.liveMapData.roadY = road_points - if curvature is not None: - dat.liveMapData.roadCurvatureX = [float(x) for x in dists] - dat.liveMapData.roadCurvature = [float(x) for x in curvature] - - dat.liveMapData.mapValid = map_valid - - map_data_sock.send(dat.to_bytes()) - - -def main(gctx=None): - params = Params() - dongle_id = params.get("DongleId") - crash.bind_user(id=dongle_id) - crash.bind_extra(version=version, dirty=dirty, is_eon=True) - crash.install() - - main_thread = threading.Thread(target=mapsd_thread) - main_thread.daemon = True - main_thread.start() - - q_thread = threading.Thread(target=query_thread) - q_thread.daemon = True - q_thread.start() - - while True: - time.sleep(0.1) - - -if __name__ == "__main__": - main() diff --git a/selfdrive/mapd/mapd_helpers.py b/selfdrive/mapd/mapd_helpers.py deleted file mode 100644 index 58a33ee41..000000000 --- a/selfdrive/mapd/mapd_helpers.py +++ /dev/null @@ -1,364 +0,0 @@ -import math -import json -import numpy as np -from datetime import datetime -from common.basedir import BASEDIR -from selfdrive.config import Conversions as CV -from common.transformations.coordinates import LocalCoord, geodetic2ecef - -LOOKAHEAD_TIME = 10. -MAPS_LOOKAHEAD_DISTANCE = 50 * LOOKAHEAD_TIME - -DEFAULT_SPEEDS_JSON_FILE = BASEDIR + "/selfdrive/mapd/default_speeds.json" -DEFAULT_SPEEDS = {} -with open(DEFAULT_SPEEDS_JSON_FILE, "rb") as f: - DEFAULT_SPEEDS = json.loads(f.read()) - -DEFAULT_SPEEDS_BY_REGION_JSON_FILE = BASEDIR + "/selfdrive/mapd/default_speeds_by_region.json" -DEFAULT_SPEEDS_BY_REGION = {} -with open(DEFAULT_SPEEDS_BY_REGION_JSON_FILE, "rb") as f: - DEFAULT_SPEEDS_BY_REGION = json.loads(f.read()) - -def circle_through_points(p1, p2, p3): - """Fits a circle through three points - Formulas from: http://www.ambrsoft.com/trigocalc/circle3d.htm""" - x1, y1, _ = p1 - x2, y2, _ = p2 - x3, y3, _ = p3 - - A = x1 * (y2 - y3) - y1 * (x2 - x3) + x2 * y3 - x3 * y2 - B = (x1**2 + y1**2) * (y3 - y2) + (x2**2 + y2**2) * (y1 - y3) + (x3**2 + y3**2) * (y2 - y1) - C = (x1**2 + y1**2) * (x2 - x3) + (x2**2 + y2**2) * (x3 - x1) + (x3**2 + y3**2) * (x1 - x2) - D = (x1**2 + y1**2) * (x3 * y2 - x2 * y3) + (x2**2 + y2**2) * (x1 * y3 - x3 * y1) + (x3**2 + y3**2) * (x2 * y1 - x1 * y2) - - return (-B / (2 * A), - C / (2 * A), np.sqrt((B**2 + C**2 - 4 * A * D) / (4 * A**2))) - -def parse_speed_unit(max_speed): - """Converts a maxspeed string to m/s based on the unit present in the input. - OpenStreetMap defaults to kph if no unit is present. """ - - if not max_speed: - return None - - conversion = CV.KPH_TO_MS - if 'mph' in max_speed: - max_speed = max_speed.replace(' mph', '') - conversion = CV.MPH_TO_MS - try: - return float(max_speed) * conversion - except ValueError: - return None - -def parse_speed_tags(tags): - """Parses tags on a way to find the maxspeed string""" - max_speed = None - - if 'maxspeed' in tags: - max_speed = tags['maxspeed'] - - if 'maxspeed:conditional' in tags: - try: - max_speed_cond, cond = tags['maxspeed:conditional'].split(' @ ') - cond = cond[1:-1] - - start, end = cond.split('-') - now = datetime.now() # TODO: Get time and timezone from gps fix so this will work correctly on replays - start = datetime.strptime(start, "%H:%M").replace(year=now.year, month=now.month, day=now.day) - end = datetime.strptime(end, "%H:%M").replace(year=now.year, month=now.month, day=now.day) - - if start <= now <= end: - max_speed = max_speed_cond - except ValueError: - pass - - if not max_speed and 'source:maxspeed' in tags: - max_speed = DEFAULT_SPEEDS.get(tags['source:maxspeed'], None) - if not max_speed and 'maxspeed:type' in tags: - max_speed = DEFAULT_SPEEDS.get(tags['maxspeed:type'], None) - - max_speed = parse_speed_unit(max_speed) - return max_speed - -def geocode_maxspeed(tags, location_info): - max_speed = None - try: - geocode_country = location_info.get('country', '') - geocode_region = location_info.get('region', '') - - country_rules = DEFAULT_SPEEDS_BY_REGION.get(geocode_country, {}) - country_defaults = country_rules.get('Default', []) - for rule in country_defaults: - rule_valid = all( - tag_name in tags - and tags[tag_name] == value - for tag_name, value in rule['tags'].items() - ) - if rule_valid: - max_speed = rule['speed'] - break #stop searching country - - region_rules = country_rules.get(geocode_region, []) - for rule in region_rules: - rule_valid = all( - tag_name in tags - and tags[tag_name] == value - for tag_name, value in rule['tags'].items() - ) - if rule_valid: - max_speed = rule['speed'] - break #stop searching region - except KeyError: - pass - max_speed = parse_speed_unit(max_speed) - return max_speed - -class Way: - def __init__(self, way, query_results): - self.id = way.id - self.way = way - self.query_results = query_results - - points = list() - - for node in self.way.get_nodes(resolve_missing=False): - points.append((float(node.lat), float(node.lon), 0.)) - - self.points = np.asarray(points) - - @classmethod - def closest(cls, query_results, lat, lon, heading, prev_way=None): - results, tree, real_nodes, node_to_way, location_info = query_results - - cur_pos = geodetic2ecef((lat, lon, 0)) - nodes = tree.query_ball_point(cur_pos, 500) - - # If no nodes within 500m, choose closest one - if not nodes: - nodes = [tree.query(cur_pos)[1]] - - ways = [] - for n in nodes: - real_node = real_nodes[n] - ways += node_to_way[real_node.id] - ways = set(ways) - - closest_way = None - best_score = None - for way in ways: - way = Way(way, query_results) - points = way.points_in_car_frame(lat, lon, heading) - - on_way = way.on_way(lat, lon, heading, points) - if not on_way: - continue - - # Create mask of points in front and behind - x = points[:, 0] - y = points[:, 1] - angles = np.arctan2(y, x) - front = np.logical_and((-np.pi / 2) < angles, - angles < (np.pi / 2)) - behind = np.logical_not(front) - - dists = np.linalg.norm(points, axis=1) - - # Get closest point behind the car - dists_behind = np.copy(dists) - dists_behind[front] = np.NaN - closest_behind = points[np.nanargmin(dists_behind)] - - # Get closest point in front of the car - dists_front = np.copy(dists) - dists_front[behind] = np.NaN - closest_front = points[np.nanargmin(dists_front)] - - # fit line: y = a*x + b - x1, y1, _ = closest_behind - x2, y2, _ = closest_front - a = (y2 - y1) / max((x2 - x1), 1e-5) - b = y1 - a * x1 - - # With a factor of 60 a 20m offset causes the same error as a 20 degree heading error - # (A 20 degree heading offset results in an a of about 1/3) - score = abs(a) * 60. + abs(b) - - # Prefer same type of road - if prev_way is not None: - if way.way.tags.get('highway', '') == prev_way.way.tags.get('highway', ''): - score *= 0.5 - - if closest_way is None or score < best_score: - closest_way = way - best_score = score - - # Normal score is < 5 - if best_score > 50: - return None - - return closest_way - - def __str__(self): - return "%s %s" % (self.id, self.way.tags) - - def max_speed(self): - """Extracts the (conditional) speed limit from a way""" - if not self.way: - return None - - max_speed = parse_speed_tags(self.way.tags) - if not max_speed: - location_info = self.query_results[4] - max_speed = geocode_maxspeed(self.way.tags, location_info) - - return max_speed - - def max_speed_ahead(self, current_speed_limit, lat, lon, heading, lookahead): - """Look ahead for a max speed""" - if not self.way: - return None - - speed_ahead = None - speed_ahead_dist = None - lookahead_ways = 5 - way = self - for i in range(lookahead_ways): - way_pts = way.points_in_car_frame(lat, lon, heading) - - # Check current lookahead distance - max_dist = np.linalg.norm(way_pts[-1, :]) - - if max_dist > 2 * lookahead: - break - - if 'maxspeed' in way.way.tags: - spd = parse_speed_tags(way.way.tags) - if not spd: - location_info = self.query_results[4] - spd = geocode_maxspeed(way.way.tags, location_info) - if spd < current_speed_limit: - speed_ahead = spd - min_dist = np.linalg.norm(way_pts[1, :]) - speed_ahead_dist = min_dist - break - # Find next way - way = way.next_way() - if not way: - break - - return speed_ahead, speed_ahead_dist - - def advisory_max_speed(self): - if not self.way: - return None - - tags = self.way.tags - adv_speed = None - - if 'maxspeed:advisory' in tags: - adv_speed = tags['maxspeed:advisory'] - adv_speed = parse_speed_unit(adv_speed) - return adv_speed - - def on_way(self, lat, lon, heading, points=None): - if points is None: - points = self.points_in_car_frame(lat, lon, heading) - x = points[:, 0] - return np.min(x) < 0. and np.max(x) > 0. - - def closest_point(self, lat, lon, heading, points=None): - if points is None: - points = self.points_in_car_frame(lat, lon, heading) - i = np.argmin(np.linalg.norm(points, axis=1)) - return points[i] - - def distance_to_closest_node(self, lat, lon, heading, points=None): - if points is None: - points = self.points_in_car_frame(lat, lon, heading) - return np.min(np.linalg.norm(points, axis=1)) - - def points_in_car_frame(self, lat, lon, heading): - lc = LocalCoord.from_geodetic([lat, lon, 0.]) - - # Build rotation matrix - heading = math.radians(-heading + 90) - c, s = np.cos(heading), np.sin(heading) - rot = np.array([[c, s, 0.], [-s, c, 0.], [0., 0., 1.]]) - - # Convert to local coordinates - points_carframe = lc.geodetic2ned(self.points).T - - # Rotate with heading of car - points_carframe = np.dot(rot, points_carframe[(1, 0, 2), :]).T - - return points_carframe - - def next_way(self, backwards=False): - results, tree, real_nodes, node_to_way, location_info = self.query_results - - if backwards: - node = self.way.nodes[0] - else: - node = self.way.nodes[-1] - - ways = node_to_way[node.id] - - way = None - try: - # Simple heuristic to find next way - ways = [w for w in ways if w.id != self.id] - ways = [w for w in ways if w.nodes[0] == node] - - # Filter on highway tag - acceptable_tags = list() - cur_tag = self.way.tags['highway'] - acceptable_tags.append(cur_tag) - if cur_tag == 'motorway_link': - acceptable_tags.append('motorway') - acceptable_tags.append('trunk') - acceptable_tags.append('primary') - ways = [w for w in ways if w.tags['highway'] in acceptable_tags] - - # Filter on number of lanes - cur_num_lanes = int(self.way.tags['lanes']) - if len(ways) > 1: - ways_same_lanes = [w for w in ways if int(w.tags['lanes']) == cur_num_lanes] - if len(ways_same_lanes) == 1: - ways = ways_same_lanes - if len(ways) > 1: - ways = [w for w in ways if int(w.tags['lanes']) > cur_num_lanes] - if len(ways) == 1: - way = Way(ways[0], self.query_results) - - except (KeyError, ValueError): - pass - - return way - - def get_lookahead(self, lat, lon, heading, lookahead): - pnts = None - way = self - valid = False - - for i in range(5): - # Get new points and append to list - new_pnts = way.points_in_car_frame(lat, lon, heading) - - if pnts is None: - pnts = new_pnts - else: - pnts = np.vstack([pnts, new_pnts]) - - # Check current lookahead distance - max_dist = np.linalg.norm(pnts[-1, :]) - if max_dist > lookahead: - valid = True - - if max_dist > 2 * lookahead: - break - - # Find next way - way = way.next_way() - if not way: - break - - return pnts, valid diff --git a/selfdrive/registration.py b/selfdrive/registration.py index 9b7e6964e..9e4c89b4c 100644 --- a/selfdrive/registration.py +++ b/selfdrive/registration.py @@ -1,10 +1,16 @@ +import os import json import subprocess +import struct +import jwt +from datetime import datetime, timedelta from selfdrive.swaglog import cloudlog -from selfdrive.version import version, training_version +from selfdrive.version import version, training_version, get_git_commit, get_git_branch, get_git_remote from common.api import api_get from common.params import Params +from common.file_helpers import mkdirs_exists_ok + def get_imei(): ret = subprocess.check_output(["getprop", "oem.device.imeicache"]).strip() @@ -12,17 +18,38 @@ def get_imei(): ret = "000000000000000" return ret + def get_serial(): return subprocess.check_output(["getprop", "ro.serialno"]).strip() -def get_git_commit(): - return subprocess.check_output(["git", "rev-parse", "HEAD"]).strip() -def get_git_branch(): - return subprocess.check_output(["git", "rev-parse", "--abbrev-ref", "HEAD"]).strip() +# TODO: move this to a library +def parse_service_call(call): + ret = subprocess.check_output(call).strip() + if 'Parcel' not in ret: + return None + try: + def fh(x): + if len(x) != 8: + return [] + return [x[6:8], x[4:6], x[2:4], x[0:2]] + hd = [] + for x in ret.split("\n")[1:]: + for k in map(fh, x.split(": ")[1].split(" '")[0].split(" ")): + hd.extend(k) + return ''.join([chr(int(x, 16)) for x in hd]) + except Exception: + return None + + +def get_subscriber_info(): + ret = parse_service_call(["service", "call", "iphonesubinfo", "7"]) + if ret is None or len(ret) < 8: + return "" + if struct.unpack("I", ret[4:8]) == -1: + return "" + return ret[8:-2:2] -def get_git_remote(): - return subprocess.check_output(["git", "config", "--get", "remote.origin.url"]).strip() def register(): params = Params() @@ -31,23 +58,42 @@ def register(): params.put("GitCommit", get_git_commit()) params.put("GitBranch", get_git_branch()) params.put("GitRemote", get_git_remote()) + params.put("SubscriberInfo", get_subscriber_info()) + + # create a key for auth + # your private key is kept on your device persist partition and never sent to our servers + # do not erase your persist partition + if not os.path.isfile("/persist/comma/id_rsa.pub"): + cloudlog.warning("generating your personal RSA key") + mkdirs_exists_ok("/persist/comma") + assert os.system("echo -e 'y\n' | ssh-keygen -t rsa -b 2048 -f /persist/comma/id_rsa.tmp -N ''") == 0 + os.rename("/persist/comma/id_rsa.tmp", "/persist/comma/id_rsa") + os.rename("/persist/comma/id_rsa.tmp.pub", "/persist/comma/id_rsa.pub") dongle_id, access_token = params.get("DongleId"), params.get("AccessToken") + public_key = open("/persist/comma/id_rsa.pub").read() + + # create registration token + # in the future, this key will make JWTs directly + private_key = open("/persist/comma/id_rsa").read() + register_token = jwt.encode({'register':True, 'exp': datetime.utcnow() + timedelta(hours=1)}, private_key, algorithm='RS256') try: - if dongle_id is None or access_token is None: - cloudlog.info("getting pilotauth") - resp = api_get("v1/pilotauth/", method='POST', timeout=15, - imei=get_imei(), serial=get_serial()) - dongleauth = json.loads(resp.text) - dongle_id, access_token = dongleauth["dongle_id"].encode('ascii'), dongleauth["access_token"].encode('ascii') + cloudlog.info("getting pilotauth") + resp = api_get("v2/pilotauth/", method='POST', timeout=15, + imei=get_imei(), serial=get_serial(), public_key=public_key, register_token=register_token) + dongleauth = json.loads(resp.text) + dongle_id, access_token = dongleauth["dongle_id"].encode('ascii'), dongleauth["access_token"].encode('ascii') - params.put("DongleId", dongle_id) - params.put("AccessToken", access_token) + params.put("DongleId", dongle_id) + params.put("AccessToken", access_token) return dongle_id, access_token except Exception: cloudlog.exception("failed to authenticate") - return None + if dongle_id is not None and access_token is not None: + return dongle_id, access_token + else: + return None if __name__ == "__main__": print(api_get("").text) diff --git a/selfdrive/sensord/gpsd b/selfdrive/sensord/gpsd index 9d1ef14812088fc91d90dfca1d160ea19de774cb..78c105a7d8c33e8144812cc674f842d49dc4fb5b 100755 GIT binary patch delta 59 zcmca{!2QMn_l6e67N!>F7M2#)7Pc1l7LFFq7OocV7M?AF7M2#)7Pc1l7LFFq7OocV7M?AF7M2#)7Pc1l7LFFq7OocVEj;UPGa9$Azs&>0ygF7M2#)7Pc1l7LFFq7OocVEj;UPGa9w8zs&>0yg 50 or location.speed < 2: - # bad location, stop if we havent gotten a location in a while - # dont stop if we're been going for less than a minute - if started_ts: - if rt-self.last_good_loc > 60. and rt-started_ts > 60: - cloudlog.event("location_stop", - ts=rt, - started_ts=started_ts, - last_good_loc=self.last_good_loc, - location=location.to_dict() if location else None) - return False - else: - return True - else: - return False - - self.last_good_loc = rt - - if started_ts: - return True - else: - cloudlog.event("location_start", location=location.to_dict() if location else None) - return location.speed*3.6 > 10 - - def thermald_thread(): setup_eon_fan() @@ -170,10 +139,10 @@ def thermald_thread(): started_ts = None ignition_seen = False started_seen = False - passive_starter = LocationStarter() thermal_status = ThermalStatus.green health_sock.RCVTIMEO = 1500 current_filter = FirstOrderFilter(0., CURRENT_TAU, 1.) + health_prev = None # Make sure charging is enabled charging_disabled = False @@ -187,9 +156,13 @@ def thermald_thread(): location = location.gpsLocation if location else None msg = read_thermal() + # clear car params when panda gets disconnected + if health is None and health_prev is not None: + params.panda_disconnect() + health_prev = health + # loggerd is gated based on free space - statvfs = os.statvfs(ROOT) - avail = (statvfs.f_bavail * 1.0)/statvfs.f_blocks + avail = get_available_percent() / 100.0 # thermal message now also includes free space msg.thermal.freeSpace = avail @@ -253,17 +226,9 @@ def thermald_thread(): # have we seen a panda? passive = (params.get("Passive") == "1") - # start on gps movement if we haven't seen ignition and are in passive mode - should_start = should_start or (not (ignition_seen and health) # seen ignition and panda is connected - and passive - and passive_starter.update(started_ts, location)) - # with 2% left, we killall, otherwise the phone will take a long time to boot should_start = should_start and msg.thermal.freeSpace > 0.02 - # require usb power in passive mode - should_start = should_start and (not passive or msg.thermal.usbOnline) - # confirm we have completed training and aren't uninstalling should_start = should_start and accepted_terms and (passive or completed_training) and (not do_uninstall) @@ -276,7 +241,6 @@ def thermald_thread(): if should_start: off_ts = None if started_ts is None: - params.car_start() started_ts = sec_since_boot() started_seen = True os.system('echo performance > /sys/class/devfreq/soc:qcom,cpubw/governor') @@ -295,7 +259,7 @@ def thermald_thread(): #charging_disabled = check_car_battery_voltage(should_start, health, charging_disabled) msg.thermal.chargingDisabled = charging_disabled - msg.thermal.chargingError = current_filter.x > 0. # if current is positive, then battery is being discharged + msg.thermal.chargingError = current_filter.x > 0. and msg.thermal.batteryPercent < 90 # if current is positive, then battery is being discharged msg.thermal.started = started_ts is not None msg.thermal.startedTs = int(1e9*(started_ts or 0)) @@ -319,4 +283,3 @@ def main(gctx=None): if __name__ == "__main__": main() - diff --git a/selfdrive/ui/start.py b/selfdrive/ui/start.py new file mode 100755 index 000000000..08bd6217e --- /dev/null +++ b/selfdrive/ui/start.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python +import os + +assert os.system("make") == 0 +os.environ['LD_LIBRARY_PATH'] = "/system/lib64:"+os.environ['LD_LIBRARY_PATH'] +os.execv("./ui", ["ui"]) + diff --git a/selfdrive/ui/start.sh b/selfdrive/ui/start.sh deleted file mode 100755 index 89704a5b6..000000000 --- a/selfdrive/ui/start.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -set -e - -make -export LD_LIBRARY_PATH=/system/lib64:$LD_LIBRARY_PATH -exec ./ui diff --git a/selfdrive/ui/ui.c b/selfdrive/ui/ui.c index dea27ab18..b6a97724c 100644 --- a/selfdrive/ui/ui.c +++ b/selfdrive/ui/ui.c @@ -19,6 +19,7 @@ #include "nanovg_gl.h" #include "nanovg_gl_utils.h" +#include "common/messaging.h" #include "common/timing.h" #include "common/util.h" #include "common/swaglog.h" @@ -48,6 +49,7 @@ #define ALERTSIZE_FULL 3 #define UI_BUF_COUNT 4 +//#define SHOW_SPEEDLIMIT 1 //#define DEBUG_TURN //#define DEBUG_FPS @@ -199,24 +201,17 @@ typedef struct UIState { int img_face; int img_map; - zsock_t *thermal_sock; + void *ctx; + void *thermal_sock_raw; - zsock_t *model_sock; void *model_sock_raw; - zsock_t *live100_sock; - void *live100_sock_raw; - zsock_t *livecalibration_sock; + void *controlsstate_sock_raw; void *livecalibration_sock_raw; - zsock_t *live20_sock; - void *live20_sock_raw; - zsock_t *livempc_sock; + void *radarstate_sock_raw; void *livempc_sock_raw; - zsock_t *plus_sock; void *plus_sock_raw; - zsock_t *map_data_sock; void *map_data_sock_raw; - zsock_t *uilayout_sock; void *uilayout_sock_raw; int plus_state; @@ -261,14 +256,15 @@ typedef struct UIState { int volume_timeout; int speed_lim_off_timeout; int is_metric_timeout; + int longitudinal_control_timeout; int limit_set_speed_timeout; int status; bool is_metric; + bool longitudinal_control; bool limit_set_speed; float speed_lim_off; bool is_ego_over_limit; - bool passive; char alert_type[64]; char alert_sound[64]; int alert_size; @@ -281,7 +277,7 @@ typedef struct UIState { // Hints for re-calculations and redrawing bool model_changed; - bool livempc_or_live20_changed; + bool livempc_or_radarstate_changed; GLuint frame_vao[2], frame_vbo[2], frame_ibo[2]; mat4 rear_frame_mat, front_frame_mat; @@ -289,7 +285,6 @@ typedef struct UIState { model_path_vertices_data model_path_vertices[MODEL_LANE_PATH_CNT * 2]; track_vertices_data track_vertices[2]; - } UIState; static int last_brightness = -1; @@ -312,12 +307,15 @@ static void set_awake(UIState *s, bool awake) { if (s->awake != awake) { s->awake = awake; + // TODO: replace command_awake and command_sleep with direct calls to android if (awake) { - LOG("awake normal"); + LOGW("awake normal"); + system("service call window 18 i32 1"); // enable event processing framebuffer_set_power(s->fb, HWC_POWER_MODE_NORMAL); } else { - LOG("awake off"); + LOGW("awake off"); set_brightness(s, 0); + system("service call window 18 i32 0"); // disable event processing framebuffer_set_power(s->fb, HWC_POWER_MODE_OFF); } } @@ -337,36 +335,42 @@ static void set_do_exit(int sig) { do_exit = 1; } -static void read_speed_lim_off(UIState *s) { - char *speed_lim_off = NULL; - read_db_value(NULL, "SpeedLimitOffset", &speed_lim_off, NULL); - s->speed_lim_off = 0.; - if (speed_lim_off) { - s->speed_lim_off = strtod(speed_lim_off, NULL); - free(speed_lim_off); +static void read_param_bool(bool* param, char* param_name) { + char *s; + const int result = read_db_value(NULL, param_name, &s, NULL); + if (result == 0) { + *param = s[0] == '1'; + free(s); } - s->speed_lim_off_timeout = 2 * UI_FREQ; // 0.5Hz } -static void read_is_metric(UIState *s) { - char *is_metric; - const int result = read_db_value(NULL, "IsMetric", &is_metric, NULL); +static void read_param_float(float* param, char* param_name) { + char *s; + const int result = read_db_value(NULL, param_name, &s, NULL); if (result == 0) { - s->is_metric = is_metric[0] == '1'; - free(is_metric); + *param = strtod(s, NULL); + free(s); } - s->is_metric_timeout = 2 * UI_FREQ; // 0.5Hz } -static void read_limit_set_speed(UIState *s) { - char *limit_set_speed; - const int result = read_db_value(NULL, "LimitSetSpeed", &limit_set_speed, NULL); - if (result == 0) { - s->limit_set_speed = limit_set_speed[0] == '1'; - free(limit_set_speed); +static void read_param_bool_timeout(bool* param, char* param_name, int* timeout) { + if (*timeout > 0){ + (*timeout)--; + } else { + read_param_bool(param, param_name); + *timeout = 2 * UI_FREQ; // 0.5Hz } - s->limit_set_speed_timeout = 2 * UI_FREQ; // 0.2Hz } + +static void read_param_float_timeout(float* param, char* param_name, int* timeout) { + if (*timeout > 0){ + (*timeout)--; + } else { + read_param_float(param, param_name); + *timeout = 2 * UI_FREQ; // 0.5Hz + } +} + static const char frame_vertex_shader[] = "attribute vec4 aPosition;\n" "attribute vec4 aTexCoord;\n" @@ -470,43 +474,20 @@ static void ui_init(UIState *s) { pthread_mutex_init(&s->lock, NULL); pthread_cond_init(&s->bg_cond, NULL); - // init connections + s->ctx = zmq_ctx_new(); - s->thermal_sock = zsock_new_sub(">tcp://127.0.0.1:8005", ""); - assert(s->thermal_sock); - s->thermal_sock_raw = zsock_resolve(s->thermal_sock); + s->thermal_sock_raw = sub_sock(s->ctx, "tcp://127.0.0.1:8005"); + s->model_sock_raw = sub_sock(s->ctx, "tcp://127.0.0.1:8009"); + s->controlsstate_sock_raw = sub_sock(s->ctx, "tcp://127.0.0.1:8007"); + s->uilayout_sock_raw = sub_sock(s->ctx, "tcp://127.0.0.1:8060"); + s->livecalibration_sock_raw = sub_sock(s->ctx, "tcp://127.0.0.1:8019"); + s->radarstate_sock_raw = sub_sock(s->ctx, "tcp://127.0.0.1:8012"); + s->livempc_sock_raw = sub_sock(s->ctx, "tcp://127.0.0.1:8035"); + s->plus_sock_raw = sub_sock(s->ctx, "tcp://127.0.0.1:8037"); - s->model_sock = zsock_new_sub(">tcp://127.0.0.1:8009", ""); - assert(s->model_sock); - s->model_sock_raw = zsock_resolve(s->model_sock); - - s->live100_sock = zsock_new_sub(">tcp://127.0.0.1:8007", ""); - assert(s->live100_sock); - s->live100_sock_raw = zsock_resolve(s->live100_sock); - - s->uilayout_sock = zsock_new_sub(">tcp://127.0.0.1:8060", ""); - assert(s->uilayout_sock); - s->uilayout_sock_raw = zsock_resolve(s->uilayout_sock); - - s->livecalibration_sock = zsock_new_sub(">tcp://127.0.0.1:8019", ""); - assert(s->livecalibration_sock); - s->livecalibration_sock_raw = zsock_resolve(s->livecalibration_sock); - - s->live20_sock = zsock_new_sub(">tcp://127.0.0.1:8012", ""); - assert(s->live20_sock); - s->live20_sock_raw = zsock_resolve(s->live20_sock); - - s->livempc_sock = zsock_new_sub(">tcp://127.0.0.1:8035", ""); - assert(s->livempc_sock); - s->livempc_sock_raw = zsock_resolve(s->livempc_sock); - - s->plus_sock = zsock_new_sub(">tcp://127.0.0.1:8037", ""); - assert(s->plus_sock); - s->plus_sock_raw = zsock_resolve(s->plus_sock); - - s->map_data_sock = zsock_new_sub(">tcp://127.0.0.1:8065", ""); - assert(s->map_data_sock); - s->map_data_sock_raw = zsock_resolve(s->map_data_sock); +#ifdef SHOW_SPEEDLIMIT + s->map_data_sock_raw = sub_sock(s->ctx, "tcp://127.0.0.1:8065"); +#endif s->ipc_fd = -1; @@ -565,14 +546,6 @@ static void ui_init(UIState *s) { assert(glGetError() == GL_NO_ERROR); - { - char *value; - const int result = read_db_value(NULL, "Passive", &value, NULL); - if (result == 0) { - s->passive = value[0] == '1'; - free(value); - } - } for(int i = 0; i < 2; i++) { float x1, x2, y1, y2; if (i == 1) { @@ -614,7 +587,7 @@ static void ui_init(UIState *s) { } s->model_changed = false; - s->livempc_or_live20_changed = false; + s->livempc_or_radarstate_changed = false; s->front_frame_mat = matmul(device_transform, full_to_wide_frame_transform); s->rear_frame_mat = matmul(device_transform, frame_transform); @@ -672,11 +645,15 @@ static void ui_init_vision(UIState *s, const VisionStreamBufs back_bufs, 0.0, 0.0, 0.0, 1.0, }}; - read_speed_lim_off(s); - read_is_metric(s); - read_limit_set_speed(s); - s->is_metric_timeout = UI_FREQ / 2; // offset so values isn't read together with limit offset - s->limit_set_speed_timeout = UI_FREQ; // offset so values isn't read together with limit offset + read_param_float(&s->speed_lim_off, "SpeedLimitOffset"); + read_param_bool(&s->is_metric, "IsMetric"); + read_param_bool(&s->longitudinal_control, "LongitudinalControl"); + read_param_bool(&s->limit_set_speed, "LimitSetSpeed"); + + // Set offsets so params don't get read at the same time + s->longitudinal_control_timeout = UI_FREQ / 3; + s->is_metric_timeout = UI_FREQ / 2; + s->limit_set_speed_timeout = UI_FREQ; } static void ui_draw_transformed_box(UIState *s, uint32_t color) { @@ -1045,9 +1022,9 @@ static void ui_draw_vision_lanes(UIState *s) { pvd + MODEL_LANE_PATH_CNT, nvgRGBAf(1.0, 1.0, 1.0, scene->model.right_lane.prob)); - if(s->livempc_or_live20_changed) { + if(s->livempc_or_radarstate_changed) { update_all_track_data(s); - s->livempc_or_live20_changed = false; + s->livempc_or_radarstate_changed = false; } // Draw vision path ui_draw_track(s, false, &s->track_vertices[0]); @@ -1087,6 +1064,10 @@ static void ui_draw_world(UIState *s) { } static void ui_draw_vision_maxspeed(UIState *s) { + /*if (!s->longitudinal_control){ + return; + }*/ + const UIScene *scene = &s->scene; int ui_viz_rx = scene->ui_viz_rx; int ui_viz_rw = scene->ui_viz_rw; @@ -1113,8 +1094,13 @@ static void ui_draw_vision_maxspeed(UIState *s) { int viz_maxspeed_x = (ui_viz_rx + (bdr_s*2)); int viz_maxspeed_y = (box_y + (bdr_s*1.5)); int viz_maxspeed_xo = 180; + +#ifdef SHOW_SPEEDLIMIT viz_maxspeed_w += viz_maxspeed_xo; viz_maxspeed_x += viz_maxspeed_w - (viz_maxspeed_xo * 2); +#else + viz_maxspeed_xo = 0; +#endif // Draw Background nvgBeginPath(s->vg); @@ -1420,7 +1406,10 @@ static void ui_draw_vision_header(UIState *s) { nvgFill(s->vg); ui_draw_vision_maxspeed(s); + +#ifdef SHOW_SPEEDLIMIT ui_draw_vision_speedlimit(s); +#endif ui_draw_vision_speed(s); ui_draw_vision_event(s); } @@ -1434,7 +1423,10 @@ static void ui_draw_vision_footer(UIState *s) { nvgRect(s->vg, ui_viz_rx, footer_y, ui_viz_rw, footer_h); ui_draw_vision_face(s); + +#ifdef SHOW_SPEEDLIMIT ui_draw_vision_map(s); +#endif } static void ui_draw_vision_alert(UIState *s, int va_size, int va_color, @@ -1511,7 +1503,7 @@ static void ui_draw_vision(UIState *s) { glDisable(GL_SCISSOR_TEST); glClear(GL_STENCIL_BUFFER_BIT); - + nvgBeginFrame(s->vg, s->fb_w, s->fb_h, 1.0f); nvgSave(s->vg); @@ -1746,13 +1738,16 @@ static void ui_update(UIState *s) { } // peek and consume all events in the zmq queue, then return. while(true) { - polls[0].socket = s->live100_sock_raw; + int plus_sock_num = 7; + int num_polls = 8; + + polls[0].socket = s->controlsstate_sock_raw; polls[0].events = ZMQ_POLLIN; polls[1].socket = s->livecalibration_sock_raw; polls[1].events = ZMQ_POLLIN; polls[2].socket = s->model_sock_raw; polls[2].events = ZMQ_POLLIN; - polls[3].socket = s->live20_sock_raw; + polls[3].socket = s->radarstate_sock_raw; polls[3].events = ZMQ_POLLIN; polls[4].socket = s->livempc_sock_raw; polls[4].events = ZMQ_POLLIN; @@ -1760,11 +1755,17 @@ static void ui_update(UIState *s) { polls[5].events = ZMQ_POLLIN; polls[6].socket = s->uilayout_sock_raw; polls[6].events = ZMQ_POLLIN; + +#ifdef SHOW_SPEEDLIMIT + plus_sock_num++; + num_polls++; polls[7].socket = s->map_data_sock_raw; polls[7].events = ZMQ_POLLIN; - polls[8].socket = s->plus_sock_raw; // plus_sock should be last - polls[8].events = ZMQ_POLLIN; - int num_polls = 9; +#endif + + polls[plus_sock_num].socket = s->plus_sock_raw; // plus_sock should be last + polls[plus_sock_num].events = ZMQ_POLLIN; + int ret = zmq_poll(polls, num_polls, 0); if (ret < 0) { LOGW("poll failed (%d)", ret); @@ -1776,12 +1777,12 @@ static void ui_update(UIState *s) { if (polls[0].revents || polls[1].revents || polls[2].revents || polls[3].revents || polls[4].revents || polls[6].revents || - polls[7].revents || polls[8].revents) { + polls[plus_sock_num].revents) { // awake on any (old) activity set_awake(s, true); } - if (polls[8].revents) { + if (polls[plus_sock_num].revents) { // plus socket zmq_msg_t msg; err = zmq_msg_init(&msg); @@ -1822,9 +1823,9 @@ static void ui_update(UIState *s) { struct cereal_Event eventd; cereal_read_Event(&eventd, eventp); double t = millis_since_boot(); - if (eventd.which == cereal_Event_live100) { - struct cereal_Live100Data datad; - cereal_read_Live100Data(&datad, eventd.live100); + if (eventd.which == cereal_Event_controlsState) { + struct cereal_ControlsState datad; + cereal_read_ControlsState(&datad, eventd.controlsState); if (datad.vCruise != s->scene.v_cruise) { s->scene.v_cruise_update_ts = eventd.logMonoTime; @@ -1888,19 +1889,19 @@ static void ui_update(UIState *s) { s->scene.alert_ts = eventd.logMonoTime; s->scene.alert_size = datad.alertSize; - if (datad.alertSize == cereal_Live100Data_AlertSize_none) { + if (datad.alertSize == cereal_ControlsState_AlertSize_none) { s->alert_size = ALERTSIZE_NONE; - } else if (datad.alertSize == cereal_Live100Data_AlertSize_small) { + } else if (datad.alertSize == cereal_ControlsState_AlertSize_small) { s->alert_size = ALERTSIZE_SMALL; - } else if (datad.alertSize == cereal_Live100Data_AlertSize_mid) { + } else if (datad.alertSize == cereal_ControlsState_AlertSize_mid) { s->alert_size = ALERTSIZE_MID; - } else if (datad.alertSize == cereal_Live100Data_AlertSize_full) { + } else if (datad.alertSize == cereal_ControlsState_AlertSize_full) { s->alert_size = ALERTSIZE_FULL; } - if (datad.alertStatus == cereal_Live100Data_AlertStatus_userPrompt) { + if (datad.alertStatus == cereal_ControlsState_AlertStatus_userPrompt) { update_status(s, STATUS_WARNING); - } else if (datad.alertStatus == cereal_Live100Data_AlertStatus_critical) { + } else if (datad.alertStatus == cereal_ControlsState_AlertStatus_critical) { update_status(s, STATUS_ALERT); } else if (datad.enabled) { update_status(s, STATUS_ENGAGED); @@ -1925,16 +1926,16 @@ static void ui_update(UIState *s) { } } } - } else if (eventd.which == cereal_Event_live20) { - struct cereal_Live20Data datad; - cereal_read_Live20Data(&datad, eventd.live20); - struct cereal_Live20Data_LeadData leaddatad; - cereal_read_Live20Data_LeadData(&leaddatad, datad.leadOne); + } else if (eventd.which == cereal_Event_radarState) { + struct cereal_RadarState datad; + cereal_read_RadarState(&datad, eventd.radarState); + struct cereal_RadarState_LeadData leaddatad; + cereal_read_RadarState_LeadData(&leaddatad, datad.leadOne); s->scene.lead_status = leaddatad.status; s->scene.lead_d_rel = leaddatad.dRel; s->scene.lead_y_rel = leaddatad.yRel; s->scene.lead_v_rel = leaddatad.vRel; - s->livempc_or_live20_changed = true; + s->livempc_or_radarstate_changed = true; } else if (eventd.which == cereal_Event_liveCalibration) { s->scene.world_objects_visible = true; struct cereal_LiveCalibrationData datad; @@ -1974,7 +1975,7 @@ static void ui_update(UIState *s) { for (int i = 0; i < 50; i++){ s->scene.mpc_y[i] = capn_to_f32(capn_get32(y_list, i)); } - s->livempc_or_live20_changed = true; + s->livempc_or_radarstate_changed = true; } else if (eventd.which == cereal_Event_thermal) { struct cereal_ThermalData datad; cereal_read_ThermalData(&datad, eventd.thermal); @@ -2056,6 +2057,7 @@ static int vision_subscribe(int fd, VisionPacket *rp, int type) { static void* vision_connect_thread(void *args) { int err; + set_thread_name("vision_connect"); UIState *s = args; while (!do_exit) { @@ -2093,6 +2095,7 @@ static void* vision_connect_thread(void *args) { static void* light_sensor_thread(void *args) { int err; + set_thread_name("light_sensor"); UIState *s = args; s->light_sensor = 0.0; @@ -2109,8 +2112,11 @@ static void* light_sensor_thread(void *args) { int SENSOR_LIGHT = 7; - device->activate(device, SENSOR_LIGHT, 0); - device->activate(device, SENSOR_LIGHT, 1); + err = device->activate(device, SENSOR_LIGHT, 0); + if (err != 0) goto fail; + err = device->activate(device, SENSOR_LIGHT, 1); + if (err != 0) goto fail; + device->setDelay(device, SENSOR_LIGHT, ms2ns(100)); while (!do_exit) { @@ -2127,11 +2133,17 @@ static void* light_sensor_thread(void *args) { } return NULL; + +fail: + LOGE("LIGHT SENSOR IS MISSING"); + s->light_sensor = 255; + return NULL; } static void* bg_thread(void* args) { UIState *s = args; + set_thread_name("bg"); EGLDisplay bg_display; EGLSurface bg_surface; @@ -2179,7 +2191,7 @@ int is_leon() { return strstr(str, "letv") != NULL; } -int main() { +int main(int argc, char* argv[]) { int err; setpriority(PRIO_PROCESS, 0, -14); @@ -2217,16 +2229,14 @@ int main() { } // light sensor scaling params - const int EON = (access("/EON", F_OK) != -1); const int LEON = is_leon(); const float BRIGHTNESS_B = LEON? 10.0 : 5.0; const float BRIGHTNESS_M = LEON? 2.6 : 1.3; - #define NEO_BRIGHTNESS 100 float smooth_brightness = BRIGHTNESS_B; - set_volume(s, 0); + set_volume(s, 13); #ifdef DEBUG_FPS vipc_t1 = millis_since_boot(); double t1 = millis_since_boot(); @@ -2241,17 +2251,11 @@ int main() { } pthread_mutex_lock(&s->lock); - if (EON) { - // light sensor is only exposed on EONs - - float clipped_brightness = (s->light_sensor*BRIGHTNESS_M) + BRIGHTNESS_B; - if (clipped_brightness > 255) clipped_brightness = 255; - smooth_brightness = clipped_brightness * 0.01 + smooth_brightness * 0.99; - set_brightness(s, (int)smooth_brightness); - } else { - // compromise for bright and dark envs - set_brightness(s, NEO_BRIGHTNESS); - } + // light sensor is only exposed on EONs + float clipped_brightness = (s->light_sensor*BRIGHTNESS_M) + BRIGHTNESS_B; + if (clipped_brightness > 255) clipped_brightness = 255; + smooth_brightness = clipped_brightness * 0.01 + smooth_brightness * 0.99; + set_brightness(s, (int)smooth_brightness); if (!s->vision_connected) { // Car is not started, keep in idle state and awake on touch events @@ -2309,23 +2313,10 @@ int main() { set_volume(s, volume); } - if (s->speed_lim_off_timeout > 0) { - s->speed_lim_off_timeout--; - } else { - read_speed_lim_off(s); - } - - if (s->is_metric_timeout > 0) { - s->is_metric_timeout--; - } else { - read_is_metric(s); - } - - if (s->limit_set_speed_timeout > 0) { - s->limit_set_speed_timeout--; - } else { - read_limit_set_speed(s); - } + read_param_bool_timeout(&s->is_metric, "IsMetric", &s->is_metric_timeout); + read_param_bool_timeout(&s->longitudinal_control, "LongitudinalControl", &s->longitudinal_control_timeout); + read_param_bool_timeout(&s->limit_set_speed, "LimitSetSpeed", &s->limit_set_speed_timeout); + read_param_float_timeout(&s->speed_lim_off, "SpeedLimitOffset", &s->limit_set_speed_timeout); pthread_mutex_unlock(&s->lock); diff --git a/selfdrive/version.py b/selfdrive/version.py index d1e263aec..4acc18350 100644 --- a/selfdrive/version.py +++ b/selfdrive/version.py @@ -2,24 +2,53 @@ import os import subprocess from selfdrive.swaglog import cloudlog + +def get_git_commit(): + return subprocess.check_output(["git", "rev-parse", "HEAD"]).strip() + + +def get_git_branch(): + return subprocess.check_output(["git", "rev-parse", "--abbrev-ref", "HEAD"]).strip() + + +def get_git_full_branchname(): + return subprocess.check_output(["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"]).strip() + + +def get_git_remote(): + try: + local_branch = subprocess.check_output(["git", "name-rev", "--name-only", "HEAD"]).strip() + tracking_remote = subprocess.check_output(["git", "config", "branch." + local_branch + ".remote"]).strip() + return subprocess.check_output(["git", "config", "remote." + tracking_remote + ".url"]).strip() + except subprocess.CalledProcessError: + # Not on a branch, fallback + return subprocess.check_output(["git", "config", "--get", "remote.origin.url"]).strip() + + with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "common", "version.h")) as _versionf: version = _versionf.read().split('"')[1] try: - origin = subprocess.check_output(["git", "config", "--get", "remote.origin.url"]).rstrip() + origin = get_git_remote() if origin.startswith('git@github.com:commaai') or origin.startswith('https://github.com/commaai'): if origin.endswith('/one.git'): dirty = True else: - branch = subprocess.check_output(["git", "rev-parse", "--abbrev-ref", "HEAD"]).rstrip() - branch = 'origin/' + branch - subprocess.check_call(["git", "update-index", "--refresh"]) #This is needed otherwise touched files might show up as modified + branch = get_git_full_branchname() + + # This is needed otherwise touched files might show up as modified + try: + subprocess.check_call(["git", "update-index", "--refresh"]) + except subprocess.CalledProcessError: + pass + dirty = subprocess.call(["git", "diff-index", "--quiet", branch, "--"]) != 0 if dirty: dirty_files = subprocess.check_output(["git", "diff-index", branch, "--"]) commit = subprocess.check_output(["git", "rev-parse", "--verify", "HEAD"]).rstrip() origin_commit = subprocess.check_output(["git", "rev-parse", "--verify", branch]).rstrip() cloudlog.event("dirty comma branch", vesion=version, dirty=dirty, origin=origin, branch=branch, dirty_files=dirty_files, commit=commit, origin_commit=origin_commit) + else: dirty = True except subprocess.CalledProcessError: @@ -29,5 +58,14 @@ except subprocess.CalledProcessError: pass dirty = True -# put this here training_version = "0.1.0" + +if __name__ == "__main__": + print("Dirty: %s" % dirty) + print("Version: %s" % version) + print("Remote: %s" % origin) + + try: + print("Branch %s" % branch) + except NameError: + pass diff --git a/selfdrive/visiond/camera_qcom.c b/selfdrive/visiond/camera_qcom.c index 45b782ecf..ccaee8575 100644 --- a/selfdrive/visiond/camera_qcom.c +++ b/selfdrive/visiond/camera_qcom.c @@ -292,10 +292,6 @@ void cameras_init(DualCameraState *s) { } else if (strcmp(product_name, "OnePlus3") == 0 && strcmp(project_name, "15811") == 0) { // only OP3T support s->device = DEVICE_OP3T; - } else if (strcmp(product_name, "LePro3") == 0) { - LOGD("LePro 3 detected"); - s->device = DEVICE_LP3; - assert(false); } else { assert(false); } @@ -423,7 +419,7 @@ static void set_exposure(CameraState *s, float exposure_frac, float gain_frac) { s->cur_gain_frac = gain_frac; } - LOGD("set exposure: %f %f - %d", exposure_frac, gain_frac, err); + //LOGD("set exposure: %f %f - %d", exposure_frac, gain_frac, err); } static void do_autoexposure(CameraState *s, float grey_frac) { @@ -431,7 +427,7 @@ static void do_autoexposure(CameraState *s, float grey_frac) { float new_exposure = s->cur_exposure_frac; new_exposure *= pow(1.05, (target_grey - grey_frac) / 0.05 ); - LOGD("diff %f: %f to %f", target_grey - grey_frac, s->cur_exposure_frac, new_exposure); + //LOGD("diff %f: %f to %f", target_grey - grey_frac, s->cur_exposure_frac, new_exposure); float new_gain = s->cur_gain_frac; if (new_exposure < 0.10) { @@ -1708,12 +1704,12 @@ void actuator_move(CameraState *s, uint16_t target) { .ringing_params = &actuator_ringing_params, }; err = ioctl(s->actuator_fd, VIDIOC_MSM_ACTUATOR_CFG, &actuator_cfg_data); - LOGD("actuator move focus: %d", err); + //LOGD("actuator move focus: %d", err); s->cur_step_pos = dest_step_pos; s->cur_lens_pos = actuator_cfg_data.cfg.move.curr_lens_pos; - LOGD("step %d target: %d lens pos: %d", dest_step_pos, target, s->cur_lens_pos); + //LOGD("step %d target: %d lens pos: %d", dest_step_pos, target, s->cur_lens_pos); } static void parse_autofocus(CameraState *s, uint8_t *d) { @@ -1778,12 +1774,12 @@ static void do_autofocus(CameraState *s) { int target = clamp(s->lens_true_pos - sag, dac_down, dac_up); - char debug[4096]; + /*char debug[4096]; char *pdebug = debug; pdebug += sprintf(pdebug, "focus "); for (int i = 0; i < NUM_FOCUS; i++) pdebug += sprintf(pdebug, "%2x(%4d) ", s->confidence[i], s->focus[i]); pdebug += sprintf(pdebug, " err: %7.2f offset: %6.2f sag: %6.2f lens_true_pos: %6.2f cur_lens_pos: %4d->%4d", err * focus_kp, offset, sag, s->lens_true_pos, s->cur_lens_pos, target); - LOGD(debug); + LOGD(debug);*/ actuator_move(s, target); } @@ -2109,7 +2105,7 @@ static void* ops_thread(void* arg) { if (zmq_msg_size(&msg) == sizeof(cmsg)) { memcpy(&cmsg, zmq_msg_data(&msg), zmq_msg_size(&msg)); - LOGD("cameraops %d", cmsg.type); + //LOGD("cameraops %d", cmsg.type); if (cmsg.type == CAMERA_MSG_AUTOEXPOSE) { if (cmsg.camera_num == 0) { diff --git a/selfdrive/visiond/visiond.cc b/selfdrive/visiond/visiond.cc index f7a52dc0e..77a7e5f48 100644 --- a/selfdrive/visiond/visiond.cc +++ b/selfdrive/visiond/visiond.cc @@ -781,7 +781,7 @@ void* monitoring_thread(void *arg) { double t2 = millis_since_boot(); - LOGD("monitoring process: %.2fms, from last %.2fms", t2-t1, t1-last); + //LOGD("monitoring process: %.2fms, from last %.2fms", t2-t1, t1-last); last = t1; } @@ -893,7 +893,7 @@ void* frontview_thread(void *arg) { double t2 = millis_since_boot(); - LOGD("front process: %.2fms", t2-t1); + //LOGD("front process: %.2fms", t2-t1); } return NULL; @@ -1157,7 +1157,7 @@ void* processing_thread(void *arg) { zmq_send(s->posenet_sock_raw, bytes.begin(), bytes.size(), ZMQ_DONTWAIT); } pt3 = millis_since_boot(); - LOGD("pre: %.2fms | posenet: %.2fms", (pt2-pt1), (pt3-pt1)); + //LOGD("pre: %.2fms | posenet: %.2fms", (pt2-pt1), (pt3-pt1)); } #endif @@ -1206,8 +1206,8 @@ void* processing_thread(void *arg) { double t5 = millis_since_boot(); - LOGD("queued: %.2fms, yuv: %.2f, model: %.2fms | processing: %.3fms", - (t2-t1), (yt2-yt1), (mt2-mt1), (t5-t1)); + /*LOGD("queued: %.2fms, yuv: %.2f, model: %.2fms | processing: %.3fms", + (t2-t1), (yt2-yt1), (mt2-mt1), (t5-t1));*/ } #ifdef DUMP_RGB