Skip to content

Commit 6880aac

Browse files
GernbySippieCup
authored andcommitted
Add fast angle bias (#11)
* fixed pathplanner * fixed bias * Remove multi-stacking of angle-offset The existing pathplanner bug results in the previous desired angle being stacked on top of the previous desired angle before the actual angle has time to catch up. Since the desired angle currently includes the angle offset and bias, these values get stacked onto the desired angle also. This results in a tsunami wave of torque favoring the offset / bias. * The same angle / bias should be applied to both * This item was correct * Reverted both changes to offset * Fix timeout in longitudinal test (#772) * Fix timeout in longitudinal test * Update hyundaican for Correct Message ID on LKAS11 (#746) This is the only trace of CF_Lkas_Icon found under /car/hyundai relative to open .dbc commaai/opendbc#172 * Revert "Update hyundaican for Correct Message ID on LKAS11 (#746)" (#775) This reverts commit 1f1893a. * Correct Message ID on LKAS11 under Openpilot .dbc (#747) commaai/opendbc#172 * Revert "Revert "Update hyundaican for Correct Message ID on LKAS11 (#746)" (#775)" This reverts commit d5242c5. * fixed cur_state.delta * Revert "fixed cur_state.delta" This reverts commit 227dccd3596594a8d7162a46c9fb771b9f6b6d75. * fixed cur_state.delta * added fast angle bias * fixed merge conflict
1 parent 09fcb9b commit 6880aac

File tree

4 files changed

+18
-14
lines changed

4 files changed

+18
-14
lines changed

selfdrive/controls/controlsd.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/usr/bin/env python
2+
import os
23
import gc
34
import capnp
45
from cereal import car, log
@@ -206,7 +207,7 @@ def state_transition(frame, CS, CP, state, events, soft_disable_timer, v_cruise_
206207
return state, soft_disable_timer, v_cruise_kph, v_cruise_kph_last
207208

208209

209-
def state_control(frame, rcv_frame, plan, path_plan, CS, CP, state, events, v_cruise_kph, v_cruise_kph_last,
210+
def state_control(frame, rcv_frame, plan, path_plan, live_params, CS, CP, state, events, v_cruise_kph, v_cruise_kph_last,
210211
AM, rk, driver_status, LaC, LoC, VM, read_only, is_metric, cal_perc):
211212
"""Given the state, this function returns an actuators packet"""
212213

@@ -255,7 +256,7 @@ def state_control(frame, rcv_frame, plan, path_plan, CS, CP, state, events, v_cr
255256
v_cruise_kph, v_acc_sol, plan.vTargetFuture, a_acc_sol, CP)
256257
# Steering PID loop and lateral MPC
257258
actuators.steer, actuators.steerAngle, lac_log = LaC.update(active, CS.vEgo, CS.steeringAngle, CS.steeringRate,
258-
CS.steeringPressed, CP, VM, path_plan)
259+
CS.steeringPressed, CP, VM, path_plan, live_params)
259260

260261
# Send a "steering required alert" if saturation count has reached the limit
261262
if LaC.sat_flag and CP.steerLimitAlert:
@@ -427,7 +428,7 @@ def controlsd_thread(gctx=None):
427428
is_metric = params.get("IsMetric") == "1"
428429
passive = params.get("Passive") != "0"
429430

430-
sm = messaging.SubMaster(['thermal', 'health', 'liveCalibration', 'driverMonitoring', 'plan', 'pathPlan'])
431+
sm = messaging.SubMaster(['thermal', 'health', 'liveCalibration', 'driverMonitoring', 'plan', 'pathPlan', 'liveParameters'])
431432

432433
logcan = messaging.sub_sock(service_list['can'].port)
433434

@@ -440,7 +441,8 @@ def controlsd_thread(gctx=None):
440441
logcan.close()
441442

442443
# TODO: Use the logcan socket from above, but that will currenly break the tests
443-
can_sock = messaging.sub_sock(service_list['can'].port, timeout=100)
444+
can_timeout = None if os.environ.get('NO_CAN_TIMEOUT', False) else 100
445+
can_sock = messaging.sub_sock(service_list['can'].port, timeout=can_timeout)
444446

445447
car_recognized = CP.carName != 'mock'
446448
# If stock camera is disconnected, we loaded car controls and it's not chffrplus
@@ -529,7 +531,7 @@ def controlsd_thread(gctx=None):
529531

530532
# Compute actuators (runs PID loops and lateral MPC)
531533
actuators, v_cruise_kph, driver_status, v_acc, a_acc, lac_log = \
532-
state_control(sm.frame, sm.rcv_frame, sm['plan'], sm['pathPlan'], CS, CP, state, events, v_cruise_kph, v_cruise_kph_last, AM, rk,
534+
state_control(sm.frame, sm.rcv_frame, sm['plan'], sm['pathPlan'], sm['liveParameters'], CS, CP, state, events, v_cruise_kph, v_cruise_kph_last, AM, rk,
533535
driver_status, LaC, LoC, VM, read_only, is_metric, cal_perc)
534536

535537
rk.keep_time(1. / 10000) # Run at 100Hz

selfdrive/controls/lib/latcontrol_pid.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def __init__(self, CP):
1414
def reset(self):
1515
self.pid.reset()
1616

17-
def update(self, active, v_ego, angle_steers, angle_steers_rate, steer_override, CP, VM, path_plan):
17+
def update(self, active, v_ego, angle_steers, angle_steers_rate, steer_override, CP, VM, path_plan, live_params):
1818
pid_log = log.ControlsState.LateralPIDState.new_message()
1919
pid_log.steerAngle = float(angle_steers)
2020
pid_log.steerRate = float(angle_steers_rate)
@@ -24,7 +24,8 @@ def update(self, active, v_ego, angle_steers, angle_steers_rate, steer_override,
2424
pid_log.active = False
2525
self.pid.reset()
2626
else:
27-
self.angle_steers_des = path_plan.angleSteers # get from MPC/PathPlanner
27+
angle_bias = live_params.angleOffset - live_params.angleOffsetAverage
28+
self.angle_steers_des = path_plan.angleSteers + angle_bias # get from MPC/PathPlanner
2829

2930
steers_max = get_steer_max(CP, v_ego)
3031
self.pid.pos_limit = steers_max

selfdrive/controls/lib/pathplanner.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,11 @@ def setup_mpc(self, steer_rate_cost):
5757
def update(self, sm, CP, VM):
5858
v_ego = sm['carState'].vEgo
5959
angle_steers = sm['carState'].steeringAngle
60+
#angle_steers_des = sm['controlsState'].angleSteersDes
6061
active = sm['controlsState'].active
6162

6263
angle_offset_average = sm['liveParameters'].angleOffsetAverage
63-
angle_offset_bias = sm['controlsState'].angleModelBias + angle_offset_average
64+
angle_offset = sm['liveParameters'].angleOffset
6465

6566
self.MP.update(v_ego, sm['model'],sm['carState'])
6667

@@ -73,7 +74,7 @@ def update(self, sm, CP, VM):
7374
self.p_poly = list(self.MP.p_poly)
7475

7576
# account for actuation delay
76-
self.cur_state = calc_states_after_delay(self.cur_state, v_ego, angle_steers - angle_offset_average, curvature_factor, VM.sR, CP.steerActuatorDelay, CP.eonToFront)
77+
self.cur_state = calc_states_after_delay(self.cur_state, v_ego, angle_steers - angle_offset, curvature_factor, VM.sR, CP.steerActuatorDelay, CP.eonToFront)
7778

7879
v_ego_mpc = max(v_ego, 5.0) # avoid mpc roughness due to low speed
7980
self.libmpc.run_mpc(self.cur_state, self.mpc_solution,
@@ -85,19 +86,19 @@ def update(self, sm, CP, VM):
8586
delta_desired = self.mpc_solution[0].delta[1]
8687
rate_desired = math.degrees(self.mpc_solution[0].rate[0] * VM.sR)
8788
else:
88-
delta_desired = math.radians(angle_steers - angle_offset_bias) / VM.sR
89+
delta_desired = math.radians(angle_steers - angle_offset) / VM.sR
8990
rate_desired = 0.0
9091

9192
self.cur_state[0].delta = delta_desired
9293

93-
self.angle_steers_des_mpc = float(math.degrees(delta_desired * VM.sR) + angle_offset_bias)
94+
self.angle_steers_des_mpc = float(math.degrees(delta_desired * VM.sR) + angle_offset_average)
9495

9596
# Check for infeasable MPC solution
9697
mpc_nans = np.any(np.isnan(list(self.mpc_solution[0].delta)))
9798
t = sec_since_boot()
9899
if mpc_nans:
99100
self.libmpc.init(MPC_COST_LAT.PATH, MPC_COST_LAT.LANE, MPC_COST_LAT.HEADING, CP.steerRateCost)
100-
self.cur_state[0].delta = math.radians(angle_steers - angle_offset_bias) / VM.sR
101+
self.cur_state[0].delta = math.radians(angle_steers - angle_offset) / VM.sR
101102

102103
if t > self.last_cloudlog_t + 5.0:
103104
self.last_cloudlog_t = t

selfdrive/locationd/paramsd.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,8 @@ int main(int argc, char *argv[]) {
140140
double angle_offset_degrees = RADIANS_TO_DEGREES * learner.ao;
141141
double angle_offset_average_degrees = RADIANS_TO_DEGREES * learner.slow_ao;
142142

143-
// Send parameters at 10 Hz
144-
if (save_counter % 10 == 0){
143+
// Send parameters at 100 Hz
144+
if (save_counter % 1 == 0){
145145
capnp::MallocMessageBuilder msg;
146146
cereal::Event::Builder event = msg.initRoot<cereal::Event>();
147147
event.setLogMonoTime(nanos_since_boot());

0 commit comments

Comments
 (0)