This commit is contained in:
cheng
2026-06-08 17:56:09 +08:00
parent 7a15bd8e14
commit cbd8683429
11 changed files with 21 additions and 75 deletions
+1 -8
View File
@@ -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`: 力已经清空并稳定,重新进入等待下一次扫过触发。
+10 -25
View File
@@ -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,
+2 -24
View File
@@ -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,
+8 -18
View File
@@ -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))