This commit is contained in:
Jason Wen
2024-08-06 20:22:10 -04:00
parent c6fa48d166
commit 3c168d0975
6 changed files with 34 additions and 6 deletions
+1
View File
@@ -16,6 +16,7 @@ enum LongitudinalPersonalitySP {
moderate @1;
standard @2;
relaxed @3;
overtake @4;
}
enum AccelerationPersonality {
+1
View File
@@ -291,6 +291,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"OsmLocationUrl", PERSISTENT},
{"OsmWayTest", PERSISTENT},
{"OsmDownloadedDate", PERSISTENT},
{"OvertakingAccelerationAssist", PERSISTENT},
{"PathOffset", PERSISTENT | BACKUP},
{"PauseLateralSpeed", PERSISTENT | BACKUP},
{"QuietDrive", PERSISTENT | BACKUP},
@@ -66,6 +66,8 @@ def get_jerk_factor(personality=custom.LongitudinalPersonalitySP.standard):
return 0.8
elif personality==custom.LongitudinalPersonalitySP.aggressive:
return 0.6
elif personality==custom.LongitudinalPersonalitySP.overtake:
return 0.25
else:
raise NotImplementedError("Longitudinal personality not supported")
@@ -79,6 +81,8 @@ def get_T_FOLLOW(personality=custom.LongitudinalPersonalitySP.standard):
return 1.25
elif personality==custom.LongitudinalPersonalitySP.aggressive:
return 1.0
elif personality==custom.LongitudinalPersonalitySP.overtake:
return 0.5
else:
raise NotImplementedError("Longitudinal personality not supported")
@@ -358,9 +362,11 @@ class LongitudinalMpc:
self.cruise_min_a = min_a
self.max_a = max_a
def update(self, radarstate, v_cruise, x, v, a, j, personality=custom.LongitudinalPersonalitySP.standard, dynamic_personality=False):
def update(self, radarstate, v_cruise, x, v, a, j, personality=custom.LongitudinalPersonalitySP.standard,
dynamic_personality=False, overtaking_acceleration_assist=False):
v_ego = self.x0[1]
t_follow = get_dynamic_personality(v_ego, personality) if dynamic_personality else get_T_FOLLOW(personality)
t_follow = get_T_FOLLOW(custom.LongitudinalPersonalitySP.overtake) if overtaking_acceleration_assist else t_follow
self.status = radarstate.leadOne.status or radarstate.leadTwo.status
lead_xv_0 = self.process_lead(radarstate.leadOne)
+17 -3
View File
@@ -3,7 +3,7 @@ import math
import numpy as np
from openpilot.common.numpy_fast import clip, interp
from openpilot.common.params import Params
from cereal import car
from cereal import car, custom
import cereal.messaging as messaging
from openpilot.common.conversions import Conversions as CV
@@ -36,6 +36,8 @@ _A_TOTAL_MAX_BP = [20., 40.]
EventName = car.CarEvent.EventName
LaneChangeState = log.LaneChangeState
LaneChangeDirection = log.LaneChangeDirection
def get_max_accel(v_ego):
@@ -102,6 +104,8 @@ class LongitudinalPlanner:
self.dynamic_experimental_controller = DynamicExperimentalController()
self.accel_controller = AccelController()
self.overtaking_accel = self.params.get_bool("OvertakingAccelerationAssist")
def read_param(self):
try:
self.dynamic_experimental_controller.set_enabled(self.params.get_bool("DynamicExperimentalControl"))
@@ -109,6 +113,8 @@ class LongitudinalPlanner:
self.dynamic_experimental_controller = DynamicExperimentalController()
self.accel_controller = AccelController()
self.overtaking_accel = self.params.get_bool("OvertakingAccelerationAssist")
@staticmethod
def parse_model(model_msg, model_error):
if (len(model_msg.position.x) == ModelConstants.IDX_N and
@@ -168,6 +174,13 @@ class LongitudinalPlanner:
accel_limits = [ACCEL_MIN, ACCEL_MAX]
accel_limits_turns = [ACCEL_MIN, ACCEL_MAX]
lat_plan = sm['lateralPlanDEPRECATED']
dm_state = sm['driverMonitoringState']
overtaking_accel_allowed = ((lat_plan.laneChangeDirection == LaneChangeDirection.right and dm_state.isRHD) or
(lat_plan.laneChangeDirection == LaneChangeDirection.left and not dm_state.isRHD)) and \
(lat_plan.laneChangeState in (LaneChangeState.preLaneChange, LaneChangeState.laneChangeStarting))
overtaking_accel_engaged = self.overtaking_accel and overtaking_accel_allowed and v_ego > 40 * CV.MPH_TO_MS
if reset_state:
self.v_desired_filter.x = v_ego
# Clip aEgo to cruise limits to prevent large accelerations when becoming active
@@ -190,11 +203,12 @@ class LongitudinalPlanner:
accel_limits_turns[0] = min(accel_limits_turns[0], self.a_desired + 0.05)
accel_limits_turns[1] = max(accel_limits_turns[1], self.a_desired - 0.05)
self.mpc.set_weights(prev_accel_constraint, personality=sm['controlsStateSP'].personality)
self.mpc.set_weights(prev_accel_constraint, personality=custom.LongitudinalPersonalitySP.overtake if overtaking_accel_engaged else sm['controlsStateSP'].personality)
self.mpc.set_accel_limits(accel_limits_turns[0], accel_limits_turns[1])
self.mpc.set_cur_state(self.v_desired_filter.x, self.a_desired)
x, v, a, j = self.parse_model(sm['modelV2'], self.v_model_error)
self.mpc.update(sm['radarState'], v_cruise, x, v, a, j, personality=sm['controlsStateSP'].personality, dynamic_personality=sm['controlsStateSP'].dynamicPersonality)
self.mpc.update(sm['radarState'], v_cruise, x, v, a, j, personality=sm['controlsStateSP'].personality,
dynamic_personality=sm['controlsStateSP'].dynamicPersonality, overtaking_acceleration_assist=overtaking_accel_engaged)
self.v_desired_trajectory = np.interp(CONTROL_N_T_IDX, T_IDXS_MPC, self.mpc.v_solution)
self.a_desired_trajectory = np.interp(CONTROL_N_T_IDX, T_IDXS_MPC, self.mpc.a_solution)
+1 -1
View File
@@ -32,7 +32,7 @@ def plannerd_thread():
pm = messaging.PubMaster(['longitudinalPlan', 'longitudinalPlanSP'] + lateral_planner_svs)
sm = messaging.SubMaster(['carControl', 'carState', 'controlsState', 'radarState', 'modelV2',
'longitudinalPlan', 'navInstruction', 'longitudinalPlanSP',
'liveMapDataSP', 'e2eLongStateSP', 'controlsStateSP'] + lateral_planner_svs,
'liveMapDataSP', 'e2eLongStateSP', 'controlsStateSP', 'driverMonitoringState'] + lateral_planner_svs,
poll='modelV2', ignore_avg_freq=['radarState'])
while True:
@@ -49,6 +49,12 @@ SunnypilotPanel::SunnypilotPanel(QWidget *parent) : QFrame(parent) {
tr("While in Auto Lane, switch to Laneless for current/future curves."),
"../assets/offroad/icon_blank.png",
},
{
"OvertakingAccelerationAssist",
tr("Overtaking Acceleration Assist"),
tr("Overtaking Acceleration Assist will operate when the turn signal indicator is turned on to the left (left-hand drive) or turned on to the right (right-hand drive) while Smart Cruise Control is operating."),
"../assets/offroad/icon_blank.png",
},
{
"EnableSlc",
tr("Speed Limit Control (SLC)"),
@@ -298,7 +304,7 @@ SunnypilotPanel::SunnypilotPanel(QWidget *parent) : QFrame(parent) {
list->addItem(dlp_settings);
}
if (param == "VisionCurveLaneless") {
if (param == "OvertakingAccelerationAssist") {
list->addItem(laneChangeSettingsLayout);
list->addItem(horizontal_line());