diff --git a/config/compound_eye.png b/config/compound_eye.png index 7f0b344..65688d1 100644 Binary files a/config/compound_eye.png and b/config/compound_eye.png differ diff --git a/gripper_control/__pycache__/controller.cpython-311.pyc b/gripper_control/__pycache__/controller.cpython-311.pyc deleted file mode 100644 index 3afe7a9..0000000 Binary files a/gripper_control/__pycache__/controller.cpython-311.pyc and /dev/null differ diff --git a/gripper_control/__pycache__/main.cpython-311.pyc b/gripper_control/__pycache__/main.cpython-311.pyc deleted file mode 100644 index 5b423a7..0000000 Binary files a/gripper_control/__pycache__/main.cpython-311.pyc and /dev/null differ diff --git a/gripper_control/config/__pycache__/gripper_timed_cycle_control.cpython-311.pyc b/gripper_control/config/__pycache__/gripper_timed_cycle_control.cpython-311.pyc deleted file mode 100644 index 5e27d09..0000000 Binary files a/gripper_control/config/__pycache__/gripper_timed_cycle_control.cpython-311.pyc and /dev/null differ diff --git a/gripper_control_02/README.md b/gripper_control_02/README.md index e9da455..e13c4ea 100644 --- a/gripper_control_02/README.md +++ b/gripper_control_02/README.md @@ -5,7 +5,7 @@ ## 展示流程 1. 程序启动后,夹爪先张开。 -2. 程序等待任意一侧触觉传感器感受到法向力或切向力;进入等待后会先记录张开时的安静参考值。 +2. 程序等待任意一侧触觉传感器感受到法向力或切向力。 3. 展示时,把物体从某个侧边扫一下,触发单侧力变化。 4. 触发后夹爪开始闭合,你把物体移动到中间。 5. 闭合过程中检测到物体后,切到低力并保持当前位置。 @@ -40,8 +40,6 @@ gripper_control_02\config\gripper_demo_02.py - `TRIGGER_NORMAL_FORCE`: 单侧法向力触发阈值。 - `TRIGGER_SHEAR_FORCE`: 单侧切向力触发阈值。 -- `TRIGGER_NORMAL_CHANGE`: 单侧法向力相对张开参考值的变化触发阈值。 -- `TRIGGER_SHEAR_CHANGE`: 单侧切向力相对张开参考值的变化触发阈值。 - `GRIP_NORMAL_FORCE`: 夹住时左右接触阈值。 - `GRIP_REQUIRES_BOTH`: 是否必须左右都接触才算夹住。 - `GRIP_START_FORCE`: 检测到物体后先切到的低力。 @@ -51,9 +49,6 @@ gripper_control_02\config\gripper_demo_02.py - `GRIP_SETTLE_SECONDS`: 夹住后等待稳定多久再记录参考力。 - `RELEASE_NORMAL_CHANGE`: 夹住后法向力变化超过它就松开。 - `RELEASE_SHEAR_CHANGE`: 夹住后切向力变化超过它就松开。 -- `RELEASE_CONTACT_LOST_NORMAL_FORCE`: 夹住后判断接触丢失的最大法向力。 -- `RELEASE_CONTACT_LOST_SHEAR_FORCE`: 夹住后判断接触丢失的最大切向力。 -- `RELEASE_CONTACT_LOST_SECONDS`: 接触丢失持续多久后松开。 - `REARM_SECONDS`: 张开后最短等待时间,防止刚松开马上又误触发。 - `RECOVER_NORMAL_FORCE`: 张开恢复时允许重新触发的最大法向残余力。 - `RECOVER_SHEAR_FORCE`: 张开恢复时允许重新触发的最大切向残余力。 @@ -83,9 +78,7 @@ gripper_control_02\config\gripper_demo_02.py ## 常见动作说明 -- `open-wait-armed`: 已经记录张开状态参考值,下一次单侧力变化可以触发闭合。 - `force-change-release-open`: 检测到夹住后的法向或切向变化,已经发出张开命令。 -- `contact-lost-release-open`: 夹住后接触力消失了一小段时间,已经发出张开命令。 - `open-recover-wait-force-clear`: 夹爪保持张开,但传感器还有残余力,不允许重新闭合。 - `open-recover-stabilizing`: 力已经低于恢复阈值,正在等待稳定时间。 - `open-ready`: 力已经清空并稳定,重新进入等待下一次扫过触发。 diff --git a/gripper_control_02/__pycache__/controller.cpython-311.pyc b/gripper_control_02/__pycache__/controller.cpython-311.pyc index 4c4c744..59b1d3e 100644 Binary files a/gripper_control_02/__pycache__/controller.cpython-311.pyc and b/gripper_control_02/__pycache__/controller.cpython-311.pyc differ diff --git a/gripper_control_02/__pycache__/settings.cpython-311.pyc b/gripper_control_02/__pycache__/settings.cpython-311.pyc index 9c50f50..c3efdf4 100644 Binary files a/gripper_control_02/__pycache__/settings.cpython-311.pyc and b/gripper_control_02/__pycache__/settings.cpython-311.pyc differ diff --git a/gripper_control_02/config/__pycache__/gripper_demo_02.cpython-311.pyc b/gripper_control_02/config/__pycache__/gripper_demo_02.cpython-311.pyc index de74636..903d344 100644 Binary files a/gripper_control_02/config/__pycache__/gripper_demo_02.cpython-311.pyc and b/gripper_control_02/config/__pycache__/gripper_demo_02.cpython-311.pyc differ diff --git a/gripper_control_02/config/gripper_demo_02.py b/gripper_control_02/config/gripper_demo_02.py index 93d8951..e0756b8 100644 --- a/gripper_control_02/config/gripper_demo_02.py +++ b/gripper_control_02/config/gripper_demo_02.py @@ -54,27 +54,22 @@ FORCE_MIN = 10 FORCE_MAX = 30 -# 控制循环频率。展示时调高一点,单侧快速扫过不容易漏检。 -CONTROL_HZ = 30.0 +# 控制循环频率。 +CONTROL_HZ = 20.0 # 启动时采集空载基线的时间。 BASELINE_SECONDS = 1.0 # 滤波系数,越大响应越快,越小越平滑。 -FILTER_ALPHA = 0.55 -SHEAR_FILTER_ALPHA = 0.65 +FILTER_ALPHA = 0.35 +SHEAR_FILTER_ALPHA = 0.45 # 等待触发:任意一侧超过这些阈值,就开始闭合。 TRIGGER_NORMAL_FORCE = 0.04 # 单侧法向力触发阈值,单位 N。 TRIGGER_SHEAR_FORCE = 0.04 # 单侧切向力触发阈值,单位 N。 -# 等待触发:如果已经记录了张开时的安静参考值,任意一侧变化超过这些阈值也会闭合。 -# 这样现场轻扫一下也能触发,不完全依赖绝对力超过 TRIGGER_*_FORCE。 -TRIGGER_NORMAL_CHANGE = 0.04 # 单侧法向力相对张开参考值的变化触发阈值,单位 N。 -TRIGGER_SHEAR_CHANGE = 0.04 # 单侧切向力相对张开参考值的变化触发阈值,单位 N。 - # 闭合夹取:物体移动到中间后,左右两边都超过该阈值就认为夹住。 GRIP_NORMAL_FORCE = 0.05 # 双侧接触阈值,单位 N。 @@ -88,22 +83,17 @@ FORCE_RAMP_INTERVAL = 0.2 GRIP_SETTLE_SECONDS = 0.3 # 加到 HOLD_FORCE 后再稳定这么久,进入 hold_check。 # 松开触发阈值。夹住后,法向或切向变化超过其中任意一个,就张开。 -RELEASE_NORMAL_CHANGE = 0.03 # 左/右法向力相对夹住参考值的变化阈值,单位 N。 -RELEASE_SHEAR_CHANGE = 0.03 # 左/右切向力相对夹住参考值的变化阈值,单位 N。 - -# 夹住后如果物体被拿走,法向和切向都降到这些阈值以下并持续一小段时间,也直接张开。 -RELEASE_CONTACT_LOST_NORMAL_FORCE = 0.025 # 判断接触丢失的最大法向力,单位 N。 -RELEASE_CONTACT_LOST_SHEAR_FORCE = 0.025 # 判断接触丢失的最大切向力,单位 N。 -RELEASE_CONTACT_LOST_SECONDS = 0.15 # 接触丢失持续这么久后张开。 +RELEASE_NORMAL_CHANGE = 0.05 # 左/右法向力相对夹住参考值的变化阈值,单位 N。 +RELEASE_SHEAR_CHANGE = 0.05 # 切向力相对夹住参考值的变化阈值,单位 N。 # 松开后至少等待多久重新进入等待触发,避免刚张开时马上再次触发。 REARM_SECONDS = 0.5 # 松开/超时张开后,必须等传感器读数低于这些阈值并稳定,才允许下一次触发。 -# 这几个值应略小于 TRIGGER_NORMAL_FORCE / TRIGGER_SHEAR_FORCE。 -RECOVER_NORMAL_FORCE = 0.035 # 张开恢复时允许重新触发的最大法向残余力,单位 N。 -RECOVER_SHEAR_FORCE = 0.035 # 张开恢复时允许重新触发的最大切向残余力,单位 N。 -RECOVER_STABLE_SECONDS = 0.25 # 力清空后需要连续稳定这么久,才回到 open_wait。 +# 这几个值应小于 TRIGGER_NORMAL_FORCE / TRIGGER_SHEAR_FORCE。 +RECOVER_NORMAL_FORCE = 0.02 # 张开恢复时允许重新触发的最大法向残余力,单位 N。 +RECOVER_SHEAR_FORCE = 0.02 # 张开恢复时允许重新触发的最大切向残余力,单位 N。 +RECOVER_STABLE_SECONDS = 0.4 # 力清空后需要连续稳定这么久,才回到 open_wait。 # 如果读取当前位置失败,保持当前位置时使用这个备用位置;None 表示不使用。 @@ -184,8 +174,6 @@ CONFIG = { "trigger_normal_force": TRIGGER_NORMAL_FORCE, "trigger_shear_force": TRIGGER_SHEAR_FORCE, - "trigger_normal_change": TRIGGER_NORMAL_CHANGE, - "trigger_shear_change": TRIGGER_SHEAR_CHANGE, "grip_normal_force": GRIP_NORMAL_FORCE, "grip_requires_both": GRIP_REQUIRES_BOTH, "close_timeout_seconds": CLOSE_TIMEOUT_SECONDS, @@ -194,9 +182,6 @@ CONFIG = { "grip_settle_seconds": GRIP_SETTLE_SECONDS, "release_normal_change": RELEASE_NORMAL_CHANGE, "release_shear_change": RELEASE_SHEAR_CHANGE, - "release_contact_lost_normal_force": RELEASE_CONTACT_LOST_NORMAL_FORCE, - "release_contact_lost_shear_force": RELEASE_CONTACT_LOST_SHEAR_FORCE, - "release_contact_lost_seconds": RELEASE_CONTACT_LOST_SECONDS, "rearm_seconds": REARM_SECONDS, "recover_normal_force": RECOVER_NORMAL_FORCE, "recover_shear_force": RECOVER_SHEAR_FORCE, diff --git a/gripper_control_02/controller.py b/gripper_control_02/controller.py index 393d824..94bd156 100644 --- a/gripper_control_02/controller.py +++ b/gripper_control_02/controller.py @@ -221,15 +221,7 @@ class SideTriggerGripController: if sleep_time > 0: time.sleep(sleep_time) - def _side_triggered(self, feedback, reference=None): - if reference is not None: - normal_change, shear_change = self._release_changes(feedback, reference) - if ( - normal_change >= self.config.trigger_normal_change - or shear_change >= self.config.trigger_shear_change - ): - return True - + def _side_triggered(self, feedback): return ( feedback.max_normal >= self.config.trigger_normal_force or feedback.max_shear >= self.config.trigger_shear_force @@ -252,9 +244,6 @@ class SideTriggerGripController: return { "left_normal": feedback.left_normal, "right_normal": feedback.right_normal, - "max_normal": feedback.max_normal, - "left_shear": feedback.left_shear, - "right_shear": feedback.right_shear, "max_shear": feedback.max_shear, } @@ -264,21 +253,10 @@ class SideTriggerGripController: normal_change = max( abs(feedback.left_normal - reference["left_normal"]), abs(feedback.right_normal - reference["right_normal"]), - abs(feedback.max_normal - reference["max_normal"]), - ) - shear_change = max( - abs(feedback.left_shear - reference["left_shear"]), - abs(feedback.right_shear - reference["right_shear"]), - abs(feedback.max_shear - reference["max_shear"]), ) + shear_change = abs(feedback.max_shear - reference["max_shear"]) return normal_change, shear_change - def _release_contact_lost(self, feedback): - return ( - feedback.max_normal <= self.config.release_contact_lost_normal_force - and feedback.max_shear <= self.config.release_contact_lost_shear_force - ) - def _log_tick( self, feedback, diff --git a/gripper_control_02/settings.py b/gripper_control_02/settings.py index 0433803..649c6b0 100644 --- a/gripper_control_02/settings.py +++ b/gripper_control_02/settings.py @@ -52,30 +52,25 @@ class Demo02Config: force_min: int = 10 force_max: int = 30 - control_hz: float = 30.0 + control_hz: float = 20.0 baseline_seconds: float = 1.0 - filter_alpha: float = 0.55 - shear_filter_alpha: float = 0.65 + filter_alpha: float = 0.35 + shear_filter_alpha: float = 0.45 trigger_normal_force: float = 0.04 trigger_shear_force: float = 0.04 - trigger_normal_change: float = 0.02 - trigger_shear_change: float = 0.02 grip_normal_force: float = 0.05 grip_requires_both: bool = True close_timeout_seconds: float = 5.0 force_ramp_step: int = 1 force_ramp_interval: float = 0.2 grip_settle_seconds: float = 0.3 - release_normal_change: float = 0.03 - release_shear_change: float = 0.03 - release_contact_lost_normal_force: float = 0.025 - release_contact_lost_shear_force: float = 0.025 - release_contact_lost_seconds: float = 0.15 + release_normal_change: float = 0.05 + release_shear_change: float = 0.05 rearm_seconds: float = 0.5 - recover_normal_force: float = 0.035 - recover_shear_force: float = 0.035 - recover_stable_seconds: float = 0.25 + recover_normal_force: float = 0.02 + recover_shear_force: float = 0.02 + recover_stable_seconds: float = 0.4 hold_fallback_pos: int | None = None trigger_force_update: bool = False @@ -136,8 +131,6 @@ class Demo02Config: add("--trigger-normal-force", type=float, default=get("trigger_normal_force", cls.trigger_normal_force)) add("--trigger-shear-force", type=float, default=get("trigger_shear_force", cls.trigger_shear_force)) - add("--trigger-normal-change", type=float, default=get("trigger_normal_change", cls.trigger_normal_change)) - add("--trigger-shear-change", type=float, default=get("trigger_shear_change", cls.trigger_shear_change)) add("--grip-normal-force", type=float, default=get("grip_normal_force", cls.grip_normal_force)) add("--grip-requires-both", dest="grip_requires_both", action="store_true", default=get("grip_requires_both", cls.grip_requires_both)) add("--allow-single-side-grip", dest="grip_requires_both", action="store_false") @@ -147,9 +140,6 @@ class Demo02Config: add("--grip-settle-seconds", type=float, default=get("grip_settle_seconds", cls.grip_settle_seconds)) add("--release-normal-change", type=float, default=get("release_normal_change", cls.release_normal_change)) add("--release-shear-change", type=float, default=get("release_shear_change", cls.release_shear_change)) - add("--release-contact-lost-normal-force", type=float, default=get("release_contact_lost_normal_force", cls.release_contact_lost_normal_force)) - add("--release-contact-lost-shear-force", type=float, default=get("release_contact_lost_shear_force", cls.release_contact_lost_shear_force)) - add("--release-contact-lost-seconds", type=float, default=get("release_contact_lost_seconds", cls.release_contact_lost_seconds)) add("--rearm-seconds", type=float, default=get("rearm_seconds", cls.rearm_seconds)) add("--recover-normal-force", type=float, default=get("recover_normal_force", cls.recover_normal_force)) add("--recover-shear-force", type=float, default=get("recover_shear_force", cls.recover_shear_force))