Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 4 additions & 1 deletion opendbc_repo/opendbc/can/dbc.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from opendbc.car.chrysler.chryslercan import chrysler_checksum, fca_giorgio_checksum
from opendbc.car.hyundai.hyundaicanfd import hkg_can_fd_checksum
from opendbc.car.volkswagen.mlbcan import volkswagen_mlb_checksum
from opendbc.car.volkswagen.mqbcan import volkswagen_mqb_meb_checksum, xor_checksum
from opendbc.car.volkswagen.mqbcan import volkswagen_mqb_meb_gen2_checksum, volkswagen_mqb_meb_checksum, xor_checksum
from opendbc.car.tesla.teslacan import tesla_checksum
from opendbc.car.body.bodycan import body_checksum
from opendbc.car.psa.psacan import psa_checksum
Expand All @@ -35,6 +35,7 @@ class SignalType:
PSA_CHECKSUM = 12
VOLKSWAGEN_MLB_CHECKSUM = 13
PEDAL_CHECKSUM = 14
VOLKSWAGEN_MQB_MEB_GEN2_CHECKSUM = 15


@dataclass
Expand Down Expand Up @@ -196,6 +197,8 @@ def get_checksum_state(dbc_name: str) -> ChecksumState | None:
return ChecksumState(8, -1, 7, -1, False, SignalType.TOYOTA_CHECKSUM, toyota_checksum)
elif dbc_name.startswith("hyundai_canfd_generated"):
return ChecksumState(16, -1, 0, -1, True, SignalType.HKG_CAN_FD_CHECKSUM, hkg_can_fd_checksum)
elif dbc_name.startswith("vw_meb_2024"):
return ChecksumState(8, 4, 0, 0, True, SignalType.VOLKSWAGEN_MQB_MEB_GEN2_CHECKSUM, volkswagen_mqb_meb_gen2_checksum)
elif dbc_name.startswith(("vw_mqb", "vw_mqbevo", "vw_meb")):
return ChecksumState(8, 4, 0, 0, True, SignalType.VOLKSWAGEN_MQB_MEB_CHECKSUM, volkswagen_mqb_meb_checksum)
elif dbc_name.startswith("vw_mlb"):
Expand Down
65 changes: 64 additions & 1 deletion opendbc_repo/opendbc/car/lateral.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,23 @@
import math
import numpy as np
from dataclasses import dataclass
from opendbc.car import structs, rate_limit, DT_CTRL
from typing import Tuple

from opendbc.car import structs, rate_limit, DT_CTRL, ACCELERATION_DUE_TO_GRAVITY
from opendbc.car.vehicle_model import VehicleModel

FRICTION_THRESHOLD = 0.3

# ISO 11270
ISO_LATERAL_ACCEL = 3.0 # m/s^2
ISO_LATERAL_JERK = 5.0 # m/s^3
AVERAGE_ROAD_ROLL = 0.06 # 평균 도로 롤 (MEB 곡률 한계 계산용)
MAX_LATERAL_ACCEL = ISO_LATERAL_ACCEL + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL)


@dataclass
class CurvatureSteeringLimits:
CURVATURE_MAX: float


@dataclass
Expand All @@ -24,6 +33,60 @@ class AngleSteeringLimits:
MAX_ANGLE_RATE: float = math.inf


def get_max_curvature_jerk(v_ego: float, steer_step: int) -> float:
ts_elapsed = steer_step * DT_CTRL
curvature_rate_limit = ISO_LATERAL_JERK / (max(v_ego, 1.0) ** 2)
return curvature_rate_limit * ts_elapsed


def get_max_curvature_roll(roll: float, v_ego: float) -> Tuple[float, float]:
max_lat_accel = ISO_LATERAL_ACCEL - (roll * ACCELERATION_DUE_TO_GRAVITY)
min_lat_accel = -ISO_LATERAL_ACCEL - (roll * ACCELERATION_DUE_TO_GRAVITY)
max_curvature = max_lat_accel / (max(v_ego, 1.0) ** 2)
min_curvature = min_lat_accel / (max(v_ego, 1.0) ** 2)
return min_curvature, max_curvature


def get_max_curvature_average(v_ego: float) -> Tuple[float, float]:
max_curvature = MAX_LATERAL_ACCEL / (max(v_ego, 1.0) ** 2)
return -max_curvature, max_curvature


def get_max_curvature_yaw_rate(yaw_rate: float, apply_curvature: float, apply_curvature_last: float, v_ego: float,
steer_step: int, override: bool) -> Tuple[float, float]:
min_curvature, max_curvature = get_max_curvature_average(v_ego)
if not override:
max_lateral_accel = max_curvature * (max(v_ego, 1.0) ** 2)
actual_lat_accel = abs(yaw_rate) * max(v_ego, 1.0)
if actual_lat_accel > max_lateral_accel:
scale = MAX_LATERAL_ACCEL / actual_lat_accel
max_curvature = apply_curvature * scale
max_jerk = get_max_curvature_jerk(v_ego, steer_step)
curvature_up = abs(apply_curvature_last) + max_jerk
curvature_down = abs(apply_curvature_last) - max_jerk
max_curvature = float(np.clip(max_curvature, curvature_down, curvature_up))
return -max_curvature, max_curvature


def apply_std_curvature_limits(apply_curvature: float, apply_curvature_last: float, v_ego: float, curvature: float, override: bool,
steer_step: int, lat_active: bool, limits: CurvatureSteeringLimits, roll=None, yaw_rate=None) -> float:
new_apply_curvature = apply_curvature
max_jerk = get_max_curvature_jerk(v_ego, steer_step)
curvature_up = apply_curvature_last + max_jerk
curvature_down = apply_curvature_last - max_jerk
new_apply_curvature = float(np.clip(new_apply_curvature, curvature_down, curvature_up))
if roll is not None:
min_curvature, max_curvature = get_max_curvature_roll(roll, v_ego)
elif yaw_rate is not None:
min_curvature, max_curvature = get_max_curvature_yaw_rate(yaw_rate, apply_curvature, apply_curvature_last, v_ego, steer_step, override)
else:
min_curvature, max_curvature = get_max_curvature_average(v_ego)
new_apply_curvature = float(np.clip(new_apply_curvature, min_curvature, max_curvature))
if not lat_active:
new_apply_curvature = curvature
return float(np.clip(new_apply_curvature, -limits.CURVATURE_MAX, limits.CURVATURE_MAX))


def apply_driver_steer_torque_limits(apply_torque: int, apply_torque_last: int, driver_torque: float, LIMITS, steer_max: int = None):
# some safety modes utilize a dynamic max steer
if steer_max is None:
Expand Down
2 changes: 2 additions & 0 deletions opendbc_repo/opendbc/car/torque_data/substitute.toml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
"VOLKSWAGEN_POLO_MK6" = "VOLKSWAGEN_GOLF_MK7"
"SEAT_ATECA_MK1" = "VOLKSWAGEN_GOLF_MK7"
"VOLKSWAGEN_JETTA_MK6" = "VOLKSWAGEN_PASSAT_NMS"
"VOLKSWAGEN_ID4_MK1" = "VOLKSWAGEN_TIGUAN_MK2"
"VOLKSWAGEN_ID4_MK2" = "VOLKSWAGEN_TIGUAN_MK2"

"SUBARU_CROSSTREK_HYBRID" = "SUBARU_IMPREZA_2020"
"SUBARU_FORESTER_HYBRID" = "SUBARU_IMPREZA_2020"
Expand Down
Loading