# Gripper Control 当前实际控制链: 1. `gripper_control/main.py` 程序入口,负责组装配置、触觉读取、夹爪硬件和控制器。 2. `gripper_control/config.py` 读取 Python 配置文件和命令行参数,生成 `ControlConfig`。 3. `gripper_control/force_reader.py` 启动左右两个触觉传感器进程,读取 `FNORMAL`、`FSHEARX`、`FSHEARY`。 4. `gripper_control/calibration.py` 把原始力值映射成 N。 5. `gripper_control/feedback.py` 做基线扣除、滤波,输出控制器需要的力反馈。 6. `gripper_control/hardware.py` 封装夹爪 SDK 的 `temp_move`、`set_target_force`、`read_real_position`。 7. `gripper_control/controller.py` 定时开合、检测物体、慢慢加力、稳定夹持、空夹恢复、人取物松手的状态机。 ## 运行 从项目根目录运行: ```powershell conda activate py311 python -m gripper_control.main ``` 旧入口仍然可用: ```powershell python examples\gripper_timed_cycle_control.py ``` 默认配置文件: ```text gripper_control\config\gripper_timed_cycle_control.py ``` 只测试逻辑、不打开串口: ```powershell python -m gripper_control.main --dry-run ``` ## 日志字段 程序运行时主要有两类输出:周期状态日志和事件日志。 ### 周期状态日志 示例: ```text t=38.83s L=0.024N R=0.067N min=0.024N max=0.067N diff=-0.043N both=0 object=0 grip_contact=0 empty_for=0.4s shear=0.113N d_shear=-0.013N shear_stable=1 state=hold_check gripped=1 hold_pos=9000 force_pct=15 action=hold-check ``` 字段说明: - `t`: 当前 close phase 已经运行的时间,单位秒。 - `L`: 左侧触觉传感器标定后的法向力,单位 N。 - `R`: 右侧触觉传感器标定后的法向力,单位 N。 - `min`: 左右两侧法向力中的较小值,单位 N。 - `max`: 左右两侧法向力中的较大值,单位 N。 - `diff`: `L - R`,左右法向力差值,单位 N;负数表示右侧更大。 - `both`: 左右两侧是否都超过 `BOTH_CONTACT_FORCE`;`1` 是,`0` 否。 - `object`: 是否确认检测到物体;默认需要达到 `OBJECT_FORCE` 且 `both=1`。 - `grip_contact`: 夹持后是否仍然认为有接触;默认等于 `both`。 - `empty_for`: 夹持/保持状态下,接触连续消失的时间;达到 `EMPTY_RELEASE_SECONDS` 后恢复定时开合。 - `shear`: 标定后的切向力,单位 N;由 `sqrt(FSHEARX^2 + FSHEARY^2)` 映射得到。 - `d_shear`: 本次循环相对上一次循环的切向力变化量,单位 N;负数表示切向力下降。 - `shear_stable`: 切向力是否进入稳定计时;`1` 表示已经超过 `SHEAR_HOLD_FORCE` 且变化小于 `SHEAR_STABLE_DELTA`。 - `state`: 控制器当前状态。 - `gripped`: 是否已经进入过夹持状态;`1` 是,`0` 否。 - `hold_pos`: 夹爪保持位置;通常是检测到物体时读取到的当前位置。 - `force_pct`: 当前发送给夹爪的目标力百分比。 - `action`: 当前这一步执行或等待的动作。 ### 事件日志 示例: ```text L=0.013N R=0.223N min=0.013N max=0.223N force_pct=10 action=empty-grip-resume-cycle ``` 这类日志只在关键事件发生时打印,所以字段更少。 - `L/R/min/max`: 事件发生时的左右法向力和最小/最大法向力,单位 N。 - `force_pct`: 事件发生后设置的夹爪目标力百分比。 - `action=empty-grip-resume-cycle`: 已经进入夹持/保持状态,但接触连续消失超过 `EMPTY_RELEASE_SECONDS`,程序判断为空夹,退出当前夹持状态,回到定时开合循环。下一轮会先执行 open phase。 ### 常见状态 - `closing`: 正在按定时循环闭合,还没确认检测到物体。 - `gripping`: 已检测到物体,夹爪保持当前位置,并从低力慢慢加力。 - `hold_check`: 切向力已经达到最低要求并稳定,夹爪进入保持/人取物检测状态。 ### 常见 action - `closing`: 继续闭合等待物体。 - `close-continue`: 未检测到物体,重复发送闭合命令。 - `object-detected-low-force`: 检测到物体,停止定时开合,并把夹爪力切到 `GRIP_START_FORCE`。 - `grip-ramp-up`: 夹住后慢慢增加 `force_pct`。 - `wait-shear-stable`: 切向力已超过 `SHEAR_HOLD_FORCE`,正在等待稳定。 - `shear-stable-hold`: 切向力稳定时间达到 `SHEAR_STABLE_SECONDS`,进入 `hold_check`。 - `hold-check`: 保持夹住,等待人取物触发。 - `hold-check-armed`: 进入 `hold_check` 后已经过了 `HUMAN_HOLD_SECONDS`,开始监测人取物。 - `human-release-open`: 检测到人取物造成的切向力变化,夹爪张开。 - `empty-grip-resume-cycle`: 夹持后接触消失,判定为空夹,回到定时开合。 - `emergency-open`: 超过 `EMERGENCY_TOUCH_FORCE` 且启用 emergency open 后,夹爪张开。