Skip to content

Commit d03f9d4

Browse files
krkeegansshane
authored andcommitted
Use vel_diff to alter follow; Lower J and X Costs at low speeds
Attempt to decrease sluggish start issue. Add a test_accel file for testing sluggish starts.
1 parent 9ebf354 commit d03f9d4

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py

+30-6
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
# from pyextra.acados_template import AcadosOcpSolver as AcadosOcpSolverFast
1717
from selfdrive.controls.lib.longitudinal_mpc_lib.c_generated_code.acados_ocp_solver_pyx import AcadosOcpSolverFast # pylint: disable=no-name-in-module, import-error
1818

19-
from casadi import SX, vertcat
19+
from casadi import SX, vertcat, if_else
2020

2121
LONG_MPC_DIR = os.path.dirname(os.path.abspath(__file__))
2222
EXPORT_DIR = os.path.join(LONG_MPC_DIR, "c_generated_code")
@@ -55,14 +55,20 @@
5555
COMFORT_BRAKE = 2.5
5656
STOP_DISTANCE = 6.0
5757

58-
def get_stopped_equivalence_factor(v_lead):
59-
return (v_lead**2) / (2 * COMFORT_BRAKE)
58+
def get_stopped_equivalence_factor(v_lead, v_ego):
59+
# KRK add linear offset based on speed differential in attempt to
60+
# rectify sluggish start issue
61+
v_diff_offset = if_else(v_lead - v_ego > 0, (v_lead - v_ego) * 1, 0) # Linear offset
62+
v_diff_offset = if_else(v_diff_offset > STOP_DISTANCE, STOP_DISTANCE, v_diff_offset) # Limit max offset
63+
v_diff_offset = v_diff_offset * ((10 - v_ego)/10) # Offset tapers off ending at v_ego of 10m/s
64+
distance = (v_lead**2) / (2 * COMFORT_BRAKE) + v_diff_offset
65+
return distance
6066

6167
def get_safe_obstacle_distance(v_ego, t_follow=T_FOLLOW):
6268
return (v_ego**2) / (2 * COMFORT_BRAKE) + t_follow * v_ego + STOP_DISTANCE
6369

6470
def desired_follow_distance(v_ego, v_lead, t_follow=T_FOLLOW):
65-
return get_safe_obstacle_distance(v_ego, t_follow) - get_stopped_equivalence_factor(v_lead)
71+
return get_safe_obstacle_distance(v_ego, t_follow) - get_stopped_equivalence_factor(v_lead, v_ego)
6672

6773

6874
def gen_long_model():
@@ -234,6 +240,24 @@ def set_weights(self):
234240
else:
235241
self.set_weights_for_lead_policy()
236242

243+
def get_cost_multipliers(self):
244+
v_ego = self.x0[1]
245+
v_ego_bps = [0, 10]
246+
TFs = [1.0, 1.25, T_FOLLOW]
247+
# KRKeegan adjustments to costs for different TFs
248+
# these were calculated using the test_longitudial.py deceleration tests
249+
x_ego_obstacle_cost_multiplier_tf = interp(self.desired_TF, TFs, [2., 1.3, 1.])
250+
j_ego_cost_multiplier_tf = interp(self.desired_TF, TFs, [.1, .8, 1.])
251+
d_zone_cost_multiplier_tf = interp(self.desired_TF, TFs, [1.8, 1.3, 1.])
252+
# KRKeegan adjustments to improve sluggish acceleration these also
253+
# alter deceleration in the same range
254+
x_ego_obstacle_cost_multiplier_v_ego = interp(v_ego, v_ego_bps, [2., 1.]) # double
255+
j_ego_cost_multiplier_v_ego = interp(v_ego, v_ego_bps, [.5, 1.]) # halve
256+
# Select the appropriate min/max of the options
257+
x_ego_obstacle_cost_multiplier = max(x_ego_obstacle_cost_multiplier_tf, x_ego_obstacle_cost_multiplier_v_ego)
258+
j_ego_cost_multiplier = min(j_ego_cost_multiplier_tf, j_ego_cost_multiplier_v_ego)
259+
return (x_ego_obstacle_cost_multiplier, j_ego_cost_multiplier, d_zone_cost_multiplier_tf)
260+
237261
def set_weights_for_lead_policy(self):
238262
# WARNING: deceleration tests with these costs:
239263
# 1.0 TR fails at 3 m/s/s test
@@ -343,8 +367,8 @@ def update(self, carstate, radarstate, v_cruise, prev_accel_constraint=False):
343367
# To estimate a safe distance from a moving lead, we calculate how much stopping
344368
# distance that lead needs as a minimum. We can add that to the current distance
345369
# and then treat that as a stopped car/obstacle at this new distance.
346-
lead_0_obstacle = lead_xv_0[:,0] + get_stopped_equivalence_factor(lead_xv_0[:,1])
347-
lead_1_obstacle = lead_xv_1[:,0] + get_stopped_equivalence_factor(lead_xv_1[:,1])
370+
lead_0_obstacle = lead_xv_0[:,0] + get_stopped_equivalence_factor(lead_xv_0[:,1], v_ego)
371+
lead_1_obstacle = lead_xv_1[:,0] + get_stopped_equivalence_factor(lead_xv_1[:,1], v_ego)
348372

349373
# Fake an obstacle for cruise, this ensures smooth acceleration to set speed
350374
# when the leads are no factor.

0 commit comments

Comments
 (0)