Connector Tools#
Every connector ships a small, fixed set of embodiment tools: thirteen
robot.* tools registered by the connector base class, plus six sim.*
tools added by simulation connectors. These are the engineβs entire
built-in tool surface β everything else (perception, geometry, motion
planning) comes from skill bundles, documented in the
Tool catalog.
Graphs reach these tools two ways:
a
type: "tool"node inworkflow.json, e.g."tool": "robot.go_to_pose";ctx.tool("robot.go_to_pose", pose=..., ...)from inside a script node.
Both go through the same flat dispatch surface, so the names below are
exactly what you write in either place. The registry is built once per
connector (gap/connector/core.py);
bundle @tool registrations are drained into it by
gap.execute(..., skills=...).
Conventions#
Poses are
Se3Posedicts:{"position": {"x", "y", "z"}, "rotation": {"w", "x", "y", "z"}}β quaternions are wxyz scalar-first everywhere in GaP.Gripper fraction is
0.0= fully closed,1.0= fully open.Joint configs are
{"positions": [...]}dicts (a bare list is also accepted); a trajectory is{"waypoints": [joint_config, ...]}.Failures raise
ToolError(tool, detail)β aPipelineErrorsubclass that workflowon_errorexits can catch.
robot.* β observation getters#
Untagged, read-only, available on every connector (sim and real).
Tool |
Parameters |
Returns |
|---|---|---|
|
β |
|
|
|
|
|
|
|
|
|
|
|
|
|
robot.* β motion (tag: sim_step)#
Tool |
Parameters |
Returns |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
β |
|
|
|
|
|
|
|
Behavioral details, verified against
gap/connector/core.py:
robot.go_to_posesolves IK for the world-frame pose, then runs a blocking joint move. Zero-valued parameters take embodiment defaults:tolerance <= 0β 0.01 rad (7-DOF Panda) or 0.03 rad (6-DOF arms);max_steps <= 0β 120 (Panda) or 300 (6-DOF).tcp_offset=Nonedefaults to{"x": 0, "y": 0, "z": -0.1}(meters, EE frame).z_approach > 0first moves to a point that far above the target.nonblocking=Trueforcesmax_steps=0, publishing the command once and returning immediately β each new call supersedes the last. IK failure raisesToolError.robot.go_to_pose_cartesianplans a straight Cartesian line from the current EE pose and executes it. The target must already be in the IK link frame (panda_handfor Franka,link_6for 6-DOF arms). RaisesToolErrorwhen the linear plan fails.robot.move_to_jointsblocks until convergence;tolerance <= 0β 0.01 rad,max_steps <= 0β 120. Emptyjoint_configraisesToolError.robot.execute_trajectoryruns waypoints with defaultssubsampleβ 1,toleranceβ 0.01,max_steps_per_waypointβ 120. It forces the env intoclosed_loopjoint-motion mode for the duration (qpos-teleporting per waypoint would bypass contact integration and break descents into objects). On envs with a streaming joint interface,subsampleis ignored β the dense interpolation is the control sequence.robot.go_homemoves every arm to theEnvConfig.home_jointsconfiguration (Franka default when unset). On real hardware it is a no-op: whenconfig.is_realis true the call logs a warning and returns without moving, to avoid blind multi-joint sweeps into the workspace.robot.open_gripper/robot.close_gripperset the gripper fraction and run a physics settle loop (settle_steps <= 0falls back to the 40/60-step defaults), then return the measured fraction.
robot.* β planning (tag: planning)#
Tool |
Parameters |
Returns |
|---|---|---|
|
|
|
IK runs in-process via the pyroki backend, seeded from the current joint positions. The first solve per robot JIT-compiles (a few seconds); subsequent solves take milliseconds.
sim.* β simulation control#
Registered only by SimConnector
(gap/connector/sim.py). Real
connectors never get sim.* tools β the base-class registration hook
is a no-op, so a graph that calls sim.check_success simply has no such
tool on hardware (validation flags it as a warning before the run).
Tool |
Parameters |
Returns |
Tag |
|---|---|---|---|
|
|
|
β |
|
|
|
|
|
β |
|
β |
|
|
|
|
|
|
|
β |
|
|
|
β |
sim.resetβseed=0means unseeded; any other value seeds the episodeβs initial state.sim.stepadvances one control step holding the current pose;gripper_fraction >= 0sets the gripper first (negative leaves it).sim.apply_policy_actionforwards one low-level action verbatim to the envβs passthrough controller. Only envs exposingapply_policy_actionsupport it β currentlyFrankaLiberoEnv, whose action space is the 7-dim OSC_POSE layout[Ξx, Ξy, Ξz, Ξrx, Ξry, Ξrz, gripper]used by pi05-libero (positive gripper = close). Other envs raiseToolError. This is the hand-off point for learned policies β see Policies.sim.save_videoencodes the buffered frames with libx264 and also writes per-camera extras as<stem>_<cam>.mp4next to the main file. An empty buffer returnssuccess: Truewithnum_frames: 0; encoding errors returnsuccess: Falserather than raising.
Availability by backend#
Backend |
|
|
|
|
|---|---|---|---|---|
|
yes |
yes |
yes |
yes |
|
yes |
yes ( |
yes |
no |
|
yes |
no |
no |
no |
The UR+ZED connector is perception-only: it registers exactly the five
observation getters, so accidental motion is structurally impossible β
there is no motion tool to call
(gap/connector/real.py). See
Connectors for backend setup and
Safety for the full real-robot gating story.
Warning
Real connectors also report Capabilities(reset=False, success_check=False, video=False, world_state=False) even though the env classes expose shims
for interface parity. Harness code must branch on connector.capabilities,
not on whether a method exists.