Skip to content

Issue 96/use gripper's object status to determine the ROS stalled and reached_goal states - #100

Merged
ebarnett3 merged 6 commits into
mainfrom
issue-96/object-status-verdict
Sep 29, 2026
Merged

ebarnett3 merged 6 commits into
mainfrom
issue-96/object-status-verdict

Conversation

@ebarnett3

@ebarnett3 ebarnett3 commented Sep 26, 2026 •

Copy link
Copy Markdown
Collaborator

Closes #96.

The ROS parallel_gripper_action_controller class decides stalled and reached_goal states from the joint velocity alone. The Robotiq adaptive grippers report these states directly as the object_detection, state so there is no need to use the velocity. In fact, the velocity would provide a significantly worse measure, since it would need to be computed based on a finite difference of the actual position.

Therefore, the purpose of the changes here are create a gripper action controller that uses the object_detection reported by the gripper by default for determining the stalled and reached_goal states: robotiq_controllers/GripperActionController derives from the parallel_gripper_action_controller and adds one parameter, use_object_status. With it on, a goal is stalled when the gripper reports an object while opening or closing and reached_goal when it reports the requested position or meets goal_tolerance; the stock stall timeout is disabled, so only the gripper can call a stall. The joint must export object_status; the controller refuses to activate otherwise, rather than claiming every state interface in the controller manager to look for it. Because the gripper keeps reporting the previous goal's outcome until it acts on the new target, a settled state counts only once it differs from the value read at goal acceptance or once motion was seen; a goal that never shows either is decided by goal_tolerance alone.

The flag ships on in the driver config: there is no stock behaviour to preserve, since the driver's velocity is always zero and every goal came back stalled (#29). The ros2_control mock exports no object_status, so it gets a config of its own with the flag off, selected by the launch like the topic-based one; the SDK's simulated gripper (robotiq/grippers#37) will run behind the driver and need none. Controller name, action, result fields and parameters are unchanged. Bench on a 2F-85 with #92 merged locally: 40 free cycles with no false stall in either mode; closing on a 35 mm block, the stall verdict came 10 ms after the fingers stopped with the flag on, 1.8 s with it off, when using velocity estimation. Humble, whose stock GripperCommand controller has the same velocity stall, gets the same parameter in a follow-up PR stacked on this one.

Verified on Jazzy (new gtest through an action client; mock and SDK fake bringups, each activating all four controllers and reaching a goal), and built with tests in ros:lyrical and ros:humble containers.

@ebarnett3
ebarnett3 force-pushed the issue-96/object-status-verdict branch 3 times, most recently from 66fbe91 to f1d760b Compare September 28, 2026 04:55
@ebarnett3 ebarnett3 changed the title Issue 96/object status verdict Issue 96/use gripper's object status to determine the ROS stalled and reached_goal states Sep 28, 2026

@l-tschreiber-a11y l-tschreiber-a11y left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review pass (Claude Code). No blocking bugs — the object-status verdict logic is sound and well covered by the new gtest suite. A few behavioral notes and nits posted inline; the two I'd weigh before merge are the decode() message-suppression change and the coupling of the disabled stock stall to base internals.

Comment thread grippers/robotiq_controllers/src/gripper_status.cpp
Comment thread grippers/robotiq_controllers/src/gripper_action_controller.cpp Outdated
Comment thread grippers/robotiq_controllers/src/gripper_action_controller.cpp Outdated
Comment thread grippers/robotiq_controllers/src/gripper_action_controller.cpp
Comment thread .github/workflows/ci-ros-build-test.yml
ebarnett3 and others added 6 commits September 28, 2026 19:45
- add GripperActionController, a subclass of the stock parallel gripper controller
- use_object_status (parameter default false): stalled/reached from object_status; the gripper's verdict wins over goal_tolerance
- claim the joint's object_status with the flag on; refuse to activate without it
- abort a goal the gripper has not decided within object_status_timeout (default 10 s)
- read the status as the SDK's Robotiq::ObjectDetection, through gripper_status::toObjectDetection; the SDK headers come from robotiq_driver, include directories only
- build and register the controller on Jazzy and newer only
- test the controller through an action client; let test_compat pass parameter overrides and loan command interfaces

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…troller

- switch the Jazzy configs to the new controller type
- use_object_status: true in the driver config; the stock velocity check never worked there (#29)
- give the ros2_control mock its own config, the driver's with the flag off, since it exports no object_status
- select the config per hardware flag in the launch
- test the flag in every config, the mock config against the driver's, and the launch's selection

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- name the new controller type for Jazzy and Lyrical
- say how stalled/reached are decided by the driver's object detection, and by the velocity check for the sims

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- ros:lyrical-ros-base ships service_msgs from an older sync than the control_msgs rosdep installs, so test_gripper_action_controller failed to load
- apt-get upgrade before the install step, so every package comes from the same sync

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- reassert the disabled stock stall timeout every cycle instead of once at activation
- time object_status_timeout from the last motion seen as well as from acceptance
- reject a non-positive object_status_timeout at configure
- say why decode() waits on an out-of-range object_status

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- replace bringUp/init/assign's positional bools with a Config struct and named setters
- spell out the action type name

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

controller: take stall and reached from the gripper's object status, not a velocity timeout

2 participants