|
|
@ -58,6 +58,7 @@ class LongitudinalPlanner: |
|
|
|
|
|
|
|
|
|
|
|
self.a_desired = init_a |
|
|
|
self.a_desired = init_a |
|
|
|
self.v_desired_filter = FirstOrderFilter(init_v, 2.0, DT_MDL) |
|
|
|
self.v_desired_filter = FirstOrderFilter(init_v, 2.0, DT_MDL) |
|
|
|
|
|
|
|
self.v_model_error = 0.0 |
|
|
|
|
|
|
|
|
|
|
|
self.v_desired_trajectory = np.zeros(CONTROL_N) |
|
|
|
self.v_desired_trajectory = np.zeros(CONTROL_N) |
|
|
|
self.a_desired_trajectory = np.zeros(CONTROL_N) |
|
|
|
self.a_desired_trajectory = np.zeros(CONTROL_N) |
|
|
@ -68,12 +69,12 @@ class LongitudinalPlanner: |
|
|
|
e2e = self.params.get_bool('EndToEndLong') and self.CP.openpilotLongitudinalControl |
|
|
|
e2e = self.params.get_bool('EndToEndLong') and self.CP.openpilotLongitudinalControl |
|
|
|
self.mpc.mode = 'blended' if e2e else 'acc' |
|
|
|
self.mpc.mode = 'blended' if e2e else 'acc' |
|
|
|
|
|
|
|
|
|
|
|
def parse_model(self, model_msg): |
|
|
|
def parse_model(self, model_msg, model_error): |
|
|
|
if (len(model_msg.position.x) == 33 and |
|
|
|
if (len(model_msg.position.x) == 33 and |
|
|
|
len(model_msg.velocity.x) == 33 and |
|
|
|
len(model_msg.velocity.x) == 33 and |
|
|
|
len(model_msg.acceleration.x) == 33): |
|
|
|
len(model_msg.acceleration.x) == 33): |
|
|
|
x = np.interp(T_IDXS_MPC, T_IDXS, model_msg.position.x) |
|
|
|
x = np.interp(T_IDXS_MPC, T_IDXS, model_msg.position.x) - model_error * T_IDXS_MPC |
|
|
|
v = np.interp(T_IDXS_MPC, T_IDXS, model_msg.velocity.x) |
|
|
|
v = np.interp(T_IDXS_MPC, T_IDXS, model_msg.velocity.x) - model_error |
|
|
|
a = np.interp(T_IDXS_MPC, T_IDXS, model_msg.acceleration.x) |
|
|
|
a = np.interp(T_IDXS_MPC, T_IDXS, model_msg.acceleration.x) |
|
|
|
j = np.zeros(len(T_IDXS_MPC)) |
|
|
|
j = np.zeros(len(T_IDXS_MPC)) |
|
|
|
else: |
|
|
|
else: |
|
|
@ -112,6 +113,9 @@ class LongitudinalPlanner: |
|
|
|
|
|
|
|
|
|
|
|
# Prevent divergence, smooth in current v_ego |
|
|
|
# Prevent divergence, smooth in current v_ego |
|
|
|
self.v_desired_filter.x = max(0.0, self.v_desired_filter.update(v_ego)) |
|
|
|
self.v_desired_filter.x = max(0.0, self.v_desired_filter.update(v_ego)) |
|
|
|
|
|
|
|
# Compute model v_ego error |
|
|
|
|
|
|
|
if len(sm['modelV2'].temporalPose.trans): |
|
|
|
|
|
|
|
self.v_model_error = sm['modelV2'].temporalPose.trans[0] - v_ego |
|
|
|
|
|
|
|
|
|
|
|
if force_slow_decel: |
|
|
|
if force_slow_decel: |
|
|
|
# if required so, force a smooth deceleration |
|
|
|
# if required so, force a smooth deceleration |
|
|
@ -124,7 +128,7 @@ class LongitudinalPlanner: |
|
|
|
self.mpc.set_weights(prev_accel_constraint) |
|
|
|
self.mpc.set_weights(prev_accel_constraint) |
|
|
|
self.mpc.set_accel_limits(accel_limits_turns[0], accel_limits_turns[1]) |
|
|
|
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) |
|
|
|
self.mpc.set_cur_state(self.v_desired_filter.x, self.a_desired) |
|
|
|
x, v, a, j = self.parse_model(sm['modelV2']) |
|
|
|
x, v, a, j = self.parse_model(sm['modelV2'], self.v_model_error) |
|
|
|
self.mpc.update(sm['carState'], sm['radarState'], v_cruise, x, v, a, j) |
|
|
|
self.mpc.update(sm['carState'], sm['radarState'], v_cruise, x, v, a, j) |
|
|
|
|
|
|
|
|
|
|
|
self.v_desired_trajectory = np.interp(T_IDXS[:CONTROL_N], T_IDXS_MPC, self.mpc.v_solution) |
|
|
|
self.v_desired_trajectory = np.interp(T_IDXS[:CONTROL_N], T_IDXS_MPC, self.mpc.v_solution) |
|
|
|