Issue 96/use gripper's object status to determine the ROS stalled and reached_goal states - #100
Merged
Merged
Conversation
ebarnett3
force-pushed
the
issue-96/object-status-verdict
branch
3 times, most recently
from
September 28, 2026 04:55
66fbe91 to
f1d760b
Compare
l-tschreiber-a11y
left a comment
Collaborator
There was a problem hiding this comment.
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.
l-tschreiber-a11y
approved these changes
Sep 28, 2026
- 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>
ebarnett3
force-pushed
the
issue-96/object-status-verdict
branch
from
September 29, 2026 00:25
f1d760b to
95880eb
Compare
This was referenced Sep 29, 2026
robotiq_description: sim goals abort as stalled when the simulator publishes no joint velocities
#63
Open
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #96.
The ROS
parallel_gripper_action_controllerclass decidesstalledandreached_goalstates 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
stalledandreached_goalstates:robotiq_controllers/GripperActionControllerderives from theparallel_gripper_action_controllerand adds one parameter,use_object_status. With it on, a goal is stalled when the gripper reports an object while opening or closing andreached_goalwhen it reports the requested position or meetsgoal_tolerance; the stock stall timeout is disabled, so only the gripper can call a stall. The joint must exportobject_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 bygoal_tolerancealone.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 stockGripperCommandcontroller 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:lyricalandros:humblecontainers.