Quality Assurance#
Review every recording before publishing or converting it. Start with visual replay, then run automated validation and inspect the captured signals.
1. Replay and Inspect#
For local recordings, pass the local root as DATASET; no dataset is
downloaded:
JAX_PLATFORMS=cpu handumi replay \
outputs/20260714_224135 \
--robot openarmv1 \
--episode 0
See Replay a Local Recording in Simulation for the current OpenArm v1 and TRLC-DK1 commands, calibration semantics, measured IK results, and Viser mesh troubleshooting.
Choose the target robot explicitly. Piper is a currently available example:
TARGET_ROBOT=piper
handumi replay \
your-name/handumi-demo \
--robot "$TARGET_ROBOT"
In Viser, check the bimanual geometry, table alignment, motion continuity, and
unreachable poses. Use --headless for automated checks and --strict-ik to
fail when IK error exceeds the configured limits.
Add --hide-trajectories to show only the robot and scene without the target
and achieved TCP paths.
Table-calibrated datasets preserve recorded bimanual geometry automatically.
Absolute-table replay and calibration precedence
For an explicit geometry-preserving replay:
handumi replay your-name/handumi-demo \
--robot "$TARGET_ROBOT" \
--retarget-mode absolute-table \
--deployment-profile sim
absolute-table applies robot_from_table to both TCP trajectories, preserving
their bimanual separation. By default, replay aligns each tool orientation on
the first frame and preserves subsequent wrist rotations. Use
--absolute-orientation table-absolute only when the HandUMI and robot TCP
frames were externally calibrated.
Controller-to-TCP calibration is selected in this order:
Explicit
--controller-tcp-calibration.Identity-bound snapshot stored in the dataset.
Robot/device calibration from
configs/robots/*.yaml.Device fallback for legacy data.
Replay prints the calibration source and hash, TCP distances, minimum height,
bimanual separation and workspace bounds, the resolved deployment profile,
table-to-robot transform, and IK errors. auto selects the laboratory-local
file from configs/rig.yaml when configured and otherwise selects
configs/calibration/table/sim/<robot>.yaml; use sim in portable QA so a
machine-local rig cannot change the result.
Offline playback of a dataset on physical arms is not currently exposed.
handumi teleop-real consumes live HandUMI motion and is not a recorded-dataset
replay command.
2. Run Automated Validation#
handumi validate \
outputs/datasets/handumi-demo --strict
The report is written to meta/handumi_quality.json. Review rejected episodes
for tracking loss, stale sensors, synchronization errors, frozen poses, motion
jumps, or invalid duration. Rejected episodes are excluded automatically during
conversion.
3. Inspect Captured Signals#
Raw datasets preserve the information needed to validate, recalibrate, or retarget a capture:
observation.images.left_wrist
observation.images.right_wrist
observation.images.workspace
observation.state # controller poses + gripper widths
observation.feetech.* # ticks, width, time, health
observation.tracking.* # device poses, validity, aligned time
observation.sync.* # shared target and record times
observation.camera.<name>.* # sample time and health
observation.state[14:16] stores left/right gripper widths in meters. Tool,
controller mount, calibration hashes, source enablement, and coordinate layout
are stored in metadata. Raw controller poses remain unchanged so the same
capture can be checked against another supported robot.
4. Convert and Check Target Motion#
Conversion creates a target-specific dataset while preserving the raw source.
--retarget-mode defaults to auto and is resolved with the exact same rule
handumi replay uses, identically for every embodiment: when the source
dataset declares a calibrated table workspace, conversion runs the same
absolute-table solver as replay (validating
the selected local or configs/calibration/table/sim/<embodiment>.yaml
deployment) for exact qpos parity; otherwise
it falls back to local-relative. For Piper, use the validated --robot piper
profile to convert the replay result to physical Piper commands:
JAX_PLATFORMS=cpu handumi convert \
outputs/datasets/handumi-demo \
--robot piper \
--output your-name/handumi-demo-piper
The Piper state has 14 physical commands: six replay arm joints in radians
plus one gripper opening in meters per side. Its pairs are
observation.state[t] = command[t] and action[t] = command[t+1]. The two
mirrored URDF finger joints are reconstructed from the single opening only when
rendering simulation. Other embodiments use the same --robot <name> interface;
absolute-table support requires their corresponding
simulation file or lab-local deployment, and an explicit --retarget-mode can
override auto detection for any of them. Use --deployment-profile sim for a
portable converted dataset and record the resulting deployment metadata.
Replay and validate the converted motion before using it with a robot-specific integration. See Add a New Robot Embodiment when adding another simulation model or hardware backend.
5. Curate Rejected or Incomplete Data#
When a dataset contains rejected or incomplete episodes, create a separate curated derivative before conversion or publication. The analysis and curation steps are intentionally separate so statistical outliers can be reviewed before any data is removed. See Analyze and Curate Datasets.
6. Publish Accepted Data#
Upload only after the replay and validation checks pass:
hf auth login
huggingface-cli upload your-name/handumi-demo \
outputs/datasets/handumi-demo --repo-type dataset