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 only the local root; --repo-id is unnecessary and
no dataset is downloaded:
JAX_PLATFORMS=cpu handumi-replay-in-sim \
--dataset-root 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-in-sim \
--repo-id 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-in-sim --repo-id your-name/handumi-demo \
--robot "$TARGET_ROBOT" \
--retarget-mode absolute-table \
--deployment-calibration "configs/calibration/${TARGET_ROBOT}_table.yaml"
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, table-to-robot transform, and IK errors.
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 \
--repo-id your-name/handumi-demo \
--root outputs/datasets/handumi-demo \
--fail-on-reject
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.
For Piper, use the validated --piper profile. It runs the same
absolute-table solver as replay, validates configs/calibration/piper_table.yaml
for the selected robot, and converts the replay result to physical Piper commands:
JAX_PLATFORMS=cpu handumi-convert \
--repo-id your-name/handumi-demo \
--root outputs/datasets/handumi-demo \
--piper \
--output-repo-id 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 continue to use --embodiment <name>;
absolute-table support requires their corresponding
configs/calibration/<name>_table.yaml file.
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. 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