Compare commits

...

6 Commits

Author SHA1 Message Date
Kumar
ac65fb5f54 Update accel_controller.py 2025-02-04 05:29:52 -07:00
Kumar
801a17edea suggestions 2025-02-01 23:29:53 -07:00
Kumar
f4f48ee55c update tune 2025-02-01 17:33:52 -07:00
rav4kumar
8bddfda0dd fix linter 2025-01-31 20:29:58 -07:00
rav4kumar
a9aa92bfcf static 2025-01-31 20:27:31 -07:00
rav4kumar
a29714a610 init accel personality 2025-01-24 22:51:57 -07:00
21 changed files with 417 additions and 6 deletions

View File

@@ -87,6 +87,7 @@ struct ModelManagerSP @0xaedffd8f31e7b55d {
struct LongitudinalPlanSP @0xf35cc4560bbf6ec2 {
dec @0 :DynamicExperimentalControl;
accelPersonality @1 :AccelerationPersonality;
struct DynamicExperimentalControl {
state @0 :DynamicExperimentalControlState;
@@ -98,6 +99,13 @@ struct LongitudinalPlanSP @0xf35cc4560bbf6ec2 {
blended @1;
}
}
enum AccelerationPersonality {
sport @0;
normal @1;
eco @2;
stock @3;
}
}
struct OnroadEventSP @0xda96579883444c35 {

View File

@@ -236,6 +236,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"HyundaiRadarTracksToggle", PERSISTENT},
{"DynamicExperimentalControl", PERSISTENT},
{"AccelPersonality", PERSISTENT},
};
} // namespace

View File

@@ -141,6 +141,9 @@ class LongitudinalPlanner(LongitudinalPlannerSP):
accel_limits = [ACCEL_MIN, ACCEL_MAX]
accel_limits_turns = [ACCEL_MIN, ACCEL_MAX]
if (accel_control := self.compute_accel_limits(v_ego, sm, self.CP)):
accel_limits, accel_limits_turns = accel_control
if reset_state:
self.v_desired_filter.x = v_ego
# Clip aEgo to cruise limits to prevent large accelerations when becoming active

View File

@@ -87,6 +87,16 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) {
"../assets/offroad/icon_speed_limit.png",
longi_button_texts);
// accel controller
std::vector<QString> accel_personality_texts{tr("Sport"), tr("Normal"), tr("Eco"), tr("Stock")};
accel_personality_setting = new ButtonParamControlSP("AccelPersonality", tr("Acceleration Personality"),
tr("Normal is recommended. In sport mode, sunnypilot will provide aggressive acceleration for a dynamic driving experience. "
"In eco mode, sunnypilot will apply smoother and more relaxed acceleration. On supported cars, you can cycle through these "
"acceleration personality within Onroad Settings on the driving screen."),
"",
accel_personality_texts);
accel_personality_setting->showDescription();
// set up uiState update for personality setting
QObject::connect(uiState(), &UIState::uiUpdate, this, &TogglesPanel::updateState);
@@ -102,6 +112,7 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) {
// insert longitudinal personality after NDOG toggle
if (param == "DisengageOnAccelerator") {
addItem(long_personality_setting);
addItem(accel_personality_setting);
}
}
@@ -127,6 +138,13 @@ void TogglesPanel::updateState(const UIState &s) {
}
uiState()->scene.personality = personality;
}
if (sm.updated("longitudinalPlanSP")) {
auto accel_personality = sm["longitudinalPlanSP"].getLongitudinalPlanSP().getAccelPersonality();
if (accel_personality != s.scene.accel_personality && s.scene.started && isVisible()) {
accel_personality_setting->setCheckedButton(static_cast<int>(accel_personality));
}
uiState()->scene.accel_personality = accel_personality;
}
}
void TogglesPanel::expandToggleDescription(const QString &param) {
@@ -169,10 +187,12 @@ void TogglesPanel::updateToggles() {
experimental_mode_toggle->setEnabled(true);
experimental_mode_toggle->setDescription(e2e_description);
long_personality_setting->setEnabled(true);
accel_personality_setting->setEnabled(true);
} else {
// no long for now
experimental_mode_toggle->setEnabled(false);
long_personality_setting->setEnabled(false);
accel_personality_setting->setEnabled(true);
params.remove("ExperimentalMode");
const QString unavailable = tr("Experimental mode is currently unavailable on this car since the car's stock ACC is used for longitudinal control.");

View File

@@ -83,6 +83,7 @@ protected:
Params params;
std::map<std::string, ParamControl*> toggles;
ButtonParamControl *long_personality_setting;
ButtonParamControl *accel_personality_setting;
virtual void updateToggles();
};

View File

@@ -1494,6 +1494,30 @@ This may take up to a minute.</source>
<source>Enable toggle to allow the model to determine when to use sunnypilot ACC or sunnypilot End to End Longitudinal.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sport</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Eco</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stock</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Acceleration Personality</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal is recommended. In sport mode, sunnypilot will provide aggressive acceleration for a dynamic driving experience. In eco mode, sunnypilot will apply smoother and more relaxed acceleration. On supported cars, you can cycle through these acceleration personality within Onroad Settings on the driving screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

View File

@@ -1478,6 +1478,30 @@ This may take up to a minute.</source>
<source>Enable toggle to allow the model to determine when to use sunnypilot ACC or sunnypilot End to End Longitudinal.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sport</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Eco</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stock</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Acceleration Personality</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal is recommended. In sport mode, sunnypilot will provide aggressive acceleration for a dynamic driving experience. In eco mode, sunnypilot will apply smoother and more relaxed acceleration. On supported cars, you can cycle through these acceleration personality within Onroad Settings on the driving screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

View File

@@ -1474,6 +1474,30 @@ Esto puede tardar un minuto.</translation>
<source>Enable toggle to allow the model to determine when to use sunnypilot ACC or sunnypilot End to End Longitudinal.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sport</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Eco</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stock</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Acceleration Personality</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal is recommended. In sport mode, sunnypilot will provide aggressive acceleration for a dynamic driving experience. In eco mode, sunnypilot will apply smoother and more relaxed acceleration. On supported cars, you can cycle through these acceleration personality within Onroad Settings on the driving screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

View File

@@ -1478,6 +1478,30 @@ Cela peut prendre jusqu&apos;à une minute.</translation>
<source>Enable toggle to allow the model to determine when to use sunnypilot ACC or sunnypilot End to End Longitudinal.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sport</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Eco</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stock</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Acceleration Personality</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal is recommended. In sport mode, sunnypilot will provide aggressive acceleration for a dynamic driving experience. In eco mode, sunnypilot will apply smoother and more relaxed acceleration. On supported cars, you can cycle through these acceleration personality within Onroad Settings on the driving screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

View File

@@ -1472,6 +1472,30 @@ This may take up to a minute.</source>
<source>Enable toggle to allow the model to determine when to use sunnypilot ACC or sunnypilot End to End Longitudinal.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sport</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Eco</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stock</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Acceleration Personality</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal is recommended. In sport mode, sunnypilot will provide aggressive acceleration for a dynamic driving experience. In eco mode, sunnypilot will apply smoother and more relaxed acceleration. On supported cars, you can cycle through these acceleration personality within Onroad Settings on the driving screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

View File

@@ -1474,6 +1474,30 @@ This may take up to a minute.</source>
<source>Enable toggle to allow the model to determine when to use sunnypilot ACC or sunnypilot End to End Longitudinal.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sport</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Eco</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stock</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Acceleration Personality</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal is recommended. In sport mode, sunnypilot will provide aggressive acceleration for a dynamic driving experience. In eco mode, sunnypilot will apply smoother and more relaxed acceleration. On supported cars, you can cycle through these acceleration personality within Onroad Settings on the driving screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

View File

@@ -1478,6 +1478,30 @@ Isso pode levar até um minuto.</translation>
<source>Enable toggle to allow the model to determine when to use sunnypilot ACC or sunnypilot End to End Longitudinal.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sport</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Eco</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stock</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Acceleration Personality</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal is recommended. In sport mode, sunnypilot will provide aggressive acceleration for a dynamic driving experience. In eco mode, sunnypilot will apply smoother and more relaxed acceleration. On supported cars, you can cycle through these acceleration personality within Onroad Settings on the driving screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

View File

@@ -1474,6 +1474,30 @@ This may take up to a minute.</source>
<source>Enable toggle to allow the model to determine when to use sunnypilot ACC or sunnypilot End to End Longitudinal.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sport</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Eco</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stock</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Acceleration Personality</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal is recommended. In sport mode, sunnypilot will provide aggressive acceleration for a dynamic driving experience. In eco mode, sunnypilot will apply smoother and more relaxed acceleration. On supported cars, you can cycle through these acceleration personality within Onroad Settings on the driving screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

View File

@@ -1472,6 +1472,30 @@ This may take up to a minute.</source>
<source>Enable toggle to allow the model to determine when to use sunnypilot ACC or sunnypilot End to End Longitudinal.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sport</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Eco</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stock</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Acceleration Personality</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal is recommended. In sport mode, sunnypilot will provide aggressive acceleration for a dynamic driving experience. In eco mode, sunnypilot will apply smoother and more relaxed acceleration. On supported cars, you can cycle through these acceleration personality within Onroad Settings on the driving screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

View File

@@ -1474,6 +1474,30 @@ This may take up to a minute.</source>
<source>Enable toggle to allow the model to determine when to use sunnypilot ACC or sunnypilot End to End Longitudinal.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sport</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Eco</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stock</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Acceleration Personality</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal is recommended. In sport mode, sunnypilot will provide aggressive acceleration for a dynamic driving experience. In eco mode, sunnypilot will apply smoother and more relaxed acceleration. On supported cars, you can cycle through these acceleration personality within Onroad Settings on the driving screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

View File

@@ -1474,6 +1474,30 @@ This may take up to a minute.</source>
<source>Enable toggle to allow the model to determine when to use sunnypilot ACC or sunnypilot End to End Longitudinal.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sport</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Eco</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Stock</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Acceleration Personality</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Normal is recommended. In sport mode, sunnypilot will provide aggressive acceleration for a dynamic driving experience. In eco mode, sunnypilot will apply smoother and more relaxed acceleration. On supported cars, you can cycle through these acceleration personality within Onroad Settings on the driving screen.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Updater</name>

View File

@@ -60,6 +60,7 @@ typedef struct UIScene {
cereal::PandaState::PandaType pandaType;
cereal::LongitudinalPersonality personality;
cereal::LongitudinalPlanSP::AccelerationPersonality accel_personality;
float light_sensor = -1;
bool started, ignition, is_metric;

View File

@@ -0,0 +1,106 @@
# The MIT License
#
# Copyright (c) 2019-, Rick Lan, dragonpilot community, and a number of other of contributors.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
# Last updated: August 12, 2024
from cereal import custom
from openpilot.common.numpy_fast import interp
from openpilot.common.realtime import DT_MDL
from openpilot.common.params import Params
#from openpilot.selfdrive.controls.lib.longitudinal_planner import limit_accel_in_turns
from opendbc.car.interfaces import ACCEL_MIN
AccelPersonality = custom.LongitudinalPlanSP.AccelerationPersonality
# Acceleration Profiles
_DP_CRUISE_MIN_V = {
AccelPersonality.eco: [-0.015, -0.015, -1.2, -1.2, -1.2, -1.2, -1.2, -1.2],
AccelPersonality.normal: [-0.018, -0.018, -1.2, -1.2, -1.2, -1.2, -1.2, -1.2],
AccelPersonality.sport: [-0.020, -0.020, -1.2, -1.2, -1.2, -1.2, -1.2, -1.2],
}
_DP_CRUISE_MAX_V = {
AccelPersonality.eco: [1.60, 1.60, 1.58, 1.58, 0.86, .532, .432, .32, .28, .085],
AccelPersonality.normal: [1.80, 1.80, 1.75, 1.75, 0.92, .65, .56, .36, .30, .12],
AccelPersonality.sport: [2.00, 2.00, 2.00, 2.00, 1.05, .79, .61, .42, .333, .2],
}
_DP_CRUISE_MIN_BP = [0., 2.0, 2.01, 15., 15.01, 20., 20.01, 40.]
_DP_CRUISE_MAX_BP = [0., 1., 6., 8., 11., 16, 20., 25., 30., 55.]
class AccelController:
def __init__(self):
self._params = Params()
self._personality = AccelPersonality.stock
self._frame = 0
def _read_params(self):
""" Reads the acceleration personality setting from persistent storage. """
if self._frame % int(1. / DT_MDL) == 0:
personality_str = self._params.get("AccelPersonality", encoding='utf-8')
if personality_str is not None:
personality_int = int(personality_str)
if personality_int in _DP_CRUISE_MIN_V:
self._personality = personality_int
# Print the current mode being used
print(f"Current Acceleration Personality Mode: {self._personality}")
def compute_accel_limits(self, v_ego: float, sm, CP) -> tuple[list[float], list[float]]:
""" Computes acceleration limits based on personality, turns, and DEC mode. """
self._read_params()
# Print the current mode being used
print(f"Current Acceleration Personality Mode: {self._personality}")
if self._personality == AccelPersonality.eco:
min_v = _DP_CRUISE_MIN_V[AccelPersonality.eco]
max_v = _DP_CRUISE_MAX_V[AccelPersonality.eco]
print("eco")
elif self._personality == AccelPersonality.sport:
min_v = _DP_CRUISE_MIN_V[AccelPersonality.sport]
max_v = _DP_CRUISE_MAX_V[AccelPersonality.sport]
print("sport")
else:
min_v = _DP_CRUISE_MIN_V[AccelPersonality.normal]
max_v = _DP_CRUISE_MAX_V[AccelPersonality.normal]
print("normal")
a_cruise_min = interp(v_ego, _DP_CRUISE_MIN_BP, min_v)
a_cruise_max = interp(v_ego, _DP_CRUISE_MAX_BP, max_v)
# Determine acceleration mode
accel_limits = [ACCEL_MIN, a_cruise_max] if CP.radarUnavailable else [a_cruise_min, a_cruise_max]
# Adjust acceleration for turns
#steer_angle = sm['carState'].steeringAngleDeg - sm['liveParameters'].angleOffsetDeg
# Ensure accel_limits_turns is a valid list/tuple here
accel_limits_turns = accel_limits # This is temporary if limit_accel_in_turns is not defined
return accel_limits, accel_limits_turns
def is_enabled(self) -> bool:
""" Returns True if AccelController is actively modifying acceleration limits. """
return bool(self._personality != AccelPersonality.stock)
def update(self):
""" Updates the internal frame counter. """
self._frame += 1

View File

@@ -8,6 +8,7 @@ See the LICENSE.md file in the root directory for more details.
from cereal import messaging, custom
from opendbc.car import structs
from openpilot.sunnypilot.selfdrive.controls.lib.dec.dec import DynamicExperimentalController
from openpilot.sunnypilot.selfdrive.controls.lib.accel_personality.accel_controller import AccelController
DecState = custom.LongitudinalPlanSP.DynamicExperimentalControl.DynamicExperimentalControlState
@@ -15,19 +16,24 @@ DecState = custom.LongitudinalPlanSP.DynamicExperimentalControl.DynamicExperimen
class LongitudinalPlannerSP:
def __init__(self, CP: structs.CarParams, mpc):
self.dec = DynamicExperimentalController(CP, mpc)
self.accel_controller = AccelController()
def get_mpc_mode(self) -> str | None:
if not self.dec.active():
return None
""" Returns the current MPC mode if DEC is active. """
return self.dec.mode() if self.dec.active() else None
return self.dec.mode()
def compute_accel_limits(self, v_ego: float, sm, CP) -> tuple[list[float], list[float]]:
""" Delegates acceleration limit computation to AccelController. """
return self.accel_controller.compute_accel_limits(v_ego, sm, CP)
def update(self, sm: messaging.SubMaster) -> None:
""" Updates DEC and AccelController states. """
self.dec.update(sm)
self.accel_controller.update()
def publish_longitudinal_plan_sp(self, sm: messaging.SubMaster, pm: messaging.PubMaster) -> None:
""" Publishes the longitudinal plan state to messaging. """
plan_sp_send = messaging.new_message('longitudinalPlanSP')
plan_sp_send.valid = sm.all_checks(service_list=['carState', 'controlsState'])
longitudinalPlanSP = plan_sp_send.longitudinalPlanSP

View File

@@ -5,7 +5,7 @@ import signal
import sys
import traceback
from cereal import log
from cereal import log, custom
import cereal.messaging as messaging
import openpilot.system.sentry as sentry
from openpilot.common.params import Params, ParamKeyType
@@ -49,7 +49,8 @@ def manager_init() -> None:
("MadsPauseLateralOnBrake", "0"),
("MadsUnifiedEngagementMode", "1"),
("ModelManager_LastSyncTime", "0"),
("ModelManager_ModelsCache", "")
("ModelManager_ModelsCache", ""),
("AccelPersonality", str(custom.LongitudinalPlanSP.AccelerationPersonality.stock)),
]
if params.get_bool("RecordFrontLock"):