Skip to content

docs: note the empty-grasp runaway trip and how to get out of it - #62

Merged
cao-xiao-hao merged 1 commit into
mainfrom
docs/note-the-empty-grasp-runaway-recovery
Oct 14, 2026
Merged

cao-xiao-hao merged 1 commit into
mainfrom
docs/note-the-empty-grasp-runaway-recovery

Conversation

@cao-xiao-hao

Copy link
Copy Markdown
Contributor

Summary

The runaway watch's trigger and the travel_guard flag were both documented, but not the case that actually reaches them: an unloaded grasp() presses onto the closed-side stop and the hold keeps pushing there, so a stop that is not where the calibration says walks the jaws past it. That is the 2026-10-10 failure mode, and the README said nothing about what to do once the flag is set.

The recovery was missing too, and it is not readable off the flag. The trip leaves the jaws outside the calibrated travel, and _release streams kp=kd=tau=0 frames (actions.py:961), so the drive ends up enabled but carrying no torque — it holds nothing, but it is not off either. That is what makes the jaws movable by hand, and it is the reason the procedure below is safe to prescribe.

Documentation only. No behaviour change.

Changes

  • README.md — a new paragraph under The runaway watch in "Gripping and force" covering the empty-grasp case, the state the trip leaves the mechanism in, and the way out (disable(), move the jaws clear by hand, enable()).
  • README.md — the travel_guard row of the Troubleshooting table gains the same recovery, since that table is where someone looks while standing at the machine.
  • readme_zn.md — both of the above, mirrored. The two READMEs are updated in the same commit throughout this repository's history, so changing one alone would desynchronise them.

Two facts the wording rests on, both read off the code rather than assumed:

  • _release sends kp=kd=tau=0 for stop_release_s, so the motor is left enabled and torque-free.
  • Neither the guard path (actions.py:1387-1395) nor the hold's fault path (actions.py:1379-1382) calls disable(). Disabling is the operator's step, not the SDK's.

Testing

$ python3 -m unittest discover -s tests -t tests
Ran 437 tests in 9.708s

OK (skipped=12)

A docs-only change cannot be exercised by the suite; the run is here to show the tree is green rather than to cover the edit.

Issues

No issue. gh issue list --state all shows no open issues and none about the runaway watch or the travel_guard recovery; the closest historical one is #40 (guarding the force hold), which is closed.

The runaway watch's trigger and the `travel_guard` flag were both
documented, but not the case that actually reaches them: an unloaded
grasp() presses onto the closed-side stop and the hold keeps pushing
there, so a stop that is not where the calibration says walks the jaws
past it.

The recovery was missing too, and it is not readable off the flag. The
trip leaves the jaws outside the calibrated travel, and _release streams
kp=kd=tau=0 frames, so the drive ends up enabled but carrying no torque
- it holds nothing, but it is not off either, and that is what makes
the jaws movable by hand. Say that, and say that calling grasp() again
from outside only re-approaches and presses the same stop.

Written into both README.md and readme_zn.md, which are maintained in
parallel.
@cao-xiao-hao
cao-xiao-hao merged commit 351f80d into main Oct 14, 2026
1 check passed
@cao-xiao-hao
cao-xiao-hao deleted the docs/note-the-empty-grasp-runaway-recovery branch October 14, 2026 02:59
@github-actions

Copy link
Copy Markdown

🎉 This PR is included in version 1.0.2 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

@github-actions github-actions Bot added the released Shipped in a release label Oct 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

released Shipped in a release

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant