Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Honda Odyssey 21-25 support #1934

Open
wants to merge 60 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
3e5091d
Odyssey_5G_MMR
mvl-boston Mar 5, 2025
a4f0fc5
Odyssey_5G_MMR
mvl-boston Mar 5, 2025
67536c6
Odyssey_5G_MMR
mvl-boston Mar 5, 2025
f2305ef
Odyssey_5G_MMR
mvl-boston Mar 5, 2025
c3649d1
Odyssey_5G_MMR
mvl-boston Mar 5, 2025
ea4df30
Odyssey_5G_MMR
mvl-boston Mar 5, 2025
151ca41
Odyssey_5G_MMR
mvl-boston Mar 5, 2025
cbc1e03
Odyssey_5G_MMR
mvl-boston Mar 5, 2025
e2a41e8
Odyssey_5G_MMR
mvl-boston Mar 5, 2025
83f8210
Odyssey_5G_MMR
mvl-boston Mar 5, 2025
533ce58
Odyssey_5G_MMR
mvl-boston Mar 5, 2025
7cad756
Odyssey_5G_MMR
mvl-boston Mar 5, 2025
3c45073
Odyssey_5G_MMR
mvl-boston Mar 5, 2025
af36168
Odyssey_5G_MMR
mvl-boston Mar 6, 2025
daf1be0
Odyssey_5G_MMR
mvl-boston Mar 6, 2025
050292d
Odyssey_5G_MMR
mvl-boston Mar 6, 2025
08976cb
Odyssey_5G_MMR
mvl-boston Mar 6, 2025
41f033b
Odyssey_5G_MMR
mvl-boston Mar 6, 2025
2ef9394
Odyssey_5G_MMR
mvl-boston Mar 6, 2025
ad01f5c
Merge branch 'commaai:master' into Odyssey_21_25
mvl-boston Mar 7, 2025
8f4fd44
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
cf28649
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
9ac5b58
Merge branch 'master' into Odyssey_21_25
mvl-boston Mar 7, 2025
59fb36e
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
a1c8fbf
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
a1832e1
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
4c52c91
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
aec73d8
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
d5b4cd0
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
a6bafc4
Merge branch 'commaai:master' into Odyssey_21_25
mvl-boston Mar 7, 2025
04d649e
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
9a8c3fe
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
ef9a4fb
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
67c5f66
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
90edcc1
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
7b878c2
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
a0249c1
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
90d6729
Odyssey_5G_MMR
mvl-boston Mar 7, 2025
26ea343
reverting unintentional edit
mvl-boston Mar 16, 2025
74a4058
Reverting to standard cruise speed conversion logic
mvl-boston Mar 16, 2025
55ace2b
revert Cruise speed conversion
mvl-boston Mar 16, 2025
6df181c
Revert cruise speed conversion change
mvl-boston Mar 16, 2025
eafbd3f
Move speed cutoff to 70kph due to user warning
mvl-boston Mar 16, 2025
830a72c
Revert cruise speed conversion change
mvl-boston Mar 16, 2025
140cc18
typo fixes
mvl-boston Mar 16, 2025
13a076d
Merge branch 'master' into Odyssey_21_25
mvl-boston Mar 16, 2025
1371a22
tuning_updates
mvl-boston Mar 16, 2025
5707b55
removing lowspeed warning when driver is actively driving
mvl-boston Mar 16, 2025
c86a177
typo fix
mvl-boston Mar 16, 2025
1dee6b7
formatting
mvl-boston Mar 16, 2025
14f268a
formatting
mvl-boston Mar 16, 2025
4b6a984
Update CARS.md
mvl-boston Mar 16, 2025
da16219
formatting
mvl-boston Mar 16, 2025
960cd4c
Tuning
mvl-boston Mar 17, 2025
a5e5989
tuning
mvl-boston Mar 17, 2025
9c3d91e
Centertofront - match earlier Odyssey
mvl-boston Mar 24, 2025
9c5f6cf
Adding new route
mvl-boston Mar 24, 2025
30c8a73
Merge branch 'master' into Odyssey_21_25
mvl-boston Mar 24, 2025
219ad1c
Merge branch 'master' into Odyssey_21_25
mvl-boston Mar 27, 2025
a3c45f1
Upgrading Odyssey support to upstream
mvl-boston Mar 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/CARS.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
|Honda|Insight 2019-22|All|[Upstream](#upstream)|
|Honda|Inspire 2018|All|[Upstream](#upstream)|
|Honda|Odyssey 2018-20|Honda Sensing|[Upstream](#upstream)|
|Honda|Odyssey 2021-25|All|[Community](#community)|
|Honda|Odyssey 2021-25|All|[Upstream](#upstream)|
|Honda|Passport 2019-23|All|[Upstream](#upstream)|
|Honda|Pilot 2016-22|Honda Sensing|[Upstream](#upstream)|
|Honda|Pilot 2023-24|All|[Community](#community)|
Expand Down Expand Up @@ -421,4 +421,4 @@ Toyota, and the GM Global B platform.
All the cars that openpilot supports use a [CAN bus](https://en.wikipedia.org/wiki/CAN_bus) for communication between all the car's computers, however a
CAN bus isn't the only way that the computers in your car can communicate. Most, if not all, vehicles from the following
manufacturers use [FlexRay](https://en.wikipedia.org/wiki/FlexRay) instead of a CAN bus: **BMW, Mercedes, Audi, Land Rover, and some Volvo**. These cars
may one day be supported, but we have no immediate plans to support FlexRay.
may one day be supported, but we have no immediate plans to support FlexRay.
11 changes: 7 additions & 4 deletions opendbc/car/honda/carcontroller.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from opendbc.can.packer import CANPacker
from opendbc.car import Bus, DT_CTRL, rate_limit, make_tester_present_msg, structs
from opendbc.car.honda import hondacan
from opendbc.car.honda.values import CruiseButtons, VISUAL_HUD, HONDA_BOSCH, HONDA_BOSCH_RADARLESS, HONDA_NIDEC_ALT_PCM_ACCEL, CarControllerParams
from opendbc.car.honda.values import CruiseButtons, VISUAL_HUD, HONDA_BOSCH, HONDA_BOSCH_RADARLESS, HONDA_NIDEC_ALT_PCM_ACCEL, HONDA_BOSCH_1000, CarControllerParams
from opendbc.car.interfaces import CarControllerBase

VisualAlert = structs.CarControl.HUDControl.VisualAlert
Expand Down Expand Up @@ -119,7 +119,7 @@ def __init__(self, dbc_names, CP):
def update(self, CC, CS, now_nanos):
actuators = CC.actuators
hud_control = CC.hudControl
conversion = hondacan.get_cruise_speed_conversion(self.CP.carFingerprint, CS.is_metric)
conversion = CV.KPH_TO_MS if CS.is_metric_cruise else CV.MPH_TO_MS
hud_v_cruise = hud_control.setSpeed / conversion if hud_control.speedVisible else 255
pcm_cancel_cmd = CC.cruiseControl.cancel

Expand Down Expand Up @@ -207,8 +207,11 @@ def update(self, CC, CS, now_nanos):

if self.CP.carFingerprint in HONDA_BOSCH:
self.accel = float(np.clip(accel, self.params.BOSCH_ACCEL_MIN, self.params.BOSCH_ACCEL_MAX))
self.gas = float(np.interp(accel, self.params.BOSCH_GAS_LOOKUP_BP, self.params.BOSCH_GAS_LOOKUP_V))

if self.CP.carFingerprint in HONDA_BOSCH_1000:
self.gas = float(np.interp(accel, self.params.BOSCH_1000_GAS_LOOKUP_BP, self.params.BOSCH_1000_GAS_LOOKUP_V))
else:
self.gas = float(np.interp(accel, self.params.BOSCH_GAS_LOOKUP_BP, self.params.BOSCH_GAS_LOOKUP_V))

stopping = actuators.longControlState == LongCtrlState.stopping
self.stopping_counter = self.stopping_counter + 1 if stopping else 0
can_sends.extend(hondacan.create_acc_commands(self.packer, self.CAN, CC.enabled, CC.longActive, self.accel, self.gas,
Expand Down
20 changes: 16 additions & 4 deletions opendbc/car/honda/carstate.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from opendbc.can.parser import CANParser
from opendbc.car import Bus, create_button_events, structs
from opendbc.car.common.conversions import Conversions as CV
from opendbc.car.honda.hondacan import CanBus, get_cruise_speed_conversion
from opendbc.car.honda.hondacan import CanBus
from opendbc.car.honda.values import CAR, DBC, STEER_THRESHOLD, HONDA_BOSCH, \
HONDA_NIDEC_ALT_SCM_MESSAGES, HONDA_BOSCH_RADARLESS, \
HondaFlags, CruiseButtons, CruiseSettings, GearShifter
Expand Down Expand Up @@ -70,7 +70,7 @@ def get_can_messages(CP, gearbox_msg):

# TODO: clean this up
if CP.carFingerprint in (CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_BOSCH_DIESEL, CAR.HONDA_CRV_HYBRID, CAR.HONDA_INSIGHT,
CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.HONDA_CIVIC_2022, CAR.HONDA_HRV_3G):
CAR.ACURA_RDX_3G, CAR.HONDA_ODYSSEY_5G_MMR, CAR.HONDA_E, CAR.HONDA_CIVIC_2022, CAR.HONDA_HRV_3G):
pass
elif CP.carFingerprint in (CAR.HONDA_ODYSSEY_CHN, CAR.HONDA_FREED, CAR.HONDA_HRV):
pass
Expand Down Expand Up @@ -107,6 +107,7 @@ def __init__(self, CP):
self.brake_switch_active = False
self.cruise_setting = 0
self.v_cruise_pcm_prev = 0
self.is_metric_cruise = False

# When available we use cp.vl["CAR_SPEED"]["ROUGH_CAR_SPEED_2"] to populate vEgoCluster
# However, on cars without a digital speedometer this is not always present (HRV, FIT, CRV 2016, ILX and RDX)
Expand All @@ -133,13 +134,21 @@ def update(self, can_parsers) -> structs.CarState:
# used for car hud message
self.is_metric = not cp.vl["CAR_SPEED"]["IMPERIAL_UNIT"]

# is_metric_cruise is used for cruise speed display
# ACC_HUD is on camera bus on radarless cars
acc_hud = cp_cam.vl["ACC_HUD"] if self.CP.carFingerprint in HONDA_BOSCH_RADARLESS else cp.vl["ACC_HUD"]
if acc_hud["CRUISE_SPEED"] >= 253:
self.is_metric_cruise = self.is_metric
else:
self.is_metric_cruise = not acc_hud["IMPERIAL_UNIT"]

# ******************* parse out can *******************
# STANDSTILL->WHEELS_MOVING bit can be noisy around zero, so use XMISSION_SPEED
# panda checks if the signal is non-zero
ret.standstill = cp.vl["ENGINE_DATA"]["XMISSION_SPEED"] < 1e-5
# TODO: find a common signal across all cars
if self.CP.carFingerprint in (CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_BOSCH_DIESEL, CAR.HONDA_CRV_HYBRID, CAR.HONDA_INSIGHT,
CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.HONDA_CIVIC_2022, CAR.HONDA_HRV_3G):
CAR.ACURA_RDX_3G, CAR.HONDA_ODYSSEY_5G_MMR, CAR.HONDA_E, CAR.HONDA_CIVIC_2022, CAR.HONDA_HRV_3G):
ret.doorOpen = bool(cp.vl["SCM_FEEDBACK"]["DRIVERS_DOOR_OPEN"])
elif self.CP.carFingerprint in (CAR.HONDA_ODYSSEY_CHN, CAR.HONDA_FREED, CAR.HONDA_HRV):
ret.doorOpen = bool(cp.vl["SCM_BUTTONS"]["DRIVERS_DOOR_OPEN"])
Expand Down Expand Up @@ -225,7 +234,7 @@ def update(self, can_parsers) -> structs.CarState:
ret.cruiseState.nonAdaptive = acc_hud["CRUISE_CONTROL_LABEL"] != 0
ret.cruiseState.standstill = acc_hud["CRUISE_SPEED"] == 252.

conversion = get_cruise_speed_conversion(self.CP.carFingerprint, self.is_metric)
conversion = CV.KPH_TO_MS if self.is_metric_cruise else CV.MPH_TO_MS
# On set, cruise set speed pulses between 254~255 and the set speed prev is set to avoid this.
ret.cruiseState.speed = self.v_cruise_pcm_prev if acc_hud["CRUISE_SPEED"] > 160.0 else acc_hud["CRUISE_SPEED"] * conversion
self.v_cruise_pcm_prev = ret.cruiseState.speed
Expand All @@ -251,6 +260,9 @@ def update(self, can_parsers) -> structs.CarState:
ret.cruiseState.enabled = cp.vl["POWERTRAIN_DATA"]["ACC_STATUS"] != 0
ret.cruiseState.available = bool(cp.vl[self.main_on_sig_msg]["MAIN_ON"])

# Adds low speed warning as some models disable cruise at various speeds, ignore warning under 3mph
ret.low_speed_alert = ret.cruiseState.enabled and ret.vEgo >= 4 * CV.MPH_TO_MS and cp.vl["STEER_STATUS"]["STEER_CONTROL_ACTIVE"] == 0

# Gets rid of Pedal Grinding noise when brake is pressed at slow speeds for some models
if self.CP.carFingerprint in (CAR.HONDA_PILOT, CAR.HONDA_RIDGELINE):
if ret.brake > 0.1:
Expand Down
40 changes: 40 additions & 0 deletions opendbc/car/honda/fingerprints.py
Original file line number Diff line number Diff line change
Expand Up @@ -562,6 +562,46 @@
b'77959-T6A-P110\x00\x00',
],
},
CAR.HONDA_ODYSSEY_5G_MMR: {
(Ecu.vsa, 0x18da28f1, None): [
b'57114-THR-A230\x00\x00',
b'57114-THR-A240\x00\x00',
b'57114-THR-A520\x00\x00',
],
(Ecu.fwdRadar, 0x18dab0f1, None): [
b'36802-THR-A220\x00\x00',
],
(Ecu.fwdCamera, 0x18dab5f1, None): [
b'36161-THR-A220\x00\x00',
b'36161-THR-A230\x00\x00',
],
(Ecu.shiftByWire, 0x18da0bf1, None): [
b'54008-THR-A310\x00\x00',
b'54008-THR-A310\x00\x00',
],
(Ecu.transmission, 0x18da1ef1, None): [
b'28102-5MX-A410\x00\x00',
],
(Ecu.srs, 0x18da53f1, None): [
b'77959-THR-A220\x00\x00',
b'77959-THR-A230\x00\x00',
b'77959-THR-A320\x00\x00',
],
(Ecu.electricBrakeBooster, 0x18da2bf1, None): [
b'46114-THR-A530\x00\x00',
b'46114-THR-A540\x00\x00',
b'46114-THR-A720\x00\x00',
],
(Ecu.gateway, 0x18daeff1, None): [
b'38897-THR-A130\x00\x00',
b'38897-THR-A320\x00\x00',
b'38897-THR-A410\x00\x00',
],
(Ecu.eps, 0x18da30f1, None): [
b'39990-THR-A050\x00\x00',
b'39990-THR-A110\x00\x00',
],
},
CAR.HONDA_PILOT: {
(Ecu.shiftByWire, 0x18da0bf1, None): [
b'54008-TG7-A520\x00\x00',
Expand Down
5 changes: 0 additions & 5 deletions opendbc/car/honda/hondacan.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,6 @@ def body(self) -> int:
return self.offset


def get_cruise_speed_conversion(car_fingerprint: str, is_metric: bool) -> float:
# on certain cars, CRUISE_SPEED changes to imperial with car's unit setting
return CV.MPH_TO_MS if car_fingerprint in HONDA_BOSCH_RADARLESS and not is_metric else CV.KPH_TO_MS


def create_brake_command(packer, CAN, apply_brake, pump_on, pcm_override, pcm_cancel_cmd, fcw, car_fingerprint, stock_brake):
# TODO: do we loose pressure if we keep pump off for long?
brakelights = apply_brake > 0
Expand Down
10 changes: 9 additions & 1 deletion opendbc/car/honda/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,14 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime
else:
ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end

elif candidate == CAR.HONDA_ODYSSEY_5G_MMR:
if not ret.openpilotLongitudinalControl:
ret.minSteerSpeed = 70.0 * CV.KPH_TO_MS
ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3840], [0, 3840]] # clipped by radar
else:
ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.06]]

elif candidate == CAR.HONDA_PILOT:
ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.38], [0.11]]
Expand Down Expand Up @@ -206,7 +214,7 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experime
ret.autoResumeSng = candidate in (HONDA_BOSCH | {CAR.HONDA_CIVIC})
ret.minEnableSpeed = -1. if ret.autoResumeSng else 25.51 * CV.MPH_TO_MS

ret.steerActuatorDelay = 0.1
ret.steerActuatorDelay = 0.3 if candidate in (CAR.HONDA_ODYSSEY_5G_MMR) else 0.1
ret.steerLimitTimer = 0.8
ret.radarDelay = 0.1

Expand Down
12 changes: 10 additions & 2 deletions opendbc/car/honda/values.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class CarControllerParams:

BOSCH_GAS_LOOKUP_BP = [-0.2, 2.0] # 2m/s^2
BOSCH_GAS_LOOKUP_V = [0, 1600]
BOSCH_1000_GAS_LOOKUP_V = [0, 2000]

STEER_STEP = 1 # 100 Hz
STEER_DELTA_UP = 3 # min/max in 0.33s for all Honda
Expand Down Expand Up @@ -180,6 +181,12 @@ class CAR(Platforms):
{Bus.pt: 'honda_civic_ex_2022_can_generated'},
flags=HondaFlags.BOSCH_RADARLESS,
)
HONDA_ODYSSEY_5G_MMR = HondaBoschPlatformConfig(
[HondaCarDocs("Honda Odyssey 2021-2025", "All", min_steer_speed=3. * CV.MPH_TO_MS)],
CarSpecs(mass=4590 * CV.LB_TO_KG, wheelbase=3.00, steerRatio=13.35, centerToFrontRatio=0.54, tireStiffnessFactor=1.02), # as spec
{Bus.pt: 'acura_rdx_2020_can_generated'},
flags=HondaFlags.BOSCH_ALT_BRAKE,
)
ACURA_RDX_3G = HondaBoschPlatformConfig(
[HondaCarDocs("Acura RDX 2019-21", "All", min_steer_speed=3. * CV.MPH_TO_MS)],
CarSpecs(mass=4068 * CV.LB_TO_KG, wheelbase=2.75, steerRatio=11.95, centerToFrontRatio=0.41, tireStiffnessFactor=0.677), # as spec
Expand Down Expand Up @@ -314,9 +321,9 @@ class CAR(Platforms):
# Note that we still attempt to match with them when they are present
# This is or'd with (ALL_ECUS - ESSENTIAL_ECUS) from fw_versions.py
non_essential_ecus={
Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_2022, CAR.HONDA_E, CAR.HONDA_HRV_3G],
Ecu.eps: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC_2022, CAR.HONDA_E, CAR.HONDA_HRV_3G, CAR.HONDA_ODYSSEY_5G_MMR],
Ecu.vsa: [CAR.ACURA_RDX_3G, CAR.HONDA_ACCORD, CAR.HONDA_CIVIC, CAR.HONDA_CIVIC_BOSCH, CAR.HONDA_CIVIC_2022, CAR.HONDA_CRV_5G, CAR.HONDA_CRV_HYBRID,
CAR.HONDA_E, CAR.HONDA_HRV_3G, CAR.HONDA_INSIGHT],
CAR.HONDA_E, CAR.HONDA_HRV_3G, CAR.HONDA_INSIGHT, CAR.HONDA_ODYSSEY_5G_MMR],
},
extra_ecus=[
(Ecu.combinationMeter, 0x18da60f1, None),
Expand All @@ -339,6 +346,7 @@ class CAR(Platforms):
HONDA_NIDEC_ALT_SCM_MESSAGES = CAR.with_flags(HondaFlags.NIDEC_ALT_SCM_MESSAGES)
HONDA_BOSCH = CAR.with_flags(HondaFlags.BOSCH)
HONDA_BOSCH_RADARLESS = CAR.with_flags(HondaFlags.BOSCH_RADARLESS)
HONDA_BOSCH_1000 = {CAR.HONDA_ODYSSEY_5G_MMR} # overrides for 1000 gas units per m/s accel


DBC = CAR.create_dbc_map()
1 change: 1 addition & 0 deletions opendbc/car/torque_data/params.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
"HONDA_HRV" = [2.0661212805710205, 0.7521343418694775, 0.17760375789242094]
"HONDA_INSIGHT" = [1.5201671214069354, 0.5660229120683284, 0.25808042580281876]
"HONDA_ODYSSEY" = [1.8774809275211801, 0.8394431662987996, 0.2096978613792822]
"HONDA_ODYSSEY_5G_MMR" = [1.6, 0.8394431662987996, 0.226]
"HONDA_PILOT" = [1.7262026201812795, 0.9470005614967523, 0.21351430733218763]
"HONDA_RIDGELINE" = [1.4146525028237624, 0.7356572861629564, 0.23307177552211328]
"HYUNDAI_ELANTRA_2021" = [3.169, 2.1259108157250735, 0.0819]
Expand Down
Loading