完善释放控制:稳定/迅速行为预设、力曲线夹稳门控与会话记录。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
cheng
2026-09-22 12:05:22 +08:00
parent daa0ec8aec
commit 858e020c77
20 changed files with 3753 additions and 281 deletions
+50 -18
View File
@@ -11,8 +11,8 @@
5. 闭合过程中检测到物体后,切到低力并保持当前位置。
6. 像 01 一样进入 `gripping`,先慢慢加力到基础 `HOLD_FORCE`。
7. 进入 `hold_check` 后,根据切向力估计物体负载;切向力越大,目标夹紧力越高,并按小步进继续补力。
8. 自适应补力停止并稳定 `RELEASE_ARM_DELAY_SECONDS` 后,重新记录释放参考力,才开始检测人取物松开。
9. 后续法向力或切向力变化超过阈值,夹爪直接张开到 `OPEN_POS`。
8. 接触起立即检测新的侧触;侧触释放不等待固定夹稳计时。普通法向变化另有短保护,无需等爬力完成。
9. 新外力偏离既有曲线且持续,经新帧确认后张开到 `OPEN_POS`;原曲线变平、斜率变号和自然回落继续跟随,不靠累计位移释放。
10. 张开后进入 `open_recover`,保持张开并等待恢复条件。
11. 夹爪回到 `OPEN_POS` 初始点位,或法向/切向读数都低于恢复阈值并稳定后,继续休息至少 `REARM_SECONDS`。
12. 休息结束后才回到 `open_wait` 并重新武装;休息期间不管有没有物体扫过,都不会闭合。
@@ -153,14 +153,14 @@ python -m gripper.visualizer --windowed
- `trigger_normal_force`: 单侧法向力触发阈值。
- `trigger_shear_force`: 单侧切向力触发阈值。
- `trigger_clear_stable_seconds`: 张开恢复后,触发力必须清掉并稳定多久,才允许下一次扫过触发。
- `trigger_clear_stable_seconds`: 旧配置兼容字段;当前稳定基线增量触发不使用它。
- `grip_normal_force`: 夹住时左右接触阈值。
- `grip_requires_both`: 是否必须左右都接触才算夹住。
- `grip_start_force`: 检测到物体后先切到的低力。
- `force_ramp_step`: 慢慢加力时每次增加多少 force_pct。
- `force_ramp_interval`: 慢慢加力时两次加力的间隔。
- `hold_force`: 慢慢加力到这个值后进入 `hold_check`。
- `grip_settle_seconds`: 夹住后等待稳定多久再记录参考力。
- `grip_settle_seconds`: `gripping` 进入 `hold_check` 的最早时间,不控制释放保护。
- `adaptive_grip_enabled`: 是否启用按切向力估计负载并自适应补夹紧力。
- `adaptive_shear_start_force`: 切向力低于这个值时,认为是轻物体,只使用最小目标力。
- `adaptive_shear_full_force`: 切向力达到这个值时,认为负载较大,目标力加到最大目标力。
@@ -168,9 +168,19 @@ python -m gripper.visualizer --windowed
- `adaptive_force_max`: 自适应夹持的最大目标力;重物夹不住优先加这个,但不要超过 `force_max`。
- `adaptive_force_step`: 自适应补力时每次增加多少 `force_pct`。
- `adaptive_force_interval`: 自适应补力两次之间的间隔,越大越柔和。
- `release_arm_delay_seconds`: 自适应补力停止后,等待多久再启用“人取物松开”检测。
- `release_normal_change`: 夹住后法向力变化超过它就松开。
- `release_shear_change`: 夹住后切向力变化超过它就松开。
- `release_arm_delay_seconds`: 自运动实际命令执行完成后的短保护,默认 0.12s,不是旧式总释放延时。
- `release_min_hold_seconds`: 普通法向接触保护,默认 0.28s;即时侧触路径不等待它。
- `release_settle_seconds`: 脉冲拒绝/断流后的短恢复保护,默认 0.06s;不再要求全局持续安静。
- `release_normal_rate` / `release_shear_rate`: 突变释放的速率门槛,默认 1.6 N/s。
- `release_min_change`: 普通突变/轻触的最小净变化,默认 0.04 N。
- `release_side_touch_change`: 即时侧触的左右力差变化,默认 0.06 N。
- `release_touch_window_seconds`: 新外力起始证据有效期,默认 0.2s;不是等待时间。
- `release_confirm_samples`: 突变确认新帧数,默认 2,包含首帧;平台偏移也能确认。
- `release_slow_rate`: 慢变日志分类速率,默认 0.4 N/s;参考跟随由曲线延续决定,不门控就绪。
- `release_normal_change` / `release_shear_change`: 中速外力累积的弱路径阈值,默认 0.28 N。
- `release_slow_confirm_samples`: 弱路径确认新帧数,默认 5。
- `release_confirm_window_seconds`: 释放候选最长有效期,默认 0.2s。
- `release_sample_timeout_seconds`: 采样断流后重新等待平稳的门槛,默认 0.2s。
- `release_open_speed`: 检测到松开后,张开到 `open_pos` 使用的速度。
- `release_open_accel`: release 张开的加速度。
- `release_open_decel`: release 张开的减速度。
@@ -191,7 +201,7 @@ python -m gripper.visualizer --windowed
- `maxN`: 左右法向力最大值,单位 N。
- `shear`: 左右切向力最大值,单位 N。
- `trigger`: 是否满足单侧触发条件。
- `armed`: 是否已经重新武装;只有 `trigger=1 armed=1` 且是新的一次触发上升沿才会闭合。
- `armed`: 是否已经获得稳定通道基线;当前值相对该基线增长到触发阈值才会闭合。
- `grip_contact`: 是否满足夹住接触条件。
- `dN`: 夹住后当前法向力相对参考值的最大变化,单位 N。
- `dShear`: 夹住后当前切向力相对参考值的变化,单位 N。
@@ -199,7 +209,8 @@ python -m gripper.visualizer --windowed
- `hold_pos`: 夹住后保持的位置。
- `force_pct`: 当前夹爪目标力百分比。
- `target`: 当前根据切向力计算出来的自适应目标力。
- `release_armed`: 是否已经启用释放检测;`0` 表示还在补力/等待稳定,`1` 表示法向或切向变化会触发张开。
- `release_armed`: 普通监视或候选确认;独立即时侧触是否运行还需看 `side_watch`。
- `side_watch`: 即时侧触监视,普通法向保护期间也可以为 `1`。
- `action`: 当前动作。
## 可视化展示
@@ -210,7 +221,7 @@ python -m gripper.visualizer --windowed
- 当前 `state`、`action`、`trigger/armed`、`grip_contact`。
- 当前 `force_pct`、自适应目标力、速度 `speed_pct`、`hold_pos`。
- 顶部有 `重启` 按钮,会先停止当前控制线程,释放相机与夹爪后再重新启动。
- 当前 `release_armed`,用于判断系统是在补夹紧力,还是已经开始检测人取物松开。
- 当前 `release_armed` 及 `release_side_watch`,分别表示普通释放与即时侧触检测。
- 折线图带图例,默认固定 y 轴为 `0~3 N`,范围在 `visualizer.py` 顶部的 `PLOT_FORCE_Y_MIN_N / PLOT_FORCE_Y_MAX_N` 调整。
- 左右传感器 FPS、接触标志、光流均值/最大值。
- 中间 3D 夹爪使用 `crt_ctag2f90d_gripper_visualization` 里的完整 STL/URDF 实体面片模型;启动时会预缓存 41 个开合档位,运行中只按实际位置切换缓存,避免拖慢控制延迟。
@@ -220,7 +231,7 @@ python -m gripper.visualizer --windowed
- `open_wait`: 夹爪张开,等待任意单侧触发。
- `closing`: 单侧触发后正在闭合,等待检测到物体。
- `gripping`: 检测到物体后低力保持当前位置,并慢慢加力。
- `hold_check`: 已夹住;先根据切向力自适应补夹紧力,补力稳定后再监测法向/切向变化;变化超过阈值会直接张开。
- `hold_check`: 已达到基础保持力;每 tick 先监视释放,再决定是否补力;候选确认优先于补力。
- `open_recover`: 已经发出张开命令,正在等待回到初始点位或等待法向/切向残余力清空;这个状态不会闭合夹爪。
## 常见动作说明
@@ -228,14 +239,35 @@ python -m gripper.visualizer --windowed
- `force-change-release-open`: 检测到夹住后的法向或切向变化,已经发出张开命令。
- `adaptive-grip-ramp`: 切向力显示负载较大,正在按小步进增加夹紧力。
- `adaptive-grip-wait`: 已经需要更高目标力,但还没到下一次加力时间。
- `release-arm-delay`: 补力刚停止,正在等待力稳定,暂时不触发松开。
- `release-reference-armed`: 已重新记录释放参考力,后续法向/切向变化会触发张开。
- `release-grip-settle`: 普通法向接触保护,独立即时侧触仍可检测。
- `release-self-settle`: 普通法向自运动保护,独立即时切向侧触仍可检测。
- `release-ready`: 夹稳通过,开始监视释放。
- `release-sudden`: 突变外力候选及确认。
- `release-touch`: 新的曲线起始变化及轻推偏移确认,不要求大瞬时速率。
- `release-side_touch`: 即时侧触确认,不等固定夹稳时间。
- `release-slow_internal`: 缓慢变化跟随参考。
- `release-slow_external`: 新起始变化后达到弱路径幅度,经较长确认。
- `release-transient-rejected`: 候选回弹或方向改变,丢弃此次证据。
- `release-settling-turn` / `curve=settling_turn`: 平稳拐点,继续夹持。
- `release-sample-gap`: 传感器断流,丢弃旧证据,等待新帧后恢复监视。
- `open-recover-position`: 夹爪当前位置已经接近 `OPEN_POS`,正在等待到位稳定。
- `open-ready-position`: 夹爪已经回到初始点位,并且休息时间结束,重新进入等待下一次扫过触发;此时会直接武装,但残余触发保持不变不会自动闭合。
- `open-wait-clear-trigger`: 已经回到等待状态,但当前力还超过触发阈值,暂时不会闭合。
- `open-wait-trigger-clearing`: 触发力已经低于阈值,正在等待清零稳定时间。
- `open-wait-armed`: 触发已经清掉并稳定,下一次扫过可以闭合。
- `open-wait-trigger-held`: 已经武装,但当前触发不是新上升沿,等待力先降下去再下一次扫过。
- `open-ready-position`: 夹爪已经回到初始点位,并且休息时间结束,重新进入等待下一次扫过触发;此时重新采集稳定基线,残余力保持不变不会自动闭合。
- `open-wait-armed`: 已锁定稳定通道基线,下一次增量侧触可以闭合。
- `open-recover-wait-force-clear`: 夹爪保持张开,但传感器还有残余力,不允许重新闭合。
- `open-recover-stabilizing`: 力已经低于恢复阈值,正在等待稳定和休息时间结束。
- `open-ready`: 力已经清空并稳定,并且休息时间结束,重新进入等待下一次扫过触发。
## 释放状态设计与验证
[释放控制说明](docs/RELEASE_CONTROL.zh-CN.md) 包含独立 FSM、参数语义、曲线判据、
回放命令及实机验收步骤。每次自运动稳定后会保留至少约 100ms 的观察窗口;基础爬力
和自适应补力间隔因此可能比配置更长。侧触路径从接触就开始运行,普通法向与两侧共同变化仍有短保护。
```powershell
python -m unittest discover -s tests -v
```
软件回放验证稳定后外力至释放决定不超过 200ms;相机、串口和机械延迟需实机测量。
所有释放路径都要求新的曲线起始变化。闭合前的趋势会带入接触阶段,避免把原曲线的拐点当新触碰。
每次自动释放后保存 `logs/release-last.json`,包含此前最多 120 帧控制快照与判据,用于复核实机误开。