Repositories and setup#
Choose the repository for your task. Installing every summer dependency into one Python environment recreates the ABI problems the later tools separated.
Repository |
Role |
|---|---|
|
Initial MuJoCo digital twin and its arm/hand demonstration |
|
Printed fiducials, rounding, detection APIs |
|
GraspGen-X descriptors, Isaac qualification, assembly |
|
Calibration capture/analysis, Dex3 wrist markers, current V7 torso CAD and R2 fit coupons |
|
Manipulation, bilateral calibration, recording/conversion |
|
Passive tactile inspection and RViz |
|
Recording and documentation reference |
The source catalog supplies public locations and identifies exact revisions. The August demo and the later September work are now both committed and public, on separate tabletop branches.
For printed mounts, start with targets and mounts.
The calibration/fixture repository remains separate from the manipulation
runtime. Opening its F3D, STEP, STL or Bambu exports does not require the ROS,
planner or dataset-conversion environments. Use the pinned V7 links in that
chapter; the consolidated main now includes that design and the bundle tools.
Install only what your task needs#
Task |
Environment to prepare |
|---|---|
Read the guide or download data |
Browser; no robot software |
Print or edit a fixture |
Slicer or CAD application and the linked fixture files |
Inspect recorded episodes |
Local browser viewer; conversion software only when starting from raw bags |
Develop tabletop planning/execution |
Focused control and planner environments below, plus their model/message dependencies |
Explore the simulator |
The independent MuJoCo setup |
Inspect hand pressure |
The pressure repository’s ROS workspace and passive launch |
Choose a tabletop checkout#
The checkouts below include the published AprilCube dependency. Its detector implementation, tests and assets match the original local version used by tabletop; the source catalog records the dependency revision change. Use these checkout commits when installing, even where a code link points to an earlier, unchanged source file.
For the August 25 demo baseline:
git clone --branch main https://github.com/sri299792458/g1-dex3-tabletop.git
cd g1-dex3-tabletop
git switch --detach 61890c022f5d4130a08d3ae85321637576d47107
git submodule update --init --recursive
The detached commit matches this guide; use a new branch when making changes. For September calibration development, make a separate checkout so its changed runtime and route requirements stay explicit:
git clone --branch experimental/september-calibration \
https://github.com/sri299792458/g1-dex3-tabletop.git g1-calibration-dev
cd g1-calibration-dev
git switch --detach 5d3dbed464f4bd4f3e8f1078409e3fc40a7e1f32
git submodule update --init --recursive
September’s final operator-preclosed lifecycle still needs new route certificates and hardware validation. Publishing its code did not change that status. The calibration workflow describes that version.
Environment boundaries#
Runtime |
Recorded environment |
Purpose |
|---|---|---|
Focused control |
Python 3.10 / ROS Humble |
ROS ABI and Unitree transport |
Focused planner |
Python 3.11 / Torch/Warp/CUDA |
GPU work outside control |
Conversion |
Python 3.12 / CPU Torch / LeRobot v0.6.1 |
Offline encoding |
Early prototype |
Python 3.12 / ROS Jazzy |
Historical calibration work |
MuJoCo twin |
ROS Humble/Jazzy workspace, MuJoCo, SDK and OpenHomie policy |
Separate simulation environment; see the simulation setup |
This guide |
Python 3.10+ / pinned docs requirements |
No ROS or CUDA |
Tabletop control, planning and recording#
Start from the selected tabletop checkout above, with uv, ROS Humble and
the planner’s CUDA dependencies available. The commissioned control environment
uses Python 3.10. Select Humble explicitly if the machine also has Jazzy;
automatic ROS discovery in the scripts prefers Jazzy.
G1_TABLETOP_ROS_PREFIX=/opt/ros/humble ./tools/setup_control_env.sh
./tools/setup_planner_env.sh
ROS_DISTRO=humble ./tools/setup_recording_benchmark.sh
./tools/g1_tabletop.sh inspect
Setup script |
Result |
When needed |
|---|---|---|
|
|
Tabletop control and inspection |
|
|
Planning; kept outside the control interpreter |
|
MCAP storage plugin under |
Raw episode recording; despite its name, this script installs the plugin rather than running the benchmark |
The recording installer downloads and extracts ROS packages into the checkout; it does not install them system-wide. These environments do not start the camera or establish robot ownership.
inspect loads the selected calibration bundle and checks the local model
revisions against the recorded provenance. Its JSON includes
commands_robot: false and the bundle/model identities. A successful result
checks those local artifacts; it does not test state freshness, camera transport
or watchdog recovery on a connected robot.
These commands are source-checked, not a fresh-machine installation test. The hardware launcher additionally needs the message workspace, camera access and PC2 runtime described below.
Check CUDA independently:
.venv-planner/bin/python -c "import torch; assert torch.cuda.is_available(); print(torch.cuda.get_device_name(0))"
Two recorded UVM failures returned error 999 even though nvidia-smi saw the
GPU; reboot restored the existing environment. See
debugging before rebuilding dependencies.
Optional solver and conversion environments#
./tools/install_robot_calibration_local.sh builds the native calibration solver.
Prepare it when fitting a calibration; consuming the saved August bundle does
not require a new fit. Calibration distinguishes
offline solving from collection and deployment.
Raw-to-LeRobot conversion uses a separate Python 3.12 environment and local SPARK/LeRobot checkouts. Follow conversion and retention only when converting raw recordings. Downloaded LeRobot episodes need a viewer, not the control, planner or calibration solver environments.
Connect the software to the lab setup#
The hardware wrapper
sets up ROS, DDS, message definitions and recording before invoking the task.
The shorter g1_tabletop.sh command does not perform that network setup.
Setting |
Commissioned default or requirement |
What to check on another machine |
|---|---|---|
|
|
Interpreter and ROS Python ABI must agree |
|
|
Source the workspace containing the official |
|
Required real laptop interface |
Identify the connected adapter with |
|
|
Match all participants; the commissioned camera helper separately hardcodes domain 0 |
|
CycloneDDS; wrapper builds an interface configuration if unset |
Existing values are respected, so a stale shell can retain the wrong middleware or interface |
After sourcing the matching ROS and message workspaces in a terminal,
ros2 interface show unitree_hg/msg/LowState checks message availability.
Seeing a topic in ros2 topic list does not establish that its messages can be
decoded or are fresh. Unitree rt/lowstate appears as ROS /lowstate, without
an extra /rt prefix. Continue with the camera checks
and operating checklist for the connected system.
Prepare PC2 recovery separately from arming it#
PC2 needs its own watchdog Python runtime. The fixture repository’s
runtime installer
provisions a versioned environment and selects it through
/home/unitree/.local/share/g1-aprilcube-watchdog/current/venv/bin/python.
It expects commissioned SSH access, a clean pinned Unitree SDK checkout,
CycloneDDS build artifacts, and PC2’s Python 3.8/build prerequisites. Read its
preflight checks before using it; cloning the tabletop submodules alone does
not supply all these dependencies.
Provisioning checks imports and dependencies. It does not arm recovery or start a permanent watchdog service. During a hardware session the laptop launches the remote agent, waits for readiness and arms the lease at the defined ownership boundary. Ownership and safety explains those states and the required recovery acknowledgements.
Simulation setup#
The MuJoCo chapter contains the pinned simulator checkout, dependency scripts, pretrained policy download, and separate plant/application launch commands. Set it up when working on the twin; the tabletop workflow does not require launching G1Pilot.
Adapting to another machine#
Record the actual Ethernet interface, ROS/interpreter, DDS domain, camera serial/profile, robot model, and installed hands. Materialize Git LFS meshes before trusting a render. Review scripts’ local path assumptions instead of copying a lab username. The runbook distinguishes offline commands, subscribers, and motion owners.
Evidence: tabletop README and setup scripts; G1Pilot lab setup notes; recording documentation. Revisions and remaining portability gaps are in the source catalog.