YAM#
YAM connects a real dual-arm robot through the public RPent robot registry, Toolkit, RPC services, exploration lifecycle and MemoryManager. Dual-arm motion names follow RoboTwin; exploration follows LIBERO. Task 103 is an operator primitive console; task 104 separates policy prediction from execution.
Dependencies and installation#
Use Linux and Python 3.11 on the control machine. The Agent needs only RPent; RealSense, MuJoCo and the station’s RLinf/i2rt installation belong on the control machine. The GPU machine needs the same RLinf YAM policy implementation and its compatible OpenPI/Torch environment.
cd /path/to/RPent
uv venv --python 3.11
source .venv/bin/activate
uv pip install -e '.[yam]'
export RPENT_REPO_ROOT="$PWD"
export RPENT_RLINF_ROOT=/path/to/station-RLinf
This adapter was developed against an RLinf YAM fork at 3554fd2c plus
station changes. Unmodified official RLinf is not a sufficient dependency.
Before deployment retain the fork commit, working patch, untracked runtime
sources and environment lock with the station configuration. Required APIs are
YamControlRuntime (command, hold, move_to, feedback), I2RTYamBackendFactory,
YamKinematicsAdapter, and the openpi_rlinf model loader with
pi05_yam_joint data/policy transforms. RPent does not install or publish
those local changes. Calibration, i2rt model meshes, checkpoint and norm stats
must also be supplied. No trained YAM checkpoint ships with this extension.
Site configuration#
Copy robots/yam/config.example.json outside versioned source and fill the
camera serials, calibration file, table model, confirmed reset/home poses and
station control settings. The example cannot start until park_on_close is
enabled with measured home joints. Do not copy another station’s joint poses.
Each pose needs left_qpos and right_qpos (seven values each),
duration_s, max_joint_delta, tolerance and timeout_s.
Preserve validated servo and collision settings when upgrading this adapter.
Calibration supplies a shared left_base frame and the right-base transform.
top is fixed; left and right are wrist cameras. RGBD and wrist FK
must refer to the same capture. All three streams use 640x480 at 30 Hz on the
validated station. Camera pipelines warm up before arm connection.
Task instructions are registered in robots/yam/tasks.py. For the tabletop
example, set both task_name and the exact matching task_language from
TASK_INSTRUCTIONS in separate site files:
tabletop_cleanup_a: Pepsi in the left bag, Coca-Cola in the right bag.tabletop_cleanup_b: Coca-Cola in the left bag, Pepsi in the right bag.
Both use top-view left/right, sort all three bottles, uncover the spoons, put white spoon in left white bowl and pink spoon in right pink bowl, and return bowls to their marked positions. Initial spoon positions may vary. Task names stay stable across runs; evidence IDs are unique. Dashboard refuses an A/B language mismatch; switch ENV configuration explicitly after safe shutdown.
Independent services#
Start ENV from the control machine’s prepared environment:
python -m robots.yam.env_server --config /path/to/task_a.json \
--transport socket --host 127.0.0.1 --port 8110
The process initially serves without connecting motors. The operator’s first
status command initializes cameras and arms; this is an explicit hardware
startup, not a passive connection test. Arrange the station before issuing it.
Use env.is_started for a passive programmatic startup check.
python -m robots.yam.operator_control --config /path/to/task_a.json \
--endpoint socket://127.0.0.1:8110 --event status
python -m robots.yam.operator_control --config /path/to/task_a.json \
--endpoint socket://127.0.0.1:8110 --event reset_pose
# Copy the CURRENT episode_id printed by status; scene ready is an operator fact.
python -m robots.yam.operator_control --config /path/to/task_a.json \
--endpoint socket://127.0.0.1:8110 --episode-id CURRENT_ID \
--event ready --note 'Scene restored; ready for this attempt'
On the GPU machine, activate its prepared RLinf policy environment, install
RPent there, and set its own RPENT_RLINF_ROOT before starting:
python -m robots.yam.vla_server --model-path /path/to/yam-checkpoint \
--norm-stats-path /path/to/norm_stats.json \
--transport socket --host 127.0.0.1 --port 8220
Omit --norm-stats-path only if the checkpoint supplies the expected stats.
Forward the GPU service to the Agent/control machine over SSH, or bind it to a
trusted private interface and supply that endpoint. Pickle RPC must not be
exposed to untrusted clients. Policy output is 30 absolute qpos14 targets; only
the execution caller truncates it. Grippers use 0=closed, 1=open. State layout
is left six joints, left gripper, right six joints, right gripper. RGB order is
top/left/right. Metadata and action validation reject incompatible services.
Dashboard and terminal exploration#
The following is an explicit station launch profile, not library defaults.
Model availability depends on the installed planner/account. Adjust endpoints
and paths on the launching machine. low is used rather than an unsupported
none reasoning setting for this model.
rpent --robot yam --dashboard --explore --planner codex \
--model gpt-6-astra --reasoning-effort low \
--env-endpoint socket://127.0.0.1:8110 \
--vla-endpoint socket://127.0.0.1:8220 \
--memory-profile local --memory-dir /path/to/memory/yam \
--max-episode-steps 1800 --explore-attempts-per-session 50 \
--explore-sessions 1 --max-turns 300 --planner-timeout-s 14400 \
--dashboard-host 127.0.0.1 --dashboard-port 8090
max-episode-steps must match ENV. On the browser computer:
ssh -N -L 8090:127.0.0.1:8090 USER@CONTROL_HOST
Open http://127.0.0.1:8090 and submit /rpent-task tabletop_cleanup_a 0.
For B, prepare the B service/config and submit /rpent-task tabletop_cleanup_b 0.
Browsing does not start hardware. ENV is checked for every task; VLA is shared.
Dashboard owns neither service. Manual primitives and Agent calls are serialized;
after manual action, its result accompanies the next Agent message. /continue
resumes only a ready nonterminal episode without a stop. Automatic continuation
has the same checks and a bounded no-action loop. It cannot bypass an explicit
finish, operator interruption, or an outstanding manual action.
For the terminal, omit Dashboard flags and add --task-name tabletop_cleanup_a
to the same command. Use --without-vla instead of --vla-endpoint for
geometric tools only. To reproduce the station’s policy preference, send the
Agent: Use chunks=2, use_length=30 when the scene supports it; inspect after
each call. This is two predictions / 60 requested steps, not two action steps.
A longer unreviewed prediction horizon may include an early release.
Verdicts, memory and shutdown#
Only current-episode eval_success=True establishes task success. Use the
operator terminal above with --event success, failure or abort and
current episode ID plus evidence note. --command /done aliases ready;
/success, /failure and /abort alias the corresponding events.
Dashboard directs these verdict commands to the operator terminal, not the LLM.
reset consumes readiness and starts an episode; it does not move to home or
restore the physical scene. Waiting returns nonterminal pending after at
most 20 seconds; only an established new episode increments the attempt count.
Explore uses official _internal/inbox, task_only, suite and global
memory. Valid failure notes can merge after an unsuccessful run; success
recipes contain only actions from the verified successful episode. A/B bag rules
remain task-specific. See result.json, transcripts, session step records,
recipe/audit and the updated MEMORY.md for distinct evidence. A planner exit,
an interface test or a successful primitive does not prove full task success.
Stopping/closing Dashboard requests hold only. After handling any held object and checking the home path, shut down ENV from the operator terminal:
python -m robots.yam.operator_control --config /path/to/task_a.json \
--endpoint socket://127.0.0.1:8110 --event shutdown
ENV moves to configured home, verifies convergence, then disables output. Failed home keeps the runtime available for operator recovery. Abrupt process termination or power loss cannot guarantee this sequence.
Diagnostic tasks and interface migration#
Stop the Dashboard Agent before opening either console. ENV must already be
started. For diagnostics, use operator --event start to consume readiness
before explicit moves; diagnostics never create readiness themselves.
rpent --robot yam --task-name tabletop_cleanup_a --task-id 103 \
--env-endpoint socket://127.0.0.1:8110 --max-episode-steps 1800
rpent --robot yam --task-name tabletop_cleanup_a --task-id 104 \
--env-endpoint socket://127.0.0.1:8110 --max-episode-steps 1800 \
--vla-endpoint socket://127.0.0.1:8220 --output-dir /path/to/diagnostics
Enter JSON lines: {"tool":"status"}; task 103 allows move_to,
rotate_wrist, set_gripper, release with arguments. Task 104 uses
{"tool":"infer"} (saves prediction without moving), then
{"tool":"execute","arguments":{"use_length":30}} at most once.
Changed episode, action count, joint pose or a prediction older than 30 seconds
is rejected. An uncertain RPC outcome cannot be replayed. quit holds;
it does not release, home or create success memory.
Replace all old exploration_status calls with status(). The return has
native episode fields plus reason and can_continue at the top level.
No permanent alias is provided. move_to(arm, xyz, quat, gripper, substeps)
retains xyz_bounds for an observed task-valid region. A finite candidate
search is used, not all points in a continuous radius. substeps never removes
required path samples. rotate_wrist accepts gripper; use
set_gripper(arm, val, steps) and release(arm, val=1, steps) instead of
open/close aliases. All xyz are metres in left_base; quaternions are wxyz.
During upgrade preserve site JSON, calibration, weights, datasets and memory;
replace code only in a maintenance window. Update launch flags explicitly and
reinstall the package. Keep the old Git bundle/patches for rollback. Source and
wheel installs include robot modules; set RPENT_REPO_ROOT to the intended
checkout to give logs, guides and memory a stable workspace location. No new
VLA training, HF upload or live exploration is performed by installation.