fix waze, add cruise button mode 3 (#180)

* enable detect redlight during regen decel..

* button mode 2 decel..

* lanemode timeadjust 0.05 -> 0.07

* limit_accel_in_turn:  unstable decel during cornering

* roadLimitSpeed from Car.

* fix roadlimitSpeed display..

* fix lanemode model condition..

* fix.. typo

* fix.

* test for SK3

* fix.. standstill

* Revert "test for SK3"

This reverts commit b7ab995c5ef2e482b65704fb18c7bc5a3bcf1171.

* fix.. loadLimitSpeed..

* fix roadSpeedLimit(hkg can)

* initial "gas" state for bump

* fix.. lane mode adjust time.. 5 -> 7 -> 6

* test lanemode (curve -> straight)

* fix..  lane

* revert

* fix. laneline curv -> straight..

* fix.. revert

* fix.. lanemode... again..

* canfd 0x1b5

* disp CarVolt

* fix..

* LatMpc Input/Output offset

* kisa waze & roadlimitspeed.

* fix..

* test

* ff

* ff

* fix..

* add roadlimitspeed offset

* fix.speed limit..

* fix.. waze

* fix.. mph

* fix.. ccnc

* fix..

* fix..

* Update carrot.cc

* fix estimate radar dt..

* fix feet...

* fix police..

* test lanemode curve to straight

* fix police..

* fix comment..

* fix curvature & no siren (#179)

* fix dos,tres siren

* fix curvature

* cruise button mode3

* add lane chane delay..

* fix.. volt display..

* fix.. roadlimit speed limitation..

* fix.. typo

* test

* fix..

* fix..

* fix.. tpms

* fix..

* fix..

* fix. tpms

* collision detect... dashcam mode...

---------

Co-authored-by: Lee Jong Mun <43285072+crwusiz@users.noreply.github.com>
This commit is contained in:
carrot 2025-06-04 07:20:24 +09:00 committed by GitHub
parent f5e5ce44cc
commit 52f10ca29a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
20 changed files with 480 additions and 126 deletions

View File

@ -172,6 +172,7 @@ inline static std::unordered_map<std::string, uint32_t> keys = {
{"AutoTurnMapChange", PERSISTENT }, {"AutoTurnMapChange", PERSISTENT },
{"AutoNaviSpeedCtrlEnd", PERSISTENT}, {"AutoNaviSpeedCtrlEnd", PERSISTENT},
{"AutoNaviSpeedCtrlMode", PERSISTENT}, {"AutoNaviSpeedCtrlMode", PERSISTENT},
{"AutoRoadSpeedLimitOffset", PERSISTENT},
{"AutoNaviSpeedBumpTime", PERSISTENT}, {"AutoNaviSpeedBumpTime", PERSISTENT},
{"AutoNaviSpeedBumpSpeed", PERSISTENT}, {"AutoNaviSpeedBumpSpeed", PERSISTENT},
{"AutoNaviSpeedDecelRate", PERSISTENT}, {"AutoNaviSpeedDecelRate", PERSISTENT},
@ -191,6 +192,11 @@ inline static std::unordered_map<std::string, uint32_t> keys = {
{"CruiseButtonTest2", PERSISTENT}, {"CruiseButtonTest2", PERSISTENT},
{"CruiseButtonTest3", PERSISTENT}, {"CruiseButtonTest3", PERSISTENT},
{"CruiseSpeedUnit", PERSISTENT}, {"CruiseSpeedUnit", PERSISTENT},
{"CruiseSpeed1", PERSISTENT},
{"CruiseSpeed2", PERSISTENT},
{"CruiseSpeed3", PERSISTENT},
{"CruiseSpeed4", PERSISTENT},
{"CruiseSpeed5", PERSISTENT},
{"PaddleMode", PERSISTENT}, {"PaddleMode", PERSISTENT},
{"MyDrivingMode", PERSISTENT}, {"MyDrivingMode", PERSISTENT},
{"MyDrivingModeAuto", PERSISTENT}, {"MyDrivingModeAuto", PERSISTENT},
@ -231,6 +237,7 @@ inline static std::unordered_map<std::string, uint32_t> keys = {
{"UseLaneLineSpeedApply", PERSISTENT}, {"UseLaneLineSpeedApply", PERSISTENT},
{"AdjustLaneOffset", PERSISTENT}, {"AdjustLaneOffset", PERSISTENT},
{"LaneChangeNeedTorque", PERSISTENT}, {"LaneChangeNeedTorque", PERSISTENT},
{"LaneChangeDelay", PERSISTENT },
{"LaneChangeBsd", PERSISTENT}, {"LaneChangeBsd", PERSISTENT},
{"MaxAngleFrames", PERSISTENT}, {"MaxAngleFrames", PERSISTENT},
{"SoftHoldMode", PERSISTENT}, {"SoftHoldMode", PERSISTENT},
@ -238,7 +245,9 @@ inline static std::unordered_map<std::string, uint32_t> keys = {
{"LatMpcMotionCost", PERSISTENT}, {"LatMpcMotionCost", PERSISTENT},
{"LatMpcAccelCost", PERSISTENT}, {"LatMpcAccelCost", PERSISTENT},
{"LatMpcJerkCost", PERSISTENT}, {"LatMpcJerkCost", PERSISTENT},
{"LatMpcSteeringRateCost", PERSISTENT}, {"LatMpcSteeringRateCost", PERSISTENT },
{"LatMpcInputOffset", PERSISTENT},
{"LatMpcOutputOffset", PERSISTENT},
{"PathOffset", PERSISTENT}, {"PathOffset", PERSISTENT},
{"LateralTorqueCustom", PERSISTENT}, {"LateralTorqueCustom", PERSISTENT},
{"LateralTorqueAccelFactor", PERSISTENT}, {"LateralTorqueAccelFactor", PERSISTENT},

View File

@ -449,6 +449,8 @@ class CarState(CarStateBase):
if "HDA_INFO_4A3" in cp.vl: if "HDA_INFO_4A3" in cp.vl:
self.hda_info_4a3 = copy.copy(cp.vl.get("HDA_INFO_4A3", {})) self.hda_info_4a3 = copy.copy(cp.vl.get("HDA_INFO_4A3", {}))
speedLimit = self.hda_info_4a3["SPEED_LIMIT"] speedLimit = self.hda_info_4a3["SPEED_LIMIT"]
if not self.is_metric:
speedLimit = CV.MPH_TO_KPH
ret.speedLimit = speedLimit if speedLimit < 255 else 0 ret.speedLimit = speedLimit if speedLimit < 255 else 0
if int(self.hda_info_4a3["NEW_SIGNAL_4"]) == 17: if int(self.hda_info_4a3["NEW_SIGNAL_4"]) == 17:
speed_limit_cam = True speed_limit_cam = True
@ -586,10 +588,9 @@ class CarState(CarStateBase):
("SCC_CONTROL", 50), ("SCC_CONTROL", 50),
] ]
if CP.flags & HyundaiFlags.CANFD_HDA2 and CP.flags & HyundaiFlags.CAMERA_SCC: if CP.extFlags & HyundaiExtFlags.CANFD_4A3:
pt_messages += [ pt_messages += [
("HDA_INFO_4A3", 5), ("HDA_INFO_4A3", 5),
#("NEW_MSG_4B4", 10), # G80 hda2개조차량은 안나옴. 원래그런건지.. 어짜피 안쓰는데이터이니깐...
] ]
#if CP.flags & HyundaiFlags.CANFD_HDA2 and CP.extFlags & HyundaiExtFlags.NAVI_CLUSTER.value and not (CP.extFlags & HyundaiExtFlags.SCC_BUS2.value): #if CP.flags & HyundaiFlags.CANFD_HDA2 and CP.extFlags & HyundaiExtFlags.NAVI_CLUSTER.value and not (CP.extFlags & HyundaiExtFlags.SCC_BUS2.value):
# 어떤차는 bus2에 있음, 내차는 bus0에 있는데.... 이건 옆두부와 관련이 없나? # 어떤차는 bus2에 있음, 내차는 bus0에 있는데.... 이건 옆두부와 관련이 없나?

View File

@ -421,7 +421,7 @@ def forward_button_message(packer, CAN, frame, CS, cruise_button, MainMode_ACC_t
pass pass
elif LFA_trigger > 0: elif LFA_trigger > 0:
values["LFA_BTN"] = 1 values["LFA_BTN"] = 1
ret.append(packer.make_can_msg(CS.cruise_btns_msg_canfd, CAN.CAM, values)) ret.append(packer.make_can_msg(CS.cruise_btns_msg_canfd, CAN.CAM, values))
return ret return ret
@ -509,11 +509,11 @@ def create_ccnc_messages(CP, packer, CAN, frame, CC, CS, hud_control, disp_angle
if values["ALERTS_5"] in [11] and CS.softHoldActive == 0: if values["ALERTS_5"] in [11] and CS.softHoldActive == 0:
values["ALERTS_5"] = 0 values["ALERTS_5"] = 0
curvature = { curvature = round(CS.out.steeringAngleDeg / 3)
i: (31 if i == -1 else 13 - abs(i + 15)) if i < 0 else 15 + i
for i in range(-15, 16) values["LANELINE_CURVATURE"] = (min(abs(curvature), 15) + (-1 if curvature < 0 else 0)) if lat_active else 0
} values["LANELINE_CURVATURE_DIRECTION"] = 1 if curvature < 0 and lat_active else 0
values["LANELINE_CURVATURE"] = curvature.get(max(-15, min(round(disp_angle / 3), 15)), 14)
if hud_control.leftLaneDepart: if hud_control.leftLaneDepart:
values["LANELINE_LEFT"] = 4 if (frame // 50) % 2 == 0 else 1 values["LANELINE_LEFT"] = 4 if (frame // 50) % 2 == 0 else 1
else: else:
@ -522,8 +522,8 @@ def create_ccnc_messages(CP, packer, CAN, frame, CC, CS, hud_control, disp_angle
values["LANELINE_RIGHT"] = 4 if (frame // 50) % 2 == 0 else 1 values["LANELINE_RIGHT"] = 4 if (frame // 50) % 2 == 0 else 1
else: else:
values["LANELINE_RIGHT"] = 2 if hud_control.rightLaneVisible else 0 values["LANELINE_RIGHT"] = 2 if hud_control.rightLaneVisible else 0
values["LANELINE_LEFT_POSITION"] = 15 #values["LANELINE_LEFT_POSITION"] = 15
values["LANELINE_RIGHT_POSITION"] = 15 #values["LANELINE_RIGHT_POSITION"] = 15
values["LCA_LEFT_ARROW"] = 2 if CS.out.leftBlinker else 0 values["LCA_LEFT_ARROW"] = 2 if CS.out.leftBlinker else 0
values["LCA_RIGHT_ARROW"] = 2 if CS.out.rightBlinker else 0 values["LCA_RIGHT_ARROW"] = 2 if CS.out.rightBlinker else 0

View File

@ -54,6 +54,9 @@ class CarInterface(CarInterfaceBase):
if 0x105 in fingerprint[CAN.ECAN]: if 0x105 in fingerprint[CAN.ECAN]:
ret.flags |= HyundaiFlags.HYBRID.value ret.flags |= HyundaiFlags.HYBRID.value
if 0x4a3 in fingerprint[CAN.ECAN]:
ret.extFlags |= HyundaiExtFlags.CANFD_4A3.value
# detect HDA2 with ADAS Driving ECU # detect HDA2 with ADAS Driving ECU
if hda2: if hda2:
print("$$$CANFD HDA2") print("$$$CANFD HDA2")

View File

@ -155,6 +155,7 @@ class HyundaiExtFlags(IntFlag):
CANFD_161 = 2 ** 11 CANFD_161 = 2 ** 11
CRUISE_BUTTON_ALT = 2 ** 12 # for CASPER_EV CRUISE_BUTTON_ALT = 2 ** 12 # for CASPER_EV
STEER_TOUCH = 2 ** 13 STEER_TOUCH = 2 ** 13
CANFD_4A3 = 2 ** 14
class Footnote(Enum): class Footnote(Enum):
CANFD = CarFootnote( CANFD = CarFootnote(

View File

@ -154,8 +154,8 @@ class RadarInterfaceBase(ABC):
self.init_done = False self.init_done = False
def estimate_dt(self, rcv_time): def estimate_dt(self, rcv_time):
if len(self.init_samples) > 20: if len(self.init_samples) > 50:
estimated_dt = np.mean(np.diff(self.init_samples)) estimated_dt = np.mean(np.diff(self.init_samples[20:]))
self.dt = estimated_dt self.dt = estimated_dt
self.init_done = True self.init_done = True
print(f"Estimated radar dt: {self.dt} sec") print(f"Estimated radar dt: {self.dt} sec")

View File

@ -280,7 +280,8 @@ BO_ 353 ADRV_0x161: 32 ADRV
SG_ LANELINE_LEFT_POSITION : 84|6@1+ (1,0) [0|15] "" XXX SG_ LANELINE_LEFT_POSITION : 84|6@1+ (1,0) [0|15] "" XXX
SG_ LANELINE_RIGHT : 90|4@1+ (1,0) [0|15] "" XXX SG_ LANELINE_RIGHT : 90|4@1+ (1,0) [0|15] "" XXX
SG_ LANELINE_RIGHT_POSITION : 94|6@1+ (1,0) [0|15] "" XXX SG_ LANELINE_RIGHT_POSITION : 94|6@1+ (1,0) [0|15] "" XXX
SG_ LANELINE_CURVATURE : 100|5@1- (1,15) [0|31] "" XXX SG_ LANELINE_CURVATURE : 100|4@1+ (1,0) [0|31] "" XXX
SG_ LANELINE_CURVATURE_DIRECTION : 104|1@0+ (1,0) [0|1] "" XXX
SG_ LANE_HIGHLIGHT : 105|4@1+ (1,0) [0|15] "" XXX SG_ LANE_HIGHLIGHT : 105|4@1+ (1,0) [0|15] "" XXX
SG_ LANE_HIGHLIGHT_DISTANCE : 109|11@1+ (0.1,0) [0|204.7] "m" XXX SG_ LANE_HIGHLIGHT_DISTANCE : 109|11@1+ (0.1,0) [0|204.7] "m" XXX
SG_ LANE_LEFT : 120|3@1+ (1,0) [0|7] "" XXX SG_ LANE_LEFT : 120|3@1+ (1,0) [0|7] "" XXX

View File

@ -75,9 +75,9 @@ static void dos_set_fan_enabled(bool enabled){
set_gpio_output(GPIOA, 1, enabled); set_gpio_output(GPIOA, 1, enabled);
} }
static void dos_set_siren(bool enabled){ //static void dos_set_siren(bool enabled){
set_gpio_output(GPIOC, 12, enabled); // set_gpio_output(GPIOC, 12, enabled);
} //}
static bool dos_read_som_gpio (void){ static bool dos_read_som_gpio (void){
return (get_gpio_input(GPIOC, 2) != 0); return (get_gpio_input(GPIOC, 2) != 0);
@ -147,7 +147,7 @@ board board_dos = {
.read_current_mA = unused_read_current, .read_current_mA = unused_read_current,
.set_fan_enabled = dos_set_fan_enabled, .set_fan_enabled = dos_set_fan_enabled,
.set_ir_power = dos_set_ir_power, .set_ir_power = dos_set_ir_power,
.set_siren = dos_set_siren, .set_siren = unused_set_siren,
.set_bootkick = dos_set_bootkick, .set_bootkick = dos_set_bootkick,
.read_som_gpio = dos_read_som_gpio, .read_som_gpio = dos_read_som_gpio,
.set_amp_enabled = unused_set_amp_enabled .set_amp_enabled = unused_set_amp_enabled

View File

@ -166,7 +166,7 @@ board board_tres = {
.read_current_mA = unused_read_current, .read_current_mA = unused_read_current,
.set_fan_enabled = tres_set_fan_enabled, .set_fan_enabled = tres_set_fan_enabled,
.set_ir_power = tres_set_ir_power, .set_ir_power = tres_set_ir_power,
.set_siren = fake_siren_set, .set_siren = unused_set_siren,
.set_bootkick = tres_set_bootkick, .set_bootkick = tres_set_bootkick,
.read_som_gpio = tres_read_som_gpio, .read_som_gpio = tres_read_som_gpio,
.set_amp_enabled = unused_set_amp_enabled .set_amp_enabled = unused_set_amp_enabled

View File

@ -253,6 +253,12 @@ class VCruiseCarrot:
self._cruise_button_mode = self.params.get_int("CruiseButtonMode") self._cruise_button_mode = self.params.get_int("CruiseButtonMode")
self._lfa_button_mode = self.params.get_int("LfaButtonMode") self._lfa_button_mode = self.params.get_int("LfaButtonMode")
self.cruiseOnDist = self.params.get_float("CruiseOnDist") * 0.01 self.cruiseOnDist = self.params.get_float("CruiseOnDist") * 0.01
cruiseSpeed1 = self.params.get_float("CruiseSpeed1")
cruiseSpeed2 = self.params.get_float("CruiseSpeed2")
cruiseSpeed3 = self.params.get_float("CruiseSpeed3")
cruiseSpeed4 = self.params.get_float("CruiseSpeed4")
cruiseSpeed5 = self.params.get_float("CruiseSpeed5")
self._cruise_speed_table = [cruiseSpeed1, cruiseSpeed2, cruiseSpeed3, cruiseSpeed4, cruiseSpeed5]
def update_v_cruise(self, CS, sm, is_metric): def update_v_cruise(self, CS, sm, is_metric):
self._add_log("") self._add_log("")
@ -490,7 +496,7 @@ class VCruiseCarrot:
pass pass
elif not CC.enabled: elif not CC.enabled:
v_cruise_kph = max(self.v_ego_kph_set, self._cruise_speed_min) v_cruise_kph = max(self.v_ego_kph_set, self._cruise_speed_min)
elif self.v_ego_kph_set > v_cruise_kph + 2 and self._cruise_button_mode in [2]: elif self.v_ego_kph_set > v_cruise_kph + 2 and self._cruise_button_mode in [2, 3]:
v_cruise_kph = max(self.v_ego_kph_set, self._cruise_speed_min) v_cruise_kph = max(self.v_ego_kph_set, self._cruise_speed_min)
elif self._cruise_button_mode in [0, 1]: elif self._cruise_button_mode in [0, 1]:
v_cruise_kph = button_kph v_cruise_kph = button_kph
@ -562,7 +568,15 @@ class VCruiseCarrot:
# nRoadLimitSpeed, vTurnSpeed # nRoadLimitSpeed, vTurnSpeed
# gasPressed, brakePressed, standstill # gasPressed, brakePressed, standstill
def _v_cruise_desired(self, CS, v_cruise_kph): def _v_cruise_desired(self, CS, v_cruise_kph):
if v_cruise_kph < 30: #self.nRoadLimitSpeed: if self._cruise_button_mode == 3:
for speed in self._cruise_speed_table:
if v_cruise_kph < speed:
v_cruise_kph = speed
break
else:
v_cruise_kph = ((v_cruise_kph // self._cruise_speed_unit) + 1) * self._cruise_speed_unit
elif v_cruise_kph < 30: #self.nRoadLimitSpeed:
v_cruise_kph = 30 #self.nRoadLimitSpeed v_cruise_kph = 30 #self.nRoadLimitSpeed
else: else:
for speed in range (40, 160, self._cruise_speed_unit): for speed in range (40, 160, self._cruise_speed_unit):

View File

@ -19,6 +19,7 @@ from openpilot.common.params import Params
from openpilot.common.filter_simple import MyMovingAverage from openpilot.common.filter_simple import MyMovingAverage
from openpilot.system.hardware import PC, TICI from openpilot.system.hardware import PC, TICI
from openpilot.selfdrive.navd.helpers import Coordinate from openpilot.selfdrive.navd.helpers import Coordinate
from opendbc.car.common.conversions import Conversions as CV
try: try:
from shapely.geometry import LineString from shapely.geometry import LineString
@ -278,6 +279,8 @@ class CarrotMan:
self.active_carrot_last = False self.active_carrot_last = False
self.is_metric = self.params.get_bool("IsMetric")
def get_broadcast_address(self): def get_broadcast_address(self):
if PC: if PC:
iface = b'br0' iface = b'br0'
@ -583,6 +586,81 @@ class CarrotMan:
print(f"Network error, retrying...: {e}") print(f"Network error, retrying...: {e}")
time.sleep(2) time.sleep(2)
def parse_kisa_data(self, data: bytes):
result = {}
try:
decoded = data.decode('utf-8')
except UnicodeDecodeError:
print("Decoding error:", data)
return result
parts = decoded.split('/')
for part in parts:
if ':' in part:
key, value = part.split(':', 1)
try:
result[key] = int(value)
except ValueError:
result[key] = value
return result
def kisa_app_thread(self):
while True:
try:
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.settimeout(10) # 소켓 타임아웃 설정 (10초)
sock.bind(('', 12345)) # UDP 포트 바인딩
print("#########kisa_app_thread: UDP thread started...")
while True:
try:
#self.remote_addr = None
# 데이터 수신 (UDP는 recvfrom 사용)
try:
data, remote_addr = sock.recvfrom(4096) # 최대 4096 바이트 수신
#print(f"Received data from {self.remote_addr}")
if not data:
raise ConnectionError("No data received")
#if self.remote_addr is None:
# print("Connected to: ", remote_addr)
#self.remote_addr = remote_addr
try:
print(data)
kisa_data = self.parse_kisa_data(data)
self.carrot_serv.update_kisa(kisa_data)
#json_obj = json.loads(data.decode())
#print(json_obj)
except Exception as e:
traceback.print_exc()
print(f"kisa_app_thread: json error...: {e}")
print(data)
except TimeoutError:
print("Waiting for data (timeout)...")
#self.remote_addr = None
time.sleep(1)
except Exception as e:
print(f"kisa_app_thread: error...: {e}")
#self.remote_addr = None
break
except Exception as e:
print(f"kisa_app_thread: recv error...: {e}")
#self.remote_addr = None
break
time.sleep(1)
except Exception as e:
#self.remote_addr = None
print(f"Network error, retrying...: {e}")
time.sleep(2)
def make_tmux_data(self): def make_tmux_data(self):
try: try:
subprocess.run("rm /data/media/tmux.log; tmux capture-pane -pq -S-1000 > /data/media/tmux.log", shell=True, capture_output=True, text=False) subprocess.run("rm /data/media/tmux.log; tmux capture-pane -pq -S-1000 > /data/media/tmux.log", shell=True, capture_output=True, text=False)
@ -886,6 +964,7 @@ class CarrotServ:
self.params_memory = Params("/dev/shm/params") self.params_memory = Params("/dev/shm/params")
self.nRoadLimitSpeed = 30 self.nRoadLimitSpeed = 30
self.nRoadLimitSpeed_last = 30
self.nRoadLimitSpeed_counter = 0 self.nRoadLimitSpeed_counter = 0
self.active_carrot = 0 ## 1: CarrotMan Active, 2: sdi active , 3: speed decel active, 4: section active, 5: bump active, 6: speed limit active self.active_carrot = 0 ## 1: CarrotMan Active, 2: sdi active , 3: speed decel active, 4: section active, 5: bump active, 6: speed limit active
@ -893,6 +972,8 @@ class CarrotServ:
self.active_sdi_count = 0 self.active_sdi_count = 0
self.active_sdi_count_max = 200 # 20 sec self.active_sdi_count_max = 200 # 20 sec
self.active_kisa_count = 0
self.nSdiType = -1 self.nSdiType = -1
self.nSdiSpeedLimit = 0 self.nSdiSpeedLimit = 0
self.nSdiSection = 0 self.nSdiSection = 0
@ -1006,6 +1087,8 @@ class CarrotServ:
self.autoTurnControlTurnEnd = self.params.get_int("AutoTurnControlTurnEnd") self.autoTurnControlTurnEnd = self.params.get_int("AutoTurnControlTurnEnd")
#self.autoNaviSpeedDecelRate = float(self.params.get_int("AutoNaviSpeedDecelRate")) * 0.01 #self.autoNaviSpeedDecelRate = float(self.params.get_int("AutoNaviSpeedDecelRate")) * 0.01
self.autoCurveSpeedLowerLimit = int(self.params.get("AutoCurveSpeedLowerLimit")) self.autoCurveSpeedLowerLimit = int(self.params.get("AutoCurveSpeedLowerLimit"))
self.is_metric = self.params.get_bool("IsMetric")
self.autoRoadSpeedLimitOffset = self.params.get_int("AutoRoadSpeedLimitOffset")
def _update_cmd(self): def _update_cmd(self):
@ -1440,6 +1523,44 @@ class CarrotServ:
self.debugText = f"{self.nRoadLimitSpeed},{msg_nav.maneuverType},{msg_nav.maneuverModifier} " self.debugText = f"{self.nRoadLimitSpeed},{msg_nav.maneuverType},{msg_nav.maneuverModifier} "
#print(msg_nav) #print(msg_nav)
#print(f"navInstruction: {self.xTurnInfo}, {self.xDistToTurn}, {self.szTBTMainText}") #print(f"navInstruction: {self.xTurnInfo}, {self.xDistToTurn}, {self.szTBTMainText}")
def update_kisa(self, data):
self.active_kisa_count = 100
if "kisawazecurrentspd" in data:
pass
if "kisawazeroadspdlimit" in data:
road_limit_speed = data["kisawazeroadspdlimit"]
if road_limit_speed > 0:
print(f"kisawazeroadspdlimit: {road_limit_speed} km/h")
if not self.is_metric:
road_limit_speed *= CV.MPH_TO_KPH
self.nRoadLimitSpeed = road_limit_speed
if "kisawazealert" in data:
pass
if "kisawazeendalert" in data:
pass
if "kisawazeroadname" in data:
print(f"kisawazeroadname: {data['kisawazeroadname']}")
self.szPosRoadName = data["kisawazeroadname"]
if "kisawazereportid" in data and "kisawazealertdist" in data:
id_str = data["kisawazereportid"]
dist_str = data["kisawazealertdist"].lower()
import re
match = re.search(r'(\d+)', dist_str)
distance = int(match.group(1)) if match else 0
if not self.is_metric:
distance = int(distance * 0.3048)
print(f"{id_str}: {distance} m")
xSpdType = -1
if 'camera' in id_str:
xSpdType = 1
elif 'police' in id_str:
xSpdType = 100
if xSpdType >= 0:
self.xSpdLimit = self.nRoadLimitSpeed
self.xSpdDist = distance
self.xSpdType =xSpdType
def update_navi(self, remote_ip, sm, pm, vturn_speed, coords, distances, route_speed): def update_navi(self, remote_ip, sm, pm, vturn_speed, coords, distances, route_speed):
@ -1452,26 +1573,41 @@ class CarrotServ:
distanceTraveled = sm['selfdriveState'].distanceTraveled distanceTraveled = sm['selfdriveState'].distanceTraveled
delta_dist = distanceTraveled - self.totalDistance delta_dist = distanceTraveled - self.totalDistance
self.totalDistance = distanceTraveled self.totalDistance = distanceTraveled
if CS.speedLimit > 0: if CS.speedLimit > 0 and self.active_carrot <= 1:
self.nRoadLimitSpeed = CS.speedLimit self.nRoadLimitSpeed = CS.speedLimit
else: else:
v_ego = v_ego_kph = 0 v_ego = v_ego_kph = 0
delta_dist = 0 delta_dist = 0
CS = None CS = None
road_speed_limit_changed = True if self.nRoadLimitSpeed != self.nRoadLimitSpeed_last else False
self.nRoadLimitSpeed_last = self.nRoadLimitSpeed
#self.bearing = self.nPosAngle #self._update_gps(v_ego, sm) #self.bearing = self.nPosAngle #self._update_gps(v_ego, sm)
self.bearing = self._update_gps(v_ego, sm) self.bearing = self._update_gps(v_ego, sm)
self.xSpdDist = max(self.xSpdDist - delta_dist, 0) self.xSpdDist = max(self.xSpdDist - delta_dist, -1000)
self.xDistToTurn = max(self.xDistToTurn - delta_dist, 0) self.xDistToTurn = max(self.xDistToTurn - delta_dist, 0)
self.xDistToTurnNext = max(self.xDistToTurnNext - delta_dist, 0) self.xDistToTurnNext = max(self.xDistToTurnNext - delta_dist, 0)
self.active_count = max(self.active_count - 1, 0) self.active_count = max(self.active_count - 1, 0)
self.active_sdi_count = max(self.active_sdi_count - 1, 0) self.active_sdi_count = max(self.active_sdi_count - 1, 0)
if self.active_count > 0: self.active_kisa_count = max(self.active_kisa_count - 1, 0)
if self.active_kisa_count > 0:
self.active_carrot = 2
elif self.active_count > 0:
self.active_carrot = 2 if self.active_sdi_count > 0 else 1 self.active_carrot = 2 if self.active_sdi_count > 0 else 1
else: else:
self.active_carrot = 0 self.active_carrot = 0
if self.autoRoadSpeedLimitOffset >= 0 and self.active_carrot>=2:
if self.nRoadLimitSpeed >= 30:
road_speed_limit_offset = self.autoRoadSpeedLimitOffset
if not self.is_metric:
road_speed_limit_offset *= CV.KPH_TO_MPH
limit_speed = self.nRoadLimitSpeed + road_speed_limit_offset
else:
limit_speed = 200
if self.active_carrot <= 1: if self.active_carrot <= 1:
self.xSpdType = self.navType = self.xTurnInfo = self.xTurnInfoNext = -1 self.xSpdType = self.navType = self.xTurnInfo = self.xTurnInfoNext = -1
self.nSdiType = self.nSdiBlockType = self.nSdiPlusBlockType = -1 self.nSdiType = self.nSdiBlockType = self.nSdiPlusBlockType = -1
@ -1480,7 +1616,7 @@ class CarrotServ:
self.nGoPosDist = 0 self.nGoPosDist = 0
self.update_nav_instruction(sm) self.update_nav_instruction(sm)
if self.xSpdType < 0 or self.xSpdDist <= 0: if self.xSpdType < 0 or (self.xSpdType != 100 and self.xSpdDist <= 0) or (self.xSpdType == 100 and self.xSpdDist < -250):
self.xSpdType = -1 self.xSpdType = -1
self.xSpdDist = self.xSpdLimit = 0 self.xSpdDist = self.xSpdLimit = 0
if self.xTurnInfo < 0 or self.xDistToTurn < -50: if self.xTurnInfo < 0 or self.xDistToTurn < -50:
@ -1491,13 +1627,13 @@ class CarrotServ:
sdi_speed = 250 sdi_speed = 250
hda_active = False hda_active = False
### 과속카메라, 사고방지턱 ### 과속카메라, 사고방지턱
if self.xSpdDist > 0 and self.active_carrot > 0: if (self.xSpdDist > 0 or self.xSpdType == 100) and self.active_carrot > 0:
safe_sec = self.autoNaviSpeedBumpTime if self.xSpdType == 22 else self.autoNaviSpeedCtrlEnd safe_sec = self.autoNaviSpeedBumpTime if self.xSpdType == 22 else self.autoNaviSpeedCtrlEnd
decel = self.autoNaviSpeedDecelRate decel = self.autoNaviSpeedDecelRate
sdi_speed = min(sdi_speed, self.calculate_current_speed(self.xSpdDist, self.xSpdLimit, safe_sec, decel)) sdi_speed = min(sdi_speed, self.calculate_current_speed(self.xSpdDist, self.xSpdLimit, safe_sec, decel))
self.active_carrot = 5 if self.xSpdType == 22 else 3 self.active_carrot = 5 if self.xSpdType == 22 else 3
if self.xSpdType == 4: if self.xSpdType == 4 or (self.xSpdType == 100 and self.xSpdDist <= 0):
sdi_speed = self.xSpdLimit sdi_speed = self.xSpdLimit
self.active_carrot = 4 self.active_carrot = 4
elif CS is not None and CS.speedLimit > 0 and CS.speedLimitDistance > 0: elif CS is not None and CS.speedLimit > 0 and CS.speedLimitDistance > 0:
@ -1509,6 +1645,7 @@ class CarrotServ:
#self.active_carrot = 6 #self.active_carrot = 6
hda_active = True hda_active = True
#print(f"sdi_speed: {sdi_speed}, hda_active: {hda_active}, xSpdType: {self.xSpdType}, xSpdDist: {self.xSpdDist}, active_carrot: {self.active_carrot}, v_ego_kph: {v_ego_kph}, nRoadLimitSpeed: {self.nRoadLimitSpeed}")
### TBT 속도제어 ### TBT 속도제어
atc_desired, self.atcType, self.atcSpeed, self.atcDist = self.update_auto_turn(v_ego*3.6, sm, self.xTurnInfo, self.xDistToTurn, True) atc_desired, self.atcType, self.atcSpeed, self.atcDist = self.update_auto_turn(v_ego*3.6, sm, self.xTurnInfo, self.xDistToTurn, True)
atc_desired_next, _, _, _ = self.update_auto_turn(v_ego*3.6, sm, self.xTurnInfoNext, self.xDistToTurnNext, False) atc_desired_next, _, _, _ = self.update_auto_turn(v_ego*3.6, sm, self.xTurnInfoNext, self.xDistToTurnNext, False)
@ -1539,7 +1676,8 @@ class CarrotServ:
speed_n_sources = [ speed_n_sources = [
(atc_desired, "atc"), (atc_desired, "atc"),
(atc_desired_next, "atc2"), (atc_desired_next, "atc2"),
(sdi_speed, "hda" if hda_active else "bump" if self.xSpdType == 22 else "section" if self.xSpdType == 4 else "cam"), (sdi_speed, "hda" if hda_active else "bump" if self.xSpdType == 22 else "section" if self.xSpdType == 4 else "police" if self.xSpdType == 100 else "cam"),
(limit_speed, "road"),
] ]
if self.turnSpeedControlMode in [1,2]: if self.turnSpeedControlMode in [1,2]:
speed_n_sources.append((max(abs(vturn_speed), self.autoCurveSpeedLowerLimit), "vturn")) speed_n_sources.append((max(abs(vturn_speed), self.autoCurveSpeedLowerLimit), "vturn"))
@ -1557,7 +1695,7 @@ class CarrotServ:
if source != self.source_last: if source != self.source_last:
self.gas_override_speed = 0 self.gas_override_speed = 0
self.gas_pressed_state = CS.gasPressed self.gas_pressed_state = CS.gasPressed
if CS.vEgo < 0.1 or desired_speed > 150 or source in ["cam", "section"] or CS.brakePressed: if CS.vEgo < 0.1 or desired_speed > 150 or source in ["cam", "section", "police"] or CS.brakePressed or road_speed_limit_changed:
self.gas_override_speed = 0 self.gas_override_speed = 0
elif CS.gasPressed and not self.gas_pressed_state: elif CS.gasPressed and not self.gas_pressed_state:
self.gas_override_speed = max(v_ego_kph, self.gas_override_speed) self.gas_override_speed = max(v_ego_kph, self.gas_override_speed)
@ -1867,6 +2005,7 @@ def main():
carrot_man = CarrotMan() carrot_man = CarrotMan()
print(f"CarrotMan {carrot_man}") print(f"CarrotMan {carrot_man}")
threading.Thread(target=carrot_man.kisa_app_thread).start()
while True: while True:
try: try:
carrot_man.carrot_man_thread() carrot_man.carrot_man_thread()

View File

@ -5,10 +5,10 @@
"group": "조향일반", "group": "조향일반",
"name": "PathOffset", "name": "PathOffset",
"title": "차선치우침 좌우보정(0)", "title": "차선치우침 좌우보정(0)",
"descr": "(-)좌측,(+)우측", "descr": "LaneMode only: (-)좌측,(+)우측",
"egroup": "LAT", "egroup": "LAT",
"etitle": "PathOffset (0)", "etitle": "PathOffset (0)",
"edescr": "(-)Left,(+)Right", "edescr": "LaneMode only: (-)Left,(+)Right",
"min": -150, "min": -150,
"max": 150, "max": 150,
"default": 0, "default": 0,
@ -21,7 +21,7 @@
"descr": "0:LiveTorque, 1:CustomTorque", "descr": "0:LiveTorque, 1:CustomTorque",
"egroup": "LAT", "egroup": "LAT",
"etitle": "_LateralTorqueCustom(0)", "etitle": "_LateralTorqueCustom(0)",
"edescr": "", "edescr": "0:LiveToruque, 1:CustomTorque",
"min": 0, "min": 0,
"max": 1, "max": 1,
"default": 1, "default": 1,
@ -56,10 +56,10 @@
{ {
"group": "조향튜닝", "group": "조향튜닝",
"name": "LateralTorqueKpV", "name": "LateralTorqueKpV",
"title": "_LateralTorqueKpV*0.01(100)", "title": "_LateralTorqueKp*0.01(100)",
"descr": "", "descr": "",
"egroup": "LAT", "egroup": "LAT",
"etitle": "_LateralTorqueKpV*0.01(100)", "etitle": "_LateralTorqueKp*0.01(100)",
"edescr": "", "edescr": "",
"min": 0, "min": 0,
"max": 200, "max": 200,
@ -69,10 +69,10 @@
{ {
"group": "조향튜닝", "group": "조향튜닝",
"name": "LateralTorqueKiV", "name": "LateralTorqueKiV",
"title": "_LateralTorqueKiV*0.01(10)", "title": "_LateralTorqueKi*0.01(10)",
"descr": "", "descr": "",
"egroup": "LAT", "egroup": "LAT",
"etitle": "_LateralTorqueKiV*0.01(10)", "etitle": "_LateralTorqueKi*0.01(10)",
"edescr": "", "edescr": "",
"min": 0, "min": 0,
"max": 200, "max": 200,
@ -170,14 +170,40 @@
"default": 1, "default": 1,
"unit": 100 "unit": 100
}, },
{
"group": "조향튜닝",
"name": "LatMpcInputOffset",
"title": "*LATMPC.InputOffset(6)",
"descr": "LaneMode Mpc입력보상, 값이 크면 일찍커브에 진입함",
"egroup": "LAT",
"etitle": "*LATMPC.InputOffset(6)",
"edescr": "LaneMode MPC input compensation: higher value, earlier curve entry",
"min": 0,
"max": 20,
"default": 1,
"unit": 1
},
{
"group": "조향튜닝",
"name": "LatMpcOutputOffset",
"title": "*LATMPC.OutputOffset(5)",
"descr": "LaneMode Mpc지연보상, 값이 크면??",
"egroup": "LAT",
"etitle": "*LATMPC.OutputOffset(5)",
"edescr": "",
"min": 0,
"max": 20,
"default": 1,
"unit": 1
},
{ {
"group": "조향튜닝", "group": "조향튜닝",
"name": "CustomSteerMax", "name": "CustomSteerMax",
"title": "_CustomSteerMax(0)", "title": "_CustomSteerMax(0)",
"descr": "토크제어: 270,384,409", "descr": "최대조향토크: 270,384,409",
"egroup": "LAT", "egroup": "LAT",
"etitle": "_CustomSteerMax(0)", "etitle": "_CustomSteerMax(0)",
"edescr": "", "edescr": "MaxSteerTorque: 270, 384, 409",
"min": 0, "min": 0,
"max": 30000, "max": 30000,
"default": 0, "default": 0,
@ -242,7 +268,7 @@
"descr": "목표속도를 일시적으로 올림", "descr": "목표속도를 일시적으로 올림",
"egroup": "CRUISE", "egroup": "CRUISE",
"etitle": "CruiseEcoControl(2km/h)", "etitle": "CruiseEcoControl(2km/h)",
"edescr": "", "edescr": "Temporarily increases the target speed",
"min": 0, "min": 0,
"max": 10, "max": 10,
"default": 2, "default": 2,
@ -252,7 +278,7 @@
"group": "조향튜닝", "group": "조향튜닝",
"name": "CustomSR", "name": "CustomSR",
"title": "CustomSteerRatiox0.1(0)", "title": "CustomSteerRatiox0.1(0)",
"descr": "0: LiveSteerRatio사용, 단위:0.1", "descr": "0: LiveSteerRatio사용",
"egroup": "LAT", "egroup": "LAT",
"etitle": "CustomSteerRatiox0.1(0)", "etitle": "CustomSteerRatiox0.1(0)",
"edescr": "0: Use LiveSteerRatio", "edescr": "0: Use LiveSteerRatio",
@ -278,10 +304,10 @@
"group": "가속설정", "group": "가속설정",
"name": "CruiseMaxVals1", "name": "CruiseMaxVals1",
"title": "가속설정1:0km/h(160)", "title": "가속설정1:0km/h(160)",
"descr": "Normal mode only (x0.01m/s^2)", "descr": "",
"egroup": "ACCEL", "egroup": "ACCEL",
"etitle": "AccelSet1:0km/h(160)", "etitle": "AccelSet1:0km/h(160)",
"edescr": "Normal mode only (x0.01m/s^2)", "edescr": "",
"min": 1, "min": 1,
"max": 250, "max": 250,
"default": 160, "default": 160,
@ -291,10 +317,10 @@
"group": "가속설정", "group": "가속설정",
"name": "CruiseMaxVals2", "name": "CruiseMaxVals2",
"title": "가속설정2:40km/h(120)", "title": "가속설정2:40km/h(120)",
"descr": "Normal mode only (x0.01m/s^2)", "descr": "",
"egroup": "ACCEL", "egroup": "ACCEL",
"etitle": "AccelSet2:40km/h(120)", "etitle": "AccelSet2:40km/h(120)",
"edescr": "Normal mode only (x0.01m/s^2)", "edescr": "",
"min": 1, "min": 1,
"max": 250, "max": 250,
"default": 120, "default": 120,
@ -304,10 +330,10 @@
"group": "가속설정", "group": "가속설정",
"name": "CruiseMaxVals3", "name": "CruiseMaxVals3",
"title": "가속설정3:60km/h(100)", "title": "가속설정3:60km/h(100)",
"descr": "Normal mode only (x0.01m/s^2)", "descr": "",
"egroup": "ACCEL", "egroup": "ACCEL",
"etitle": "AccelSet3:60km/h(100)", "etitle": "AccelSet3:60km/h(100)",
"edescr": "Normal mode only (x0.01m/s^2)", "edescr": "",
"min": 1, "min": 1,
"max": 250, "max": 250,
"default": 100, "default": 100,
@ -317,10 +343,10 @@
"group": "가속설정", "group": "가속설정",
"name": "CruiseMaxVals4", "name": "CruiseMaxVals4",
"title": "가속설정4:80km/h(80)", "title": "가속설정4:80km/h(80)",
"descr": "Normal mode only (x0.01m/s^2)", "descr": "",
"egroup": "ACCEL", "egroup": "ACCEL",
"etitle": "AccelSet4:80km/h(80)", "etitle": "AccelSet4:80km/h(80)",
"edescr": "Normal mode only (x0.01m/s^2)", "edescr": "",
"min": 1, "min": 1,
"max": 250, "max": 250,
"default": 80, "default": 80,
@ -330,10 +356,10 @@
"group": "가속설정", "group": "가속설정",
"name": "CruiseMaxVals5", "name": "CruiseMaxVals5",
"title": "가속설정5:110km/h(70)", "title": "가속설정5:110km/h(70)",
"descr": "Normal mode only (x0.01m/s^2)", "descr": "",
"egroup": "ACCEL", "egroup": "ACCEL",
"etitle": "AccelSet5:110km/h(70)", "etitle": "AccelSet5:110km/h(70)",
"edescr": "Normal mode only (x0.01m/s^2)", "edescr": "",
"min": 1, "min": 1,
"max": 250, "max": 250,
"default": 70, "default": 70,
@ -343,10 +369,10 @@
"group": "가속설정", "group": "가속설정",
"name": "CruiseMaxVals6", "name": "CruiseMaxVals6",
"title": "가속설정6:140km/h(60)", "title": "가속설정6:140km/h(60)",
"descr": "Normal mode only (x0.01m/s^2)", "descr": "",
"egroup": "ACCEL", "egroup": "ACCEL",
"etitle": "AccelSet6:140km/h(60)", "etitle": "AccelSet6:140km/h(60)",
"edescr": "(x0.01m/s^2)", "edescr": "",
"min": 1, "min": 1,
"max": 250, "max": 250,
"default": 60, "default": 60,
@ -372,7 +398,7 @@
"descr": "값이 크면 전방차량의 가속도변화율에 민감하게 반응", "descr": "값이 크면 전방차량의 가속도변화율에 민감하게 반응",
"egroup": "LONG", "egroup": "LONG",
"etitle": "JerkLeadFactor(0)", "etitle": "JerkLeadFactor(0)",
"edescr": "", "edescr": "Higher value makes more sensitive to lead jerk",
"min": 0, "min": 0,
"max": 100, "max": 100,
"default": 0, "default": 0,
@ -382,10 +408,10 @@
"group": "주행튜닝", "group": "주행튜닝",
"name": "LongTuningKpV", "name": "LongTuningKpV",
"title": "Long KpV(100)x0.01", "title": "Long KpV(100)x0.01",
"descr": "HKG: AccelPid:0, VelocityPid:100", "descr": "Hyundai: 100으로 설정",
"egroup": "LONG", "egroup": "LONG",
"etitle": "Long KpV(100)x0.01", "etitle": "Long KpV(100)x0.01",
"edescr": "HKG: AccelPid:0, VelocityPid:100", "edescr": "Hyundai: 100",
"min": 0, "min": 0,
"max": 200, "max": 200,
"default": 100, "default": 100,
@ -395,10 +421,10 @@
"group": "주행튜닝", "group": "주행튜닝",
"name": "LongTuningKf", "name": "LongTuningKf",
"title": "Long Kf(100)x0.01", "title": "Long Kf(100)x0.01",
"descr": "", "descr": "Hyundai: 100",
"egroup": "LONG", "egroup": "LONG",
"etitle": "Long Kf(100)x0.01", "etitle": "Long Kf(100)x0.01",
"edescr": "", "edescr": "Hyundai: 100",
"min": 0, "min": 0,
"max": 200, "max": 200,
"default": 0, "default": 0,
@ -408,10 +434,10 @@
"group": "주행튜닝", "group": "주행튜닝",
"name": "LongTuningKiV", "name": "LongTuningKiV",
"title": "Long KiV(0)x0.01", "title": "Long KiV(0)x0.01",
"descr": "", "descr": "Hyundai: 0",
"egroup": "LONG", "egroup": "LONG",
"etitle": "Long KiV(0)x0.01", "etitle": "Long KiV(0)x0.01",
"edescr": "", "edescr": "Hyundai: 0",
"min": 0, "min": 0,
"max": 2000, "max": 2000,
"default": 0, "default": 0,
@ -421,10 +447,10 @@
"group": "주행튜닝", "group": "주행튜닝",
"name": "LongActuatorDelay", "name": "LongActuatorDelay",
"title": "LongActuatorDelay(20)x0.01", "title": "LongActuatorDelay(20)x0.01",
"descr": "", "descr": "Hyundai: 20",
"egroup": "LONG", "egroup": "LONG",
"etitle": "LongActuatorDelay(20)x0.01", "etitle": "LongActuatorDelay(20)x0.01",
"edescr": "", "edescr": "Hyundai: 20",
"min": 0, "min": 0,
"max": 200, "max": 200,
"default": 20, "default": 20,
@ -437,7 +463,7 @@
"descr": "값을 올리면 늦게 출발함, 너무낮추면 추돌위험이 있을수 있음.", "descr": "값을 올리면 늦게 출발함, 너무낮추면 추돌위험이 있을수 있음.",
"egroup": "LONG", "egroup": "LONG",
"etitle": "VEgoStopping(50)x0.01", "etitle": "VEgoStopping(50)x0.01",
"edescr": "", "edescr": "Higher value: later start; too low: collision risk",
"min": 1, "min": 1,
"max": 100, "max": 100,
"default": 50, "default": 50,
@ -450,7 +476,7 @@
"descr": "값이 낮아지면 선행차량에 대한 반응이 빨라짐.", "descr": "값이 낮아지면 선행차량에 대한 반응이 빨라짐.",
"egroup": "LONG", "egroup": "LONG",
"etitle": "Radar reaction factor (100)%", "etitle": "Radar reaction factor (100)%",
"edescr": "", "edescr": "Lower value: faster response to lead car",
"min": 0, "min": 0,
"max": 200, "max": 200,
"default": 100, "default": 100,
@ -489,7 +515,7 @@
"descr": "0:사용안함,1:차선변경, 2:차선변경+속도, 3:속도", "descr": "0:사용안함,1:차선변경, 2:차선변경+속도, 3:속도",
"egroup": "LATSET", "egroup": "LATSET",
"etitle": "ATC: AutoTurnControl", "etitle": "ATC: AutoTurnControl",
"edescr": "0: Not used, 1:laneChange, 2:laneChange+speed, 3:speed", "edescr": "(TMAP)0: Not used, 1:laneChange, 2:laneChange+speed, 3:speed",
"min": 0, "min": 0,
"max": 3, "max": 3,
"default": 0, "default": 0,
@ -502,7 +528,7 @@
"descr": "0:사용안함, 턴시 적용속도", "descr": "0:사용안함, 턴시 적용속도",
"egroup": "LATSET", "egroup": "LATSET",
"etitle": "ATC: Turn Speed(20)", "etitle": "ATC: Turn Speed(20)",
"edescr": "0: Not used, Turn Speed", "edescr": "(TMAP)0: Not used, Turn Speed",
"min": 0, "min": 0,
"max": 100, "max": 100,
"default": 20, "default": 20,
@ -515,7 +541,7 @@
"descr": "NOO완료 시간거리(속도*시간)", "descr": "NOO완료 시간거리(속도*시간)",
"egroup": "LATSET", "egroup": "LATSET",
"etitle": "ATC: Speed Ctrl left Time(3)", "etitle": "ATC: Speed Ctrl left Time(3)",
"edescr": "", "edescr": "(TMAP)",
"min": 0, "min": 0,
"max": 30, "max": 30,
"default": 6, "default": 6,
@ -528,7 +554,7 @@
"descr": "ATC 작동시 자동맵전환", "descr": "ATC 작동시 자동맵전환",
"egroup": "LATSET", "egroup": "LATSET",
"etitle": "ATC Helper Map display(0)", "etitle": "ATC Helper Map display(0)",
"edescr": "", "edescr": "(TMAP)",
"min": 0, "min": 0,
"max": 1, "max": 1,
"default": 0, "default": 0,
@ -538,12 +564,12 @@
"group": "버튼설정", "group": "버튼설정",
"name": "CruiseButtonMode", "name": "CruiseButtonMode",
"title": "크루즈버튼작동모드(0)", "title": "크루즈버튼작동모드(0)",
"descr": "0:일반,1:사용자1,2:사용자2", "descr": "0:일반,1:사용자1,2:사용자2,3:사용자3",
"egroup": "BUTN", "egroup": "BUTN",
"etitle": "Cruise Button Mode(0)", "etitle": "Cruise Button Mode(0)",
"edescr": "0:General,1:User1,2:User2", "edescr": "0:General,1:User1,2:User2,3:User3",
"min": 0, "min": 0,
"max": 2, "max": 3,
"default": 0, "default": 0,
"unit": 1 "unit": 1
}, },
@ -612,6 +638,71 @@
"default": 10, "default": 10,
"unit": 1 "unit": 1
}, },
{
"group": "버튼설정",
"name": "CruiseSpeed1",
"title": "크루즈속도1(30)",
"descr": "버튼모드3, 단계별속도",
"egroup": "BUTN",
"etitle": "Cruise Speed1(30)",
"edescr": "CruiseButtonMode2, prefer speed",
"min": 1,
"max": 160,
"default": 10,
"unit": 10
},
{
"group": "버튼설정",
"name": "CruiseSpeed2",
"title": "크루즈속도2(50)",
"descr": "버튼모드3, 단계별속도",
"egroup": "BUTN",
"etitle": "Cruise Speed2(50)",
"edescr": "CruiseButtonMode2, prefer speed",
"min": 1,
"max": 160,
"default": 10,
"unit": 10
},
{
"group": "버튼설정",
"name": "CruiseSpeed3",
"title": "크루즈속도3(80)",
"descr": "버튼모드3, 단계별속도",
"egroup": "BUTN",
"etitle": "Cruise Speed3(80)",
"edescr": "CruiseButtonMode2, prefer speed",
"min": 1,
"max": 160,
"default": 10,
"unit": 10
},
{
"group": "버튼설정",
"name": "CruiseSpeed4",
"title": "크루즈속도4(110)",
"descr": "버튼모드3, 단계별속도",
"egroup": "BUTN",
"etitle": "Cruise Speed4(110)",
"edescr": "CruiseButtonMode2, prefer speed",
"min": 1,
"max": 160,
"default": 10,
"unit": 10
},
{
"group": "버튼설정",
"name": "CruiseSpeed5",
"title": "크루즈속도5(130)",
"descr": "버튼모드3, 단계별속도",
"egroup": "BUTN",
"etitle": "Cruise Speed5(130)",
"edescr": "CruiseButtonMode2, prefer speed",
"min": 1,
"max": 160,
"default": 10,
"unit": 10
},
{ {
"group": "버튼설정", "group": "버튼설정",
"name": "PaddleMode", "name": "PaddleMode",
@ -632,7 +723,7 @@
"descr": "1:SOFTHOLD, Auto Cruise, 2:SoftHold오류시", "descr": "1:SOFTHOLD, Auto Cruise, 2:SoftHold오류시",
"egroup": "START", "egroup": "START",
"etitle": "Auto Cruise control(HKG only)", "etitle": "Auto Cruise control(HKG only)",
"edescr": "Softhold, Auto Cruise ON/OFF control", "edescr": "Softhold, Auto Cruise ON/OFF control, 2:if softhold error",
"min": 0, "min": 0,
"max": 3, "max": 3,
"default": 0, "default": 0,
@ -641,11 +732,11 @@
{ {
"group": "시작", "group": "시작",
"name": "AutoGasTokSpeed", "name": "AutoGasTokSpeed",
"title": "오토크루즈: 엑셀톡 속도", "title": "오토크루즈: 엑셀톡 시작속도",
"descr": "해당속도 이상에서만 작동함.", "descr": "해당속도 이상에서만 작동함.",
"egroup": "START", "egroup": "START",
"etitle": "Auto Cruise: Gas Tok speed", "etitle": "Auto Cruise: Gas Tok enable speed",
"edescr": "", "edescr": "Gas Tok(Gas tab): enable speed",
"min": 0, "min": 0,
"max": 200, "max": 200,
"default": 0, "default": 0,
@ -707,10 +798,10 @@
"group": "시작", "group": "시작",
"name": "DisableMinSteerSpeed", "name": "DisableMinSteerSpeed",
"title": "저속조향제한해제", "title": "저속조향제한해제",
"descr": "저속조향이 안되나, SMDPS장착차량", "descr": "SMDPS장착차량: 1",
"egroup": "START", "egroup": "START",
"etitle": "DisableMinSteerSpeed", "etitle": "DisableMinSteerSpeed",
"edescr": "", "edescr": "smdps equiped: 1",
"min": 0, "min": 0,
"max": 1, "max": 1,
"default": 0, "default": 0,
@ -788,7 +879,7 @@
"descr": "전방차량에 따라 자동속도증가. 로드스피드*비율 까지 자동속도올림.", "descr": "전방차량에 따라 자동속도증가. 로드스피드*비율 까지 자동속도올림.",
"egroup": "CRUISE", "egroup": "CRUISE",
"etitle": "AutoSpeedUpx:(100)%", "etitle": "AutoSpeedUpx:(100)%",
"edescr": "", "edescr": "Automatically increases speed on lead car, up to (road speed x ratio)",
"min": 0, "min": 0,
"max": 200, "max": 200,
"default": 0, "default": 0,
@ -906,7 +997,7 @@
"descr": "0:안함,1:표시함,2:상대위치,3:정지차량", "descr": "0:안함,1:표시함,2:상대위치,3:정지차량",
"egroup": "DISP", "egroup": "DISP",
"etitle": "Show Radar Info", "etitle": "Show Radar Info",
"edescr": "", "edescr": "0:None,1:display,2:+relative pos, 3:stopped obstacle",
"min": 0, "min": 0,
"max": 3, "max": 3,
"default": 0, "default": 0,
@ -919,7 +1010,7 @@
"descr": "0:안함,1:표시함", "descr": "0:안함,1:표시함",
"egroup": "DISP", "egroup": "DISP",
"etitle": "Show Route Info", "etitle": "Show Route Info",
"edescr": "", "edescr": "(TMAP)",
"min": 0, "min": 0,
"max": 1, "max": 1,
"default": 0, "default": 0,
@ -932,7 +1023,7 @@
"descr": "0:일반,1,2:사각,3,4:^^,5,6:사각,7,8:^^,9,10,11:smooth^^,12:smooth2^^,13:3줄,14:2줄,15:1줄", "descr": "0:일반,1,2:사각,3,4:^^,5,6:사각,7,8:^^,9,10,11:smooth^^,12:smooth2^^,13:3줄,14:2줄,15:1줄",
"egroup": "DISP", "egroup": "DISP",
"etitle": "Show Path Mode:LaneLess(9)", "etitle": "Show Path Mode:LaneLess(9)",
"edescr": "", "edescr": "0:stock,1,2:REC,3,4:^^,5,6:REC,7,8:^^,9,10,11:smooth^^,12:smooth2^^,13:3lines,14:2lines,15:1lines",
"min": 0, "min": 0,
"max": 15, "max": 15,
"default": 9, "default": 9,
@ -945,7 +1036,7 @@
"descr": "(+10:띠)0:빨,1:주,2:노,3:초,4:파,5:남,6:보,7:고,8:흰,9:검", "descr": "(+10:띠)0:빨,1:주,2:노,3:초,4:파,5:남,6:보,7:고,8:흰,9:검",
"egroup": "DISP", "egroup": "DISP",
"etitle": "Show Path Color:LaneLess(12)", "etitle": "Show Path Color:LaneLess(12)",
"edescr": "", "edescr": "(+10:stroke)0(R),1(O),2(Y),3(B),5(N),6(V),7(K),8(W),9(B)",
"min": 0, "min": 0,
"max": 19, "max": 19,
"default": 12, "default": 12,
@ -958,7 +1049,7 @@
"descr": "0:일반,1,2:사각,3,4:^^,5,6:사각,7,8:^^,9,10,11:smooth^^,12:smooth2^^,13:3줄,14:2줄,15:1줄", "descr": "0:일반,1,2:사각,3,4:^^,5,6:사각,7,8:^^,9,10,11:smooth^^,12:smooth2^^,13:3줄,14:2줄,15:1줄",
"egroup": "DISP", "egroup": "DISP",
"etitle": "Show Path Mode:CruiseOFF(9)", "etitle": "Show Path Mode:CruiseOFF(9)",
"edescr": "", "edescr": "0:stock,1,2:REC,3,4:^^,5,6:REC,7,8:^^,9,10,11:smooth^^,12:smooth2^^,13:3lines,14:2lines,15:1lines",
"min": 0, "min": 0,
"max": 15, "max": 15,
"default": 9, "default": 9,
@ -971,7 +1062,7 @@
"descr": "(+10:띠)0:빨,1:주,2:노,3:초,4:파,5:남,6:보,7:고,8:흰,9:검", "descr": "(+10:띠)0:빨,1:주,2:노,3:초,4:파,5:남,6:보,7:고,8:흰,9:검",
"egroup": "DISP", "egroup": "DISP",
"etitle": "Show Path Color:CruiseOFF(1)", "etitle": "Show Path Color:CruiseOFF(1)",
"edescr": "", "edescr": "(+10:stroke)0(R),1(O),2(Y),3(B),5(N),6(V),7(K),8(W),9(B)",
"min": 0, "min": 0,
"max": 19, "max": 19,
"default": 1, "default": 1,
@ -984,7 +1075,7 @@
"descr": "0:일반,1,2:사각,3,4:^^,5,6:사각,7,8:^^,9,10,11:smooth^^,12:smooth2^^,13:3줄,14:2줄,15:1줄", "descr": "0:일반,1,2:사각,3,4:^^,5,6:사각,7,8:^^,9,10,11:smooth^^,12:smooth2^^,13:3줄,14:2줄,15:1줄",
"egroup": "DISP", "egroup": "DISP",
"etitle": "Show Path Mode:LaneMode(11)", "etitle": "Show Path Mode:LaneMode(11)",
"edescr": "", "edescr": "0:stock,1,2:REC,3,4:^^,5,6:REC,7,8:^^,9,10,11:smooth^^,12:smooth2^^,13:3lines,14:2lines,15:1lines",
"min": 0, "min": 0,
"max": 15, "max": 15,
"default": 11, "default": 11,
@ -997,7 +1088,7 @@
"descr": "(+10:띠)0:빨,1:주,2:노,3:초,4:파,5:남,6:보,7:고,8:흰,9:검", "descr": "(+10:띠)0:빨,1:주,2:노,3:초,4:파,5:남,6:보,7:고,8:흰,9:검",
"egroup": "DISP", "egroup": "DISP",
"etitle": "Show Path Color:LaneMode(3)", "etitle": "Show Path Color:LaneMode(3)",
"edescr": "", "edescr": "(+10:stroke)0(R),1(O),2(Y),3(B),5(N),6(V),7(K),8(W),9(B)",
"min": 0, "min": 0,
"max": 19, "max": 19,
"default": 3, "default": 3,
@ -1023,7 +1114,7 @@
"descr": "레인(차선)모드 사용하면 기존의 조향제어(lat_mpc)를 사용합니다.", "descr": "레인(차선)모드 사용하면 기존의 조향제어(lat_mpc)를 사용합니다.",
"egroup": "LAT", "egroup": "LAT",
"etitle": "Laneline: Speed(0)", "etitle": "Laneline: Speed(0)",
"edescr": "Lainline mode, lat_mpc control used", "edescr": "Lainline mode speed, lat_mpc control used",
"min": 0, "min": 0,
"max": 200, "max": 200,
"default": 0, "default": 0,
@ -1062,12 +1153,25 @@
"descr": "0: 즉시 차선변경, 1: 토크필요, -1:자동차선변경사용안함", "descr": "0: 즉시 차선변경, 1: 토크필요, -1:자동차선변경사용안함",
"egroup": "LAT", "egroup": "LAT",
"etitle": "LaneChange use steering torque", "etitle": "LaneChange use steering torque",
"edescr": "1: need torque", "edescr": "0:immediate, 1: need torque(nudge), -1: auto lane change off",
"min": -1, "min": -1,
"max": 1, "max": 1,
"default": 0, "default": 0,
"unit": 1 "unit": 1
}, },
{
"group": "조향일반",
"name": "LaneChangeDelay",
"title": "차선변경 지연x0.1s(0)",
"descr": "",
"egroup": "LAT",
"etitle": "LaneChange delayx0.1s(0)",
"edescr": "",
"min": 0,
"max": 100,
"default": 0,
"unit": 10
},
{ {
"group": "조향일반", "group": "조향일반",
"name": "LaneChangeBsd", "name": "LaneChangeBsd",
@ -1100,7 +1204,7 @@
"title": "MaxAngleFrames(89)", "title": "MaxAngleFrames(89)",
"descr": "89:기본값", "descr": "89:기본값",
"egroup": "START", "egroup": "START",
"etitle": "MaxAngleFrames(1)", "etitle": "MaxAngleFrames(89)",
"edescr": "", "edescr": "",
"min": 80, "min": 80,
"max": 100, "max": 100,
@ -1127,7 +1231,7 @@
"descr": "1: HDA2 강제인식, 2: HDA2+BSM", "descr": "1: HDA2 강제인식, 2: HDA2+BSM",
"egroup": "START", "egroup": "START",
"etitle": "CANFD HDA2(0)", "etitle": "CANFD HDA2(0)",
"edescr": "", "edescr": "0:HDA1, 1: HDA2, 2: HDA2+BSM",
"min": 0, "min": 0,
"max": 2, "max": 2,
"default": 0, "default": 0,
@ -1361,7 +1465,7 @@
"descr": "감속종료시점을 설정합니다.", "descr": "감속종료시점을 설정합니다.",
"egroup": "SPEED", "egroup": "SPEED",
"etitle": "NaviSpeedEndingPoint(6s)", "etitle": "NaviSpeedEndingPoint(6s)",
"edescr": "Deceleration completion point", "edescr": "Time until decel completes, based on speed x time",
"min": 3, "min": 3,
"max": 20, "max": 20,
"default": 6, "default": 6,
@ -1374,12 +1478,25 @@
"descr": "0:감속안함,1:과속카메라,2:+사고방지턱,3:+이동식카메라", "descr": "0:감속안함,1:과속카메라,2:+사고방지턱,3:+이동식카메라",
"egroup": "SPEED", "egroup": "SPEED",
"etitle": "NaviSpeedControlMode(2)", "etitle": "NaviSpeedControlMode(2)",
"edescr": "", "edescr": "0:Not used, 1:Speed cam, 2:+speed bump, 3:+mobile speed cam",
"min": 0, "min": 0,
"max": 3, "max": 3,
"default": 2, "default": 2,
"unit": 1 "unit": 1
}, },
{
"group": "감속제어",
"name": "AutoRoadSpeedLimitOffset",
"title": "도로제한속도맞춤(-1)",
"descr": "-1:안함, 도로제한속도 + 설정값",
"egroup": "SPEED",
"etitle": "RoadSpeedLimitOffset(-1)",
"edescr": "-1:NotUsed, RoadLimitSpeed+Offset",
"min": -1,
"max": 100,
"default": -1,
"unit": 1
},
{ {
"group": "감속제어", "group": "감속제어",
"name": "AutoNaviSpeedBumpTime", "name": "AutoNaviSpeedBumpTime",
@ -1413,7 +1530,7 @@
"descr": "낮으면 멀리서부터 감속함", "descr": "낮으면 멀리서부터 감속함",
"egroup": "SPEED", "egroup": "SPEED",
"etitle": "NaviSpeedDecelRate 0.01m/s^2x(200)", "etitle": "NaviSpeedDecelRate 0.01m/s^2x(200)",
"edescr": "", "edescr": "Lower value deceleration starts earlier",
"min": 50, "min": 50,
"max": 300, "max": 300,
"default": 200, "default": 200,
@ -1426,7 +1543,7 @@
"descr": "0: 알림없음, 1: 턴지점+속도, 2: 턴지점+속도+방지턱", "descr": "0: 알림없음, 1: 턴지점+속도, 2: 턴지점+속도+방지턱",
"egroup": "SPEED", "egroup": "SPEED",
"etitle": "NaviCountDownMode", "etitle": "NaviCountDownMode",
"edescr": "", "edescr": "0:not used, 1: turn point + speed, 2:+speed bump",
"min": 0, "min": 0,
"max": 2, "max": 2,
"default": 2, "default": 2,
@ -1439,7 +1556,7 @@
"descr": "0: 속도제어안함,1:비젼,2:비젼+경로(TBT),3:경로(항상)", "descr": "0: 속도제어안함,1:비젼,2:비젼+경로(TBT),3:경로(항상)",
"egroup": "SPEED", "egroup": "SPEED",
"etitle": "TurnSpeedControlMode", "etitle": "TurnSpeedControlMode",
"edescr": "", "edescr": "0:not used, 1:vision turn, 2:+route, 3:route(allways)",
"min": 0, "min": 0,
"max": 3, "max": 3,
"default": 1, "default": 1,
@ -1452,7 +1569,7 @@
"descr": "작으면 속도가 줄어듬", "descr": "작으면 속도가 줄어듬",
"egroup": "SPEED", "egroup": "SPEED",
"etitle": "MapTurnSpeedFactor", "etitle": "MapTurnSpeedFactor",
"edescr": "", "edescr": "lower value, slower speed",
"min": 50, "min": 50,
"max": 300, "max": 300,
"default": 100, "default": 100,
@ -1465,7 +1582,7 @@
"descr": "", "descr": "",
"egroup": "SPEED", "egroup": "SPEED",
"etitle": "NaviSpeedLimitRatio(105)%", "etitle": "NaviSpeedLimitRatio(105)%",
"edescr": "", "edescr": "speed(roadlimitspeed) apply ratio",
"min": 80, "min": 80,
"max": 120, "max": 120,
"default": 105, "default": 105,

View File

@ -136,7 +136,7 @@ class Controls:
curve_speed_abs > self.params.get_int("UseLaneLineCurveSpeed")) curve_speed_abs > self.params.get_int("UseLaneLineCurveSpeed"))
lat_smooth_seconds = LAT_SMOOTH_SECONDS #self.params.get_float("SteerSmoothSec") * 0.01 lat_smooth_seconds = LAT_SMOOTH_SECONDS #self.params.get_float("SteerSmoothSec") * 0.01
steer_actuator_delay = self.params.get_float("SteerActuatorDelay") * 0.01 steer_actuator_delay = self.params.get_float("SteerActuatorDelay") * 0.01
mpc_delay_offset = 0.05 mpc_output_offset = self.params.get_float("LatMpcOutputOffset") * 0.01 # 0.05
if steer_actuator_delay == 0.0: if steer_actuator_delay == 0.0:
steer_actuator_delay = self.sm['liveDelay'].lateralDelay steer_actuator_delay = self.sm['liveDelay'].lateralDelay
@ -156,7 +156,7 @@ class Controls:
alpha = 1 - np.exp(-DT_CTRL / tau) if tau > 0 else 1 alpha = 1 - np.exp(-DT_CTRL / tau) if tau > 0 else 1
return alpha * val + (1 - alpha) * prev_val return alpha * val + (1 - alpha) * prev_val
curvature = get_lag_adjusted_curvature(self.CP, CS.vEgo, lat_plan.psis, lat_plan.curvatures, steer_actuator_delay + lat_smooth_seconds + mpc_delay_offset, lat_plan.distances) curvature = get_lag_adjusted_curvature(self.CP, CS.vEgo, lat_plan.psis, lat_plan.curvatures, steer_actuator_delay + lat_smooth_seconds + mpc_output_offset, lat_plan.distances)
new_desired_curvature = smooth_value(curvature, self.desired_curvature, lat_smooth_seconds) new_desired_curvature = smooth_value(curvature, self.desired_curvature, lat_smooth_seconds)
else: else:
@ -195,6 +195,13 @@ class Controls:
if len(angular_rate_value) > 2: if len(angular_rate_value) > 2:
CC.angularVelocity = angular_rate_value CC.angularVelocity = angular_rate_value
acceleration_value = list(self.sm['liveLocationKalman'].accelerationCalibrated.value)
if len(acceleration_value) > 2:
if abs(acceleration_value[0]) > 16.0:
print("Collision detected. disable openpilot, restart")
self.params.put_bool("OpenpilotEnabledToggle", False)
self.params.put_int("SoftRestartTriggered", 1)
CC.cruiseControl.override = CC.enabled and not CC.longActive and self.CP.openpilotLongitudinalControl CC.cruiseControl.override = CC.enabled and not CC.longActive and self.CP.openpilotLongitudinalControl
CC.cruiseControl.cancel = CS.cruiseState.enabled and (not CC.enabled or not self.CP.pcmCruise) CC.cruiseControl.cancel = CS.cruiseState.enabled and (not CC.enabled or not self.CP.pcmCruise)

View File

@ -125,10 +125,12 @@ class DesireHelper:
self.lane_available_last = False self.lane_available_last = False
self.edge_available_last = False self.edge_available_last = False
self.object_detected_count = 0 self.object_detected_count = 0
self.laneChangeNeedTorque = 0 self.laneChangeNeedTorque = 0
self.laneChangeBsd = 0 self.laneChangeBsd = 0
self.laneChangeDelay = 0
self.lane_change_delay = 0.0
self.driver_blinker_state = BLINKER_NONE self.driver_blinker_state = BLINKER_NONE
self.atc_type = "" self.atc_type = ""
@ -172,9 +174,11 @@ class DesireHelper:
if self.frame % 100 == 0: if self.frame % 100 == 0:
self.laneChangeNeedTorque = self.params.get_int("LaneChangeNeedTorque") self.laneChangeNeedTorque = self.params.get_int("LaneChangeNeedTorque")
self.laneChangeBsd = self.params.get_int("LaneChangeBsd") self.laneChangeBsd = self.params.get_int("LaneChangeBsd")
self.laneChangeDelay = self.params.get_float("LaneChangeDelay") * 0.1
self.frame += 1 self.frame += 1
self.carrot_lane_change_count = max(0, self.carrot_lane_change_count - 1) self.carrot_lane_change_count = max(0, self.carrot_lane_change_count - 1)
self.lane_change_delay = max(0, self.lane_change_delay - DT_MDL)
v_ego = carstate.vEgo v_ego = carstate.vEgo
below_lane_change_speed = v_ego < LANE_CHANGE_SPEED_MIN below_lane_change_speed = v_ego < LANE_CHANGE_SPEED_MIN
@ -290,6 +294,7 @@ class DesireHelper:
if self.lane_change_state == LaneChangeState.off and desire_enabled and not self.prev_desire_enabled and not below_lane_change_speed: if self.lane_change_state == LaneChangeState.off and desire_enabled and not self.prev_desire_enabled and not below_lane_change_speed:
self.lane_change_state = LaneChangeState.preLaneChange self.lane_change_state = LaneChangeState.preLaneChange
self.lane_change_ll_prob = 1.0 self.lane_change_ll_prob = 1.0
self.lane_change_delay = self.laneChangeDelay
# LaneChangeState.preLaneChange # LaneChangeState.preLaneChange
elif self.lane_change_state == LaneChangeState.preLaneChange: elif self.lane_change_state == LaneChangeState.preLaneChange:
@ -314,7 +319,7 @@ class DesireHelper:
self.lane_change_state = LaneChangeState.off self.lane_change_state = LaneChangeState.off
self.lane_change_direction = LaneChangeDirection.none self.lane_change_direction = LaneChangeDirection.none
else: else:
if lane_available: if lane_available and self.lane_change_delay == 0:
if self.blindspot_detected_counter > 0 and not ignore_bsd: # BSD검출시 if self.blindspot_detected_counter > 0 and not ignore_bsd: # BSD검출시
if torque_applied and not block_lanechange_bsd: if torque_applied and not block_lanechange_bsd:
self.lane_change_state = LaneChangeState.laneChangeStarting self.lane_change_state = LaneChangeState.laneChangeStarting

View File

@ -47,15 +47,19 @@ def get_lag_adjusted_curvature(CP, v_ego, psis, curvatures, steer_actuator_delay
distance = max(np.interp(delay, ModelConstants.T_IDXS[:CONTROL_N], distances), 0.001) distance = max(np.interp(delay, ModelConstants.T_IDXS[:CONTROL_N], distances), 0.001)
#average_curvature_desired = psi / (v_ego * delay) #average_curvature_desired = psi / (v_ego * delay)
# curve -> straight or reverse curve
if abs(current_curvature_desired) > 0.002 and \
(abs(future_curvature_desired) < 0.001 or np.sign(current_curvature_desired) != np.sign(future_curvature_desired)):
psis_damping = 0.2
else:
psis_damping = 1.0
psi *= psis_damping
average_curvature_desired = psi / distance average_curvature_desired = psi / distance
desired_curvature = 2 * average_curvature_desired - current_curvature_desired desired_curvature = 2 * average_curvature_desired - current_curvature_desired
#curv_now = np.mean([abs(c) for c in curvatures[0:3]])
#curv_future = np.mean([abs(c) for c in curvatures[9:13]])
if (abs(current_curvature_desired) - abs(future_curvature_desired)) > 0.002 and abs(future_curvature_desired) < 0.001:
desired_curvature = delayed_curvature_desired
# This is the "desired rate of the setpoint" not an actual desired rate # This is the "desired rate of the setpoint" not an actual desired rate
max_curvature_rate = MAX_LATERAL_JERK / (v_ego**2) # inexact calculation, check https://github.com/commaai/openpilot/pull/24755 max_curvature_rate = MAX_LATERAL_JERK / (v_ego**2) # inexact calculation, check https://github.com/commaai/openpilot/pull/24755
safe_desired_curvature = np.clip(desired_curvature, safe_desired_curvature = np.clip(desired_curvature,

View File

@ -230,7 +230,7 @@ class LanePlanner:
# self.d_prob, self.lanefull_mode, # self.d_prob, self.lanefull_mode,
# self.lane_width_left_filtered.x, self.lane_width, self.lane_width_right_filtered.x) # self.lane_width_left_filtered.x, self.lane_width, self.lane_width_right_filtered.x)
adjustLaneTime = 0.06 #self.params.get_int("AdjustLaneTime") * 0.01 adjustLaneTime = self.params.get_float("LatMpcInputOffset") * 0.01 # 0.06
laneline_active = False laneline_active = False
self.d_prob_count = self.d_prob_count + 1 if self.d_prob > 0.3 else 0 self.d_prob_count = self.d_prob_count + 1 if self.d_prob > 0.3 else 0
if self.lanefull_mode and self.d_prob_count > int(1 / DT_MDL): if self.lanefull_mode and self.d_prob_count > int(1 / DT_MDL):

View File

@ -1024,13 +1024,13 @@ protected:
nvgCircle(s->vg, bx, by, 110 / 2 * scale); nvgCircle(s->vg, bx, by, 110 / 2 * scale);
nvgFillColor(s->vg, COLOR_WHITE); nvgFillColor(s->vg, COLOR_WHITE);
nvgFill(s->vg); nvgFill(s->vg);
sprintf(str, "%d", xSpdLimit); sprintf(str, "%d", (int)(xSpdLimit * ((s->scene.is_metric)?1:KM_TO_MILE) + 0.5));
ui_draw_text(s, bx, by + 25 * scale - 6 * (1 - scale), str, 60 * scale, COLOR_BLACK, BOLD, 0.0f, 0.0f); ui_draw_text(s, bx, by + 25 * scale - 6 * (1 - scale), str, 60 * scale, COLOR_BLACK, BOLD, 0.0f, 0.0f);
} }
} }
} }
void drawTurnInfoHud(const UIState* s) { int drawTurnInfoHud(const UIState* s) {
if (s->fb_w < 1200) return; if (s->fb_w < 1200) return -1;
#ifdef __UI_TEST #ifdef __UI_TEST
active_carrot = 2; active_carrot = 2;
nGoPosDist = 500000; nGoPosDist = 500000;
@ -1054,7 +1054,7 @@ protected:
ui_fill_rect(s->vg, { tbt_x, 5, 790, s->fb_h - 15 }, COLOR_BLACK_ALPHA(120), 30, 2, &stroke_color); ui_fill_rect(s->vg, { tbt_x, 5, 790, s->fb_h - 15 }, COLOR_BLACK_ALPHA(120), 30, 2, &stroke_color);
} }
if (nGoPosDist > 0 && nGoPosTime > 0); if (nGoPosDist > 0 && nGoPosTime > 0);
else return; else return -1;
if (s->scene._current_carrot_display == 3); if (s->scene._current_carrot_display == 3);
else { else {
ui_fill_rect(s->vg, { tbt_x, tbt_y - 60, 790, 240 + 60 }, COLOR_BLACK_ALPHA(120), 30, 2, &stroke_color); ui_fill_rect(s->vg, { tbt_x, tbt_y - 60, 790, 240 + 60 }, COLOR_BLACK_ALPHA(120), 30, 2, &stroke_color);
@ -1116,14 +1116,15 @@ protected:
sprintf(str, "%.1fkm", nGoPosDist / 1000.); sprintf(str, "%.1fkm", nGoPosDist / 1000.);
ui_draw_text(s, tbt_x + 190 + 120, tbt_y + 130, str, 50, COLOR_WHITE, BOLD); ui_draw_text(s, tbt_x + 190 + 120, tbt_y + 130, str, 50, COLOR_WHITE, BOLD);
} }
return 0;
} }
public: public:
void draw(const UIState* s) { int draw(const UIState* s) {
nvgTextAlign(s->vg, NVG_ALIGN_CENTER | NVG_ALIGN_BOTTOM); nvgTextAlign(s->vg, NVG_ALIGN_CENTER | NVG_ALIGN_BOTTOM);
SubMaster& sm = *(s->sm); SubMaster& sm = *(s->sm);
if (!sm.alive("modelV2") || !sm.alive("carrotMan") || !sm.alive("carState")) { if (!sm.alive("modelV2") || !sm.alive("carrotMan") || !sm.alive("carState")) {
active_carrot = -1; active_carrot = -1;
return; return -1;
} }
const auto carrot_man = sm["carrotMan"].getCarrotMan(); const auto carrot_man = sm["carrotMan"].getCarrotMan();
@ -1172,7 +1173,7 @@ public:
#endif #endif
drawTurnInfo(s); drawTurnInfo(s);
drawSpeedLimit(s); drawSpeedLimit(s);
drawTurnInfoHud(s); return drawTurnInfoHud(s);
} }
}; };
@ -1607,7 +1608,7 @@ public:
if (!make_data(s)) return; if (!make_data(s)) return;
int temp = params.getInt("UseLaneLineSpeedApply"); int temp = params.getInt("UseLaneLineSpeedApply");
if (temp != use_lane_line_speed_apply) { if (temp != use_lane_line_speed_apply) {
ui_draw_text_a(s, 0, 0, (temp>0)?"LaneMode":"Laneless", 30, COLOR_GREEN, BOLD); ui_draw_text_a(s, 0, 0, (temp>0)?"LaneMode":"Laneless", 30, (temp>0)?COLOR_GREEN:COLOR_YELLOW, BOLD);
use_lane_line_speed_apply = temp; use_lane_line_speed_apply = temp;
} }
static bool forward = true; static bool forward = true;
@ -2104,13 +2105,16 @@ public:
int gap_last = 0; int gap_last = 0;
char gear_str_last[32] = ""; char gear_str_last[32] = "";
int blink_timer = 0; int blink_timer = 0;
int disp_timer = 0;
float cpuTemp = 0.0f; float cpuTemp = 0.0f;
float cpuUsage = 0.0f; float cpuUsage = 0.0f;
int memoryUsage = 0; int memoryUsage = 0;
float freeSpace = 0.0f; float freeSpace = 0.0f;
float voltage = 0.0f;
void drawHud(UIState* s) { void drawHud(UIState* s) {
int show_device_state = params.getInt("ShowDeviceState"); int show_device_state = params.getInt("ShowDeviceState");
blink_timer = (blink_timer + 1) % 16; blink_timer = (blink_timer + 1) % 16;
disp_timer = (disp_timer + 1) % 64;
nvgTextAlign(s->vg, NVG_ALIGN_CENTER | NVG_ALIGN_BOTTOM); nvgTextAlign(s->vg, NVG_ALIGN_CENTER | NVG_ALIGN_BOTTOM);
int x = 140;// 120; int x = 140;// 120;
@ -2161,7 +2165,7 @@ public:
char cruise_speed[32]; char cruise_speed[32];
int cruise_x = bx + 170; int cruise_x = bx + 170;
int cruise_y = by + 15; int cruise_y = by + 15;
if(longActive) sprintf(cruise_speed, "%.0f", (s->scene.is_metric)?v_cruise: v_cruise * KM_TO_MILE); if(longActive) sprintf(cruise_speed, "%d", (int)((s->scene.is_metric)?v_cruise: v_cruise * KM_TO_MILE + 0.5));
else sprintf(cruise_speed, "--"); else sprintf(cruise_speed, "--");
if (strcmp(cruise_speed_last, cruise_speed) != 0) { if (strcmp(cruise_speed_last, cruise_speed) != 0) {
strcpy(cruise_speed_last, cruise_speed); strcpy(cruise_speed_last, cruise_speed);
@ -2178,13 +2182,13 @@ public:
int apply_y = by - 50; int apply_y = by - 50;
if (apply_source.length()) { if (apply_source.length()) {
sprintf(apply_speed_str, "%.0f", (s->scene.is_metric)?apply_speed:apply_speed * KM_TO_MILE); sprintf(apply_speed_str, "%d", (int)((s->scene.is_metric)?apply_speed:apply_speed * KM_TO_MILE + 0.5));
textColor = COLOR_OCHRE; // apply speed가 작동되면... 색을 바꾸자. textColor = COLOR_OCHRE; // apply speed가 작동되면... 색을 바꾸자.
ui_draw_text(s, apply_x, apply_y, apply_speed_str, 50, textColor, BOLD, 1.0, 5.0, COLOR_BLACK, COLOR_BLACK); ui_draw_text(s, apply_x, apply_y, apply_speed_str, 50, textColor, BOLD, 1.0, 5.0, COLOR_BLACK, COLOR_BLACK);
ui_draw_text(s, apply_x, apply_y - 50, apply_source.toStdString().c_str(), 30, textColor, BOLD, 1.0, 5.0, COLOR_BLACK, COLOR_BLACK); ui_draw_text(s, apply_x, apply_y - 50, apply_source.toStdString().c_str(), 30, textColor, BOLD, 1.0, 5.0, COLOR_BLACK, COLOR_BLACK);
} }
else if(abs(cruiseTarget - v_cruise) > 0.5) { else if(abs(cruiseTarget - v_cruise) > 0.5) {
sprintf(apply_speed_str, "%.0f", (s->scene.is_metric)?cruiseTarget: cruiseTarget * KM_TO_MILE); sprintf(apply_speed_str, "%d", (int)((s->scene.is_metric)?cruiseTarget: cruiseTarget * KM_TO_MILE + 0.5));
ui_draw_text(s, apply_x, apply_y, apply_speed_str, 50, textColor, BOLD, 1.0, 5.0, COLOR_BLACK, COLOR_BLACK); ui_draw_text(s, apply_x, apply_y, apply_speed_str, 50, textColor, BOLD, 1.0, 5.0, COLOR_BLACK, COLOR_BLACK);
ui_draw_text(s, apply_x, apply_y - 50, "eco", 30, textColor, BOLD, 1.0, 5.0, COLOR_BLACK, COLOR_BLACK); ui_draw_text(s, apply_x, apply_y - 50, "eco", 30, textColor, BOLD, 1.0, 5.0, COLOR_BLACK, COLOR_BLACK);
} }
@ -2295,13 +2299,14 @@ public:
int disp_speed = 0; int disp_speed = 0;
NVGcolor limit_color = COLOR_GREEN_ALPHA(210); NVGcolor limit_color = COLOR_GREEN_ALPHA(210);
if (xSpdLimit > 0 && xSignType != 22) { if (xSpdLimit > 0 && xSignType != 22) {
disp_speed = xSpdLimit; disp_speed = (int)(xSpdLimit * ((s->scene.is_metric)?1:KM_TO_MILE) + 0.5);
limit_color = (blink_timer <= 8) ? COLOR_RED_ALPHA(210) : COLOR_YELLOW_ALPHA(210); limit_color = (blink_timer <= 8) ? COLOR_RED_ALPHA(210) : COLOR_YELLOW_ALPHA(210);
ui_draw_text(s, dx, dy-45, "CAM", 30, COLOR_WHITE, BOLD); ui_draw_text(s, dx, dy-45, "CAM", 30, COLOR_WHITE, BOLD);
} }
else { else {
disp_speed = nRoadLimitSpeed; disp_speed = nRoadLimitSpeed;
limit_color = (v_ego * 3.6 > nRoadLimitSpeed + 2) ? COLOR_RED_ALPHA(210) : COLOR_WHITE_ALPHA(210); disp_speed = (int)(disp_speed * ((s->scene.is_metric)?1.0:KM_TO_MILE) + 0.5);
limit_color = (v_ego * 3.6 > disp_speed + 2) ? COLOR_RED_ALPHA(210) : COLOR_WHITE_ALPHA(210);
ui_draw_text(s, dx, dy - 45, "LIMIT", 30, COLOR_WHITE, BOLD); ui_draw_text(s, dx, dy - 45, "LIMIT", 30, COLOR_WHITE, BOLD);
} }
@ -2326,10 +2331,18 @@ public:
ui_draw_text(s, dx, dy + 40, str, 40, COLOR_WHITE, BOLD); ui_draw_text(s, dx, dy + 40, str, 40, COLOR_WHITE, BOLD);
dx += 150; dx += 150;
ui_fill_rect(s->vg, { dx - 65, dy - 38, 130, 90 }, mode_color, 15, 2); if (disp_timer < 32) {
ui_draw_text(s, dx, dy-5, "DISK", 25, COLOR_WHITE, BOLD); ui_fill_rect(s->vg, { dx - 65, dy - 38, 130, 90 }, mode_color, 15, 2);
sprintf(str, "%.0f%%", 100 - freeSpace); ui_draw_text(s, dx, dy - 5, "DISK", 25, COLOR_WHITE, BOLD);
ui_draw_text(s, dx, dy + 40, str, 40, COLOR_WHITE, BOLD); sprintf(str, "%.0f%%", 100 - freeSpace);
ui_draw_text(s, dx, dy + 40, str, 40, COLOR_WHITE, BOLD);
}
else {
ui_fill_rect(s->vg, { dx - 65, dy - 38, 130, 90 }, mode_color, 15, 2);
ui_draw_text(s, dx, dy - 5, "VOLT", 25, COLOR_WHITE, BOLD);
sprintf(str, "%.1fV", voltage);
ui_draw_text(s, dx, dy + 40, str, 40, COLOR_WHITE, BOLD);
}
} }
} }
void drawDateTime(const UIState* s) { void drawDateTime(const UIState* s) {
@ -2446,6 +2459,27 @@ public:
ui_draw_text(s, bx - dw, by + 70, get_tpms_text(rl), 40, get_tpms_color(rl), BOLD); ui_draw_text(s, bx - dw, by + 70, get_tpms_text(rl), 40, get_tpms_color(rl), BOLD);
ui_draw_text(s, bx + dw, by + 70, get_tpms_text(rr), 40, get_tpms_color(rr), BOLD); ui_draw_text(s, bx + dw, by + 70, get_tpms_text(rr), 40, get_tpms_color(rr), BOLD);
} }
void drawTpms3(const UIState* s) {
nvgTextAlign(s->vg, NVG_ALIGN_CENTER | NVG_ALIGN_BOTTOM);
SubMaster& sm = *(s->sm);
auto car_state = sm["carState"].getCarState();
int bx = s->fb_w - 125;
int by = s->fb_h - 280 / 2 + 15;
auto tpms = car_state.getTpms();
float fl = tpms.getFl();
float fr = tpms.getFr();
float rl = tpms.getRl();
float rr = tpms.getRr();
#ifdef __UI_TEST
fl = fr = rl = rr = 29;
#endif
int dw = 80;
ui_draw_text(s, bx - dw, by - 55, get_tpms_text(fl), 40, get_tpms_color(fl), BOLD);
ui_draw_text(s, bx + dw, by - 55, get_tpms_text(fr), 40, get_tpms_color(fr), BOLD);
ui_draw_text(s, bx - dw, by + 70, get_tpms_text(rl), 40, get_tpms_color(rl), BOLD);
ui_draw_text(s, bx + dw, by + 70, get_tpms_text(rr), 40, get_tpms_color(rr), BOLD);
}
void makeDeviceInfo(const UIState* s) { void makeDeviceInfo(const UIState* s) {
SubMaster& sm = *(s->sm); SubMaster& sm = *(s->sm);
auto deviceState = sm["deviceState"].getDeviceState(); auto deviceState = sm["deviceState"].getDeviceState();
@ -2469,6 +2503,9 @@ public:
} }
if (cpu_size > 0) cpuUsage /= cpu_size; if (cpu_size > 0) cpuUsage /= cpu_size;
} }
auto peripheralState = sm["peripheralState"].getPeripheralState();
voltage = peripheralState.getVoltage() / 1000.0;
} }
void drawDeviceInfo(const UIState* s) { void drawDeviceInfo(const UIState* s) {
#ifdef WSL2 #ifdef WSL2
@ -2642,7 +2679,11 @@ void ui_draw(UIState *s, ModelRenderer* model_renderer, int w, int h) {
drawCarrot.drawDeviceInfo(s); drawCarrot.drawDeviceInfo(s);
drawCarrot.drawTpms2(s); drawCarrot.drawTpms2(s);
drawTurnInfo.draw(s); int draw_turn_info = drawTurnInfo.draw(s);
if (draw_turn_info < 0) {
drawCarrot.drawTpms3(s);
}
ui_draw_text_a2(s); ui_draw_text_a2(s);

View File

@ -696,6 +696,7 @@ CarrotPanel::CarrotPanel(QWidget* parent) : QWidget(parent) {
//latLongToggles->addItem(new CValueControl("StartAccelApply", "LONG: StartingAccel 2.0x(0)%", "정지->출발시 가속도의 가속율을 지정합니다 0: 사용안함.", "../assets/offroad/icon_road.png", 0, 100, 10)); //latLongToggles->addItem(new CValueControl("StartAccelApply", "LONG: StartingAccel 2.0x(0)%", "정지->출발시 가속도의 가속율을 지정합니다 0: 사용안함.", "../assets/offroad/icon_road.png", 0, 100, 10));
//latLongToggles->addItem(new CValueControl("StopAccelApply", "LONG: StoppingAccel -2.0x(0)%", "정지유지시 브레이크압을 조정합니다. 0: 사용안함. ", "../assets/offroad/icon_road.png", 0, 100, 10)); //latLongToggles->addItem(new CValueControl("StopAccelApply", "LONG: StoppingAccel -2.0x(0)%", "정지유지시 브레이크압을 조정합니다. 0: 사용안함. ", "../assets/offroad/icon_road.png", 0, 100, 10));
latLongToggles->addItem(new CValueControl("LaneChangeNeedTorque", "LaneChange need torque", "-1:Disable lanechange, 0: no need torque, 1:need torque", "../assets/offroad/icon_logic.png", -1, 1, 1)); latLongToggles->addItem(new CValueControl("LaneChangeNeedTorque", "LaneChange need torque", "-1:Disable lanechange, 0: no need torque, 1:need torque", "../assets/offroad/icon_logic.png", -1, 1, 1));
latLongToggles->addItem(new CValueControl("LaneChangeDelay", "LaneChange delay", "x0.1sec", "../assets/offroad/icon_logic.png", 0, 100, 5));
latLongToggles->addItem(new CValueControl("LaneChangeBsd", "LaneChange Bsd", "-1:ignore bsd, 0:BSD detect, 1: block steer torque", "../assets/offroad/icon_logic.png", -1, 1, 1)); latLongToggles->addItem(new CValueControl("LaneChangeBsd", "LaneChange Bsd", "-1:ignore bsd, 0:BSD detect, 1: block steer torque", "../assets/offroad/icon_logic.png", -1, 1, 1));
latLongToggles->addItem(new CValueControl("StoppingAccel", "LONG: StoppingStartAccelx0.01(-40)", "", "../assets/offroad/icon_logic.png", -100, 0, 5)); latLongToggles->addItem(new CValueControl("StoppingAccel", "LONG: StoppingStartAccelx0.01(-40)", "", "../assets/offroad/icon_logic.png", -100, 0, 5));
latLongToggles->addItem(new CValueControl("StopDistanceCarrot", "LONG: StopDistance (600)cm", "", "../assets/offroad/icon_logic.png", 300, 1000, 10)); latLongToggles->addItem(new CValueControl("StopDistanceCarrot", "LONG: StopDistance (600)cm", "", "../assets/offroad/icon_logic.png", 300, 1000, 10));
@ -836,6 +837,7 @@ CarrotPanel::CarrotPanel(QWidget* parent) : QWidget(parent) {
speedToggles->addItem(new CValueControl("AutoNaviSpeedSafetyFactor", "SpeedCameraSafetyFactor(105%)", "", "../assets/offroad/icon_road.png", 80, 120, 1)); speedToggles->addItem(new CValueControl("AutoNaviSpeedSafetyFactor", "SpeedCameraSafetyFactor(105%)", "", "../assets/offroad/icon_road.png", 80, 120, 1));
speedToggles->addItem(new CValueControl("AutoNaviSpeedBumpTime", "SpeedBumpTimeDistance(1s)", "", "../assets/offroad/icon_road.png", 1, 50, 1)); speedToggles->addItem(new CValueControl("AutoNaviSpeedBumpTime", "SpeedBumpTimeDistance(1s)", "", "../assets/offroad/icon_road.png", 1, 50, 1));
speedToggles->addItem(new CValueControl("AutoNaviSpeedBumpSpeed", "SpeedBumpSpeed(35Km/h)", "", "../assets/offroad/icon_road.png", 10, 100, 5)); speedToggles->addItem(new CValueControl("AutoNaviSpeedBumpSpeed", "SpeedBumpSpeed(35Km/h)", "", "../assets/offroad/icon_road.png", 10, 100, 5));
speedToggles->addItem(new CValueControl("AutoRoadSpeedLimitOffset", "RoadSpeedLimitOffset(-1)", "-1:NotUsed,RoadLimitSpeed+Offset", "../assets/offroad/icon_road.png", -1, 100, 1));
speedToggles->addItem(new CValueControl("AutoNaviCountDownMode", "NaviCountDown mode(2)", "0: off, 1:tbt+camera, 2:tbt+camera+bump", "../assets/offroad/icon_road.png", 0, 2, 1)); speedToggles->addItem(new CValueControl("AutoNaviCountDownMode", "NaviCountDown mode(2)", "0: off, 1:tbt+camera, 2:tbt+camera+bump", "../assets/offroad/icon_road.png", 0, 2, 1));
speedToggles->addItem(new CValueControl("TurnSpeedControlMode", "Turn Speed control mode(1)", "0: off, 1:vision, 2:vision+route, 3: route", "../assets/offroad/icon_road.png", 0, 3, 1)); speedToggles->addItem(new CValueControl("TurnSpeedControlMode", "Turn Speed control mode(1)", "0: off, 1:vision, 2:vision+route, 3: route", "../assets/offroad/icon_road.png", 0, 3, 1));
speedToggles->addItem(new CValueControl("MapTurnSpeedFactor", "Map TurnSpeed Factor(100)", "", "../assets/offroad/icon_map.png", 50, 300, 5)); speedToggles->addItem(new CValueControl("MapTurnSpeedFactor", "Map TurnSpeed Factor(100)", "", "../assets/offroad/icon_map.png", 50, 300, 5));

View File

@ -105,6 +105,7 @@ UIState::UIState(QObject *parent) : QObject(parent) {
"longitudinalPlan", "longitudinalPlan",
"carControl", "carrotMan", "liveTorqueParameters", "lateralPlan", "liveParameters", "carControl", "carrotMan", "liveTorqueParameters", "lateralPlan", "liveParameters",
"navRoute", "navInstruction", "navInstructionCarrot", "liveLocationKalman", "liveDelay", "navRoute", "navInstruction", "navInstructionCarrot", "liveLocationKalman", "liveDelay",
"peripheralState",
}); });
prime_state = new PrimeState(this); prime_state = new PrimeState(this);
language = QString::fromStdString(Params().get("LanguageSetting")); language = QString::fromStdString(Params().get("LanguageSetting"));

View File

@ -79,6 +79,7 @@ def get_default_params():
("AutoNaviSpeedBumpSpeed", "35"), ("AutoNaviSpeedBumpSpeed", "35"),
("AutoNaviSpeedSafetyFactor", "105"), ("AutoNaviSpeedSafetyFactor", "105"),
("AutoNaviSpeedDecelRate", "120"), ("AutoNaviSpeedDecelRate", "120"),
("AutoRoadSpeedLimitOffset", "-1"),
("AutoNaviCountDownMode", "2"), ("AutoNaviCountDownMode", "2"),
("TurnSpeedControlMode", "1"), ("TurnSpeedControlMode", "1"),
("MapTurnSpeedFactor", "90"), ("MapTurnSpeedFactor", "90"),
@ -91,6 +92,11 @@ def get_default_params():
("CruiseButtonTest2", "30"), ("CruiseButtonTest2", "30"),
("CruiseButtonTest3", "1"), ("CruiseButtonTest3", "1"),
("CruiseSpeedUnit", "10"), ("CruiseSpeedUnit", "10"),
("CruiseSpeed1", "30"),
("CruiseSpeed2", "50"),
("CruiseSpeed3", "80"),
("CruiseSpeed4", "110"),
("CruiseSpeed5", "130"),
("PaddleMode", "0"), ("PaddleMode", "0"),
("MyDrivingMode", "3"), ("MyDrivingMode", "3"),
("MyDrivingModeAuto", "0"), ("MyDrivingModeAuto", "0"),
@ -126,6 +132,7 @@ def get_default_params():
("UseLaneLineSpeedApply", "0"), ("UseLaneLineSpeedApply", "0"),
("AdjustLaneOffset", "0"), ("AdjustLaneOffset", "0"),
("LaneChangeNeedTorque", "0"), ("LaneChangeNeedTorque", "0"),
("LaneChangeDelay", "0"),
("LaneChangeBsd", "0"), ("LaneChangeBsd", "0"),
("MaxAngleFrames", "89"), ("MaxAngleFrames", "89"),
("LateralTorqueCustom", "0"), ("LateralTorqueCustom", "0"),
@ -140,6 +147,8 @@ def get_default_params():
("LatMpcAccelCost", "0"), ("LatMpcAccelCost", "0"),
("LatMpcJerkCost", "4"), ("LatMpcJerkCost", "4"),
("LatMpcSteeringRateCost", "700"), ("LatMpcSteeringRateCost", "700"),
("LatMpcInputOffset", "6"),
("LatMpcOutputOffset", "5"),
("CustomSteerMax", "0"), ("CustomSteerMax", "0"),
("CustomSteerDeltaUp", "0"), ("CustomSteerDeltaUp", "0"),
("CustomSteerDeltaDown", "0"), ("CustomSteerDeltaDown", "0"),