Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
12dff7f
Align tracking env with the intended training and playback behavior
BotRunner64 Apr 16, 2026
b7a73e5
Avoid premature tracking resets on low-height motions
BotRunner64 Apr 16, 2026
efb2a0b
Keep General-Tracking-G1 resets aligned with the active training policy
BotRunner64 Apr 20, 2026
8906612
Reduce dataset-config drift across training and review workflows
BotRunner64 Apr 21, 2026
512f610
Preserve both raw and curated SEED dataset entry points
BotRunner64 Apr 21, 2026
61b507a
Simplify tracking termination configuration
BotRunner64 May 8, 2026
a09aa9e
Add self-collision tracking reward
BotRunner64 May 9, 2026
bc16afa
Merge remote-tracking branch 'origin/feature/policy-training-optimiza…
BotRunner64 May 11, 2026
3fcdc48
Remove adaptive motion sampling
BotRunner64 May 11, 2026
d3b0e02
Add optional LinkerHand sim2real control
BotRunner64 May 13, 2026
5b22280
Remove LinkerHand dry run mode
BotRunner64 May 13, 2026
9e3507c
Adjust LinkerHand L6 test cleanup
BotRunner64 May 13, 2026
07d9d0b
Keep LinkerHand CAN interfaces open on close
BotRunner64 May 13, 2026
7c74e84
Tune Pico4 sim2real realtime buffering
BotRunner64 May 13, 2026
bba22dd
Decouple LinkerHand control from body loop
BotRunner64 May 14, 2026
11c12b9
Remove realtime resume smoothing knobs
BotRunner64 May 14, 2026
7a99b6c
Update tracking domain randomization
BotRunner64 May 15, 2026
6a33e66
Update tracking contact rewards
BotRunner64 May 15, 2026
6e39823
Restore self collision reward semantics
BotRunner64 May 15, 2026
7ed7303
Fix G1 PD gain actuator group selection
BotRunner64 May 15, 2026
4f6f975
Fix Pico4 ground lift reset
BotRunner64 May 15, 2026
50b0c87
Tighten tracking position terminations
BotRunner64 May 18, 2026
8032747
Fix training ETA duration formatting
BotRunner64 May 19, 2026
4309a79
Add ONNX policy benchmark script
BotRunner64 May 19, 2026
def4418
Add payload randomization to tracking task
BotRunner64 May 20, 2026
5a4377d
Add dexhand optional dependency
BotRunner64 May 20, 2026
9d5f900
Merge remote-tracking branch 'origin/feature/dexterous-hand' into mer…
BotRunner64 May 20, 2026
8714b58
Scale up tracking policy model
BotRunner64 May 20, 2026
6a01fa9
test: verify payload collision filtering
BotRunner64 May 20, 2026
2dcfc0b
Offset train worker seeds by rank
BotRunner64 May 21, 2026
ac75cb1
Update self-collision wrist exclusions
BotRunner64 May 22, 2026
d6026c0
Merge remote-tracking branch 'origin/master' into merge_train_dexhand
BotRunner64 May 22, 2026
d9cdc24
Adapt Pico input to pico-bridge 0.2.1
BotRunner64 May 22, 2026
47517b3
Fix sim standing retarget roll
BotRunner64 May 25, 2026
58a3e58
Sync TemporalCNN config and docs
BotRunner64 May 25, 2026
e9cce31
Revert "Sync TemporalCNN config and docs"
BotRunner64 May 25, 2026
1e71c58
Remove mocap qpos interpolation
BotRunner64 May 25, 2026
dec76fb
Add optional sim2real retarget viewer
BotRunner64 May 26, 2026
63e0946
Add Kp ramp to standalone standing
BotRunner64 May 26, 2026
f3b8568
Add latency simulation to standalone standing
BotRunner64 May 26, 2026
5da1bdf
Adjust tracking randomization tests and config
BotRunner64 May 26, 2026
7c390cf
docs: add multinode training example
BotRunner64 May 26, 2026
b8a2897
Preserve retargeter warm-start on runtime resets
BotRunner64 May 27, 2026
925510b
Refine sim2real state transitions
BotRunner64 May 27, 2026
1b77f04
Add somehand L6 VR hand pose support
BotRunner64 May 27, 2026
90a8a21
Fix somehand L6 archive extraction paths
BotRunner64 May 27, 2026
509e80f
Fix somehand L6 asset download
BotRunner64 May 27, 2026
4485c1a
Add live dexterous hand test modes
BotRunner64 May 27, 2026
0be0fa0
Update somehand submodule for Pico import fix
BotRunner64 May 27, 2026
4592efd
Fix L6 hand pose mapping
BotRunner64 May 27, 2026
a1f25b9
Correct L6 VR hand pose arc mapping
BotRunner64 May 27, 2026
d4908b5
Fix LinkerHand L6 pose mapping
BotRunner64 May 28, 2026
8f1a36e
Fix LinkerHand L6 somehand joint mapping
BotRunner64 May 28, 2026
457d384
Adjust LinkerHand VR hand pose speed
BotRunner64 May 28, 2026
bd5af86
Adjust LinkerHand vr hand pose speed
BotRunner64 May 28, 2026
45a3ba5
Reduce vr hand pose latency
BotRunner64 May 28, 2026
77eb3c3
Fix L6 thumb mapping and range
BotRunner64 May 28, 2026
674ce18
Fix dexterous hand mode parsing
BotRunner64 May 28, 2026
ad81cfb
Add sim2real timing diagnostics
BotRunner64 May 28, 2026
1ce7f3f
Fix multiprocess sim2real reset handling
BotRunner64 May 29, 2026
461aacc
Remove multiprocess reference reset path
BotRunner64 May 29, 2026
9aa533a
Fix multiprocess Pico video frame streaming
BotRunner64 May 29, 2026
991c49a
Add Pico signal diagnostics
BotRunner64 May 29, 2026
0411214
Make Pico signal diagnostics interruptible
BotRunner64 May 29, 2026
7f21301
Remove Pico position threshold validation
BotRunner64 May 29, 2026
5d95c88
Hold mocap command on delayed references
BotRunner64 May 29, 2026
95dce87
Refactor sim2real hand runtime
BotRunner64 Jun 9, 2026
642c99f
Clarify sim2real loop timing stats
BotRunner64 Jun 9, 2026
93353ef
Avoid eager sim2real runtime imports
BotRunner64 Jun 9, 2026
d252cac
Avoid blocking RealSense Pico video updates
BotRunner64 Jun 9, 2026
4a84253
Revert "Avoid blocking RealSense Pico video updates"
BotRunner64 Jun 9, 2026
5423d32
Remove stale multiprocess Pico video worker
BotRunner64 Jun 9, 2026
c9c68fa
Refine dataset filtering and ground alignment
BotRunner64 Jun 10, 2026
f96878e
Add Pico motion recorder
BotRunner64 Jun 10, 2026
ffbc04e
Add adaptive motion sampling
BotRunner64 Jun 11, 2026
d6cabd8
Refine adaptive sampling metrics
BotRunner64 Jun 11, 2026
4b78920
Allow adaptive sampling CLI override
BotRunner64 Jun 11, 2026
f6b5855
Remove unused tracking rewards
BotRunner64 Jun 11, 2026
0a6b4d7
Add rewind motion sampling
BotRunner64 Jun 11, 2026
77bc91d
Add reference base height to velcmd observation
BotRunner64 Jun 11, 2026
9d664a7
Add tracking velocity and survival rewards
BotRunner64 Jun 12, 2026
a244722
Rename tracking observation terms
BotRunner64 Jun 12, 2026
e4d3725
Add Pico ARMS mode
BotRunner64 Jun 12, 2026
0bb0df7
Fix sim2real standing reference root height
BotRunner64 Jun 12, 2026
4a7d467
Remove adaptive motion sampling
BotRunner64 Jun 14, 2026
95ec57e
Switch training datasets to HDF5 shards
BotRunner64 Jun 14, 2026
c40e039
Simplify dataset pipeline
BotRunner64 Jun 15, 2026
fcb1b07
Update dataset stats and configs
BotRunner64 Jun 15, 2026
b66da1a
Rebuild temporary dataset clips
BotRunner64 Jun 15, 2026
bfc8c8e
Add async HDF5 motion cache loading
BotRunner64 Jun 15, 2026
761a250
Add Pico motion dataset config
BotRunner64 Jun 15, 2026
a222c52
Remove legacy G1 sim2sim XML fallback
BotRunner64 Jun 15, 2026
e7c1795
Use canonical G1 robot assets
BotRunner64 Jun 15, 2026
196bcc8
Use flat motion cache for tracking
BotRunner64 Jun 15, 2026
809d480
Add robot XML override for training
BotRunner64 Jun 15, 2026
3b9d698
Add additional wrist position reward
BotRunner64 Jun 15, 2026
dbb0979
Expand tracking mass randomization bodies
BotRunner64 Jun 15, 2026
bd823e9
Precompute motion dataset for training
BotRunner64 Jun 16, 2026
1033813
Load precomputed motions fully at startup
BotRunner64 Jun 16, 2026
81a0ace
Fix precomputed motion window offsets
BotRunner64 Jun 16, 2026
2ad91e1
Remove keyframes from training G1 spec
BotRunner64 Jun 16, 2026
bad1586
Add LinkerHand O6 gripper support
BotRunner64 Jun 17, 2026
e74262a
Fix Pico G1 IK body targets
BotRunner64 Jun 18, 2026
4394146
Support site frames in GMR IK config
BotRunner64 Jun 18, 2026
19ebce7
Tune tracking action rate penalty
BotRunner64 Jun 18, 2026
78d130e
Reuse sim2real standing path in standalone script
BotRunner64 Jun 19, 2026
574d092
Add standalone standing timing telemetry
BotRunner64 Jun 19, 2026
e5f8771
Add standalone standing delay diagnostics
BotRunner64 Jun 19, 2026
64dab56
Tune training action latency and rewards
BotRunner64 Jun 19, 2026
2c6b89c
Update training stack for mjlab 1.4
BotRunner64 Jun 19, 2026
b83bccd
Remove training action latency randomization
BotRunner64 Jun 21, 2026
48b35a6
Remove sim HDF5 recording support
BotRunner64 Jun 22, 2026
333d320
Add Pico sim2real recording support
BotRunner64 Jun 22, 2026
97a354a
Update dexhand install docs
BotRunner64 Jun 22, 2026
ab728f8
Discard empty recording episodes
BotRunner64 Jun 22, 2026
ea7cb7d
Add runtime console feedback
BotRunner64 Jun 22, 2026
6da60d7
Record LinkerHand actions in sim2real datasets
BotRunner64 Jun 22, 2026
7614da1
Fix LeRobot recording API compatibility
BotRunner64 Jun 22, 2026
fe7926e
Replace LeRobot recording with HDF5
BotRunner64 Jun 22, 2026
5ab2e47
Store sim2real recording video as MP4 sidecars
BotRunner64 Jun 23, 2026
e52cf70
docs: document pyrealsense2 installation
BotRunner64 Jun 23, 2026
071ba8e
Add Xsens BVH input loading
BotRunner64 Jun 24, 2026
873928c
Keep sim2real hand control active across modes
BotRunner64 Jun 25, 2026
db771d6
docs: align release notes and metadata
BotRunner64 Jun 25, 2026
ec40632
Release v0.4.0
BotRunner64 Jun 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,10 @@ Thumbs.db
# GMR retargeting assets (downloaded from ModelScope)
teleopit/retargeting/gmr/assets/

# Legacy training-side robot assets are no longer tracked; FK tooling reuses GMR unitree_g1.
# Canonical robot XML/meshes (downloaded from ModelScope)
assets/robots/

# Legacy training-side robot assets are no longer tracked.
train_mimic/assets/

# ModelScope download cache
Expand Down
6 changes: 6 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
[submodule "third_party/unitree_sdk2_python"]
path = third_party/unitree_sdk2_python
url = https://github.com/unitreerobotics/unitree_sdk2_python.git
[submodule "third_party/linkerhand-python-sdk"]
path = third_party/linkerhand-python-sdk
url = https://github.com/BotRunner64/linkerhand-python-sdk.git
[submodule "third_party/somehand"]
path = third_party/somehand
url = https://github.com/BotRunner64/somehand.git
124 changes: 81 additions & 43 deletions AGENTS.md

Large diffs are not rendered by default.

12 changes: 9 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Changelog

## [0.4.0] - 2026-06-25

- 改进 Pico 实时控制:支持 pico-bridge 0.2.1、`ARMS` 模式,以及保留 retargeter warm-start 的模式切换/暂停恢复。
- 新增可选 LinkerHand L6/O6 sim2real 控制,支持 Pico gripper 输入和低延迟 L6 `vr_hand_pose`。
- 新增 Pico sim2real 手动 HDF5 录制,以及用于训练数据采集的交互式 Pico motion recorder。
- 优化训练数据流程:minimal HDF5 shards、显式 precompute、rewind 采样和更新后的 tracking rewards。

## [0.3.0] - 2026-05-12

- 重构实时输入栈,Pico 4 统一使用 pico-bridge 0.2.0 in-process receiver,并移除旧 ZMQ/onboard Pico 路径。
Expand All @@ -13,13 +20,12 @@
- 新增独立 Standing 控制器、离线播放键盘控制与 Pico sim2sim 模式控制。
- 优化实时 mocap 缓冲与 catch-up,并将发布模型升级至 30k checkpoint。

## [0.1.1] - 2025-03-28
## [0.1.1] - 2026-03-28

- 数据集改为 shard-only 输出。
- 新增 adaptive_bin 采样。
- 引入外部资源管理并瘦身仓库。

## [0.1.0] - 2025-03-25
## [0.1.0] - 2026-03-25

- 首个公开版本。
- 支持 General-Tracking-G1 全身追踪训练与 ONNX sim2sim 推理。
Expand Down
69 changes: 65 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,13 @@ pip install -e .

```bash
pip install modelscope
python scripts/setup/download_assets.py --only gmr ckpt bvh
python scripts/setup/download_assets.py --only robots gmr ckpt bvh
```

The canonical Unitree G1 robot model is downloaded to
`assets/robots/unitree_g1/g1_29dof.xml`. Training, sim2sim, retargeting, and FK
validation all use this same XML.

**3. Run**

```bash
Expand All @@ -54,12 +58,69 @@ python scripts/run/run_sim.py \
'viewers=[sim2sim,camera]'
```

For sim2real, viewers are disabled by default. Add `viewers=retarget` to show
the retargeted reference in an optional MuJoCo window.

## Pico Motion Recording

Record many Pico clips as training-ready G1 motion NPZ files:

```bash
pip install -e '.[pico4]'
python scripts/run/record_pico_motion.py
```

The recorder starts the Pico receiver and live Retarget viewer before waiting
for clip names, so preview keeps running while the terminal is idle. Enter a
semantic clip name, then use `R` to start, `S` to save, `D` to discard, `N` for
a new name, and `Q` to quit. Saved clips are written to
`data/pico_motion/clips/` using the semantic label in the filename, with no
sidecar JSON.

Merge recorded clips into the standard HDF5 shard dataset:

```bash
python train_mimic/scripts/data/build_dataset.py \
--spec data/pico_motion/pico_recorded.yaml --force
```

## Sim2Real HDF5 Recording

Pico sim2real can also record manual HDF5 episodes from the real G1:

```bash
pip install -e '.[recording]'
# If you use RealSense video, install pyrealsense2 manually for your platform.
# On Arm machines, prefer conda-forge:
# conda install -c conda-forge pyrealsense2
python scripts/run/run_sim2real.py --config-name sim2real_record \
controller.policy_path=track.onnx \
recording.task="walk forward"
```

Recording uses the terminal controls `R` start, `S` save, `D` discard, and `Q`
shutdown. `STANDING`, `MOCAP`, `ARMS`, and paused mocap can be recorded. Saved
episodes are written as `.h5` files under `data/recordings/sim2real_hdf5/episodes/`.
`sim2real_record.yaml` stores camera frames as compressed MP4 sidecar files under
`data/recordings/sim2real_hdf5/videos/` and keeps `frame_index` / `timestamp`
sync metadata in the HDF5 episode. The low-dimensional HDF5 schema records
`observation.state(68)`, `observation.mode(1)`, `action(36)` as the aligned
reference qpos sent to the policy path, and `action.hand(12)` as the latest
LinkerHand left/right 6D pose commands.

## Documentation

Full docs at **[BotRunner64.github.io/Teleopit](https://BotRunner64.github.io/Teleopit/)**, covering installation profiles, all tutorials, configuration reference, and architecture.

## Changelog

### v0.4.0 (2026-06-25)

- Improved Pico realtime control with pico-bridge 0.2.1, `ARMS` mode, and retargeter-preserving mode/pause resets.
- Added optional LinkerHand L6/O6 sim2real control, including Pico gripper input and low-latency L6 `vr_hand_pose`.
- Added manual Pico sim2real HDF5 recording and an interactive Pico motion recorder for training NPZ clips.
- Refined the training data path with minimal HDF5 shards, explicit precompute, rewind sampling, and updated tracking rewards.

### v0.3.0 (2026-05-12)

- Consolidated realtime input around pico-bridge 0.2.0 and removed the old ZMQ/onboard Pico path.
Expand All @@ -73,12 +134,12 @@ Full docs at **[BotRunner64.github.io/Teleopit](https://BotRunner64.github.io/Te
- Added offline playback keyboard controls, Pico sim2sim mode control, and a standalone standing controller.
- Improved realtime mocap buffering/catch-up and upgraded the released model to the 30k checkpoint.

### v0.1.1 (2025-03-28)
### v0.1.1 (2026-03-28)

- Dataset shard-only refactor and `adaptive_bin` sampling
- Dataset shard-only refactor
- External asset management (ModelScope), repository slimming

### v0.1.0 (2025-03-25)
### v0.1.0 (2026-03-25)

- Initial public release: General-Tracking-G1 training, ONNX sim2sim inference, Pico 4 VR teleoperation, Unitree G1 hardware deployment

Expand Down
109 changes: 92 additions & 17 deletions docs/docs/configuration/config-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ Complete reference for all configurable fields.
| `viewers` | Viewer set: `mocap`, `retarget`, `sim2sim`, `camera`, `all`, `none`. `all` opens `mocap`, `retarget`, and `sim2sim`; add `camera` explicitly. | `sim2sim` |
| `realtime` | Rate-limit to wall clock | `false` |
| `num_steps` | Number of steps; `0` = infinite | `0` |
| `transition_duration` | Smooth transition time (seconds) from current pose to retarget command | - |
| `keyboard.enabled` | Enable realtime keyboard mode control for sim2sim | `false` |
| `playback.pause_on_end` | Pause at last frame when offline motion ends | `false` |
| `playback.keyboard.enabled` | Enable keyboard control for offline playback | `false` |
Expand Down Expand Up @@ -63,13 +62,15 @@ Complete reference for all configurable fields.
| `input.pico4_buffer_size` | Frame buffer size | `60` |
| `input.pause_button` | Button for pause/resume | `A` |
| `input.pause_debounce_s` | Debounce time for pause button | `0.25` |
| `input.arms_button` | Button for Pico `MOCAP` / `ARMS` toggle | `B` |
| `input.arms_debounce_s` | Debounce time for arms-mode button | `0.25` |
| `input.bridge_host` | Teleopit host receiver bind host | `0.0.0.0` |
| `input.bridge_port` | Teleopit host receiver TCP/UDP port | `63901` |
| `input.bridge_discovery` | Enable pico-bridge discovery advertising | `true` |
| `input.bridge_advertise_ip` | Optional advertised host IP override | `null` |
| `input.bridge_start_timeout` | Timeout while starting the bridge | `10.0` |
| `input.bridge_history_size` | Pico frame history retained by the bridge | `120` |
| `input.video.enabled` | Stream host camera preview back to Pico through pico-bridge 0.2.0 | `false` |
| `input.video.enabled` | Stream host camera preview back to Pico through pico-bridge 0.2.1 | `false` |
| `input.video.source` | Video source: `mujoco`, `realsense`, or `test-pattern` | `null` |
| `input.video.width` / `height` / `fps` | Video capture/render settings | `1280` / `720` / `30` |
| `input.video.device` | Optional RealSense serial | `null` |
Expand All @@ -84,23 +85,25 @@ Complete reference for all configurable fields.
| `retarget_buffer_delay_s` | Buffer delay |
| `reference_steps` | Reference window steps |
| `realtime_buffer_warmup_steps` | Warmup before playback |
| `realtime_buffer_low_watermark_steps` | Low watermark |
| `realtime_buffer_high_watermark_steps` | High watermark |
| `reference_velocity_smoothing_alpha` | Velocity smoothing |
| `reference_anchor_velocity_smoothing_alpha` | Anchor velocity smoothing |

## Sim2Real

Fields used by sim2real configs (`sim2real.yaml`, `pico4_sim2real.yaml`).

Sim2real defaults to `viewers=none`. Set `viewers=retarget` to open an optional
MuJoCo window showing the retargeted reference; `sim2sim`, `mocap`, `camera`,
and `all` are simulation-only viewer modes.

### Safety

| Field | Description | Default |
|-------|-------------|---------|
| `startup_ramp_duration` | Seconds to smoothly blend from locked to policy positions | `2.0` |
| `startup_ramp_duration` | Kp ramp duration after entering `STANDING`; gradually increases PD gains without changing policy targets | `2.0` |
| `joint_vel_limit` | Joint velocity limit (rad/s); triggers emergency damping if exceeded | `10.0` |
| `mocap_switch.check_frames` | Consecutive valid frames required before switching to MOCAP | `10` |
| `mocap_switch.max_position_value` | Position sanity threshold in meters | `5.0` |
| `arm_mocap.controlled_joint_indices` | G1 joints driven by live retargeting in Pico `ARMS` mode | `[15..28]` |

### Real Robot

Expand All @@ -116,22 +119,94 @@ Fields used by sim2real configs (`sim2real.yaml`, `pico4_sim2real.yaml`).

### Pause/Resume (Pico sim2real)

| Field | Description | Default |
|-------|-------------|---------|
| `pause_resume_transition_duration` | Resume blend duration for offline playback; realtime Pico resume uses live tracking re-centering | `1.0` |
| `pause_resume_warmup_steps` | Realtime mocap frames to collect before tracking resumes | `2` |

Realtime Pico resume re-centers heading and ground-plane position before tracking continues. Operators should keep still and stay as close as practical to the paused pose to reduce sudden reference changes.

### Realtime Catch-up (Pico sim2real)
### Dexterous Hand (Pico sim2real)

`hands.enabled=true` requires `input.provider=pico4` plus local editable
installs of `third_party/linkerhand-python-sdk` and `third_party/somehand`.
When enabled, hand control remains active in all sim2real modes.
`gripper` supports `linkerhand_l6` and `linkerhand_o6` by interpolating Pico
trigger input between the configured open and close poses. `vr_hand_pose` is
L6-only: missing hand pose holds the last command for that side, L6 speed is
set to the maximum, and Teleopit converts Pico hand state to 21 landmarks before
calling somehand 0.2.0 through `somehand.api` only.

| Field | Description | Default |
|-------|-------------|---------|
| `realtime_catchup_enabled` | Enable catch-up when buffer grows too large | `true` |
| `realtime_catchup_trigger_steps` | Buffer depth that triggers catch-up | `6` |
| `realtime_catchup_release_steps` | Buffer depth to release catch-up | `3` |
| `realtime_catchup_target_delay_s` | Target delay for catch-up | `0.04` |
| `reference_qpos_smoothing_alpha` | Joint position smoothing (1.0 = no smoothing) | `0.4` |
| `hands.enabled` | Enable optional hand worker | `false` |
| `hands.driver` | Hand driver plugin: `linkerhand_l6` or `linkerhand_o6` | `linkerhand_l6` |
| `hands.mode` | `gripper` or `vr_hand_pose` | `gripper` |
| `hands.sides` | Controlled sides | `[left, right]` |
| `hands.rate_hz` | Maximum gripper command rate in Hz | `30.0` |
| `hands.frame_timeout_s` | Controller or hand-pose staleness threshold | `0.3` |
| `hands.linkerhand_l6.left_can` / `right_can` | CAN channels for each hand | `can0` / `can1` |
| `hands.linkerhand_l6.speed` | L6 speed used by `gripper`; `vr_hand_pose` overrides this to maximum speed | see config |
| `hands.linkerhand_l6.open_pose` / `close_pose` | Six-value L6 open/closed poses | see config |
| `hands.linkerhand_o6.left_can` / `right_can` | CAN channels for each O6 hand | `can0` / `can1` |
| `hands.linkerhand_o6.speed` | O6 speed used by `gripper` | see config |
| `hands.linkerhand_o6.open_pose` / `close_pose` | Six-value O6 open/closed poses | see config |
| `hands.somehand.config_path` | Official somehand 0.2.0 bi-hand L6 config used by `vr_hand_pose` | see config |
| `hands.somehand.rate_hz` | Low-latency `vr_hand_pose` command rate in Hz | `60.0` |
| `hands.somehand.max_iterations` | somehand solver iteration cap for `vr_hand_pose` | `12` |
| `hands.somehand.temporal_filter_alpha` | somehand input landmark smoothing alpha; `1.0` disables smoothing delay | `1.0` |
| `hands.somehand.output_alpha` | somehand qpos output smoothing alpha; `1.0` disables smoothing delay | `1.0` |

### HDF5 Recording (Pico sim2real)

`recording.enabled=true` is supported only with `input.provider=pico4`,
`input.video.enabled=true`, `input.video.source=realsense`, and an interactive
terminal. The recorder is manual: `R` starts an episode, `S` saves the active
episode, `D` discards the active episode, and `Q` shuts down. `STANDING`,
`MOCAP`, `ARMS`, and paused mocap can be recorded.

`sim2real_record.yaml` enables both recording and the required RealSense
`input.video` path. Recording does not open a second camera; it consumes the
same frames produced by `pico_input`.

| Field | Description | Default |
|-------|-------------|---------|
| `recording.enabled` | Enable manual HDF5 recording | `false` |
| `recording.output_dir` | Dataset root directory | `data/recordings/sim2real_hdf5` |
| `recording.task` | Task string stored with frames | `demo` |
| `recording.fps` | Recording/video clock rate | `30` |
| `recording.min_episode_seconds` | Discard saved episodes shorter than this duration | `1.0` |
| `recording.record_modes` | Modes that allow recording start and frame writes | `[standing, mocap, arms, pause]` |
| `recording.camera.key` | RGB image dataset key | `observation.images.d435i_rgb` |
| `recording.camera.width` / `height` / `fps` | RealSense RGB capture settings | `640` / `480` / `30` |
| `recording.camera.device` | Optional RealSense serial | `null` |
| `recording.video.codec` / `quality` / `pixelformat` | MP4 sidecar encoder settings | `libx264` / `8` / `yuv420p` |

Camera failure behavior is controlled by `input.video.fail_on_error`.

Each saved episode has one `.h5` file under `recording.output_dir/episodes/`
and one compressed MP4 sidecar under
`recording.output_dir/videos/<camera_key>/`. The HDF5 episode stores
`frame_index` and `timestamp` arrays, plus `video_path`, `video_fps`, and
`video_frames` root attributes for synchronization. Raw RGB image datasets are
not written.

HDF5 datasets:

```text
frame_index int64[N]
timestamp float64[N]
observation.state float32[68]
observation.mode float32[1]
action float32[36]
action.hand float32[12]
```

The root attributes include the Teleopit HDF5 recording format, schema version,
task, fps, frame count, and video sync metadata.

`observation.state` is ordered as `joint_pos(29)`, `joint_vel(29)`,
`base_quat_wxyz(4)`, `base_ang_vel(3)`, and `projected_gravity(3)`.
`observation.mode` is a numeric categorical: `standing=0`, `mocap=1`,
`arms=2`, and `pause=3`. `action` is the current reference qpos:
`root_pos(3) + root_quat_wxyz(4) + joint_pos(29)`.
`action.hand` is the latest LinkerHand command from the hand worker:
`left_pose(6) + right_pose(6)`, using the SDK's 0-255 pose values.

## Critical: `default_dof_pos`

Expand Down
3 changes: 1 addition & 2 deletions docs/docs/configuration/faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ sidebar_position: 3
## Why does it fail even though I set `policy_path`?

1. Verify the file exists
2. Confirm it's not an old 1402D / TWIST2 ONNX model
3. Confirm the input dimension is `166` with dual inputs (`obs` + `obs_history`)
2. Confirm the input dimension is `167` with dual inputs (`obs` + `obs_history`)

## Why must I specify `input.bvh_file` explicitly?

Expand Down
2 changes: 1 addition & 1 deletion docs/docs/contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ teleopit/ # Core inference & deployment package
├── retargeting/ # GMR motion retargeting
├── sim/ # SimulationLoop, reference motion utilities
├── sim2real/ # Hardware state machines
├── recording/ # HDF5Recorder
├── recording/ # Pico motion recording helpers
├── runtime/ # Config parsing, factories, external assets
├── bus/ # InProcessBus for inter-component communication
└── configs/ # Hydra YAML configurations
Expand Down
21 changes: 12 additions & 9 deletions docs/docs/getting-started/download-assets.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,28 @@ python scripts/setup/download_assets.py
Download only what you need for inference:

```bash
python scripts/setup/download_assets.py --only gmr ckpt bvh
python scripts/setup/download_assets.py --only robots gmr ckpt bvh
```

## Asset Inventory

| Asset | Size | Purpose |
|-------|------|---------|
| `track.onnx` | 4 MB | ONNX inference model |
| `track.pt` | 27 MB | PyTorch checkpoint (for resume training) |
| `data/datasets/seed/train/shard_*.npz` | ~25 GB | Training dataset |
| `data/datasets/seed/val/shard_*.npz` | ~1.4 GB | Validation dataset |
| `data/sample_bvh/*.bvh` | 5 MB | Sample motion files |
| `teleopit/retargeting/gmr/assets/` | ~1.2 GB | GMR retargeting robot models |
Downloaded file sizes change as checkpoints, datasets, and asset bundles are updated. Use the repository paths below as the stable contract.

| Local Path | Purpose |
|------------|---------|
| `track.onnx` | ONNX inference model |
| `track.pt` | PyTorch checkpoint for resume training |
| `data/datasets/seed/shard_*.h5` | Minimal motion dataset; run precompute before training |
| `data/sample_bvh/*.bvh` | Sample motion files |
| `assets/robots/unitree_g1/` | Canonical G1 XML and meshes used by training, sim2sim, retargeting, and FK validation |
| `teleopit/retargeting/gmr/assets/` | GMR retargeting assets, IK configs, and non-canonical robot descriptions |

## Asset Groups

| Group | ModelScope Repo | Contents |
|-------|----------------|----------|
| `ckpt` | `BingqianWu/Teleopit-models` | `track.onnx`, `track.pt` |
| `robots` | `BingqianWu/Teleopit-models` | Canonical robot XML/meshes |
| `gmr` | `BingqianWu/Teleopit-models` | GMR retargeting assets |
| `bvh` | `BingqianWu/Teleopit-models` | Sample BVH motion files |
| `data` | `BingqianWu/Teleopit-datasets` | Training/validation shards |
Expand Down
Loading
Loading