Hyundai CAN Longitudinal: Enable radar tracks for certain Sante Fe platforms

This commit is contained in:
Jason Wen
2023-12-04 03:14:39 +00:00
parent 54f7ccab8c
commit b7bb78723b
5 changed files with 70 additions and 4 deletions
+5
View File
@@ -1,5 +1,10 @@
sunnypilot - 0.9.5.2 (2023-xx-xx)
========================
* NEW❗: Hyundai CAN longitudinal:
* NEW❗: Enable radar tracks for certain Santa Fe platforms
* Internal Combustion Engine (ICE) 2021-23
* Hybrid 2022-23
* Plug-in Hybrid 2022-23
* NEW❗: Lane Change: When manually braking with steering engaged, turning on the turn signal will default to Nudge mode
sunnypilot - 0.9.5.1 (2023-11-17)
@@ -0,0 +1,47 @@
from selfdrive.car.isotp_parallel_query import IsoTpParallelQuery
from system.swaglog import cloudlog
EXT_DIAG_REQUEST = b'\x10\x07'
EXT_DIAG_RESPONSE = b'\x50\x07'
WRITE_DATA_REQUEST = b'\x2e'
WRITE_DATA_RESPONSE = b'\x68'
RADAR_TRACKS_CONFIG = b"\x00\x00\x00\x01\x00\x01"
def enable_radar_tracks(logcan, sendcan, bus=0, addr=0x7d0, config_data_id=b'\x01\x42', timeout=0.1, retry=10, debug=False):
cloudlog.warning("radar_tracks: enabling ...")
for i in range(retry):
try:
query = IsoTpParallelQuery(sendcan, logcan, bus, [addr], [EXT_DIAG_REQUEST], [EXT_DIAG_RESPONSE], debug=debug)
for _, _ in query.get_data(timeout).items():
cloudlog.warning("radar_tracks: reconfigure radar to output radar points ...")
query = IsoTpParallelQuery(sendcan, logcan, bus, [addr],
[WRITE_DATA_REQUEST + config_data_id + RADAR_TRACKS_CONFIG],
[WRITE_DATA_RESPONSE], debug=debug)
query.get_data(0)
cloudlog.warning("radar_tracks: successfully enabled")
return True
except Exception as e:
cloudlog.exception(f"radar_tracks exception: {e}")
cloudlog.error(f"radar_tracks retry ({i + 1}) ...")
cloudlog.error(f"radar_tracks: failed")
return False
if __name__ == "__main__":
import time
import cereal.messaging as messaging
sendcan = messaging.pub_sock('sendcan')
logcan = messaging.sub_sock('can')
time.sleep(1)
enabled = enable_radar_tracks(logcan, sendcan, bus=0, addr=0x7d0, config_data_id=b'\x01\x42', timeout=0.1, debug=False)
print(f"enabled: {enabled}")
+11
View File
@@ -2,6 +2,7 @@ from cereal import car
from panda import Panda
from openpilot.common.conversions import Conversions as CV
from openpilot.common.params import Params
from openpilot.selfdrive.car.hyundai.enable_radar_tracks import enable_radar_tracks
from openpilot.selfdrive.car.hyundai.hyundaicanfd import CanBus
from openpilot.selfdrive.car.hyundai.values import HyundaiFlags, HyundaiFlagsSP, CAR, DBC, CANFD_CAR, CAMERA_SCC_CAR, CANFD_RADAR_SCC_CAR, \
CANFD_UNSUPPORTED_LONGITUDINAL_CAR, NON_SCC_CAR, EV_CAR, HYBRID_CAR, LEGACY_SAFETY_MODE_CAR, \
@@ -84,6 +85,10 @@ class CarInterface(CarInterfaceBase):
# Values from optimizer
ret.steerRatio = 16.55 # 13.8 is spec end-to-end
ret.tireStiffnessFactor = 0.82
if candidate in (CAR.SANTA_FE_2022, CAR.SANTA_FE_HEV_2022, CAR.SANTA_FE_PHEV_2022):
if any(fw.ecu == "fwdRadar" and fw.fwVersion is not None for fw in car_fw):
ret.radarUnavailable = False
ret.spFlags |= HyundaiFlagsSP.SP_RADAR_TRACKS.value
elif candidate in (CAR.SONATA, CAR.SONATA_HYBRID):
ret.mass = 1513.
ret.wheelbase = 2.84
@@ -371,6 +376,12 @@ class CarInterface(CarInterfaceBase):
if CP.flags & HyundaiFlags.ENABLE_BLINKERS:
disable_ecu(logcan, sendcan, bus=CanBus(CP).ECAN, addr=0x7B1, com_cont_req=b'\x28\x83\x01')
# for enabling radar tracks on startup
# some CAN platforms are able to enable radar tracks config at the radar ECU,
# but the config is reset after ignition cycle
if CP.openpilotLongitudinalControl and (CP.spFlags & HyundaiFlagsSP.SP_RADAR_TRACKS):
enable_radar_tracks(logcan, sendcan, bus=0, addr=0x7d0, config_data_id=b'\x01\x42')
def _update(self, c):
ret = self.CS.update(self.cp, self.cp_cam)
self.CS = self.sp_update_params(self.CS)
+3 -1
View File
@@ -39,6 +39,8 @@ class RadarInterface(RadarInterfaceBase):
self.radar_off_can = CP.radarUnavailable
self.rcp = get_radar_can_parser(CP)
self.sp_radar_tracks = CP.spFlags & HyundaiFlagsSP.SP_RADAR_TRACKS
def update(self, can_strings):
if self.radar_off_can or (self.rcp is None):
return super().update(None)
@@ -46,7 +48,7 @@ class RadarInterface(RadarInterfaceBase):
vls = self.rcp.update_strings(can_strings)
self.updated_messages.update(vls)
if self.trigger_msg not in self.updated_messages:
if self.trigger_msg not in self.updated_messages and not self.sp_radar_tracks:
return None
rr = self._update(self.updated_messages)
+4 -3
View File
@@ -73,6 +73,7 @@ class HyundaiFlagsSP(IntFlag):
SP_NAV_MSG = 4
SP_CAMERA_SCC_LEAD = 8
SP_LKAS12 = 16
SP_RADAR_TRACKS = 32
class CAR(StrEnum):
@@ -2310,9 +2311,9 @@ DBC = {
CAR.KONA_EV_2022: dbc_dict('hyundai_kia_generic', None),
CAR.KONA_HEV: dbc_dict('hyundai_kia_generic', None),
CAR.SANTA_FE: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'),
CAR.SANTA_FE_2022: dbc_dict('hyundai_kia_generic', None),
CAR.SANTA_FE_HEV_2022: dbc_dict('hyundai_kia_generic', None),
CAR.SANTA_FE_PHEV_2022: dbc_dict('hyundai_kia_generic', None),
CAR.SANTA_FE_2022: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'),
CAR.SANTA_FE_HEV_2022: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'),
CAR.SANTA_FE_PHEV_2022: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'),
CAR.SONATA: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'),
CAR.SONATA_LF: dbc_dict('hyundai_kia_generic', None), # Has 0x5XX messages, but different format
CAR.TUCSON: dbc_dict('hyundai_kia_generic', None),