Common program changes#

Start from the Customize your first expert trajectory and keep the built-in Franka deployment. Unless stated otherwise, edit your local program.yaml and use the complete no-save command in Quickstart step 3. The complete starting files are two_moves.yaml and two_moves_checked.yaml. Keep program_id matched to the integration and use its semantic entity names.

Change repetition count or execution order#

Need: make two moves instead of three, or visit B before A.

Edit: program.count and targets.drop_pose.values in program.yaml. A repeat count is the number of times its whole body runs, not the number of individual calls. With one Pick and one Place, count 2 produces four segments. Swap entire pose entries, including their orientations. If using acceptance checks, swap rest_pose.values in the same way. Update the root instruction.

The two-move program is the complete worked example. Reordering body.items changes actual execution order; preserve physical prerequisites such as picking before placing. Cyclic targets are selected by the nearest enclosing repeat iteration, not by a global call counter.

Verify: rerun with seed 7 and one environment. Check four segment entries, B → A, and the corresponding measured target indices in the checked variant. Changing only the description will not change the sequence.

Change a target position or orientation#

Need: move a Place destination within the existing scene.

Edit: a pose entry in targets.drop_pose.values. Positions are in meters; orientations are quaternions in XYZW order, so [0, 0, 0, 1] is identity. The absolute target is an object pose in the environment’s world frame, not a joint command or a TCP/end-effector pose. The integration uses the grasp relationship to determine robot motion. Do not add a TCP offset to the object target or interpret these numbers in a camera frame.

For the floor-standing cube, change the matching rest_pose XY too. Keep its center Z at 0.025 m only while the cube remains 5 cm tall and rests on this ground plane. Release Z and resting Z serve different purposes. Changing the quaternion changes the desired object orientation; the position-only validator does not verify it. Additional surfaces or objects require integration work.

Verify: change one pose at a time, run the checked program, and inspect the measured position error. Check reachability and scene clearance visually. The tutorial’s open-loop policy has dynamic collision checking disabled, so successful compilation does not establish clearance for arbitrary new targets. For other frames and semantic targets, see Scene registry.

Add another Pick/Place pair#

Need: perform another move with the existing cube.

Edit: for the same pair of operations, increase program.count first. If the steps need different instructions or checks, use a sequence with explicit segment entries, following the complete structures in the downloadable files. Keep kind: invoke under steps and kind: pick / kind: place under call. Use object: cube and declare every referenced target.

This integration supports the Pick/Place workflow. A call being part of the language does not mean every deployment supports it. A second object, new robot, HandOver, or registered skill needs matching scene/resources/lowerers; follow Configure and Run an Embodied Task Program and registered calls.

Verify: check that the segment count and order match your intent, then rerun position/stability checks for every Place. Keep names useful for diagnosis and avoid assuming that a target advances merely because another call uses it.

Change task and segment language#

Need: label the whole demonstration and its subgoals.

Edit: root instruction and each segment’s instruction in program.yaml. The root describes the episode; segment text describes that part of the task. For example, Move the cube to target B, then to target A. matches the modified program. Keep the wording consistent with the actual repeat count and target order. Do not change program_id to change the label.

Verify: after saving, run the Quickstart data reader and inspect the printed Task and segment instructions. Task language is stored in meta/tasks.parquet, segment language in meta/subtasks.parquet, with indices in frame data. See Task and segment language for expert data for overrides and training consumption.

Wait for settling and check the position#

Need: reject a run when the cube does not settle near the requested location.

Edit: add post and validators to the Place segment in program.yaml, and provide separate resting targets. Use the complete checked program:

      post:
      - kind: wait_stable
        entity: cube
        preset: rigid_object
      validators:
      - kind: object_near_target
        object: cube
        target: rest_pose
        position_tolerance: 0.03

preset: rigid_object selects the integration’s existing stability preset; it is not a new tuning field. Post-policies run after the motion and before the validators. The position tolerance is a 3D distance, not a separate tolerance per axis. A settling timeout or failed validator rejects the affected row.

Verify: inspect metadata.post_policies and metadata.validation on each saved Place segment. The Quickstart’s observed errors are below 0.03 m. For a failed run, add --debug-mode to its no-save command to print the failed demo trace. Inspect the actual pose and settling status before changing the task. These checks do not independently prove grasp contact or release.

Change motion timing#

Need: understand or adjust how long the robot takes to move.

Edit location: the execution-policy component selected by the deployment, not the program YAML. The Quickstart policy uses these actual fields:

policy_id: trajectory_open_loop_v1
preset_id: trajectory

requires:
  embodiment_contract: single_arm_parallel_gripper

motion:
  strategy: ik_interp
  velocity_targets: auto
  sample_count: 40
  dynamic_collision_mode: "off"

tracking:
  kind: timed

recovery:
  max_replans: 0
  max_action_retries: 0

workflow_recovery:
  max_recovery_attempts: 0

runner:
  minimum_cycle_time: 0.0
  hold_on_completion: false
  hold_during_effect_verification: false

effect_assurance: projected

In this ik_interp configuration, motion.sample_count: 40 generates 40 trajectory samples per Pick/Place. With the environment’s 0.04 s control interval, the observed unextended segments contain 40 steps (1.6 s of recorded time). Settling adds steps separately. tracking.kind: timed controls time-based tracking; runner.minimum_cycle_time is a runner cadence setting, not a uniform Cartesian speed command. Sample count is not a speed in meters per second, and its meaning is not interchangeable across motion strategies.

There is no general speed field on a repeat, segment or Pick/Place call. --task-program cannot override the execution policy. To change it, follow Configure and Run an Embodied Task Program to create a local deployment selecting a compatible policy, or choose an existing compatible deployment from the task catalog. Do not edit installed package files in place. Preserve policy/embodiment contracts and explicit assurance. This is an integration-author operation.

Verify: compare recorded segment lengths and physical acceptance at the same seed, and recheck reachability, settling and position. Only the displayed 40-sample policy is physically exercised in this tutorial; a timing change requires its own validation.

Choose another existing deployment#

Need: use a supported robot or task without building an integration.

Edit: select its --gym_config package reference, using Task Catalog and show-task to discover it. First run its original program with its documented defaults. Reuse your local program only when its program_id, semantic entities, targets and calls satisfy the new deployment’s integration and contracts. Compatible embodiments can share a program; arbitrary tasks cannot.

The repeated Pick/Place Franka deployment does not enable expansion. Its UR5 counterpart selects an expansion declaration and can have different batch and collection defaults. Backend variants also select separate physical components; --physics is not a general way to turn any environment into another backend.

Verify: inspect the selected robot, backend, expanded segment count and collection settings, then run a single controlled episode and check the same physical criteria. Single-environment success does not qualify randomized or batch execution. For new scene/robot ownership, continue with Configure and Run an Embodied Task Program, Scene registry and Robot skill profiles.