forked from commaai/openpilot
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Lateral torque-based control with roll on TSS2 corolla and TSSP rav4 (c…
…ommaai#24260) * Initial commit * Fix bugs * Need more torque rate * Cleanup cray cray control * Write nicely * Chiiil * Not relevant for cray cray control * Do some logging * Seems like it has more torque than I thought * Bit more feedforward * Tune change * Retune * Retune * Little more chill * Add coroll * Add corolla * Give craycray a good name * Update to proper logging * D to the PI * Should be in radians * Add d * Start oscillations * Add D term * Only change torque rate limits for new tune * Add d logging * Should be enough * Wrong sign in D * Downtune a little * Needed to prevent faults * Add lqr rav4 to tune * Try derivative again * Data based retune * Data based retune * add friction compensation * Doesnt need too much P with friction comp * remove lqr * Remove kd * Fix tests * fix tests * Too much error * Get roll induced error under 1cm/deg * Too much jitter * Do roll comp * Add ki * Final update * Update refs * Cleanup latcontrol_torque a little more
- Loading branch information
1 parent
9fc2b2b
commit 33e00f6
Showing
16 changed files
with
120 additions
and
123 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
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 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 |
Oops, something went wrong.