No curv rate for lateral control (#31042)

* No more Curvature rate for lat control

* Update cereal

* Update

* Fix lat control test
pull/31045/head
Harald Schäfer 1 year ago committed by GitHub
parent 840db1f1b7
commit d36103791c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      cereal
  2. 9
      selfdrive/controls/controlsd.py
  3. 9
      selfdrive/controls/lib/drive_helpers.py
  4. 2
      selfdrive/controls/lib/latcontrol.py
  5. 2
      selfdrive/controls/lib/latcontrol_angle.py
  6. 2
      selfdrive/controls/lib/latcontrol_pid.py
  7. 2
      selfdrive/controls/lib/latcontrol_torque.py
  8. 2
      selfdrive/controls/lib/tests/test_latcontrol.py

@ -1 +1 @@
Subproject commit d81d86e7cd83d1eb40314964a4d194231381d557 Subproject commit 20b65eeb1f6c580cdd7d63e53639f4fc48bc2f56

@ -172,7 +172,6 @@ class Controls:
self.last_actuators = car.CarControl.Actuators.new_message() self.last_actuators = car.CarControl.Actuators.new_message()
self.steer_limited = False self.steer_limited = False
self.desired_curvature = 0.0 self.desired_curvature = 0.0
self.desired_curvature_rate = 0.0
self.experimental_mode = False self.experimental_mode = False
self.v_cruise_helper = VCruiseHelper(self.CP) self.v_cruise_helper = VCruiseHelper(self.CP)
self.recalibrating_seen = False self.recalibrating_seen = False
@ -611,13 +610,10 @@ class Controls:
actuators.accel = self.LoC.update(CC.longActive, CS, long_plan, pid_accel_limits, t_since_plan) actuators.accel = self.LoC.update(CC.longActive, CS, long_plan, pid_accel_limits, t_since_plan)
# Steering PID loop and lateral MPC # Steering PID loop and lateral MPC
self.desired_curvature, self.desired_curvature_rate = get_lag_adjusted_curvature(self.CP, CS.vEgo, self.desired_curvature = get_lag_adjusted_curvature(self.CP, CS.vEgo, lat_plan.psis, lat_plan.curvatures)
lat_plan.psis,
lat_plan.curvatures,
lat_plan.curvatureRates)
actuators.steer, actuators.steeringAngleDeg, lac_log = self.LaC.update(CC.latActive, CS, self.VM, lp, actuators.steer, actuators.steeringAngleDeg, lac_log = self.LaC.update(CC.latActive, CS, self.VM, lp,
self.steer_limited, self.desired_curvature, self.steer_limited, self.desired_curvature,
self.desired_curvature_rate, self.sm['liveLocationKalman']) self.sm['liveLocationKalman'])
actuators.curvature = self.desired_curvature actuators.curvature = self.desired_curvature
else: else:
lac_log = log.ControlsState.LateralDebugState.new_message() lac_log = log.ControlsState.LateralDebugState.new_message()
@ -787,7 +783,6 @@ class Controls:
controlsState.active = self.active controlsState.active = self.active
controlsState.curvature = curvature controlsState.curvature = curvature
controlsState.desiredCurvature = self.desired_curvature controlsState.desiredCurvature = self.desired_curvature
controlsState.desiredCurvatureRate = self.desired_curvature_rate
controlsState.state = self.state controlsState.state = self.state
controlsState.engageable = not self.events.contains(ET.NO_ENTRY) controlsState.engageable = not self.events.contains(ET.NO_ENTRY)
controlsState.longControlState = self.LoC.long_control_state controlsState.longControlState = self.LoC.long_control_state

@ -163,11 +163,10 @@ def rate_limit(new_value, last_value, dw_step, up_step):
return clip(new_value, last_value + dw_step, last_value + up_step) return clip(new_value, last_value + dw_step, last_value + up_step)
def get_lag_adjusted_curvature(CP, v_ego, psis, curvatures, curvature_rates): def get_lag_adjusted_curvature(CP, v_ego, psis, curvatures):
if len(psis) != CONTROL_N: if len(psis) != CONTROL_N:
psis = [0.0]*CONTROL_N psis = [0.0]*CONTROL_N
curvatures = [0.0]*CONTROL_N curvatures = [0.0]*CONTROL_N
curvature_rates = [0.0]*CONTROL_N
v_ego = max(MIN_SPEED, v_ego) v_ego = max(MIN_SPEED, v_ego)
# TODO this needs more thought, use .2s extra for now to estimate other delays # TODO this needs more thought, use .2s extra for now to estimate other delays
@ -182,16 +181,12 @@ def get_lag_adjusted_curvature(CP, v_ego, psis, curvatures, curvature_rates):
desired_curvature = 2 * average_curvature_desired - current_curvature_desired desired_curvature = 2 * average_curvature_desired - current_curvature_desired
# This is the "desired rate of the setpoint" not an actual desired rate # This is the "desired rate of the setpoint" not an actual desired rate
desired_curvature_rate = curvature_rates[0]
max_curvature_rate = MAX_LATERAL_JERK / (v_ego**2) # inexact calculation, check https://github.com/commaai/openpilot/pull/24755 max_curvature_rate = MAX_LATERAL_JERK / (v_ego**2) # inexact calculation, check https://github.com/commaai/openpilot/pull/24755
safe_desired_curvature_rate = clip(desired_curvature_rate,
-max_curvature_rate,
max_curvature_rate)
safe_desired_curvature = clip(desired_curvature, safe_desired_curvature = clip(desired_curvature,
current_curvature_desired - max_curvature_rate * DT_MDL, current_curvature_desired - max_curvature_rate * DT_MDL,
current_curvature_desired + max_curvature_rate * DT_MDL) current_curvature_desired + max_curvature_rate * DT_MDL)
return safe_desired_curvature, safe_desired_curvature_rate return safe_desired_curvature
def get_friction(lateral_accel_error: float, lateral_accel_deadzone: float, friction_threshold: float, def get_friction(lateral_accel_error: float, lateral_accel_deadzone: float, friction_threshold: float,

@ -17,7 +17,7 @@ class LatControl(ABC):
self.steer_max = 1.0 self.steer_max = 1.0
@abstractmethod @abstractmethod
def update(self, active, CS, VM, params, steer_limited, desired_curvature, desired_curvature_rate, llk): def update(self, active, CS, VM, params, steer_limited, desired_curvature, llk):
pass pass
def reset(self): def reset(self):

@ -11,7 +11,7 @@ class LatControlAngle(LatControl):
super().__init__(CP, CI) super().__init__(CP, CI)
self.sat_check_min_speed = 5. self.sat_check_min_speed = 5.
def update(self, active, CS, VM, params, steer_limited, desired_curvature, desired_curvature_rate, llk): def update(self, active, CS, VM, params, steer_limited, desired_curvature, llk):
angle_log = log.ControlsState.LateralAngleState.new_message() angle_log = log.ControlsState.LateralAngleState.new_message()
if not active: if not active:

@ -17,7 +17,7 @@ class LatControlPID(LatControl):
super().reset() super().reset()
self.pid.reset() self.pid.reset()
def update(self, active, CS, VM, params, steer_limited, desired_curvature, desired_curvature_rate, llk): def update(self, active, CS, VM, params, steer_limited, desired_curvature, llk):
pid_log = log.ControlsState.LateralPIDState.new_message() pid_log = log.ControlsState.LateralPIDState.new_message()
pid_log.steeringAngleDeg = float(CS.steeringAngleDeg) pid_log.steeringAngleDeg = float(CS.steeringAngleDeg)
pid_log.steeringRateDeg = float(CS.steeringRateDeg) pid_log.steeringRateDeg = float(CS.steeringRateDeg)

@ -36,7 +36,7 @@ class LatControlTorque(LatControl):
self.torque_params.latAccelOffset = latAccelOffset self.torque_params.latAccelOffset = latAccelOffset
self.torque_params.friction = friction self.torque_params.friction = friction
def update(self, active, CS, VM, params, steer_limited, desired_curvature, desired_curvature_rate, llk): def update(self, active, CS, VM, params, steer_limited, desired_curvature, llk):
pid_log = log.ControlsState.LateralTorqueState.new_message() pid_log = log.ControlsState.LateralTorqueState.new_message()
if not active: if not active:

@ -34,7 +34,7 @@ class TestLatControl(unittest.TestCase):
llk = gen_llk() llk = gen_llk()
for _ in range(1000): for _ in range(1000):
_, _, lac_log = controller.update(True, CS, VM, params, False, 1, 0, llk) _, _, lac_log = controller.update(True, CS, VM, params, False, 1, llk)
self.assertTrue(lac_log.saturated) self.assertTrue(lac_log.saturated)

Loading…
Cancel
Save