forked from sunnypilot/sunnypilot
-
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
commaai/openpilot#24260 Update interface.py Update interface.py Update interface.py
- Loading branch information
1 parent
af0f958
commit e4a76c9
Showing
12 changed files
with
144 additions
and
127 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
from abc import abstractmethod, ABC | ||
|
||
from common.realtime import DT_CTRL | ||
from common.numpy_fast import clip | ||
|
||
MIN_STEER_SPEED = 0.3 | ||
|
||
|
||
class LatControl(ABC): | ||
def __init__(self, CP, CI): | ||
self.sat_count_rate = 1.0 * DT_CTRL | ||
self.sat_limit = CP.steerLimitTimer | ||
self.sat_count = 0. | ||
|
||
# we define the steer torque scale as [-1.0...1.0] | ||
self.steer_max = 1.0 | ||
|
||
@abstractmethod | ||
def update(self, active, CS, CP, VM, params, last_actuators, desired_curvature, desired_curvature_rate, llk): | ||
pass | ||
|
||
def reset(self): | ||
self.sat_count = 0. | ||
|
||
def _check_saturation(self, saturated, CS): | ||
if saturated and CS.vEgo > 10. and not CS.steeringRateLimited and not CS.steeringPressed: | ||
self.sat_count += self.sat_count_rate | ||
else: | ||
self.sat_count -= self.sat_count_rate | ||
self.sat_count = clip(self.sat_count, 0.0, self.sat_limit) | ||
return self.sat_count > (self.sat_limit - 1e-3) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
import math | ||
from selfdrive.controls.lib.pid import PIDController | ||
from common.numpy_fast import interp | ||
from selfdrive.controls.lib.latcontrol import LatControl, MIN_STEER_SPEED | ||
from selfdrive.controls.lib.vehicle_model import ACCELERATION_DUE_TO_GRAVITY | ||
from cereal import log | ||
|
||
# At higher speeds (25+mph) we can assume: | ||
# Lateral acceleration achieved by a specific car correlates to | ||
# torque applied to the steering rack. It does not correlate to | ||
# wheel slip, or to speed. | ||
|
||
# This controller applies torque to achieve desired lateral | ||
# accelerations. To compensate for the low speed effects we | ||
# use a LOW_SPEED_FACTOR in the error. Additionally there is | ||
# friction in the steering wheel that needs to be overcome to | ||
# move it at all, this is compensated for too. | ||
|
||
|
||
LOW_SPEED_FACTOR = 200 | ||
JERK_THRESHOLD = 0.2 | ||
|
||
|
||
class LatControlTorque(LatControl): | ||
def __init__(self, CP, CI): | ||
super().__init__(CP, CI) | ||
self.pid = PIDController(CP.lateralTuning.torque.kp, CP.lateralTuning.torque.ki, | ||
k_f=CP.lateralTuning.torque.kf, pos_limit=1.0, neg_limit=-1.0) | ||
self.get_steer_feedforward = CI.get_steer_feedforward_function() | ||
self.steer_max = 1.0 | ||
self.pid.pos_limit = self.steer_max | ||
self.pid.neg_limit = -self.steer_max | ||
self.use_steering_angle = CP.lateralTuning.torque.useSteeringAngle | ||
self.friction = CP.lateralTuning.torque.friction | ||
|
||
def reset(self): | ||
super().reset() | ||
self.pid.reset() | ||
|
||
def update(self, active, CS, CP, VM, params, last_actuators, desired_curvature, desired_curvature_rate, llk): | ||
pid_log = log.ControlsState.LateralTorqueState.new_message() | ||
|
||
if CS.vEgo < MIN_STEER_SPEED or not active: | ||
output_torque = 0.0 | ||
pid_log.active = False | ||
self.pid.reset() | ||
else: | ||
if self.use_steering_angle: | ||
actual_curvature = -VM.calc_curvature(math.radians(CS.steeringAngleDeg - params.angleOffsetDeg), CS.vEgo, params.roll) | ||
else: | ||
actual_curvature = llk.angularVelocityCalibrated.value[2] / CS.vEgo | ||
desired_lateral_accel = desired_curvature * CS.vEgo**2 | ||
desired_lateral_jerk = desired_curvature_rate * CS.vEgo**2 | ||
actual_lateral_accel = actual_curvature * CS.vEgo**2 | ||
|
||
setpoint = desired_lateral_accel + LOW_SPEED_FACTOR * desired_curvature | ||
measurement = actual_lateral_accel + LOW_SPEED_FACTOR * actual_curvature | ||
error = setpoint - measurement | ||
pid_log.error = error | ||
|
||
ff = desired_lateral_accel - params.roll * ACCELERATION_DUE_TO_GRAVITY | ||
output_torque = self.pid.update(error, | ||
override=CS.steeringPressed, feedforward=ff, | ||
speed=CS.vEgo, | ||
freeze_integrator=CS.steeringRateLimited) | ||
|
||
friction_compensation = interp(desired_lateral_jerk, [-JERK_THRESHOLD, JERK_THRESHOLD], [-self.friction, self.friction]) | ||
output_torque += friction_compensation | ||
|
||
pid_log.active = True | ||
pid_log.p = self.pid.p | ||
pid_log.i = self.pid.i | ||
pid_log.d = self.pid.d | ||
pid_log.f = self.pid.f | ||
pid_log.output = -output_torque | ||
pid_log.saturated = self._check_saturation(self.steer_max - abs(output_torque) < 1e-3, CS) | ||
|
||
#TODO left is positive in this convention | ||
return -output_torque, 0.0, pid_log |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters