Skip to content

Commit 74ff23c

Browse files
pd0wmCasey Francis
authored andcommitted
Future: longitudinal planner: disable change cost when stopped. not engaged or gas pressed (commaai#23639)
* disable change cost completely on standstill and gas press * cleanup * set accel to zero * clean up logic around standstill * update ref
1 parent 053154f commit 74ff23c

File tree

2 files changed

+21
-18
lines changed

2 files changed

+21
-18
lines changed

selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -230,14 +230,14 @@ def reset(self):
230230
self.x0 = np.zeros(X_DIM)
231231
self.set_weights()
232232

233-
def set_weights(self):
233+
def set_weights(self, prev_accel_constraint=True):
234234
if self.e2e:
235235
self.set_weights_for_xva_policy()
236236
self.params[:,0] = -10.
237237
self.params[:,1] = 10.
238238
self.params[:,2] = 1e5
239239
else:
240-
self.set_weights_for_lead_policy()
240+
self.set_weights_for_lead_policy(prev_accel_constraint)
241241

242242
def get_cost_multipliers(self):
243243
v_ego = self.x0[1]
@@ -257,14 +257,15 @@ def get_cost_multipliers(self):
257257
a_change = min(a_change_tf, a_change_v_ego)
258258
return (a_change, j_ego, d_zone_tf)
259259

260-
def set_weights_for_lead_policy(self):
260+
def set_weights_for_lead_policy(self, prev_accel_constraint=True):
261261
cost_mulitpliers = self.get_cost_multipliers()
262+
a_change_cost = A_CHANGE_COST if prev_accel_constraint else 0
262263
W = np.asfortranarray(np.diag([X_EGO_OBSTACLE_COST, X_EGO_COST, V_EGO_COST,
263-
A_EGO_COST, A_CHANGE_COST * cost_mulitpliers[0],
264+
A_EGO_COST, a_change_cost * cost_mulitpliers[0],
264265
J_EGO_COST * cost_mulitpliers[1]]))
265266
for i in range(N):
266267
# KRKeegan, decreased timescale to .5s since Toyota lag is set to .3s
267-
W[4,4] = A_CHANGE_COST * cost_mulitpliers[0] * np.interp(T_IDXS[i], [0.0, 0.5, 2.0], [1.0, 1.0, 0.0])
268+
W[4,4] = a_change_cost * cost_mulitpliers[0] * np.interp(T_IDXS[i], [0.0, 0.5, 2.0], [1.0, 1.0, 0.0])
268269
self.solver.cost_set(i, 'W', W)
269270
# Setting the slice without the copy make the array not contiguous,
270271
# causing issues with the C interface.
@@ -345,11 +346,10 @@ def update_TF(self, carstate):
345346
else:
346347
self.desired_TF = T_FOLLOW
347348

348-
def update(self, carstate, radarstate, v_cruise, prev_accel_constraint=False):
349+
def update(self, carstate, radarstate, v_cruise):
349350
self.update_TF(carstate)
350351
self.set_weights()
351352
v_ego = self.x0[1]
352-
a_ego = self.x0[2]
353353
self.status = radarstate.leadOne.status or radarstate.leadTwo.status
354354

355355
lead_xv_0 = self.process_lead(radarstate.leadOne)
@@ -377,10 +377,7 @@ def update(self, carstate, radarstate, v_cruise, prev_accel_constraint=False):
377377
x_obstacles = np.column_stack([lead_0_obstacle, lead_1_obstacle, cruise_obstacle])
378378
self.source = SOURCES[np.argmin(x_obstacles[0])]
379379
self.params[:,2] = np.min(x_obstacles, axis=1)
380-
if prev_accel_constraint:
381-
self.params[:,3] = np.copy(self.prev_a)
382-
else:
383-
self.params[:,3] = a_ego
380+
self.params[:,3] = np.copy(self.prev_a)
384381
self.params[:,4] = self.desired_TF
385382

386383
self.run()

selfdrive/controls/lib/longitudinal_planner.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ def __init__(self, CP, init_v=0.0, init_a=0.0):
5858

5959
def update(self, sm):
6060
v_ego = sm['carState'].vEgo
61-
a_ego = sm['carState'].aEgo
6261

6362
v_cruise_kph = sm['controlsState'].vCruise
6463
v_cruise_kph = min(v_cruise_kph, V_CRUISE_MAX)
@@ -67,12 +66,16 @@ def update(self, sm):
6766
long_control_state = sm['controlsState'].longControlState
6867
force_slow_decel = sm['controlsState'].forceDecel
6968

70-
prev_accel_constraint = True
71-
if long_control_state == LongCtrlState.off or sm['carState'].gasPressed:
69+
# Reset current state when not engaged, or user is controlling the speed
70+
reset_state = long_control_state == LongCtrlState.off
71+
reset_state = reset_state or sm['carState'].gasPressed
72+
73+
# No change cost when user is controlling the speed, or when standstill
74+
prev_accel_constraint = not (reset_state or sm['carState'].standstill)
75+
76+
if reset_state:
7277
self.v_desired_filter.x = v_ego
73-
self.a_desired = a_ego
74-
# Smoothly changing between accel trajectory is only relevant when OP is driving
75-
prev_accel_constraint = False
78+
self.a_desired = 0.0
7679

7780
# Prevent divergence, smooth in current v_ego
7881
self.v_desired_filter.x = max(0.0, self.v_desired_filter.update(v_ego))
@@ -86,9 +89,12 @@ def update(self, sm):
8689
# clip limits, cannot init MPC outside of bounds
8790
accel_limits_turns[0] = min(accel_limits_turns[0], self.a_desired + 0.05)
8891
accel_limits_turns[1] = max(accel_limits_turns[1], self.a_desired - 0.05)
92+
93+
self.mpc.set_weights(prev_accel_constraint)
8994
self.mpc.set_accel_limits(accel_limits_turns[0], accel_limits_turns[1])
9095
self.mpc.set_cur_state(self.v_desired_filter.x, self.a_desired)
91-
self.mpc.update(sm['carState'], sm['radarState'], v_cruise, prev_accel_constraint=prev_accel_constraint)
96+
self.mpc.update(sm['carState'], sm['radarState'], v_cruise)
97+
9298
self.v_desired_trajectory = np.interp(T_IDXS[:CONTROL_N], T_IDXS_MPC, self.mpc.v_solution)
9399
self.a_desired_trajectory = np.interp(T_IDXS[:CONTROL_N], T_IDXS_MPC, self.mpc.a_solution)
94100
self.j_desired_trajectory = np.interp(T_IDXS[:CONTROL_N], T_IDXS_MPC[:-1], self.mpc.j_solution)

0 commit comments

Comments
 (0)