Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

longitudinal personality: change via steering wheel distance button #31792

Merged
merged 62 commits into from
Mar 13, 2024
Merged
Show file tree
Hide file tree
Changes from 49 commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
7b83134
start at param
sshane Mar 7, 2024
c7d1282
start by sending personality
sshane Mar 7, 2024
ef127aa
change to personality
sshane Mar 7, 2024
180b46b
POC: button changes personality
sshane Mar 7, 2024
1c0534d
what's wrong with this?
sshane Mar 7, 2024
e116f20
fix
sshane Mar 7, 2024
ef3d1dc
not really possible but fuzzy test catches this
sshane Mar 7, 2024
c905c23
there's always a typo
sshane Mar 7, 2024
c66c6fa
dang, we're dropping messages
sshane Mar 7, 2024
6af6057
Merge remote-tracking branch 'upstream/master' into disp-personality
sshane Mar 7, 2024
b58dac3
clean up
sshane Mar 7, 2024
b36e3c0
no comment
sshane Mar 7, 2024
eb020e6
Merge remote-tracking branch 'upstream/master' into disp-personality
sshane Mar 8, 2024
1835927
bump
sshane Mar 8, 2024
11dfeb0
rename
sshane Mar 8, 2024
0885b7f
Merge remote-tracking branch 'upstream/master' into person-changing
sshane Mar 8, 2024
fcd250c
Merge remote-tracking branch 'upstream/master' into person-changing
sshane Mar 9, 2024
a506ad1
not all cars yet
sshane Mar 9, 2024
dd9c6b7
works but at what cost
sshane Mar 9, 2024
82bd430
clean up
sshane Mar 9, 2024
5ead6e2
inside settings
sshane Mar 9, 2024
0f93c04
write param so we save the distance button changes
sshane Mar 9, 2024
cb8dc63
setChecked activates buttonToggled and already writes param!
sshane Mar 9, 2024
30c8e5c
don't need this, we update from longitudinalPlan on changes
sshane Mar 9, 2024
e90f610
some clean up
sshane Mar 9, 2024
28c0efe
more
sshane Mar 9, 2024
c4d270e
ui
sshane Mar 9, 2024
14ef62b
allow some time for ui to receive and write param
sshane Mar 9, 2024
2b081aa
plannerd: only track changes in case no ui
sshane Mar 9, 2024
c38b541
Revert "plannerd: only track changes in case no ui"
sshane Mar 9, 2024
296ca6a
write in plannerd as well, I assume this is atomic?
sshane Mar 9, 2024
5a61c9f
don't write when setting checked (only user clicks)
sshane Mar 9, 2024
4ffbc29
better nane
sshane Mar 9, 2024
12fea05
more
sshane Mar 10, 2024
9f0d8fd
Update selfdrive/controls/lib/longitudinal_planner.py
sshane Mar 10, 2024
a4d1b54
doesn't write param now
sshane Mar 10, 2024
1589e08
ParamWatcher is nice
sshane Mar 10, 2024
2424e13
no debug
sshane Mar 10, 2024
6af3f79
Merge remote-tracking branch 'upstream/master' into person-changing
sshane Mar 10, 2024
1ace07e
Update translations
sshane Mar 10, 2024
2fceafa
fix
sshane Mar 10, 2024
29b70b3
odd drain sock proc replay behavior
sshane Mar 10, 2024
9a284e3
Merge remote-tracking branch 'upstream/master' into person-changing
sshane Mar 10, 2024
787db54
vanish
sshane Mar 10, 2024
8368cb6
Revert "odd drain sock proc replay behavior"
sshane Mar 10, 2024
62eb33b
add GM
sshane Mar 10, 2024
45298d9
only if OP long
sshane Mar 10, 2024
0648065
move personality to controlsState, since eventually it won't be exclu…
sshane Mar 10, 2024
47c6452
diff without translations
sshane Mar 10, 2024
9b0df58
fix
sshane Mar 10, 2024
1c88f7d
Merge remote-tracking branch 'upstream/master' into person-changing
sshane Mar 12, 2024
c47f157
put nonblocking
sshane Mar 12, 2024
27d5900
CS should start at up to date personality always (no ui flicker)
sshane Mar 12, 2024
6d11409
update toggle on cereal message change
sshane Mar 12, 2024
a959a76
fix
sshane Mar 12, 2024
ad11f49
fix that
sshane Mar 12, 2024
f928161
Merge remote-tracking branch 'upstream/master' into person-changing
sshane Mar 13, 2024
31c5c17
ubmp
sshane Mar 13, 2024
72948c6
mypy doesn't know this is an int :(
sshane Mar 13, 2024
a46abef
update translations
sshane Mar 13, 2024
e10a3a1
fix the tests
sshane Mar 13, 2024
5c781f9
Merge remote-tracking branch 'upstream/master' into person-changing
sshane Mar 13, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cereal
2 changes: 1 addition & 1 deletion selfdrive/car/gm/carcontroller.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ def update(self, CC, CS, now_nanos):
# Send dashboard UI commands (ACC status)
send_fcw = hud_alert == VisualAlert.fcw
can_sends.append(gmcan.create_acc_dashboard_command(self.packer_pt, CanBus.POWERTRAIN, CC.enabled,
hud_v_cruise * CV.MS_TO_KPH, hud_control.leadVisible, send_fcw))
hud_v_cruise * CV.MS_TO_KPH, hud_control, send_fcw))

# Radar needs to know current speed and yaw rate (50hz),
# and that ADAS is alive (10hz)
Expand Down
6 changes: 3 additions & 3 deletions selfdrive/car/gm/gmcan.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,17 +102,17 @@ def create_friction_brake_command(packer, bus, apply_brake, idx, enabled, near_s
return packer.make_can_msg("EBCMFrictionBrakeCmd", bus, values)


def create_acc_dashboard_command(packer, bus, enabled, target_speed_kph, lead_car_in_sight, fcw):
def create_acc_dashboard_command(packer, bus, enabled, target_speed_kph, hud_control, fcw):
target_speed = min(target_speed_kph, 255)

values = {
"ACCAlwaysOne": 1,
"ACCResumeButton": 0,
"ACCSpeedSetpoint": target_speed,
"ACCGapLevel": 3 * enabled, # 3 "far", 0 "inactive"
"ACCGapLevel": hud_control.leadDistanceBars * enabled, # 3 "far", 0 "inactive"
"ACCCmdActive": enabled,
"ACCAlwaysOne2": 1,
"ACCLeadCar": lead_car_in_sight,
"ACCLeadCar": hud_control.leadVisible,
"FCWAlert": 0x3 if fcw else 0
}

Expand Down
12 changes: 12 additions & 0 deletions selfdrive/controls/controlsd.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ def __init__(self, CI=None):
self.steer_limited = False
self.desired_curvature = 0.0
self.experimental_mode = False
self.personality = log.LongitudinalPersonality.standard
self.v_cruise_helper = VCruiseHelper(self.CP)
self.recalibrating_seen = False

Expand Down Expand Up @@ -650,6 +651,12 @@ def state_control(self, CS):
cloudlog.error(f"actuators.{p} not finite {actuators.to_dict()}")
setattr(actuators, p, 0.0)

# decrement personality on distance button press
if self.CP.openpilotLongitudinalControl:
if any(not be.pressed and be.type == ButtonType.gapAdjustCruise for be in CS.buttonEvents):
self.personality = (self.personality - 1) % 3
self.params.put('LongitudinalPersonality', str(self.personality))
sshane marked this conversation as resolved.
Show resolved Hide resolved

return CC, lac_log

def publish_logs(self, CS, start_time, CC, lac_log):
Expand Down Expand Up @@ -769,6 +776,7 @@ def publish_logs(self, CS, start_time, CC, lac_log):
controlsState.forceDecel = bool(force_decel)
controlsState.canErrorCounter = self.card.can_rcv_cum_timeout_counter
controlsState.experimentalMode = self.experimental_mode
controlsState.personality = self.personality

lat_tuning = self.CP.lateralTuning.which()
if self.joystick_mode:
Expand Down Expand Up @@ -825,6 +833,10 @@ def params_thread(self, evt):
while not evt.is_set():
self.is_metric = self.params.get_bool("IsMetric")
self.experimental_mode = self.params.get_bool("ExperimentalMode") and self.CP.openpilotLongitudinalControl
try:
self.personality = int(self.params.get('LongitudinalPersonality'))
except (ValueError, TypeError):
self.personality = log.LongitudinalPersonality.standard
if self.CP.notCar:
self.joystick_mode = self.params.get_bool("JoystickDebugMode")
time.sleep(0.1)
Expand Down
20 changes: 2 additions & 18 deletions selfdrive/controls/lib/longitudinal_planner.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
import math
import numpy as np
from openpilot.common.numpy_fast import clip, interp
from openpilot.common.params import Params
from cereal import log

import cereal.messaging as messaging
from openpilot.common.conversions import Conversions as CV
Expand Down Expand Up @@ -61,16 +59,6 @@ def __init__(self, CP, init_v=0.0, init_a=0.0, dt=DT_MDL):
self.a_desired_trajectory = np.zeros(CONTROL_N)
self.j_desired_trajectory = np.zeros(CONTROL_N)
self.solverExecutionTime = 0.0
self.params = Params()
self.param_read_counter = 0
self.personality = log.LongitudinalPersonality.standard
self.read_param()

def read_param(self):
try:
self.personality = int(self.params.get('LongitudinalPersonality'))
except (ValueError, TypeError):
self.personality = log.LongitudinalPersonality.standard

@staticmethod
def parse_model(model_msg, model_error):
Expand All @@ -89,9 +77,6 @@ def parse_model(model_msg, model_error):
return x, v, a, j

def update(self, sm):
if self.param_read_counter % 50 == 0:
self.read_param()
self.param_read_counter += 1
sshane marked this conversation as resolved.
Show resolved Hide resolved
self.mpc.mode = 'blended' if sm['controlsState'].experimentalMode else 'acc'

v_ego = sm['carState'].vEgo
Expand Down Expand Up @@ -130,11 +115,11 @@ def update(self, sm):
accel_limits_turns[0] = min(accel_limits_turns[0], self.a_desired + 0.05)
accel_limits_turns[1] = max(accel_limits_turns[1], self.a_desired - 0.05)

self.mpc.set_weights(prev_accel_constraint, personality=self.personality)
self.mpc.set_weights(prev_accel_constraint, personality=sm['controlsState'].personality)
self.mpc.set_accel_limits(accel_limits_turns[0], accel_limits_turns[1])
self.mpc.set_cur_state(self.v_desired_filter.x, self.a_desired)
x, v, a, j = self.parse_model(sm['modelV2'], self.v_model_error)
self.mpc.update(sm['radarState'], v_cruise, x, v, a, j, personality=self.personality)
self.mpc.update(sm['radarState'], v_cruise, x, v, a, j, personality=sm['controlsState'].personality)

self.v_desired_trajectory_full = np.interp(ModelConstants.T_IDXS, T_IDXS_MPC, self.mpc.v_solution)
self.a_desired_trajectory_full = np.interp(ModelConstants.T_IDXS, T_IDXS_MPC, self.mpc.a_solution)
Expand Down Expand Up @@ -170,6 +155,5 @@ def publish(self, sm, pm):
longitudinalPlan.fcw = self.fcw

longitudinalPlan.solverExecutionTime = self.mpc.solve_time
longitudinalPlan.personality = self.personality

pm.send('longitudinalPlan', plan_send)
14 changes: 13 additions & 1 deletion selfdrive/ui/qt/offroad/settings.cc
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,21 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) {
std::vector<QString> longi_button_texts{tr("Aggressive"), tr("Standard"), tr("Relaxed")};
long_personality_setting = new ButtonParamControl("LongitudinalPersonality", tr("Driving Personality"),
tr("Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. "
"In relaxed mode openpilot will stay further away from lead cars."),
"In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with "
"your steering wheel distance button."),
"../assets/offroad/icon_speed_limit.png",
longi_button_texts);

// Watch param to update the personality setting in the UI
ParamWatcher *lp_watch = new ParamWatcher(this);
lp_watch->addParam("LongitudinalPersonality");
QObject::connect(lp_watch, &ParamWatcher::paramChanged, [=](const QString &param_name, const QString &param_value) {
lp_watch->addParam("LongitudinalPersonality");
sshane marked this conversation as resolved.
Show resolved Hide resolved
if (isVisible()) {
long_personality_setting->refresh();
}
});

for (auto &[param, title, desc, icon] : toggle_defs) {
auto toggle = new ParamControl(param, title, desc, icon, this);

Expand Down
9 changes: 9 additions & 0 deletions selfdrive/ui/qt/widgets/controls.h
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,15 @@ class ButtonParamControl : public AbstractControl {
}
}

void refresh() {
int value = atoi(params.get(key).c_str());
button_group->button(value)->setChecked(true);
}

void showEvent(QShowEvent *event) override {
refresh();
}

private:
std::string key;
Params params;
Expand Down
Loading