Documentation can be found under: https://grasplan-documentation.readthedocs.io/en/latest/
The pick action uses the configured Grasplan planner for objects present in
that planner's object catalog. If the object class is not in the catalog, the
goal is forwarded to an AnyGrasp server using the same PickObjectAction
interface. A failed Grasplan attempt for a known object is final and does not
trigger the fallback.
For the handcoded planner, known classes are the keys below the
handcoded_grasp_planner_transforms parameter. Numeric instance suffixes are
ignored, so (for example) relay_3 is checked as class relay. The fallback
forwards the original object text unchanged.
The fallback is configured by these private parameters on pick_object_node:
anygrasp_action_name(default/mobipick/grasp_object)anygrasp_generate_action_name(default/mobipick/generate_grasps)anygrasp_handles_execution(defaultfalse): whenfalse, AnyGrasp only generates candidates and Grasplan executes them through MoveIt; set it totrueto retain AnyGrasp-owned executionanygrasp_server_timeout(default2.0seconds)anygrasp_result_timeout(default300.0seconds;0waits indefinitely)anygrasp_view_service(default/mobipick/grasp_view): agrasplan/ViewObjectservice that moves the camera to a view of the object suited to AnyGrasp (sampled around its committed pose, the whole object within the depth range); when it is unavailable or fails (e.g. no committed pose: perceive the object first) the pick failsanygrasp_named_view_fallback(defaultfalse):truerestores the old fallback toanygrasp_arm_pose(defaultanygrasp, an SRDF arm pose) when the view service is unavailable or failsopen_set_pick_start_pose(defaulttransport): after the grasp view, open-set picks move the arm to this SRDF pose (guarded named move) and plan the grasp from there instead of from the view; empty plans from the viewgrasp_type_hints_ns(default/mobipick/grasp_type_hints; empty ignores hints): the planner may set<ns>/<object key>(the object name lowercased, spaces and dashes as underscores, e.g.tomato_soup_can) toside,toporautobefore an open-set pick:sidere-ranks the AnyGrasp grasps with the side-grasp bonus (grasp_type_hint_side_multiplier, default 1.5) across the vertical axis,topapplies the low-object rule below whatever the box,autoor nothing lets the geometry decideopen_set_low_object_max_height(default0.05m) andopen_set_small_object_max_footprint(default0.06m,0= off): an object lower than the first, or with both horizontal sides below the second, is grasped from the top only: grasps more thanopen_set_low_object_max_tilt_deg(default10,0= rule off) off vertical are dropped, the others lowered to the fingertip clearance (open_set_low_object_sink, defaulttrue), else the top-down graspsopen_set_complete_one_sided_boxes(defaulttrue): a standing box at least 1.5x taller than wide whose side along the line of sight fromopen_set_camera_frameis the shorter one (one view sees only the front of a can) gets its full depth behind the visible face, in the planning scene and for graspingmax_box_sink_into_support(default0.09m,0= off): a perceived box whose bottom is deeper than this inside its support is left out of the planning scene as implausible (a false detection); the object being picked staysdrop_boxes_overlapping_target(default0.2,0= off): a perceived box that shares at least this fraction of the smaller volume with the open-set target is left out of the planning scene (a false detection on the target)
On place_object_node and insert_object_node (with disentangle_required): an object picked open-set (its class is
not in the pick node's catalog pick_grasp_catalog_param, default
/mobipick/pick_object_node/handcoded_grasp_planner_transforms) skips the poses_to_go_before_place /
poses_to_go_before_insert untangle detour and moves to open_set_place_start_pose (default transport, empty = no
move) instead; open_set_skip_untangle_detour: false keeps the detour for every object.
external_grasp_ik_prefilter(defaulttrue): before planning, drop AnyGrasp grasps whose grasp pose has no IK solution (compute_ik, 0.1 s each, no collision check);external_grasp_max_attempts(default12,0= all): then offer only the best N to the planner. A standing Pringles can once cost ~2 min of MTC on 50 grasps. The log gives the time of the pre-filter and of every batch.anygrasp_use_gripper_width(defaultfalse): when disabled, unknown objects use the fully closedgripper_closeposture. When enabled, each AnyGrasp candidate's predicted jaw width is used instead.anygrasp_gripper_width_offset(default0.0metres): added to predicted widths when width control is enabled; use a small negative value to close farther. The result is clamped betweengripper_closeandgripper_open.anygrasp_gripper_max_effort(default-1.0): non-negative values override the grasp posture's effort limit for unknown objects. Negative values retaingripper_joint_efforts. Units and torque/force interpretation depend on the configured gripper controller.
With the Grasplan pick server and AnyGrasp server running, exercise the fallback with an object description that is absent from the active planner's catalog:
rosrun grasplan open_set_pick_obj_test_action_client "red mug"This repo has a pre-commit check that runs in CI. You can use this locally and set it up to run automatically before you commit something. To install, use pip:
pip3 install --user pre-commitTo run over all the files in the repo manually:
pre-commit run -aTo run pre-commit automatically before committing in the local repo, install the git hooks:
pre-commit install