diff --git a/CHANGELOGS.md b/CHANGELOGS.md index ff599a3e26..a4793aa763 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -1,3 +1,7 @@ +sunnypilot - 0.9.2.x (2023-02-22) +======================== +* Honda Clarity 2018-22 support thanks to mcallbosco, vanillagorillaa and wirelessnet2! + sunnypilot - Version Latest (2023-02-22) ======================== * UPDATED: Synced with commaai's master branch - 2023.02.19-04:52:00:GMT - 0.9.2 diff --git a/panda b/panda index 7a02545e10..d17249e7ec 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 7a02545e10d539f85ef5aae9f5418f4d1b157bb2 +Subproject commit d17249e7eca062db2aa773ef0efaba0865b930d9 diff --git a/selfdrive/car/honda/carstate.py b/selfdrive/car/honda/carstate.py index 60a8b6f352..0055d45dca 100644 --- a/selfdrive/car/honda/carstate.py +++ b/selfdrive/car/honda/carstate.py @@ -77,7 +77,7 @@ def get_can_signals(CP, gearbox_msg, main_on_sig_msg): signals.append(("BRAKE_PRESSED", "BRAKE_MODULE")) checks.append(("BRAKE_MODULE", 50)) - if CP.carFingerprint in (HONDA_BOSCH | {CAR.CIVIC, CAR.ODYSSEY, CAR.ODYSSEY_CHN}): + if CP.carFingerprint in (HONDA_BOSCH | {CAR.CIVIC, CAR.ODYSSEY, CAR.ODYSSEY_CHN, CAR.CLARITY}): signals.append(("EPB_STATE", "EPB_STATUS")) checks.append(("EPB_STATUS", 50)) @@ -124,6 +124,12 @@ def get_can_signals(CP, gearbox_msg, main_on_sig_msg): if CP.carFingerprint in HONDA_BOSCH_RADARLESS: signals.append(("CRUISE_FAULT", "CRUISE_FAULT_STATUS")) checks.append(("CRUISE_FAULT_STATUS", 50)) + elif CP.carFingerprint == CAR.CLARITY: + signals += [ + ("BRAKE_ERROR_1", "BRAKE_ERROR"), + ("BRAKE_ERROR_2", "BRAKE_ERROR") + ] + checks.append(("BRAKE_ERROR", 100)), elif CP.openpilotLongitudinalControl: signals += [ ("BRAKE_ERROR_1", "STANDSTILL"), @@ -197,6 +203,8 @@ class CarState(CarStateBase): if self.CP.carFingerprint in HONDA_BOSCH_RADARLESS: self.brake_error = cp.vl["CRUISE_FAULT_STATUS"]["CRUISE_FAULT"] + elif self.CP.carFingerprint == CAR.CLARITY: + self.brake_error = cp.vl["BRAKE_ERROR"]["BRAKE_ERROR_1"] or cp.vl["BRAKE_ERROR"]["BRAKE_ERROR_2"] elif self.CP.openpilotLongitudinalControl: self.brake_error = cp.vl["STANDSTILL"]["BRAKE_ERROR_1"] or cp.vl["STANDSTILL"]["BRAKE_ERROR_2"] ret.espDisabled = cp.vl["VSA_STATUS"]["ESP_DISABLED"] != 0 @@ -227,7 +235,7 @@ class CarState(CarStateBase): ret.brakeHoldActive = cp.vl["VSA_STATUS"]["BRAKE_HOLD_ACTIVE"] == 1 # TODO: set for all cars - if self.CP.carFingerprint in (HONDA_BOSCH | {CAR.CIVIC, CAR.ODYSSEY, CAR.ODYSSEY_CHN}): + if self.CP.carFingerprint in (HONDA_BOSCH | {CAR.CIVIC, CAR.ODYSSEY, CAR.ODYSSEY_CHN, CAR.CLARITY}): ret.parkingBrake = cp.vl["EPB_STATUS"]["EPB_STATE"] != 0 gear = int(cp.vl[self.gearbox_msg]["GEAR_SHIFTER"]) @@ -297,7 +305,8 @@ class CarState(CarStateBase): if self.CP.carFingerprint not in HONDA_BOSCH_RADARLESS: ret.stockAeb = (not self.CP.openpilotLongitudinalControl) and bool(cp.vl["ACC_CONTROL"]["AEB_STATUS"] and cp.vl["ACC_CONTROL"]["ACCEL_COMMAND"] < -1e-5) else: - ret.stockAeb = bool(cp_cam.vl["BRAKE_COMMAND"]["AEB_REQ_1"] and cp_cam.vl["BRAKE_COMMAND"]["COMPUTER_BRAKE"] > 1e-5) + aeb_sig = "COMPUTER_BRAKE_ALT" if self.CP.carFingerprint == CAR.CLARITY else "COMPUTER_BRAKE" + ret.stockAeb = bool(cp_cam.vl["BRAKE_COMMAND"]["AEB_REQ_1"] and cp_cam.vl["BRAKE_COMMAND"][aeb_sig] > 1e-5) self.acc_hud = False self.lkas_hud = False @@ -338,7 +347,8 @@ class CarState(CarStateBase): checks.append(("ACC_HUD", 10)) elif CP.carFingerprint not in HONDA_BOSCH: - signals += [("COMPUTER_BRAKE", "BRAKE_COMMAND"), + aeb_sig = "COMPUTER_BRAKE_ALT" if CP.carFingerprint == CAR.CLARITY else "COMPUTER_BRAKE" + signals += [(aeb_sig, "BRAKE_COMMAND"), ("AEB_REQ_1", "BRAKE_COMMAND"), ("FCW", "BRAKE_COMMAND"), ("CHIME", "BRAKE_COMMAND"), diff --git a/selfdrive/car/honda/hondacan.py b/selfdrive/car/honda/hondacan.py index 1fe0a13767..29f01b841d 100644 --- a/selfdrive/car/honda/hondacan.py +++ b/selfdrive/car/honda/hondacan.py @@ -33,8 +33,6 @@ def create_brake_command(packer, apply_brake, pump_on, pcm_override, pcm_cancel_ pcm_fault_cmd = False values = { - "COMPUTER_BRAKE": apply_brake, - "BRAKE_PUMP_REQUEST": pump_on, "CRUISE_OVERRIDE": pcm_override, "CRUISE_FAULT_CMD": pcm_fault_cmd, "CRUISE_CANCEL_CMD": pcm_cancel_cmd, @@ -47,6 +45,14 @@ def create_brake_command(packer, apply_brake, pump_on, pcm_override, pcm_cancel_ "AEB_REQ_2": 0, "AEB_STATUS": 0, } + + if car_fingerprint == CAR.CLARITY: + values["COMPUTER_BRAKE_ALT"] = apply_brake + values["BRAKE_PUMP_REQUEST_ALT"] = apply_brake > 0 + else: + values["COMPUTER_BRAKE"] = apply_brake + values["BRAKE_PUMP_REQUEST"] = pump_on + bus = get_pt_bus(car_fingerprint) return packer.make_can_msg("BRAKE_COMMAND", bus, values) diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index 65deab7401..efd9d98760 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -272,6 +272,26 @@ class CarInterface(CarInterfaceBase): tire_stiffness_factor = 0.82 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] # TODO: can probably use some tuning + elif candidate == CAR.CLARITY: + ret.safetyConfigs[0].safetyParam |= Panda.FLAG_HONDA_CLARITY + ret.mass = 4052. * CV.LB_TO_KG + STD_CARGO_KG + ret.wheelbase = 2.75 + ret.centerToFront = ret.wheelbase * 0.4 + ret.steerRatio = 16.50 # 12.72 is end-to-end spec + if eps_modified: + for fw in car_fw: + if fw.ecu == "eps" and b"-" not in fw.fwVersion and b"," in fw.fwVersion: + ret.lateralTuning.pid.kf = 0.00004 + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 0xA00, 0x3C00], [0, 2560, 3840]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.1575], [0.05175]] + elif fw.ecu == "eps" and b"-" in fw.fwVersion and b"," in fw.fwVersion: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 0xA00, 0x2800], [0, 2560, 3840]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.3], [0.1]] + else: + ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 2560], [0, 2560]] + ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] + tire_stiffness_factor = 1. + else: raise ValueError(f"unsupported car {candidate}") @@ -292,7 +312,7 @@ class CarInterface(CarInterfaceBase): # min speed to enable ACC. if car can do stop and go, then set enabling speed # to a negative value, so it won't matter. Otherwise, add 0.5 mph margin to not # conflict with PCM acc - stop_and_go = candidate in (HONDA_BOSCH | {CAR.CIVIC}) or ret.enableGasInterceptor + stop_and_go = candidate in (HONDA_BOSCH | {CAR.CIVIC, CAR.CLARITY}) or ret.enableGasInterceptor ret.minEnableSpeed = -1. if stop_and_go else 25.5 * CV.MPH_TO_MS # TODO: start from empirically derived lateral slip stiffness for the civic and scale by diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 05c6f25432..a5871e961f 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -96,6 +96,7 @@ class CAR: RIDGELINE = "HONDA RIDGELINE 2017" INSIGHT = "HONDA INSIGHT 2019" HONDA_E = "HONDA E 2020" + CLARITY = "HONDA CLARITY 2018" class Footnote(Enum): @@ -151,6 +152,7 @@ CAR_INFO: Dict[str, Optional[Union[HondaCarInfo, List[HondaCarInfo]]]] = { CAR.RIDGELINE: HondaCarInfo("Honda Ridgeline 2017-23", min_steer_speed=12. * CV.MPH_TO_MS), CAR.INSIGHT: HondaCarInfo("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), CAR.HONDA_E: HondaCarInfo("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS), + CAR.CLARITY: HondaCarInfo("Honda Clarity 2018-22"), } HONDA_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ @@ -1553,6 +1555,31 @@ FW_VERSIONS = { b'37805-64D-P510\x00\x00', ], }, + CAR.CLARITY: { + (Ecu.shiftByWire, 0x18da0bf1, None): [ + b'54008-TRW-A910\x00\x00', + ], + (Ecu.vsa, 0x18da28f1, None): [ + b'57114-TRW-A010\x00\x00', + b'57114-TRW-A020\x00\x00', + ], + (Ecu.eps, 0x18da30f1, None): [ + b'39990-TRW-A020\x00\x00', + b'39990-TRW,A020\x00\x00', # modified firmware + b'39990,TRW,A020\x00\x00', # extra modified firmware + ], + (Ecu.srs, 0x18da53f1, None): [ + b'77959-TRW-A210\x00\x00', + b'77959-TRW-A220\x00\x00', + ], + (Ecu.gateway, 0x18daeff1, None): [ + b'38897-TRW-A010\x00\x00', + ], + (Ecu.combinationMeter, 0x18da60f1, None): [ + b'78109-TRW-A020\x00\x00', + b'78109-TRW-A030\x00\x00', + ], + }, } DBC = { @@ -1579,6 +1606,7 @@ DBC = { CAR.INSIGHT: dbc_dict('honda_insight_ex_2019_can_generated', None), CAR.HONDA_E: dbc_dict('acura_rdx_2020_can_generated', None), CAR.CIVIC_2022: dbc_dict('honda_civic_ex_2022_can_generated', None), + CAR.CLARITY: dbc_dict('honda_clarity_hybrid_2018_can_generated', 'acura_ilx_2016_nidec'), } STEER_THRESHOLD = { diff --git a/selfdrive/car/sunnypilot_carname.json b/selfdrive/car/sunnypilot_carname.json index 280ce8d738..b4c3d74cc3 100644 --- a/selfdrive/car/sunnypilot_carname.json +++ b/selfdrive/car/sunnypilot_carname.json @@ -55,6 +55,7 @@ "Honda Civic Hatchback 2017-21": "HONDA CIVIC (BOSCH) 2019", "Honda Civic Hatchback 2022": "HONDA CIVIC 2022", "Honda Civic Sedan 1.6 Diesel 2019": "HONDA CIVIC SEDAN 1.6 DIESEL 2019", + "Honda Clarity 2018-22": "HONDA CLARITY 2018", "Honda CR-V 2015-16": "HONDA CR-V 2016", "Honda CR-V 2017-22": "HONDA CR-V 2017", "Honda CR-V EU 2016": "HONDA CR-V EU 2016", diff --git a/selfdrive/car/torque_data/params.yaml b/selfdrive/car/torque_data/params.yaml index cb423e1d87..1b0026b6e5 100644 --- a/selfdrive/car/torque_data/params.yaml +++ b/selfdrive/car/torque_data/params.yaml @@ -15,6 +15,7 @@ HONDA ACCORD 2018: [1.7135052593468778, 0.3461280068322071, 0.21579936052863807] HONDA ACCORD HYBRID 2018: [1.6651615004829625, 0.30322180951193245, 0.2083000440586149] HONDA CIVIC (BOSCH) 2019: [1.691708637466905, 0.40132900729454185, 0.25460295304024094] HONDA CIVIC 2016: [1.6528895627785531, 0.4018518740819229, 0.25458812851328544] +HONDA CLARITY 2018: [1.6528895627785531, 0.4018518740819229, 0.25458812851328544] HONDA CR-V 2016: [0.7667141440182675, 0.5927571534745969, 0.40909087636157127] HONDA CR-V 2017: [2.01323205142022, 0.2700612209345081, 0.2238412881331528] HONDA CR-V HYBRID 2019: [2.072034634644233, 0.7152085160516978, 0.20237105008376083]