Skip to content

Commit 25b08df

Browse files
committed
add derivative to torque controller with live tuning
1 parent 199f31b commit 25b08df

File tree

4 files changed

+22
-8
lines changed

4 files changed

+22
-8
lines changed

common/op_params.py

+1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ def __init__(self):
9999

100100
self.fork_params = {
101101
# 'camera_offset': Param(-0.04 if TICI else 0.06, NUMBER, 'Your camera offset to use in lane_planner.py, live=True),
102+
'torque_derivative': Param(5.0, NUMBER, 'Derivative used in the lateral torque controller', live=True),
102103
'global_df_mod': Param(1.0, NUMBER, 'The multiplier for the current distance used by dynamic follow. The range is limited from 0.85 to 2.5\n'
103104
'Smaller values will get you closer, larger will get you farther\n'
104105
'This is multiplied by any profile that\'s active. Set to 1. to disable', live=True),

selfdrive/car/toyota/tunes.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,14 @@ def set_long_tune(tune, name):
5353

5454

5555
###### LAT ######
56-
def set_lat_tune(tune, name, params, MAX_LAT_ACCEL=2.5, FRICTION=.1, kif=(1.0, 0.1, 1.0)):
56+
def set_lat_tune(tune, name, params, MAX_LAT_ACCEL=2.5, FRICTION=.1):
5757
if name == LatTunes.TORQUE:
5858
tune.init('torque')
5959
tune.torque.useSteeringAngle = True
60-
tune.torque.kp = kif[0] / MAX_LAT_ACCEL
61-
tune.torque.kf = kif[2] / MAX_LAT_ACCEL
62-
tune.torque.ki = kif[1] / MAX_LAT_ACCEL
60+
tune.torque.kp = 1.0 / MAX_LAT_ACCEL
61+
tune.torque.kf = 1.0 / MAX_LAT_ACCEL
62+
tune.torque.ki = 0.1 / MAX_LAT_ACCEL
63+
tune.torque.kd = 5.0 / MAX_LAT_ACCEL
6364
tune.torque.friction = FRICTION
6465

6566
elif name == LatTunes.INDI_PRIUS:

selfdrive/controls/lib/latcontrol_torque.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from collections import deque
12
import math
23

34
from cereal import log
@@ -6,6 +7,8 @@
67
from selfdrive.controls.lib.pid import PIDController
78
from selfdrive.controls.lib.vehicle_model import ACCELERATION_DUE_TO_GRAVITY
89

10+
from common.op_params import opParams
11+
912
# At higher speeds (25+mph) we can assume:
1013
# Lateral acceleration achieved by a specific car correlates to
1114
# torque applied to the steering rack. It does not correlate to
@@ -31,6 +34,8 @@ def __init__(self, CP, CI):
3134
self.use_steering_angle = CP.lateralTuning.torque.useSteeringAngle
3235
self.friction = CP.lateralTuning.torque.friction
3336
self.kf = CP.lateralTuning.torque.kf
37+
self.op_params = opParams()
38+
self.errors = deque([0] * 10, maxlen=10) # 10 frames
3439

3540
def reset(self):
3641
super().reset()
@@ -55,19 +60,26 @@ def update(self, active, CS, VM, params, last_actuators, desired_curvature, desi
5560

5661
setpoint = desired_lateral_accel + LOW_SPEED_FACTOR * desired_curvature
5762
measurement = actual_lateral_accel + LOW_SPEED_FACTOR * actual_curvature
63+
5864
error = setpoint - measurement
59-
pid_log.error = error
65+
error_rate = (error - self.errors[0]) / len(self.errors)
66+
self.errors.append(error)
67+
# live tune for now
68+
self.pid.k_d = self.op_params.get('torque_derivative')
6069

6170
ff = desired_lateral_accel - params.roll * ACCELERATION_DUE_TO_GRAVITY
6271
# convert friction into lateral accel units for feedforward
6372
friction_compensation = interp(desired_lateral_jerk, [-JERK_THRESHOLD, JERK_THRESHOLD], [-self.friction, self.friction])
6473
ff += friction_compensation / self.kf
6574
output_torque = self.pid.update(error,
75+
error_rate=error_rate,
6676
override=CS.steeringPressed, feedforward=ff,
6777
speed=CS.vEgo,
6878
freeze_integrator=CS.steeringRateLimited)
6979

7080
pid_log.active = True
81+
pid_log.error = error
82+
pid_log.error_rate = error_rate
7183
pid_log.p = self.pid.p
7284
pid_log.i = self.pid.i
7385
pid_log.d = self.pid.d

selfdrive/controls/lib/pid.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ def k_p(self):
3434
def k_i(self):
3535
return interp(self.speed, self._k_i[0], self._k_i[1])
3636

37-
@property
38-
def k_d(self):
39-
return interp(self.speed, self._k_d[0], self._k_d[1])
37+
# @property
38+
# def k_d(self):
39+
# return interp(self.speed, self._k_d[0], self._k_d[1])
4040

4141
@property
4242
def error_integral(self):

0 commit comments

Comments
 (0)