It accepts a detector-provided RGB bbox and returns a vertical grasp pose in
arm/base_link. It does not publish /graspnet/grasps, does not host
/graspnet/grasp_request, and does not build or import graspnet_msgs.
Project [u, v, 1] through the required 3x3 homography to get
arm-plane (x, y).
Apply optional global bias_x / bias_y.
Pick the gripper yaw: if the request carries a usable
orientation label (vertical / horizontal / diag_tlbr /
diag_trbl), the yaw is looked up directly from
_ORIENTATION_YAW_RAD; otherwise (unknown / empty / unrecognized)
fall back to the bbox-long-edge estimator
_gripper_angle_by_longer.
Apply catch_offset along the yaw direction.
Use default_desktop_height as the final grasp z.
Return a vertical-down PoseStamped in output_frame, default
arm/base_link.
Orientation → yaw mapping
The convention is that yaw is the angle of the gripper’s closing line
(between the two fingertips) w.r.t. the image x-axis, in (-π/2, π/2].
The gripper closing line is placed perpendicular to the object’s
principal axis, so:
detector label
object long axis
gripper yaw
horizontal
—
+π/2
vertical
|
0
diag_tlbr
\
-π/4
diag_trbl
/
+π/4
unknown / “” / other
—
fallback: bbox long edge
The server logs which branch fired: look for
yaw=<value> (via orientation=…) vs yaw=<value> (via bbox_long_edge).
The success message field also echoes yaw_via=… for quick
inspection from the pick_skill side. The detector’s own 180°
camera-to-arm remap is already applied upstream (in llm_detect), so
grasp_pose does not flip the label a second time.
Depth, camera intrinsics, and TF are intentionally not used.
grasp_pose_rbnx
gRPC geometric grasp-pose estimator for the Piper + Orbbec vertical grasp pipeline.
What It Does
grasp_pose_rbnxowns:It accepts a detector-provided RGB bbox and returns a vertical grasp pose in
arm/base_link. It does not publish/graspnet/grasps, does not host/graspnet/grasp_request, and does not build or importgraspnet_msgs.Runtime path:
Algorithm
For each
grasp_request:bbox_2d = [x_min, y_min, x_max, y_max].(u, v).[u, v, 1]through the required 3x3 homography to get arm-plane(x, y).bias_x/bias_y.orientationlabel (vertical/horizontal/diag_tlbr/diag_trbl), the yaw is looked up directly from_ORIENTATION_YAW_RAD; otherwise (unknown/ empty / unrecognized) fall back to the bbox-long-edge estimator_gripper_angle_by_longer.catch_offsetalong the yaw direction.default_desktop_heightas the final grasp z.PoseStampedinoutput_frame, defaultarm/base_link.Orientation → yaw mapping
The convention is that yaw is the angle of the gripper’s closing line (between the two fingertips) w.r.t. the image x-axis, in
(-π/2, π/2]. The gripper closing line is placed perpendicular to the object’s principal axis, so:horizontal—+π/2vertical0diag_tlbr\-π/4diag_trbl/+π/4unknown/ “” / otherThe server logs which branch fired: look for
yaw=<value> (via orientation=…)vsyaw=<value> (via bbox_long_edge). The successmessagefield also echoesyaw_via=…for quick inspection from the pick_skill side. The detector’s own 180° camera-to-arm remap is already applied upstream (inllm_detect), sograsp_posedoes not flip the label a second time.Depth, camera intrinsics, and TF are intentionally not used.
Required Config
Runtime config comes from
robonix_manifest.yaml:You may provide an inline
homography_matrixinstead ofhand_eye_calibration_file.Useful optional knobs:
Build / Run
scripts/build.shrunsrbnx codegenfor protobuf/gRPC stubs.Debugging
Check:
Common failure causes:
bbox_2d is requiredhand_eye_calibration_file does not existmissing required roboarm config: default_desktop_heightdefault_desktop_height