From c91695490a398e4038854feef6825edde4c291dc Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 19:53:49 +0200 Subject: [PATCH 01/35] Update settings.cc --- selfdrive/ui/qt/offroad/settings.cc | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 9d58f57f9..1b667b102 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -15,6 +15,7 @@ #include "selfdrive/ui/qt/widgets/scrollview.h" #include "selfdrive/ui/qt/offroad/developer_panel.h" #include "selfdrive/ui/qt/offroad/firehose.h" +#include "selfdrive/ui/sunnypilot/qt/widgets/controls.h" InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : ListWidget(parent) { std::vector> toggle_defs{ @@ -97,6 +98,25 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L addItem(toggle); toggles[param.toStdString()] = toggle; } + + float default_offset = 0.0f; + + OptionControlSP *steer_offset_control = new OptionControlSP( + "SteerOffsetDeg", + tr("Steering Angle Offset"), + tr("Adjust steering angle offset manually (in degrees)."), + "", {-1000, 1000}, 1, false, nullptr, true, true); + + float stored_val = QString::fromStdString(params.get("SteerOffsetDeg")).toFloat(); + steer_offset_control->setLabel(QString::number(stored_val, 'f', 2) + "°"); + steer_offset_control->showDescription(); + addItem(steer_offset_control); + + QObject::connect(steer_offset_control, &OptionControlSP::updateLabels, [=]() { + float val = QString::fromStdString(params.get("SteerOffsetDeg")).toFloat(); + steer_offset_control->setLabel(QString::number(val, 'f', 2) + "°"); + }); + } void InfiniteCableTogglesPanel::expandToggleDescription(const QString ¶m) { From ea937b7ce27b4b431489dfdd0fec8739d8d50c4c Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 20:04:29 +0200 Subject: [PATCH 02/35] Update params_keys.h --- common/params_keys.h | 1 + 1 file changed, 1 insertion(+) diff --git a/common/params_keys.h b/common/params_keys.h index 35c9b3568..ab57b6d7d 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -8,6 +8,7 @@ inline static std::unordered_map keys = { {"AccessToken", {CLEAR_ON_MANAGER_START | DONT_LOG, STRING}}, {"AdbEnabled", {PERSISTENT | BACKUP, BOOL}}, {"AlwaysOnDM", {PERSISTENT | BACKUP, BOOL}}, + {"AngleOffsetDegree", {PERSISTENT, FLOAT, "0.0"}}, {"ApiCache_Device", {PERSISTENT, STRING}}, {"ApiCache_FirehoseStats", {PERSISTENT, JSON}}, {"AssistNowToken", {PERSISTENT, STRING}}, From 94a0e4fdbfd80c8485c84591df459dcc8220655e Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 20:05:07 +0200 Subject: [PATCH 03/35] Update settings.cc --- selfdrive/ui/qt/offroad/settings.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 1b667b102..8533d97b7 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -102,7 +102,7 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L float default_offset = 0.0f; OptionControlSP *steer_offset_control = new OptionControlSP( - "SteerOffsetDeg", + "AngleOffsetDegree", tr("Steering Angle Offset"), tr("Adjust steering angle offset manually (in degrees)."), "", {-1000, 1000}, 1, false, nullptr, true, true); From 25b3dc4b3b3cbc4a9b6a6b4dedc680ba57125cbf Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 20:09:24 +0200 Subject: [PATCH 04/35] Update settings.cc --- selfdrive/ui/qt/offroad/settings.cc | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 8533d97b7..d97a35c94 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -99,24 +99,21 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L toggles[param.toStdString()] = toggle; } - float default_offset = 0.0f; - OptionControlSP *steer_offset_control = new OptionControlSP( "AngleOffsetDegree", tr("Steering Angle Offset"), tr("Adjust steering angle offset manually (in degrees)."), "", {-1000, 1000}, 1, false, nullptr, true, true); - - float stored_val = QString::fromStdString(params.get("SteerOffsetDeg")).toFloat(); + + float stored_val = params.getFloat("AngleOffsetDegree"); steer_offset_control->setLabel(QString::number(stored_val, 'f', 2) + "°"); steer_offset_control->showDescription(); addItem(steer_offset_control); - + QObject::connect(steer_offset_control, &OptionControlSP::updateLabels, [=]() { - float val = QString::fromStdString(params.get("SteerOffsetDeg")).toFloat(); + float val = params.getFloat("AngleOffsetDegree"); steer_offset_control->setLabel(QString::number(val, 'f', 2) + "°"); - }); - + }); } void InfiniteCableTogglesPanel::expandToggleDescription(const QString ¶m) { From bdbe56828eab6f0f486e8996d0acb449e3f88ef9 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 20:17:21 +0200 Subject: [PATCH 05/35] Update paramsd.py --- selfdrive/locationd/paramsd.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index b4084fe5b..dcc8ea851 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -290,6 +290,8 @@ def main(): msg_dat = msg.to_bytes() if sm.frame % 1200 == 0: # once a minute params.put_nonblocking("LiveParametersV2", msg_dat) + if sm.frame % 20 == 0: # once a minute + params.put_float("AngleOffsetDegree", msg.liveParameters.angleOffsetDeg) pm.send('liveParameters', msg_dat) From dfec14a4c0011c17f349437b318a26d7d60ef7d7 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 20:27:00 +0200 Subject: [PATCH 06/35] Update paramsd.py --- selfdrive/locationd/paramsd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index dcc8ea851..56e26e92a 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -290,7 +290,7 @@ def main(): msg_dat = msg.to_bytes() if sm.frame % 1200 == 0: # once a minute params.put_nonblocking("LiveParametersV2", msg_dat) - if sm.frame % 20 == 0: # once a minute + if sm.frame % 50 == 0: # once a minute params.put_float("AngleOffsetDegree", msg.liveParameters.angleOffsetDeg) pm.send('liveParameters', msg_dat) From f4b41d40d2dddb07824c14d7e5500c242e90bd5c Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 20:33:12 +0200 Subject: [PATCH 07/35] Update paramsd.py --- selfdrive/locationd/paramsd.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index 56e26e92a..f0472944c 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -290,8 +290,8 @@ def main(): msg_dat = msg.to_bytes() if sm.frame % 1200 == 0: # once a minute params.put_nonblocking("LiveParametersV2", msg_dat) - if sm.frame % 50 == 0: # once a minute - params.put_float("AngleOffsetDegree", msg.liveParameters.angleOffsetDeg) + if sm.frame % 50 == 0: + params.put_nonblocking("AngleOffsetDegree", str(msg.liveParameters.angleOffsetDeg)) pm.send('liveParameters', msg_dat) From 54a0013bc1d38ae9fc539ce4ae8ef3c95a08942e Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 20:34:09 +0200 Subject: [PATCH 08/35] Update settings.cc --- selfdrive/ui/qt/offroad/settings.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index d97a35c94..bd2875488 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -105,15 +105,15 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L tr("Adjust steering angle offset manually (in degrees)."), "", {-1000, 1000}, 1, false, nullptr, true, true); - float stored_val = params.getFloat("AngleOffsetDegree"); + float stored_val = QString::fromStdString(params.get("AngleOffsetDegree")).toFloat(); steer_offset_control->setLabel(QString::number(stored_val, 'f', 2) + "°"); steer_offset_control->showDescription(); addItem(steer_offset_control); QObject::connect(steer_offset_control, &OptionControlSP::updateLabels, [=]() { - float val = params.getFloat("AngleOffsetDegree"); + float val = QString::fromStdString(params.get("AngleOffsetDegree")).toFloat(); steer_offset_control->setLabel(QString::number(val, 'f', 2) + "°"); - }); + }); } void InfiniteCableTogglesPanel::expandToggleDescription(const QString ¶m) { From 31308af4eb6a80c20fc475974f1ae49e5c7f755d Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 20:43:58 +0200 Subject: [PATCH 09/35] Update settings.cc --- selfdrive/ui/qt/offroad/settings.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index bd2875488..d8f654d56 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -103,7 +103,7 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L "AngleOffsetDegree", tr("Steering Angle Offset"), tr("Adjust steering angle offset manually (in degrees)."), - "", {-1000, 1000}, 1, false, nullptr, true, true); + "", {-1000, 1000}, 10, false, nullptr, true, true); float stored_val = QString::fromStdString(params.get("AngleOffsetDegree")).toFloat(); steer_offset_control->setLabel(QString::number(stored_val, 'f', 2) + "°"); From e885852a951554beaeaa928a3bc363664955ce2c Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 20:49:13 +0200 Subject: [PATCH 10/35] Update settings.cc --- selfdrive/ui/qt/offroad/settings.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index d8f654d56..31057175a 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -103,7 +103,7 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L "AngleOffsetDegree", tr("Steering Angle Offset"), tr("Adjust steering angle offset manually (in degrees)."), - "", {-1000, 1000}, 10, false, nullptr, true, true); + "", {-2000, 2000}, 10, false, nullptr, true, true); float stored_val = QString::fromStdString(params.get("AngleOffsetDegree")).toFloat(); steer_offset_control->setLabel(QString::number(stored_val, 'f', 2) + "°"); From 3a640c69932a96905a3ec2a7c4273f6d9b50f9c6 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 21:08:00 +0200 Subject: [PATCH 11/35] Update settings.cc --- selfdrive/ui/qt/offroad/settings.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 31057175a..ad5b4a5cd 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -106,13 +106,13 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L "", {-2000, 2000}, 10, false, nullptr, true, true); float stored_val = QString::fromStdString(params.get("AngleOffsetDegree")).toFloat(); - steer_offset_control->setLabel(QString::number(stored_val, 'f', 2) + "°"); + steer_offset_control->setLabel(QString::number(stored_val, 'f', 1) + "°"); steer_offset_control->showDescription(); addItem(steer_offset_control); QObject::connect(steer_offset_control, &OptionControlSP::updateLabels, [=]() { float val = QString::fromStdString(params.get("AngleOffsetDegree")).toFloat(); - steer_offset_control->setLabel(QString::number(val, 'f', 2) + "°"); + steer_offset_control->setLabel(QString::number(val, 'f', 1) + "°"); }); } From 8bea3dc0e864b4352b68caa97eccc9967f7271bc Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 21:20:54 +0200 Subject: [PATCH 12/35] Update paramsd.py revert --- selfdrive/locationd/paramsd.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index f0472944c..b4084fe5b 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -290,8 +290,6 @@ def main(): msg_dat = msg.to_bytes() if sm.frame % 1200 == 0: # once a minute params.put_nonblocking("LiveParametersV2", msg_dat) - if sm.frame % 50 == 0: - params.put_nonblocking("AngleOffsetDegree", str(msg.liveParameters.angleOffsetDeg)) pm.send('liveParameters', msg_dat) From 8a8937f23dbbda35febae0fec7eeb9c7bdd67c23 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 21:27:55 +0200 Subject: [PATCH 13/35] Update controlsd.py --- selfdrive/controls/controlsd.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 297b36401..2c182f086 100644 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -66,6 +66,7 @@ class Controls(ControlsExt, ModelStateBase): self.enable_smooth_steer = self.params.get_bool("EnableSmoothSteer") self.smooth_steer = PT2Filter(46.0, 1.0, DT_CTRL) self.force_rhd_for_bsm = self.params.get_bool("ForceRHDForBSM") + self.force_steer_angle_offset = float(self.params.get("AngleOffsetDegree")) self.pose_calibrator = PoseCalibrator() self.calibrated_pose: Pose | None = None @@ -97,6 +98,7 @@ class Controls(ControlsExt, ModelStateBase): self.enable_speed_limit_control = self.params.get_bool("EnableSpeedLimitControl") self.enable_speed_limit_predicative = self.params.get_bool("EnableSpeedLimitPredicative") self.force_rhd_for_bsm = self.params.get_bool("ForceRHDForBSM") + self.force_steer_angle_offset = float(self.params.get("AngleOffsetDegree")) def state_control(self): CS = self.sm['carState'] @@ -192,6 +194,7 @@ class Controls(ControlsExt, ModelStateBase): CC.curvatureControllerActive = self.enable_curvature_controller # for car controller curvature correction activation CC.steerLimited = self.steer_limited_by_safety CC.forceRHDForBSM = self.force_rhd_for_bsm + CC.forceSteerAngleOffset = self.force_steer_angle_offset # Orientation and angle rates can be useful for carcontroller # Only calibrated (car) frame is relevant for the carcontroller From 1e07cd06adea405ea9ee47b6db912ff15608a332 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 21:35:20 +0200 Subject: [PATCH 14/35] Update controlsd.py --- selfdrive/controls/controlsd.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 2c182f086..67eb8de92 100644 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -66,7 +66,6 @@ class Controls(ControlsExt, ModelStateBase): self.enable_smooth_steer = self.params.get_bool("EnableSmoothSteer") self.smooth_steer = PT2Filter(46.0, 1.0, DT_CTRL) self.force_rhd_for_bsm = self.params.get_bool("ForceRHDForBSM") - self.force_steer_angle_offset = float(self.params.get("AngleOffsetDegree")) self.pose_calibrator = PoseCalibrator() self.calibrated_pose: Pose | None = None @@ -194,7 +193,6 @@ class Controls(ControlsExt, ModelStateBase): CC.curvatureControllerActive = self.enable_curvature_controller # for car controller curvature correction activation CC.steerLimited = self.steer_limited_by_safety CC.forceRHDForBSM = self.force_rhd_for_bsm - CC.forceSteerAngleOffset = self.force_steer_angle_offset # Orientation and angle rates can be useful for carcontroller # Only calibrated (car) frame is relevant for the carcontroller From 6459de5590fa25fbdfe6361d212d73f54bb7561d Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 21:35:33 +0200 Subject: [PATCH 15/35] Update controlsd.py --- selfdrive/controls/controlsd.py | 1 - 1 file changed, 1 deletion(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 67eb8de92..297b36401 100644 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -97,7 +97,6 @@ class Controls(ControlsExt, ModelStateBase): self.enable_speed_limit_control = self.params.get_bool("EnableSpeedLimitControl") self.enable_speed_limit_predicative = self.params.get_bool("EnableSpeedLimitPredicative") self.force_rhd_for_bsm = self.params.get_bool("ForceRHDForBSM") - self.force_steer_angle_offset = float(self.params.get("AngleOffsetDegree")) def state_control(self): CS = self.sm['carState'] From 817a8af6f15e2b931a2fdf3c839b1a05b847be6f Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 21:43:04 +0200 Subject: [PATCH 16/35] Update paramsd.py --- selfdrive/locationd/paramsd.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index b4084fe5b..77dbebcf9 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -55,12 +55,15 @@ class VehicleParamsLearner: self.total_offset_valid = True self.roll_valid = True + self.manual_steer_offset = float(params.get("AngleOffsetDegree") or 0.0) + self.reset(None) def reset(self, t: float | None): self.kf.init_state(self.x_initial, covs=self.P_initial, filter_time=t) self.angle_offset, self.roll, self.active = np.degrees(self.x_initial[States.ANGLE_OFFSET].item()), 0.0, False + self.angle_offset = self.angle_offset + self.manual_steer_offset self.avg_angle_offset = self.angle_offset def handle_log(self, t: float, which: str, msg: capnp._DynamicStructReader): From 9d4d81b628a443cba2b221e30960656a76c1d227 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 21:47:47 +0200 Subject: [PATCH 17/35] Update paramsd.py --- selfdrive/locationd/paramsd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index 77dbebcf9..9e3d6b4d5 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -55,7 +55,7 @@ class VehicleParamsLearner: self.total_offset_valid = True self.roll_valid = True - self.manual_steer_offset = float(params.get("AngleOffsetDegree") or 0.0) + self.manual_steer_offset = float(Params().get("AngleOffsetDegree") or 0.0) self.reset(None) From 234cd24a95d5f01140b6e1b7b4731ed1672e3397 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Fri, 26 Sep 2025 21:58:25 +0200 Subject: [PATCH 18/35] Update paramsd.py save it --- selfdrive/locationd/paramsd.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index 9e3d6b4d5..fdf76d1c5 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -293,6 +293,7 @@ def main(): msg_dat = msg.to_bytes() if sm.frame % 1200 == 0: # once a minute params.put_nonblocking("LiveParametersV2", msg_dat) + params.put_nonblocking("AngleOffsetDegree", msg.liveParameters.angleOffsetDeg) pm.send('liveParameters', msg_dat) From 86dfd0d24a1833bbe4e33b11effe82cdca3bfc9c Mon Sep 17 00:00:00 2001 From: infiniteCable <75014343+infiniteCable@users.noreply.github.com> Date: Sat, 27 Sep 2025 23:31:59 +0200 Subject: [PATCH 19/35] Update paramsd.py --- selfdrive/locationd/paramsd.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index fdf76d1c5..84656129b 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -31,7 +31,7 @@ class VehicleParamsLearner: self.x_initial = CarKalman.initial_x.copy() self.x_initial[States.STEER_RATIO] = steer_ratio self.x_initial[States.STIFFNESS] = stiffness_factor - self.x_initial[States.ANGLE_OFFSET] = angle_offset + self.x_initial[States.ANGLE_OFFSET] = float(Params().get("AngleOffsetDegree") or angle_offset) self.P_initial = P_initial if P_initial is not None else CarKalman.P_initial self.kf.set_globals( @@ -55,15 +55,12 @@ class VehicleParamsLearner: self.total_offset_valid = True self.roll_valid = True - self.manual_steer_offset = float(Params().get("AngleOffsetDegree") or 0.0) - self.reset(None) def reset(self, t: float | None): self.kf.init_state(self.x_initial, covs=self.P_initial, filter_time=t) self.angle_offset, self.roll, self.active = np.degrees(self.x_initial[States.ANGLE_OFFSET].item()), 0.0, False - self.angle_offset = self.angle_offset + self.manual_steer_offset self.avg_angle_offset = self.angle_offset def handle_log(self, t: float, which: str, msg: capnp._DynamicStructReader): From d9b0337a0b78385d82bbfa2f240be25c044ba114 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 16:53:34 +0200 Subject: [PATCH 20/35] bump --- opendbc_repo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opendbc_repo b/opendbc_repo index 5b5fa2f6f..e8177279d 160000 --- a/opendbc_repo +++ b/opendbc_repo @@ -1 +1 @@ -Subproject commit 5b5fa2f6fac6cd2105991467e8d596e018cae0c6 +Subproject commit e8177279d9618452fda3cff5b198ca94eb5c7844 From b4588a7c7fc3951bd48aa70b4291e82dda285099 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 16:53:48 +0200 Subject: [PATCH 21/35] bump --- opendbc_repo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opendbc_repo b/opendbc_repo index e8177279d..5b5fa2f6f 160000 --- a/opendbc_repo +++ b/opendbc_repo @@ -1 +1 @@ -Subproject commit e8177279d9618452fda3cff5b198ca94eb5c7844 +Subproject commit 5b5fa2f6fac6cd2105991467e8d596e018cae0c6 From 340ccbb85bcf477f6c231030e70006d371e92506 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 17:11:35 +0200 Subject: [PATCH 22/35] Update params_keys.h --- common/params_keys.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/params_keys.h b/common/params_keys.h index ab57b6d7d..8d32689f2 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -8,7 +8,6 @@ inline static std::unordered_map keys = { {"AccessToken", {CLEAR_ON_MANAGER_START | DONT_LOG, STRING}}, {"AdbEnabled", {PERSISTENT | BACKUP, BOOL}}, {"AlwaysOnDM", {PERSISTENT | BACKUP, BOOL}}, - {"AngleOffsetDegree", {PERSISTENT, FLOAT, "0.0"}}, {"ApiCache_Device", {PERSISTENT, STRING}}, {"ApiCache_FirehoseStats", {PERSISTENT, JSON}}, {"AssistNowToken", {PERSISTENT, STRING}}, @@ -130,8 +129,10 @@ inline static std::unordered_map keys = { {"Version", {PERSISTENT, STRING}}, // --- infiniteCable params --- // + {"AngleOffsetDegree", {PERSISTENT, FLOAT, "0.0"}}, {"DisableScreenTimer", {PERSISTENT, BOOL}}, {"DarkMode", {PERSISTENT, BOOL}}, + {"EnableAngleOffset", {PERSISTENT, BOOL}}, {"EnableCurvatureController", {PERSISTENT, BOOL, "1"}}, {"EnableScreenEvent", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, BOOL}}, {"EnableSmoothSteer", {PERSISTENT, BOOL}}, From 8d58858e6a0be48dcf50dff9ee772905f764d90b Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 17:17:47 +0200 Subject: [PATCH 23/35] Update settings.cc --- selfdrive/ui/qt/offroad/settings.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index ad5b4a5cd..09aa3ea3c 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -75,6 +75,13 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L "../assets/icons/eye_closed.png", false, }, + { + "EnableAngleOffset", + tr("Enable Steer Angle Offset"), + tr("Enables the use of manual steer angle offset selection as start value for params detection."), + "../assets/icons/eye_closed.png", + false, + }, }; for (auto &[param, title, desc, icon, needs_restart] : toggle_defs) { @@ -99,7 +106,7 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L toggles[param.toStdString()] = toggle; } - OptionControlSP *steer_offset_control = new OptionControlSP( + steer_offset_control = new OptionControlSP( "AngleOffsetDegree", tr("Steering Angle Offset"), tr("Adjust steering angle offset manually (in degrees)."), From 647bd73446f1645952d7f952da2491edae54f8a5 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 17:22:05 +0200 Subject: [PATCH 24/35] Update settings.h --- selfdrive/ui/qt/offroad/settings.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/ui/qt/offroad/settings.h b/selfdrive/ui/qt/offroad/settings.h index 501a9732c..8ce3a0c9c 100644 --- a/selfdrive/ui/qt/offroad/settings.h +++ b/selfdrive/ui/qt/offroad/settings.h @@ -21,6 +21,7 @@ #define ButtonParamControl ButtonParamControlSP #define ToggleControl ToggleControlSP #define LabelControl LabelControlSP + #else #include "selfdrive/ui/ui.h" #include "selfdrive/ui/qt/widgets/controls.h" @@ -81,8 +82,10 @@ public slots: void scrollToToggle(const QString ¶m); protected: + void showEvent(QShowEvent *event) override; Params params; std::map toggles; + OptionControlSP *steer_offset_control = nullptr; }; class TogglesPanel : public ListWidget { From e986a6510169cf62ece7eaa6bad5707703262dee Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 17:22:58 +0200 Subject: [PATCH 25/35] Update settings.cc --- selfdrive/ui/qt/offroad/settings.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 09aa3ea3c..3f85d2dc4 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -123,6 +123,14 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L }); } +void InfiniteCableTogglesPanel::showEvent(QShowEvent *event) { + ListWidget::showEvent(event); + if (steer_offset_control) { + float val = QString::fromStdString(params.get("AngleOffsetDegree")).toFloat(); + steer_offset_control->setLabel(QString::number(val, 'f', 1) + "°"); + } +} + void InfiniteCableTogglesPanel::expandToggleDescription(const QString ¶m) { toggles[param.toStdString()]->showDescription(); } From bce767f4426c0ff7a5e1da76dc38eaaea3cc5a33 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 17:24:44 +0200 Subject: [PATCH 26/35] Update settings.cc --- selfdrive/ui/qt/offroad/settings.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 3f85d2dc4..380fd13a0 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -117,6 +117,9 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L steer_offset_control->showDescription(); addItem(steer_offset_control); + bool enable_angle_offset = params.getBool("EnableAngleOffset"); + steer_offset_control->setVisible(enable_angle_offset); + QObject::connect(steer_offset_control, &OptionControlSP::updateLabels, [=]() { float val = QString::fromStdString(params.get("AngleOffsetDegree")).toFloat(); steer_offset_control->setLabel(QString::number(val, 'f', 1) + "°"); From 152a1e3cdd16dcbb16cfbb32047fe8809cb3f3cc Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 17:29:51 +0200 Subject: [PATCH 27/35] Update paramsd.py --- selfdrive/locationd/paramsd.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index 84656129b..9f9c554da 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -26,12 +26,15 @@ LOW_ACTIVE_SPEED = 10.0 class VehicleParamsLearner: def __init__(self, CP: car.CarParams, steer_ratio: float, stiffness_factor: float, angle_offset: float, P_initial: np.ndarray | None = None): + params = Params() self.kf = CarKalman(GENERATED_DIR) self.x_initial = CarKalman.initial_x.copy() self.x_initial[States.STEER_RATIO] = steer_ratio self.x_initial[States.STIFFNESS] = stiffness_factor - self.x_initial[States.ANGLE_OFFSET] = float(Params().get("AngleOffsetDegree") or angle_offset) + set_manual_angle_offset = params.get_bool("EnableAngleOffset") + manual_angle_offset = float(params.get("AngleOffsetDegree") or 0.0) + self.x_initial[States.ANGLE_OFFSET] = manual_angle_offset if set_manual_angle_offset else angle_offset self.P_initial = P_initial if P_initial is not None else CarKalman.P_initial self.kf.set_globals( From 192b5d85dd8b02cbca3ecdf54609931240c15ac2 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 17:31:18 +0200 Subject: [PATCH 28/35] Update settings.h --- selfdrive/ui/qt/offroad/settings.h | 1 - 1 file changed, 1 deletion(-) diff --git a/selfdrive/ui/qt/offroad/settings.h b/selfdrive/ui/qt/offroad/settings.h index 8ce3a0c9c..049e0d05b 100644 --- a/selfdrive/ui/qt/offroad/settings.h +++ b/selfdrive/ui/qt/offroad/settings.h @@ -21,7 +21,6 @@ #define ButtonParamControl ButtonParamControlSP #define ToggleControl ToggleControlSP #define LabelControl LabelControlSP - #else #include "selfdrive/ui/ui.h" #include "selfdrive/ui/qt/widgets/controls.h" From 88aa62f9345f6e706cf9b46521b088c61568641a Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 17:39:16 +0200 Subject: [PATCH 29/35] Update paramsd.py --- selfdrive/locationd/paramsd.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index 9f9c554da..ef58ffa84 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -19,6 +19,7 @@ ROLL_LOWERED_MAX = np.radians(8) ROLL_STD_MAX = np.radians(1.5) LATERAL_ACC_SENSOR_THRESHOLD = 4.0 OFFSET_MAX = 10.0 +OFFSET_HIGHER_MAX = 20.0 OFFSET_LOWERED_MAX = 8.0 MIN_ACTIVE_SPEED = 1.0 LOW_ACTIVE_SPEED = 10.0 @@ -33,6 +34,7 @@ class VehicleParamsLearner: self.x_initial[States.STEER_RATIO] = steer_ratio self.x_initial[States.STIFFNESS] = stiffness_factor set_manual_angle_offset = params.get_bool("EnableAngleOffset") + self.allow_higher_angle_offset = set_manual_angle_offset manual_angle_offset = float(params.get("AngleOffsetDegree") or 0.0) self.x_initial[States.ANGLE_OFFSET] = manual_angle_offset if set_manual_angle_offset else angle_offset self.P_initial = P_initial if P_initial is not None else CarKalman.P_initial @@ -153,8 +155,9 @@ class VehicleParamsLearner: sensors_valid = bool(abs(self.observed_speed * (x[States.YAW_RATE].item() + self.observed_yaw_rate)) < LATERAL_ACC_SENSOR_THRESHOLD) else: sensors_valid = True - self.avg_offset_valid = check_valid_with_hysteresis(self.avg_offset_valid, self.avg_angle_offset, OFFSET_MAX, OFFSET_LOWERED_MAX) - self.total_offset_valid = check_valid_with_hysteresis(self.total_offset_valid, self.angle_offset, OFFSET_MAX, OFFSET_LOWERED_MAX) + avg_angle_offset_max = OFFSET_HIGHER_MAX if self.allow_higher_angle_offset else OFFSET_MAX + self.avg_offset_valid = check_valid_with_hysteresis(self.avg_offset_valid, self.avg_angle_offset, avg_angle_offset_max, OFFSET_LOWERED_MAX) + self.total_offset_valid = check_valid_with_hysteresis(self.total_offset_valid, self.angle_offset, avg_angle_offset_max, OFFSET_LOWERED_MAX) self.roll_valid = check_valid_with_hysteresis(self.roll_valid, self.roll, ROLL_MAX, ROLL_LOWERED_MAX) msg = messaging.new_message('liveParameters') From 2d639bd7eb7a786ff6c7b7f4514952a082d85ff4 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 17:50:34 +0200 Subject: [PATCH 30/35] Update settings.cc --- selfdrive/ui/qt/offroad/settings.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 380fd13a0..8832854bb 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -120,6 +120,11 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L bool enable_angle_offset = params.getBool("EnableAngleOffset"); steer_offset_control->setVisible(enable_angle_offset); + connect(uiStateSP(), &UIStateSP::uiUpdate, this, [=]() { + bool enable_steer_offset_control = params.getBool("EnableAngleOffset"); + steer_offset_control->setVisible(enable_steer_offset_control); + }); + QObject::connect(steer_offset_control, &OptionControlSP::updateLabels, [=]() { float val = QString::fromStdString(params.get("AngleOffsetDegree")).toFloat(); steer_offset_control->setLabel(QString::number(val, 'f', 1) + "°"); From e776a7a0f61699107aab907bcc80b5066053f47d Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 17:59:06 +0200 Subject: [PATCH 31/35] Update settings.cc --- selfdrive/ui/qt/offroad/settings.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 8832854bb..22ddffebe 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -109,7 +109,7 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L steer_offset_control = new OptionControlSP( "AngleOffsetDegree", tr("Steering Angle Offset"), - tr("Adjust steering angle offset manually (in degrees)."), + tr("Adjust steering angle offset params learner start value manually (in degrees). Taking effect only for onroad transition."), "", {-2000, 2000}, 10, false, nullptr, true, true); float stored_val = QString::fromStdString(params.get("AngleOffsetDegree")).toFloat(); From d5139e5a9d177464c338479ac4428e79df1c8035 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 18:19:42 +0200 Subject: [PATCH 32/35] Update paramsd.py --- selfdrive/locationd/paramsd.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index ef58ffa84..b5f1f1cec 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -35,8 +35,8 @@ class VehicleParamsLearner: self.x_initial[States.STIFFNESS] = stiffness_factor set_manual_angle_offset = params.get_bool("EnableAngleOffset") self.allow_higher_angle_offset = set_manual_angle_offset - manual_angle_offset = float(params.get("AngleOffsetDegree") or 0.0) - self.x_initial[States.ANGLE_OFFSET] = manual_angle_offset if set_manual_angle_offset else angle_offset + manual_angle_offset_deg = float(params.get("AngleOffsetDegree") or 0.0) + self.x_initial[States.ANGLE_OFFSET] = np.radians(manual_angle_offset_deg) if set_manual_angle_offset else angle_offset self.P_initial = P_initial if P_initial is not None else CarKalman.P_initial self.kf.set_globals( From 1028024ad54ced2386e88a295a1c13b3fceb18d1 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 18:21:51 +0200 Subject: [PATCH 33/35] Update settings.cc --- selfdrive/ui/qt/offroad/settings.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 22ddffebe..6bd100b73 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -109,7 +109,7 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L steer_offset_control = new OptionControlSP( "AngleOffsetDegree", tr("Steering Angle Offset"), - tr("Adjust steering angle offset params learner start value manually (in degrees). Taking effect only for onroad transition."), + tr("Adjust steering angle offset params learner start value manually (in degrees). Taking effect only for onroad transition. Is refreshed with the actual learned value and saved."), "", {-2000, 2000}, 10, false, nullptr, true, true); float stored_val = QString::fromStdString(params.get("AngleOffsetDegree")).toFloat(); From b72f9eb227761e82d74043ea1be0fb2ded4a815f Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 18:26:53 +0200 Subject: [PATCH 34/35] Update settings.cc --- selfdrive/ui/qt/offroad/settings.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 6bd100b73..7b36e1e0f 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -110,7 +110,7 @@ InfiniteCableTogglesPanel::InfiniteCableTogglesPanel(SettingsWindow *parent) : L "AngleOffsetDegree", tr("Steering Angle Offset"), tr("Adjust steering angle offset params learner start value manually (in degrees). Taking effect only for onroad transition. Is refreshed with the actual learned value and saved."), - "", {-2000, 2000}, 10, false, nullptr, true, true); + "", {-1800, 1800}, 10, false, nullptr, true, true); float stored_val = QString::fromStdString(params.get("AngleOffsetDegree")).toFloat(); steer_offset_control->setLabel(QString::number(stored_val, 'f', 1) + "°"); From b21e29629a6f7fab3d3de2e7b327d3786e5b21e0 Mon Sep 17 00:00:00 2001 From: infiniteCable2 Date: Mon, 29 Sep 2025 18:27:25 +0200 Subject: [PATCH 35/35] Update paramsd.py --- selfdrive/locationd/paramsd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index b5f1f1cec..e6e315fae 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -19,7 +19,7 @@ ROLL_LOWERED_MAX = np.radians(8) ROLL_STD_MAX = np.radians(1.5) LATERAL_ACC_SENSOR_THRESHOLD = 4.0 OFFSET_MAX = 10.0 -OFFSET_HIGHER_MAX = 20.0 +OFFSET_HIGHER_MAX = 18.0 OFFSET_LOWERED_MAX = 8.0 MIN_ACTIVE_SPEED = 1.0 LOW_ACTIVE_SPEED = 10.0