稳定度配置条与自定义挡位、独立速度调节;状态文字中文简写与平滑;灵敏挡切向振荡判据收紧;新增重置底图按钮。

- 设置框新增 0~100 稳定度配置条(灵敏 0 / 较稳定 50 / 十分稳定 100 为内置挡位,中间按比例插值),支持滚轮/左键拖动,可另存/删除自定义挡位;速度改为独立滑块。
- 状态栏改为中文简写(悬停显示原文);夹持保护期文字按挡位区分;合并同义子状态并加最短停留,避免逐帧跳动。
- 灵敏挡切向振荡:0.5 s 内换向 4 次,并须持续至少 0.15 s 才张开(新参数 release_shear_oscillation_min_seconds)。
- 传感器控制区新增「重置底图」:左右传感器一起用当前画面更换光流参考底图(orisys Sensor.reset),不断开相机。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
cheng
2026-10-08 13:34:30 +08:00
parent 3507a2d313
commit 33578fa83e
7 changed files with 842 additions and 70 deletions
+9
View File
@@ -55,6 +55,7 @@ class SideTriggerGripController:
"move_position",
"restart_left_sensor",
"restart_right_sensor",
"reset_sensor_reference",
}:
raise ValueError(f"unsupported manual command: {command}")
payload = {
@@ -470,6 +471,14 @@ class SideTriggerGripController:
manual_action = "right-sensor-restart"
else:
manual_action = "right-sensor-restart-failed"
elif manual_command == "reset_sensor_reference":
if self.reader.reset_reference_maps():
release_watch.suspend()
reset_open_wait_stability()
trigger_armed = False
manual_action = "sensor-reference-reset"
else:
manual_action = "sensor-reference-reset-failed"
# Non-blocking sample read: never stall the FSM on sensor wait.
feedback = self.feedback_processor.read(self.reader, timeout=0.0)
+6 -1
View File
@@ -243,6 +243,7 @@ class ReleaseWatch:
self._candidate = None
self._osc_count = 0
self._osc_channel = ""
self._osc_since = None
self._last_fresh = {}
self._rates = {}
self._curves = {key: ForceCurve(self.config) for key in CHANNELS}
@@ -377,14 +378,17 @@ class ReleaseWatch:
if not channel:
self._osc_count = 0
self._osc_channel = ""
self._osc_since = None
return None
needed = max(2, int(getattr(self.config, "release_shear_oscillation_confirm_samples", 2) or 2))
min_seconds = max(0.0, float(getattr(self.config, "release_shear_oscillation_min_seconds", 0.0) or 0.0))
if self._osc_channel != channel:
self._osc_channel = channel
self._osc_count = 1
self._osc_since = now
else:
self._osc_count += 1
released = self._osc_count >= needed
released = self._osc_count >= needed and now - self._osc_since >= min_seconds
if released:
self.phase = ReleasePhase.RELEASED
else:
@@ -409,6 +413,7 @@ class ReleaseWatch:
self._candidate = None
self._osc_count = 0
self._osc_channel = ""
self._osc_since = None
self._watch_since = None
self._settle_seen.clear()
for curve in self._curves.values():