VegoStopping setting

Nav speed control mode...
fix. some
This commit is contained in:
ajouatom 2025-02-24 10:08:08 +09:00
parent 136ef70b3b
commit f2dcc4205d
10 changed files with 93 additions and 88 deletions

View File

@ -251,6 +251,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"GpsDelayTimeAdjust", PERSISTENT},
{"AutoTurnMapChange", PERSISTENT },
{"AutoNaviSpeedCtrlEnd", PERSISTENT},
{"AutoNaviSpeedCtrlMode", PERSISTENT},
{"AutoNaviSpeedBumpTime", PERSISTENT},
{"AutoNaviSpeedBumpSpeed", PERSISTENT},
{"AutoNaviSpeedDecelRate", PERSISTENT},
@ -283,7 +284,8 @@ std::unordered_map<std::string, uint32_t> keys = {
{"LongTuningKpV", PERSISTENT},
{"LongTuningKiV", PERSISTENT},
{"LongTuningKf", PERSISTENT},
{"LongActuatorDelay", PERSISTENT},
{"LongActuatorDelay", PERSISTENT },
{"VegoStopping", PERSISTENT },
{"RadarReactionFactor", PERSISTENT},
{"EnableRadarTracks", PERSISTENT},
{"EnableRadarTracksResult", PERSISTENT | CLEAR_ON_MANAGER_START},

View File

@ -182,7 +182,7 @@ class CarrotMan:
print("************************************************CarrotMan init************************************************")
self.params = Params()
self.params_memory = Params("/dev/shm/params")
self.sm = messaging.SubMaster(['deviceState', 'carState', 'controlsState', 'longitudinalPlan', 'modelV2', 'selfdriveState', 'carControl', 'navRouteNavd'])
self.sm = messaging.SubMaster(['deviceState', 'carState', 'controlsState', 'longitudinalPlan', 'modelV2', 'selfdriveState', 'carControl', 'navRouteNavd', 'liveLocationKalman'])
self.pm = messaging.PubMaster(['carrotMan', "navRoute", "navInstructionCarrot"])
self.carrot_serv = CarrotServ()
@ -895,7 +895,6 @@ class CarrotServ:
self.nPosAngle = 0.0
self.diff_angle_count = 0
self.last_update_gps_time = 0
self.last_calculate_gps_time = 0
self.bearing_offset = 0.0
self.bearing_measured = 0.0
@ -948,6 +947,7 @@ class CarrotServ:
self.autoNaviSpeedBumpSpeed = float(self.params.get_int("AutoNaviSpeedBumpSpeed"))
self.autoNaviSpeedBumpTime = float(self.params.get_int("AutoNaviSpeedBumpTime"))
self.autoNaviSpeedCtrlEnd = float(self.params.get_int("AutoNaviSpeedCtrlEnd"))
self.autoNaviSpeedCtrlMode = self.params.get_int("AutoNaviSpeedCtrlMode")
self.autoNaviSpeedSafetyFactor = float(self.params.get_int("AutoNaviSpeedSafetyFactor")) * 0.01
self.autoNaviSpeedDecelRate = float(self.params.get_int("AutoNaviSpeedDecelRate")) * 0.01
self.autoNaviCountDownMode = self.params.get_int("AutoNaviCountDownMode")
@ -1205,16 +1205,17 @@ class CarrotServ:
# 1: startOSEPS: 구간단속시작
# 2: inOSEPS: 구간단속중
# 3: endOSEPS: 구간단속종료
if self.nSdiType in [0,1,2,3,4,7,8, 75, 76] and self.nSdiSpeedLimit > 0:
# 0:감속안함,1:과속카메라,2:+사고방지턱,3:+이동식카메라
if self.nSdiType in [0,1,2,3,4,7,8, 75, 76] and self.nSdiSpeedLimit > 0 and self.autoNaviSpeedCtrlMode > 0:
self.xSpdLimit = self.nSdiSpeedLimit * self.autoNaviSpeedSafetyFactor
self.xSpdDist = self.nSdiDist
self.xSpdType = self.nSdiType
if self.nSdiBlockType in [2,3]:
self.xSpdDist = self.nSdiBlockDist
self.xSpdType = 4
elif self.nSdiType == 7: #이동식카메라
elif self.nSdiType == 7 and self.autoNaviSpeedCtrlMode < 3: #이동식카메라
self.xSpdLimit = self.xSpdDist = 0
elif (self.nSdiPlusType == 22 or self.nSdiType == 22) and self.roadcate > 1: # speed bump, roadcate:0,1: highway
elif (self.nSdiPlusType == 22 or self.nSdiType == 22) and self.roadcate > 1 and self.autoNaviSpeedCtrlMode >= 2: # speed bump, roadcate:0,1: highway
self.xSpdLimit = self.autoNaviSpeedBumpSpeed
self.xSpdDist = self.nSdiPlusDist if self.nSdiPlusType == 22 else self.nSdiDist
self.xSpdType = 22
@ -1224,22 +1225,30 @@ class CarrotServ:
self.xSpdDist = 0
def _update_gps(self, v_ego, sm):
if not sm.updated['carState'] or not sm.updated['carControl']:
llk = 'liveLocationKalman'
location = sm[llk]
#print(f"location = {sm.valid[llk]}, {sm.updated[llk]}, {sm.recv_frame[llk]}, {sm.recv_time[llk]}")
if not sm.updated['carState'] or not sm.updated['carControl'] or not sm.updated[llk]:
return self.nPosAngle
CS = sm['carState']
CC = sm['carControl']
if len(CC.orientationNED) == 3:
bearing = math.degrees(CC.orientationNED[2])
self.gps_valid = (location.status == log.LiveLocationKalman.Status.valid) and location.positionGeodetic.valid
now = time.monotonic()
if sm.valid[llk]:
bearing = math.degrees(location.calibratedOrientationNED.value[2])
else:
bearing = 0.0
return self.nPosAngle
if not self.gps_valid:
if self.params_memory.get("LastGPSPosition"):
self.gps_valid = True
bearing = self.nPosAngle
#print(f"gps_valid = {self.gps_valid}, bearing = {bearing:.1f}, pos = {location.positionGeodetic.value[0]:.6f}, {location.positionGeodetic.value[1]:.6f}")
if self.gps_valid: # liveLocationKalman일때는 정확하나, livePose일때는 불안정함.
self.bearing_offset = 0.0
if self.active_carrot <= 1:
self.vpPosPointLatNavi = location.positionGeodetic.value[0]
self.vpPosPointLonNavi = location.positionGeodetic.value[1]
self.last_calculate_gps_time = sm.recv_time[llk]
self.gpsDelayTimeAdjust = 0.0
else:
if abs(self.bearing_measured - bearing) < 0.1:
self.diff_angle_count += 1
@ -1255,10 +1264,14 @@ class CarrotServ:
bearing_calculated = (bearing + self.bearing_offset) % 360
now = time.monotonic()
dt = now - self.last_calculate_gps_time
#self.last_calculate_gps_time = now
self.vpPosPointLat, self.vpPosPointLon = self.estimate_position(float(self.vpPosPointLatNavi), float(self.vpPosPointLonNavi), v_ego, bearing_calculated, dt + self.gpsDelayTimeAdjust)
#print(f"dt = {dt:.1f}, {self.vpPosPointLatNavi}, {self.vpPosPointLonNavi}")
if dt > 5.0:
self.vpPosPointLat, self.vpPosPointLon = 0.0, 0.0
elif dt == 0:
self.vpPosPointLat, self.vpPosPointLon = self.vpPosPointLatNavi, self.vpPosPointLonNavi
else:
self.vpPosPointLat, self.vpPosPointLon = self.estimate_position(float(self.vpPosPointLatNavi), float(self.vpPosPointLonNavi), v_ego, bearing_calculated, dt + self.gpsDelayTimeAdjust)
#self.debugText = " {} {:.1f},{:.1f}={:.1f}+{:.1f}".format(self.active_sdi_count, self.nPosAngle, bearing_calculated, bearing, self.bearing_offset)
#print("nPosAngle = {:.1f},{:.1f} = {:.1f}+{:.1f}".format(self.nPosAngle, bearing_calculated, bearing, self.bearing_offset))
@ -1397,7 +1410,7 @@ class CarrotServ:
sdi_speed = 250
hda_active = False
### 과속카메라, 사고방지턱
### 과속카메라, 사고방지턱
if self.xSpdDist > 0 and self.active_carrot > 0:
safe_sec = self.autoNaviSpeedBumpTime if self.xSpdType == 22 else self.autoNaviSpeedCtrlEnd
decel = self.autoNaviSpeedDecelRate
@ -1510,7 +1523,6 @@ class CarrotServ:
self._update_cmd()
msg = messaging.new_message('carrotMan')
msg.valid = True
msg.carrotMan.activeCarrot = self.active_carrot

View File

@ -495,6 +495,19 @@
"default": 20,
"unit": 5
},
{
"group": "주행튜닝",
"name": "VegoStopping",
"title": "정지출발민감도(5)x0.01",
"descr": "값을 올리면 늦게 출발함, 너무낮추면 추돌위험이 있을수 있음.",
"egroup": "LONG",
"etitle": "VegoStopping(5)x0.01",
"edescr": "",
"min": 1,
"max": 10,
"default": 20,
"unit": 5
},
{
"group": "주행튜닝",
"name": "RadarReactionFactor",
@ -1367,6 +1380,19 @@
"default": 6,
"unit": 1
},
{
"group": "감속제어",
"name": "AutoNaviSpeedCtrlMode",
"title": "네비게이션감속모드(2)",
"descr": "0:감속안함,1:과속카메라,2:+사고방지턱,3:+이동식카메라",
"egroup": "SPEED",
"etitle": "NaviSpeedControlMode(2)",
"edescr": "",
"min": 0,
"max": 3,
"default": 2,
"unit": 1
},
{
"group": "감속제어",
"name": "AutoNaviSpeedBumpTime",

View File

@ -217,10 +217,11 @@ class LongitudinalPlanner:
longitudinalPlan.fcw = self.fcw
longitudinalActuatorDelay = Params().get_float("LongActuatorDelay")*0.01
vegoStopping = Params().get_float("VegoStopping") * 0.01
action_t = longitudinalActuatorDelay + DT_MDL
a_target, should_stop, v_target, j_target = get_accel_from_plan(longitudinalPlan.speeds, longitudinalPlan.accels, longitudinalPlan.jerks,
action_t=action_t, vEgoStopping=self.CP.vEgoStopping)
action_t=action_t, vEgoStopping=vegoStopping)
longitudinalPlan.aTarget = float(a_target)
longitudinalPlan.shouldStop = bool(should_stop)
longitudinalPlan.allowBrake = True

View File

@ -24,7 +24,7 @@ const int PIXELS_PER_TILE = 256;
const int MAP_OFFSET = 128;
const bool TEST_MODE = getenv("MAP_RENDER_TEST_MODE");
const int LLK_DECIMATION = TEST_MODE ? 1 : 10;
//const int LLK_DECIMATION = TEST_MODE ? 1 : 10;
float get_zoom_level_for_scale(float lat, float meters_per_pixel) {
float meters_per_tile = meters_per_pixel * PIXELS_PER_TILE;
@ -110,7 +110,7 @@ MapRenderer::MapRenderer(const QMapLibre::Settings &settings, bool online) : m_s
vipc_server->start_listener();
pm.reset(new PubMaster({"navThumbnail", "mapRenderState"}));
sm.reset(new SubMaster({"carrotMan", "liveLocationKalman", "navRoute"}, {"liveLocationKalman"}));
sm.reset(new SubMaster({"carrotMan", "navRoute"}));
timer = new QTimer(this);
timer->setSingleShot(true);
@ -123,23 +123,11 @@ void MapRenderer::msgUpdate() {
sm->update(1000);
auto carrotMan = (*sm)["carrotMan"].getCarrotMan();
bool active_carrot_man = carrotMan.getActiveCarrot() > 1;
if (sm->updated("liveLocationKalman")) {
auto location = (*sm)["liveLocationKalman"].getLiveLocationKalman();
auto pos = location.getPositionGeodetic();
auto orientation = location.getCalibratedOrientationNED();
if ((sm->rcv_frame("liveLocationKalman") % LLK_DECIMATION) == 0) {
float bearing = RAD2DEG(orientation.getValue()[2]);
float lat = pos.getValue()[0];
float lon = pos.getValue()[1];
if (active_carrot_man) {
bearing = carrotMan.getXPosAngle();
lat = carrotMan.getXPosLat();
lon = carrotMan.getXPosLon();
}
if (sm->updated("carrotMan")) {
float bearing = carrotMan.getXPosAngle();
float lat = carrotMan.getXPosLat();
float lon = carrotMan.getXPosLon();
updatePosition(get_point_along_line(lat, lon, bearing, MAP_OFFSET), bearing);
// TODO: use the static rendering mode instead
@ -158,7 +146,6 @@ void MapRenderer::msgUpdate() {
publish(0, false);
printf("blank frame\n");
}
}
}
if (sm->updated("navRoute")) {
@ -202,7 +189,7 @@ void MapRenderer::update() {
if ((vipc_server != nullptr) && loaded()) {
publish((end_t - start_t) / 1000.0, true);
last_llk_rendered = (*sm)["liveLocationKalman"].getLogMonoTime();
last_llk_rendered = (*sm)["carrotMan"].getLogMonoTime();
}
}
@ -219,17 +206,13 @@ void MapRenderer::publish(const double render_time, const bool loaded) {
QImage cap = fbo->toImage().convertToFormat(QImage::Format_RGB888, Qt::AutoColor);
auto carrotMan = (*sm)["carrotMan"].getCarrotMan();
auto location = (*sm)["liveLocationKalman"].getLiveLocationKalman();
bool valid = loaded && ((carrotMan.getActiveCarrot() > 1) || ((location.getStatus() == cereal::LiveLocationKalman::Status::VALID) && location.getPositionGeodetic().getValid()));
if (!valid) {
printf("loaded %d, active_carrot %d, status %d, valid %d\n", loaded, carrotMan.getActiveCarrot(), (int)location.getStatus(), location.getPositionGeodetic().getValid());
}
bool valid = loaded && (carrotMan.getXPosLat() > 0.0);
ever_loaded = ever_loaded || loaded;
uint64_t ts = nanos_since_boot();
VisionBuf* buf = vipc_server->get_buffer(VisionStreamType::VISION_STREAM_MAP);
VisionIpcBufExtra extra = {
.frame_id = frame_id,
.timestamp_sof = (*sm)["liveLocationKalman"].getLogMonoTime(),
.timestamp_sof = (*sm)["carrotMan"].getLogMonoTime(),
.timestamp_eof = ts,
.valid = valid,
};
@ -278,7 +261,7 @@ void MapRenderer::publish(const double render_time, const bool loaded) {
auto evt = msg.initEvent();
auto state = evt.initMapRenderState();
evt.setValid(valid);
state.setLocationMonoTime((*sm)["liveLocationKalman"].getLogMonoTime());
state.setLocationMonoTime((*sm)["carrotMan"].getLogMonoTime());
state.setRenderTime(render_time);
state.setFrameId(frame_id);
pm->send("mapRenderState", msg);

View File

@ -46,7 +46,7 @@ private:
uint32_t frame_id = 0;
uint64_t last_llk_rendered = 0;
bool rendered() {
return last_llk_rendered == (*sm)["liveLocationKalman"].getLogMonoTime();
return last_llk_rendered == (*sm)["carrotMan"].getLogMonoTime();
}
QTimer* timer;

View File

@ -94,19 +94,14 @@ class RouteEngine:
cloudlog.exception("navd.failed_to_compute")
def update_location(self):
location = self.sm['liveLocationKalman']
self.gps_ok = location.gpsOK
self.localizer_valid = (location.status == log.LiveLocationKalman.Status.valid) and location.positionGeodetic.valid
carrot_man = self.sm['carrotMan']
if carrot_man.activeCarrot > 1:
if carrot_man.xPosLat > 0.0:
self.last_bearing = carrot_man.xPosAngle;
self.last_position = Coordinate(carrot_man.xPosLat, carrot_man.xPosLon)
self.gps_ok = True
elif self.localizer_valid:
self.last_bearing = math.degrees(location.calibratedOrientationNED.value[2])
self.last_position = Coordinate(location.positionGeodetic.value[0], location.positionGeodetic.value[1])
self.localizer_valid = self.gps_ok = True
else:
self.localizer_valid = self.gps_ok = False
self.carrot_route_active = False
def recompute_route(self):
@ -119,10 +114,10 @@ class RouteEngine:
self.reset_recompute_limits()
return
#print(f"new_destination: {new_destination} nav_destination: {self.nav_destination}")
should_recompute = self.should_recompute()
should_recompute = self.should_recompute() and place_name != "External Navi"
if new_destination != self.nav_destination and place_name != "External Navi":
cloudlog.warning(f"Got new destination from NavDestination param {new_destination}")
print(f"Got new destination from NavDestination param {new_destination} {self.nav_destination}")
print(f"Got new destination from NavDestination param {new_destination} {self.nav_destination} {place_name}")
should_recompute = True
# Don't recompute when GPS drifts in tunnels
@ -381,7 +376,7 @@ class RouteEngine:
def main():
pm = messaging.PubMaster(['navInstruction', 'navRouteNavd'])
sm = messaging.SubMaster(['liveLocationKalman', 'managerState', 'carrotMan'])
sm = messaging.SubMaster(['managerState', 'carrotMan'])
rk = Ratekeeper(1.0)
route_engine = RouteEngine(sm, pm)

View File

@ -182,34 +182,14 @@ void MapWindow::updateState(const UIState &s) {
bool gps_updated = false;
auto carrotMan = sm["carrotMan"].getCarrotMan();
bool active_carrot_man = carrotMan.getActiveCarrot() > 1;
//bool active_carrot_man = carrotMan.getActiveCarrot() > 1;
if (!active_carrot_man && sm.updated("liveLocationKalman")) {
auto locationd_location = sm["liveLocationKalman"].getLiveLocationKalman();
auto locationd_pos = locationd_location.getPositionGeodetic();
auto locationd_orientation = locationd_location.getCalibratedOrientationNED();
auto locationd_velocity = locationd_location.getVelocityCalibrated();
auto locationd_ecef = locationd_location.getPositionECEF();
locationd_valid = (locationd_pos.getValid() && locationd_orientation.getValid() && locationd_velocity.getValid() && locationd_ecef.getValid());
if (locationd_valid) {
// Check std norm
auto pos_ecef_std = locationd_ecef.getStd();
bool pos_accurate_enough = sqrt(pow(pos_ecef_std[0], 2) + pow(pos_ecef_std[1], 2) + pow(pos_ecef_std[2], 2)) < 100;
locationd_valid = pos_accurate_enough;
}
lat = locationd_pos.getValue()[0];
lon = locationd_pos.getValue()[1];
bearing = RAD2DEG(locationd_orientation.getValue()[2]);
velocity = locationd_velocity.getValue()[0];
gps_updated = true;
}
if (active_carrot_man && sm.updated("carrotMan")) {
//printf("CarrotMan: %f %f %f %f\n", carrotMan.getXPosLat(), carrotMan.getXPosLon(), carrotMan.getXPosAngle(), carrotMan.getXPosSpeed());
if (carrotMan.getXPosLat() > 0.0) {
lat = carrotMan.getXPosLat();
lon = carrotMan.getXPosLon();
bearing = carrotMan.getXPosAngle();
velocity = carrotMan.getXPosSpeed()/3.6;
velocity = carrotMan.getXPosSpeed() / 3.6;
gps_updated = true;
locationd_valid = true;
}
@ -249,7 +229,7 @@ void MapWindow::updateState(const UIState &s) {
initLayers();
if (!locationd_valid) {
setError(tr("Waiting for APN"));
setError(tr("Waiting for GPS(APN)"));
} else if (routing_problem) {
setError(tr("Waiting for route"));
} else {
@ -284,7 +264,7 @@ void MapWindow::updateState(const UIState &s) {
// - API exception/no internet
// - route response is empty
// - any time navd is waiting for recompute_countdown
routing_problem = !sm.valid("navInstruction") && coordinate_from_param("NavDestination").has_value();
routing_problem = !(sm.valid("navInstruction") || sm.valid("navInstructionCarrot")) && coordinate_from_param("NavDestination").has_value();
if (sm.valid("navInstruction") || sm.valid("navInstructionCarrot")) {
//auto i = sm["navInstruction"].getNavInstruction();
@ -316,7 +296,9 @@ void MapWindow::updateState(const UIState &s) {
}
if (loaded_once && (sm.rcv_frame("modelV2") != model_rcv_frame)) {
auto locationd_location = sm["liveLocationKalman"].getLiveLocationKalman();
auto model_path = model_to_collection(locationd_location.getCalibratedOrientationECEF(), locationd_location.getPositionECEF(), sm["modelV2"].getModelV2().getPosition(), last_position->first, last_position->second);
//auto carrot_man = sm["carrotMan"].getCarrotMan();
auto model_path = model_to_collection(locationd_location.getCalibratedOrientationECEF(), locationd_location.getPositionECEF(), sm["modelV2"].getModelV2().getPosition(), carrotMan.getXPosLat(), carrotMan.getXPosLon());
//auto model_path = model_to_collection(sm["modelV2"].getModelV2().getPosition(), carrotMan.getXPosLat(), carrotMan.getXPosLon(), carrotMan.getXPosAngle());
QMapLibre::Feature model_path_feature(QMapLibre::Feature::LineStringType, model_path, {}, {});
QVariantMap modelV2Path;
modelV2Path["type"] = "geojson";

View File

@ -663,6 +663,7 @@ CarrotPanel::CarrotPanel(QWidget* parent) : QWidget(parent) {
latLongToggles->addItem(new CValueControl("LongTuningKiV", "LONG: I Gain(200)", "", "../assets/offroad/icon_logic.png", 0, 2000, 5));
latLongToggles->addItem(new CValueControl("LongTuningKf", "LONG: FF Gain(100)", "", "../assets/offroad/icon_logic.png", 0, 200, 5));
latLongToggles->addItem(new CValueControl("LongActuatorDelay", "LONG: ActuatorDelay(20)", "", "../assets/offroad/icon_logic.png", 0, 200, 5));
latLongToggles->addItem(new CValueControl("VegoStopping", "LONG: VEgoStopping(5)", "Stopping factor", "../assets/offroad/icon_logic.png", 1, 10, 1));
latLongToggles->addItem(new CValueControl("RadarReactionFactor", "LONG: Radar reaction factor(10)", "", "../assets/offroad/icon_logic.png", 0, 200, 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));
@ -801,6 +802,7 @@ CarrotPanel::CarrotPanel(QWidget* parent) : QWidget(parent) {
speedToggles->addItem(new CValueControl("AutoCurveSpeedFactor", "CURVE: Auto Control ratio(100%)", "", "../assets/offroad/icon_road.png", 50, 300, 1));
speedToggles->addItem(new CValueControl("AutoCurveSpeedAggressiveness", "CURVE: Aggressiveness (100%)", "", "../assets/offroad/icon_road.png", 50, 300, 1));
speedToggles->addItem(new CValueControl("AutoNaviSpeedCtrlEnd", "SpeedCameraDecelEnd(6s)", "감속완료시점을 설정합니다.값이 크면 카메라에서 멀리 감속 완료", "../assets/offroad/icon_road.png", 3, 20, 1));
speedToggles->addItem(new CValueControl("AutoNaviSpeedCtrlMode", "0:감속안함,1:과속카메라,2:+사고방지턱,3:+이동식카메라", "../assets/offroad/icon_road.png", 0, 3, 1));
speedToggles->addItem(new CValueControl("AutoNaviSpeedDecelRate", "SpeedCameraDecelRatex0.01m/s^2(80)", "낮으면 멀리서부터 감속함", "../assets/offroad/icon_road.png", 10, 200, 10));
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));

View File

@ -73,6 +73,7 @@ def get_default_params():
("AutoTurnMapChange", "0"),
("AutoNaviSpeedCtrlEnd", "7"),
("AutoNaviSpeedCtrlMode", "2"),
("AutoNaviSpeedBumpTime", "1"),
("AutoNaviSpeedBumpSpeed", "35"),
("AutoNaviSpeedSafetyFactor", "105"),
@ -101,6 +102,7 @@ def get_default_params():
("LongTuningKiV", "0"),
("LongTuningKf", "100"),
("LongActuatorDelay", "20"),
("VegoStopping", "5"),
("RadarReactionFactor", "10"),
("EnableRadarTracks", "0"),
("HyundaiCameraSCC", "0"),