From a57cb32d9b60fabe7c0a3c66d95e3ffe23d0da15 Mon Sep 17 00:00:00 2001 From: root <835297796@qq.com> Date: Tue, 14 Jul 2026 14:01:22 +0800 Subject: [PATCH 01/64] Migrate cotrain full-data config updates --- src/openpi/cotrain/config.py | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index a5f131b..b6f3a90 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -20,6 +20,7 @@ import openpi.shared.normalize as _normalize import openpi.training.config as _config import openpi.training.droid_rlds_dataset as droid_rlds_dataset +import openpi.training.optimizer as _optimizer import openpi.training.weight_loaders as weight_loaders import openpi.transforms as _transforms @@ -695,15 +696,29 @@ def _scale_dataset_weights(datasets: tuple[CotrainRLDSDataset, ...], train_episo ) +_FULL_ALL_EXCLUDED_DATASET_IDS = { + "robocoin_unitree_g1_dex3_s28_a28", + "robomind_tienkung_sim_s38_a38", +} + + +def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): + kept = tuple(ds for ds in datasets if ds.uid not in _FULL_ALL_EXCLUDED_DATASET_IDS) + total_weight = sum(ds.weight for ds in kept) + return tuple(dataclasses.replace(ds, weight=ds.weight / total_weight) for ds in kept) + + _FULL_ALL_DATA = CotrainDataConfig( rlds_data_dir="/mnt/data/RLDS", - datasets=( - *_scale_dataset_weights(_AGIBOT_DATA.datasets, _AGIBOT_TRAIN_EPISODES), - *_scale_dataset_weights(_DROID_DATA.datasets, _DROID_TRAIN_EPISODES), - *_scale_dataset_weights(_EGOVERSE_FULL_DATA.datasets, _EGOVERSE_FULL_TRAIN_EPISODES), - *_scale_dataset_weights(_PIPER30_DATA.datasets, _PIPER30_TRAIN_EPISODES), - *_scale_dataset_weights(_ROBOCOIN_DATA.datasets, _ROBOCOIN_TRAIN_EPISODES), - *_scale_dataset_weights(_ROBOMIND_FULL_DATA.datasets, _ROBOMIND_FULL_EPISODES), + datasets=_drop_excluded_and_renormalize( + ( + *_scale_dataset_weights(_AGIBOT_DATA.datasets, _AGIBOT_TRAIN_EPISODES), + *_scale_dataset_weights(_DROID_DATA.datasets, _DROID_TRAIN_EPISODES), + *_scale_dataset_weights(_EGOVERSE_FULL_DATA.datasets, _EGOVERSE_FULL_TRAIN_EPISODES), + *_scale_dataset_weights(_PIPER30_DATA.datasets, _PIPER30_TRAIN_EPISODES), + *_scale_dataset_weights(_ROBOCOIN_DATA.datasets, _ROBOCOIN_TRAIN_EPISODES), + *_scale_dataset_weights(_ROBOMIND_FULL_DATA.datasets, _ROBOMIND_FULL_EPISODES), + ) ), ) @@ -824,6 +839,13 @@ def _scale_dataset_weights(datasets: tuple[CotrainRLDSDataset, ...], train_episo weight_loader=cotrain_weight_loaders.ShapeSafeCheckpointWeightLoader( params_path="gs://openpi-assets/checkpoints/pi05_base/params", ), + lr_schedule=_optimizer.CosineDecaySchedule( + warmup_steps=10_000, + peak_lr=1.0e-6, + decay_steps=3_000_000, + decay_lr=1.0e-7, + ), + optimizer=_optimizer.AdamW(clip_gradient_norm=1.0), batch_size=32, num_train_steps=30_000, log_interval=100, From 9509d3d07228011568afe1da287976fb57c63811 Mon Sep 17 00:00:00 2001 From: root <835297796@qq.com> Date: Wed, 15 Jul 2026 15:37:34 +0800 Subject: [PATCH 02/64] ready for unified action space design --- ...72\351\227\264\350\256\276\350\256\241.md" | 255 ++++++++++++++++++ scripts/audit_rlds_action_metadata.py | 167 ++++++++++++ src/openpi/cotrain/config.py | 12 +- 3 files changed, 430 insertions(+), 4 deletions(-) create mode 100644 "docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241.md" create mode 100644 scripts/audit_rlds_action_metadata.py diff --git "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241.md" "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241.md" new file mode 100644 index 0000000..bd6a164 --- /dev/null +++ "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241.md" @@ -0,0 +1,255 @@ +### 一. Qwen-Manip 动作空间参考 + +论文把不同机器人的 **state 和 action 都放进统一的 80 维模板**。 +但这不代表每台机器人都实际使用 80 个物理自由度,而是采用“固定槽位 + 零填充 + binary mask”的方式。 +对 EEF 旋转,Qwen-Manip 的 state 使用由旋转矩阵得到的连续 6D 表示,action 旋转增量使用 +3D rotation vector;下表主要用于说明其 80D 槽位划分。 +我们只复用这一统一槽位思路,不要求 EEF 旋转表示和时序表示与 Qwen-Manip 完全一致。 + + +| 维度 | 具体内容 | +| --- | ----------------- | +| 1 | 左臂关节位置 1 | +| 2 | 左臂关节位置 2 | +| 3 | 左臂关节位置 3 | +| 4 | 左臂关节位置 4 | +| 5 | 左臂关节位置 5 | +| 6 | 左臂关节位置 6 | +| 7 | 左臂关节位置 7 | +| 8 | 左臂末端位置 (x) | +| 9 | 左臂末端位置 (y) | +| 10 | 左臂末端位置 (z) | +| 11 | 左臂末端旋转 6D 表示第 1 维 | +| 12 | 左臂末端旋转 6D 表示第 2 维 | +| 13 | 左臂末端旋转 6D 表示第 3 维 | +| 14 | 左臂末端旋转 6D 表示第 4 维 | +| 15 | 左臂末端旋转 6D 表示第 5 维 | +| 16 | 左臂末端旋转 6D 表示第 6 维 | +| 17 | 左侧平行夹爪关节位置 | +| 18 | 左侧灵巧手关节位置 1 | +| 19 | 左侧灵巧手关节位置 2 | +| 20 | 左侧灵巧手关节位置 3 | +| 21 | 左侧灵巧手关节位置 4 | +| 22 | 左侧灵巧手关节位置 5 | +| 23 | 左侧灵巧手关节位置 6 | +| 24 | 左侧灵巧手关节位置 7 | +| 25 | 左侧灵巧手关节位置 8 | +| 26 | 左侧灵巧手关节位置 9 | +| 27 | 左侧灵巧手关节位置 10 | +| 28 | 左侧灵巧手关节位置 11 | +| 29 | 左侧灵巧手关节位置 12 | +| 30 | 右臂关节位置 1 | +| 31 | 右臂关节位置 2 | +| 32 | 右臂关节位置 3 | +| 33 | 右臂关节位置 4 | +| 34 | 右臂关节位置 5 | +| 35 | 右臂关节位置 6 | +| 36 | 右臂关节位置 7 | +| 37 | 右臂末端位置 (x) | +| 38 | 右臂末端位置 (y) | +| 39 | 右臂末端位置 (z) | +| 40 | 右臂末端旋转 6D 表示第 1 维 | +| 41 | 右臂末端旋转 6D 表示第 2 维 | +| 42 | 右臂末端旋转 6D 表示第 3 维 | +| 43 | 右臂末端旋转 6D 表示第 4 维 | +| 44 | 右臂末端旋转 6D 表示第 5 维 | +| 45 | 右臂末端旋转 6D 表示第 6 维 | +| 46 | 右侧平行夹爪关节位置 | +| 47 | 右侧灵巧手关节位置 1 | +| 48 | 右侧灵巧手关节位置 2 | +| 49 | 右侧灵巧手关节位置 3 | +| 50 | 右侧灵巧手关节位置 4 | +| 51 | 右侧灵巧手关节位置 5 | +| 52 | 右侧灵巧手关节位置 6 | +| 53 | 右侧灵巧手关节位置 7 | +| 54 | 右侧灵巧手关节位置 8 | +| 55 | 右侧灵巧手关节位置 9 | +| 56 | 右侧灵巧手关节位置 10 | +| 57 | 右侧灵巧手关节位置 11 | +| 58 | 右侧灵巧手关节位置 12 | +| 59 | 共享保留维度 1 | +| 60 | 共享保留维度 2 | +| 61 | 共享保留维度 3 | +| 62 | 共享保留维度 4 | +| 63 | 共享保留维度 5 | +| 64 | 共享保留维度 6 | +| 65 | 共享保留维度 7 | +| 66 | 共享保留维度 8 | +| 67 | 共享保留维度 9 | +| 68 | 共享保留维度 10 | +| 69 | 共享保留维度 11 | +| 70 | 共享保留维度 12 | +| 71 | 共享保留维度 13 | +| 72 | 共享保留维度 14 | +| 73 | 共享保留维度 15 | +| 74 | 共享保留维度 16 | +| 75 | 共享保留维度 17 | +| 76 | 共享保留维度 18 | +| 77 | 共享保留维度 19 | +| 78 | 共享保留维度 20 | +| 79 | 共享保留维度 21 | +| 80 | 共享保留维度 22 | + + + + +### 二. 我们的 RLDS 统一 80D 动作空间 + + + +#### 1. 最终约定 + +所有数据集先把 state/action 映射到固定 80D,再做归一化和训练。未使用槽位填 0, +`action_mask` 仅在该数据集实际监督的槽位为 1;loss 只统计 mask=1 的维度。 + +保持当前训练 pipeline 的时序表示: + + +| 动作类型 | 统一表示 | +| ------------ | ------------------------------- | +| 手臂关节 | 相对当前 state:`q_target - q_t` | +| EEF 位姿 | absolute pose:平移 xyz + Euler yaw/pitch/roll | +| 平行夹爪 | absolute target | +| 灵巧手关节 | absolute target | +| 腿、头、腰、其他躯干关节 | absolute target | + + +这里的 relative/absolute 是本项目的最终约定,不强制复制 Qwen-Manip 的时序设计。手臂关节继续使用 +当前 pipeline 的 `q_target - q_t`;EgoVerse EEF 的 state 和 action 均保留原始 absolute +`xyz + yaw/pitch/roll`,不通过 action-state 差分构造 EEF delta。 + +源 RLDS 文件不修改,映射、关节差分、零填充和 mask 都在训练 pipeline 中完成。单臂机器人统一使用右臂槽位。 + + + +#### 2. 80D 维度定义 + +`Uk` 表示统一向量的第 k 维,编号从 1 开始。 + + +| 统一维度 | 最终物理意义 | 时序表示 | +| --------- | -------------------- | -------- | +| `U1-U7` | 左臂关节 1-7 | relative | +| `U8-U10` | 左 EEF 平移 x/y/z | absolute | +| `U11-U13` | 左 EEF Euler yaw/pitch/roll | absolute | +| `U14-U16` | 保留,当前不使用 | mask=0 | +| `U17` | 左平行夹爪位置 | absolute | +| `U18-U29` | 左灵巧手关节 1-12 | absolute | +| `U30-U36` | 右臂关节 1-7 | relative | +| `U37-U39` | 右 EEF 平移 x/y/z | absolute | +| `U40-U42` | 右 EEF Euler yaw/pitch/roll | absolute | +| `U43-U45` | 保留,当前不使用 | mask=0 | +| `U46` | 右平行夹爪位置 | absolute | +| `U47-U58` | 右灵巧手关节 1-12 | absolute | +| `U59-U64` | 左腿关节 1-6 | absolute | +| `U65-U70` | 右腿关节 1-6 | absolute | +| `U71-U72` | 头部关节 1-2 | absolute | +| `U73-U74` | 腰部关节 1-2 | absolute | +| `U75` | 其他单一躯干关节 | absolute | +| `U76-U80` | 保留,当前不使用 | mask=0 | + + +实际训练中只有 EgoVerse 使用 EEF 槽位。它的 state/action 均已是数据集给定坐标系下的 +`xyz + yaw/pitch/roll`,直接映射到上表槽位,不转 rotation-6D、不计算相对 SE(3)、不额外变换到相机坐标系。 + +#### 3. 映射记号 + +- `a1-aN`:RLDS 原始 action 维度。 +- `LJ/RJ`:左/右臂关节;`LG/RG`:左/右夹爪;`LH/RH`:左/右灵巧手。 +- `LE/RE`:左/右 EEF;`xyz`、`eul`、`quat` 分别表示平移、Euler 和 Quaternion。 +- `aX-Y -> UA-B`:按顺序逐维映射,例如 `a1-6 -> U1-6` 表示 `a1 -> U1, ..., a6 -> U6`。 +- EgoVerse 的 Euler 维度按顺序直接映射,例如 `a4-6 -> U11-13`。 +- `drop(aX-Y)`:明确丢弃这些源维度,不写入 80D,且不参与 loss。 +- 表中未列出的统一槽位均填 0 且 mask=0。 + + + +#### 4. 各数据集映射 + +本节覆盖 `cotrain_full_all` 来源中的全部 43 个 builder。当前配置排除 +`robocoin_unitree_g1_dex3_s28_a28` 和 `robomind_tienkung_sim_s38_a38`,仍保留其映射以便恢复使用。 + +##### AgiBot、DROID、EgoVerse、Piper + + +| dataset_id | 原始 action | 80D 映射 | +| ---------------- | ------------------------------------------------------------------- | ----------------------------------- | +| `agibot` | `a1-7` LJ,`a8-14` RJ,`a15` LG,`a16` RG,`a17-18` head,`a19-20` waist | `a1-7 -> U1-7`; `a8-14 -> U30-36`; `a15 -> U17`; `a16 -> U46`; `a17-18 -> U71-72`; `a19-20 -> U73-74` | +| `droid` | `a1-7` 单臂 joint,`a8` gripper | `a1-7 -> U30-36`; `a8 -> U46` | +| `egoverse_aria` | `a1-3` LE xyz,`a4-6` LE yaw/pitch/roll,`a7-9` RE xyz,`a10-12` RE yaw/pitch/roll | `a1-3 -> U8-10`; `a4-6 -> U11-13`; `a7-9 -> U37-39`; `a10-12 -> U40-42` | +| `egoverse_eva` | `a1-3` LE xyz,`a4-6` LE yaw/pitch/roll,`a7-9` RE xyz,`a10-12` RE yaw/pitch/roll | `a1-3 -> U8-10`; `a4-6 -> U11-13`; `a7-9 -> U37-39`; `a10-12 -> U40-42` | +| `egoverse_human` | `a1-3` LE xyz,`a4-6` LE yaw/pitch/roll,`a7-9` RE xyz,`a10-12` RE yaw/pitch/roll | `a1-3 -> U8-10`; `a4-6 -> U11-13`; `a7-9 -> U37-39`; `a10-12 -> U40-42` | +| `egoverse_mecka` | `a1-3` LE xyz,`a4-6` LE yaw/pitch/roll,`a7-9` RE xyz,`a10-12` RE yaw/pitch/roll | `a1-3 -> U8-10`; `a4-6 -> U11-13`; `a7-9 -> U37-39`; `a10-12 -> U40-42` | +| `egoverse_scale` | `a1-3` LE xyz,`a4-6` LE yaw/pitch/roll,`a7-9` RE xyz,`a10-12` RE yaw/pitch/roll | `a1-3 -> U8-10`; `a4-6 -> U11-13`; `a7-9 -> U37-39`; `a10-12 -> U40-42` | +| `piper30` | `a1-6` LJ,`a7` LG,`a8-13` RJ,`a14` RG | `a1-6 -> U1-6`; `a7 -> U17`; `a8-13 -> U30-35`; `a14 -> U46` | + + +Piper 的 `action[t]` 是 next-step absolute target,joint 转换后为 +`state[t+1]-state[t]`;其他 absolute joint target 同样统一减当前 `state[t]`。 + +##### RoboCOIN + +RoboCOIN 按当前 pipeline 的 absolute source target 处理:arm joint 转 relative,gripper、dex hand +和其他 body joint 保持 absolute。部分 action 向量同时包含 joint 和 EEF,但 EEF 的坐标/旋转约定 +不足以支撑可靠几何转换,因此这些 EEF 维度统一丢弃且 `action_mask=0`;同一样本中的 joint、gripper +及其他有明确语义的维度仍正常训练。 + + +| dataset_id | 原始 action | 80D 映射 | +| ----------------------------------------------- | -------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | +| `robocoin_agilex_cobot_magic_s26_a26` | `a1-6` LJ,`a7` LG,`a8-13` LE EEF;`a14-19` RJ,`a20` RG,`a21-26` RE EEF | `a1-6 -> U1-6`; `a7 -> U17`; `drop(a8-13)`; `a14-19 -> U30-35`; `a20 -> U46`; `drop(a21-26)` | +| `robocoin_airbot_mmk2_s36_a36` | `a1-6` LJ,`a7-12` RJ,`a13-24` LH,`a25-36` RH | `a1-6 -> U1-6`; `a7-12 -> U30-35`; `a13-24 -> U18-29`; `a25-36 -> U47-58` | +| `robocoin_galaxea_r1_lite_upper_s14_a14` | `a1-6` LJ,`a7-12` RJ,`a13` LG,`a14` RG | `a1-6 -> U1-6`; `a7-12 -> U30-35`; `a13 -> U17`; `a14 -> U46` | +| `robocoin_realman_rmc_aida_l_s28_a28` | `a1-7` RJ,`a8` RG,`a9-14` RE EEF;`a15-21` LJ,`a22` LG,`a23-28` LE EEF | `a1-7 -> U30-36`; `a8 -> U46`; `drop(a9-14)`; `a15-21 -> U1-7`; `a22 -> U17`; `drop(a23-28)` | +| `robocoin_unitree_g1_dex3_s28_a28` | `a1-7` LJ,`a8-14` RJ,`a15-21` LH,`a22-28` RH | `a1-7 -> U1-7`; `a8-14 -> U30-36`; `a15-21 -> U18-24`; `a22-28 -> U47-53`;当前排除 | +| `robocoin_agilex_decoupled_magic_s14_a14_fps30` | `a1-6` LJ,`a7` LG,`a8-13` RJ,`a14` RG | `a1-6 -> U1-6`; `a7 -> U17`; `a8-13 -> U30-35`; `a14 -> U46` | +| `robocoin_agilex_decoupled_magic_s14_a14_fps50` | `a1-6` LJ,`a7` LG,`a8-13` RJ,`a14` RG | `a1-6 -> U1-6`; `a7 -> U17`; `a8-13 -> U30-35`; `a14 -> U46` | +| `robocoin_agilex_decoupled_magic_s26_a26` | `a1-6` LJ,`a7` LG,`a8-13` LE EEF;`a14-19` RJ,`a20` RG,`a21-26` RE EEF | `a1-6 -> U1-6`; `a7 -> U17`; `drop(a8-13)`; `a14-19 -> U30-35`; `a20 -> U46`; `drop(a21-26)` | +| `robocoin_aloha_s26_a26` | `a1-6` LJ,`a7-12` LE EEF,`a13` LG;`a14-19` RJ,`a20-25` RE EEF,`a26` RG | `a1-6 -> U1-6`; `drop(a7-12)`; `a13 -> U17`; `a14-19 -> U30-35`; `drop(a20-25)`; `a26 -> U46` | +| `robocoin_alpha_bot_2_s28_a28` | `a1-7` LJ,`a8-13` LE EEF;`a14-20` RJ,`a21-26` RE EEF,`a27` LG,`a28` RG | `a1-7 -> U1-7`; `drop(a8-13)`; `a14-20 -> U30-36`; `drop(a21-26)`; `a27 -> U17`; `a28 -> U46` | +| `robocoin_discover_aitbot_mmk2_s36_a36` | `a1-6` LJ,`a7-12` RJ,`a13-24` LH,`a25-36` RH | `a1-6 -> U1-6`; `a7-12 -> U30-35`; `a13-24 -> U18-29`; `a25-36 -> U47-58` | +| `robocoin_galaxea_r1_lite_s14_a14` | `a1-6` LJ,`a7` LG,`a8-13` RJ,`a14` RG | `a1-6 -> U1-6`; `a7 -> U17`; `a8-13 -> U30-35`; `a14 -> U46` | +| `robocoin_galaxea_r1_lite_s16_a18` | `a1-7` LJ,`a8-14` RJ,`a15` LG,`a16` RG;`a17-18` 无语义名 | `a1-7 -> U1-7`; `a8-14 -> U30-36`; `a15 -> U17`; `a16 -> U46`; `drop(a17-18)` | +| `robocoin_leju_robot_s118_a54` | `a1-7` LJ,`a8-14` RJ,`a15-20` left leg,`a21-26` right leg,`a27-32` LH,`a33-38` RH,`a39-40` head,`a41-54` arm velocity | `a1-7 -> U1-7`; `a8-14 -> U30-36`; `a15-20 -> U59-64`; `a21-26 -> U65-70`; `a27-32 -> U18-23`; `a33-38 -> U47-52`; `a39-40 -> U71-72`; `drop(a41-54)` | +| `robocoin_leju_robot_s54_a54` | `a1-7` LJ,`a8-14` RJ,`a15-20` left leg,`a21-26` right leg,`a27-32` LH,`a33-38` RH,`a39-40` head,`a41-54` arm velocity | `a1-7 -> U1-7`; `a8-14 -> U30-36`; `a15-20 -> U59-64`; `a21-26 -> U65-70`; `a27-32 -> U18-23`; `a33-38 -> U47-52`; `a39-40 -> U71-72`; `drop(a41-54)` | +| `robocoin_realman_rmc_aidal_s28_a28` | `a1-7` RJ,`a8` RG,`a9-14` RE EEF;`a15-21` LJ,`a22` LG,`a23-28` LE EEF | `a1-7 -> U30-36`; `a8 -> U46`; `drop(a9-14)`; `a15-21 -> U1-7`; `a22 -> U17`; `drop(a23-28)` | +| `robocoin_ruantong_a2d_s17_a17` | `a1` auxiliary body,`a2-8` LJ,`a9-15` RJ,`a16` LG,`a17` RG | `a1 -> U75`; `a2-8 -> U1-7`; `a9-15 -> U30-36`; `a16 -> U17`; `a17 -> U46` | +| `robocoin_ruantong_a2d_s41_a34` | `a1-7` LJ,`a8-14` RJ,`a15-21` LE EEF,`a22-28` RE EEF,`a29-30` waist,`a31-32` head,`a33` LG,`a34` RG | `a1-7 -> U1-7`; `a8-14 -> U30-36`; `drop(a15-28)`; `a29-30 -> U73-74`; `a31-32 -> U71-72`; `a33 -> U17`; `a34 -> U46` | +| `robocoin_unitree_g1_s28_a28_high` | `a1-7` LJ,`a8-14` RJ,`a15-21` LH,`a22-28` RH | `a1-7 -> U1-7`; `a8-14 -> U30-36`; `a15-21 -> U18-24`; `a22-28 -> U47-53` | +| `robocoin_unitree_g1_s28_a28` | `a1-7` LJ,`a8-14` RJ,`a15-21` LH,`a22-28` RH | `a1-7 -> U1-7`; `a8-14 -> U30-36`; `a15-21 -> U18-24`; `a22-28 -> U47-53` | +| `robocoin_unknown_s30_a30_high` | `a1-7` LJ,`a8-14` RJ,`a15-21` LH,`a22-28` RH,`a29-30` 无语义名 | `a1-7 -> U1-7`; `a8-14 -> U30-36`; `a15-21 -> U18-24`; `a22-28 -> U47-53`; `drop(a29-30)` | +| `robocoin_yinhe_s49_a16` | `a1-7` LJ,`a8` LG,`a9-15` RJ,`a16` RG | `a1-7 -> U1-7`; `a8 -> U17`; `a9-15 -> U30-36`; `a16 -> U46`;state 使用原始 `s6-s21` 对齐 | + + + + +##### RoboMIND_full + + +| dataset_id | 原始 action | 80D 映射 | +| ----------------------------------------------- | ----------------------------------------------------- | ----------------------------------------------------------- | +| `robomind_agilex_cobot_magic_s14_a14` | `a1-6` LJ,`a7` LG,`a8-13` RJ,`a14` RG | `a1-6 -> U1-6`; `a7 -> U17`; `a8-13 -> U30-35`; `a14 -> U46` | +| `robomind_franka_fr3_dual_s16_a16` | `a1-7` LJ,`a8` LG,`a9-15` RJ,`a16` RG | `a1-7 -> U1-7`; `a8 -> U17`; `a9-15 -> U30-36`; `a16 -> U46` | +| `robomind_franka_panda_s8_a8` | `a1-7` 单臂 joint,`a8` gripper | `a1-7 -> U30-36`; `a8 -> U46` | +| `robomind_franka_sim_franka_s8_a8` | `a1-7` 单臂 joint,`a8` gripper | `a1-7 -> U30-36`; `a8 -> U46` | +| `robomind_franka_sim_simulation_s8_a8` | `a1-7` 单臂 joint,`a8` gripper | `a1-7 -> U30-36`; `a8 -> U46` | +| `robomind_franka_sim_simulation_no_front_s8_a8` | `a1-7` 单臂 joint,`a8` gripper | `a1-7 -> U30-36`; `a8 -> U46` | +| `robomind_franka_sim_none_s8_a8` | `a1-7` 单臂 joint,`a8` gripper | `a1-7 -> U30-36`; `a8 -> U46` | +| `robomind_tienkung_gello_s16_a16` | `a1-7` LJ,`a8` LG closure,`a9-15` RJ,`a16` RG closure | `a1-7 -> U1-7`; `a8 -> U17`; `a9-15 -> U30-36`; `a16 -> U46`;arm relative,closure absolute | +| `robomind_tienkung_prod1_gello_s16_a16` | `a1-7` LJ,`a8` LG closure,`a9-15` RJ,`a16` RG closure | `a1-7 -> U1-7`; `a8 -> U17`; `a9-15 -> U30-36`; `a16 -> U46`;arm relative,closure absolute | +| `robomind_tienkung_xsens_s14_a14` | `a1-7` LJ,`a8-14` RJ | `a1-7 -> U1-7`; `a8-14 -> U30-36`;按当前 RLDS 使用,不补手部 | +| `robomind_tienkung_sim_s38_a38` | `a1-7` LJ,`a8-19` LH,`a20-26` RJ,`a27-38` RH | `a1-7 -> U1-7`; `a8-19 -> U18-29`; `a20-26 -> U30-36`; `a27-38 -> U47-58`;arm relative,hand absolute;当前排除 | +| `robomind_tienkung_real_s38_a38` | `a1-7` LJ,`a8-19` LH,`a20-26` RJ,`a27-38` RH | `a1-7 -> U1-7`; `a8-19 -> U18-29`; `a20-26 -> U30-36`; `a27-38 -> U47-58`;arm relative,hand absolute;参与训练 | +| `robomind_ur5e_s7_a7` | `a1-6` 单臂 joint,`a7` gripper | `a1-6 -> U30-35`; `a7 -> U46` | + + + + +#### 5. 已确认的特殊处理 + +- 只有 EgoVerse 使用 EEF 训练槽位;state/action 均直接使用 absolute `xyz + yaw/pitch/roll`。 +- RoboCOIN 按当前 absolute source target 流程处理,其中所有 EEF 维度均丢弃,不参与归一化和 loss。 +- Leju 保留 position targets,丢弃 14D arm velocity;被丢弃维度不产生统一槽位。 +- TienKung Xsens 仅使用现有 RLDS 的 14D 双臂 action,不补原始数据中的手部字段。 +- `galaxea_s16_a18` 的 `a17-18` 和 `unknown_s30_a30` 的 `a29-30` 缺少物理名称,固定丢弃。 +- TienKung Gello closure 和 TienKung 38D dex hand 已统一保持 absolute;仅 arm joint 做 relative 转换。 diff --git a/scripts/audit_rlds_action_metadata.py b/scripts/audit_rlds_action_metadata.py new file mode 100644 index 0000000..856807d --- /dev/null +++ b/scripts/audit_rlds_action_metadata.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python3 +"""Extract action-space metadata from the RLDS datasets used by cotrain_full_all. + +The TFDS builders store one episode per TFRecord Example. Episodes can be hundreds of +megabytes because they include image sequences, so this script scans the serialized +protobuf with mmap and decodes only selected scalar metadata features. +""" + +from __future__ import annotations + +import argparse +import json +import mmap +from pathlib import Path +from typing import Any + + +DATASET_ROOTS = ( + "AgiBot", + "DROID", + "EgoVerse_full", + "realworld_piper", + "RoboCOIN", + "RoboMIND_full", +) + +METADATA_FIELDS = ( + "action_is_delta", + "action_representation", + "cartesian_frame", + "control_mode", + "eef_pose_coordinate_frame", + "raw_episode_metadata_json", + "robot_schema_key", + "robot_type", + "state_action_schema_json", +) + + +def _read_varint(data: mmap.mmap, offset: int) -> tuple[int, int]: + value = 0 + shift = 0 + while True: + byte = data[offset] + offset += 1 + value |= (byte & 0x7F) << shift + if byte < 0x80: + return value, offset + shift += 7 + if shift >= 70: + raise ValueError("invalid protobuf varint") + + +def _iter_fields(data: mmap.mmap, start: int, end: int): + offset = start + while offset < end: + tag, offset = _read_varint(data, offset) + field_number = tag >> 3 + wire_type = tag & 0x07 + if wire_type == 0: + _, value_end = _read_varint(data, offset) + yield field_number, wire_type, offset, value_end + offset = value_end + elif wire_type == 1: + yield field_number, wire_type, offset, offset + 8 + offset += 8 + elif wire_type == 2: + size, value_start = _read_varint(data, offset) + value_end = value_start + size + yield field_number, wire_type, value_start, value_end + offset = value_end + elif wire_type == 5: + yield field_number, wire_type, offset, offset + 4 + offset += 4 + else: + raise ValueError(f"unsupported protobuf wire type {wire_type}") + + +def _scalar_bytes_features(data: mmap.mmap, requested_keys: set[str]) -> dict[str, bytes]: + """Read scalar bytes_list features from the first TFRecord Example.""" + record_size = int.from_bytes(data[0:8], "little") + example_start = 12 # uint64 length + masked CRC32C + example_end = example_start + record_size + example_fields = list(_iter_fields(data, example_start, example_end)) + features_field = next(field for field in example_fields if field[0] == 1 and field[1] == 2) + + values: dict[str, bytes] = {} + for field_number, wire_type, entry_start, entry_end in _iter_fields(data, features_field[2], features_field[3]): + if field_number != 1 or wire_type != 2: + continue + entry_fields = list(_iter_fields(data, entry_start, entry_end)) + key_field = next((field for field in entry_fields if field[0] == 1 and field[1] == 2), None) + value_field = next((field for field in entry_fields if field[0] == 2 and field[1] == 2), None) + if key_field is None or value_field is None: + continue + key = bytes(data[key_field[2] : key_field[3]]).decode("utf-8") + if key not in requested_keys: + continue + + # Feature.field_1(bytes_list) -> BytesList.field_1(value). + feature_fields = list(_iter_fields(data, value_field[2], value_field[3])) + bytes_list = next((field for field in feature_fields if field[0] == 1 and field[1] == 2), None) + if bytes_list is None: + continue + bytes_fields = list(_iter_fields(data, bytes_list[2], bytes_list[3])) + scalar = next((field for field in bytes_fields if field[0] == 1 and field[1] == 2), None) + if scalar is not None: + values[key] = bytes(data[scalar[2] : scalar[3]]) + return values + + +def _first_train_shard(builder_dir: Path) -> Path: + shards = sorted(builder_dir.glob("*-train.tfrecord-*")) + if not shards: + raise FileNotFoundError(f"no train TFRecord shard under {builder_dir}") + return shards[0] + + +def _read_builder_metadata(root: Path, builder_dir: Path) -> dict[str, Any]: + shard = _first_train_shard(builder_dir) + with shard.open("rb") as file: + data = mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) + try: + requested_keys = {f"episode_metadata/{field}" for field in METADATA_FIELDS} + scalar_features = _scalar_bytes_features(data, requested_keys) + metadata: dict[str, Any] = {} + for field in METADATA_FIELDS: + raw = scalar_features.get(f"episode_metadata/{field}") + if raw is None: + continue + value = raw.decode("utf-8") + if field.endswith("_json"): + try: + value = json.loads(value) + except json.JSONDecodeError: + pass + metadata[field] = value + finally: + data.close() + + return { + "builder_dir": str(builder_dir.relative_to(root)), + "first_train_shard": shard.name, + "metadata": metadata, + } + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--rlds-root", type=Path, default=Path("/mnt/workspace/RLDS")) + parser.add_argument("--output", type=Path) + args = parser.parse_args() + + builders = [] + for dataset_root in DATASET_ROOTS: + builders.extend(sorted((args.rlds_root / dataset_root).rglob("features.json"))) + + records = [_read_builder_metadata(args.rlds_root, path.parent) for path in builders] + output = json.dumps(records, ensure_ascii=False, indent=2) + "\n" + if args.output is None: + print(output, end="") + else: + args.output.write_text(output, encoding="utf-8") + + +if __name__ == "__main__": + main() diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index b6f3a90..8915803 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -584,7 +584,8 @@ def _make_robocoin_dataset( "tienkung_humanoid_master_puppet_joint_position_h5_tienkung_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_6626", 6_626, 16, - (16,), + # arm7 delta + hand-closure absolute, per side. + (7, -1, 7, -1), ("cam_top", None, None), ), ( @@ -592,7 +593,8 @@ def _make_robocoin_dataset( "tienkung_humanoid_master_puppet_joint_position_h5_tienkung_prod1_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_2959", 2_959, 16, - (16,), + # arm7 delta + hand-closure absolute, per side. + (7, -1, 7, -1), ("cam_top", None, None), ), ( @@ -608,7 +610,8 @@ def _make_robocoin_dataset( "tienkung_humanoid_tiangong_joint_position_h5_sim_tienkung_1rgb_sim_s38_a38_fps30_cam_chest_cam_head__episodes_3965", 3_965, 38, - (38,), + # arm7 delta + dex-hand12 absolute, per side. + (7, -12, 7, -12), ("cam_chest", "cam_head", None), ), ( @@ -616,7 +619,8 @@ def _make_robocoin_dataset( "tienkung_humanoid_tiangong_joint_position_none_real_s38_a38_fps30_cam_chest_cam_head__episodes_146", 146, 38, - (38,), + # arm7 delta + dex-hand12 absolute, per side. + (7, -12, 7, -12), ("cam_chest", "cam_head", None), ), ( From aa1588004daeab556e293d5b54d11bb70c48138d Mon Sep 17 00:00:00 2001 From: root <835297796@qq.com> Date: Wed, 15 Jul 2026 15:49:10 +0800 Subject: [PATCH 03/64] Add unified 80D action mappings --- ...00\345\217\221\346\227\245\345\277\227.md" | 41 +++ src/openpi/cotrain/action_space.py | 292 ++++++++++++++++++ tests/cotrain/test_action_space.py | 114 +++++++ 3 files changed, 447 insertions(+) create mode 100644 "docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" create mode 100644 src/openpi/cotrain/action_space.py create mode 100644 tests/cotrain/test_action_space.py diff --git "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" new file mode 100644 index 0000000..c20fcf8 --- /dev/null +++ "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" @@ -0,0 +1,41 @@ +# 统一动作空间开发日志 + +## 开发目标 + +将 `cotrain_full_all` 从“原生向量放在前 D 维、尾部补零”改为固定物理语义的 80D state/action, +并在训练、采样、评估和可视化中使用每样本 binary action mask。原始 RLDS 文件不修改。 + +## 基线链路 + +2026-07-15 审计确认当前顺序为: + +`restructure -> source index selection -> prefix placement/zero padding -> chunk -> delta -> normalization -> model` + +已确认的风险: + +- 不同机器人的同一物理量位于不同前缀维度。 +- flow loss 对当前全部 64D 取平均,补零维也参与目标。 +- action MSE 和可视化用“前 D 维有效”表示 mask,不支持非连续统一槽位。 +- `delta_action_mask_dims` 没有显式区分“源 absolute 需做差”与“源已是 delta”。 + +## 阶段一:映射配置与静态校验 + +### 实现 + +- 新增 `src/openpi/cotrain/action_space.py`。 +- 用 `UnifiedActionSpec` 分别声明 state/action 的 source-to-80D 映射。 +- 将 `absolute_to_delta_slots` 和 `already_delta_slots` 分开,防止原生 delta 动作被再次做差。 +- `action_mask` 和 `delta_mask` 由映射自动推导。 +- 注册设计文档中全部 43 个 builder,包括当前从 full-all 排除的 2 个 builder。 +- RoboCOIN 7 个混合 action builder 只映射 joint/gripper/body,EEF 源维度不进入 80D。 + +### 验证 + +- 首次执行 `python3 -m pytest tests/cotrain/test_action_space.py -q` 在 collection 阶段失败;原因是当前 shell + 未设置 `PYTHONPATH=src`,系统 Python 无法定位 `openpi`。 +- 使用 `PYTHONPATH=src python3 -m pytest tests/cotrain/test_action_space.py -q`:`48 passed`。 +- `python3 -m ruff check src/openpi/cotrain/action_space.py tests/cotrain/test_action_space.py`:通过。 +- 静态验证覆盖:43 builder 注册表、80D mask 长度、delta/state/action 包含关系、只有 + EgoVerse 使用 EEF 槽、7 个 RoboCOIN EEF 源区间全部丢弃、Yinhe state reorder。 +- 环境备注:系统 Python 未安装完整项目依赖;后续 RLDS/TensorFlow 验证使用 + `/mnt/workspace/xule/pi07_reproduction/.venv/bin/python` 并指向新仓库 `PYTHONPATH`。 diff --git a/src/openpi/cotrain/action_space.py b/src/openpi/cotrain/action_space.py new file mode 100644 index 0000000..fb1d9f2 --- /dev/null +++ b/src/openpi/cotrain/action_space.py @@ -0,0 +1,292 @@ +"""Unified 80D state/action layouts for RLDS co-training.""" + +from __future__ import annotations + +import dataclasses + +UNIFIED_ACTION_DIM = 80 + +LEFT_ARM = 0 +LEFT_EEF_POSITION = 7 +LEFT_EEF_EULER = 10 +LEFT_GRIPPER = 16 +LEFT_HAND = 17 +RIGHT_ARM = 29 +RIGHT_EEF_POSITION = 36 +RIGHT_EEF_EULER = 39 +RIGHT_GRIPPER = 45 +RIGHT_HAND = 46 +LEFT_LEG = 58 +RIGHT_LEG = 64 +HEAD = 70 +WAIST = 72 +OTHER_BODY = 74 + +DimMapping = tuple[tuple[int, int], ...] + + +def dims(source_start: int, target_start: int, count: int) -> DimMapping: + """Map a contiguous source range to a contiguous unified range.""" + return tuple((source_start + i, target_start + i) for i in range(count)) + + +def slots(start: int, count: int) -> tuple[int, ...]: + return tuple(range(start, start + count)) + + +@dataclasses.dataclass(frozen=True) +class UnifiedActionSpec: + """Source-to-unified mappings and temporal semantics for one RLDS builder. + + Indices are zero-based. ``absolute_to_delta_slots`` identifies source-absolute + targets that are converted to deltas after state/action mapping. Slots listed in + ``already_delta_slots`` are already relative in the source and must never be + differenced again. All other mapped action slots remain absolute. + """ + + state_mapping: DimMapping + action_mapping: DimMapping + absolute_to_delta_slots: tuple[int, ...] = () + already_delta_slots: tuple[int, ...] = () + + def __post_init__(self) -> None: + self._validate_mapping("state", self.state_mapping) + self._validate_mapping("action", self.action_mapping) + + action_targets = set(self.action_target_slots) + state_targets = set(self.state_target_slots) + absolute_to_delta = set(self.absolute_to_delta_slots) + already_delta = set(self.already_delta_slots) + if absolute_to_delta & already_delta: + raise ValueError("absolute_to_delta_slots and already_delta_slots overlap") + for name, temporal_slots in ( + ("absolute_to_delta_slots", absolute_to_delta), + ("already_delta_slots", already_delta), + ): + missing_action = temporal_slots - action_targets + if missing_action: + raise ValueError(f"{name} contains unmapped action slots: {sorted(missing_action)}") + missing_state = temporal_slots - state_targets + if missing_state: + raise ValueError(f"{name} contains slots without mapped state: {sorted(missing_state)}") + + @staticmethod + def _validate_mapping(name: str, mapping: DimMapping) -> None: + sources = [source for source, _ in mapping] + targets = [target for _, target in mapping] + if any(index < 0 for index in sources): + raise ValueError(f"{name} mapping contains a negative source index") + if any(index < 0 or index >= UNIFIED_ACTION_DIM for index in targets): + raise ValueError(f"{name} mapping target is outside 0..{UNIFIED_ACTION_DIM - 1}") + if len(sources) != len(set(sources)): + raise ValueError(f"{name} mapping contains duplicate source indices") + if len(targets) != len(set(targets)): + raise ValueError(f"{name} mapping contains duplicate target slots") + + @property + def state_target_slots(self) -> tuple[int, ...]: + return tuple(target for _, target in self.state_mapping) + + @property + def action_target_slots(self) -> tuple[int, ...]: + return tuple(target for _, target in self.action_mapping) + + @property + def action_mask(self) -> tuple[bool, ...]: + targets = set(self.action_target_slots) + return tuple(index in targets for index in range(UNIFIED_ACTION_DIM)) + + @property + def delta_mask(self) -> tuple[bool, ...]: + targets = set(self.absolute_to_delta_slots) + return tuple(index in targets for index in range(UNIFIED_ACTION_DIM)) + + def validate_source_dims(self, state_dim: int, action_dim: int) -> None: + if self.state_mapping and max(source for source, _ in self.state_mapping) >= state_dim: + raise ValueError(f"state mapping requires source dim beyond state width {state_dim}") + if self.action_mapping and max(source for source, _ in self.action_mapping) >= action_dim: + raise ValueError(f"action mapping requires source dim beyond action width {action_dim}") + + +def _same(mapping: DimMapping, *, delta: tuple[int, ...] = ()) -> UnifiedActionSpec: + return UnifiedActionSpec(mapping, mapping, absolute_to_delta_slots=delta) + + +def _dual_arm(arm_dof: int, *, left_source: int = 0, right_source: int | None = None) -> DimMapping: + right_source = arm_dof if right_source is None else right_source + return dims(left_source, LEFT_ARM, arm_dof) + dims(right_source, RIGHT_ARM, arm_dof) + + +def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedActionSpec: + mapping = dims(0, RIGHT_ARM, arm_dof) + if gripper_source is not None: + mapping += dims(gripper_source, RIGHT_GRIPPER, 1) + return _same(mapping, delta=slots(RIGHT_ARM, arm_dof)) + + +_EGO_MAPPING = ( + dims(0, LEFT_EEF_POSITION, 3) + + dims(3, LEFT_EEF_EULER, 3) + + dims(6, RIGHT_EEF_POSITION, 3) + + dims(9, RIGHT_EEF_EULER, 3) +) + +_AGIBOT_MAPPING = ( + _dual_arm(7) + dims(14, LEFT_GRIPPER, 1) + dims(15, RIGHT_GRIPPER, 1) + dims(16, HEAD, 2) + dims(18, WAIST, 2) +) + +_PIPER_MAPPING = dims(0, LEFT_ARM, 6) + dims(6, LEFT_GRIPPER, 1) + dims(7, RIGHT_ARM, 6) + dims(13, RIGHT_GRIPPER, 1) + + +UNIFIED_ACTION_SPECS: dict[str, UnifiedActionSpec] = { + "agibot": _same(_AGIBOT_MAPPING, delta=slots(LEFT_ARM, 7) + slots(RIGHT_ARM, 7)), + "droid": _single_right(7, 7), + "egoverse_aria": _same(_EGO_MAPPING), + "egoverse_eva": _same(_EGO_MAPPING), + "egoverse_human": _same(_EGO_MAPPING), + "egoverse_mecka": _same(_EGO_MAPPING), + "egoverse_scale": _same(_EGO_MAPPING), + "piper30": _same(_PIPER_MAPPING, delta=slots(LEFT_ARM, 6) + slots(RIGHT_ARM, 6)), +} + + +def _register_robocoin() -> None: + specs = UNIFIED_ACTION_SPECS + dual6_grippers = ( + dims(0, LEFT_ARM, 6) + dims(6, LEFT_GRIPPER, 1) + dims(7, RIGHT_ARM, 6) + dims(13, RIGHT_GRIPPER, 1) + ) + dual7_grippers = ( + dims(0, LEFT_ARM, 7) + dims(7, LEFT_GRIPPER, 1) + dims(8, RIGHT_ARM, 7) + dims(15, RIGHT_GRIPPER, 1) + ) + mixed6 = dims(0, LEFT_ARM, 6) + dims(6, LEFT_GRIPPER, 1) + dims(13, RIGHT_ARM, 6) + dims(19, RIGHT_GRIPPER, 1) + mixed7_right_first = ( + dims(0, RIGHT_ARM, 7) + dims(7, RIGHT_GRIPPER, 1) + dims(14, LEFT_ARM, 7) + dims(21, LEFT_GRIPPER, 1) + ) + dual6_delta = slots(LEFT_ARM, 6) + slots(RIGHT_ARM, 6) + dual7_delta = slots(LEFT_ARM, 7) + slots(RIGHT_ARM, 7) + + specs.update( + { + "robocoin_agilex_cobot_magic_s26_a26": _same(mixed6, delta=dual6_delta), + "robocoin_airbot_mmk2_s36_a36": _same( + _dual_arm(6) + dims(12, LEFT_HAND, 12) + dims(24, RIGHT_HAND, 12), delta=dual6_delta + ), + "robocoin_galaxea_r1_lite_upper_s14_a14": _same( + _dual_arm(6) + dims(12, LEFT_GRIPPER, 1) + dims(13, RIGHT_GRIPPER, 1), delta=dual6_delta + ), + "robocoin_realman_rmc_aida_l_s28_a28": _same(mixed7_right_first, delta=dual7_delta), + "robocoin_unitree_g1_dex3_s28_a28": _same( + _dual_arm(7) + dims(14, LEFT_HAND, 7) + dims(21, RIGHT_HAND, 7), delta=dual7_delta + ), + "robocoin_agilex_decoupled_magic_s14_a14_fps30": _same(dual6_grippers, delta=dual6_delta), + "robocoin_agilex_decoupled_magic_s14_a14_fps50": _same(dual6_grippers, delta=dual6_delta), + "robocoin_agilex_decoupled_magic_s26_a26": _same(mixed6, delta=dual6_delta), + "robocoin_aloha_s26_a26": _same( + dims(0, LEFT_ARM, 6) + dims(12, LEFT_GRIPPER, 1) + dims(13, RIGHT_ARM, 6) + dims(25, RIGHT_GRIPPER, 1), + delta=dual6_delta, + ), + "robocoin_alpha_bot_2_s28_a28": _same( + dims(0, LEFT_ARM, 7) + dims(13, RIGHT_ARM, 7) + dims(26, LEFT_GRIPPER, 1) + dims(27, RIGHT_GRIPPER, 1), + delta=dual7_delta, + ), + "robocoin_discover_aitbot_mmk2_s36_a36": _same( + _dual_arm(6) + dims(12, LEFT_HAND, 12) + dims(24, RIGHT_HAND, 12), delta=dual6_delta + ), + "robocoin_galaxea_r1_lite_s14_a14": _same(dual6_grippers, delta=dual6_delta), + "robocoin_galaxea_r1_lite_s16_a18": _same( + _dual_arm(7) + dims(14, LEFT_GRIPPER, 1) + dims(15, RIGHT_GRIPPER, 1), delta=dual7_delta + ), + "robocoin_leju_robot_s118_a54": _same( + _dual_arm(7) + + dims(14, LEFT_LEG, 6) + + dims(20, RIGHT_LEG, 6) + + dims(26, LEFT_HAND, 6) + + dims(32, RIGHT_HAND, 6) + + dims(38, HEAD, 2), + delta=dual7_delta, + ), + "robocoin_leju_robot_s54_a54": _same( + _dual_arm(7) + + dims(14, LEFT_LEG, 6) + + dims(20, RIGHT_LEG, 6) + + dims(26, LEFT_HAND, 6) + + dims(32, RIGHT_HAND, 6) + + dims(38, HEAD, 2), + delta=dual7_delta, + ), + "robocoin_realman_rmc_aidal_s28_a28": _same(mixed7_right_first, delta=dual7_delta), + "robocoin_ruantong_a2d_s17_a17": _same( + dims(0, OTHER_BODY, 1) + + dims(1, LEFT_ARM, 7) + + dims(8, RIGHT_ARM, 7) + + dims(15, LEFT_GRIPPER, 1) + + dims(16, RIGHT_GRIPPER, 1), + delta=dual7_delta, + ), + "robocoin_ruantong_a2d_s41_a34": _same( + _dual_arm(7) + + dims(28, WAIST, 2) + + dims(30, HEAD, 2) + + dims(32, LEFT_GRIPPER, 1) + + dims(33, RIGHT_GRIPPER, 1), + delta=dual7_delta, + ), + "robocoin_unitree_g1_s28_a28_high": _same( + _dual_arm(7) + dims(14, LEFT_HAND, 7) + dims(21, RIGHT_HAND, 7), delta=dual7_delta + ), + "robocoin_unitree_g1_s28_a28": _same( + _dual_arm(7) + dims(14, LEFT_HAND, 7) + dims(21, RIGHT_HAND, 7), delta=dual7_delta + ), + "robocoin_unknown_s30_a30_high": _same( + _dual_arm(7) + dims(14, LEFT_HAND, 7) + dims(21, RIGHT_HAND, 7), delta=dual7_delta + ), + } + ) + + yinhe_action = dual7_grippers + yinhe_state = dims(5, LEFT_ARM, 7) + dims(12, LEFT_GRIPPER, 1) + dims(13, RIGHT_ARM, 7) + dims(20, RIGHT_GRIPPER, 1) + specs["robocoin_yinhe_s49_a16"] = UnifiedActionSpec( + state_mapping=yinhe_state, + action_mapping=yinhe_action, + absolute_to_delta_slots=dual7_delta, + ) + + +def _register_robomind() -> None: + specs = UNIFIED_ACTION_SPECS + dual6_grippers = ( + dims(0, LEFT_ARM, 6) + dims(6, LEFT_GRIPPER, 1) + dims(7, RIGHT_ARM, 6) + dims(13, RIGHT_GRIPPER, 1) + ) + dual7_grippers = ( + dims(0, LEFT_ARM, 7) + dims(7, LEFT_GRIPPER, 1) + dims(8, RIGHT_ARM, 7) + dims(15, RIGHT_GRIPPER, 1) + ) + dual7_delta = slots(LEFT_ARM, 7) + slots(RIGHT_ARM, 7) + specs.update( + { + "robomind_agilex_cobot_magic_s14_a14": _same( + dual6_grippers, delta=slots(LEFT_ARM, 6) + slots(RIGHT_ARM, 6) + ), + "robomind_franka_fr3_dual_s16_a16": _same(dual7_grippers, delta=dual7_delta), + "robomind_franka_panda_s8_a8": _single_right(7, 7), + "robomind_franka_sim_franka_s8_a8": _single_right(7, 7), + "robomind_franka_sim_simulation_s8_a8": _single_right(7, 7), + "robomind_franka_sim_simulation_no_front_s8_a8": _single_right(7, 7), + "robomind_franka_sim_none_s8_a8": _single_right(7, 7), + "robomind_tienkung_gello_s16_a16": _same(dual7_grippers, delta=dual7_delta), + "robomind_tienkung_prod1_gello_s16_a16": _same(dual7_grippers, delta=dual7_delta), + "robomind_tienkung_xsens_s14_a14": _same(_dual_arm(7), delta=dual7_delta), + "robomind_tienkung_sim_s38_a38": _same( + dims(0, LEFT_ARM, 7) + dims(7, LEFT_HAND, 12) + dims(19, RIGHT_ARM, 7) + dims(26, RIGHT_HAND, 12), + delta=dual7_delta, + ), + "robomind_tienkung_real_s38_a38": _same( + dims(0, LEFT_ARM, 7) + dims(7, LEFT_HAND, 12) + dims(19, RIGHT_ARM, 7) + dims(26, RIGHT_HAND, 12), + delta=dual7_delta, + ), + "robomind_ur5e_s7_a7": _single_right(6, 6), + } + ) + + +_register_robocoin() +_register_robomind() diff --git a/tests/cotrain/test_action_space.py b/tests/cotrain/test_action_space.py new file mode 100644 index 0000000..61f2bff --- /dev/null +++ b/tests/cotrain/test_action_space.py @@ -0,0 +1,114 @@ +from __future__ import annotations + +import pytest + +from openpi.cotrain import action_space + +EXPECTED_DATASET_IDS = { + "agibot", + "droid", + "egoverse_aria", + "egoverse_eva", + "egoverse_human", + "egoverse_mecka", + "egoverse_scale", + "piper30", + "robocoin_agilex_cobot_magic_s26_a26", + "robocoin_airbot_mmk2_s36_a36", + "robocoin_galaxea_r1_lite_upper_s14_a14", + "robocoin_realman_rmc_aida_l_s28_a28", + "robocoin_unitree_g1_dex3_s28_a28", + "robocoin_agilex_decoupled_magic_s14_a14_fps30", + "robocoin_agilex_decoupled_magic_s14_a14_fps50", + "robocoin_agilex_decoupled_magic_s26_a26", + "robocoin_aloha_s26_a26", + "robocoin_alpha_bot_2_s28_a28", + "robocoin_discover_aitbot_mmk2_s36_a36", + "robocoin_galaxea_r1_lite_s14_a14", + "robocoin_galaxea_r1_lite_s16_a18", + "robocoin_leju_robot_s118_a54", + "robocoin_leju_robot_s54_a54", + "robocoin_realman_rmc_aidal_s28_a28", + "robocoin_ruantong_a2d_s17_a17", + "robocoin_ruantong_a2d_s41_a34", + "robocoin_unitree_g1_s28_a28_high", + "robocoin_unitree_g1_s28_a28", + "robocoin_unknown_s30_a30_high", + "robocoin_yinhe_s49_a16", + "robomind_agilex_cobot_magic_s14_a14", + "robomind_franka_fr3_dual_s16_a16", + "robomind_franka_panda_s8_a8", + "robomind_franka_sim_franka_s8_a8", + "robomind_franka_sim_simulation_s8_a8", + "robomind_franka_sim_simulation_no_front_s8_a8", + "robomind_franka_sim_none_s8_a8", + "robomind_tienkung_gello_s16_a16", + "robomind_tienkung_prod1_gello_s16_a16", + "robomind_tienkung_xsens_s14_a14", + "robomind_tienkung_sim_s38_a38", + "robomind_tienkung_real_s38_a38", + "robomind_ur5e_s7_a7", +} + + +def test_registry_covers_all_documented_builders() -> None: + assert set(action_space.UNIFIED_ACTION_SPECS) == EXPECTED_DATASET_IDS + assert len(EXPECTED_DATASET_IDS) == 43 + + +@pytest.mark.parametrize("dataset_id", sorted(EXPECTED_DATASET_IDS)) +def test_masks_are_80d_and_temporal_slots_are_mapped(dataset_id: str) -> None: + spec = action_space.UNIFIED_ACTION_SPECS[dataset_id] + assert len(spec.action_mask) == action_space.UNIFIED_ACTION_DIM + assert len(spec.delta_mask) == action_space.UNIFIED_ACTION_DIM + assert sum(spec.action_mask) == len(spec.action_mapping) + assert set(spec.absolute_to_delta_slots) <= set(spec.action_target_slots) + assert set(spec.absolute_to_delta_slots) <= set(spec.state_target_slots) + assert not spec.already_delta_slots + + +def test_only_egoverse_maps_eef_slots() -> None: + eef_slots = set(range(action_space.LEFT_EEF_POSITION, action_space.LEFT_EEF_EULER + 3)) + eef_slots |= set(range(action_space.RIGHT_EEF_POSITION, action_space.RIGHT_EEF_EULER + 3)) + users = { + dataset_id + for dataset_id, spec in action_space.UNIFIED_ACTION_SPECS.items() + if set(spec.action_target_slots) & eef_slots + } + assert users == { + "egoverse_aria", + "egoverse_eva", + "egoverse_human", + "egoverse_mecka", + "egoverse_scale", + } + + +def test_robocoin_mixed_eef_sources_are_dropped() -> None: + expected_dropped = { + "robocoin_agilex_cobot_magic_s26_a26": set(range(7, 13)) | set(range(20, 26)), + "robocoin_realman_rmc_aida_l_s28_a28": set(range(8, 14)) | set(range(22, 28)), + "robocoin_agilex_decoupled_magic_s26_a26": set(range(7, 13)) | set(range(20, 26)), + "robocoin_aloha_s26_a26": set(range(6, 12)) | set(range(19, 25)), + "robocoin_alpha_bot_2_s28_a28": set(range(7, 13)) | set(range(20, 26)), + "robocoin_realman_rmc_aidal_s28_a28": set(range(8, 14)) | set(range(22, 28)), + "robocoin_ruantong_a2d_s41_a34": set(range(14, 28)), + } + for dataset_id, dropped in expected_dropped.items(): + mapped_sources = {source for source, _ in action_space.UNIFIED_ACTION_SPECS[dataset_id].action_mapping} + assert mapped_sources.isdisjoint(dropped) + + +def test_yinhe_state_reorder_is_explicit() -> None: + spec = action_space.UNIFIED_ACTION_SPECS["robocoin_yinhe_s49_a16"] + assert tuple(source for source, _ in spec.state_mapping) == tuple(range(5, 21)) + assert tuple(source for source, _ in spec.action_mapping) == tuple(range(16)) + + +def test_invalid_temporal_spec_is_rejected() -> None: + with pytest.raises(ValueError, match="without mapped state"): + action_space.UnifiedActionSpec( + state_mapping=action_space.dims(0, action_space.LEFT_ARM, 1), + action_mapping=action_space.dims(0, action_space.RIGHT_ARM, 1), + absolute_to_delta_slots=(action_space.RIGHT_ARM,), + ) From 59e4550004f3fab923bd876829fea0bc2e234518 Mon Sep 17 00:00:00 2001 From: root <835297796@qq.com> Date: Wed, 15 Jul 2026 16:04:25 +0800 Subject: [PATCH 04/64] Map cotrain RLDS data into unified 80D space --- ...00\345\217\221\346\227\245\345\277\227.md" | 30 ++++++++ .../compute_agibot_full_norm_stats_light.py | 7 +- .../compute_cotrain_full_norm_stats_light.py | 44 +++++++---- scripts/compute_cotrain_norm_stats_light.py | 60 +++++++++++---- src/openpi/cotrain/action_space.py | 77 +++++++++++++++++++ src/openpi/cotrain/config.py | 65 ++++++++++------ src/openpi/cotrain/rlds_dataset.py | 23 ++++-- src/openpi/cotrain/transforms.py | 5 +- tests/cotrain/test_action_space.py | 52 +++++++++++++ 9 files changed, 296 insertions(+), 67 deletions(-) diff --git "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" index c20fcf8..5779abb 100644 --- "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" +++ "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" @@ -39,3 +39,33 @@ EgoVerse 使用 EEF 槽、7 个 RoboCOIN EEF 源区间全部丢弃、Yinhe state reorder。 - 环境备注:系统 Python 未安装完整项目依赖;后续 RLDS/TensorFlow 验证使用 `/mnt/workspace/xule/pi07_reproduction/.venv/bin/python` 并指向新仓库 `PYTHONPATH`。 + +## 阶段二:RLDS loader、delta 与归一化 + +### 实现 + +- `CotrainRLDSDataset` 新增可选 `unified_action_spec`;只有 full-all 混合配置启用,旧单数据集配置 + 继续使用 native-prefix padding。 +- loader 在 restructure 之后、chunk/mix/batch 之前 scatter state/action 到 80D,并生成 + 样本级 `action_mask[80]`。 +- `StandardizedInputs` 保留 `action_mask`,使其后续可进入 JAX batch。 +- delta 转换改为使用映射 spec 自动生成的 80D `delta_mask`;只对 + `absolute_to_delta_slots` 做一次 `action-state`。 +- `cotrain_full_all` 和 `cotrain_full_all_full_norm` 的 model action width 改为 80。 +- lightweight/full/AgiBot norm-stats 入口共用同一映射和 delta 实现。 +- 每数据集统计为完整 80D;无效槽强制 `mean=0, std=1, q01=-1, q99=1`。 +- norm stats 目录写入 mapping fingerprint;训练加载时校验 fingerprint 和 80D shape,防止静默 + 复用旧 64D/native stats。 + +### 验证 + +- `PYTHONPATH=src python3 -m pytest tests/cotrain/test_action_space.py -q`:`52 passed`。 +- TensorFlow 轨迹映射测试已实际执行(未 skip);验证 state/action scatter、未使用槽补零和 + `[T,80]` action mask 广播。 +- 纯 NumPy 全注册表验证:43/43 spec 均能完成 state/action 80D 映射,非 mask 槽全为零。 +- delta 单元测试:Piper arm 槽精确得到 `target-current=3`,gripper/未映射槽保持不变。 +- stale metadata 测试:将 width 从 80 改成 64 后加载立即报 mapping mismatch。 +- `py_compile` 通过:config、RLDS loader、transforms 及三个 norm-stats 入口均无语法错误。 +- 完整 config 动态 import 在当前交互容器受依赖环境限制:系统 Python 缺 `jax/tyro/dlimp`, + 旧 venv 同时初始化 JAX/TensorFlow CUDA 后进程被容器终止且无 traceback。真实 TFDS 的逐 builder + 验证安排在阶段四的轻量审计器中,避免同时加载 JAX。 diff --git a/scripts/compute_agibot_full_norm_stats_light.py b/scripts/compute_agibot_full_norm_stats_light.py index e909204..92c78d4 100644 --- a/scripts/compute_agibot_full_norm_stats_light.py +++ b/scripts/compute_agibot_full_norm_stats_light.py @@ -8,12 +8,11 @@ import dataclasses import json import time -from pathlib import Path +import compute_cotrain_norm_stats_light as light import tqdm import tyro -import compute_cotrain_norm_stats_light as light import openpi.cotrain.config as cotrain_config import openpi.shared.normalize as normalize @@ -79,8 +78,10 @@ def main( raise RuntimeError(f"No frames read for dataset '{dataset_cfg.uid}'.") elapsed_sec = time.time() - start_time - norm_stats = light._finalize_stats(stats) + norm_stats = light._finalize_stats(stats, dataset_cfg) normalize.save(out_dir, norm_stats) + if dataset_cfg.unified_action_spec is not None: + light.cotrain_action_space.write_metadata(out_dir, dataset_cfg.unified_action_spec) meta = { "config_name": config_name, diff --git a/scripts/compute_cotrain_full_norm_stats_light.py b/scripts/compute_cotrain_full_norm_stats_light.py index 5f1a603..536f3c5 100644 --- a/scripts/compute_cotrain_full_norm_stats_light.py +++ b/scripts/compute_cotrain_full_norm_stats_light.py @@ -8,13 +8,13 @@ import dataclasses import json -import time from pathlib import Path +import time +import compute_cotrain_norm_stats_light as light import tqdm import tyro -import compute_cotrain_norm_stats_light as light import openpi.cotrain.config as cotrain_config import openpi.shared.normalize as normalize @@ -67,16 +67,24 @@ def _load_agibot_bytes_per_frame(copy_from_assets_name: str | None) -> float | N if src_dir is None: return None meta = json.loads((src_dir / "norm_stats_meta.json").read_text()) - _, num_bytes = _train_split_info(type("DatasetCfg", (), { - "builder_dir": meta["builder_dir"], - "resolve_split": lambda self, split: "train", - })()) + _, num_bytes = _train_split_info( + type( + "DatasetCfg", + (), + { + "builder_dir": meta["builder_dir"], + "resolve_split": lambda self, split: "train", + }, + )() + ) if not num_bytes or not meta.get("num_frames"): return None return num_bytes / meta["num_frames"] -def _estimated_batches(dataset_cfg, batch_size: int, bytes_per_frame: float | None) -> tuple[int | None, int | None, int | None]: +def _estimated_batches( + dataset_cfg, batch_size: int, bytes_per_frame: float | None +) -> tuple[int | None, int | None, int | None]: num_episodes, num_bytes = _train_split_info(dataset_cfg) if num_bytes is None or bytes_per_frame is None or bytes_per_frame <= 0: return num_episodes, num_bytes, None @@ -85,11 +93,11 @@ def _estimated_batches(dataset_cfg, batch_size: int, bytes_per_frame: float | No def main( - config_name: str = "cotrain_full_all", - output_assets_dir: str = "/mnt/data/xule/pi07_reproduction/assets/cotrain_full_all_full_norm", + config_name: str = "cotrain_full_all_full_norm", + output_assets_dir: str = "/mnt/workspace/wudi/Atom-0/assets/cotrain_full_all_full_norm", dataset_id: str | None = None, skip_dataset_ids: str = "", - copy_from_assets_name: str | None = "cotrain_full_all_agibot_full_norm_probe", + copy_from_assets_name: str | None = None, rlds_data_dir: str | None = None, overwrite: bool = False, num_parallel_reads: int = 1, @@ -102,11 +110,7 @@ def main( requested = _split_csv(dataset_id) skipped = _split_csv(skip_dataset_ids) - datasets = [ - ds - for ds in data_config.datasets - if (not requested or ds.uid in requested) and ds.uid not in skipped - ] + datasets = [ds for ds in data_config.datasets if (not requested or ds.uid in requested) and ds.uid not in skipped] if not datasets: raise ValueError("No datasets selected.") @@ -129,7 +133,11 @@ def main( for dataset_cfg in datasets: out_dir = output_root / dataset_cfg.uid - if copy_from_assets_name is not None and dataset_cfg.uid == "agibot": + if ( + copy_from_assets_name is not None + and dataset_cfg.uid == "agibot" + and dataset_cfg.unified_action_spec is None + ): if overwrite and _copy_existing_stats(copy_from_assets_name, output_root, dataset_cfg.uid): print(f"\n=== Copied full AgiBot stats from assets/{copy_from_assets_name} to {out_dir} ===") continue @@ -197,8 +205,10 @@ def main( raise RuntimeError(f"No frames read for dataset '{dataset_cfg.uid}'.") elapsed_sec = time.time() - start_time - norm_stats = light._finalize_stats(stats) + norm_stats = light._finalize_stats(stats, dataset_cfg) normalize.save(out_dir, norm_stats) + if dataset_cfg.unified_action_spec is not None: + light.cotrain_action_space.write_metadata(out_dir, dataset_cfg.unified_action_spec) meta = { "config_name": config_name, diff --git a/scripts/compute_cotrain_norm_stats_light.py b/scripts/compute_cotrain_norm_stats_light.py index 2e3a05c..3e2c08d 100644 --- a/scripts/compute_cotrain_norm_stats_light.py +++ b/scripts/compute_cotrain_norm_stats_light.py @@ -11,20 +11,21 @@ """ import dataclasses -import json from itertools import islice +import json from pathlib import Path import numpy as np import tqdm import tyro +from openpi.cotrain import action_space as cotrain_action_space import openpi.cotrain.config as cotrain_config import openpi.cotrain.rlds_dataset as cotrain_rlds_dataset import openpi.shared.download as download import openpi.shared.normalize as normalize -import openpi.transforms as _transforms from openpi.training.data_loader import IterableTransformedDataset +import openpi.transforms as _transforms def _light_restructure(traj, dataset_id: str, restructure_name: str): @@ -139,7 +140,12 @@ def select_state_actions(traj): lambda traj: _light_restructure(traj, dataset_cfg.uid, dataset_cfg.restructure_name), num_parallel_calls, ) - if dataset_cfg.state_indices is not None or dataset_cfg.action_indices is not None: + if dataset_cfg.unified_action_spec is not None: + dataset = dataset.traj_map( + lambda traj: cotrain_action_space.map_trajectory_tensorflow(traj, dataset_cfg.unified_action_spec), + num_parallel_calls, + ) + elif dataset_cfg.state_indices is not None or dataset_cfg.action_indices is not None: dataset = dataset.traj_map(select_state_actions, num_parallel_calls) dataset = dataset.traj_map(chunk_actions, num_parallel_calls) dataset = dataset.flatten(num_parallel_calls=num_parallel_calls) @@ -191,10 +197,11 @@ def _state_actions_from_light_batch(batch: dict, dataset_cfg: cotrain_rlds_datas state = state[:, -1] if state.ndim == 3 else state actions = np.array(batch["actions"]) - if dataset_cfg.delta_action_mask_dims is not None: + if dataset_cfg.unified_action_spec is not None: + actions = cotrain_action_space.apply_delta(state, actions, dataset_cfg.unified_action_spec.delta_mask) + elif dataset_cfg.delta_action_mask_dims is not None: mask = np.asarray(_transforms.make_bool_mask(*dataset_cfg.delta_action_mask_dims)) - dims = mask.shape[-1] - actions[..., :dims] -= np.expand_dims(np.where(mask, state[..., :dims], 0), axis=-2) + actions = cotrain_action_space.apply_delta(state, actions, mask) return state, actions @@ -207,8 +214,32 @@ def _update_stats(stats: dict, state: np.ndarray, actions: np.ndarray): stats["actions"].update(actions.reshape(-1, actions.shape[-1])) -def _finalize_stats(stats: dict): - return {key: value.get_statistics() for key, value in stats.items()} +def _neutralize_inactive_stats(stats, mask: tuple[bool, ...]): + mask = np.asarray(mask, dtype=bool) + mean = np.asarray(stats.mean).copy() + std = np.asarray(stats.std).copy() + q01 = None if stats.q01 is None else np.asarray(stats.q01).copy() + q99 = None if stats.q99 is None else np.asarray(stats.q99).copy() + mean[~mask] = 0 + std[~mask] = 1 + if q01 is not None: + q01[~mask] = -1 + if q99 is not None: + q99[~mask] = 1 + return normalize.NormStats(mean=mean, std=std, q01=q01, q99=q99) + + +def _finalize_stats(stats: dict, dataset_cfg): + finalized = {key: value.get_statistics() for key, value in stats.items()} + spec = dataset_cfg.unified_action_spec + if spec is None: + return finalized + state_targets = set(spec.state_target_slots) + state_mask = tuple(index in state_targets for index in range(cotrain_action_space.UNIFIED_ACTION_DIM)) + return { + "state": _neutralize_inactive_stats(finalized["state"], state_mask), + "actions": _neutralize_inactive_stats(finalized["actions"], spec.action_mask), + } def _compute_light_stats(config, data_config, dataset_cfg, max_frames: int, *, show_progress: bool = True): @@ -225,7 +256,7 @@ def _compute_light_stats(config, data_config, dataset_cfg, max_frames: int, *, s state, actions = _state_actions_from_light_batch(batch, dataset_cfg) _update_stats(stats, state, actions) n_frames += int(state.shape[0]) - return _finalize_stats(stats), n_frames + return _finalize_stats(stats, dataset_cfg), n_frames def _compute_light_stats_deterministic(config, data_config, dataset_cfg, max_frames: int): @@ -250,7 +281,7 @@ def _compute_light_stats_deterministic(config, data_config, dataset_cfg, max_fra state, actions = _state_actions_from_light_batch(batch, dataset_cfg) _update_stats(stats, state, actions) n_frames += int(state.shape[0]) - return _finalize_stats(stats), n_frames + return _finalize_stats(stats, dataset_cfg), n_frames def _compute_old_stats(config, data_config, dataset_cfg, max_frames: int): @@ -281,7 +312,7 @@ def _compute_old_stats(config, data_config, dataset_cfg, max_frames: int): actions = np.asarray(batch["actions"]) _update_stats(stats, state, actions) n_frames += int(state.shape[0]) - return _finalize_stats(stats), n_frames + return _finalize_stats(stats, dataset_cfg), n_frames def _max_abs_diff(a, b) -> float: @@ -306,10 +337,7 @@ def _verify_against_old(config, data_config, dataset_cfg, verify_frames: int, to print(f" max_abs_diff[{key}.{field}] = {diff:.8g}") ok = ok and diff <= tolerance if not ok: - raise RuntimeError( - f"Lightweight stats verification failed for '{dataset_cfg.uid}' " - f"(tolerance={tolerance})." - ) + raise RuntimeError(f"Lightweight stats verification failed for '{dataset_cfg.uid}' (tolerance={tolerance}).") print(" verification passed") @@ -355,6 +383,8 @@ def main( raise RuntimeError(f"No frames read for dataset '{ds.uid}' (split '{ds.train_split}').") print(f" accumulated {n_frames} frames") normalize.save(out_dir, norm_stats) + if ds.unified_action_spec is not None: + cotrain_action_space.write_metadata(out_dir, ds.unified_action_spec) print(f"Saved norm stats for '{ds.uid}' to {out_dir}") diff --git a/src/openpi/cotrain/action_space.py b/src/openpi/cotrain/action_space.py index fb1d9f2..b79ab4d 100644 --- a/src/openpi/cotrain/action_space.py +++ b/src/openpi/cotrain/action_space.py @@ -3,6 +3,11 @@ from __future__ import annotations import dataclasses +import hashlib +import json +from pathlib import Path + +import numpy as np UNIFIED_ACTION_DIM = 80 @@ -107,6 +112,78 @@ def validate_source_dims(self, state_dim: int, action_dim: int) -> None: if self.action_mapping and max(source for source, _ in self.action_mapping) >= action_dim: raise ValueError(f"action mapping requires source dim beyond action width {action_dim}") + @property + def fingerprint(self) -> str: + payload = dataclasses.asdict(self) + encoded = json.dumps(payload, sort_keys=True, separators=(",", ":")).encode() + return hashlib.sha256(encoded).hexdigest() + + +def map_array(array: np.ndarray, mapping: DimMapping) -> np.ndarray: + """Scatter the final axis of a NumPy array into the unified 80D layout.""" + array = np.asarray(array) + output = np.zeros((*array.shape[:-1], UNIFIED_ACTION_DIM), dtype=array.dtype) + if mapping: + sources, targets = zip(*mapping, strict=True) + output[..., targets] = array[..., sources] + return output + + +def apply_delta(state: np.ndarray, actions: np.ndarray, mask) -> np.ndarray: + """Convert only masked source-absolute slots to deltas against current state.""" + state = np.asarray(state) + output = np.array(actions, copy=True) + mask = np.asarray(mask, dtype=bool) + dims = mask.shape[-1] + output[..., :dims] -= np.expand_dims(np.where(mask, state[..., :dims], 0), axis=-2) + return output + + +def map_trajectory_tensorflow(traj: dict, spec: UnifiedActionSpec) -> dict: + """Map trajectory-level TensorFlow state/actions and attach the action mask.""" + import tensorflow as tf # noqa: PLC0415 + + def map_tensor(tensor, mapping: DimMapping): + if not mapping: + return tf.zeros([tf.shape(tensor)[0], UNIFIED_ACTION_DIM], tensor.dtype) + sources, targets = zip(*mapping, strict=True) + tf.debugging.assert_less(max(sources), tf.shape(tensor)[-1]) + selected = tf.gather(tensor, tf.constant(sources, tf.int32), axis=-1) + projection = tf.one_hot(targets, UNIFIED_ACTION_DIM, dtype=tensor.dtype) + mapped = tf.linalg.matmul(selected, projection) + mapped.set_shape([None, UNIFIED_ACTION_DIM]) + return mapped + + traj["state"] = map_tensor(traj["state"], spec.state_mapping) + traj["actions"] = map_tensor(traj["actions"], spec.action_mapping) + traj["action_mask"] = tf.broadcast_to( + tf.constant(spec.action_mask, tf.bool), + [tf.shape(traj["actions"])[0], UNIFIED_ACTION_DIM], + ) + return traj + + +def write_metadata(directory: str | Path, spec: UnifiedActionSpec) -> None: + directory = Path(directory) + directory.mkdir(parents=True, exist_ok=True) + (directory / "unified_action_space.json").write_text( + json.dumps( + {"version": 1, "width": UNIFIED_ACTION_DIM, "fingerprint": spec.fingerprint}, + indent=2, + ) + + "\n" + ) + + +def validate_metadata(directory: str | Path, spec: UnifiedActionSpec) -> None: + path = Path(directory) / "unified_action_space.json" + if not path.exists(): + raise ValueError(f"Unified norm stats are missing mapping metadata: {path}") + metadata = json.loads(path.read_text()) + expected = {"version": 1, "width": UNIFIED_ACTION_DIM, "fingerprint": spec.fingerprint} + if metadata != expected: + raise ValueError(f"Unified norm stats mapping mismatch at {path}: expected {expected}, got {metadata}") + def _same(mapping: DimMapping, *, delta: tuple[int, ...] = ()) -> UnifiedActionSpec: return UnifiedActionSpec(mapping, mapping, absolute_to_delta_slots=delta) diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 8915803..959e94d 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -14,6 +14,10 @@ from typing_extensions import override import tyro +from openpi.cotrain import action_space as cotrain_action_space +from openpi.cotrain.rlds_dataset import CotrainRLDSDataset +import openpi.cotrain.transforms as cotrain_transforms +import openpi.cotrain.weight_loaders as cotrain_weight_loaders import openpi.models.model as _model import openpi.models.pi0_config as pi0_config import openpi.shared.download as _download @@ -24,10 +28,6 @@ import openpi.training.weight_loaders as weight_loaders import openpi.transforms as _transforms -import openpi.cotrain.transforms as cotrain_transforms -import openpi.cotrain.weight_loaders as cotrain_weight_loaders -from openpi.cotrain.rlds_dataset import CotrainRLDSDataset - logger = logging.getLogger(__name__) @@ -40,7 +40,17 @@ def load_per_dataset_norm_stats(assets_dirs: pathlib.Path, datasets) -> dict: for ds in datasets: try: d = str(pathlib.Path(assets_dirs) / ds.uid) - stats[ds.uid] = _normalize.load(_download.maybe_download(d)) + resolved = pathlib.Path(_download.maybe_download(d)) + loaded = _normalize.load(resolved) + if ds.unified_action_spec is not None: + cotrain_action_space.validate_metadata(resolved, ds.unified_action_spec) + for key in ("state", "actions"): + if key not in loaded or len(loaded[key].mean) != cotrain_action_space.UNIFIED_ACTION_DIM: + raise ValueError( + f"Unified norm stats for '{ds.uid}' key '{key}' must be " + f"{cotrain_action_space.UNIFIED_ACTION_DIM}D." + ) + stats[ds.uid] = loaded logger.info(f"Loaded per-dataset norm stats for '{ds.uid}' from {d}") except FileNotFoundError: logger.warning(f"Norm stats for dataset '{ds.uid}' not found under {assets_dirs}; skipping (no norm).") @@ -71,11 +81,12 @@ def create(self, assets_dirs: pathlib.Path, model_config: _model.BaseModelConfig base = self.create_base_config(assets_dirs, model_config) # Per-dataset absolute->delta action conversion (e.g. RoboMIND absolute joint). - delta_masks = { - ds.uid: _transforms.make_bool_mask(*ds.delta_action_mask_dims) - for ds in self.datasets - if ds.delta_action_mask_dims is not None - } + delta_masks = {} + for ds in self.datasets: + if ds.unified_action_spec is not None: + delta_masks[ds.uid] = ds.unified_action_spec.delta_mask + elif ds.delta_action_mask_dims is not None: + delta_masks[ds.uid] = _transforms.make_bool_mask(*ds.delta_action_mask_dims) dispatch_delta = cotrain_transforms.DispatchDeltaActions(masks_by_dataset=delta_masks) # Per-dataset normalization (dispatched at runtime by dataset_id). Quantile norm for @@ -163,8 +174,7 @@ class CotrainTrainConfig(_config.TrainConfig): # (do NOT widen to 40; that was only needed for RoboCOIN in the old multi-dataset mix). _PIPER30_ROOT = ( - "/mnt/data/RLDS/realworld_piper/" - "piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist" + "/mnt/data/RLDS/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist" ) _PIPER30_BUILDER_DIR = f"{_PIPER30_ROOT}/realworld_piper_infidata/1.0.0" _PIPER30_TRAIN_EPISODES = 5_307 @@ -712,16 +722,25 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): return tuple(dataclasses.replace(ds, weight=ds.weight / total_weight) for ds in kept) +def _attach_unified_action_specs(datasets: tuple[CotrainRLDSDataset, ...]): + return tuple( + dataclasses.replace(ds, unified_action_spec=cotrain_action_space.UNIFIED_ACTION_SPECS[ds.uid]) + for ds in datasets + ) + + _FULL_ALL_DATA = CotrainDataConfig( rlds_data_dir="/mnt/data/RLDS", - datasets=_drop_excluded_and_renormalize( - ( - *_scale_dataset_weights(_AGIBOT_DATA.datasets, _AGIBOT_TRAIN_EPISODES), - *_scale_dataset_weights(_DROID_DATA.datasets, _DROID_TRAIN_EPISODES), - *_scale_dataset_weights(_EGOVERSE_FULL_DATA.datasets, _EGOVERSE_FULL_TRAIN_EPISODES), - *_scale_dataset_weights(_PIPER30_DATA.datasets, _PIPER30_TRAIN_EPISODES), - *_scale_dataset_weights(_ROBOCOIN_DATA.datasets, _ROBOCOIN_TRAIN_EPISODES), - *_scale_dataset_weights(_ROBOMIND_FULL_DATA.datasets, _ROBOMIND_FULL_EPISODES), + datasets=_attach_unified_action_specs( + _drop_excluded_and_renormalize( + ( + *_scale_dataset_weights(_AGIBOT_DATA.datasets, _AGIBOT_TRAIN_EPISODES), + *_scale_dataset_weights(_DROID_DATA.datasets, _DROID_TRAIN_EPISODES), + *_scale_dataset_weights(_EGOVERSE_FULL_DATA.datasets, _EGOVERSE_FULL_TRAIN_EPISODES), + *_scale_dataset_weights(_PIPER30_DATA.datasets, _PIPER30_TRAIN_EPISODES), + *_scale_dataset_weights(_ROBOCOIN_DATA.datasets, _ROBOCOIN_TRAIN_EPISODES), + *_scale_dataset_weights(_ROBOMIND_FULL_DATA.datasets, _ROBOMIND_FULL_EPISODES), + ) ) ), ) @@ -833,12 +852,10 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): _FULL_ALL_PI05 = CotrainTrainConfig( name="cotrain_full_all", - # Full co-training includes RoboCOIN (54 effective dims) and RoboMIND_full (38 dims), so - # all native state/action vectors are padded to a shared 64-wide model head. - model=pi0_config.Pi0Config(pi05=True, action_dim=64, max_token_len=384), + model=pi0_config.Pi0Config(pi05=True, action_dim=cotrain_action_space.UNIFIED_ACTION_DIM, max_token_len=384), data=_FULL_ALL_DATA, # Initialize from pi05_base for consistency with the piper30-only reproduction. The widened - # 64-dim state/action projection/head is not shape-compatible with pi05_base's 32-dim head, + # 80D action projection/head is not shape-compatible with pi05_base's 32D head, # so the shape-safe loader skips only those mismatched keys and keeps their random init. weight_loader=cotrain_weight_loaders.ShapeSafeCheckpointWeightLoader( params_path="gs://openpi-assets/checkpoints/pi05_base/params", diff --git a/src/openpi/cotrain/rlds_dataset.py b/src/openpi/cotrain/rlds_dataset.py index 7016b19..80619de 100644 --- a/src/openpi/cotrain/rlds_dataset.py +++ b/src/openpi/cotrain/rlds_dataset.py @@ -20,10 +20,10 @@ import json import logging from pathlib import Path -from typing import Literal import tqdm +from openpi.cotrain import action_space as cotrain_action_space import openpi.shared.download as download # Reuse the action-space enum unchanged from the original DROID loader. @@ -73,6 +73,9 @@ class CotrainRLDSDataset: # state) for absolute-action datasets. None -> keep absolute. E.g. RoboMIND (dual ALOHA, # absolute joint): (6, -1, 6, -1) = 6 joints delta + gripper absolute, per arm. delta_action_mask_dims: tuple[int, ...] | None = None + # Optional source-to-80D mapping. When present, the loader scatters state/action into + # fixed unified slots instead of selecting native dims and padding them as a prefix. + unified_action_spec: cotrain_action_space.UnifiedActionSpec | None = None # Full path to the TFDS *version* directory (the dir containing dataset_info.json / # features.json, e.g. ".../egoverse_infidata/1.0.0"). When set, the loader uses # tfds.builder_from_directory(builder_dir) directly -- this sidesteps the single global @@ -615,9 +618,7 @@ def _select_state_actions(traj, dataset_cfg: CotrainRLDSDataset): if dataset_cfg.state_indices is not None: traj["state"] = tf.gather(traj["state"], tf.constant(dataset_cfg.state_indices, tf.int32), axis=-1) if dataset_cfg.action_indices is not None: - traj["actions"] = tf.gather( - traj["actions"], tf.constant(dataset_cfg.action_indices, tf.int32), axis=-1 - ) + traj["actions"] = tf.gather(traj["actions"], tf.constant(dataset_cfg.action_indices, tf.int32), axis=-1) return traj def decode_std_images(frame): @@ -646,14 +647,22 @@ def _prepare_standardized(dataset, dataset_cfg: CotrainRLDSDataset): lambda traj: restructure_fn(traj, dataset_cfg.uid, dataset_cfg.camera_keys), num_parallel_calls ) else: + dataset = dataset.traj_map(lambda traj: restructure_fn(traj, dataset_cfg.uid), num_parallel_calls) + if dataset_cfg.unified_action_spec is not None: + if pad_action_dim is not None and pad_action_dim != cotrain_action_space.UNIFIED_ACTION_DIM: + raise ValueError( + f"Unified dataset '{dataset_cfg.uid}' requires model action_dim=" + f"{cotrain_action_space.UNIFIED_ACTION_DIM}, got {pad_action_dim}." + ) dataset = dataset.traj_map( - lambda traj: restructure_fn(traj, dataset_cfg.uid), num_parallel_calls + lambda traj: cotrain_action_space.map_trajectory_tensorflow(traj, dataset_cfg.unified_action_spec), + num_parallel_calls, ) - if dataset_cfg.state_indices is not None or dataset_cfg.action_indices is not None: + elif dataset_cfg.state_indices is not None or dataset_cfg.action_indices is not None: dataset = dataset.traj_map(lambda traj: _select_state_actions(traj, dataset_cfg), num_parallel_calls) # Pad native state/action to the model width BEFORE chunk/mix/batch (if requested), # so heterogeneous-dim datasets share one element spec. - if pad_action_dim is not None: + if pad_action_dim is not None and dataset_cfg.unified_action_spec is None: dataset = dataset.traj_map(_pad_state_actions, num_parallel_calls) dataset = dataset.traj_map(_chunk_actions, num_parallel_calls) return dataset.flatten(num_parallel_calls=num_parallel_calls) diff --git a/src/openpi/cotrain/transforms.py b/src/openpi/cotrain/transforms.py index 007221c..be4f9c2 100644 --- a/src/openpi/cotrain/transforms.py +++ b/src/openpi/cotrain/transforms.py @@ -21,6 +21,7 @@ import numpy as np from openpi import transforms as _transforms +from openpi.cotrain import action_space as cotrain_action_space from openpi.models import model as _model from openpi.shared import normalize as _normalize @@ -78,6 +79,8 @@ def __call__(self, data: dict) -> dict: if "actions" in data: # Writable COPY (not a read-only tf view): DeltaActions mutates actions in place. inputs["actions"] = np.array(data["actions"]) + if "action_mask" in data: + inputs["action_mask"] = np.asarray(data["action_mask"], dtype=bool) if "prompt" in data: inputs["prompt"] = _decode_str(data["prompt"]) if "prompt_prefix" in data: @@ -118,7 +121,7 @@ def __call__(self, data: dict) -> dict: if ds is not None and "actions" in data: mask = self.masks_by_dataset.get(_decode_str(ds)) if mask is not None: - data = _transforms.DeltaActions(mask)(data) + data["actions"] = cotrain_action_space.apply_delta(data["state"], data["actions"], mask) return data diff --git a/tests/cotrain/test_action_space.py b/tests/cotrain/test_action_space.py index 61f2bff..f694927 100644 --- a/tests/cotrain/test_action_space.py +++ b/tests/cotrain/test_action_space.py @@ -1,5 +1,8 @@ from __future__ import annotations +import json + +import numpy as np import pytest from openpi.cotrain import action_space @@ -112,3 +115,52 @@ def test_invalid_temporal_spec_is_rejected() -> None: action_mapping=action_space.dims(0, action_space.RIGHT_ARM, 1), absolute_to_delta_slots=(action_space.RIGHT_ARM,), ) + + +def test_map_array_scatters_and_zero_fills() -> None: + spec = action_space.UNIFIED_ACTION_SPECS["piper30"] + source = np.arange(14, dtype=np.float32) + mapped = action_space.map_array(source, spec.action_mapping) + assert mapped.shape == (action_space.UNIFIED_ACTION_DIM,) + np.testing.assert_array_equal(mapped[:6], source[:6]) + assert mapped[action_space.LEFT_GRIPPER] == source[6] + np.testing.assert_array_equal(mapped[action_space.RIGHT_ARM : action_space.RIGHT_ARM + 6], source[7:13]) + assert mapped[action_space.RIGHT_GRIPPER] == source[13] + mask = np.asarray(spec.action_mask) + assert np.count_nonzero(mapped[mask]) == 13 # source a1 is intentionally zero + assert np.all(mapped[~mask] == 0) + + +def test_mapping_metadata_rejects_stale_stats(tmp_path) -> None: + spec = action_space.UNIFIED_ACTION_SPECS["droid"] + action_space.write_metadata(tmp_path, spec) + action_space.validate_metadata(tmp_path, spec) + + path = tmp_path / "unified_action_space.json" + metadata = json.loads(path.read_text()) + metadata["width"] = 64 + path.write_text(json.dumps(metadata)) + with pytest.raises(ValueError, match="mapping mismatch"): + action_space.validate_metadata(tmp_path, spec) + + +def test_tensorflow_trajectory_mapping() -> None: + tf = pytest.importorskip("tensorflow") + spec = action_space.UNIFIED_ACTION_SPECS["egoverse_eva"] + source = np.arange(24, dtype=np.float32).reshape(2, 12) + mapped = action_space.map_trajectory_tensorflow( + {"state": tf.constant(source), "actions": tf.constant(source + 100)}, spec + ) + np.testing.assert_array_equal(mapped["state"].numpy(), action_space.map_array(source, spec.state_mapping)) + np.testing.assert_array_equal(mapped["actions"].numpy(), action_space.map_array(source + 100, spec.action_mapping)) + np.testing.assert_array_equal(mapped["action_mask"].numpy(), np.broadcast_to(spec.action_mask, (2, 80))) + + +def test_delta_is_applied_once_only_to_declared_slots() -> None: + spec = action_space.UNIFIED_ACTION_SPECS["piper30"] + state = np.arange(80, dtype=np.float32) + actions = np.broadcast_to(state + 3, (4, 80)).copy() + converted = action_space.apply_delta(state, actions, spec.delta_mask) + delta_mask = np.asarray(spec.delta_mask) + np.testing.assert_array_equal(converted[:, delta_mask], 3) + np.testing.assert_array_equal(converted[:, ~delta_mask], actions[:, ~delta_mask]) From 5aa44f33050a8a680a8cb20436995454e88e4ba8 Mon Sep 17 00:00:00 2001 From: root <835297796@qq.com> Date: Wed, 15 Jul 2026 16:16:39 +0800 Subject: [PATCH 05/64] Mask unified action training and evaluation --- ...00\345\217\221\346\227\245\345\277\227.md" | 28 +++++++++++ scripts/train_cotrain.py | 24 ++++----- src/openpi/cotrain/action_space.py | 38 ++++++++++++++ src/openpi/cotrain/config.py | 5 +- src/openpi/cotrain/data_loader.py | 25 ++++++---- src/openpi/cotrain/eval.py | 39 ++++++++------- src/openpi/cotrain/rlds_dataset.py | 11 ++-- src/openpi/cotrain/transforms.py | 18 ++++--- src/openpi/cotrain/weight_loaders.py | 2 +- src/openpi/models/model.py | 5 ++ src/openpi/models/pi0.py | 32 +++++++++--- src/openpi/models/pi0_action_mask_test.py | 50 +++++++++++++++++++ tests/cotrain/test_action_space.py | 17 +++++++ 13 files changed, 230 insertions(+), 64 deletions(-) create mode 100644 src/openpi/models/pi0_action_mask_test.py diff --git "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" index 5779abb..2ad8840 100644 --- "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" +++ "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" @@ -69,3 +69,31 @@ - 完整 config 动态 import 在当前交互容器受依赖环境限制:系统 Python 缺 `jax/tyro/dlimp`, 旧 venv 同时初始化 JAX/TensorFlow CUDA 后进程被容器终止且无 traceback。真实 TFDS 的逐 builder 验证安排在阶段四的轻量审计器中,避免同时加载 JAX。 + +## 阶段三:masked loss、采样与评估 + +### 实现 + +- `Observation` 新增可选 `action_mask[B,80]`,`from_dict` 和图像预处理均完整保留;缺省为 `None`, + 因而非统一空间的旧训练保持“全部维度有效”。 +- flow matching 在构造 `x_t/u_t` 前将无效 action/noise 槽清零;平方误差仅在有效槽求和,并按每样本 + 有效槽数归一化。 +- ODE 采样的初始 noise 和每次更新后结果都重新应用 mask,避免无效槽通过后续 action token 反馈到 + 有效槽;最终无效槽严格为 0。 +- action MSE 改用 batch 内的样本级 mask;旧数据无 mask 时使用配置生成的 prefix fallback mask。 +- 轨迹图只画有效的非连续统一槽,并显示 `Uxx + 物理语义`,不再把有效维假设为前 D 维。 +- 增加 80D 到 native source index 的逆映射;设计中主动丢弃的 RoboCOIN EEF 源槽保持为 0。 +- unified 80D 配置与 KI FAST-token 辅助监督同时启用时立即报错,避免一个没有逐维 mask 的辅助目标 + 被误认为已经支持。 + +### 验证 + +- `pi0_action_mask_test.py`:`5 passed`。覆盖 horizon 广播、无 mask 全 1 兼容、错误宽度拒绝、修改 + masked GT 不改变 flow loss、两步 ODE 采样后 masked 槽严格为 0。 +- `test_action_space.py` 增加 native inverse mapping 和 80 个槽名测试;完整结果见阶段四回归。 +- 轨迹图首次脚本断言把 subplot 总数误当作有效槽数而失败:14 个槽按 4 列布局会创建 16 个 axes, + 末尾 2 个会关闭。修正为统计非空标题后通过,输出 `14 U1 left_arm_joint_1 U30 right_arm_joint_1`。 +- `py_compile`:model、loss/sample、config、eval、train entrypoint 全部通过。 +- Ruff 对本阶段文件执行 `E/F/I` 检查(忽略仓库既有 jaxtyping `F722/F821` 与既有长行):通过。 +- 模型测试使用旧仓库 venv、`JAX_PLATFORMS=cpu` 和新仓库 `PYTHONPATH=src`;仅出现上游 + JAX/Flax deprecation warnings,无功能失败。 diff --git a/scripts/train_cotrain.py b/scripts/train_cotrain.py index 96d21c1..37de6ac 100644 --- a/scripts/train_cotrain.py +++ b/scripts/train_cotrain.py @@ -32,6 +32,10 @@ import tqdm_loggable.auto as tqdm import wandb +import openpi.cotrain.action_space as cotrain_action_space +import openpi.cotrain.config as cotrain_config +import openpi.cotrain.data_loader as cotrain_data_loader +import openpi.cotrain.eval as cotrain_eval import openpi.models.model as _model import openpi.models.tokenizer as _tokenizer import openpi.shared.array_typing as at @@ -43,10 +47,6 @@ import openpi.training.utils as training_utils import openpi.training.weight_loaders as _weight_loaders -import openpi.cotrain.config as cotrain_config -import openpi.cotrain.data_loader as cotrain_data_loader -import openpi.cotrain.eval as cotrain_eval - def init_logging(): """Custom logging format for better readability.""" @@ -318,11 +318,8 @@ def main(config: cotrain_config.CotrainTrainConfig): # --- Validation loaders (one per dataset, split="val") ------------------------------ val_loaders = cotrain_data_loader.build_val_loaders(config, sharding=data_sharding) train_weights = cotrain_data_loader.dataset_train_weights(config) - action_dims = cotrain_data_loader.dataset_action_dims(config) - logging.info( - f"Initialized validation loaders by label: " - f"{ {label: list(d) for label, d in val_loaders.items()} }" - ) + action_masks = cotrain_data_loader.dataset_action_masks(config) + logging.info(f"Initialized validation loaders by label: { {label: list(d) for label, d in val_loaders.items()} }") # Sanity-check the language prompt of the first train batch. # NOTE: in multi-host the batch is a globally-sharded jax.Array, so np.array() @@ -379,14 +376,14 @@ def _current_frame(arr): mode=config.val_flow_loss_mode, use_ema=config.eval_on_ema, ) - # One action-MSE step per dataset (action_dim is per-dataset, label-independent). + # One action-MSE step per dataset (the mask is per-dataset, label-independent). val_action_mse_steps = { name: cotrain_eval.make_val_action_mse_step( num_denoise_steps=config.action_mse_num_denoise_steps, - valid_dims=action_dims.get(name), + fallback_mask=action_masks[name], use_ema=config.eval_on_ema, ) - for name in action_dims + for name in action_masks } # Shared predicted/gt action-chunk step for trajectory visualization. val_action_pred_step = cotrain_eval.make_val_action_pred_step( @@ -414,7 +411,8 @@ def _log_action_traj(step: int): fig = cotrain_eval.plot_action_trajectories( out["pred"], out["gt"], - valid_dims=action_dims.get(name), + action_mask=action_masks[name], + slot_names=cotrain_action_space.UNIFIED_SLOT_NAMES, n_samples=config.viz_num_samples, title=f"{name} [{label}] step {step}: pred (--) vs gt", ) diff --git a/src/openpi/cotrain/action_space.py b/src/openpi/cotrain/action_space.py index b79ab4d..e6cc85d 100644 --- a/src/openpi/cotrain/action_space.py +++ b/src/openpi/cotrain/action_space.py @@ -30,6 +30,34 @@ DimMapping = tuple[tuple[int, int], ...] +def _slot_names() -> tuple[str, ...]: + names = [f"reserved_{index + 1}" for index in range(UNIFIED_ACTION_DIM)] + groups = ( + (LEFT_ARM, 7, "left_arm_joint"), + (LEFT_EEF_POSITION, 3, "left_eef_position"), + (LEFT_EEF_EULER, 3, "left_eef_euler"), + (LEFT_GRIPPER, 1, "left_gripper"), + (LEFT_HAND, 12, "left_hand_joint"), + (RIGHT_ARM, 7, "right_arm_joint"), + (RIGHT_EEF_POSITION, 3, "right_eef_position"), + (RIGHT_EEF_EULER, 3, "right_eef_euler"), + (RIGHT_GRIPPER, 1, "right_gripper"), + (RIGHT_HAND, 12, "right_hand_joint"), + (LEFT_LEG, 6, "left_leg_joint"), + (RIGHT_LEG, 6, "right_leg_joint"), + (HEAD, 2, "head_joint"), + (WAIST, 2, "waist_joint"), + (OTHER_BODY, 6, "other_body"), + ) + for start, count, label in groups: + for offset in range(count): + names[start + offset] = label if count == 1 else f"{label}_{offset + 1}" + return tuple(names) + + +UNIFIED_SLOT_NAMES = _slot_names() + + def dims(source_start: int, target_start: int, count: int) -> DimMapping: """Map a contiguous source range to a contiguous unified range.""" return tuple((source_start + i, target_start + i) for i in range(count)) @@ -129,6 +157,16 @@ def map_array(array: np.ndarray, mapping: DimMapping) -> np.ndarray: return output +def unmap_array(array: np.ndarray, mapping: DimMapping, source_dim: int) -> np.ndarray: + """Gather unified slots back into their original source indices.""" + array = np.asarray(array) + output = np.zeros((*array.shape[:-1], source_dim), dtype=array.dtype) + if mapping: + sources, targets = zip(*mapping, strict=True) + output[..., sources] = array[..., targets] + return output + + def apply_delta(state: np.ndarray, actions: np.ndarray, mask) -> np.ndarray: """Convert only masked source-absolute slots to deltas against current state.""" state = np.asarray(state) diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 959e94d..1790b34 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -77,6 +77,8 @@ class CotrainDataConfig(_config.DataConfigFactory): def create(self, assets_dirs: pathlib.Path, model_config: _model.BaseModelConfig) -> _config.DataConfig: assert self.rlds_data_dir is not None, "Need to set rlds_data_dir for the co-training RLDS loader." assert len(self.datasets) > 0, "Need at least one dataset in `datasets`." + if getattr(model_config, "ki_enabled", False) and any(ds.unified_action_spec for ds in self.datasets): + raise NotImplementedError("KI FAST-token supervision does not yet support per-dimension action masks.") base = self.create_base_config(assets_dirs, model_config) @@ -134,8 +136,7 @@ class CotrainTrainConfig(_config.TrainConfig): num_action_mse_batches: int = 5 # Denoising steps used by sample_actions during action-MSE eval. action_mse_num_denoise_steps: int = 10 - # NOTE: the number of valid (non-padded) action dims for the MSE mask is taken - # per-dataset from each CotrainRLDSDataset.action_dim (0 -> all dims). + # Action MSE uses the per-sample binary mask carried by the RLDS pipeline. # Flow-loss estimator(s): "fixed_seed", "multi_sample", or "both". val_flow_loss_mode: Literal["fixed_seed", "multi_sample", "both"] = "both" # K for the multi-sample flow-loss estimator. diff --git a/src/openpi/cotrain/data_loader.py b/src/openpi/cotrain/data_loader.py index afe834a..ce93df5 100644 --- a/src/openpi/cotrain/data_loader.py +++ b/src/openpi/cotrain/data_loader.py @@ -10,11 +10,14 @@ import jax +from openpi.cotrain.rlds_dataset import CotrainRldsDataset +from openpi.cotrain.rlds_dataset import Split import openpi.training.config as _config -# Reuse the unchanged openpi pieces. -from openpi.training.data_loader import DataLoaderImpl, RLDSDataLoader, transform_iterable_dataset -from openpi.cotrain.rlds_dataset import CotrainRldsDataset, Split +# Reuse the unchanged openpi pieces. +from openpi.training.data_loader import DataLoaderImpl +from openpi.training.data_loader import RLDSDataLoader +from openpi.training.data_loader import transform_iterable_dataset # Common image size for mixed-resolution batching, matching the model's ResizeImages target # (openpi ModelTransformFactory hardcodes ResizeImages(224, 224)). Images are resize_with_pad'd @@ -192,10 +195,14 @@ def dataset_train_weights(config: _config.TrainConfig) -> dict[str, float]: return {ds.uid: ds.weight for ds in data_config.datasets} -def dataset_action_dims(config: _config.TrainConfig) -> dict[str, int]: - """Map dataset name -> native action dim (for the per-dataset action-MSE mask). - - 0 means "use all dims" (no mask). Falls back to 0 if a dataset entry lacks action_dim. - """ +def dataset_action_masks(config: _config.TrainConfig) -> dict[str, tuple[bool, ...]]: + """Map dataset name to its model-width action mask.""" data_config = config.data.create(config.assets_dirs, config.model) - return {ds.uid: getattr(ds, "action_dim", 0) or None for ds in data_config.datasets} + masks = {} + for ds in data_config.datasets: + if ds.unified_action_spec is not None: + masks[ds.uid] = ds.unified_action_spec.action_mask + continue + native_dim = getattr(ds, "action_dim", 0) or config.model.action_dim + masks[ds.uid] = tuple(index < native_dim for index in range(config.model.action_dim)) + return masks diff --git a/src/openpi/cotrain/eval.py b/src/openpi/cotrain/eval.py index d736102..9e560d5 100644 --- a/src/openpi/cotrain/eval.py +++ b/src/openpi/cotrain/eval.py @@ -8,7 +8,7 @@ Action MSE (a la EgoVerse offline metric): run the full flow-matching sampler (`sample_actions`) and compare the predicted action chunk to the ground-truth chunk, -masked to the valid (non-padded) action dimensions, in the model's normalized space. +masked to the sample's valid unified action dimensions, in the model's normalized space. All metrics are computed with `model.eval()` (no dropout) and a fixed rng so the curves are comparable across checkpoints. Static config (num samples, denoise steps, valid @@ -16,8 +16,6 @@ functions can be `jax.jit`-ed without static-argnum bookkeeping. """ -import functools - import flax.nnx as nnx import jax import jax.numpy as jnp @@ -72,7 +70,7 @@ def step(rng, state, batch): return jax.jit(step) -def make_val_action_mse_step(*, num_denoise_steps: int, valid_dims: int | None, use_ema: bool): +def make_val_action_mse_step(*, num_denoise_steps: int, fallback_mask, use_ema: bool): """Build a jitted step returning the masked action MSE for one batch.""" def step(rng, state, batch): @@ -84,12 +82,14 @@ def step(rng, state, batch): pred = model.sample_actions(rng, observation, num_steps=num_denoise_steps) err2 = (pred - actions) ** 2 # [B, H, Ad] - if valid_dims is not None: - dim_mask = (jnp.arange(actions.shape[-1]) < valid_dims).astype(err2.dtype) # [Ad] - err2 = err2 * dim_mask - denom = dim_mask.sum() * actions.shape[0] * actions.shape[1] - return err2.sum() / denom - return jnp.mean(err2) + mask = observation.action_mask + if mask is None: + mask = jnp.broadcast_to( + jnp.asarray(fallback_mask, dtype=jnp.bool_), actions.shape[:-2] + actions.shape[-1:] + ) + mask = jnp.expand_dims(mask, axis=-2) + denom = jnp.sum(mask) * actions.shape[-2] + return jnp.sum(err2 * mask) / jnp.clip(denom, 1) return jax.jit(step) @@ -108,7 +108,7 @@ def step(rng, state, batch): return jax.jit(step) -def plot_action_trajectories(pred, gt, *, valid_dims: int | None = None, n_samples: int = 1, title: str = ""): +def plot_action_trajectories(pred, gt, *, action_mask=None, slot_names=None, n_samples: int = 1, title: str = ""): """Per-dim predicted-vs-GT action-chunk trajectories. Returns a matplotlib Figure. pred/gt are [B, H, Ad] in the model's normalized(+delta) space (same space as the MSE). @@ -124,20 +124,23 @@ def plot_action_trajectories(pred, gt, *, valid_dims: int | None = None, n_sampl pred = np.asarray(pred) gt = np.asarray(gt) b, h, ad = pred.shape - d = min(valid_dims or ad, ad) + active_slots = np.flatnonzero(np.ones(ad, dtype=bool) if action_mask is None else np.asarray(action_mask)[:ad]) + if not len(active_slots): + raise ValueError("action_mask has no active slots") n = min(n_samples, b) - ncols = min(d, 4) - nrows = math.ceil(d / ncols) + ncols = min(len(active_slots), 4) + nrows = math.ceil(len(active_slots) / ncols) fig, axes = plt.subplots(nrows, ncols, figsize=(3 * ncols, 2 * nrows), squeeze=False) x = np.arange(h) - for dim in range(d): - ax = axes[dim // ncols][dim % ncols] + for plot_index, dim in enumerate(active_slots): + ax = axes[plot_index // ncols][plot_index % ncols] for s in range(n): ax.plot(x, gt[s, :, dim], color="tab:green", alpha=0.8, lw=1.2, label="gt" if s == 0 else None) ax.plot(x, pred[s, :, dim], color="tab:red", ls="--", alpha=0.8, lw=1.2, label="pred" if s == 0 else None) - ax.set_title(f"dim {dim}", fontsize=8) + name = slot_names[dim] if slot_names is not None else f"dim_{dim}" + ax.set_title(f"U{dim + 1} {name}", fontsize=8) ax.tick_params(labelsize=6) - for k in range(d, nrows * ncols): + for k in range(len(active_slots), nrows * ncols): axes[k // ncols][k % ncols].axis("off") axes[0][0].legend(fontsize=7) fig.suptitle(title, fontsize=10) diff --git a/src/openpi/cotrain/rlds_dataset.py b/src/openpi/cotrain/rlds_dataset.py index 80619de..5796e35 100644 --- a/src/openpi/cotrain/rlds_dataset.py +++ b/src/openpi/cotrain/rlds_dataset.py @@ -56,8 +56,8 @@ class CotrainRLDSDataset: # Which restructure to use: "standardized" (offline common schema), "robomind" (raw # RoboMIND schema, mapped at runtime), or "droid" (raw DROID schema). restructure_name: str = "standardized" - # Native (un-padded) action dimensionality, used for the per-dataset action-MSE mask - # and for slicing model outputs back to native dims at inference. 0 -> use all dims. + # Native action width, used for legacy prefix masks and restoring model outputs. Unified + # datasets derive their train/eval mask from unified_action_spec instead. action_dim: int = 0 # Optional index selections applied after restructure and before padding/chunking. These # let schema-rich datasets (notably RoboCOIN) crop/reorder raw proprio state into the same @@ -552,11 +552,8 @@ def __init__( shuffle: bool = True, repeat: bool | None = None, action_chunk_size: int = 16, - # If set, zero-pad native state/action vectors to this width (the model action_dim) - # BEFORE mixing/batching, so datasets with different native dims (e.g. 12/14/36) share - # one element spec and can be batched. None -> keep native (used by norm-stats, which - # must accumulate stats at native dim). Per-dataset delta uses native-length masks that - # slice correctly; DispatchNormalize pads native stats up to this width at apply time. + # Legacy configs zero-pad native vectors to this width. Unified configs require width 80 + # and map before mixing/batching. None keeps the mapped/native width for norm-stat jobs. pad_action_dim: int | None = None, # If set (h, w), resize_with_pad all decoded images to this size BEFORE mixing/batching, # so datasets with different native resolutions (e.g. mecka 360x640 vs others 480x640) diff --git a/src/openpi/cotrain/transforms.py b/src/openpi/cotrain/transforms.py index be4f9c2..0fde6b5 100644 --- a/src/openpi/cotrain/transforms.py +++ b/src/openpi/cotrain/transforms.py @@ -9,10 +9,8 @@ looks at each sample's `dataset_id` tag and applies that dataset's own norm stats. This lets us re-tune / re-compute normalization without regenerating the RLDS data. -Action SPACES are NOT unified across robot datasets (pi0/pi05 don't either): each dataset -keeps its native state/action vector placed at the front and zero-padded to the current -model action_dim downstream. The model disambiguates via observation/proprioception -conditioning. The only genuinely per-dataset runtime step is normalization. +The full-all configuration maps every dataset into a fixed 80D physical layout before +mixing. Legacy configurations retain native-prefix padding for compatibility. """ import dataclasses @@ -93,15 +91,23 @@ def __call__(self, data: dict) -> dict: @dataclasses.dataclass(frozen=True) class StandardizedOutputs(_transforms.DataTransformFn): - """Inference-time outputs: slice the padded action vector back to native dims. + """Inference-time outputs: restore the dataset's native action layout. `action_dim` is the dataset's native action dimensionality (e.g. 8 for DROID). """ action_dim: int + unified_action_spec: cotrain_action_space.UnifiedActionSpec | None = None def __call__(self, data: dict) -> dict: - return {"actions": np.asarray(data["actions"])[..., : self.action_dim]} + actions = np.asarray(data["actions"]) + if self.unified_action_spec is not None: + actions = cotrain_action_space.unmap_array( + actions, self.unified_action_spec.action_mapping, self.action_dim + ) + else: + actions = actions[..., : self.action_dim] + return {"actions": actions} @dataclasses.dataclass(frozen=True) diff --git a/src/openpi/cotrain/weight_loaders.py b/src/openpi/cotrain/weight_loaders.py index 1e40a8f..1870753 100644 --- a/src/openpi/cotrain/weight_loaders.py +++ b/src/openpi/cotrain/weight_loaders.py @@ -38,7 +38,7 @@ class ShapeSafeCheckpointWeightLoader: """Load a checkpoint, skipping keys whose shapes no longer match the target model. This is used when widening the co-training action/state width (e.g. pi05_base has a - 32-wide head while full-all uses 64). Matching pi05_base weights are loaded; widened + 32-wide head while full-all uses 80). Matching pi05_base weights are loaded; widened projection/head parameters stay at the target model's random initialization. """ diff --git a/src/openpi/models/model.py b/src/openpi/models/model.py index a22d851..045f556 100644 --- a/src/openpi/models/model.py +++ b/src/openpi/models/model.py @@ -75,6 +75,7 @@ class ModelType(enum.Enum): # ... # }, # "state": float32[*b, s], # Low-dimensional robot state +# "action_mask": bool[*b, ad], # Optional valid dimensions in the unified action space # "state_history": float32[*b, T, s], # Optional MEM proprioceptive history # "tokenized_prompt": int32[*b, l], # Optional, tokenized language prompt # "tokenized_prompt_mask": bool[*b, l], # Optional, mask for tokenized prompt @@ -115,6 +116,8 @@ class Observation(Generic[ArrayT]): image_masks: dict[str, at.Bool[ArrayT, "b"] | at.Bool[ArrayT, "b t"]] # Low-dimensional robot state. state: at.Float[ArrayT, "b s"] + # Valid action dimensions. Missing means every action dimension is valid. + action_mask: at.Bool[ArrayT, "b ad"] | None = None # Optional π0.7 subgoal images, encoded as future-state visual context. subgoal_images: dict[str, at.Float[ArrayT, "b h w c"]] | None = None @@ -180,6 +183,7 @@ def from_dict(cls, data: at.PyTree[ArrayT]) -> "Observation[ArrayT]": subgoal_images=data.get("subgoal_image"), subgoal_image_masks=data.get("subgoal_image_mask"), state=data["state"], + action_mask=data.get("action_mask"), state_history=data.get("state_history"), tokenized_prompt=data.get("tokenized_prompt"), tokenized_prompt_mask=data.get("tokenized_prompt_mask"), @@ -312,6 +316,7 @@ def preprocess_observation( subgoal_images=out_subgoal_images, subgoal_image_masks=out_subgoal_masks, state=observation.state, + action_mask=observation.action_mask, state_history=observation.state_history, tokenized_prompt=observation.tokenized_prompt, tokenized_prompt_mask=observation.tokenized_prompt_mask, diff --git a/src/openpi/models/pi0.py b/src/openpi/models/pi0.py index 7eddba4..3b68b92 100644 --- a/src/openpi/models/pi0.py +++ b/src/openpi/models/pi0.py @@ -304,7 +304,9 @@ def compute_loss( observation = _model.preprocess_observation(preprocess_rng, observation, train=train) batch_shape = actions.shape[:-2] - noise = jax.random.normal(noise_rng, actions.shape) + action_mask = _broadcast_action_mask(observation.action_mask, actions.shape) + actions = jnp.where(action_mask, actions, 0) + noise = jnp.where(action_mask, jax.random.normal(noise_rng, actions.shape), 0) time = jax.random.beta(time_rng, 1.5, 1, batch_shape) * 0.999 + 0.001 time_expanded = time[..., None, None] x_t = time_expanded * noise + (1 - time_expanded) * actions @@ -335,13 +337,16 @@ def compute_loss( # ki_insulate is baked into the Gemma Module at construction (see __init__). # No extra kwarg needed here; stop_gradient activates automatically when len(qkvs)==2. (prefix_out, suffix_out), _ = self.PaliGemma.llm( - [prefix_tokens, suffix_tokens], mask=attn_mask, positions=positions, + [prefix_tokens, suffix_tokens], + mask=attn_mask, + positions=positions, adarms_cond=[None, adarms_cond], ) # Flow-matching loss (always computed). - v_t = self.action_out_proj(suffix_out[:, -self.action_horizon:]) - flow_loss = jnp.mean(jnp.square(v_t - u_t), axis=-1) + v_t = self.action_out_proj(suffix_out[:, -self.action_horizon :]) + squared_error = jnp.square(v_t - u_t) * action_mask + flow_loss = jnp.sum(squared_error, axis=-1) / jnp.clip(jnp.sum(action_mask, axis=-1), 1) losses = {"flow": flow_loss} @@ -368,9 +373,7 @@ def compute_loss( loss_mask = jnp.ones((observation.ki_fast_tokens.shape[0], fast_len), dtype=jnp.float32) logp = jax.nn.log_softmax(fast_logits, axis=-1) target_logp = jnp.take_along_axis(logp, observation.ki_fast_tokens[:, :, None], axis=-1)[..., 0] - losses["ki_fast"] = -jnp.sum(target_logp * loss_mask, axis=-1) / jnp.clip( - jnp.sum(loss_mask, axis=-1), 1 - ) + losses["ki_fast"] = -jnp.sum(target_logp * loss_mask, axis=-1) / jnp.clip(jnp.sum(loss_mask, axis=-1), 1) if set(losses) == {"flow"}: return flow_loss @@ -392,6 +395,8 @@ def sample_actions( batch_size = observation.state.shape[0] if noise is None: noise = jax.random.normal(rng, (batch_size, self.action_horizon, self.action_dim)) + action_mask = _broadcast_action_mask(observation.action_mask, noise.shape) + noise = jnp.where(action_mask, noise, 0) # first fill KV cache with a forward pass of the prefix prefix_tokens, prefix_mask, prefix_ar_mask = self.embed_prefix(observation) @@ -431,7 +436,7 @@ def step(carry): assert prefix_out is None v_t = self.action_out_proj(suffix_out[:, -self.action_horizon :]) - return x_t + dt * v_t, time + dt + return jnp.where(action_mask, x_t + dt * v_t, 0), time + dt def cond(carry): x_t, time = carry @@ -440,3 +445,14 @@ def cond(carry): x_0, _ = jax.lax.while_loop(cond, step, (noise, 1.0)) return x_0 + + +def _broadcast_action_mask(action_mask, action_shape: tuple[int, ...]): + """Broadcast a per-sample action mask across the action horizon.""" + if action_mask is None: + return jnp.ones(action_shape, dtype=jnp.bool_) + action_mask = jnp.asarray(action_mask, dtype=jnp.bool_) + expected_shape = (*action_shape[:-2], action_shape[-1]) + if action_mask.shape != expected_shape: + raise ValueError(f"action_mask shape must be {expected_shape}, got {action_mask.shape}") + return jnp.broadcast_to(jnp.expand_dims(action_mask, axis=-2), action_shape) diff --git a/src/openpi/models/pi0_action_mask_test.py b/src/openpi/models/pi0_action_mask_test.py new file mode 100644 index 0000000..839118f --- /dev/null +++ b/src/openpi/models/pi0_action_mask_test.py @@ -0,0 +1,50 @@ +import jax +import jax.numpy as jnp +import numpy as np +import pytest + +from openpi.models import pi0 +from openpi.models import pi0_config + + +def test_action_mask_broadcasts_across_horizon() -> None: + mask = jnp.asarray([[True, False, True], [False, True, False]]) + broadcast = pi0._broadcast_action_mask(mask, (2, 4, 3)) + assert broadcast.shape == (2, 4, 3) + np.testing.assert_array_equal(broadcast[:, 0], mask) + np.testing.assert_array_equal(broadcast[:, -1], mask) + + +def test_missing_action_mask_keeps_all_dimensions_valid() -> None: + broadcast = pi0._broadcast_action_mask(None, (2, 4, 3)) + np.testing.assert_array_equal(broadcast, np.ones((2, 4, 3), dtype=bool)) + + +def test_action_mask_rejects_wrong_width() -> None: + with pytest.raises(ValueError, match="action_mask shape"): + pi0._broadcast_action_mask(jnp.ones((2, 2), dtype=bool), (2, 4, 3)) + + +def test_flow_loss_ignores_masked_action_values() -> None: + config = pi0_config.Pi0Config( + paligemma_variant="dummy", action_expert_variant="dummy", action_dim=5, action_horizon=2, max_token_len=8 + ) + model = config.create(jax.random.key(0)) + observation, actions = config.fake_obs(batch_size=1), config.fake_act(batch_size=1) + observation = observation.replace(action_mask=jnp.asarray([[True, False, True, False, False]])) + changed = actions.at[..., 1].set(1000).at[..., 3:].set(-1000) + + expected = model.compute_loss(jax.random.key(1), observation, actions) + actual = model.compute_loss(jax.random.key(1), observation, changed) + np.testing.assert_allclose(actual, expected, rtol=0, atol=0) + + +def test_sampling_keeps_masked_dimensions_zero() -> None: + config = pi0_config.Pi0Config( + paligemma_variant="dummy", action_expert_variant="dummy", action_dim=5, action_horizon=2, max_token_len=8 + ) + model = config.create(jax.random.key(0)) + observation = config.fake_obs(batch_size=1).replace(action_mask=jnp.asarray([[True, False, True, False, False]])) + + actions = model.sample_actions(jax.random.key(1), observation, num_steps=2) + np.testing.assert_array_equal(actions[..., [1, 3, 4]], 0) diff --git a/tests/cotrain/test_action_space.py b/tests/cotrain/test_action_space.py index f694927..1833b1d 100644 --- a/tests/cotrain/test_action_space.py +++ b/tests/cotrain/test_action_space.py @@ -131,6 +131,23 @@ def test_map_array_scatters_and_zero_fills() -> None: assert np.all(mapped[~mask] == 0) +def test_unmap_array_restores_mapped_source_indices() -> None: + spec = action_space.UNIFIED_ACTION_SPECS["robocoin_aloha_s26_a26"] + source = np.arange(26, dtype=np.float32) + unified = action_space.map_array(source, spec.action_mapping) + restored = action_space.unmap_array(unified, spec.action_mapping, source_dim=26) + mapped_sources = np.asarray([source_index for source_index, _ in spec.action_mapping]) + dropped_sources = np.asarray(sorted(set(range(26)) - set(mapped_sources))) + np.testing.assert_array_equal(restored[mapped_sources], source[mapped_sources]) + np.testing.assert_array_equal(restored[dropped_sources], 0) + + +def test_unified_slot_names_cover_all_80_slots() -> None: + assert len(action_space.UNIFIED_SLOT_NAMES) == action_space.UNIFIED_ACTION_DIM + assert action_space.UNIFIED_SLOT_NAMES[action_space.LEFT_ARM] == "left_arm_joint_1" + assert action_space.UNIFIED_SLOT_NAMES[action_space.RIGHT_GRIPPER] == "right_gripper" + + def test_mapping_metadata_rejects_stale_stats(tmp_path) -> None: spec = action_space.UNIFIED_ACTION_SPECS["droid"] action_space.write_metadata(tmp_path, spec) From 86c2be9d21dbf7160822cecb01db612ad56de195 Mon Sep 17 00:00:00 2001 From: root <835297796@qq.com> Date: Wed, 15 Jul 2026 16:33:25 +0800 Subject: [PATCH 06/64] Audit unified actions on real RLDS data --- ...00\345\217\221\346\227\245\345\277\227.md" | 32 +++ scripts/audit_unified_action_space.py | 271 ++++++++++++++++++ 2 files changed, 303 insertions(+) create mode 100644 scripts/audit_unified_action_space.py diff --git "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" index 2ad8840..318a0de 100644 --- "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" +++ "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" @@ -97,3 +97,35 @@ - Ruff 对本阶段文件执行 `E/F/I` 检查(忽略仓库既有 jaxtyping `F722/F821` 与既有长行):通过。 - 模型测试使用旧仓库 venv、`JAX_PLATFORMS=cpu` 和新仓库 `PYTHONPATH=src`;仅出现上游 JAX/Flax deprecation warnings,无功能失败。 + +## 阶段四:真实 RLDS 与端到端验证 + +### 实现 + +- 新增 `scripts/audit_unified_action_space.py`,可重复审计真实 builder,而不是只检查手写配置。 +- raw audit 会读取每个 builder 的首个 train episode/frame,验证真实 state/action 宽度、source index、 + 80D scatter、mask 外全零和 delta 非目标槽不变。 +- pipeline audit 将 EgoVerse EEF、Piper joint、RoboCOIN ALOHA(丢弃 EEF)和 Yinhe(state reorder) + 混合采样,验证 chunk/batch 后 shape、逐样本 mask 和 Action Mode/EEF Frame prompt。 +- model smoke 使用临时 neutral 80D stats,贯通 restructure、mapping、delta、normalize、tokenizer、 + `Observation`、dummy π0.5 flow loss 和两步 sampler;临时目录退出即删除,不修改仓库 assets。 + +### 验证 + +- 真实 builder:`43/43 PASS`;配置全集与 mapping registry 完全一致。当前 `cotrain_full_all` 为 + `41` 个 active builder,恰好只排除设计中确认的 2 个 builder。 +- 关键真实宽度:Galaxea `state16/action18`、Leju `state118/action54`、Yinhe `state49/action16`、 + Ruantong `state41/action34`;对应非连续/crop/reorder mapping 均成功执行。 +- mixed RLDS:4 类代表数据全部出现,3 个 batch 内观察到真实跨数据集混合;shape 为 + `state[B,80]`、`actions[B,4,80]`、`action_mask[B,80]`,mask 外动作全零。 +- prompt 回归:joint 样本以 `Action Mode: joint.` 开头;EgoVerse 样本以 + `Action Mode: eef.` 开头且包含 `EEF Frame:`。 +- transformed/model smoke:`actions[4,4,80]`、`mask[4,80]`、finite `loss[4,4]`、 + `sample[4,4,80]`;采样结果 mask 外严格为零。 +- 全量回归:action-space 单测 `54 passed`,model mask 单测 `5 passed`;审计脚本 `py_compile`、 + Ruff `E/F/I` 和 `git diff --check` 均通过。 + +### 训练前置条件 + +- 必须先为 41 个 active builder 重新计算 80D norm stats。旧 native/64D stats 没有 mapping + fingerprint,训练会按设计立即拒绝,避免误用旧统计量开始训练。 diff --git a/scripts/audit_unified_action_space.py b/scripts/audit_unified_action_space.py new file mode 100644 index 0000000..925d5af --- /dev/null +++ b/scripts/audit_unified_action_space.py @@ -0,0 +1,271 @@ +"""Audit unified action mappings against the real RLDS builders. + +Run from the repository root with the training environment: + PYTHONPATH=src python scripts/audit_unified_action_space.py +""" + +import argparse +import dataclasses +import gc +import json +from pathlib import Path +import tempfile + +import numpy as np + +from openpi.cotrain import action_space + + +def _configured_datasets(): + from openpi.cotrain import config # noqa: PLC0415 + + groups = ( + config._AGIBOT_DATA.datasets, + config._DROID_DATA.datasets, + config._EGOVERSE_FULL_DATA.datasets, + config._PIPER30_DATA.datasets, + config._ROBOCOIN_DATA.datasets, + config._ROBOMIND_FULL_DATA.datasets, + ) + datasets = tuple(dataset for group in groups for dataset in group) + by_id = {dataset.uid: dataset for dataset in datasets} + if set(by_id) != set(action_space.UNIFIED_ACTION_SPECS): + missing = sorted(set(action_space.UNIFIED_ACTION_SPECS) - set(by_id)) + extra = sorted(set(by_id) - set(action_space.UNIFIED_ACTION_SPECS)) + raise ValueError(f"Config/spec registry mismatch: missing={missing}, extra={extra}") + active_ids = {dataset.uid for dataset in config._FULL_ALL_DATA.datasets} + expected_active = set(by_id) - config._FULL_ALL_EXCLUDED_DATASET_IDS + if active_ids != expected_active or len(active_ids) != 41: + raise ValueError( + f"full-all active dataset mismatch: expected={sorted(expected_active)}, got={sorted(active_ids)}" + ) + return tuple( + dataclasses.replace(dataset, unified_action_spec=action_space.UNIFIED_ACTION_SPECS[dataset.uid]) + for dataset in datasets + ) + + +def _first_raw_step(dataset): + import tensorflow_datasets as tfds # noqa: PLC0415 + + builder = tfds.builder_from_directory(dataset.builder_dir) + episode = next(iter(builder.as_dataset(split=f"{dataset.train_split}[:1]", shuffle_files=False))) + return next(iter(episode["steps"])) + + +def _source_arrays(step) -> tuple[np.ndarray, np.ndarray]: + action = np.asarray(step["action"]) + state = np.asarray(step["observation"]["state"]) + if action.ndim != 1 or state.ndim != 1: + raise ValueError(f"Expected rank-1 step state/action, got state={state.shape}, action={action.shape}") + if not np.all(np.isfinite(action)) or not np.all(np.isfinite(state)): + raise ValueError("First step contains non-finite state/action values") + return state, action + + +def audit_raw_builders(datasets) -> list[dict]: + results = [] + for index, dataset in enumerate(datasets, start=1): + spec = dataset.unified_action_spec + step = _first_raw_step(dataset) + state, actions = _source_arrays(step) + spec.validate_source_dims(state.shape[-1], actions.shape[-1]) + + mapped_state = action_space.map_array(state, spec.state_mapping) + mapped_actions = action_space.map_array(actions, spec.action_mapping) + action_mask = np.asarray(spec.action_mask) + if np.any(mapped_actions[~action_mask] != 0): + raise ValueError(f"{dataset.uid}: nonzero action outside mask") + + chunk = np.broadcast_to(mapped_actions, (2, action_space.UNIFIED_ACTION_DIM)).copy() + converted = action_space.apply_delta(mapped_state, chunk, spec.delta_mask) + delta_mask = np.asarray(spec.delta_mask) + np.testing.assert_array_equal(converted[:, ~delta_mask], chunk[:, ~delta_mask]) + + result = { + "dataset_id": dataset.uid, + "state_dim": int(state.shape[-1]), + "action_dim": int(actions.shape[-1]), + "active_slots": int(action_mask.sum()), + "delta_slots": int(delta_mask.sum()), + "builder_dir": dataset.builder_dir, + } + results.append(result) + print( + f"[{index:02d}/{len(datasets)}] {dataset.uid}: " + f"state={state.shape[-1]} action={actions.shape[-1]} " + f"active={action_mask.sum()} delta={delta_mask.sum()}" + ) + del step + gc.collect() + return results + + +def audit_mixed_pipeline(datasets) -> dict: + from openpi.cotrain.rlds_dataset import CotrainRldsDataset # noqa: PLC0415 + + selected_ids = { + "egoverse_eva", + "piper30", + "robocoin_aloha_s26_a26", + "robocoin_yinhe_s49_a16", + } + selected = tuple( + dataclasses.replace(dataset, weight=1 / len(selected_ids)) + for dataset in datasets + if dataset.uid in selected_ids + ) + mixed = CotrainRldsDataset( + data_dir="/mnt/data/RLDS", + batch_size=4, + datasets=selected, + split_label="train", + shuffle=False, + repeat=True, + action_chunk_size=4, + pad_action_dim=action_space.UNIFIED_ACTION_DIM, + image_resize_hw=(32, 32), + shuffle_buffer_size=1, + num_parallel_reads=1, + num_parallel_calls=1, + ) + + seen = set() + mixed_batch_seen = False + for batch_index, batch in enumerate(mixed, start=1): + if batch["state"].shape != (4, action_space.UNIFIED_ACTION_DIM): + raise ValueError(f"Unexpected state shape: {batch['state'].shape}") + if batch["actions"].shape != (4, 4, action_space.UNIFIED_ACTION_DIM): + raise ValueError(f"Unexpected actions shape: {batch['actions'].shape}") + if batch["action_mask"].shape != (4, action_space.UNIFIED_ACTION_DIM): + raise ValueError(f"Unexpected action_mask shape: {batch['action_mask'].shape}") + + ids = [value.decode() if isinstance(value, bytes) else str(value) for value in batch["dataset_id"]] + mixed_batch_seen |= len(set(ids)) > 1 + for row, dataset_id in enumerate(ids): + spec = action_space.UNIFIED_ACTION_SPECS[dataset_id] + np.testing.assert_array_equal(batch["action_mask"][row], spec.action_mask) + assert np.all(batch["actions"][row, :, ~np.asarray(spec.action_mask)] == 0) + prompt_prefix = batch["prompt_prefix"][row] + if isinstance(prompt_prefix, bytes): + prompt_prefix = prompt_prefix.decode() + expected_mode = "eef" if dataset_id.startswith("egoverse_") else "joint" + if not prompt_prefix.startswith(f"Action Mode: {expected_mode}."): + raise ValueError(f"{dataset_id}: unexpected prompt prefix {prompt_prefix!r}") + if expected_mode == "eef" and "EEF Frame:" not in prompt_prefix: + raise ValueError(f"{dataset_id}: EEF prompt is missing its coordinate frame") + seen.add(dataset_id) + if seen == selected_ids and mixed_batch_seen: + break + if batch_index >= 40: + raise RuntimeError(f"Did not observe all selected datasets in mixed batches: seen={sorted(seen)}") + + return {"datasets": sorted(seen), "mixed_batch_seen": mixed_batch_seen, "batches": batch_index} + + +def audit_model_smoke(datasets) -> dict: + import jax # noqa: PLC0415 + import jax.numpy as jnp # noqa: PLC0415 + + from openpi.cotrain import config # noqa: PLC0415 + from openpi.cotrain import data_loader # noqa: PLC0415 + from openpi.models import pi0_config # noqa: PLC0415 + from openpi.shared import normalize # noqa: PLC0415 + + selected_ids = {"egoverse_eva", "piper30", "robocoin_aloha_s26_a26", "robocoin_yinhe_s49_a16"} + selected = tuple( + dataclasses.replace(dataset, weight=1 / len(selected_ids)) + for dataset in datasets + if dataset.uid in selected_ids + ) + model_config = pi0_config.Pi0Config( + paligemma_variant="dummy", + action_expert_variant="dummy", + pi05=True, + action_dim=action_space.UNIFIED_ACTION_DIM, + action_horizon=4, + max_token_len=384, + ) + + with tempfile.TemporaryDirectory(prefix="unified-action-smoke-") as temp_dir: + assets_root = Path(temp_dir) / "unified_action_smoke" + neutral = normalize.NormStats( + mean=np.zeros(80), + std=np.ones(80), + q01=-np.ones(80), + q99=np.ones(80), + ) + for dataset in selected: + directory = assets_root / dataset.uid + normalize.save(directory, {"state": neutral, "actions": neutral}) + action_space.write_metadata(directory, dataset.unified_action_spec) + + data_factory = config.CotrainDataConfig(rlds_data_dir="/mnt/data/RLDS", datasets=selected) + train_config = config.CotrainTrainConfig( + name="unified_action_smoke", + model=model_config, + data=data_factory, + assets_base_dir=temp_dir, + batch_size=4, + exp_name="smoke", + data_num_parallel_reads=1, + data_num_parallel_calls=1, + ) + loader = data_loader.create_cotrain_data_loader( + train_config, + split_label="train", + shuffle=False, + num_batches=1, + shuffle_buffer_size=1, + ) + observation, actions = next(iter(loader)) + if observation.action_mask.shape != (4, 80) or actions.shape != (4, 4, 80): + raise ValueError( + f"Unexpected transformed shapes: mask={observation.action_mask.shape}, actions={actions.shape}" + ) + if observation.tokenized_prompt is None: + raise ValueError("Transformed batch is missing tokenized prompts") + + model = model_config.create(jax.random.key(0)) + loss = model.compute_loss(jax.random.key(1), observation, actions) + pred = model.sample_actions(jax.random.key(2), observation, num_steps=2) + if loss.shape != (4, 4) or not bool(jnp.all(jnp.isfinite(loss))): + raise ValueError(f"Invalid flow loss: shape={loss.shape}") + broadcast_mask = jnp.broadcast_to(observation.action_mask[:, None, :], pred.shape) + if not bool(jnp.all(jnp.where(broadcast_mask, True, pred == 0))): + raise ValueError("Model sampling produced nonzero values outside the action mask") + + return { + "action_shape": list(actions.shape), + "mask_shape": list(observation.action_mask.shape), + "loss_shape": list(loss.shape), + "sample_shape": list(pred.shape), + } + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--skip-raw", action="store_true") + parser.add_argument("--skip-pipeline", action="store_true") + parser.add_argument("--model-smoke", action="store_true") + parser.add_argument("--json-output", type=Path) + args = parser.parse_args() + + datasets = _configured_datasets() + raw = [] if args.skip_raw else audit_raw_builders(datasets) + pipeline = None if args.skip_pipeline else audit_mixed_pipeline(datasets) + model_smoke = audit_model_smoke(datasets) if args.model_smoke else None + report = { + "configured_builder_count": len(datasets), + "audited_builder_count": len(raw), + "raw": raw, + "pipeline": pipeline, + "model_smoke": model_smoke, + } + if args.json_output is not None: + args.json_output.write_text(json.dumps(report, indent=2) + "\n") + print(f"PASS: raw={len(raw)}/{len(datasets)} builders; pipeline={pipeline}; model={model_smoke}") + + +if __name__ == "__main__": + main() From 5b0728be292f351485063e92d9a44b2ec422991d Mon Sep 17 00:00:00 2001 From: root <835297796@qq.com> Date: Wed, 15 Jul 2026 20:10:39 +0800 Subject: [PATCH 07/64] Make unified 80D mandatory for cotrain configs --- ...00\345\217\221\346\227\245\345\277\227.md" | 17 +++ scripts/audit_unified_action_space.py | 4 +- src/openpi/cotrain/config.py | 119 +++++++++--------- tests/cotrain/test_unified_config.py | 29 +++++ 4 files changed, 107 insertions(+), 62 deletions(-) create mode 100644 tests/cotrain/test_unified_config.py diff --git "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" index 318a0de..bcee153 100644 --- "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" +++ "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" @@ -129,3 +129,20 @@ - 必须先为 41 个 active builder 重新计算 80D norm stats。旧 native/64D stats 没有 mapping fingerprint,训练会按设计立即拒绝,避免误用旧统计量开始训练。 + +## 阶段五:80D 作为 co-training 强制基础 + +### 实现 + +- `CotrainDataConfig.create()` 自动按 `dataset_id` 从 registry 挂载 mapping,不再依赖配置作者手动 attach。 +- 所有 co-training 配置强制 `action_dim=80`;未知 dataset、非 80D model 或覆盖 registry mapping 均立即报错。 +- 删除 full-all 专用 attach 路径,full-all、单数据集和后续新配置共用同一不变量。 +- 现有 Piper、DROID、AgiBot、EgoVerse、RoboCOIN、RoboMIND 配置全部改为 80D;从 32D π0.5 + checkpoint 初始化的配置统一使用 shape-safe loader。 + +### 验证 + +- 配置测试覆盖:全部注册配置解析为 80D/spec、32D model 被拒绝、未注册 dataset 被拒绝。 +- `tests/cotrain`:`57 passed`。 +- 清除代表 dataset 的预挂载 spec 后重跑真实 transformed/model smoke:自动解析仍得到 + `actions[4,4,80]`、`mask[4,80]`、finite `loss[4,4]` 和 mask-safe `sample[4,4,80]`。 diff --git a/scripts/audit_unified_action_space.py b/scripts/audit_unified_action_space.py index 925d5af..678a367 100644 --- a/scripts/audit_unified_action_space.py +++ b/scripts/audit_unified_action_space.py @@ -174,7 +174,7 @@ def audit_model_smoke(datasets) -> dict: selected_ids = {"egoverse_eva", "piper30", "robocoin_aloha_s26_a26", "robocoin_yinhe_s49_a16"} selected = tuple( - dataclasses.replace(dataset, weight=1 / len(selected_ids)) + dataclasses.replace(dataset, weight=1 / len(selected_ids), unified_action_spec=None) for dataset in datasets if dataset.uid in selected_ids ) @@ -198,7 +198,7 @@ def audit_model_smoke(datasets) -> dict: for dataset in selected: directory = assets_root / dataset.uid normalize.save(directory, {"state": neutral, "actions": neutral}) - action_space.write_metadata(directory, dataset.unified_action_spec) + action_space.write_metadata(directory, action_space.UNIFIED_ACTION_SPECS[dataset.uid]) data_factory = config.CotrainDataConfig(rlds_data_dir="/mnt/data/RLDS", datasets=selected) train_config = config.CotrainTrainConfig( diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 1790b34..dd32bee 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -25,12 +25,30 @@ import openpi.training.config as _config import openpi.training.droid_rlds_dataset as droid_rlds_dataset import openpi.training.optimizer as _optimizer -import openpi.training.weight_loaders as weight_loaders import openpi.transforms as _transforms logger = logging.getLogger(__name__) +def _resolve_unified_datasets(datasets, model_config: _model.BaseModelConfig): + if model_config.action_dim != cotrain_action_space.UNIFIED_ACTION_DIM: + raise ValueError( + f"All co-training configs require action_dim={cotrain_action_space.UNIFIED_ACTION_DIM}, " + f"got {model_config.action_dim}." + ) + + resolved = [] + for ds in datasets: + try: + spec = cotrain_action_space.UNIFIED_ACTION_SPECS[ds.uid] + except KeyError as exc: + raise ValueError(f"Dataset '{ds.uid}' has no registered unified 80D action mapping.") from exc + if ds.unified_action_spec is not None and ds.unified_action_spec != spec: + raise ValueError(f"Dataset '{ds.uid}' overrides its registered unified 80D action mapping.") + resolved.append(dataclasses.replace(ds, unified_action_spec=spec)) + return tuple(resolved) + + def load_per_dataset_norm_stats(assets_dirs: pathlib.Path, datasets) -> dict: """Load per-dataset norm stats from `/` (skip if missing). @@ -77,23 +95,21 @@ class CotrainDataConfig(_config.DataConfigFactory): def create(self, assets_dirs: pathlib.Path, model_config: _model.BaseModelConfig) -> _config.DataConfig: assert self.rlds_data_dir is not None, "Need to set rlds_data_dir for the co-training RLDS loader." assert len(self.datasets) > 0, "Need at least one dataset in `datasets`." - if getattr(model_config, "ki_enabled", False) and any(ds.unified_action_spec for ds in self.datasets): + datasets = _resolve_unified_datasets(self.datasets, model_config) + if getattr(model_config, "ki_enabled", False): raise NotImplementedError("KI FAST-token supervision does not yet support per-dimension action masks.") base = self.create_base_config(assets_dirs, model_config) # Per-dataset absolute->delta action conversion (e.g. RoboMIND absolute joint). delta_masks = {} - for ds in self.datasets: - if ds.unified_action_spec is not None: - delta_masks[ds.uid] = ds.unified_action_spec.delta_mask - elif ds.delta_action_mask_dims is not None: - delta_masks[ds.uid] = _transforms.make_bool_mask(*ds.delta_action_mask_dims) + for ds in datasets: + delta_masks[ds.uid] = ds.unified_action_spec.delta_mask dispatch_delta = cotrain_transforms.DispatchDeltaActions(masks_by_dataset=delta_masks) # Per-dataset normalization (dispatched at runtime by dataset_id). Quantile norm for # pi05 (use_quantile_norm is True for non-PI0 models in create_base_config). - per_dataset_stats = load_per_dataset_norm_stats(assets_dirs, self.datasets) + per_dataset_stats = load_per_dataset_norm_stats(assets_dirs, datasets) dispatch_norm = cotrain_transforms.DispatchNormalize( norm_stats_by_dataset=per_dataset_stats, use_quantiles=base.use_quantile_norm, @@ -118,7 +134,7 @@ def create(self, assets_dirs: pathlib.Path, model_config: _model.BaseModelConfig model_transforms=model_transforms, rlds_data_dir=self.rlds_data_dir, action_space=self.action_space, - datasets=self.datasets, + datasets=datasets, ) @@ -160,19 +176,9 @@ class CotrainTrainConfig(_config.TrainConfig): # --------------------------------------------------------------------------- # Config registry (separate from openpi's _CONFIGS; selected via this module's cli()). # --------------------------------------------------------------------------- -# This edited registry intentionally keeps ONLY the requested piper30 RLDS dataset: -# /mnt/data/RLDS/realworld_piper/ -# piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist -# -# Initialization choices: -# - cotrain_piper30_only / cotrain_all / cotrain_all_2ep: -# fine-tune FROM pi05_base checkpoint (the choice we want). -# - cotrain_piper30_only_paligemma: -# initialize FROM raw PaliGemma VLM backbone only (action expert random-init), kept -# as an explicit optional config so the two training starts remain selectable. -# -# For pi05 checkpoint compatibility, keep the model at the default pi05 action_dim -# (do NOT widen to 40; that was only needed for RoboCOIN in the old multi-dataset mix). +# Every config in this registry uses the fixed 80D state/action layout. pi05_base has a +# 32D projection/head, so checkpoint-start configs use the shape-safe loader and randomly +# initialize only parameters whose shapes changed. _PIPER30_ROOT = ( "/mnt/data/RLDS/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist" @@ -723,37 +729,38 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): return tuple(dataclasses.replace(ds, weight=ds.weight / total_weight) for ds in kept) -def _attach_unified_action_specs(datasets: tuple[CotrainRLDSDataset, ...]): - return tuple( - dataclasses.replace(ds, unified_action_spec=cotrain_action_space.UNIFIED_ACTION_SPECS[ds.uid]) - for ds in datasets - ) - - _FULL_ALL_DATA = CotrainDataConfig( rlds_data_dir="/mnt/data/RLDS", - datasets=_attach_unified_action_specs( - _drop_excluded_and_renormalize( - ( - *_scale_dataset_weights(_AGIBOT_DATA.datasets, _AGIBOT_TRAIN_EPISODES), - *_scale_dataset_weights(_DROID_DATA.datasets, _DROID_TRAIN_EPISODES), - *_scale_dataset_weights(_EGOVERSE_FULL_DATA.datasets, _EGOVERSE_FULL_TRAIN_EPISODES), - *_scale_dataset_weights(_PIPER30_DATA.datasets, _PIPER30_TRAIN_EPISODES), - *_scale_dataset_weights(_ROBOCOIN_DATA.datasets, _ROBOCOIN_TRAIN_EPISODES), - *_scale_dataset_weights(_ROBOMIND_FULL_DATA.datasets, _ROBOMIND_FULL_EPISODES), - ) + datasets=_drop_excluded_and_renormalize( + ( + *_scale_dataset_weights(_AGIBOT_DATA.datasets, _AGIBOT_TRAIN_EPISODES), + *_scale_dataset_weights(_DROID_DATA.datasets, _DROID_TRAIN_EPISODES), + *_scale_dataset_weights(_EGOVERSE_FULL_DATA.datasets, _EGOVERSE_FULL_TRAIN_EPISODES), + *_scale_dataset_weights(_PIPER30_DATA.datasets, _PIPER30_TRAIN_EPISODES), + *_scale_dataset_weights(_ROBOCOIN_DATA.datasets, _ROBOCOIN_TRAIN_EPISODES), + *_scale_dataset_weights(_ROBOMIND_FULL_DATA.datasets, _ROBOMIND_FULL_EPISODES), ) ), ) +_UNIFIED_PI05_MODEL = pi0_config.Pi0Config( + pi05=True, + action_dim=cotrain_action_space.UNIFIED_ACTION_DIM, + max_token_len=384, +) +_PI05_BASE_SHAPE_SAFE_LOADER = cotrain_weight_loaders.ShapeSafeCheckpointWeightLoader( + params_path="gs://openpi-assets/checkpoints/pi05_base/params", +) + + _PIPER30_ONLY_PI05 = CotrainTrainConfig( name="cotrain_piper30_only", - model=pi0_config.Pi0Config(pi05=True), + model=_UNIFIED_PI05_MODEL, data=_PIPER30_DATA, # Fine-tune from the trained pi05 VLA checkpoint. This is the selected start point. # Public openpi checkpoint; includes the PaliGemma backbone plus the trained pi05 action expert. - weight_loader=weight_loaders.CheckpointWeightLoader("gs://openpi-assets/checkpoints/pi05_base/params"), + weight_loader=_PI05_BASE_SHAPE_SAFE_LOADER, batch_size=32, num_train_steps=30_000, log_interval=100, @@ -767,9 +774,9 @@ def _attach_unified_action_specs(datasets: tuple[CotrainRLDSDataset, ...]): _DROID_ONLY_PI05 = CotrainTrainConfig( name="cotrain_droid", - model=pi0_config.Pi0Config(pi05=True), + model=_UNIFIED_PI05_MODEL, data=_DROID_DATA, - weight_loader=weight_loaders.CheckpointWeightLoader("gs://openpi-assets/checkpoints/pi05_base/params"), + weight_loader=_PI05_BASE_SHAPE_SAFE_LOADER, batch_size=32, num_train_steps=30_000, log_interval=100, @@ -782,9 +789,9 @@ def _attach_unified_action_specs(datasets: tuple[CotrainRLDSDataset, ...]): _AGIBOT_ONLY_PI05 = CotrainTrainConfig( name="cotrain_agibot", - model=pi0_config.Pi0Config(pi05=True), + model=_UNIFIED_PI05_MODEL, data=_AGIBOT_DATA, - weight_loader=weight_loaders.CheckpointWeightLoader("gs://openpi-assets/checkpoints/pi05_base/params"), + weight_loader=_PI05_BASE_SHAPE_SAFE_LOADER, batch_size=32, num_train_steps=30_000, log_interval=100, @@ -797,9 +804,9 @@ def _attach_unified_action_specs(datasets: tuple[CotrainRLDSDataset, ...]): _EGOVERSE_FULL_ONLY_PI05 = CotrainTrainConfig( name="cotrain_egoverse_full", - model=pi0_config.Pi0Config(pi05=True), + model=_UNIFIED_PI05_MODEL, data=_EGOVERSE_FULL_DATA, - weight_loader=weight_loaders.CheckpointWeightLoader("gs://openpi-assets/checkpoints/pi05_base/params"), + weight_loader=_PI05_BASE_SHAPE_SAFE_LOADER, batch_size=32, num_train_steps=30_000, log_interval=100, @@ -812,14 +819,9 @@ def _attach_unified_action_specs(datasets: tuple[CotrainRLDSDataset, ...]): _ROBOCOIN_ONLY_PI05 = CotrainTrainConfig( name="cotrain_robocoin", - # RoboCOIN_full includes many robot schemas. We crop each raw state/action to its named, - # action-aligned proprio/action coordinates, then pad to a common model width. The widest - # effective schema is Leju at 54 dims, so 64 is enough with headroom. - model=pi0_config.Pi0Config(pi05=True, action_dim=64, max_token_len=384), + model=_UNIFIED_PI05_MODEL, data=_ROBOCOIN_DATA, - # A 64-wide action/state head is not shape-compatible with pi05_base. Load the PaliGemma - # VLM backbone and leave the action expert randomly initialized, matching the old widened - # RoboCOIN-style setup. + # Load the PaliGemma VLM backbone and leave the unified 80D action expert randomly initialized. weight_loader=cotrain_weight_loaders.LocalPaliGemmaWeightLoader( npz_path="/mnt/data/cache/openpi/vertex-model-garden-paligemma-us/paligemma/pt_224.npz" ), @@ -835,8 +837,7 @@ def _attach_unified_action_specs(datasets: tuple[CotrainRLDSDataset, ...]): _ROBOMIND_FULL_ONLY_PI05 = CotrainTrainConfig( name="cotrain_robomind_full", - # RoboMIND_full reaches 38 native action/state dims, so pad to a 64-wide head. - model=pi0_config.Pi0Config(pi05=True, action_dim=64, max_token_len=384), + model=_UNIFIED_PI05_MODEL, data=_ROBOMIND_FULL_DATA, weight_loader=cotrain_weight_loaders.LocalPaliGemmaWeightLoader( npz_path="/mnt/data/cache/openpi/vertex-model-garden-paligemma-us/paligemma/pt_224.npz" @@ -853,14 +854,12 @@ def _attach_unified_action_specs(datasets: tuple[CotrainRLDSDataset, ...]): _FULL_ALL_PI05 = CotrainTrainConfig( name="cotrain_full_all", - model=pi0_config.Pi0Config(pi05=True, action_dim=cotrain_action_space.UNIFIED_ACTION_DIM, max_token_len=384), + model=_UNIFIED_PI05_MODEL, data=_FULL_ALL_DATA, # Initialize from pi05_base for consistency with the piper30-only reproduction. The widened # 80D action projection/head is not shape-compatible with pi05_base's 32D head, # so the shape-safe loader skips only those mismatched keys and keeps their random init. - weight_loader=cotrain_weight_loaders.ShapeSafeCheckpointWeightLoader( - params_path="gs://openpi-assets/checkpoints/pi05_base/params", - ), + weight_loader=_PI05_BASE_SHAPE_SAFE_LOADER, lr_schedule=_optimizer.CosineDecaySchedule( warmup_steps=10_000, peak_lr=1.0e-6, diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py new file mode 100644 index 0000000..ed750e4 --- /dev/null +++ b/tests/cotrain/test_unified_config.py @@ -0,0 +1,29 @@ +import dataclasses + +import pytest + +from openpi.cotrain import action_space +from openpi.cotrain import config +from openpi.cotrain.rlds_dataset import CotrainRLDSDataset + + +def test_all_registered_cotrain_configs_resolve_to_unified_80d() -> None: + for train_config in config._COTRAIN_CONFIGS: + assert train_config.model.action_dim == action_space.UNIFIED_ACTION_DIM + datasets = config._resolve_unified_datasets(train_config.data.datasets, train_config.model) + assert datasets + assert all( + dataset.unified_action_spec is action_space.UNIFIED_ACTION_SPECS[dataset.uid] for dataset in datasets + ) + + +def test_cotrain_rejects_non_80d_model() -> None: + model = dataclasses.replace(config._UNIFIED_PI05_MODEL, action_dim=32) + with pytest.raises(ValueError, match="require action_dim=80"): + config._resolve_unified_datasets(config._PIPER30_DATA.datasets, model) + + +def test_cotrain_rejects_dataset_without_mapping() -> None: + dataset = CotrainRLDSDataset(name="new_builder", dataset_id="new_builder", version="1.0.0", weight=1.0) + with pytest.raises(ValueError, match="no registered unified 80D action mapping"): + config._resolve_unified_datasets((dataset,), config._UNIFIED_PI05_MODEL) From 30c240e672ecccec13666e00b2d5731c167dc6e8 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Wed, 15 Jul 2026 20:36:52 +0800 Subject: [PATCH 08/64] move to baiducloud and add docs --- docs/vla_data_audit_report.md | 57 ++++++++++++++++++ ...5\347\273\203\350\267\221\351\200\232.pdf" | Bin 0 -> 795396 bytes 2 files changed, 57 insertions(+) create mode 100644 docs/vla_data_audit_report.md create mode 100644 "docs/wudi\345\267\245\344\275\234\344\272\244\346\216\2450705_aliyun\345\244\232\345\215\241\350\256\255\347\273\203\350\267\221\351\200\232.pdf" diff --git a/docs/vla_data_audit_report.md b/docs/vla_data_audit_report.md new file mode 100644 index 0000000..bdae94c --- /dev/null +++ b/docs/vla_data_audit_report.md @@ -0,0 +1,57 @@ +# VLA RLDS 数据迁移与读取审计报告 + +审计时间:2026-07-15(UTC) +数据目录:`/mnt/bos/bo23lu` +挂载类型:`fuse.bosfs2`,只读 + +## 结论 + +当前未发现缺失分片、截断文件、无效 JSON、TFRecord CRC 错误或损坏图片。数据的结构、迁移清单和代表性内容均通过检查,可以进入训练前集成测试。 + +当前审计容器没有 TensorFlow/TFDS,且临时下载 TensorFlow 时代理长时间无进展,因此没有在该容器中完成 `tfds.builder_from_directory(...).as_dataset(...)` 的原生 TensorFlow 路径测试。独立解析已经确认样本是合法的 `tf.train.Example`,并成功解码真实图像;训练环境仍需安装与数据生成端兼容的 TensorFlow/TFDS。 + +## 全量结构与迁移检查 + +- 总文件数:84,056 +- 总字节数:46,038,503,225,764(约 46.04 TB) +- TFDS 数据集:49 +- split:147 +- episode:409,543 +- TFRecord 分片:83,876 +- TFRecord 字节数:46,038,442,755,911 +- JSON:98,全部可解析 +- 空文件、不可读文件、断裂软链接:0 +- 分片缺号、重复号、`-of-N` 数量错误:0 +- `dataset_info.json` 与实际 split/分片数量不一致:0 + +`dataset_info.json` 声明的 payload 总量为 46,038,436,203,223 字节,实际 TFRecord 比它多 6,552,688 字节;差值恰好等于 409,543 个 record × 16 字节 TFRecord framing,因此一致。 + +迁移报告共 83,731 条:83,727 条 `transferred`、4 条 `skipped`。其中 251 条目录、83,480 条文件;83,480 个文件逐个存在且大小完全一致,总计 45,918,241,899,817 字节。4 条 `skipped` 均为目标端已存在且源/目标大小与修改时间相同,并非漏传。 + +当前目录比迁移清单包含更多后续数据;这些额外数据也已包含在完整分片结构检查中。 + +## 内容与图片检查 + +- 每个数据集选择一个完整 TFRecord 分片,共 49 个分片、1,977,280,127 字节。 +- 所选分片逐 record 校验 TFRecord length CRC32C 和 payload CRC32C,49/49 通过。 +- 每个数据集解析至少一个完整 `tf.train.Example`,49/49 通过。 +- 从样本中识别并完整解码 JPEG 29,146 张,失败 0。 +- 覆盖分辨率包括 320×180、640×360、640×368、640×480、848×480、1280×720。 + +边界:CRC 和图片内容检查是覆盖所有 49 个数据集的代表性抽样,不是对 46 TB 的全量逐字节扫描。全量结构、文件大小和分片连续性检查已经覆盖所有文件。若要求对静默 bit rot 给出绝对保证,需要后台运行全量 CRC/源端 checksum 比对,预计是数十小时级任务。 + +## I/O 性能 + +使用未用于 CRC 抽样的大 TFRecord 分片测试: + +| 模式 | 并发 | 吞吐 | 请求速率 | 估算平均请求耗时 | +|---|---:|---:|---:|---:| +| 顺序读取,每对象前 256 MiB | 1 | 375.5 MB/s | 1.40 ops/s | 715 ms | +| 顺序读取,每对象前 256 MiB | 4 | 800.1 MB/s | 2.98 ops/s | 1,342 ms | +| 顺序读取,每对象前 256 MiB | 8 | 962.1 MB/s | 3.58 ops/s | 2,232 ms | +| 随机范围读取,4 MiB | 8 | 130.1 MB/s | 31.0 ops/s | 258 ms | +| 随机范围读取,64 KiB | 8 | 12.5 MB/s | 190.7 ops/s | 42 ms | + +结论:顺序读取并配合 4–8 个并行 reader 时,挂载吞吐较好;小块随机读取性能很差,会成为瓶颈。训练应按 shard/episode 粒度 shuffle,在 shard 内顺序读取,并使用并行 interleave 和 prefetch。避免按 frame 对远端文件做随机 seek。多机或多 GPU 的总需求若接近 1 GB/s,应增加本地 NVMe 缓存或先将热点 shard staging 到本地盘。 + + diff --git "a/docs/wudi\345\267\245\344\275\234\344\272\244\346\216\2450705_aliyun\345\244\232\345\215\241\350\256\255\347\273\203\350\267\221\351\200\232.pdf" "b/docs/wudi\345\267\245\344\275\234\344\272\244\346\216\2450705_aliyun\345\244\232\345\215\241\350\256\255\347\273\203\350\267\221\351\200\232.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..7bccec14e64ed160de3642b225b4f7553da3e496 GIT binary patch literal 795396 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

03$5#1W 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 z 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

-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 A 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ΠFwU>r<&fb(7nN3iwOUapg6Mgtgf!jHp?W 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 literal 0 HcmV?d00001 From ab4f99d3a23c6df2d21c1dfc65642e5636718ea8 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Thu, 16 Jul 2026 15:18:21 +0800 Subject: [PATCH 09/64] env config --- docs/new_host_environment.md | 61 +++++++++++++++++++ scripts/atom0_env.sh | 38 ++++++++++++ ...otrain_full_all_full_norm_local_weights.sh | 8 ++- 3 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 docs/new_host_environment.md create mode 100755 scripts/atom0_env.sh diff --git a/docs/new_host_environment.md b/docs/new_host_environment.md new file mode 100644 index 0000000..890ef47 --- /dev/null +++ b/docs/new_host_environment.md @@ -0,0 +1,61 @@ +# Atom-0 new-host environment + +The repository environment is installed in `.venv` with Python 3.11. The full +RLDS dependency group is included. + +Load the host-local paths before running commands: + +```bash +cd /data/wudi/Atom-0 +source scripts/atom0_env.sh +``` + +The defaults are: + +- RLDS root: `/data/wudi/data/RLDS` +- OpenPI model/cache root: `/data/wudi/cache/openpi` +- pi05 parameters: `/data/wudi/cache/openpi/openpi-assets/checkpoints/pi05_base/params` +- Hugging Face cache: `/data/wudi/cache/huggingface` +- XDG/JAX cache: `/data/wudi/.cache` +- Logs: `/data/wudi/Atom-0/logs` + +Override any of `ATOM0_STATE_ROOT`, `RLDS_DATA_DIR`, `OPENPI_DATA_HOME`, +`PARAMS_PATH`, `HF_HOME`, or `LOG_DIR` before sourcing the script if storage is +mounted elsewhere. + +Verify the environment: + +```bash +UV_CACHE_DIR=/data/wudi/.cache/uv \ +UV_PYTHON_INSTALL_DIR=/data/wudi/.local/share/uv/python \ +UV_LINK_MODE=copy \ +uv sync --offline --group rlds + +.venv/bin/python -c 'import jax, torch, tensorflow; print(jax.devices()); print(torch.cuda.device_count())' +.venv/bin/pytest -q tests/cotrain +``` + +Before training, the RLDS tree and the pi05 checkpoint must exist at the paths +printed by `source scripts/atom0_env.sh`. Set a fresh W&B key in the shell; do +not store it in this repository. + +The training container must also expose the NVIDIA device nodes (at minimum +`/dev/nvidiactl`, the assigned `/dev/nvidiaN`, and `/dev/nvidia-uvm`). If +`nvidia-smi` cannot communicate with the driver or `jax.devices()` only lists a +CPU, fix the container/Kubernetes GPU allocation before launching training; a +Python package reinstall cannot create that device assignment. + +Eight-GPU training (the wrapper validates the checkpoint before starting): + +```bash +source scripts/atom0_env.sh +export WANDB_API_KEY='...' +FSDP_DEVICES=8 BATCH_SIZE=256 NUM_TRAIN_STEPS=36000 \ +EXP_NAME=cotrain_full_all_full_norm_8gpus \ +bash scripts/train_cotrain_full_all_full_norm_local_weights.sh +``` + +For a 16-GPU, two-node job, keep `FSDP_DEVICES=8`, use a global batch size of +512, and provide the launcher variables (`RANK`, `WORLD_SIZE`, `MASTER_ADDR`, +and `MASTER_PORT`). `scripts/train_cotrain.py` initializes JAX distributed mode +from those variables. diff --git a/scripts/atom0_env.sh b/scripts/atom0_env.sh new file mode 100755 index 0000000..5a0e56c --- /dev/null +++ b/scripts/atom0_env.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +# Source this file before running Atom-0 commands on the new host: +# source scripts/atom0_env.sh + +if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then + echo "This script must be sourced: source scripts/atom0_env.sh" >&2 + exit 1 +fi + +ATOM0_REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ATOM0_STATE_ROOT="${ATOM0_STATE_ROOT:-$(dirname "${ATOM0_REPO_DIR}")}" + +export UV_CACHE_DIR="${UV_CACHE_DIR:-${ATOM0_STATE_ROOT}/.cache/uv}" +export UV_PYTHON_INSTALL_DIR="${UV_PYTHON_INSTALL_DIR:-${ATOM0_STATE_ROOT}/.local/share/uv/python}" +export UV_LINK_MODE="${UV_LINK_MODE:-copy}" +export XDG_CACHE_HOME="${XDG_CACHE_HOME:-${ATOM0_STATE_ROOT}/.cache}" +export JAX_COMPILATION_CACHE_DIR="${JAX_COMPILATION_CACHE_DIR:-${XDG_CACHE_HOME}/jax}" +export PYTHONPATH="${ATOM0_REPO_DIR}/src:${ATOM0_REPO_DIR}/packages/openpi-client/src:${PYTHONPATH:-}" + +export HF_HOME="${HF_HOME:-${ATOM0_STATE_ROOT}/cache/huggingface}" +export OPENPI_DATA_HOME="${OPENPI_DATA_HOME:-${ATOM0_STATE_ROOT}/cache/openpi}" +export RLDS_DATA_DIR="${RLDS_DATA_DIR:-${ATOM0_STATE_ROOT}/data/RLDS}" +export PARAMS_PATH="${PARAMS_PATH:-${OPENPI_DATA_HOME}/openpi-assets/checkpoints/pi05_base/params}" +export LOG_DIR="${LOG_DIR:-${ATOM0_REPO_DIR}/logs}" + +export XLA_PYTHON_CLIENT_MEM_FRACTION="${XLA_PYTHON_CLIENT_MEM_FRACTION:-0.9}" +export TF_CPP_MIN_LOG_LEVEL="${TF_CPP_MIN_LOG_LEVEL:-1}" + +mkdir -p "${HF_HOME}" "${OPENPI_DATA_HOME}" "${JAX_COMPILATION_CACHE_DIR}" "${LOG_DIR}" + +if [[ -n "${MASTER_ADDR:-}" && -z "${JAX_COORDINATOR_ADDRESS:-}" ]]; then + export JAX_COORDINATOR_ADDRESS="${MASTER_ADDR}:29500" +fi + +echo "Atom-0 environment loaded from ${ATOM0_REPO_DIR}" +echo "RLDS_DATA_DIR=${RLDS_DATA_DIR}" +echo "PARAMS_PATH=${PARAMS_PATH}" diff --git a/scripts/train_cotrain_full_all_full_norm_local_weights.sh b/scripts/train_cotrain_full_all_full_norm_local_weights.sh index 1a12d1d..8aac5c4 100755 --- a/scripts/train_cotrain_full_all_full_norm_local_weights.sh +++ b/scripts/train_cotrain_full_all_full_norm_local_weights.sh @@ -2,7 +2,10 @@ set -euo pipefail REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -PARAMS_PATH="${PARAMS_PATH:-/mnt/workspace/cache/openpi/openpi-assets/checkpoints/pi05_base/params}" +STATE_ROOT="${ATOM0_STATE_ROOT:-$(dirname "${REPO_DIR}")}" +OPENPI_DATA_HOME="${OPENPI_DATA_HOME:-${STATE_ROOT}/cache/openpi}" +PARAMS_PATH="${PARAMS_PATH:-${OPENPI_DATA_HOME}/openpi-assets/checkpoints/pi05_base/params}" +RLDS_DATA_DIR="${RLDS_DATA_DIR:-${STATE_ROOT}/data/RLDS}" LOG_DIR="${LOG_DIR:-${REPO_DIR}}" RANK_ID="${RANK:-0}" @@ -16,7 +19,7 @@ fi cd "${REPO_DIR}" export PYTHONPATH="${REPO_DIR}/src:${REPO_DIR}/packages/openpi-client/src:${PYTHONPATH:-}" -export OPENPI_DATA_HOME="${OPENPI_DATA_HOME:-/mnt/workspace/cache/openpi}" +export OPENPI_DATA_HOME export XLA_PYTHON_CLIENT_MEM_FRACTION="${XLA_PYTHON_CLIENT_MEM_FRACTION:-0.9}" if [[ -z "${JAX_COORDINATOR_ADDRESS:-}" && -n "${MASTER_ADDR:-}" ]]; then @@ -30,6 +33,7 @@ fi --num-train-steps "${NUM_TRAIN_STEPS:-3000000}" \ --data-num-parallel-reads "${DATA_NUM_PARALLEL_READS:-1}" \ --data-num-parallel-calls "${DATA_NUM_PARALLEL_CALLS:-2}" \ + --data.rlds-data-dir "${RLDS_DATA_DIR}" \ --weight-loader.params-path "${PARAMS_PATH}" \ --overwrite \ 2>&1 | tee "${LOG_DIR}/dlc_run_16gpu_local_weights_${RANK_ID}.log" From ef6fd8bc7c104568799989fb380260f53e1f3f75 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Thu, 16 Jul 2026 21:23:43 +0800 Subject: [PATCH 10/64] prepare for baiducloud training --- docs/cotrain_real_data_configs.md | 214 ++++++++++++++++++ docs/new_host_environment.md | 27 ++- ...72\351\227\264\350\256\276\350\256\241.md" | 12 +- scripts/atom0_env.sh | 7 +- scripts/audit_rlds_action_metadata.py | 2 +- scripts/audit_unified_action_space.py | 4 +- .../compute_cotrain_full_norm_stats_light.py | 6 +- scripts/compute_cotrain_norm_stats_light.py | 19 +- ...otrain_full_all_full_norm_local_weights.sh | 6 +- src/openpi/cotrain/action_space.py | 1 + src/openpi/cotrain/config.py | 90 +++++++- src/openpi/cotrain/rlds_dataset.py | 40 ++++ tests/cotrain/test_action_space.py | 21 +- tests/cotrain/test_unified_config.py | 15 ++ 14 files changed, 439 insertions(+), 25 deletions(-) create mode 100644 docs/cotrain_real_data_configs.md diff --git a/docs/cotrain_real_data_configs.md b/docs/cotrain_real_data_configs.md new file mode 100644 index 0000000..3e69580 --- /dev/null +++ b/docs/cotrain_real_data_configs.md @@ -0,0 +1,214 @@ +# 真机与 Robot 数据训练配置 + +本文说明两套新增的 80D 统一动作空间训练配置: + +| 配置名 | 数据组成 | +| --- | --- | +| `cotrain_real_only` | 原真机 `piper30` + 新真机 `piper2` | +| `cotrain_real_robot` | 上述两份真机数据 + AgiBot + DROID + RoboCOIN + RoboMIND_full;不包含 EgoVerse | + +`cotrain_real_robot` 延续现有 `cotrain_full_all` 的数据质量选择,仍排除 +`robocoin_unitree_g1_dex3_s28_a28` 和 `robomind_tienkung_sim_s38_a38`。两套配置均按 train +episode 数量设置采样权重。`piper2` 默认按 902 个 train episode 计算;若训练机上的 builder +数量不同,必须通过环境变量覆盖。 + +## 1. 数据路径 + +训练进程启动前设置以下环境变量。`REALWORLD_PIPER_2_BUILDER_DIR` 必须指向直接包含 +`dataset_info.json` 和 `features.json` 的 TFDS version 目录。 + +```bash +cd /data/wudi/Atom-0 + +export RLDS_DATA_DIR=/mnt/bos/bo23lu +export REALWORLD_PIPER_2_BUILDER_DIR=/mnt/bos/bo23lu/realworld_piper_2/realworld_piper_infidata/1.0.0 +export REALWORLD_PIPER_2_TRAIN_EPISODES=902 + +test -f "${REALWORLD_PIPER_2_BUILDER_DIR}/dataset_info.json" +test -f "${REALWORLD_PIPER_2_BUILDER_DIR}/features.json" +``` + +当前训练机已经按上述结构整理数据。若其他训练机的 RLDS 根目录不同,只需让 +`REALWORLD_PIPER_2_BUILDER_DIR` 指向实际的 `...//` 目录,不需要修改代码。 + +新数据使用独立 id `piper2`,其 14D state/action 布局为: + +```text +left_joint_1..6, left_gripper, right_joint_1..6, right_gripper +``` + +它映射到统一空间的 `U1-U6, U17, U30-U35, U46`。手臂 target 转成相对当前 state 的 +delta,两个 gripper 保持 absolute。 + +该映射经过实际数据检查:builder metadata 和 train/seen/unseen 抽样均给出相同的左右臂字段 +顺序;在一个 949 帧真实 train episode 中,全部 948 个相邻 transition、全部 14 个维度都满足 +`action[t] == state[t+1]`,最大误差为 0。因此这里的 action 是 next-step absolute target,不能 +当作源数据已经提供的 delta 再使用。 + +## 2. 计算 norm stats + +每套训练配置使用独立的 assets 目录。首次训练前必须先计算全部 active dataset 的 80D norm +stats。下面的命令会跳过目标目录中已有且带 full-run metadata 的数据集;需要强制重算时增加 +`--overwrite`。 + +### 2.1 仅真机数据 + +```bash +RLDS_DATA_DIR="${RLDS_DATA_DIR}" \ +REALWORLD_PIPER_2_BUILDER_DIR="${REALWORLD_PIPER_2_BUILDER_DIR}" \ +REALWORLD_PIPER_2_TRAIN_EPISODES="${REALWORLD_PIPER_2_TRAIN_EPISODES}" \ +UV_CACHE_DIR=/data/wudi/.cache/uv \ +uv run --group rlds python scripts/compute_cotrain_full_norm_stats_light.py \ + --config-name cotrain_real_only \ + --output-assets-dir /data/wudi/Atom-0/assets/cotrain_real_only \ + --num-parallel-reads 1 \ + --num-parallel-calls 2 \ + --overwrite +``` + +### 2.2 真机 + Robot 数据,不含 EgoVerse + +```bash +RLDS_DATA_DIR="${RLDS_DATA_DIR}" \ +REALWORLD_PIPER_2_BUILDER_DIR="${REALWORLD_PIPER_2_BUILDER_DIR}" \ +REALWORLD_PIPER_2_TRAIN_EPISODES="${REALWORLD_PIPER_2_TRAIN_EPISODES}" \ +UV_CACHE_DIR=/data/wudi/.cache/uv \ +uv run --group rlds python scripts/compute_cotrain_full_norm_stats_light.py \ + --config-name cotrain_real_robot \ + --output-assets-dir /data/wudi/Atom-0/assets/cotrain_real_robot \ + --num-parallel-reads 1 \ + --num-parallel-calls 2 \ + --overwrite +``` + +如果两套配置都要训练,推荐先运行 2.2。norm stats 是逐 dataset 计算的,与 mixture 采样权重无关, +因此 `piper30` 和 `piper2` 可以无损复用到 `cotrain_real_only`,不必再次扫描两份真机数据: + +```bash +mkdir -p \ + /data/wudi/Atom-0/assets/cotrain_real_only/piper30 \ + /data/wudi/Atom-0/assets/cotrain_real_only/piper2 + +cp -a /data/wudi/Atom-0/assets/cotrain_real_robot/piper30/. \ + /data/wudi/Atom-0/assets/cotrain_real_only/piper30/ +cp -a /data/wudi/Atom-0/assets/cotrain_real_robot/piper2/. \ + /data/wudi/Atom-0/assets/cotrain_real_only/piper2/ +``` + +计算完成后,每个 dataset 子目录都应同时包含: + +```text +norm_stats.json +norm_stats_meta.json +unified_action_space.json +``` + +## 3. 启动训练 + +下面以本地 `pi05_base` 参数为例。`--batch-size` 是全局 batch size;多机任务中的所有进程必须 +使用相同的环境变量和命令参数。 + +```bash +export PARAMS_PATH=/data/models/openpi/openpi-assets/checkpoints/pi05_base/params +export WANDB_API_KEY='...' +export XLA_PYTHON_CLIENT_MEM_FRACTION=0.9 +``` + +### 3.1 仅真机数据 + +```bash +UV_CACHE_DIR=/data/wudi/.cache/uv \ +uv run --group rlds python -u scripts/train_cotrain.py cotrain_real_only \ + --exp-name=cotrain_real_only_run1 \ + --fsdp-devices=8 \ + --batch-size=256 \ + --num-train-steps=3000000 \ + --data-num-parallel-reads=1 \ + --data-num-parallel-calls=2 \ + --weight-loader.params-path="${PARAMS_PATH}" +``` + +### 3.2 真机 + Robot 数据,不含 EgoVerse + +```bash +UV_CACHE_DIR=/data/wudi/.cache/uv \ +uv run --group rlds python -u scripts/train_cotrain.py cotrain_real_robot \ + --exp-name=cotrain_real_robot_run1 \ + --fsdp-devices=8 \ + --batch-size=256 \ + --num-train-steps=3000000 \ + --data-num-parallel-reads=1 \ + --data-num-parallel-calls=2 \ + --weight-loader.params-path="${PARAMS_PATH}" +``` + +单机 GPU 数量不同时相应修改 `--fsdp-devices` 和全局 `--batch-size`。多机启动继续使用项目已有的 +`RANK`、`WORLD_SIZE`、`MASTER_ADDR`、`MASTER_PORT` 环境变量;训练入口会据此初始化 JAX distributed。 + +## 4. 启动前检查配置组成 + +```bash +UV_CACHE_DIR=/data/wudi/.cache/uv uv run python - <<'PY' +from openpi.cotrain import config + +for name in ("cotrain_real_only", "cotrain_real_robot"): + cfg = config.get_config(name) + ids = [dataset.uid for dataset in cfg.data.datasets] + print(name, len(ids), ids) + assert "piper2" in ids + assert not any(dataset_id.startswith("egoverse_") for dataset_id in ids) +PY +``` + +预期 `cotrain_real_only` 有 2 个 dataset,`cotrain_real_robot` 有 37 个 active dataset。 + +## 5. 检查 norm 与统一动作空间 + +完成计算或复制后运行: + +```bash +UV_CACHE_DIR=/data/wudi/.cache/uv uv run python - <<'PY' +from pathlib import Path + +import numpy as np + +from openpi.cotrain import action_space, config +from openpi.shared import normalize + + +def check(config_name: str) -> None: + cfg = config.get_config(config_name) + root = Path("assets") / config_name + for dataset in cfg.data.datasets: + directory = root / dataset.uid + spec = action_space.UNIFIED_ACTION_SPECS[dataset.uid] + stats = normalize.load(directory) + action_space.validate_metadata(directory, spec) + assert (directory / "norm_stats_meta.json").is_file(), directory + + state_mask = np.zeros(action_space.UNIFIED_ACTION_DIM, dtype=bool) + state_mask[list(spec.state_target_slots)] = True + for key, mask in (("state", state_mask), ("actions", np.asarray(spec.action_mask))): + value = stats[key] + for field in ("mean", "std", "q01", "q99"): + array = np.asarray(getattr(value, field)) + assert array.shape == (action_space.UNIFIED_ACTION_DIM,), (dataset.uid, key, field) + assert np.isfinite(array).all(), (dataset.uid, key, field) + assert np.allclose(np.asarray(value.mean)[~mask], 0) + assert np.allclose(np.asarray(value.std)[~mask], 1) + assert np.allclose(np.asarray(value.q01)[~mask], -1) + assert np.allclose(np.asarray(value.q99)[~mask], 1) + print(f"PASS {config_name}: {len(cfg.data.datasets)} datasets") + + +check("cotrain_real_robot") +check("cotrain_real_only") +PY +``` + +预期输出: + +```text +PASS cotrain_real_robot: 37 datasets +PASS cotrain_real_only: 2 datasets +``` diff --git a/docs/new_host_environment.md b/docs/new_host_environment.md index 890ef47..7b516c8 100644 --- a/docs/new_host_environment.md +++ b/docs/new_host_environment.md @@ -12,16 +12,17 @@ source scripts/atom0_env.sh The defaults are: -- RLDS root: `/data/wudi/data/RLDS` -- OpenPI model/cache root: `/data/wudi/cache/openpi` -- pi05 parameters: `/data/wudi/cache/openpi/openpi-assets/checkpoints/pi05_base/params` +- RLDS root: `/mnt/bos/bo23lu` +- OpenPI runtime cache: `/data/wudi/cache/openpi` +- Shared OpenPI model root: `/data/models/openpi` +- pi05 parameters: `/data/models/openpi/openpi-assets/checkpoints/pi05_base/params` - Hugging Face cache: `/data/wudi/cache/huggingface` - XDG/JAX cache: `/data/wudi/.cache` - Logs: `/data/wudi/Atom-0/logs` Override any of `ATOM0_STATE_ROOT`, `RLDS_DATA_DIR`, `OPENPI_DATA_HOME`, -`PARAMS_PATH`, `HF_HOME`, or `LOG_DIR` before sourcing the script if storage is -mounted elsewhere. +`OPENPI_MODEL_HOME`, `PARAMS_PATH`, `HF_HOME`, or `LOG_DIR` before sourcing the +script if storage is mounted elsewhere. Verify the environment: @@ -39,6 +40,22 @@ Before training, the RLDS tree and the pi05 checkpoint must exist at the paths printed by `source scripts/atom0_env.sh`. Set a fresh W&B key in the shell; do not store it in this repository. +Download the pi05 base parameters into the path expected by the training +wrapper: + +```bash +source scripts/atom0_env.sh +OPENPI_DATA_HOME="${OPENPI_MODEL_HOME}" .venv/bin/python - <<'PY' +from openpi.shared.download import maybe_download + +path = maybe_download("gs://openpi-assets/checkpoints/pi05_base/params") +print(f"Downloaded pi05 parameters to: {path}") +PY + +test -f "${PARAMS_PATH}/_CHECKPOINT_METADATA" +test -f "${PARAMS_PATH}/manifest.ocdbt" +``` + The training container must also expose the NVIDIA device nodes (at minimum `/dev/nvidiactl`, the assigned `/dev/nvidiaN`, and `/dev/nvidia-uvm`). If `nvidia-smi` cannot communicate with the driver or `jax.devices()` only lists a diff --git "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241.md" "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241.md" index bd6a164..78be7c2 100644 --- "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241.md" +++ "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241.md" @@ -166,8 +166,11 @@ #### 4. 各数据集映射 -本节覆盖 `cotrain_full_all` 来源中的全部 43 个 builder。当前配置排除 +本节覆盖已注册的全部 44 个 builder(原 `cotrain_full_all` 的 43 个来源,加上第二批真机 +Piper 数据 `piper2`)。当前 `cotrain_full_all` 配置仍排除 `robocoin_unitree_g1_dex3_s28_a28` 和 `robomind_tienkung_sim_s38_a38`,仍保留其映射以便恢复使用。 +`piper2` 只加入新的 `cotrain_real_only` 和 `cotrain_real_robot` 配置,不改变既有 +`cotrain_full_all` 实验的数据组成。 ##### AgiBot、DROID、EgoVerse、Piper @@ -182,10 +185,15 @@ | `egoverse_mecka` | `a1-3` LE xyz,`a4-6` LE yaw/pitch/roll,`a7-9` RE xyz,`a10-12` RE yaw/pitch/roll | `a1-3 -> U8-10`; `a4-6 -> U11-13`; `a7-9 -> U37-39`; `a10-12 -> U40-42` | | `egoverse_scale` | `a1-3` LE xyz,`a4-6` LE yaw/pitch/roll,`a7-9` RE xyz,`a10-12` RE yaw/pitch/roll | `a1-3 -> U8-10`; `a4-6 -> U11-13`; `a7-9 -> U37-39`; `a10-12 -> U40-42` | | `piper30` | `a1-6` LJ,`a7` LG,`a8-13` RJ,`a14` RG | `a1-6 -> U1-6`; `a7 -> U17`; `a8-13 -> U30-35`; `a14 -> U46` | +| `piper2` | `a1-6` LJ,`a7` LG,`a8-13` RJ,`a14` RG | `a1-6 -> U1-6`; `a7 -> U17`; `a8-13 -> U30-35`; `a14 -> U46` | Piper 的 `action[t]` 是 next-step absolute target,joint 转换后为 -`state[t+1]-state[t]`;其他 absolute joint target 同样统一减当前 `state[t]`。 +`state[t+1]-state[t]`;其他 absolute joint target 同样统一减当前 `state[t]`。其中 `piper2` +已在实际 builder +`/mnt/bos/bo23lu/realworld_piper_2/realworld_piper_infidata/1.0.0` 上核验:一个 949 帧 train +episode 的全部 948 个相邻 transition、全部 14 维均精确满足 +`action[t] == state[t+1]`,并且 train/seen/unseen 的跨 shard metadata 抽查具有相同字段顺序。 ##### RoboCOIN diff --git a/scripts/atom0_env.sh b/scripts/atom0_env.sh index 5a0e56c..f1df8db 100755 --- a/scripts/atom0_env.sh +++ b/scripts/atom0_env.sh @@ -20,14 +20,15 @@ export PYTHONPATH="${ATOM0_REPO_DIR}/src:${ATOM0_REPO_DIR}/packages/openpi-clien export HF_HOME="${HF_HOME:-${ATOM0_STATE_ROOT}/cache/huggingface}" export OPENPI_DATA_HOME="${OPENPI_DATA_HOME:-${ATOM0_STATE_ROOT}/cache/openpi}" -export RLDS_DATA_DIR="${RLDS_DATA_DIR:-${ATOM0_STATE_ROOT}/data/RLDS}" -export PARAMS_PATH="${PARAMS_PATH:-${OPENPI_DATA_HOME}/openpi-assets/checkpoints/pi05_base/params}" +export OPENPI_MODEL_HOME="${OPENPI_MODEL_HOME:-/data/models/openpi}" +export RLDS_DATA_DIR="${RLDS_DATA_DIR:-/mnt/bos/bo23lu}" +export PARAMS_PATH="${PARAMS_PATH:-${OPENPI_MODEL_HOME}/openpi-assets/checkpoints/pi05_base/params}" export LOG_DIR="${LOG_DIR:-${ATOM0_REPO_DIR}/logs}" export XLA_PYTHON_CLIENT_MEM_FRACTION="${XLA_PYTHON_CLIENT_MEM_FRACTION:-0.9}" export TF_CPP_MIN_LOG_LEVEL="${TF_CPP_MIN_LOG_LEVEL:-1}" -mkdir -p "${HF_HOME}" "${OPENPI_DATA_HOME}" "${JAX_COMPILATION_CACHE_DIR}" "${LOG_DIR}" +mkdir -p "${HF_HOME}" "${OPENPI_DATA_HOME}" "${OPENPI_MODEL_HOME}" "${JAX_COMPILATION_CACHE_DIR}" "${LOG_DIR}" if [[ -n "${MASTER_ADDR:-}" && -z "${JAX_COORDINATOR_ADDRESS:-}" ]]; then export JAX_COORDINATOR_ADDRESS="${MASTER_ADDR}:29500" diff --git a/scripts/audit_rlds_action_metadata.py b/scripts/audit_rlds_action_metadata.py index 856807d..03dbafd 100644 --- a/scripts/audit_rlds_action_metadata.py +++ b/scripts/audit_rlds_action_metadata.py @@ -14,12 +14,12 @@ from pathlib import Path from typing import Any - DATASET_ROOTS = ( "AgiBot", "DROID", "EgoVerse_full", "realworld_piper", + "realworld_piper_2", "RoboCOIN", "RoboMIND_full", ) diff --git a/scripts/audit_unified_action_space.py b/scripts/audit_unified_action_space.py index 678a367..f52e358 100644 --- a/scripts/audit_unified_action_space.py +++ b/scripts/audit_unified_action_space.py @@ -24,6 +24,7 @@ def _configured_datasets(): config._DROID_DATA.datasets, config._EGOVERSE_FULL_DATA.datasets, config._PIPER30_DATA.datasets, + config._PIPER2_DATA.datasets, config._ROBOCOIN_DATA.datasets, config._ROBOMIND_FULL_DATA.datasets, ) @@ -34,7 +35,8 @@ def _configured_datasets(): extra = sorted(set(by_id) - set(action_space.UNIFIED_ACTION_SPECS)) raise ValueError(f"Config/spec registry mismatch: missing={missing}, extra={extra}") active_ids = {dataset.uid for dataset in config._FULL_ALL_DATA.datasets} - expected_active = set(by_id) - config._FULL_ALL_EXCLUDED_DATASET_IDS + # cotrain_full_all predates the second in-house Piper drop; the two new mixtures cover it. + expected_active = set(by_id) - config._FULL_ALL_EXCLUDED_DATASET_IDS - {"piper2"} if active_ids != expected_active or len(active_ids) != 41: raise ValueError( f"full-all active dataset mismatch: expected={sorted(expected_active)}, got={sorted(active_ids)}" diff --git a/scripts/compute_cotrain_full_norm_stats_light.py b/scripts/compute_cotrain_full_norm_stats_light.py index 536f3c5..7feaf9c 100644 --- a/scripts/compute_cotrain_full_norm_stats_light.py +++ b/scripts/compute_cotrain_full_norm_stats_light.py @@ -106,7 +106,10 @@ def main( config = cotrain_config.get_config(config_name) if rlds_data_dir is not None: config = dataclasses.replace(config, data=dataclasses.replace(config.data, rlds_data_dir=rlds_data_dir)) - data_config = config.data.create(Path(output_assets_dir), config.model) + # Norm computation needs only the resolved dataset mappings. Do not create the full + # training transforms here: that would preload existing norm files and could make + # --overwrite fail on exactly the stale mapping metadata it is meant to replace. + data_config = light._resolve_light_data_config(config) requested = _split_csv(dataset_id) skipped = _split_csv(skip_dataset_ids) @@ -160,6 +163,7 @@ def main( split_label="train", shuffle=False, repeat=False, + drop_remainder=False, num_parallel_reads=num_parallel_reads, num_parallel_calls=num_parallel_calls, ) diff --git a/scripts/compute_cotrain_norm_stats_light.py b/scripts/compute_cotrain_norm_stats_light.py index 3e2c08d..587e466 100644 --- a/scripts/compute_cotrain_norm_stats_light.py +++ b/scripts/compute_cotrain_norm_stats_light.py @@ -14,6 +14,7 @@ from itertools import islice import json from pathlib import Path +import tempfile import numpy as np import tqdm @@ -45,6 +46,7 @@ def _light_restructure(traj, dataset_id: str, restructure_name: str): "agibot", "robomind", "three_cam_task", + "piper2", "egoverse_eva", "egoverse_mecka", "egoverse_full", @@ -93,6 +95,7 @@ def _create_light_dataset( split_label: str = "train", shuffle: bool = False, repeat: bool | None = None, + drop_remainder: bool = True, num_parallel_reads: int = -1, num_parallel_calls: int = -1, ): @@ -187,11 +190,17 @@ def remove_filter(frame): dataset = dataset.map(remove_filter) - dataset = dataset.batch(batch_size, drop_remainder=True) + dataset = dataset.batch(batch_size, drop_remainder=drop_remainder) dataset = dataset.with_ram_budget(1) return dataset +def _resolve_light_data_config(config): + """Resolve unified mappings without loading tokenizer or any existing norm stats.""" + datasets = cotrain_config._resolve_unified_datasets(config.data.datasets, config.model) + return dataclasses.replace(config.data, datasets=datasets) + + def _state_actions_from_light_batch(batch: dict, dataset_cfg: cotrain_rlds_dataset.CotrainRLDSDataset): state = np.asarray(batch["state"]) state = state[:, -1] if state.ndim == 3 else state @@ -356,7 +365,13 @@ def main( config = dataclasses.replace(config, exp_name=exp_name) if rlds_data_dir is not None: config = dataclasses.replace(config, data=dataclasses.replace(config.data, rlds_data_dir=rlds_data_dir)) - data_config = config.data.create(config.assets_dirs, config.model) + if verify_against_old: + # The old pipeline needs the full transforms, but verification must not normalize + # with stale/existing stats. Build those transforms against a guaranteed-empty root. + with tempfile.TemporaryDirectory(prefix="cotrain-norm-verify-assets-") as empty_assets: + data_config = config.data.create(Path(empty_assets), config.model) + else: + data_config = _resolve_light_data_config(config) selected = [ds for ds in data_config.datasets if dataset_id is None or ds.uid == dataset_id] if not selected: diff --git a/scripts/train_cotrain_full_all_full_norm_local_weights.sh b/scripts/train_cotrain_full_all_full_norm_local_weights.sh index 8aac5c4..ec05634 100755 --- a/scripts/train_cotrain_full_all_full_norm_local_weights.sh +++ b/scripts/train_cotrain_full_all_full_norm_local_weights.sh @@ -4,8 +4,9 @@ set -euo pipefail REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" STATE_ROOT="${ATOM0_STATE_ROOT:-$(dirname "${REPO_DIR}")}" OPENPI_DATA_HOME="${OPENPI_DATA_HOME:-${STATE_ROOT}/cache/openpi}" -PARAMS_PATH="${PARAMS_PATH:-${OPENPI_DATA_HOME}/openpi-assets/checkpoints/pi05_base/params}" -RLDS_DATA_DIR="${RLDS_DATA_DIR:-${STATE_ROOT}/data/RLDS}" +OPENPI_MODEL_HOME="${OPENPI_MODEL_HOME:-/data/models/openpi}" +PARAMS_PATH="${PARAMS_PATH:-${OPENPI_MODEL_HOME}/openpi-assets/checkpoints/pi05_base/params}" +RLDS_DATA_DIR="${RLDS_DATA_DIR:-/mnt/bos/bo23lu}" LOG_DIR="${LOG_DIR:-${REPO_DIR}}" RANK_ID="${RANK:-0}" @@ -20,6 +21,7 @@ cd "${REPO_DIR}" export PYTHONPATH="${REPO_DIR}/src:${REPO_DIR}/packages/openpi-client/src:${PYTHONPATH:-}" export OPENPI_DATA_HOME +export OPENPI_MODEL_HOME export XLA_PYTHON_CLIENT_MEM_FRACTION="${XLA_PYTHON_CLIENT_MEM_FRACTION:-0.9}" if [[ -z "${JAX_COORDINATOR_ADDRESS:-}" && -n "${MASTER_ADDR:-}" ]]; then diff --git a/src/openpi/cotrain/action_space.py b/src/openpi/cotrain/action_space.py index e6cc85d..e225f4b 100644 --- a/src/openpi/cotrain/action_space.py +++ b/src/openpi/cotrain/action_space.py @@ -262,6 +262,7 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct "egoverse_mecka": _same(_EGO_MAPPING), "egoverse_scale": _same(_EGO_MAPPING), "piper30": _same(_PIPER_MAPPING, delta=slots(LEFT_ARM, 6) + slots(RIGHT_ARM, 6)), + "piper2": _same(_PIPER_MAPPING, delta=slots(LEFT_ARM, 6) + slots(RIGHT_ARM, 6)), } diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index dd32bee..5735e57 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -8,6 +8,7 @@ import dataclasses import logging +import os import pathlib from typing import Literal @@ -180,20 +181,33 @@ class CotrainTrainConfig(_config.TrainConfig): # 32D projection/head, so checkpoint-start configs use the shape-safe loader and randomly # initialize only parameters whose shapes changed. +_RLDS_ROOT = os.environ.get("RLDS_DATA_DIR", "/mnt/bos/bo23lu") + _PIPER30_ROOT = ( - "/mnt/data/RLDS/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist" + f"{_RLDS_ROOT}/realworld_piper/" + "piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist" ) _PIPER30_BUILDER_DIR = f"{_PIPER30_ROOT}/realworld_piper_infidata/1.0.0" _PIPER30_TRAIN_EPISODES = 5_307 -_DROID_ROOT = "/mnt/data/RLDS/DROID" +# Second in-house Piper RLDS drop. Its on-host builder was audited at +# /mnt/bos/bo23lu/realworld_piper_2/realworld_piper_infidata/1.0.0. Keep an override for +# hosts whose RLDS root is mounted elsewhere. +_PIPER2_ROOT = f"{_RLDS_ROOT}/realworld_piper_2" +_PIPER2_BUILDER_DIR = os.environ.get( + "REALWORLD_PIPER_2_BUILDER_DIR", + f"{_PIPER2_ROOT}/realworld_piper_infidata/1.0.0", +) +_PIPER2_TRAIN_EPISODES = int(os.environ.get("REALWORLD_PIPER_2_TRAIN_EPISODES", "902")) + +_DROID_ROOT = f"{_RLDS_ROOT}/DROID" _DROID_BUILDER_DIR = f"{_DROID_ROOT}/droid_infidata/1.1.0" _DROID_TRAIN_EPISODES = 64_124 -_EGOVERSE_FULL_ROOT = "/mnt/data/RLDS/EgoVerse_full" +_EGOVERSE_FULL_ROOT = f"{_RLDS_ROOT}/EgoVerse_full" _EGOVERSE_FULL_TRAIN_EPISODES = 910 + 2_813 + 770 + 39_530 + 16_223 -_ROBOCOIN_ROOT = "/mnt/data/RLDS/RoboCOIN" +_ROBOCOIN_ROOT = f"{_RLDS_ROOT}/RoboCOIN" # RoboCOIN tuple format: # dataset_id, repo dir, train episodes, effective action_dim, delta mask dims, # optional state_indices override. @@ -386,7 +400,7 @@ class CotrainTrainConfig(_config.TrainConfig): _ROBOCOIN_TRAIN_EPISODES = sum(train_episodes for _, _, train_episodes, _, _, _ in _ROBOCOIN_REPOS) _AGIBOT_ROOT = ( - "/mnt/data/RLDS/AgiBot/" + f"{_RLDS_ROOT}/AgiBot/" "agibot_world_robot_agibot_world_beta_mobile_dual_arm_joint_absolute_position_real_s20_a20_fps30_" "cam_high_cam_left_wrist_cam_right_wrist__episodes_22986" ) @@ -535,7 +549,7 @@ def _make_robocoin_dataset( datasets=tuple(_make_robocoin_dataset(*repo_cfg) for repo_cfg in _ROBOCOIN_REPOS), ) -_ROBOMIND_FULL_ROOT = "/mnt/data/RLDS/RoboMIND_full" +_ROBOMIND_FULL_ROOT = f"{_RLDS_ROOT}/RoboMIND_full" # RoboMIND_full tuple format: # dataset_id, repo dir, episodes, action_dim, delta mask dims, camera keys # where camera keys are (base_0_rgb, left_wrist_0_rgb, right_wrist_0_rgb). @@ -700,6 +714,28 @@ def _make_robomind_full_dataset( ), ) +_PIPER2_DATA = CotrainDataConfig( + rlds_data_dir=_PIPER2_ROOT, + datasets=( + CotrainRLDSDataset( + name="realworld_piper_infidata", + dataset_id="piper2", + version="1.0.0", + builder_dir=_PIPER2_BUILDER_DIR, + weight=1.0, + train_split="train", + val_splits={"seen": "seen_test", "unseen": "unseen_test"}, + restructure_name="piper2", + action_dim=14, + # Actual metadata and samples agree on this layout: + # left_joint_1..6, left_gripper, right_joint_1..6, right_gripper. + # action[t] is exactly state[t+1]. Arm targets become relative to the current + # observation while both gripper targets remain absolute. + delta_action_mask_dims=(6, -1, 6, -1), + ), + ), +) + _FULL_ALL_TRAIN_EPISODES = ( _AGIBOT_TRAIN_EPISODES @@ -730,7 +766,7 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): _FULL_ALL_DATA = CotrainDataConfig( - rlds_data_dir="/mnt/data/RLDS", + rlds_data_dir=_RLDS_ROOT, datasets=_drop_excluded_and_renormalize( ( *_scale_dataset_weights(_AGIBOT_DATA.datasets, _AGIBOT_TRAIN_EPISODES), @@ -743,6 +779,32 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): ), ) +# In-house real-robot mixture. Weights are proportional to train episode counts. +_REAL_ONLY_DATA = CotrainDataConfig( + rlds_data_dir=_RLDS_ROOT, + datasets=_drop_excluded_and_renormalize( + ( + *_scale_dataset_weights(_PIPER30_DATA.datasets, _PIPER30_TRAIN_EPISODES), + *_scale_dataset_weights(_PIPER2_DATA.datasets, _PIPER2_TRAIN_EPISODES), + ) + ), +) + +# All in-house real data plus public robot datasets. EgoVerse is deliberately absent. +_REAL_ROBOT_DATA = CotrainDataConfig( + rlds_data_dir=_RLDS_ROOT, + datasets=_drop_excluded_and_renormalize( + ( + *_scale_dataset_weights(_PIPER30_DATA.datasets, _PIPER30_TRAIN_EPISODES), + *_scale_dataset_weights(_PIPER2_DATA.datasets, _PIPER2_TRAIN_EPISODES), + *_scale_dataset_weights(_AGIBOT_DATA.datasets, _AGIBOT_TRAIN_EPISODES), + *_scale_dataset_weights(_DROID_DATA.datasets, _DROID_TRAIN_EPISODES), + *_scale_dataset_weights(_ROBOCOIN_DATA.datasets, _ROBOCOIN_TRAIN_EPISODES), + *_scale_dataset_weights(_ROBOMIND_FULL_DATA.datasets, _ROBOMIND_FULL_EPISODES), + ) + ), +) + _UNIFIED_PI05_MODEL = pi0_config.Pi0Config( pi05=True, @@ -882,6 +944,18 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): name="cotrain_full_all_full_norm", ) +_REAL_ONLY_PI05 = dataclasses.replace( + _FULL_ALL_PI05, + name="cotrain_real_only", + data=_REAL_ONLY_DATA, +) + +_REAL_ROBOT_PI05 = dataclasses.replace( + _FULL_ALL_PI05, + name="cotrain_real_robot", + data=_REAL_ROBOT_DATA, +) + _PIPER30_ONLY_PALIGEMMA = dataclasses.replace( _PIPER30_ONLY_PI05, name="cotrain_piper30_only_paligemma", @@ -900,6 +974,8 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): _ROBOMIND_FULL_ONLY_PI05, _FULL_ALL_PI05, _FULL_ALL_PI05_FULL_NORM, + _REAL_ONLY_PI05, + _REAL_ROBOT_PI05, # Clear explicit name for the intended training run. _PIPER30_ONLY_PI05, # Backward-compatible aliases: old launch commands will still train ONLY piper30 and diff --git a/src/openpi/cotrain/rlds_dataset.py b/src/openpi/cotrain/rlds_dataset.py index 5796e35..156ada1 100644 --- a/src/openpi/cotrain/rlds_dataset.py +++ b/src/openpi/cotrain/rlds_dataset.py @@ -291,6 +291,45 @@ def _three_cam_task_restructure(traj, dataset_id: str): } +def _piper2_restructure(traj, dataset_id: str): + """Map the second real-world Piper RLDS drop into the common co-training schema. + + The actual builder metadata declares both state and action as + ``left_joint_1..6, left_gripper, right_joint_1..6, right_gripper``. Empirically, + ``action[t]`` equals ``state[t + 1]`` exactly, so this function preserves the raw + absolute targets; the unified-action transform later converts only the 12 arm-joint + slots to deltas. The two gripper slots stay absolute. + + Four cameras are present. The canonical three model slots use the head/high camera and + both wrist cameras; ``cam_front`` is intentionally unused, matching the original Piper + adapter. ``task`` is the per-step language instruction. + """ + import tensorflow as tf + + actions = tf.ensure_shape(traj["action"], [None, 14]) + state = tf.ensure_shape(traj["observation"]["state"], [None, 14]) + n = tf.shape(actions)[0] + true_mask = tf.fill([n], True) + imgs = traj["observation"]["images"] + return { + "actions": actions, + "state": state, + "image": { + "base_0_rgb": imgs["cam_high"], + "left_wrist_0_rgb": imgs["cam_left_wrist"], + "right_wrist_0_rgb": imgs["cam_right_wrist"], + }, + "image_mask": { + "base_0_rgb": true_mask, + "left_wrist_0_rgb": true_mask, + "right_wrist_0_rgb": true_mask, + }, + "prompt": traj["task"], + "prompt_prefix": _fill_action_prompt_prefix(n, "joint"), + "dataset_id": tf.fill([n], dataset_id), + } + + def _agibot_restructure(traj, dataset_id: str): """AgiBotWorld beta mobile dual-arm schema -> common co-training keys. @@ -533,6 +572,7 @@ def image_or_blank(key): "agibot": _agibot_restructure, "robomind": _robomind_restructure, "three_cam_task": _three_cam_task_restructure, # realworld_piper, RoboCOIN + "piper2": _piper2_restructure, "egoverse_eva": _egoverse_eva_restructure, "egoverse_mecka": _egoverse_mecka_restructure, "egoverse_full": _egoverse_full_restructure, diff --git a/tests/cotrain/test_action_space.py b/tests/cotrain/test_action_space.py index 1833b1d..82d16b0 100644 --- a/tests/cotrain/test_action_space.py +++ b/tests/cotrain/test_action_space.py @@ -16,6 +16,7 @@ "egoverse_mecka", "egoverse_scale", "piper30", + "piper2", "robocoin_agilex_cobot_magic_s26_a26", "robocoin_airbot_mmk2_s36_a36", "robocoin_galaxea_r1_lite_upper_s14_a14", @@ -56,7 +57,7 @@ def test_registry_covers_all_documented_builders() -> None: assert set(action_space.UNIFIED_ACTION_SPECS) == EXPECTED_DATASET_IDS - assert len(EXPECTED_DATASET_IDS) == 43 + assert len(EXPECTED_DATASET_IDS) == 44 @pytest.mark.parametrize("dataset_id", sorted(EXPECTED_DATASET_IDS)) @@ -181,3 +182,21 @@ def test_delta_is_applied_once_only_to_declared_slots() -> None: delta_mask = np.asarray(spec.delta_mask) np.testing.assert_array_equal(converted[:, delta_mask], 3) np.testing.assert_array_equal(converted[:, ~delta_mask], actions[:, ~delta_mask]) + + +def test_second_piper_drop_uses_audited_physical_layout() -> None: + spec = action_space.UNIFIED_ACTION_SPECS["piper2"] + expected_mapping = ( + action_space.dims(0, action_space.LEFT_ARM, 6) + + action_space.dims(6, action_space.LEFT_GRIPPER, 1) + + action_space.dims(7, action_space.RIGHT_ARM, 6) + + action_space.dims(13, action_space.RIGHT_GRIPPER, 1) + ) + expected_delta_slots = action_space.slots(action_space.LEFT_ARM, 6) + action_space.slots( + action_space.RIGHT_ARM, 6 + ) + + assert spec.state_mapping == expected_mapping + assert spec.action_mapping == expected_mapping + assert spec.absolute_to_delta_slots == expected_delta_slots + assert spec.already_delta_slots == () diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index ed750e4..eadde4f 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -27,3 +27,18 @@ def test_cotrain_rejects_dataset_without_mapping() -> None: dataset = CotrainRLDSDataset(name="new_builder", dataset_id="new_builder", version="1.0.0", weight=1.0) with pytest.raises(ValueError, match="no registered unified 80D action mapping"): config._resolve_unified_datasets((dataset,), config._UNIFIED_PI05_MODEL) + + +def test_real_only_contains_both_in_house_piper_datasets() -> None: + assert {dataset.uid for dataset in config._REAL_ONLY_DATA.datasets} == {"piper30", "piper2"} + assert sum(dataset.weight for dataset in config._REAL_ONLY_DATA.datasets) == pytest.approx(1.0) + + +def test_real_robot_contains_public_robot_data_but_no_egoverse() -> None: + dataset_ids = {dataset.uid for dataset in config._REAL_ROBOT_DATA.datasets} + assert {"piper30", "piper2", "agibot", "droid"} <= dataset_ids + assert any(dataset_id.startswith("robocoin_") for dataset_id in dataset_ids) + assert any(dataset_id.startswith("robomind_") for dataset_id in dataset_ids) + assert not any(dataset_id.startswith("egoverse_") for dataset_id in dataset_ids) + assert dataset_ids.isdisjoint(config._FULL_ALL_EXCLUDED_DATASET_IDS) + assert sum(dataset.weight for dataset in config._REAL_ROBOT_DATA.datasets) == pytest.approx(1.0) From 2cdade4481892b622f1159cff445b0f3d81b3fb5 Mon Sep 17 00:00:00 2001 From: root <835297796@qq.com> Date: Thu, 16 Jul 2026 21:24:56 +0800 Subject: [PATCH 11/64] add doc --- ...51\233\206\346\200\273\350\247\210_v2.txt" | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 "docs/\351\242\204\350\256\255\347\273\203\346\225\260\346\215\256\351\233\206\346\200\273\350\247\210_v2.txt" diff --git "a/docs/\351\242\204\350\256\255\347\273\203\346\225\260\346\215\256\351\233\206\346\200\273\350\247\210_v2.txt" "b/docs/\351\242\204\350\256\255\347\273\203\346\225\260\346\215\256\351\233\206\346\200\273\350\247\210_v2.txt" new file mode 100644 index 0000000..4f7fe5e --- /dev/null +++ "b/docs/\351\242\204\350\256\255\347\273\203\346\225\260\346\215\256\351\233\206\346\200\273\350\247\210_v2.txt" @@ -0,0 +1,131 @@ +## 预训练数据集总览 v2 + + + +###### 总览 + +所有数据集加在一起约 **3,033.33 小时**。 + +当前,所有数据已转换成RLDS格式。符合第一阶段预训练的要求(不考虑subtask和memory标注) + + + + + +###### Droid + +| Dataset | Robot / Schema | Embodiment / Domain | State/Action | Cameras | Episodes / Frames | FPS | 数据总时长 | 当前状态 | 运行脚本 | +| ------- | --------------------- | ----------------------- | ------------ | ----------------------------- | ------------------- | ---- | ---------- | -------- | ----------------------------------- | +| DROID | Franka joint position | DROID real robot / real | 8 / 8 | high, left_wrist, right_wrist | 67,499 / 19,508,979 | 15 | 361.28h | 已完成 | `convert_infidata_droid_to_rlds.py` | + +Droid 共1个 RLDS 仓库,约**361.28小时**数据(当初估计350h) + +当前 **均已完成**。 + + + + + + + +###### Realworld + +| Robot / Schema | EE Pose | State/Action | FPS | Cameras | Episodes / Frames | 数据时长 | 状态 | 运行方式 | +| ----------------------- | ------- | ------------ | ---- | ------------------------------------ | ----------------- | -------- | ------ | ------------------------------------------------------------ | +| ==Piper c3 no EE pose== | 无 | 14 / 14 | 15 | high, left_wrist, right_wrist | 419 / 68,789 | 1.27h | 已完成 | `--schema-key piper_s14_a14_fps15_c3_no_ee_pose --camera-set cam_high,cam_left_wrist,cam_right_wrist` | +| Piper c4 EE pose | 有 | 14 / 14 | 30 | front, high, left_wrist, right_wrist | 5,586 / 2,340,047 | 21.67h | 已完成 | `--schema-key piper_s14_a14_fps30_c4_ee_pose --camera-set cam_front,cam_high,cam_left_wrist,cam_right_wrist` | +| Piper c4 EE pose (realworld_piper_2) | 有 | 14 / 14 | 30 | front, high, left_wrist, right_wrist | 950 / 724,919 | 6.71h | 已完成 | `--schema-key piper_s14_a14_fps30_c4_ee_pose --camera-set cam_front,cam_high,cam_left_wrist,cam_right_wrist` | + +共 **3 个 RLDS 仓库**,总数据量约 **29.65h**,当前**全部已完成**。 + + + +Piper c3 no EE pose数据集质量有问题,需要全部舍弃 + + + +###### Agibot + +| Robot / Schema | Action Type | State/Action | FPS | Cameras | Episodes / Frames | 数据时长 | 状态 | 运行脚本 | +| --------------------------------- | ----------------- | ------------ | ---- | ----------------------------- | ------------------- | -------- | ------ | ------------------------------------------------------------ | +| AgiBot World Beta mobile dual arm | absolute position | 20 / 20 | 30 | high, left_wrist, right_wrist | 22,986 / 35,663,824 | 330.22h | 未完成 | `agibot_world_robot_agibot_world_beta_mobile_dual_arm_joint_absolute_position_real_s20_a20_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_22986.sh` | + +一个RLDS仓库,总数据量**330h**,已完成 + + + +###### RoboCOIN + +| Robot / Schema | State/Action | FPS | Cameras | Episodes / Frames | 数据时长 | 状态 | 运行脚本 | +| ----------------------------- | ------------ | ---- | ----------------------------- | ------------------- | -------- | ------ | ------------------------------------------------------------ | +| Agilex Cobot Magic | 26 / 26 | 30 | high, left_wrist, right_wrist | 8,284 / 6,319,718 | 58.52h | 已完成 | `Agilex_Cobot_Magic_s26_a26_fps30__episodes_8284.sh` | +| Airbot MMK2 | 36 / 36 | 30 | high, left_wrist, right_wrist | 10,532 / 2,728,963 | 25.27h | 已完成 | `Airbot_MMK2_s36_a36_fps30__episodes_10532.sh` | +| Galaxea R1 Lite | 14 / 14 | 30 | high, left_wrist, right_wrist | 3,650 / 2,217,847 | 20.54h | 已完成 | `Galaxea_R1_Lite_s14_a14_fps30__episodes_3650.sh` | +| Realman RMC-AIDA-L | 28 / 28 | 30 | high, left_wrist, right_wrist | 693 / 336,079 | 3.11h | 已完成 | `Realman_RMC-AIDA-L_s28_a28_fps30__episodes_693.sh` | +| Unitree G1 Dex3 phecda | 28 / 28 | 30 | high, left_wrist, right_wrist | 1,411 / 910,983 | 8.44h | 已完成 | `Unitree_G1_Dex3_phecda_s28_a28_fps30__episodes_1411.sh` | +| AgileX decoupled Magic | 14 / 14 | 30 | high, left_wrist, right_wrist | 7,778 / 4,806,875 | 44.51h | 已完成 | `agilex_cobot_decoupled_magic_s14_a14_fps30__episodes_7778.sh` | +| AgileX decoupled Magic | 14 / 14 | 50 | high, left_wrist, right_wrist | 3,397 / 1,823,313 | 10.13h | 已完成 | `agilex_cobot_decoupled_magic_s14_a14_fps50__episodes_3397.sh` | +| AgileX decoupled Magic | 26 / 26 | 30 | high, left_wrist, right_wrist | 23,712 / 16,334,563 | 151.25h | 已完成 | `agilex_cobot_decoupled_magic_s26_a26_fps30__episodes_23712.sh` | +| ALOHA | 26 / 26 | 30 | high, left_wrist, right_wrist | 4,879 / 6,680,658 | 61.86h | 已完成 | `aloha_s26_a26_fps30__episodes_4879.sh` | +| Alpha Bot 2 | 28 / 28 | 30 | high, left_wrist, right_wrist | 857 / 764,907 | 7.08h | 已完成 | `alpha_bot_2_s28_a28_fps30__episodes_857.sh` | +| Discover Robotics AitBot MMK2 | 36 / 36 | 30 | high, left_wrist, right_wrist | 5,747 / 1,219,069 | 11.29h | 已完成 | `discover_robotics_aitbot_mmk2_s36_a36_fps30__episodes_5747.sh` | +| Galaxea R1 Lite | 14 / 14 | 30 | high, left_wrist, right_wrist | 5,167 / 8,372,255 | 77.52h | 未完成 | `galaxea_r1_lite_s14_a14_fps30__episodes_5167.sh` | +| Galaxea R1 Lite | 16 / 18 | 30 | high, left_wrist, right_wrist | 970 / 332,209 | 3.08h | 已完成 | `galaxea_r1_lite_s16_a18_fps30__episodes_970.sh` | +| Leju Robot | 118 / 54 | 30 | high, left_wrist, right_wrist | 17,897 / 15,462,517 | 143.17h | 已完成 | `leju_robot_s118_a54_fps30__episodes_17897.sh` | +| Leju Robot | 54 / 54 | 30 | high, left_wrist, right_wrist | 394 / 69,427 | 0.64h | 已完成 | `leju_robot_s54_a54_fps30__episodes_394.sh` | +| Realman RMC AIDAL | 28 / 28 | 30 | high, left_wrist, right_wrist | 18,412 / 16,612,517 | 153.82h | 已完成 | `realman_rmc_aidal_s28_a28_fps30__episodes_18412.sh` | +| Ruantong A2D | 17 / 17 | 30 | high, left_wrist, right_wrist | 1,719 / 1,086,438 | 10.06h | 已完成 | `ruantong_a2d_s17_a17_fps30__episodes_1719.sh` | +| Ruantong A2D | 41 / 34 | 30 | high, left_wrist, right_wrist | 6,459 / 2,861,645 | 26.50h | 已完成 | `ruantong_a2d_s41_a34_fps30__episodes_6459.sh` | +| Unitree G1 | 28 / 28 | 30 | high | 227 / 76,754 | 0.71h | 已完成 | `unitree_g1_s28_a28_fps30__episodes_1158.sh` | +| Unitree G1 | 28 / 28 | 30 | high, left_wrist, right_wrist | 931 / 663,781 | 6.15h | 已完成 | `unitree_g1_s28_a28_fps30__episodes_1158.sh` | +| Unknown robot | 30 / 30 | 30 | high | 891 / 274,684 | 2.54h | 已完成 | `unknown_s30_a30_fps30__episodes_891.sh` | +| Yinhe | 49 / 16 | 30 | high, left_wrist, right_wrist | 5,452 / 5,175,924 | 47.93h | 已完成 | `yinhe_s49_a16_fps30__episodes_5452.sh` | + +RoboCOIN 共 **22 个 RLDS 仓库**,总数据量约 **874.09h**。 + +当前 **22个已完成** + + + + + +###### RoboMIND + +| Robot | Schema | Embodiment / Domain | State/Action | Cameras | 当前状态 | 数据时长 | 运行脚本 | +| ------------------ | ---------------------------------- | ------------------------------------- | ------------ | ------------------------------------------------------ | ------------------ | -------- | ------------------------------------------------ | +| UR5e | `master_puppet_joint_position` | `h5_ur_1rgb` / real | 7 / 7 | top | 已完成 | 36.80h | `ur5e...episodes_26380.sh` | +| Franka Panda | `master_puppet_joint_position` | `h5_franka_3rgb` / real | 8 / 8 | left, right, top | 已完成,skip 1,546 | 22.43h | `franka_panda...episodes_17219.sh` | +| Franka Sim | `simulation_franka_joint_position` | `h5_sim_franka_3rgb` / sim | 8 / 8 | front_external, handeye, left_external, right_external | 已完成 | 25.20h | `franka_sim...h5_sim_franka...episodes_14488.sh` | +| Franka Sim | `simulation_franka_joint_position` | `h5_simulation` / sim | 8 / 8 | front_external, handeye, left_external, right_external | 已完成,skip 2,423 | 20.97h | `franka_sim...h5_simulation...episodes_11422.sh` | +| AgileX Cobot Magic | `agilex_dual_arm` | `h5_agilex_3rgb` / real | 14 / 14 | high, left_wrist, right_wrist | 已完成 | 61.42h | `agilex...episodes_10374.sh` | +| TienKung Humanoid | `master_puppet_joint_position` | `h5_tienkung_gello_1rgb` / real | 16 / 16 | top | 已完成 | 41.75h | `tienkung...gello...episodes_6626.sh` | +| TienKung Humanoid | `master_puppet_joint_position` | `h5_tienkung_xsens_1rgb` / real | 14 / 14 | top | 已完成 | 32.96h | `tienkung...xsens...episodes_6126.sh` | +| TienKung Humanoid | `tiangong_joint_position` | `h5_sim_tienkung_1rgb` / sim | 38 / 38 | chest, head | 已完成 | 33.07h | `tienkung...sim_tienkung...episodes_3965.sh` | +| TienKung Humanoid | `master_puppet_joint_position` | `h5_tienkung_prod1_gello_1rgb` / real | 16 / 16 | top | 已完成 | 15.77h | `tienkung...prod1_gello...episodes_2959.sh` | +| Franka FR3 Dual | `master_puppet_joint_position` | `h5_franka_fr3_dual` / real | 16 / 16 | high, left, right, top | 已完成 | 3.48h | `franka_fr3_dual...episodes_1774.sh` | +| Franka Sim | `simulation_franka_joint_position` | none / sim | 8 / 8 | front_external, handeye, left_external, right_external | 已完成 | 0.35h | `franka_sim...none_sim...episodes_222.sh` | +| Franka Sim | `simulation_franka_joint_position` | `h5_simulation` / sim | 8 / 8 | handeye, left_external, right_external | 已完成 | 0.33h | `franka_sim...3cam...episodes_158.sh` | +| TienKung Humanoid | `tiangong_joint_position` | none / real | 38 / 38 | chest, head | 已完成 | 1.15h | `tienkung...none_real...episodes_146.sh` | + +RoboMIND full 共 13 个 RLDS 仓库,约 **295.67h** 数据(当初估计305h) + +当前 **13 个完成,0 个未完成**。 + + + +###### EgoVerse + +| Embodiment / Robot | Domain | Control / Action | State/Action | Action Chunk | FPS | Cameras | Episodes / Frames | 数据时长 | RLDS 状态 | 运行方式 | +| ------------------------- | ------ | -------------------------- | ------------ | ------------ | ---- | -------------------------------- | ------------------- | -------- | --------- | ------------------------------------------------------------ | +| `MECKA_BIMANUAL` | real | absolute Cartesian EE pose | 12 / 12 | 100 | 30 | front_1 | 41,612 / 89,233,982 | 826.24h | 已完成 | `--schema-key MECKA_BIMANUAL --camera-set front_1` | +| `aria_bimanual` | real | absolute Cartesian EE pose | 12 / 12 | 100 | 30 | front_1 | 1,031 / 4,560,706 | 42.23h | 已完成 | `--schema-key aria_bimanual --camera-set front_1` | +| `eva_bimanual
aloha` | real | absolute Cartesian EE pose | 12 / 12 | 100 | 30 | front_1, left_wrist, right_wrist | 2,961 / 3,281,717 | 30.39h | 已完成 | `--schema-key eva_bimanual --camera-set front_1,left_wrist,right_wrist` | +| `human_bimanual` | real | absolute Cartesian EE pose | 12 / 12 | 100 | 30 | front_1 | 810 / 2,914,606 | 26.99h | 已完成 | `--schema-key human_bimanual --camera-set front_1` | +| `scale` | real | absolute Cartesian EE pose | 12 / 12 | 100 | 30 | front_1 | 17,090 / 23,389,757 | 216.57h | 已完成 | `--schema-key scale --camera-set front_1` | + +Egoverse 共 5 个 RLDS 仓库,约 **1142.42h** 数据 + +当前 **均已完成**。 + + + From 31f8e3023a9034c6d9ddddcb0f1daef4b6da1d08 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Fri, 17 Jul 2026 22:12:57 +0800 Subject: [PATCH 12/64] pre for training --- docs/cotrain_real_data_configs.md | 2 +- docs/new_host_environment.md | 2 +- ...55\347\273\203\346\214\207\345\215\227.md" | 155 ++++++++++++++++++ scripts/atom0_env.sh | 9 +- scripts/preflight_cotrain_baige.py | 75 +++++++++ scripts/train_cotrain.py | 7 +- scripts/train_cotrain_baige.sh | 126 ++++++++++++++ ...otrain_full_all_full_norm_local_weights.sh | 7 +- 8 files changed, 377 insertions(+), 6 deletions(-) create mode 100644 "docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" create mode 100755 scripts/preflight_cotrain_baige.py create mode 100755 scripts/train_cotrain_baige.sh diff --git a/docs/cotrain_real_data_configs.md b/docs/cotrain_real_data_configs.md index 3e69580..06f827b 100644 --- a/docs/cotrain_real_data_configs.md +++ b/docs/cotrain_real_data_configs.md @@ -109,7 +109,7 @@ unified_action_space.json 使用相同的环境变量和命令参数。 ```bash -export PARAMS_PATH=/data/models/openpi/openpi-assets/checkpoints/pi05_base/params +export PARAMS_PATH=/data/models/openpi export WANDB_API_KEY='...' export XLA_PYTHON_CLIENT_MEM_FRACTION=0.9 ``` diff --git a/docs/new_host_environment.md b/docs/new_host_environment.md index 7b516c8..e3cc7f8 100644 --- a/docs/new_host_environment.md +++ b/docs/new_host_environment.md @@ -15,7 +15,7 @@ The defaults are: - RLDS root: `/mnt/bos/bo23lu` - OpenPI runtime cache: `/data/wudi/cache/openpi` - Shared OpenPI model root: `/data/models/openpi` -- pi05 parameters: `/data/models/openpi/openpi-assets/checkpoints/pi05_base/params` +- pi05 parameters on this host: `/data/models/openpi` - Hugging Face cache: `/data/wudi/cache/huggingface` - XDG/JAX cache: `/data/wudi/.cache` - Logs: `/data/wudi/Atom-0/logs` diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" new file mode 100644 index 0000000..d358321 --- /dev/null +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -0,0 +1,155 @@ +```bash +# 配置百舸凭证、资源池、PFS、BOS、W&B +cd /data/wudi/baige-cluster +cp -n .env.example .env +vim .env +``` + +```bash +# 本地环境、checkpoint、两套配置与 norm 验收 +cd /data/wudi/Atom-0 +source scripts/atom0_env.sh +test -f "${PARAMS_PATH}/_CHECKPOINT_METADATA" +test -f "${PARAMS_PATH}/manifest.ocdbt" +.venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_only +.venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_robot +``` + +```bash +# 按最大正式拓扑做 3 节点 × 8 卡 RDMA/NCCL 验收 +cd /data/wudi/baige-cluster +INSTANCES=3 GPU_PER_NODE=8 .venv/bin/python nccl_test_job.py +``` + +```bash +# 按各自正式拓扑跑 20 step;日志必须保持 loss/grad finite +cd /data/wudi/baige-cluster +export BOS_SOURCE=atom0-data/ +export BOS_MOUNT_PATH=/mnt/bos/bo23lu + +MODE=smoke CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_1x8_smoke \ +INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 \ +SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ +.venv/bin/python atom0_train_job.py + +MODE=smoke CONFIG_NAME=cotrain_real_robot EXP_NAME=cotrain_real_robot_b200_3x8_smoke \ +INSTANCES=3 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1536 \ +SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ +.venv/bin/python atom0_train_job.py +``` + +```bash +# 查询任务结构与日志 +cd /data/wudi/baige-cluster +.venv/bin/python logs.py +.venv/bin/python logs.py +``` + +## 正式训练 1:仅自采真机数据 + +| 超参数 | 值 | +| --- | ---: | +| 配置 | `cotrain_real_only` | +| 数据集 | `piper30 + piper2` | +| source frames | 2,913,191 | +| 节点 × GPU | 1 × 8 B200 | +| FSDP devices | 4 | +| global batch size | 512 | +| samples / GPU | 64 | +| train steps | 10000 | +| warmup / decay steps | 200 / 10000 | +| eval / save interval | 1,000 / 2,000 | +| validation batches | 10 | +| action MSE | 开启 | + +```bash +cd /data/wudi/baige-cluster +export BOS_SOURCE=atom0-data/ +export BOS_MOUNT_PATH=/mnt/bos/bo23lu + +MODE=train CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_v1 \ +INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 \ +NUM_TRAIN_STEPS=10000 WARMUP_STEPS=200 DECAY_STEPS=10000 \ +EVAL_INTERVAL=1000 SAVE_INTERVAL=2000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ +.venv/bin/python atom0_train_job.py +``` + +## 正式训练 2:自采真机 + 开源 Robot(不含 EgoVerse) + +| 超参数 | 值 | +| --- | ---: | +| 配置 | `cotrain_real_robot` | +| active datasets | 37 | +| source frames | 165,126,741 | +| 节点 × GPU | 3 × 8 B200 | +| FSDP devices | 4 | +| global batch size | 1,536 | +| samples / GPU | 64 | +| train steps | 100,000 | +| warmup / decay steps | 5,000 / 100,000 | +| eval / save interval | 5,000 / 10,000 | +| validation batches | 5 | +| action MSE | 关闭 | + +```bash +cd /data/wudi/baige-cluster +export BOS_SOURCE=atom0-data/ +export BOS_MOUNT_PATH=/mnt/bos/bo23lu + +MODE=train CONFIG_NAME=cotrain_real_robot EXP_NAME=cotrain_real_robot_b200_v1 \ +INSTANCES=3 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1536 \ +NUM_TRAIN_STEPS=100000 WARMUP_STEPS=5000 DECAY_STEPS=100000 \ +EVAL_INTERVAL=5000 SAVE_INTERVAL=10000 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ +.venv/bin/python atom0_train_job.py +``` + +## 可选:16 卡 / 32 卡训练 + +下表保持与上述推荐命令相同的总样本训练量(每卡 batch 均为 64)。 + +| 配置 | GPU 拓扑 | global batch | train steps | +| --- | ---: | ---: | ---: | +| `cotrain_real_only` | 2 × 8 | 1,024 | 5,000 | +| `cotrain_real_only` | 4 × 8 | 2,048 | 2,500 | +| `cotrain_real_robot` | 2 × 8 | 1,024 | 150,000 | +| `cotrain_real_robot` | 4 × 8 | 2,048 | 75,000 | + +```bash +# 仅自采真机数据:16 卡 +cd /data/wudi/baige-cluster +MODE=train CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_16gpu_v1 \ +INSTANCES=2 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1024 \ +NUM_TRAIN_STEPS=5000 WARMUP_STEPS=100 DECAY_STEPS=5000 \ +EVAL_INTERVAL=500 SAVE_INTERVAL=1000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ +.venv/bin/python atom0_train_job.py + +# 仅自采真机数据:32 卡 +MODE=train CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_32gpu_v1 \ +INSTANCES=4 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=2048 \ +NUM_TRAIN_STEPS=2500 WARMUP_STEPS=50 DECAY_STEPS=2500 \ +EVAL_INTERVAL=250 SAVE_INTERVAL=500 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ +.venv/bin/python atom0_train_job.py +``` + +```bash +# 自采真机 + 开源 Robot:16 卡 +cd /data/wudi/baige-cluster +MODE=train CONFIG_NAME=cotrain_real_robot EXP_NAME=cotrain_real_robot_b200_16gpu_v1 \ +INSTANCES=2 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1024 \ +NUM_TRAIN_STEPS=150000 WARMUP_STEPS=7500 DECAY_STEPS=150000 \ +EVAL_INTERVAL=7500 SAVE_INTERVAL=15000 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ +.venv/bin/python atom0_train_job.py + +# 自采真机 + 开源 Robot:32 卡 +MODE=train CONFIG_NAME=cotrain_real_robot EXP_NAME=cotrain_real_robot_b200_32gpu_v1 \ +INSTANCES=4 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=2048 \ +NUM_TRAIN_STEPS=75000 WARMUP_STEPS=3750 DECAY_STEPS=75000 \ +EVAL_INTERVAL=3750 SAVE_INTERVAL=7500 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ +.venv/bin/python atom0_train_job.py +``` diff --git a/scripts/atom0_env.sh b/scripts/atom0_env.sh index f1df8db..bf66476 100755 --- a/scripts/atom0_env.sh +++ b/scripts/atom0_env.sh @@ -22,7 +22,12 @@ export HF_HOME="${HF_HOME:-${ATOM0_STATE_ROOT}/cache/huggingface}" export OPENPI_DATA_HOME="${OPENPI_DATA_HOME:-${ATOM0_STATE_ROOT}/cache/openpi}" export OPENPI_MODEL_HOME="${OPENPI_MODEL_HOME:-/data/models/openpi}" export RLDS_DATA_DIR="${RLDS_DATA_DIR:-/mnt/bos/bo23lu}" -export PARAMS_PATH="${PARAMS_PATH:-${OPENPI_MODEL_HOME}/openpi-assets/checkpoints/pi05_base/params}" +if [[ -f "${OPENPI_MODEL_HOME}/_CHECKPOINT_METADATA" ]]; then + _DEFAULT_PARAMS_PATH="${OPENPI_MODEL_HOME}" +else + _DEFAULT_PARAMS_PATH="${OPENPI_MODEL_HOME}/openpi-assets/checkpoints/pi05_base/params" +fi +export PARAMS_PATH="${PARAMS_PATH:-${_DEFAULT_PARAMS_PATH}}" export LOG_DIR="${LOG_DIR:-${ATOM0_REPO_DIR}/logs}" export XLA_PYTHON_CLIENT_MEM_FRACTION="${XLA_PYTHON_CLIENT_MEM_FRACTION:-0.9}" @@ -31,7 +36,7 @@ export TF_CPP_MIN_LOG_LEVEL="${TF_CPP_MIN_LOG_LEVEL:-1}" mkdir -p "${HF_HOME}" "${OPENPI_DATA_HOME}" "${OPENPI_MODEL_HOME}" "${JAX_COMPILATION_CACHE_DIR}" "${LOG_DIR}" if [[ -n "${MASTER_ADDR:-}" && -z "${JAX_COORDINATOR_ADDRESS:-}" ]]; then - export JAX_COORDINATOR_ADDRESS="${MASTER_ADDR}:29500" + export JAX_COORDINATOR_ADDRESS="${MASTER_ADDR}:${MASTER_PORT:-29500}" fi echo "Atom-0 environment loaded from ${ATOM0_REPO_DIR}" diff --git a/scripts/preflight_cotrain_baige.py b/scripts/preflight_cotrain_baige.py new file mode 100755 index 0000000..45a3310 --- /dev/null +++ b/scripts/preflight_cotrain_baige.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python +"""Fail-fast validation for the two Baige co-training configurations.""" + +import argparse +import json +import os +from pathlib import Path + +import numpy as np + +from openpi.cotrain import action_space, config +from openpi.shared import normalize + + +def validate(config_name: str, assets_base: Path, params_path: Path) -> None: + cfg = config.get_config(config_name) + datasets = cfg.data.datasets + ids = [dataset.uid for dataset in datasets] + assert "piper30" in ids and "piper2" in ids + assert not any(dataset_id.startswith("egoverse_") for dataset_id in ids) + expected_count = 2 if config_name == "cotrain_real_only" else 37 + assert len(ids) == expected_count, (config_name, len(ids), expected_count) + + for marker in ("_CHECKPOINT_METADATA", "manifest.ocdbt"): + assert (params_path / marker).is_file(), params_path / marker + + total_frames = 0 + degenerate = [] + for dataset in datasets: + builder_dir = Path(dataset.builder_dir) + assert (builder_dir / "dataset_info.json").is_file(), builder_dir + directory = assets_base / config_name / dataset.uid + for filename in ("norm_stats.json", "norm_stats_meta.json", "unified_action_space.json"): + assert (directory / filename).is_file(), directory / filename + + spec = action_space.UNIFIED_ACTION_SPECS[dataset.uid] + action_space.validate_metadata(directory, spec) + stats = normalize.load(directory) + meta = json.loads((directory / "norm_stats_meta.json").read_text()) + assert Path(meta["builder_dir"]) == builder_dir, (dataset.uid, meta["builder_dir"], builder_dir) + assert meta["num_frames"] > 0, dataset.uid + total_frames += int(meta["num_frames"]) + + state_mask = np.zeros(action_space.UNIFIED_ACTION_DIM, dtype=bool) + state_mask[list(spec.state_target_slots)] = True + for key, active in (("state", state_mask), ("actions", np.asarray(spec.action_mask, dtype=bool))): + value = stats[key] + arrays = {field: np.asarray(getattr(value, field)) for field in ("mean", "std", "q01", "q99")} + assert all(array.shape == (action_space.UNIFIED_ACTION_DIM,) for array in arrays.values()) + assert all(np.isfinite(array).all() for array in arrays.values()) + inactive = ~active + assert np.allclose(arrays["mean"][inactive], 0) + assert np.allclose(arrays["std"][inactive], 1) + assert np.allclose(arrays["q01"][inactive], -1) + assert np.allclose(arrays["q99"][inactive], 1) + bad = np.flatnonzero(active & (arrays["q99"] <= arrays["q01"])) + if bad.size: + degenerate.append(f"{dataset.uid}:{key}:{bad.tolist()}") + + print(f"PASS {config_name}: datasets={len(ids)}, source_frames={total_frames:,}") + for item in degenerate: + print(f"WARN degenerate active quantile (smoke test must remain finite): {item}") + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("config", choices=("cotrain_real_only", "cotrain_real_robot")) + parser.add_argument("--assets-base", type=Path, default=Path("assets")) + parser.add_argument("--params-path", type=Path, default=Path(os.environ["PARAMS_PATH"])) + args = parser.parse_args() + validate(args.config, args.assets_base.resolve(), args.params_path.resolve()) + + +if __name__ == "__main__": + main() diff --git a/scripts/train_cotrain.py b/scripts/train_cotrain.py index 37de6ac..17bfc0c 100644 --- a/scripts/train_cotrain.py +++ b/scripts/train_cotrain.py @@ -291,7 +291,12 @@ def main(config: cotrain_config.CotrainTrainConfig): f"Batch size {config.batch_size} must be divisible by the number of devices {jax.device_count()}." ) - jax.config.update("jax_compilation_cache_dir", str(epath.Path("~/.cache/jax").expanduser())) + # Training pods share /data but their home directories are ephemeral. Honour the + # host/job-provided cache location so recompilations can be reused across restarts. + compilation_cache_dir = os.environ.get( + "JAX_COMPILATION_CACHE_DIR", str(epath.Path("~/.cache/jax").expanduser()) + ) + jax.config.update("jax_compilation_cache_dir", compilation_cache_dir) rng = jax.random.key(config.seed) train_rng, init_rng = jax.random.split(rng) diff --git a/scripts/train_cotrain_baige.sh b/scripts/train_cotrain_baige.sh new file mode 100755 index 0000000..cccca1a --- /dev/null +++ b/scripts/train_cotrain_baige.sh @@ -0,0 +1,126 @@ +#!/usr/bin/env bash +set -euo pipefail + +REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "${REPO_DIR}" +source scripts/atom0_env.sh + +CONFIG_NAME="${CONFIG_NAME:?Set CONFIG_NAME to cotrain_real_only or cotrain_real_robot}" +EXP_NAME="${EXP_NAME:?Set EXP_NAME}" +MODE="${MODE:-train}" +# Keep 64 samples/GPU by default. WORLD_SIZE is the number of Baige nodes and +# NPROC_PER_NODE is 8 for the B200 jobs submitted by atom0_train_job.py. +BATCH_SIZE="${BATCH_SIZE:-$((64 * ${WORLD_SIZE:-1} * ${NPROC_PER_NODE:-8}))}" + +case "${CONFIG_NAME}" in + cotrain_real_only) + # One aggregate pass over the current piper30+piper2 norm metadata frames. + TRAIN_SAMPLES="${TRAIN_SAMPLES:-2913191}" + DEFAULT_STEPS=$(((TRAIN_SAMPLES + BATCH_SIZE - 1) / BATCH_SIZE)) + DEFAULT_WARMUP=200 + DEFAULT_EVAL_INTERVAL=1000 + DEFAULT_SAVE_INTERVAL=2000 + DEFAULT_VAL_BATCHES=10 + DEFAULT_ACTION_MSE=1 + ;; + cotrain_real_robot) + # One aggregate pass over the current 37-dataset norm metadata frames. + TRAIN_SAMPLES="${TRAIN_SAMPLES:-165126741}" + DEFAULT_STEPS=$(((TRAIN_SAMPLES + BATCH_SIZE - 1) / BATCH_SIZE)) + DEFAULT_WARMUP=5000 + DEFAULT_EVAL_INTERVAL=5000 + DEFAULT_SAVE_INTERVAL=10000 + DEFAULT_VAL_BATCHES=5 + DEFAULT_ACTION_MSE=0 + ;; + *) + echo "Unsupported CONFIG_NAME=${CONFIG_NAME}" >&2 + exit 2 + ;; +esac + +FSDP_DEVICES="${FSDP_DEVICES:-4}" +NUM_TRAIN_STEPS="${NUM_TRAIN_STEPS:-${DEFAULT_STEPS}}" +WARMUP_STEPS="${WARMUP_STEPS:-${DEFAULT_WARMUP}}" +DECAY_STEPS="${DECAY_STEPS:-${NUM_TRAIN_STEPS}}" +EVAL_INTERVAL="${EVAL_INTERVAL:-${DEFAULT_EVAL_INTERVAL}}" +SAVE_INTERVAL="${SAVE_INTERVAL:-${DEFAULT_SAVE_INTERVAL}}" +NUM_VAL_BATCHES="${NUM_VAL_BATCHES:-${DEFAULT_VAL_BATCHES}}" +RUN_ACTION_MSE="${RUN_ACTION_MSE:-${DEFAULT_ACTION_MSE}}" +LOG_INTERVAL="${LOG_INTERVAL:-100}" +CHECKPOINT_BASE_DIR="${CHECKPOINT_BASE_DIR:-${REPO_DIR}/checkpoints}" +ASSETS_BASE_DIR="${ASSETS_BASE_DIR:-${REPO_DIR}/assets}" +RANK_ID="${RANK:-0}" + +if [[ "${MODE}" == "smoke" ]]; then + NUM_TRAIN_STEPS="${SMOKE_STEPS:-20}" + WARMUP_STEPS="${SMOKE_WARMUP_STEPS:-2}" + DECAY_STEPS="${NUM_TRAIN_STEPS}" + EVAL_INTERVAL=1000000 + SAVE_INTERVAL=1000000 + NUM_VAL_BATCHES=1 + RUN_ACTION_MSE=0 + LOG_INTERVAL=1 + WANDB_ENABLED=0 +else + WANDB_ENABLED="${WANDB_ENABLED:-1}" +fi + +if (( WARMUP_STEPS < 0 || DECAY_STEPS <= WARMUP_STEPS )); then + echo "Invalid LR schedule: require 0 <= WARMUP_STEPS < DECAY_STEPS, got ${WARMUP_STEPS} and ${DECAY_STEPS}" >&2 + exit 2 +fi + +test -f "${PARAMS_PATH}/_CHECKPOINT_METADATA" +test -f "${PARAMS_PATH}/manifest.ocdbt" +test -d "${RLDS_DATA_DIR}" +test -d "${ASSETS_BASE_DIR}/${CONFIG_NAME}" + +if [[ "${WANDB_ENABLED}" == "1" ]]; then + : "${WANDB_API_KEY:?Set WANDB_API_KEY for production training}" +fi + +export XLA_PYTHON_CLIENT_MEM_FRACTION="${XLA_PYTHON_CLIENT_MEM_FRACTION:-0.95}" +export JAX_COORDINATOR_ADDRESS="${JAX_COORDINATOR_ADDRESS:-${MASTER_ADDR:-127.0.0.1}:${MASTER_PORT:-29500}}" + +args=( + "${CONFIG_NAME}" + "--exp-name=${EXP_NAME}" + "--fsdp-devices=${FSDP_DEVICES}" + "--batch-size=${BATCH_SIZE}" + "--num-train-steps=${NUM_TRAIN_STEPS}" + "--lr-schedule.warmup-steps=${WARMUP_STEPS}" + "--lr-schedule.decay-steps=${DECAY_STEPS}" + "--eval-interval=${EVAL_INTERVAL}" + "--save-interval=${SAVE_INTERVAL}" + "--log-interval=${LOG_INTERVAL}" + "--num-val-batches=${NUM_VAL_BATCHES}" + "--data-num-parallel-reads=${DATA_NUM_PARALLEL_READS:-1}" + "--data-num-parallel-calls=${DATA_NUM_PARALLEL_CALLS:-2}" + "--data.rlds-data-dir=${RLDS_DATA_DIR}" + "--assets-base-dir=${ASSETS_BASE_DIR}" + "--checkpoint-base-dir=${CHECKPOINT_BASE_DIR}" + "--weight-loader.params-path=${PARAMS_PATH}" +) + +if [[ "${WANDB_ENABLED}" == "1" ]]; then + args+=("--wandb-enabled") +else + args+=("--no-wandb-enabled") +fi +if [[ "${RUN_ACTION_MSE}" == "1" ]]; then + args+=("--run-action-mse" "--viz-action-traj") +else + args+=("--no-run-action-mse" "--no-viz-action-traj") +fi +if [[ "${OVERWRITE:-0}" == "1" ]]; then + args+=("--overwrite") +fi + +mkdir -p "${LOG_DIR}" +exec > >(tee -a "${LOG_DIR}/baige_${CONFIG_NAME}_${EXP_NAME}_rank${RANK_ID}.log") 2>&1 +echo "CONFIG_NAME=${CONFIG_NAME} EXP_NAME=${EXP_NAME} MODE=${MODE}" +echo "WORLD_SIZE=${WORLD_SIZE:-1} RANK=${RANK_ID} MASTER=${JAX_COORDINATOR_ADDRESS}" +echo "FSDP_DEVICES=${FSDP_DEVICES} BATCH_SIZE=${BATCH_SIZE} NUM_TRAIN_STEPS=${NUM_TRAIN_STEPS}" + +exec .venv/bin/python -u scripts/train_cotrain.py "${args[@]}" diff --git a/scripts/train_cotrain_full_all_full_norm_local_weights.sh b/scripts/train_cotrain_full_all_full_norm_local_weights.sh index ec05634..59a1e0b 100755 --- a/scripts/train_cotrain_full_all_full_norm_local_weights.sh +++ b/scripts/train_cotrain_full_all_full_norm_local_weights.sh @@ -5,7 +5,12 @@ REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" STATE_ROOT="${ATOM0_STATE_ROOT:-$(dirname "${REPO_DIR}")}" OPENPI_DATA_HOME="${OPENPI_DATA_HOME:-${STATE_ROOT}/cache/openpi}" OPENPI_MODEL_HOME="${OPENPI_MODEL_HOME:-/data/models/openpi}" -PARAMS_PATH="${PARAMS_PATH:-${OPENPI_MODEL_HOME}/openpi-assets/checkpoints/pi05_base/params}" +if [[ -f "${OPENPI_MODEL_HOME}/_CHECKPOINT_METADATA" ]]; then + DEFAULT_PARAMS_PATH="${OPENPI_MODEL_HOME}" +else + DEFAULT_PARAMS_PATH="${OPENPI_MODEL_HOME}/openpi-assets/checkpoints/pi05_base/params" +fi +PARAMS_PATH="${PARAMS_PATH:-${DEFAULT_PARAMS_PATH}}" RLDS_DATA_DIR="${RLDS_DATA_DIR:-/mnt/bos/bo23lu}" LOG_DIR="${LOG_DIR:-${REPO_DIR}}" RANK_ID="${RANK:-0}" From d7b690c7a49b602f787f68a2269a9215c2f39b85 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Sat, 18 Jul 2026 02:15:01 +0800 Subject: [PATCH 13/64] fix dataset --- ...55\347\273\203\346\214\207\345\215\227.md" | 31 ++++++++-------- scripts/preflight_cotrain_baige.py | 28 +++++++++++--- scripts/train_cotrain_baige.sh | 13 +++++-- src/openpi/cotrain/config.py | 37 ++++++++++++++++++- tests/cotrain/test_unified_config.py | 10 +++++ 5 files changed, 93 insertions(+), 26 deletions(-) diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index d358321..4762cd5 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -12,7 +12,7 @@ source scripts/atom0_env.sh test -f "${PARAMS_PATH}/_CHECKPOINT_METADATA" test -f "${PARAMS_PATH}/manifest.ocdbt" .venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_only -.venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_robot +.venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_robot_fix ``` ```bash @@ -32,7 +32,7 @@ INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 \ SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ .venv/bin/python atom0_train_job.py -MODE=smoke CONFIG_NAME=cotrain_real_robot EXP_NAME=cotrain_real_robot_b200_3x8_smoke \ +MODE=smoke CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_3x8_smoke \ INSTANCES=3 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1536 \ SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ .venv/bin/python atom0_train_job.py @@ -79,15 +79,16 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ | 超参数 | 值 | | --- | ---: | -| 配置 | `cotrain_real_robot` | -| active datasets | 37 | -| source frames | 165,126,741 | +| 配置 | `cotrain_real_robot_fix` | +| active datasets | 34 | +| 排除数据集 | `robocoin_leju_robot_s54_a54`
`robocoin_agilex_decoupled_magic_s14_a14_fps50`
`robocoin_agilex_decoupled_magic_s26_a26` | +| source frames | 150,109,749 | | 节点 × GPU | 3 × 8 B200 | | FSDP devices | 4 | | global batch size | 1,536 | | samples / GPU | 64 | -| train steps | 100,000 | -| warmup / decay steps | 5,000 / 100,000 | +| train steps | 97,728 | +| warmup / decay steps | 5,000 / 97,728 | | eval / save interval | 5,000 / 10,000 | | validation batches | 5 | | action MSE | 关闭 | @@ -97,9 +98,9 @@ cd /data/wudi/baige-cluster export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu -MODE=train CONFIG_NAME=cotrain_real_robot EXP_NAME=cotrain_real_robot_b200_v1 \ +MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_v1 \ INSTANCES=3 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1536 \ -NUM_TRAIN_STEPS=100000 WARMUP_STEPS=5000 DECAY_STEPS=100000 \ +NUM_TRAIN_STEPS=97728 WARMUP_STEPS=5000 DECAY_STEPS=97728 \ EVAL_INTERVAL=5000 SAVE_INTERVAL=10000 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py @@ -113,8 +114,8 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ | --- | ---: | ---: | ---: | | `cotrain_real_only` | 2 × 8 | 1,024 | 5,000 | | `cotrain_real_only` | 4 × 8 | 2,048 | 2,500 | -| `cotrain_real_robot` | 2 × 8 | 1,024 | 150,000 | -| `cotrain_real_robot` | 4 × 8 | 2,048 | 75,000 | +| `cotrain_real_robot_fix` | 2 × 8 | 1,024 | 146,592 | +| `cotrain_real_robot_fix` | 4 × 8 | 2,048 | 73,296 | ```bash # 仅自采真机数据:16 卡 @@ -138,17 +139,17 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ ```bash # 自采真机 + 开源 Robot:16 卡 cd /data/wudi/baige-cluster -MODE=train CONFIG_NAME=cotrain_real_robot EXP_NAME=cotrain_real_robot_b200_16gpu_v1 \ +MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_16gpu_v1 \ INSTANCES=2 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1024 \ -NUM_TRAIN_STEPS=150000 WARMUP_STEPS=7500 DECAY_STEPS=150000 \ +NUM_TRAIN_STEPS=146592 WARMUP_STEPS=7330 DECAY_STEPS=146592 \ EVAL_INTERVAL=7500 SAVE_INTERVAL=15000 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py # 自采真机 + 开源 Robot:32 卡 -MODE=train CONFIG_NAME=cotrain_real_robot EXP_NAME=cotrain_real_robot_b200_32gpu_v1 \ +MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_32gpu_v1 \ INSTANCES=4 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=2048 \ -NUM_TRAIN_STEPS=75000 WARMUP_STEPS=3750 DECAY_STEPS=75000 \ +NUM_TRAIN_STEPS=73296 WARMUP_STEPS=3665 DECAY_STEPS=73296 \ EVAL_INTERVAL=3750 SAVE_INTERVAL=7500 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py diff --git a/scripts/preflight_cotrain_baige.py b/scripts/preflight_cotrain_baige.py index 45a3310..0c0e11f 100755 --- a/scripts/preflight_cotrain_baige.py +++ b/scripts/preflight_cotrain_baige.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -"""Fail-fast validation for the two Baige co-training configurations.""" +"""Fail-fast validation for the Baige co-training configurations.""" import argparse import json @@ -8,18 +8,33 @@ import numpy as np -from openpi.cotrain import action_space, config +from openpi.cotrain import action_space +from openpi.cotrain import config from openpi.shared import normalize +FIX_EXCLUDED_DATASET_IDS = { + "robocoin_leju_robot_s54_a54", + "robocoin_agilex_decoupled_magic_s14_a14_fps50", + "robocoin_agilex_decoupled_magic_s26_a26", +} + def validate(config_name: str, assets_base: Path, params_path: Path) -> None: cfg = config.get_config(config_name) datasets = cfg.data.datasets ids = [dataset.uid for dataset in datasets] - assert "piper30" in ids and "piper2" in ids + assert "piper30" in ids + assert "piper2" in ids assert not any(dataset_id.startswith("egoverse_") for dataset_id in ids) - expected_count = 2 if config_name == "cotrain_real_only" else 37 + expected_counts = { + "cotrain_real_only": 2, + "cotrain_real_robot": 37, + "cotrain_real_robot_fix": 34, + } + expected_count = expected_counts[config_name] assert len(ids) == expected_count, (config_name, len(ids), expected_count) + if config_name == "cotrain_real_robot_fix": + assert set(ids).isdisjoint(FIX_EXCLUDED_DATASET_IDS) for marker in ("_CHECKPOINT_METADATA", "manifest.ocdbt"): assert (params_path / marker).is_file(), params_path / marker @@ -64,7 +79,10 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: def main() -> None: parser = argparse.ArgumentParser() - parser.add_argument("config", choices=("cotrain_real_only", "cotrain_real_robot")) + parser.add_argument( + "config", + choices=("cotrain_real_only", "cotrain_real_robot", "cotrain_real_robot_fix"), + ) parser.add_argument("--assets-base", type=Path, default=Path("assets")) parser.add_argument("--params-path", type=Path, default=Path(os.environ["PARAMS_PATH"])) args = parser.parse_args() diff --git a/scripts/train_cotrain_baige.sh b/scripts/train_cotrain_baige.sh index cccca1a..4b31934 100755 --- a/scripts/train_cotrain_baige.sh +++ b/scripts/train_cotrain_baige.sh @@ -5,7 +5,7 @@ REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "${REPO_DIR}" source scripts/atom0_env.sh -CONFIG_NAME="${CONFIG_NAME:?Set CONFIG_NAME to cotrain_real_only or cotrain_real_robot}" +CONFIG_NAME="${CONFIG_NAME:?Set CONFIG_NAME to cotrain_real_only or cotrain_real_robot_fix}" EXP_NAME="${EXP_NAME:?Set EXP_NAME}" MODE="${MODE:-train}" # Keep 64 samples/GPU by default. WORLD_SIZE is the number of Baige nodes and @@ -23,9 +23,14 @@ case "${CONFIG_NAME}" in DEFAULT_VAL_BATCHES=10 DEFAULT_ACTION_MSE=1 ;; - cotrain_real_robot) - # One aggregate pass over the current 37-dataset norm metadata frames. - TRAIN_SAMPLES="${TRAIN_SAMPLES:-165126741}" + cotrain_real_robot|cotrain_real_robot_fix) + # One aggregate pass over norm metadata frames. The audited fix mixture removes + # Leju s54, Agilex fps50 and Agilex s26 (34 datasets, 150,109,749 frames). + if [[ "${CONFIG_NAME}" == "cotrain_real_robot_fix" ]]; then + TRAIN_SAMPLES="${TRAIN_SAMPLES:-150109749}" + else + TRAIN_SAMPLES="${TRAIN_SAMPLES:-165126741}" + fi DEFAULT_STEPS=$(((TRAIN_SAMPLES + BATCH_SIZE - 1) / BATCH_SIZE)) DEFAULT_WARMUP=5000 DEFAULT_EVAL_INTERVAL=5000 diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 5735e57..b85f8b5 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -759,12 +759,20 @@ def _scale_dataset_weights(datasets: tuple[CotrainRLDSDataset, ...], train_episo } -def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): - kept = tuple(ds for ds in datasets if ds.uid not in _FULL_ALL_EXCLUDED_DATASET_IDS) +def _drop_dataset_ids_and_renormalize( + datasets: tuple[CotrainRLDSDataset, ...], excluded_dataset_ids: set[str] | frozenset[str] +): + kept = tuple(ds for ds in datasets if ds.uid not in excluded_dataset_ids) + if not kept: + raise ValueError("At least one co-training dataset must remain after exclusions.") total_weight = sum(ds.weight for ds in kept) return tuple(dataclasses.replace(ds, weight=ds.weight / total_weight) for ds in kept) +def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): + return _drop_dataset_ids_and_renormalize(datasets, _FULL_ALL_EXCLUDED_DATASET_IDS) + + _FULL_ALL_DATA = CotrainDataConfig( rlds_data_dir=_RLDS_ROOT, datasets=_drop_excluded_and_renormalize( @@ -805,6 +813,24 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): ), ) +# Audited production mixture. Keep the original cotrain_real_robot config immutable for +# reproducibility, and exclude datasets whose sparse/corrupt tails make quantile normalization +# unsafe or destroy state conditioning. +_REAL_ROBOT_FIX_EXCLUDED_DATASET_IDS = frozenset( + { + "robocoin_leju_robot_s54_a54", + "robocoin_agilex_decoupled_magic_s14_a14_fps50", + "robocoin_agilex_decoupled_magic_s26_a26", + } +) +_REAL_ROBOT_FIX_DATA = dataclasses.replace( + _REAL_ROBOT_DATA, + datasets=_drop_dataset_ids_and_renormalize( + _REAL_ROBOT_DATA.datasets, + _REAL_ROBOT_FIX_EXCLUDED_DATASET_IDS, + ), +) + _UNIFIED_PI05_MODEL = pi0_config.Pi0Config( pi05=True, @@ -956,6 +982,12 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): data=_REAL_ROBOT_DATA, ) +_REAL_ROBOT_FIX_PI05 = dataclasses.replace( + _REAL_ROBOT_PI05, + name="cotrain_real_robot_fix", + data=_REAL_ROBOT_FIX_DATA, +) + _PIPER30_ONLY_PALIGEMMA = dataclasses.replace( _PIPER30_ONLY_PI05, name="cotrain_piper30_only_paligemma", @@ -976,6 +1008,7 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): _FULL_ALL_PI05_FULL_NORM, _REAL_ONLY_PI05, _REAL_ROBOT_PI05, + _REAL_ROBOT_FIX_PI05, # Clear explicit name for the intended training run. _PIPER30_ONLY_PI05, # Backward-compatible aliases: old launch commands will still train ONLY piper30 and diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index eadde4f..a1df335 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -42,3 +42,13 @@ def test_real_robot_contains_public_robot_data_but_no_egoverse() -> None: assert not any(dataset_id.startswith("egoverse_") for dataset_id in dataset_ids) assert dataset_ids.isdisjoint(config._FULL_ALL_EXCLUDED_DATASET_IDS) assert sum(dataset.weight for dataset in config._REAL_ROBOT_DATA.datasets) == pytest.approx(1.0) + + +def test_real_robot_fix_excludes_audited_risky_datasets_and_renormalizes() -> None: + original_ids = {dataset.uid for dataset in config._REAL_ROBOT_DATA.datasets} + fixed_ids = {dataset.uid for dataset in config._REAL_ROBOT_FIX_DATA.datasets} + + assert fixed_ids == original_ids - config._REAL_ROBOT_FIX_EXCLUDED_DATASET_IDS + assert len(fixed_ids) == 34 + assert sum(dataset.weight for dataset in config._REAL_ROBOT_FIX_DATA.datasets) == pytest.approx(1.0) + assert config.get_config("cotrain_real_robot_fix").data is config._REAL_ROBOT_FIX_DATA From f3b718f088f30d4cbd7b132966dc873607c5daf7 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Sat, 18 Jul 2026 17:52:01 +0800 Subject: [PATCH 14/64] update doc --- ...72\221\350\256\255\347\273\203\346\214\207\345\215\227.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index 4762cd5..e1b1208 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -100,8 +100,8 @@ export BOS_MOUNT_PATH=/mnt/bos/bo23lu MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_v1 \ INSTANCES=3 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1536 \ -NUM_TRAIN_STEPS=97728 WARMUP_STEPS=5000 DECAY_STEPS=97728 \ -EVAL_INTERVAL=5000 SAVE_INTERVAL=10000 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ +NUM_TRAIN_STEPS=100000 WARMUP_STEPS=5000 DECAY_STEPS=100000 \ +EVAL_INTERVAL=1000 SAVE_INTERVAL=10000 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py ``` From b28a546b42aec6c8e48f7ffb19cace563fd9ada1 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Sat, 18 Jul 2026 18:00:02 +0800 Subject: [PATCH 15/64] add assets --- .gitignore | 1 - .../cotrain_real_only/piper2/norm_stats.json | 664 ++++++++++++++++++ .../piper2/norm_stats_meta.json | 14 + .../piper2/unified_action_space.json | 5 + .../cotrain_real_only/piper30/norm_stats.json | 664 ++++++++++++++++++ .../piper30/norm_stats_meta.json | 14 + .../piper30/unified_action_space.json | 5 + .../cotrain_real_robot/agibot/norm_stats.json | 664 ++++++++++++++++++ .../agibot/norm_stats_meta.json | 14 + .../agibot/unified_action_space.json | 5 + .../cotrain_real_robot/droid/norm_stats.json | 664 ++++++++++++++++++ .../droid/norm_stats_meta.json | 14 + .../droid/unified_action_space.json | 5 + .../full_norm_run_meta.json | 527 ++++++++++++++ .../cotrain_real_robot/piper2/norm_stats.json | 664 ++++++++++++++++++ .../piper2/norm_stats_meta.json | 14 + .../piper2/unified_action_space.json | 5 + .../piper30/norm_stats.json | 664 ++++++++++++++++++ .../piper30/norm_stats_meta.json | 14 + .../piper30/unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../robocoin_aloha_s26_a26/norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../robocoin_yinhe_s49_a16/norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../robomind_ur5e_s7_a7/norm_stats.json | 664 ++++++++++++++++++ .../robomind_ur5e_s7_a7/norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../agibot/norm_stats.json | 664 ++++++++++++++++++ .../agibot/norm_stats_meta.json | 14 + .../agibot/unified_action_space.json | 5 + .../droid/norm_stats.json | 664 ++++++++++++++++++ .../droid/norm_stats_meta.json | 14 + .../droid/unified_action_space.json | 5 + .../full_norm_run_meta.json | 527 ++++++++++++++ .../piper2/norm_stats.json | 664 ++++++++++++++++++ .../piper2/norm_stats_meta.json | 14 + .../piper2/unified_action_space.json | 5 + .../piper30/norm_stats.json | 664 ++++++++++++++++++ .../piper30/norm_stats_meta.json | 14 + .../piper30/unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../robocoin_aloha_s26_a26/norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../robocoin_yinhe_s49_a16/norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../robomind_ur5e_s7_a7/norm_stats.json | 664 ++++++++++++++++++ .../robomind_ur5e_s7_a7/norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + 231 files changed, 52962 insertions(+), 1 deletion(-) create mode 100644 assets/cotrain_real_only/piper2/norm_stats.json create mode 100644 assets/cotrain_real_only/piper2/norm_stats_meta.json create mode 100644 assets/cotrain_real_only/piper2/unified_action_space.json create mode 100644 assets/cotrain_real_only/piper30/norm_stats.json create mode 100644 assets/cotrain_real_only/piper30/norm_stats_meta.json create mode 100644 assets/cotrain_real_only/piper30/unified_action_space.json create mode 100644 assets/cotrain_real_robot/agibot/norm_stats.json create mode 100644 assets/cotrain_real_robot/agibot/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/agibot/unified_action_space.json create mode 100644 assets/cotrain_real_robot/droid/norm_stats.json create mode 100644 assets/cotrain_real_robot/droid/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/droid/unified_action_space.json create mode 100644 assets/cotrain_real_robot/full_norm_run_meta.json create mode 100644 assets/cotrain_real_robot/piper2/norm_stats.json create mode 100644 assets/cotrain_real_robot/piper2/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/piper2/unified_action_space.json create mode 100644 assets/cotrain_real_robot/piper30/norm_stats.json create mode 100644 assets/cotrain_real_robot/piper30/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/piper30/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_agilex_cobot_magic_s26_a26/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_agilex_cobot_magic_s26_a26/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_agilex_cobot_magic_s26_a26/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps30/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps50/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s26_a26/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s26_a26/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s26_a26/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_airbot_mmk2_s36_a36/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_airbot_mmk2_s36_a36/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_airbot_mmk2_s36_a36/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_aloha_s26_a26/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_aloha_s26_a26/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_aloha_s26_a26/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_alpha_bot_2_s28_a28/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_alpha_bot_2_s28_a28/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_alpha_bot_2_s28_a28/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_discover_aitbot_mmk2_s36_a36/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s14_a14/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s14_a14/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s14_a14/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s16_a18/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s16_a18/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s16_a18/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_galaxea_r1_lite_upper_s14_a14/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_leju_robot_s118_a54/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_leju_robot_s118_a54/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_leju_robot_s118_a54/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_leju_robot_s54_a54/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_leju_robot_s54_a54/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_leju_robot_s54_a54/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_realman_rmc_aida_l_s28_a28/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_realman_rmc_aida_l_s28_a28/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_realman_rmc_aida_l_s28_a28/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_realman_rmc_aidal_s28_a28/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_realman_rmc_aidal_s28_a28/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_realman_rmc_aidal_s28_a28/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_ruantong_a2d_s17_a17/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_ruantong_a2d_s17_a17/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_ruantong_a2d_s17_a17/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_ruantong_a2d_s41_a34/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_ruantong_a2d_s41_a34/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_ruantong_a2d_s41_a34/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28_high/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28_high/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28_high/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_unknown_s30_a30_high/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_unknown_s30_a30_high/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_unknown_s30_a30_high/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robocoin_yinhe_s49_a16/norm_stats.json create mode 100644 assets/cotrain_real_robot/robocoin_yinhe_s49_a16/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robocoin_yinhe_s49_a16/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robomind_agilex_cobot_magic_s14_a14/norm_stats.json create mode 100644 assets/cotrain_real_robot/robomind_agilex_cobot_magic_s14_a14/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robomind_agilex_cobot_magic_s14_a14/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robomind_franka_fr3_dual_s16_a16/norm_stats.json create mode 100644 assets/cotrain_real_robot/robomind_franka_fr3_dual_s16_a16/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robomind_franka_fr3_dual_s16_a16/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robomind_franka_panda_s8_a8/norm_stats.json create mode 100644 assets/cotrain_real_robot/robomind_franka_panda_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robomind_franka_panda_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robomind_franka_sim_franka_s8_a8/norm_stats.json create mode 100644 assets/cotrain_real_robot/robomind_franka_sim_franka_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robomind_franka_sim_franka_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robomind_franka_sim_none_s8_a8/norm_stats.json create mode 100644 assets/cotrain_real_robot/robomind_franka_sim_none_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robomind_franka_sim_none_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats.json create mode 100644 assets/cotrain_real_robot/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robomind_franka_sim_simulation_no_front_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robomind_franka_sim_simulation_s8_a8/norm_stats.json create mode 100644 assets/cotrain_real_robot/robomind_franka_sim_simulation_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robomind_franka_sim_simulation_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robomind_tienkung_gello_s16_a16/norm_stats.json create mode 100644 assets/cotrain_real_robot/robomind_tienkung_gello_s16_a16/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robomind_tienkung_gello_s16_a16/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robomind_tienkung_prod1_gello_s16_a16/norm_stats.json create mode 100644 assets/cotrain_real_robot/robomind_tienkung_prod1_gello_s16_a16/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robomind_tienkung_prod1_gello_s16_a16/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robomind_tienkung_real_s38_a38/norm_stats.json create mode 100644 assets/cotrain_real_robot/robomind_tienkung_real_s38_a38/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robomind_tienkung_real_s38_a38/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robomind_tienkung_xsens_s14_a14/norm_stats.json create mode 100644 assets/cotrain_real_robot/robomind_tienkung_xsens_s14_a14/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robomind_tienkung_xsens_s14_a14/unified_action_space.json create mode 100644 assets/cotrain_real_robot/robomind_ur5e_s7_a7/norm_stats.json create mode 100644 assets/cotrain_real_robot/robomind_ur5e_s7_a7/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot/robomind_ur5e_s7_a7/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/agibot/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/agibot/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/agibot/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/droid/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/droid/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/droid/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/full_norm_run_meta.json create mode 100644 assets/cotrain_real_robot_fix/piper2/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/piper2/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/piper2/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/piper30/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/piper30/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/piper30/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_agilex_cobot_magic_s26_a26/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_agilex_cobot_magic_s26_a26/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_agilex_cobot_magic_s26_a26/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps30/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps50/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s26_a26/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s26_a26/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s26_a26/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_airbot_mmk2_s36_a36/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_airbot_mmk2_s36_a36/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_airbot_mmk2_s36_a36/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_aloha_s26_a26/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_aloha_s26_a26/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_aloha_s26_a26/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_alpha_bot_2_s28_a28/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_alpha_bot_2_s28_a28/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_alpha_bot_2_s28_a28/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_discover_aitbot_mmk2_s36_a36/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s14_a14/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s14_a14/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s14_a14/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s16_a18/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s16_a18/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s16_a18/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_upper_s14_a14/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_leju_robot_s118_a54/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_leju_robot_s118_a54/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_leju_robot_s118_a54/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_leju_robot_s54_a54/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_leju_robot_s54_a54/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_leju_robot_s54_a54/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_realman_rmc_aida_l_s28_a28/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_realman_rmc_aida_l_s28_a28/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_realman_rmc_aida_l_s28_a28/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_realman_rmc_aidal_s28_a28/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_realman_rmc_aidal_s28_a28/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_realman_rmc_aidal_s28_a28/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s17_a17/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s17_a17/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s17_a17/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s41_a34/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s41_a34/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s41_a34/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28_high/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28_high/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28_high/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_unknown_s30_a30_high/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_unknown_s30_a30_high/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_unknown_s30_a30_high/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_yinhe_s49_a16/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_yinhe_s49_a16/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robocoin_yinhe_s49_a16/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robomind_agilex_cobot_magic_s14_a14/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robomind_agilex_cobot_magic_s14_a14/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robomind_agilex_cobot_magic_s14_a14/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_fr3_dual_s16_a16/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_fr3_dual_s16_a16/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_fr3_dual_s16_a16/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_panda_s8_a8/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_panda_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_panda_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_sim_franka_s8_a8/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_sim_franka_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_sim_franka_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_sim_none_s8_a8/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_sim_none_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_sim_none_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_no_front_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_s8_a8/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robomind_tienkung_gello_s16_a16/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robomind_tienkung_gello_s16_a16/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robomind_tienkung_gello_s16_a16/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robomind_tienkung_prod1_gello_s16_a16/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robomind_tienkung_prod1_gello_s16_a16/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robomind_tienkung_prod1_gello_s16_a16/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robomind_tienkung_real_s38_a38/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robomind_tienkung_real_s38_a38/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robomind_tienkung_real_s38_a38/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robomind_tienkung_xsens_s14_a14/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robomind_tienkung_xsens_s14_a14/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robomind_tienkung_xsens_s14_a14/unified_action_space.json create mode 100644 assets/cotrain_real_robot_fix/robomind_ur5e_s7_a7/norm_stats.json create mode 100644 assets/cotrain_real_robot_fix/robomind_ur5e_s7_a7/norm_stats_meta.json create mode 100644 assets/cotrain_real_robot_fix/robomind_ur5e_s7_a7/unified_action_space.json diff --git a/.gitignore b/.gitignore index 8f91349..c422c18 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ # Data directories. -assets/ checkpoints/ data/ wandb/ diff --git a/assets/cotrain_real_only/piper2/norm_stats.json b/assets/cotrain_real_only/piper2/norm_stats.json new file mode 100644 index 0000000..f4b690f --- /dev/null +++ b/assets/cotrain_real_only/piper2/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.08570596575737, + 0.9424582123756409, + -0.5610473155975342, + -0.018378613516688347, + 0.15650981664657593, + -0.04922034963965416, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.008945055305957794, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.22233717143535614, + 1.3927223682403564, + -0.8957882523536682, + 0.17042388021945953, + 0.3040333390235901, + -0.07112878561019897, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01350892148911953, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1714383214712143, + 0.7361369132995605, + 0.5368331670761108, + 0.3496498763561249, + 0.4911200702190399, + 0.28332507610321045, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.02536850981414318, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2436714768409729, + 0.651149570941925, + 0.6894615888595581, + 0.3136552572250366, + 0.6569122076034546, + 0.2134801149368286, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.030022503808140755, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4991710331201553, + 0.0054144344157539305, + -1.7947804824004416, + -1.1790875864982606, + -0.9716636402130128, + -0.539963323020935, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.002318800112977624, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.2646023983061313, + 0.08680244942149147, + -2.2326956740360706, + -0.39387080802917473, + -0.9721601041316986, + -0.6741397899150849, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.003800000064074993, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.38600136826038356, + 2.2529563539030497, + -0.002522718032682114, + 0.6737772881984712, + 1.2084734504699708, + 0.8707268574714662, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09907970115607603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7167606556713582, + 2.391043433867162, + 0.00008864541053776875, + 1.1195562719345094, + 1.2258558490276337, + 0.3745928731918333, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09959649641532452, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0010017158929258585, + 0.0017170342616736889, + -0.0017244319897145033, + -0.005731134209781885, + 0.002714053960517049, + 0.002033872064203024, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.008943209424614906, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0010065166279673576, + 0.0033344815019518137, + -0.00027303790557198226, + 0.0020667631179094315, + 0.001737685059197247, + -0.0029692337848246098, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01350709330290556, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.08381801843643188, + 0.31304702162742615, + 0.23983915150165558, + 0.10776226967573166, + 0.18366022408008575, + 0.09571901708841324, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.025366676971316338, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1489294171333313, + 0.33599135279655457, + 0.27681979537010193, + 0.1537630707025528, + 0.19053618609905243, + 0.09432122856378555, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.030021704733371735, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.3243094861030579, + -0.9993304105758667, + -0.7881305526733398, + -0.4524798871994018, + -0.6921295278072357, + -0.2691142694234848, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.002318800112977624, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5554006125926971, + -1.084025181722641, + -0.9235458539009094, + -0.5143094916582107, + -0.686023402261734, + -0.3556695580482483, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.003800000064074993, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.3279062141418456, + 1.0899867341041567, + 0.9700191698074341, + 0.33629278821945197, + 0.6258798820972444, + 0.406562376332283, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09907970115607603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4854212229251862, + 1.2325074484825134, + 0.9927912852764131, + 0.5601088427543641, + 0.6361501549243929, + 0.30015870928764343, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09959649641532452, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_only/piper2/norm_stats_meta.json b/assets/cotrain_real_only/piper2/norm_stats_meta.json new file mode 100644 index 0000000..c3f6eff --- /dev/null +++ b/assets/cotrain_real_only/piper2/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "piper2", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_2/realworld_piper_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 21548, + "num_frames": 689528, + "estimated_total_batches": null, + "train_episodes": 902, + "train_bytes": 111529419925, + "elapsed_sec": 182.0517978668213, + "frames_per_sec": 3787.537437583667 +} \ No newline at end of file diff --git a/assets/cotrain_real_only/piper2/unified_action_space.json b/assets/cotrain_real_only/piper2/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_real_only/piper2/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_real_only/piper30/norm_stats.json b/assets/cotrain_real_only/piper30/norm_stats.json new file mode 100644 index 0000000..6130c4e --- /dev/null +++ b/assets/cotrain_real_only/piper30/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0760473981499672, + 1.0517759323120117, + -0.7747761011123657, + 0.15242573618888855, + 0.4494738280773163, + -0.09137012809515, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.016618814319372177, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07727460563182831, + 0.7200653553009033, + -0.4604390561580658, + -0.2260405272245407, + 0.24460497498512268, + 0.16355007886886597, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01185830868780613, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.28079867362976074, + 0.8831034302711487, + 0.7211003303527832, + 0.7177441716194153, + 0.5327411890029907, + 0.6071151494979858, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03437401354312897, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2081252783536911, + 0.8027406930923462, + 0.5713866949081421, + 0.6549085378646851, + 0.4776606559753418, + 0.4999569356441498, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.031229877844452858, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4875116139650345, + -0.00043919531644787645, + -2.2551212312346323, + -1.5829997071027755, + -0.6845841318130493, + -1.615586260795593, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0029380800276063383, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4486167727947235, + -0.005599666852504015, + -1.8685801381547935, + -1.7327060890197754, + -0.762030679988861, + -0.9720964525461196, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0035174399364739655, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.8876427154064179, + 2.4845687208327694, + 0.0026788388188001555, + 1.7340745076179505, + 1.2515803995132444, + 1.6471686191558836, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09956015744088217, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6083275032162665, + 2.198549814021401, + 0.005637001402210462, + 1.3888049545288084, + 1.2151789251804352, + 1.545086481523514, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09957936216918752, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0020336343441158533, + -0.0003478959552012384, + 0.0036158752627670765, + -0.0018518087454140186, + -0.002676568226888776, + 0.0017340786289423704, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01780613325536251, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.002196062356233597, + 0.0025906015653163195, + -0.0007922314689494669, + -0.0006751723121851683, + -0.0008008037693798542, + -0.000598791753873229, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.012778770178556442, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.13291876018047333, + 0.4570249021053314, + 0.3580925762653351, + 0.3361109495162964, + 0.2754795253276825, + 0.30054646730422974, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03545059636235237, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09071528911590576, + 0.31943845748901367, + 0.23047679662704468, + 0.20181375741958618, + 0.183805450797081, + 0.1964036524295807, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03226304054260254, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.5487480565547943, + -1.598214064502716, + -1.1666529998779296, + -1.2725653482437136, + -1.0261658200979231, + -1.0280169901371001, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0029380800276063383, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.3517950798034668, + -1.1833345177173613, + -0.9023950806617738, + -0.7187113502502438, + -0.6822588787078857, + -0.7689471103668215, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0035174399364739655, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.40653051655292516, + 1.6554438406944278, + 1.3955223114013675, + 1.2879812050342556, + 1.0254203120470047, + 1.127150822353363, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09956015744088217, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3331105176448823, + 1.3341810100555422, + 0.9261858076095582, + 0.7806027033805849, + 0.7630852434158326, + 0.6658555793762204, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09957936216918752, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_only/piper30/norm_stats_meta.json b/assets/cotrain_real_only/piper30/norm_stats_meta.json new file mode 100644 index 0000000..cc22714 --- /dev/null +++ b/assets/cotrain_real_only/piper30/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "piper30", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 69490, + "num_frames": 2223663, + "estimated_total_batches": null, + "train_episodes": 5307, + "train_bytes": 350058169358, + "elapsed_sec": 558.5227379798889, + "frames_per_sec": 3981.3294048559737 +} \ No newline at end of file diff --git a/assets/cotrain_real_only/piper30/unified_action_space.json b/assets/cotrain_real_only/piper30/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_real_only/piper30/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_real_robot/agibot/norm_stats.json b/assets/cotrain_real_robot/agibot/norm_stats.json new file mode 100644 index 0000000..3b0685f --- /dev/null +++ b/assets/cotrain_real_robot/agibot/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.9210807681083679, + 0.5359001755714417, + 0.6545957326889038, + -0.7835156917572021, + 0.49938780069351196, + 1.1667169332504272, + 0.18891742825508118, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 68.11420440673828, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9076082110404968, + -0.46920207142829895, + -0.6356353163719177, + 0.7388717532157898, + -0.563096821308136, + -1.190690040588379, + -0.2128467708826065, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 62.9249153137207, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.015158376656472683, + 0.43660369515419006, + 0.46915775537490845, + 0.28688758611679077, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.1222560405731201, + 0.7990611791610718, + 0.9331700801849365, + 0.4298188388347626, + 0.5488388538360596, + 0.4325656592845917, + 0.7940273284912109, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 38.27954864501953, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0739389657974243, + 0.7449344992637634, + 0.9927517175674438, + 0.43602320551872253, + 0.58744877576828, + 0.409100741147995, + 0.741567075252533, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 36.552215576171875, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.044218555092811584, + 0.09825704991817474, + 0.14466187357902527, + 0.10195881873369217, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -2.3409746315956115, + -1.636828637123108, + -1.6977303141593931, + -1.4809685335159302, + -0.8208179449558255, + -0.6260671993255615, + -2.3568282432556154, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 34.4988072265625, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.9538713235855103, + -1.5447361523151397, + -2.1905040143489836, + -0.29421191997528084, + -2.4507909409999846, + -1.73033405251503, + -2.070129588508606, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 34.645408143234256, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.14006894874572756, + 0.05231554777622224, + -9.386273188283635e-7, + -0.00002157160452043172, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.9056857607841486, + 1.5327249885797505, + 2.1687543660163886, + 0.024525047016143775, + 1.6984838352680205, + 1.7286521408081055, + 1.8420831871032712, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 122.81813722076416, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.2422985345840454, + 1.4218171607971195, + 1.6568048201084142, + 1.475336287808418, + 0.9665897595882411, + 0.12981792721748353, + 2.1170754617691045, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 121.32148989295959, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08697387295961378, + 0.523526303935051, + 0.6805916502833599, + 0.44983564859252584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0007903198711574078, + 0.00011111732601420954, + 0.003278969321399927, + 0.0018502098973840475, + -0.0018388478783890605, + -0.0026262151077389717, + 0.0018169175600633025, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.42531853914260864, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0017990715568885207, + 0.00021451868815347552, + -0.005517459008842707, + -0.0024181653279811144, + 0.002791187958791852, + 0.002916863653808832, + -0.0025791008956730366, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3584616482257843, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.015158386901021004, + 0.43660271167755127, + 0.4691601097583771, + 0.28689104318618774, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.06166767701506615, + 0.06289893388748169, + 0.054367028176784515, + 0.06547970324754715, + 0.0702083557844162, + 0.07014007121324539, + 0.09278079867362976, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4933164119720459, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.06577219814062119, + 0.07637953013181686, + 0.06400372833013535, + 0.0757603719830513, + 0.07687703520059586, + 0.07965576648712158, + 0.10504146665334702, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.477949857711792, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.04421856254339218, + 0.09826167672872543, + 0.14465774595737457, + 0.10195144265890121, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.2101372690677643, + -0.2321174460649491, + -0.17257755661010732, + -0.20412157559394828, + -0.2611778012275696, + -0.27466095159053805, + -0.31812099928855897, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.21728988885879508, + -0.24020811669826514, + -0.24614887866973878, + -0.2764002819538116, + -0.24440300831794737, + -0.2453194079399108, + -0.3429291203022, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.14006894874572756, + 0.05231554777622224, + -9.386273188283635e-7, + -0.00002157160452043172, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.20963992025852196, + 0.1999978750944138, + 0.2047261504173281, + 0.24245942616462712, + 0.22355237565040564, + 0.21409198014736175, + 0.31090978384017953, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22425809392929086, + 0.27321109790802, + 0.18851629810333237, + 0.22489868850708006, + 0.27490250425338747, + 0.2988687011241915, + 0.3503418828487397, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08697387295961378, + 0.523526303935051, + 0.6805916502833599, + 0.44983564859252584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/agibot/norm_stats_meta.json b/assets/cotrain_real_robot/agibot/norm_stats_meta.json new file mode 100644 index 0000000..dbd5f23 --- /dev/null +++ b/assets/cotrain_real_robot/agibot/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "agibot", + "builder_dir": "/mnt/bos/bo23lu/AgiBot/agibot_world_robot_agibot_world_beta_mobile_dual_arm_joint_absolute_position_real_s20_a20_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_22986/agibot_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1059832, + "num_frames": 33914594, + "estimated_total_batches": null, + "train_episodes": 21837, + "train_bytes": 7547826566949, + "elapsed_sec": 9102.592523097992, + "frames_per_sec": 3725.8170036658357 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/agibot/unified_action_space.json b/assets/cotrain_real_robot/agibot/unified_action_space.json new file mode 100644 index 0000000..cf12aa9 --- /dev/null +++ b/assets/cotrain_real_robot/agibot/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "5e45fd3b2852b2a3e91da045db1d52fa4b8cd7429974403773734c355b6a795c" +} diff --git a/assets/cotrain_real_robot/droid/norm_stats.json b/assets/cotrain_real_robot/droid/norm_stats.json new file mode 100644 index 0000000..c9937ea --- /dev/null +++ b/assets/cotrain_real_robot/droid/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.014264719560742378, + 0.23982040584087372, + -0.014591705054044724, + -2.0273144245147705, + -0.03576287254691124, + 2.323211669921875, + 0.0828426331281662, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3599560260772705, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.32424554228782654, + 0.5158682465553284, + 0.28870725631713867, + 0.5025275349617004, + 0.5316236019134521, + 0.46866557002067566, + 0.7423588037490845, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4027109742164612, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9240023367881773, + -0.8884155247688293, + -0.932663969230652, + -2.7749946952819826, + -1.845044603061676, + 1.1692317866563797, + -2.0730253297805787, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.982635237503052, + 1.4446059867143632, + 0.8277577193260188, + -0.44634648761749274, + 1.7120736752033237, + 3.5038524341106414, + 2.212446826171875, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.991, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0009084727498702705, + 0.04833802580833435, + -0.0012050201185047626, + 0.03542366996407509, + -0.0021518415305763483, + 0.019638868048787117, + 0.006257439497858286, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.40670886635780334, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17263764142990112, + 0.32643333077430725, + 0.16556227207183838, + 0.29040563106536865, + 0.2672358453273773, + 0.28381240367889404, + 0.3206557035446167, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.43752798438072205, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5209945830345153, + -0.7863647277832031, + -0.5066786664962768, + -0.82759104347229, + -0.8665996181488036, + -0.7820417912006377, + -0.9812896099090573, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5199369877338409, + 1.044959797668457, + 0.4928590750694273, + 0.9082127244472509, + 0.8440616558074954, + 0.8804159455299381, + 0.9947045337677007, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/droid/norm_stats_meta.json b/assets/cotrain_real_robot/droid/norm_stats_meta.json new file mode 100644 index 0000000..3eaccb2 --- /dev/null +++ b/assets/cotrain_real_robot/droid/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "droid", + "builder_dir": "/mnt/bos/bo23lu/DROID/droid_infidata/1.1.0", + "split": "train", + "batch_size": 32, + "num_batches": 578829, + "num_frames": 18522518, + "estimated_total_batches": null, + "train_episodes": 64124, + "train_bytes": 1185946441420, + "elapsed_sec": 4512.591522216797, + "frames_per_sec": 4104.629880371018 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/droid/unified_action_space.json b/assets/cotrain_real_robot/droid/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_real_robot/droid/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_real_robot/full_norm_run_meta.json b/assets/cotrain_real_robot/full_norm_run_meta.json new file mode 100644 index 0000000..7e242c9 --- /dev/null +++ b/assets/cotrain_real_robot/full_norm_run_meta.json @@ -0,0 +1,527 @@ +{ + "config_name": "cotrain_real_robot", + "output_assets_dir": "/data/wudi/Atom-0/assets/cotrain_real_robot", + "dataset_id": null, + "skip_dataset_ids": [], + "copy_from_assets_name": null, + "datasets": [ + { + "config_name": "cotrain_real_robot", + "dataset_id": "piper30", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 69490, + "num_frames": 2223663, + "estimated_total_batches": null, + "train_episodes": 5307, + "train_bytes": 350058169358, + "elapsed_sec": 558.5227379798889, + "frames_per_sec": 3981.3294048559737 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "piper2", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_2/realworld_piper_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 21548, + "num_frames": 689528, + "estimated_total_batches": null, + "train_episodes": 902, + "train_bytes": 111529419925, + "elapsed_sec": 182.0517978668213, + "frames_per_sec": 3787.537437583667 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "agibot", + "builder_dir": "/mnt/bos/bo23lu/AgiBot/agibot_world_robot_agibot_world_beta_mobile_dual_arm_joint_absolute_position_real_s20_a20_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_22986/agibot_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1059832, + "num_frames": 33914594, + "estimated_total_batches": null, + "train_episodes": 21837, + "train_bytes": 7547826566949, + "elapsed_sec": 9102.592523097992, + "frames_per_sec": 3725.8170036658357 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "droid", + "builder_dir": "/mnt/bos/bo23lu/DROID/droid_infidata/1.1.0", + "split": "train", + "batch_size": 32, + "num_batches": 578829, + "num_frames": 18522518, + "estimated_total_batches": null, + "train_episodes": 64124, + "train_bytes": 1185946441420, + "elapsed_sec": 4512.591522216797, + "frames_per_sec": 4104.629880371018 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_cobot_magic_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Agilex_Cobot_Magic_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_8284/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 187608, + "num_frames": 6003434, + "estimated_total_batches": null, + "train_episodes": 7870, + "train_bytes": 690618678004, + "elapsed_sec": 1551.8257114887238, + "frames_per_sec": 3868.6264543462707 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_airbot_mmk2_s36_a36", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Airbot_MMK2_s36_a36_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10532/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 81017, + "num_frames": 2592540, + "estimated_total_batches": null, + "train_episodes": 10005, + "train_bytes": 431087330611, + "elapsed_sec": 690.6267569065094, + "frames_per_sec": 3753.8945227269173 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_upper_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Galaxea_R1_Lite_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_3650/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 27171, + "num_frames": 869469, + "estimated_total_batches": null, + "train_episodes": 1337, + "train_bytes": 205435325084, + "elapsed_sec": 271.46593260765076, + "frames_per_sec": 3202.8659789758667 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_realman_rmc_aida_l_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Realman_RMC-AIDA-L_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_693/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 9936, + "num_frames": 317940, + "estimated_total_batches": null, + "train_episodes": 658, + "train_bytes": 36471840854, + "elapsed_sec": 89.87298893928528, + "frames_per_sec": 3537.6591315416026 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s14_a14_fps30", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_7778/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 142767, + "num_frames": 4568537, + "estimated_total_batches": null, + "train_episodes": 7389, + "train_bytes": 1807557839316, + "elapsed_sec": 1851.0555272102356, + "frames_per_sec": 2468.0712884314917 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s14_a14_fps50", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s14_a14_fps50_cam_high_cam_left_wrist_cam_right_wrist__episodes_3397/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 54108, + "num_frames": 1731438, + "estimated_total_batches": null, + "train_episodes": 3227, + "train_bytes": 264209590712, + "elapsed_sec": 452.58451652526855, + "frames_per_sec": 3825.667774260525 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_23712/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 413112, + "num_frames": 13219572, + "estimated_total_batches": null, + "train_episodes": 18406, + "train_bytes": 1649570846072, + "elapsed_sec": 3489.1643438339233, + "frames_per_sec": 3788.750169753891 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_aloha_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/aloha_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_4879/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 198055, + "num_frames": 6337741, + "estimated_total_batches": null, + "train_episodes": 4634, + "train_bytes": 962548578236, + "elapsed_sec": 1664.1732065677643, + "frames_per_sec": 3808.3421695456377 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_alpha_bot_2_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/alpha_bot_2_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_857/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 22703, + "num_frames": 726485, + "estimated_total_batches": null, + "train_episodes": 814, + "train_bytes": 109263908150, + "elapsed_sec": 205.29979014396667, + "frames_per_sec": 3538.6543721771545 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_discover_aitbot_mmk2_s36_a36", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/discover_robotics_aitbot_mmk2_s36_a36_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5747/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 36260, + "num_frames": 1160293, + "estimated_total_batches": null, + "train_episodes": 5460, + "train_bytes": 194302774076, + "elapsed_sec": 348.6094217300415, + "frames_per_sec": 3328.34664720713 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/galaxea_r1_lite_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5167/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 245253, + "num_frames": 7848088, + "estimated_total_batches": null, + "train_episodes": 4886, + "train_bytes": 3346209600799, + "elapsed_sec": 3871.8957114219666, + "frames_per_sec": 2026.9368249894735 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_s16_a18", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/galaxea_r1_lite_s16_a18_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_970/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 9866, + "num_frames": 315700, + "estimated_total_batches": null, + "train_episodes": 922, + "train_bytes": 100400838947, + "elapsed_sec": 127.63867783546448, + "frames_per_sec": 2473.388202962743 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_leju_robot_s118_a54", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/leju_robot_s118_a54_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_17897/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 458510, + "num_frames": 14672292, + "estimated_total_batches": null, + "train_episodes": 17002, + "train_bytes": 4898931416952, + "elapsed_sec": 5203.681373596191, + "frames_per_sec": 2819.598462436255 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_leju_robot_s54_a54", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/leju_robot_s54_a54_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_394/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 2062, + "num_frames": 65982, + "estimated_total_batches": null, + "train_episodes": 374, + "train_bytes": 22504353358, + "elapsed_sec": 31.398486614227295, + "frames_per_sec": 2101.4388626648715 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_realman_rmc_aidal_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/realman_rmc_aidal_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_18412/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 492790, + "num_frames": 15769266, + "estimated_total_batches": null, + "train_episodes": 17481, + "train_bytes": 1684550435506, + "elapsed_sec": 4069.850043296814, + "frames_per_sec": 3874.655290057317 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_ruantong_a2d_s17_a17", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/ruantong_a2d_s17_a17_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_1719/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 32248, + "num_frames": 1031909, + "estimated_total_batches": null, + "train_episodes": 1633, + "train_bytes": 232098850893, + "elapsed_sec": 277.61806178092957, + "frames_per_sec": 3717.009597215209 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_ruantong_a2d_s41_a34", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/ruantong_a2d_s41_a34_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_6459/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 85004, + "num_frames": 2720116, + "estimated_total_batches": null, + "train_episodes": 6136, + "train_bytes": 1133795856617, + "elapsed_sec": 1135.4377226829529, + "frames_per_sec": 2395.654068611155 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unitree_g1_s28_a28_high", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unitree_g1_s28_a28_fps30_cam_high__episodes_227/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 2287, + "num_frames": 73184, + "estimated_total_batches": null, + "train_episodes": 216, + "train_bytes": 3159483310, + "elapsed_sec": 28.13194966316223, + "frames_per_sec": 2601.4549605081866 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unitree_g1_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unitree_g1_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_931/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 19765, + "num_frames": 632462, + "estimated_total_batches": null, + "train_episodes": 884, + "train_bytes": 137723586828, + "elapsed_sec": 202.07107949256897, + "frames_per_sec": 3129.898655404859 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unknown_s30_a30_high", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unknown_s30_a30_fps30_cam_high__episodes_891/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 8154, + "num_frames": 260914, + "estimated_total_batches": null, + "train_episodes": 846, + "train_bytes": 20178322671, + "elapsed_sec": 82.17656183242798, + "frames_per_sec": 3175.041571245681 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_yinhe_s49_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/yinhe_s49_a16_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5452/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 153600, + "num_frames": 4915186, + "estimated_total_batches": null, + "train_episodes": 5179, + "train_bytes": 711128217385, + "elapsed_sec": 1323.132462978363, + "frames_per_sec": 3714.810223109443 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_agilex_cobot_magic_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/agilex_cobot_magic_agilex_dual_arm_h5_agilex_3rgb_real_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10374/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 196965, + "num_frames": 6302870, + "estimated_total_batches": null, + "train_episodes": 9855, + "train_bytes": 1015824843385, + "elapsed_sec": 1625.2714269161224, + "frames_per_sec": 3878.0414739459275 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_fr3_dual_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_fr3_dual_master_puppet_joint_position_h5_franka_fr3_dual_real_s16_a16_fps30_cam_high_cam_left_cam_right_cam_top__episodes_1774/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 11198, + "num_frames": 358321, + "estimated_total_batches": null, + "train_episodes": 1685, + "train_bytes": 186172127608, + "elapsed_sec": 205.53938150405884, + "frames_per_sec": 1743.3204156689756 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_panda_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_panda_master_puppet_joint_position_h5_franka_3rgb_real_s8_a8_fps30_cam_left_cam_right_cam_top__episodes_17219/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 57958, + "num_frames": 1854642, + "estimated_total_batches": null, + "train_episodes": 14956, + "train_bytes": 282424151738, + "elapsed_sec": 465.4217314720154, + "frames_per_sec": 3984.8633499218436 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_franka_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_sim_franka_3rgb_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_14488/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 48250, + "num_frames": 1543972, + "estimated_total_batches": null, + "train_episodes": 8445, + "train_bytes": 675920469639, + "elapsed_sec": 665.9570224285126, + "frames_per_sec": 2318.4258863577616 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_simulation_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_11422/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 53134, + "num_frames": 1700279, + "estimated_total_batches": null, + "train_episodes": 8662, + "train_bytes": 465501426716, + "elapsed_sec": 452.24869179725647, + "frames_per_sec": 3759.6106541359254 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_simulation_no_front_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_handeye_cam_left_external_cam_right_external__episodes_158/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1067, + "num_frames": 34125, + "estimated_total_batches": null, + "train_episodes": 150, + "train_bytes": 7133719955, + "elapsed_sec": 11.634025812149048, + "frames_per_sec": 2933.2064885367827 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_none_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_none_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_222/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1107, + "num_frames": 35418, + "estimated_total_batches": null, + "train_episodes": 211, + "train_bytes": 6706236456, + "elapsed_sec": 11.181196451187134, + "frames_per_sec": 3167.6395414946483 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_gello_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_6626/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 102313, + "num_frames": 3274013, + "estimated_total_batches": null, + "train_episodes": 5402, + "train_bytes": 214477074867, + "elapsed_sec": 861.7713775634766, + "frames_per_sec": 3799.1665599950165 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_prod1_gello_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_prod1_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_2959/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 50624, + "num_frames": 1619947, + "estimated_total_batches": null, + "train_episodes": 2811, + "train_bytes": 247276602528, + "elapsed_sec": 426.9908273220062, + "frames_per_sec": 3793.868383918118 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_xsens_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_xsens_1rgb_real_s14_a14_fps30_cam_top__episodes_6126/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 103821, + "num_frames": 3322263, + "estimated_total_batches": null, + "train_episodes": 5775, + "train_bytes": 286470910041, + "elapsed_sec": 845.7928259372711, + "frames_per_sec": 3927.986734007127 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_real_s38_a38", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_tiangong_joint_position_none_real_s38_a38_fps30_cam_chest_cam_head__episodes_146/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 3735, + "num_frames": 119501, + "estimated_total_batches": null, + "train_episodes": 139, + "train_bytes": 6479063622, + "elapsed_sec": 51.39154028892517, + "frames_per_sec": 2325.304891197284 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_ur5e_s7_a7", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/ur5e_master_puppet_joint_position_h5_ur_1rgb_real_s7_a7_fps30_cam_top__episodes_26380/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 118080, + "num_frames": 3778539, + "estimated_total_batches": null, + "train_episodes": 25061, + "train_bytes": 185868082632, + "elapsed_sec": 956.0188310146332, + "frames_per_sec": 3952.3688000892153 + } + ] +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/piper2/norm_stats.json b/assets/cotrain_real_robot/piper2/norm_stats.json new file mode 100644 index 0000000..f4b690f --- /dev/null +++ b/assets/cotrain_real_robot/piper2/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.08570596575737, + 0.9424582123756409, + -0.5610473155975342, + -0.018378613516688347, + 0.15650981664657593, + -0.04922034963965416, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.008945055305957794, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.22233717143535614, + 1.3927223682403564, + -0.8957882523536682, + 0.17042388021945953, + 0.3040333390235901, + -0.07112878561019897, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01350892148911953, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1714383214712143, + 0.7361369132995605, + 0.5368331670761108, + 0.3496498763561249, + 0.4911200702190399, + 0.28332507610321045, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.02536850981414318, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2436714768409729, + 0.651149570941925, + 0.6894615888595581, + 0.3136552572250366, + 0.6569122076034546, + 0.2134801149368286, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.030022503808140755, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4991710331201553, + 0.0054144344157539305, + -1.7947804824004416, + -1.1790875864982606, + -0.9716636402130128, + -0.539963323020935, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.002318800112977624, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.2646023983061313, + 0.08680244942149147, + -2.2326956740360706, + -0.39387080802917473, + -0.9721601041316986, + -0.6741397899150849, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.003800000064074993, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.38600136826038356, + 2.2529563539030497, + -0.002522718032682114, + 0.6737772881984712, + 1.2084734504699708, + 0.8707268574714662, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09907970115607603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7167606556713582, + 2.391043433867162, + 0.00008864541053776875, + 1.1195562719345094, + 1.2258558490276337, + 0.3745928731918333, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09959649641532452, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0010017158929258585, + 0.0017170342616736889, + -0.0017244319897145033, + -0.005731134209781885, + 0.002714053960517049, + 0.002033872064203024, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.008943209424614906, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0010065166279673576, + 0.0033344815019518137, + -0.00027303790557198226, + 0.0020667631179094315, + 0.001737685059197247, + -0.0029692337848246098, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01350709330290556, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.08381801843643188, + 0.31304702162742615, + 0.23983915150165558, + 0.10776226967573166, + 0.18366022408008575, + 0.09571901708841324, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.025366676971316338, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1489294171333313, + 0.33599135279655457, + 0.27681979537010193, + 0.1537630707025528, + 0.19053618609905243, + 0.09432122856378555, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.030021704733371735, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.3243094861030579, + -0.9993304105758667, + -0.7881305526733398, + -0.4524798871994018, + -0.6921295278072357, + -0.2691142694234848, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.002318800112977624, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5554006125926971, + -1.084025181722641, + -0.9235458539009094, + -0.5143094916582107, + -0.686023402261734, + -0.3556695580482483, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.003800000064074993, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.3279062141418456, + 1.0899867341041567, + 0.9700191698074341, + 0.33629278821945197, + 0.6258798820972444, + 0.406562376332283, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09907970115607603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4854212229251862, + 1.2325074484825134, + 0.9927912852764131, + 0.5601088427543641, + 0.6361501549243929, + 0.30015870928764343, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09959649641532452, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/piper2/norm_stats_meta.json b/assets/cotrain_real_robot/piper2/norm_stats_meta.json new file mode 100644 index 0000000..c3f6eff --- /dev/null +++ b/assets/cotrain_real_robot/piper2/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "piper2", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_2/realworld_piper_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 21548, + "num_frames": 689528, + "estimated_total_batches": null, + "train_episodes": 902, + "train_bytes": 111529419925, + "elapsed_sec": 182.0517978668213, + "frames_per_sec": 3787.537437583667 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/piper2/unified_action_space.json b/assets/cotrain_real_robot/piper2/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_real_robot/piper2/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_real_robot/piper30/norm_stats.json b/assets/cotrain_real_robot/piper30/norm_stats.json new file mode 100644 index 0000000..6130c4e --- /dev/null +++ b/assets/cotrain_real_robot/piper30/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0760473981499672, + 1.0517759323120117, + -0.7747761011123657, + 0.15242573618888855, + 0.4494738280773163, + -0.09137012809515, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.016618814319372177, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07727460563182831, + 0.7200653553009033, + -0.4604390561580658, + -0.2260405272245407, + 0.24460497498512268, + 0.16355007886886597, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01185830868780613, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.28079867362976074, + 0.8831034302711487, + 0.7211003303527832, + 0.7177441716194153, + 0.5327411890029907, + 0.6071151494979858, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03437401354312897, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2081252783536911, + 0.8027406930923462, + 0.5713866949081421, + 0.6549085378646851, + 0.4776606559753418, + 0.4999569356441498, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.031229877844452858, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4875116139650345, + -0.00043919531644787645, + -2.2551212312346323, + -1.5829997071027755, + -0.6845841318130493, + -1.615586260795593, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0029380800276063383, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4486167727947235, + -0.005599666852504015, + -1.8685801381547935, + -1.7327060890197754, + -0.762030679988861, + -0.9720964525461196, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0035174399364739655, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.8876427154064179, + 2.4845687208327694, + 0.0026788388188001555, + 1.7340745076179505, + 1.2515803995132444, + 1.6471686191558836, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09956015744088217, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6083275032162665, + 2.198549814021401, + 0.005637001402210462, + 1.3888049545288084, + 1.2151789251804352, + 1.545086481523514, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09957936216918752, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0020336343441158533, + -0.0003478959552012384, + 0.0036158752627670765, + -0.0018518087454140186, + -0.002676568226888776, + 0.0017340786289423704, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01780613325536251, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.002196062356233597, + 0.0025906015653163195, + -0.0007922314689494669, + -0.0006751723121851683, + -0.0008008037693798542, + -0.000598791753873229, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.012778770178556442, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.13291876018047333, + 0.4570249021053314, + 0.3580925762653351, + 0.3361109495162964, + 0.2754795253276825, + 0.30054646730422974, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03545059636235237, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09071528911590576, + 0.31943845748901367, + 0.23047679662704468, + 0.20181375741958618, + 0.183805450797081, + 0.1964036524295807, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03226304054260254, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.5487480565547943, + -1.598214064502716, + -1.1666529998779296, + -1.2725653482437136, + -1.0261658200979231, + -1.0280169901371001, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0029380800276063383, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.3517950798034668, + -1.1833345177173613, + -0.9023950806617738, + -0.7187113502502438, + -0.6822588787078857, + -0.7689471103668215, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0035174399364739655, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.40653051655292516, + 1.6554438406944278, + 1.3955223114013675, + 1.2879812050342556, + 1.0254203120470047, + 1.127150822353363, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09956015744088217, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3331105176448823, + 1.3341810100555422, + 0.9261858076095582, + 0.7806027033805849, + 0.7630852434158326, + 0.6658555793762204, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09957936216918752, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/piper30/norm_stats_meta.json b/assets/cotrain_real_robot/piper30/norm_stats_meta.json new file mode 100644 index 0000000..cc22714 --- /dev/null +++ b/assets/cotrain_real_robot/piper30/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "piper30", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 69490, + "num_frames": 2223663, + "estimated_total_batches": null, + "train_episodes": 5307, + "train_bytes": 350058169358, + "elapsed_sec": 558.5227379798889, + "frames_per_sec": 3981.3294048559737 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/piper30/unified_action_space.json b/assets/cotrain_real_robot/piper30/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_real_robot/piper30/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_real_robot/robocoin_agilex_cobot_magic_s26_a26/norm_stats.json b/assets/cotrain_real_robot/robocoin_agilex_cobot_magic_s26_a26/norm_stats.json new file mode 100644 index 0000000..6693060 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_agilex_cobot_magic_s26_a26/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.19811221957206726, + 0.772533118724823, + -0.8077450394630432, + -0.028649263083934784, + 0.8329925537109375, + 0.1338183581829071, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6504519581794739, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.213411346077919, + 0.936856210231781, + -0.8555614352226257, + 0.052240047603845596, + 0.8344802260398865, + -0.13020701706409454, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6270856261253357, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.28874093294143677, + 0.9208551049232483, + 0.47005847096443176, + 0.3561064600944519, + 0.4977680742740631, + 0.4375063478946686, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.40372464060783386, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.29861217737197876, + 0.9481472373008728, + 0.46235257387161255, + 0.424010694026947, + 0.45311257243156433, + 0.437126100063324, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.40041401982307434, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0729224056005477, + -0.01197078370004892, + -2.2129377588272092, + -1.6497411670684814, + -1.1689142931699754, + -0.6284993870735169, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.000586399725265801, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.14700397849082947, + -0.01449557845443487, + -2.117433346748352, + -1.4916880182743073, + -1.008069571685791, + -1.5053448512077332, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0001424004912376417, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.1663727890253066, + 2.4838475979313257, + -0.36945127830505387, + 1.2129275941848756, + 1.2130273148536679, + 2.074979570531845, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9997992000000551, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0338315951824188, + 2.445226298929751, + -0.36191145629882815, + 1.535950502681732, + 1.217853112411499, + 0.877599804019928, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9997936999998986, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.00009146828961092979, + -0.0016088075935840607, + 0.0007087555713951588, + -0.000026479769076104276, + 0.00020575610687956214, + 0.00001443375185772311, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6503733396530151, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0000202807059395127, + -0.0018799782264977694, + 0.0007903146906755865, + -0.00026286765933036804, + 0.0001462479995097965, + 0.00015752519539091736, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6271259188652039, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.12023629993200302, + 0.322498619556427, + 0.1985558718442917, + 0.14494362473487854, + 0.19618654251098633, + 0.1817934215068817, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4035850465297699, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13321657478809357, + 0.34202784299850464, + 0.2128268927335739, + 0.15731655061244965, + 0.1797640025615692, + 0.19996008276939392, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.40015628933906555, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4558506237030029, + -1.2673018789291381, + -0.63129927778244, + -0.4630223393440245, + -0.5986795719146729, + -0.6356411955833434, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.000586399725265801, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5149496856689453, + -1.3162814127922058, + -0.6802423383712766, + -0.5557396152496339, + -0.549421439886093, + -0.7112965393543245, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0001424004912376417, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4595871042251587, + 1.1543425884246825, + 0.8348300868988039, + 0.4428232517242434, + 0.6962429767608644, + 0.6384128303527827, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9997992000000551, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.49019248924255354, + 1.2172323634624478, + 0.8798893958568579, + 0.5399059474945069, + 0.6080126795768739, + 0.7685098371028896, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9997936999998986, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_agilex_cobot_magic_s26_a26/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_agilex_cobot_magic_s26_a26/norm_stats_meta.json new file mode 100644 index 0000000..f32d261 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_agilex_cobot_magic_s26_a26/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_cobot_magic_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Agilex_Cobot_Magic_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_8284/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 187608, + "num_frames": 6003434, + "estimated_total_batches": null, + "train_episodes": 7870, + "train_bytes": 690618678004, + "elapsed_sec": 1551.8257114887238, + "frames_per_sec": 3868.6264543462707 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_agilex_cobot_magic_s26_a26/unified_action_space.json b/assets/cotrain_real_robot/robocoin_agilex_cobot_magic_s26_a26/unified_action_space.json new file mode 100644 index 0000000..ed9f81b --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_agilex_cobot_magic_s26_a26/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9fbd0a367f6d113a176cae2124ffec508f6202dee702a6b29236e6e8f60d0775" +} diff --git a/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats.json b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats.json new file mode 100644 index 0000000..8c2d277 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.17712397873401642, + 0.810139000415802, + -0.6855402588844299, + -0.11222872883081436, + 0.6206351518630981, + -0.015597881749272346, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.12833420932292938, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.20979192852973938, + 0.7679632306098938, + -0.6718887686729431, + 0.12151588499546051, + 0.6151161789894104, + -0.0631631389260292, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1681675761938095, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.2495959997177124, + 0.8154167532920837, + 0.6811779141426086, + 0.31063228845596313, + 0.35135722160339355, + 0.36757487058639526, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.16275501251220703, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2519766390323639, + 0.8133144378662109, + 3.9310410022735596, + 0.27127107977867126, + 3.887181282043457, + 0.3052545189857483, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.16318519413471222, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.8187637863636017, + -0.02233026457130909, + -2.2677624532647433, + -1.1966205580234528, + -0.281935452222824, + -0.8411327709198, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.036514745473861694, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.20716872844696044, + -0.017633342403545978, + -2.928503234863282, + -0.45736086540222165, + -0.40014072451591487, + -1.0153934538841247, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.022415564626455307, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.28984460719823835, + 2.3611703608632086, + 0.030060533820092772, + 0.5438134195804598, + 1.2402318687438965, + 1.1925266407012938, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5767497708797455, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8714975715160369, + 2.347538023441285, + -0.006531738281250199, + 0.9904942384719853, + 1.255498284292221, + 0.6571380303382872, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5836906126737594, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.000010739619938249234, + -0.00011467040894785896, + 0.00014792964793741703, + 0.0007788547081872821, + 0.0009138808236457407, + 0.0005021721590310335, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1263725459575653, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.00003737088627531193, + -9.091671017813496e-6, + 0.000014992138858360704, + -0.0002670294779818505, + -0.000504948606248945, + -0.0003584008663892746, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.16686192154884338, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.13647353649139404, + 0.3363063931465149, + 0.29653409123420715, + 0.17680639028549194, + 0.2150084674358368, + 0.16584904491901398, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.16264137625694275, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1296338587999344, + 0.3418736457824707, + 4.995156764984131, + 0.17120759189128876, + 4.817986965179443, + 0.17061470448970795, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.16310515999794006, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.46183118805885304, + -1.1268640749931336, + -0.9779461513519287, + -0.6261398021697997, + -0.6543991428375244, + -0.5273366480827333, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.036514745473861694, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4657173981189727, + -1.2373619970321654, + -2.843096435547068, + -0.5746413822174072, + -1.665887695312449, + -0.6153451510906218, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.022415564626455307, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4982637989044192, + 1.243240743112564, + 1.0069862585067746, + 0.5738323686599736, + 0.8133578369140624, + 0.5755800625801086, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5767497708797455, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.44999427776336676, + 1.1858594246387484, + -0.3609619140625, + 0.5913829717636108, + -0.011474609375, + 0.5490435281276707, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5836906126737594, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats_meta.json new file mode 100644 index 0000000..442082b --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s14_a14_fps30", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_7778/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 142767, + "num_frames": 4568537, + "estimated_total_batches": null, + "train_episodes": 7389, + "train_bytes": 1807557839316, + "elapsed_sec": 1851.0555272102356, + "frames_per_sec": 2468.0712884314917 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps30/unified_action_space.json b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps30/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps30/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats.json b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats.json new file mode 100644 index 0000000..1b7d607 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.18395932018756866, + 0.6204625964164734, + -0.4631445109844208, + -0.23754161596298218, + 0.4260796904563904, + 0.19697996973991394, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.03740339353680611, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.34836313128471375, + 0.9311373829841614, + -0.6445428133010864, + 0.1876247376203537, + 0.5610071420669556, + -0.2014002650976181, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.06348947435617447, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 8.889402389526367, + 0.8190888166427612, + 6.3224287033081055, + 0.5763419270515442, + 8.891359329223633, + 0.6356603503227234, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1149676963686943, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 7.469509124755859, + 0.8587527275085449, + 10.9024019241333, + 0.5616274476051331, + 17.77461051940918, + 0.497711181640625, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1467103362083435, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.2224408164978016, + -0.048768813323974314, + -3.1735438541412364, + -1.754286388516423, + -1.0873907352447496, + -1.7334829847335815, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.010585385131834713, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.32128357887268066, + -0.029370736694339428, + -2.3842309326171893, + -1.6665922879934314, + -1.6808630374908446, + -1.864675362110138, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.030337583923339295, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.028758340454100306, + 2.2350878536224386, + -0.252602658843994, + 1.732205913901332, + 0.9988536895751956, + 2.2490956929683685, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4851716857910162, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.1486983525276184, + 2.3825244842529294, + -0.2982371582031256, + 1.6962036300897623, + 0.811102850341797, + 0.850507028102875, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5553146308898924, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.000168978440342471, + -0.00004291267759981565, + -0.008930332958698273, + 0.0005509143229573965, + 0.001174811739474535, + 0.00036979885771870613, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.03738488256931305, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.052020419389009476, + -0.00030458776745945215, + 0.0002838746877387166, + -0.0010981028899550438, + 0.0015408481704071164, + -0.00013526561087928712, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.06346680968999863, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 11.449225425720215, + 0.2850877344608307, + 6.8585004806518555, + 0.2127268761396408, + 11.449126243591309, + 0.19846822321414948, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.114939384162426, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 12.08963680267334, + 0.3889652192592621, + 14.02609634399414, + 0.2564218044281006, + 22.619991302490234, + 0.21812041103839874, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1467045396566391, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -3.307166406249962, + -1.0169535324096692, + -1.7231761718749112, + -0.7101557079315199, + -0.9217864257811925, + -0.6735999629974365, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.010585385131834713, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0927529046773912, + -1.2218059524536145, + -1.4543429687500975, + -0.8870759811401356, + -3.3070429687504657, + -0.7426593418121337, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.030337583923339295, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.0, + 1.06085080718994, + -0.069580078125, + 0.7230888339996326, + -0.094970703125, + 0.7179217052459719, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4851716857910162, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.35748368697166444, + 1.2583869689941416, + 0.199462890625, + 0.7453906723022463, + 0.0, + 0.7603769851684574, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5553146308898924, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats_meta.json new file mode 100644 index 0000000..a931283 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s14_a14_fps50", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s14_a14_fps50_cam_high_cam_left_wrist_cam_right_wrist__episodes_3397/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 54108, + "num_frames": 1731438, + "estimated_total_batches": null, + "train_episodes": 3227, + "train_bytes": 264209590712, + "elapsed_sec": 452.58451652526855, + "frames_per_sec": 3825.667774260525 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps50/unified_action_space.json b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps50/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s14_a14_fps50/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s26_a26/norm_stats.json b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s26_a26/norm_stats.json new file mode 100644 index 0000000..507448d --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s26_a26/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.1473880410194397, + 1.0951837301254272, + -0.8093733787536621, + -0.044470593333244324, + 0.6143806576728821, + 0.10511482506990433, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.34241217374801636, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2605332136154175, + 1.1816539764404297, + -0.9464854001998901, + 0.11799541115760803, + 0.8017933964729309, + -0.17529724538326263, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.405638188123703, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 41.68538284301758, + 0.9224587678909302, + 38.59687042236328, + 0.6133480072021484, + 47.269283294677734, + 0.5478372573852539, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21091148257255554, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 32.797828674316406, + 0.9076418876647949, + 48.98924255371094, + 0.5494855046272278, + 36.38861846923828, + 0.5369770526885986, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.19287677109241486, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -5.736323272705079, + -0.33980635690687677, + -5.736323272705079, + -2.075542514848678, + -5.736323272705079, + -1.100138540649425, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.01225560375750065, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7841103076934814, + -0.041734788560859215, + -5.736323272705079, + -1.6427277302742027, + -1.374133825302124, + -2.087989719390862, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.008527963295578964, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -5.736323272705079, + 2.2613047045707617, + -5.736323272705079, + 1.2822194180488964, + 0.9365347900390475, + 1.9173174562931194, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6947139580100774, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.7841103076934814, + 2.5007953918457133, + -5.736323272705079, + 1.6563580117225456, + -1.374133825302124, + 0.8698811097145267, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6936624691188336, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.000662580132484436, + -0.01188171748071909, + 0.004983395803719759, + 0.004785665310919285, + 0.059429604560136795, + -0.003149193711578846, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3419666290283203, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0008587968768551946, + -0.011704837903380394, + -0.00011223426554352045, + -0.004071489907801151, + 0.0016946460818871856, + 0.0025044300127774477, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.4053061008453369, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 58.244407653808594, + 0.4607780873775482, + 54.42818832397461, + 0.4003729224205017, + 79.35120391845703, + 0.3238682746887207, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21048828959465027, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 46.16695022583008, + 0.3498035669326782, + 67.50092315673828, + 0.35201311111450195, + 51.13288497924805, + 0.336516410112381, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1928727924823761, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -66.19360546875396, + -1.297709326171855, + -66.14727343749837, + -0.8074677490234308, + -39.68732343750162, + -0.7606428283691571, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.012083003766834736, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -26.45730312500382, + -1.2876695068359254, + -132.03077109374863, + -0.841793878173803, + -39.69122031250299, + -1.0079220458984537, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.008527963295578964, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.048828125, + 0.931832128906251, + 0.0, + 0.597741333007832, + 0.0, + 0.6446259460449255, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6948865580007434, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 1.0535477783203078, + -12.442476562500815, + 0.4462808105469094, + -0.00390625, + 0.7484962890625297, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6936624691188336, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s26_a26/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s26_a26/norm_stats_meta.json new file mode 100644 index 0000000..a788d2f --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s26_a26/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_23712/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 413112, + "num_frames": 13219572, + "estimated_total_batches": null, + "train_episodes": 18406, + "train_bytes": 1649570846072, + "elapsed_sec": 3489.1643438339233, + "frames_per_sec": 3788.750169753891 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s26_a26/unified_action_space.json b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s26_a26/unified_action_space.json new file mode 100644 index 0000000..ed9f81b --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_agilex_decoupled_magic_s26_a26/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9fbd0a367f6d113a176cae2124ffec508f6202dee702a6b29236e6e8f60d0775" +} diff --git a/assets/cotrain_real_robot/robocoin_airbot_mmk2_s36_a36/norm_stats.json b/assets/cotrain_real_robot/robocoin_airbot_mmk2_s36_a36/norm_stats.json new file mode 100644 index 0000000..2950c4d --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_airbot_mmk2_s36_a36/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.656104564666748, + -0.9286631345748901, + 1.1376307010650635, + 0.26833200454711914, + -0.7974550127983093, + 0.666283369064331, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6109161972999573, + 1.1354148387908936, + 0.05313194915652275, + 0.04620625823736191, + 0.2840001881122589, + 0.20867326855659485, + 0.2837749719619751, + 0.229059636592865, + 0.28277507424354553, + 0.29497388005256653, + 0.19066499173641205, + 0.6302139759063721, + -0.5758194327354431, + -0.9821283221244812, + 1.1268115043640137, + -0.312242329120636, + 0.6558502316474915, + -0.5029338598251343, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7588454484939575, + 1.1244360208511353, + 0.027878623455762863, + 0.028719335794448853, + 0.41041722893714905, + 0.3171558082103729, + 0.4310058355331421, + 0.3283737301826477, + 0.4280836880207062, + 0.4432540833950043, + 0.3348432183265686, + 0.7939622402191162, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.37944644689559937, + 0.20388081669807434, + 0.32835978269577026, + 1.0097854137420654, + 0.5454671382904053, + 0.9213322997093201, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5214293003082275, + 1.5734562873840332, + 0.1687859445810318, + 0.26329222321510315, + 0.6345346570014954, + 0.9055659770965576, + 0.566385805606842, + 1.1926363706588745, + 0.7770596742630005, + 1.4154009819030762, + 1.1830897331237793, + 2.1479766368865967, + 0.3583245575428009, + 0.25541460514068604, + 0.28430697321891785, + 0.8124368786811829, + 0.4906386733055115, + 0.7573658227920532, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.3276747465133667, + 2.0278005599975586, + 0.0906292200088501, + 0.18109284341335297, + 0.7365971207618713, + 0.843729555606842, + 0.5977146625518799, + 1.1447561979293823, + 0.7890268564224243, + 1.423203706741333, + 0.937105655670166, + 1.9108370542526245, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.2660007301330565, + -1.4333736974075437, + 0.4356580541580915, + -1.9504818211078643, + -1.6451347438812256, + -1.8191361523151397, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.02764731553643942, + 0.6425251462459565, + -0.045348355709016325, + -0.027506217300891866, + -0.022329308092594147, + -0.09238497734069828, + -0.024358250200748444, + -0.09911597261428828, + -0.039008110761642456, + -0.11104497890472415, + -0.0007199482643045485, + -0.04047631531506777, + -1.4152819886207582, + -1.6223039834365247, + 0.5030766827851535, + -2.9765801676273345, + -1.0918529442310332, + -2.2726008594036102, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.03560483766421676, + 0.533134201271506, + -0.018681111001968342, + -0.06725717177391055, + -0.014882088518142697, + -0.10332602539062496, + -0.01015378902256489, + -0.14988748073577884, + -0.04092251509428024, + -0.09312500059604645, + -0.027990717440843582, + -0.09531154389381413, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.3870359558820726, + -0.4766218247368932, + 2.0458251606374978, + 2.9873292702674874, + 1.2033420748710633, + 2.8095779489994044, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.436717178581655, + 1.5006087846755982, + 0.7540547889098526, + 0.16416254246234896, + 1.1690624284669757, + 1.8746440391540524, + 1.3250284303724764, + 1.9000630604505542, + 1.4752081572890283, + 1.8975300592899322, + 1.5322988895563174, + 1.916251375775039, + 0.09408731651306135, + -0.44272861089557414, + 1.842128035542369, + 1.3823009697437287, + 1.6149869574546818, + 2.057234740734101, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5249140445381404, + 1.432080620987946, + 0.5501983883857726, + 0.1652949625492096, + 1.2420855182886126, + 1.8982259277343752, + 1.4232810721755027, + 1.844093188524246, + 1.5325359046399594, + 1.9072029188483954, + 1.5810911833979189, + 1.8818939134597779, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.008245001547038555, + 0.003524184925481677, + -0.0033301268704235554, + -0.005722424481064081, + -0.028624283149838448, + -0.013749456964433193, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6072289347648621, + 1.1415867805480957, + 0.04519025981426239, + 0.048069972544908524, + 0.2835055887699127, + 0.21826808154582977, + 0.28481268882751465, + 0.23658189177513123, + 0.28419241309165955, + 0.29990312457084656, + 0.1941748708486557, + 0.6240943074226379, + 0.005694512277841568, + -0.0015219070482999086, + 0.0012326255673542619, + 0.0017124107107520103, + 0.013287597335875034, + 0.003072197549045086, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7632090449333191, + 1.1186587810516357, + 0.026140810921788216, + 0.03224867209792137, + 0.4089101254940033, + 0.32769083976745605, + 0.4338189363479614, + 0.3394289016723633, + 0.4323977828025818, + 0.4540572166442871, + 0.3410424292087555, + 0.7965958714485168, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.14493174850940704, + 0.11448817700147629, + 0.1269613653421402, + 0.1739502102136612, + 0.18158121407032013, + 0.1614755392074585, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5181316137313843, + 1.554349660873413, + 0.16171063482761383, + 0.26538777351379395, + 0.6293736100196838, + 0.9130929708480835, + 0.5623818039894104, + 1.1972023248672485, + 0.7720032334327698, + 1.4170503616333008, + 1.183464765548706, + 2.0660579204559326, + 0.15685060620307922, + 0.1503192037343979, + 0.15110182762145996, + 0.2234863042831421, + 0.1935572475194931, + 0.17087143659591675, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.3793450593948364, + 1.940362811088562, + 0.08931182324886322, + 0.1979440450668335, + 0.7187049388885498, + 0.8383364677429199, + 0.5950126051902771, + 1.1504135131835938, + 0.7922107577323914, + 1.421832799911499, + 0.9409822821617126, + 1.8833327293395996, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.463122957611084, + -0.3534732172966003, + -0.47352954545021053, + -0.495609849691391, + -0.6788331735134125, + -0.6095462135314942, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.02764731553643942, + 0.6563652049303055, + -0.045348355709016325, + -0.02539996719360349, + -0.022329308092594147, + -0.09238497734069828, + -0.024358250200748444, + -0.07714697225093836, + -0.039008110761642456, + -0.11104497890472415, + -0.0007199482643045485, + -0.04047631531506777, + -0.5393749005317688, + -0.4192069751739502, + -0.516749444961548, + -0.7370876592636111, + -0.5087261302947998, + -0.5691930844306947, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.03560483766421676, + 0.5849964947166852, + -0.018681111001968342, + -0.06725717177391055, + -0.005501733243465423, + -0.10332602539062496, + -0.01015378902256489, + -0.14988748073577884, + -0.04092251509428024, + -0.07114337510764598, + -0.027990717440843582, + -0.09531154389381413, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4853410655975341, + 0.4104335291147232, + 0.4124767607688904, + 0.5189733442783355, + 0.48261117458343517, + 0.4103264465332028, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.4217746837437153, + 1.5006087846755982, + 0.7503308612175286, + 0.16416254246234896, + 1.2192262910589577, + 1.8746440391540524, + 1.3543629234284162, + 1.9000630604505542, + 1.4936742093384268, + 1.8975300592899322, + 1.5541991586680406, + 1.916251375775039, + 0.47509324531555164, + 0.49790313148498533, + 0.4241397476196289, + 0.7494047117233276, + 0.7297798655986787, + 0.6161350169181823, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5249140445381404, + 1.432080620987946, + 0.5355839768886566, + 0.1652949625492096, + 1.2702265841126443, + 1.8982259277343752, + 1.4551351802021264, + 1.844093188524246, + 1.5616740235239268, + 1.9291845443367959, + 1.6142681298069657, + 1.8818939134597779, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_airbot_mmk2_s36_a36/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_airbot_mmk2_s36_a36/norm_stats_meta.json new file mode 100644 index 0000000..730f37f --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_airbot_mmk2_s36_a36/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_airbot_mmk2_s36_a36", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Airbot_MMK2_s36_a36_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10532/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 81017, + "num_frames": 2592540, + "estimated_total_batches": null, + "train_episodes": 10005, + "train_bytes": 431087330611, + "elapsed_sec": 690.6267569065094, + "frames_per_sec": 3753.8945227269173 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_airbot_mmk2_s36_a36/unified_action_space.json b/assets/cotrain_real_robot/robocoin_airbot_mmk2_s36_a36/unified_action_space.json new file mode 100644 index 0000000..c4f3388 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_airbot_mmk2_s36_a36/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "d6e787ab780ebbd92810789ae8513778330304683dedcb7f65a2b300e65955ce" +} diff --git a/assets/cotrain_real_robot/robocoin_aloha_s26_a26/norm_stats.json b/assets/cotrain_real_robot/robocoin_aloha_s26_a26/norm_stats.json new file mode 100644 index 0000000..de7f907 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_aloha_s26_a26/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.10469576716423035, + 0.662298321723938, + -0.8370406031608582, + -0.10997393727302551, + 0.904748260974884, + 0.07077445834875107, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7056493759155273, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.27609941363334656, + 1.1175321340560913, + -0.9066898822784424, + 0.14160014688968658, + 0.6277921199798584, + -0.06411521136760712, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5476592779159546, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.22630704939365387, + 0.9324061870574951, + 0.5762600898742676, + 0.2787526547908783, + 0.4267621338367462, + 0.27670159935951233, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3804008364677429, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.28160029649734497, + 0.9456371068954468, + 0.5779625177383423, + 0.4162033498287201, + 0.7083861827850342, + 0.6169491410255432, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3376106917858124, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.7981000185012819, + -0.00996200017258525, + -2.4786146493900567, + -1.187614440536499, + -0.8754767679214477, + -0.5012200522422794, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.12335600751638409, + -0.011225800144672393, + -2.364402155338973, + -0.8539300444126129, + -1.2095284074306487, + -1.7727100169658663, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.17913497328758243, + 2.635528483106941, + -0.2574722047377378, + 0.6021799695491787, + 1.2177728406429291, + 1.1242267260074614, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9938087919116021, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9705784217238427, + 2.609351033627987, + -0.2859095926374198, + 1.5181279491424564, + 1.2223220269680022, + 1.4456859633922576, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9828610047101975, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.00021051804651506245, + -0.008932504802942276, + 0.0005696771549992263, + -0.0027484409511089325, + -0.0041058543138206005, + -0.0012933430261909962, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7096610069274902, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0023133684881031513, + -0.007879610173404217, + -0.00265696132555604, + -0.005429517012089491, + -0.00999925285577774, + -0.0018341426039114594, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5347478985786438, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.10313262045383453, + 0.26865464448928833, + 0.1893138587474823, + 0.1421351581811905, + 0.21144385635852814, + 0.11594098061323166, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3865589499473572, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.11798860132694244, + 0.32088905572891235, + 0.22832293808460236, + 0.20490100979804993, + 0.25481829047203064, + 0.2950364947319031, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3538452088832855, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.3765264230728149, + -1.035756023645401, + -0.6352756193161011, + -0.5489855407714845, + -0.7912163681030273, + -0.38275416326522826, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.41121598720550545, + -1.0773520893096924, + -0.7255493785858156, + -0.6334800750732423, + -0.9088775737762451, + -1.1001116996288298, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4181219642162324, + 0.9378215560436245, + 0.7591589970588686, + 0.4850448505401608, + 0.8666135650634765, + 0.399302637004852, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0348727851867676, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4695387895107268, + 1.0134398870468138, + 0.8453243877410888, + 0.7469199135780338, + 0.9517094232559207, + 1.151939422655106, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.986791200876236, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_aloha_s26_a26/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_aloha_s26_a26/norm_stats_meta.json new file mode 100644 index 0000000..b0badf7 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_aloha_s26_a26/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_aloha_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/aloha_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_4879/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 198055, + "num_frames": 6337741, + "estimated_total_batches": null, + "train_episodes": 4634, + "train_bytes": 962548578236, + "elapsed_sec": 1664.1732065677643, + "frames_per_sec": 3808.3421695456377 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_aloha_s26_a26/unified_action_space.json b/assets/cotrain_real_robot/robocoin_aloha_s26_a26/unified_action_space.json new file mode 100644 index 0000000..0667d62 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_aloha_s26_a26/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "67e063860a9fbe208d546d4b111c935599875ffd6e1810a7b5d300da746fc215" +} diff --git a/assets/cotrain_real_robot/robocoin_alpha_bot_2_s28_a28/norm_stats.json b/assets/cotrain_real_robot/robocoin_alpha_bot_2_s28_a28/norm_stats.json new file mode 100644 index 0000000..1fb88cd --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_alpha_bot_2_s28_a28/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.12981835007667542, + 0.3803384602069855, + 0.2765718102455139, + -1.5070769786834717, + -0.2064417600631714, + -0.05623231828212738, + -0.3460264205932617, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 746.6767578125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.19400940835475922, + 0.31934040784835815, + -0.35299500823020935, + -1.4869228601455688, + 0.357273131608963, + 0.013851415365934372, + 0.2367955446243286, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 779.4723510742188, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.2857164740562439, + 0.19170787930488586, + 0.20447394251823425, + 0.2694042921066284, + 0.38139572739601135, + 0.24085566401481628, + 0.34607115387916565, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 397.1971435546875, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2606230676174164, + 0.24536000192165375, + 0.14477461576461792, + 0.2577556073665619, + 0.5735127925872803, + 0.18255352973937988, + 0.37184131145477295, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 382.7496643066406, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.899166699886322, + 0.07630084578692914, + -0.059025124704837784, + -2.0594145153187213, + -1.1295509833812714, + -0.7071796939969063, + -1.1954483671784402, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.40404443359375, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.21597237800359725, + -0.05071561908125878, + -0.7550483275800943, + -2.029019742440432, + -1.0360802779436111, + -0.3993901081085205, + -0.2278318267703056, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.2564, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.37486589574813856, + 0.901134452560544, + 0.8977918334484101, + -0.7051934836871923, + 1.031851346349716, + 0.6692254953861236, + 0.42736211544275293, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1009.909061767578, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9338733216404915, + 0.9485346036761999, + -0.05054059450328352, + -0.7290169551871717, + 1.6272616389274597, + 0.5994619083404542, + 1.411613534462452, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1005.2062000000001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0006919320439919829, + -0.0019002234330400825, + -0.0010903198271989822, + -0.0009687251294963062, + 0.0009565133950673044, + 0.0017697216244414449, + -0.0055458988063037395, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 746.5861206054688, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.003108932636678219, + -0.003951332066208124, + 0.0004939803038723767, + 0.002362956991419196, + -0.002410163637250662, + 0.00205172598361969, + 0.005838938523083925, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 778.9148559570312, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.08611934632062912, + 0.051137592643499374, + 0.06047236919403076, + 0.10187217593193054, + 0.0747617855668068, + 0.06468275189399719, + 0.08414533734321594, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 397.2435607910156, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.07241197675466537, + 0.043015606701374054, + 0.04393547773361206, + 0.09733308106660843, + 0.08626998215913773, + 0.06080825254321098, + 0.06849385052919388, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 383.0844421386719, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.2659748669624329, + -0.16955485401153564, + -0.22237293572425842, + -0.38058049020767215, + -0.25508818566799163, + -0.19396575808525085, + -0.33569938838481905, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.40404443359375, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.26165361976623525, + -0.1465015360713005, + -0.14308811855316161, + -0.3606649603843688, + -0.2566977259159088, + -0.18858413553237918, + -0.19983974138498306, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.2564, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.31394535303115845, + 0.18444163522720336, + 0.19062521643638597, + 0.29662441864013656, + 0.2051439446210861, + 0.24560414199829106, + 0.26784982144832603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1009.909061767578, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.23274346752166752, + 0.15374321049451822, + 0.16777842110395425, + 0.3051075954437257, + 0.3131138361454009, + 0.2351794544696808, + 0.2710840149283409, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1005.2062000000001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_alpha_bot_2_s28_a28/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_alpha_bot_2_s28_a28/norm_stats_meta.json new file mode 100644 index 0000000..65587db --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_alpha_bot_2_s28_a28/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_alpha_bot_2_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/alpha_bot_2_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_857/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 22703, + "num_frames": 726485, + "estimated_total_batches": null, + "train_episodes": 814, + "train_bytes": 109263908150, + "elapsed_sec": 205.29979014396667, + "frames_per_sec": 3538.6543721771545 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_alpha_bot_2_s28_a28/unified_action_space.json b/assets/cotrain_real_robot/robocoin_alpha_bot_2_s28_a28/unified_action_space.json new file mode 100644 index 0000000..7c12829 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_alpha_bot_2_s28_a28/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "c8188bef9dda322c15e6f6fd6d51c66ced6ac424e8fb05dc7e607aa1709e3e58" +} diff --git a/assets/cotrain_real_robot/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats.json b/assets/cotrain_real_robot/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats.json new file mode 100644 index 0000000..9a50eed --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.789222240447998, + -0.9489473104476929, + 1.102475643157959, + 0.06056652218103409, + -0.8004094958305359, + 0.8569042086601257, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 43.4145393371582, + 58.51406478881836, + 6.561944484710693, + 3.8180127143859863, + 19.267641067504883, + 14.541945457458496, + 19.904767990112305, + 16.158863067626953, + 19.30022430419922, + 21.157934188842773, + 12.348743438720703, + 44.948116302490234, + -0.7468658089637756, + -0.9740761518478394, + 1.1814908981323242, + -0.2708401083946228, + 0.7773710489273071, + -0.5048773288726807, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 41.62311935424805, + 59.72103500366211, + 1.6600639820098877, + 2.397747278213501, + 21.124330520629883, + 16.384376525878906, + 23.463788986206055, + 16.421628952026367, + 23.28516960144043, + 26.225006103515625, + 18.233783721923828, + 47.79250717163086, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3196251094341278, + 0.19099053740501404, + 0.267301082611084, + 0.7343452572822571, + 0.5074834823608398, + 0.8002901077270508, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 18.43718147277832, + 11.881536483764648, + 12.745183944702148, + 3.668595314025879, + 17.491971969604492, + 25.543888092041016, + 18.778554916381836, + 28.954769134521484, + 20.36393928527832, + 33.26520919799805, + 20.258453369140625, + 38.15335464477539, + 0.3138468265533447, + 0.20916512608528137, + 0.2719564437866211, + 0.7614434361457825, + 0.5056568384170532, + 0.7291929721832275, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 20.863088607788086, + 12.029555320739746, + 5.3629679679870605, + 3.2656631469726562, + 17.44062042236328, + 25.945985794067383, + 20.877904891967773, + 27.181493759155273, + 22.829547882080078, + 35.53911209106445, + 24.12516212463379, + 39.613216400146484, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + 0.1670591546058655, + -1.460646178598702, + 0.6757955211639405, + -0.8247669435024263, + -1.6326164110422134, + -2.040982316064835, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.1410077957153328, + 35.85638677425385, + -1.2471387302875518, + -1.260823583698273, + 0.6530760291576385, + -1.0140843429565431, + 0.6394474706172943, + -1.961733321762085, + 0.6345568585395811, + -3.7215022659301757, + 0.6377890274167062, + -0.8760666087865829, + -1.524050800561905, + -1.514172021174431, + 0.6718438099384307, + -2.9777743816375732, + -1.145575943374634, + -1.595018073940277, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.0329510523796084, + 32.098736600399015, + -1.2586004912137985, + -1.7484696573257446, + 0.609222595214844, + -0.9381469581604005, + 0.5784229578018187, + -1.1616932260990143, + 0.6429713370800019, + -0.5089542884826661, + 0.42454957976341245, + -3.384034348487854, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.4689757689952851, + -0.5967689686983824, + 1.8580087474823, + 2.982538466739655, + 1.0367245502233509, + 2.3800237551689145, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 78.29060504226685, + 84.12461102142335, + 48.262709696531296, + 9.748627821445465, + 61.9573547662735, + 105.95414351844786, + 69.24682767877579, + 109.27585434875488, + 82.92672660541534, + 109.9159403591156, + 89.5799179440558, + 110.60623623168469, + -0.051988855361938535, + -0.5652352955192328, + 1.8889653580904007, + 0.7004047698974611, + 1.6166751742362973, + 2.2183819183826445, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 87.63163614215851, + 82.51696020936966, + 31.86803058552742, + 9.559157132148743, + 61.57964798583985, + 109.06843588314057, + 77.23728513393402, + 108.36883417010307, + 88.44751836946011, + 110.32461710197926, + 91.96601235146522, + 110.372048163414, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.01735016703605652, + 0.007876871153712273, + -0.008764179423451424, + -0.016196714714169502, + -0.050610072910785675, + -0.01787901297211647, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 42.77833557128906, + 59.01993179321289, + 5.597373008728027, + 3.9695675373077393, + 18.594154357910156, + 14.54702091217041, + 19.29161262512207, + 15.878710746765137, + 18.78414535522461, + 20.612062454223633, + 12.175747871398926, + 43.39402389526367, + 0.0064604626968503, + 0.0005611882661469281, + -0.002839392749592662, + 0.005142479669302702, + 0.02126043289899826, + 0.004430062603205442, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 41.64952087402344, + 59.36911392211914, + 1.4767431020736694, + 2.656665325164795, + 20.36819076538086, + 16.421306610107422, + 22.942644119262695, + 16.397327423095703, + 22.899627685546875, + 26.112388610839844, + 18.08662986755371, + 46.756378173828125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.17858079075813293, + 0.14265654981136322, + 0.1634504795074463, + 0.16256660223007202, + 0.22381845116615295, + 0.16158242523670197, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 18.521772384643555, + 11.979036331176758, + 12.285548210144043, + 3.6960418224334717, + 17.73102569580078, + 25.79263687133789, + 19.03911781311035, + 28.994144439697266, + 20.55314064025879, + 33.25821304321289, + 20.360509872436523, + 38.552024841308594, + 0.1852763444185257, + 0.14883209764957428, + 0.1630040854215622, + 0.19241678714752197, + 0.22506338357925415, + 0.11058518290519714, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 20.7370662689209, + 11.900763511657715, + 5.080607891082764, + 3.428765296936035, + 17.76552391052246, + 26.203529357910156, + 21.202436447143555, + 27.423065185546875, + 23.11931610107422, + 35.659122467041016, + 24.31511878967285, + 40.17205047607422, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.530792695760727, + -0.4047769084453583, + -0.5680815444231033, + -0.5259286925792694, + -0.7873582234382629, + -0.6316696793556211, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.1191337959289553, + 36.04583902816773, + -1.2471387302875518, + -1.2319020826339724, + 0.612784028673172, + -1.1057648468017578, + 0.6174649713516236, + -1.961733321762085, + 0.6345568585395811, + -3.7215022659301757, + 0.6377890274167062, + -0.8989019842147827, + -0.6441029361724854, + -0.3842984503507614, + -0.5623678423643113, + -0.5740927570819856, + -0.5532707916736603, + -0.31753806543350205, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.0329510523796084, + 32.50419783921242, + -1.2795799915790558, + -1.7369956575393677, + 0.609222595214844, + -1.0078890859127045, + 0.5372969587802885, + -1.207598727941513, + 0.6429713370800019, + -0.5318018604040147, + 0.44674683067798604, + -3.384034348487854, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.5975871762037279, + 0.46891435046195973, + 0.4889618165016174, + 0.5089293518066405, + 0.5531848000526427, + 0.45593350839614866, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 78.44372304077149, + 84.31406327533722, + 48.388156947612764, + 9.75184132156372, + 62.259544769906995, + 106.59590704536437, + 70.23604014573097, + 109.41469885177612, + 83.82831159305573, + 109.93952148437499, + 90.24482296959758, + 110.60623623168469, + 0.5124633223056794, + 0.4904771469831468, + 0.44247493512630465, + 0.6567382140159608, + 0.8311843288183209, + 0.3665271113872528, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 87.65422906808853, + 82.55221770839691, + 29.686162547540665, + 9.607921631240846, + 61.768294104003914, + 109.09168325905799, + 77.54573012659549, + 108.78198368668556, + 88.99643401732445, + 110.3474646739006, + 92.43215462067127, + 110.39570791435241, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats_meta.json new file mode 100644 index 0000000..f5f3479 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_discover_aitbot_mmk2_s36_a36", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/discover_robotics_aitbot_mmk2_s36_a36_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5747/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 36260, + "num_frames": 1160293, + "estimated_total_batches": null, + "train_episodes": 5460, + "train_bytes": 194302774076, + "elapsed_sec": 348.6094217300415, + "frames_per_sec": 3328.34664720713 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_discover_aitbot_mmk2_s36_a36/unified_action_space.json b/assets/cotrain_real_robot/robocoin_discover_aitbot_mmk2_s36_a36/unified_action_space.json new file mode 100644 index 0000000..c4f3388 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_discover_aitbot_mmk2_s36_a36/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "d6e787ab780ebbd92810789ae8513778330304683dedcb7f65a2b300e65955ce" +} diff --git a/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s14_a14/norm_stats.json b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s14_a14/norm_stats.json new file mode 100644 index 0000000..7db58db --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s14_a14/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.1465437263250351, + 0.7869630455970764, + -0.5143190622329712, + -0.10306041687726974, + -0.017123211175203323, + -0.07089352607727051, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.24394427239894867, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.11253274977207184, + 0.9243168234825134, + -0.6134981513023376, + -0.08301904797554016, + 0.0349244549870491, + 0.0044456711038947105, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.28358498215675354, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3259853720664978, + 0.9173845052719116, + 0.6484797596931458, + 0.4867860972881317, + 0.29930099844932556, + 0.3141402006149292, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4647968113422394, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3464672863483429, + 0.9285209774971008, + 0.66539466381073, + 0.4866812229156494, + 0.318434476852417, + 0.42792943120002747, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5048031210899353, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0725928758382797, + -0.005822717398405078, + -1.9497726845741272, + -1.5304360511302948, + -1.0978304373025893, + -1.0819920077323915, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.02160907292770571, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9586778641700744, + -0.006923790359497084, + -1.9687591208517552, + -1.5304557082414627, + -0.838190191078186, + -1.5145600032806397, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.006071952342987061, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6792541539669039, + 2.5427422587573525, + 0.026177544593811053, + 1.1008840367794037, + 0.7871663888692857, + 0.968535971164703, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7061504119382762, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9739351847410203, + 2.5719604786753654, + 0.030489080250263534, + 1.004168446135521, + 1.0753058356285097, + 1.1564639692306518, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7056269750595094, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.00018698995700106025, + -0.0027333006728440523, + 0.0018787827575579286, + 0.00032728881342336535, + 0.0004975892370566726, + 0.0002555204264353961, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.24358518421649933, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.00009762104309629649, + -0.0025566816329956055, + 0.002047769259661436, + -0.0003735595673788339, + -0.00020275445422157645, + -0.0001948690478457138, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.28345298767089844, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.16635392606258392, + 0.3440786600112915, + 0.258118212223053, + 0.2430180013179779, + 0.15079589188098907, + 0.15765906870365143, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4644833207130432, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.18295352160930634, + 0.4124230444431305, + 0.29375508427619934, + 0.27331775426864624, + 0.16929855942726135, + 0.18614333868026733, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5047915577888489, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6040997364997862, + -1.3266730127334594, + -0.92285426902771, + -0.8444594205856322, + -0.5463665382385252, + -0.5456839828491211, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.02160907292770571, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.6485135001182556, + -1.5401852423667908, + -0.9946665182113648, + -0.9465401615142826, + -0.5940469908714294, + -0.6444087917327881, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.006071952342987061, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6266800019741057, + 1.3451034955978391, + 0.9451263523101807, + 0.9366976721286777, + 0.516585234260559, + 0.55905809340477, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7061504119382762, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.642640541267395, + 1.5440051584720607, + 1.0398419427871701, + 1.007892139816284, + 0.5927413930892942, + 0.6252514398574824, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7056269750595094, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s14_a14/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s14_a14/norm_stats_meta.json new file mode 100644 index 0000000..31311e3 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s14_a14/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/galaxea_r1_lite_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5167/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 245253, + "num_frames": 7848088, + "estimated_total_batches": null, + "train_episodes": 4886, + "train_bytes": 3346209600799, + "elapsed_sec": 3871.8957114219666, + "frames_per_sec": 2026.9368249894735 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s14_a14/unified_action_space.json b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s14_a14/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s14_a14/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s16_a18/norm_stats.json b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s16_a18/norm_stats.json new file mode 100644 index 0000000..4bc585b --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s16_a18/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.16373606026172638, + 0.9926406741142273, + -0.7024933695793152, + 0.13910958170890808, + -0.07944614440202713, + 0.0691065564751625, + -2.2582452297210693, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 80.80658721923828, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0637373998761177, + 0.40384504199028015, + -0.29242828488349915, + 0.10572875291109085, + 0.023374492302536964, + 0.010431193746626377, + -2.5006213188171387, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 89.0853271484375, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.29857853055000305, + 1.0033091306686401, + 0.7319855690002441, + 0.3954618573188782, + 0.24940426647663116, + 0.4646410644054413, + 0.8846869468688965, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 30.198925018310547, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2049432396888733, + 0.7930189371109009, + 0.5714349150657654, + 0.26710253953933716, + 0.12996964156627655, + 0.27238354086875916, + 0.7039861083030701, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 24.03177833557129, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.017169194972515, + -0.004680851008743048, + -1.986572128868103, + -1.1477862263917924, + -0.8641180778265, + -1.1129386113166808, + -2.76129431829527, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 5.472231944561004, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.25645644221305847, + -0.0042553190141916275, + -1.9533517208099365, + -0.4285504687309265, + -0.31070470275878903, + -0.9370759090423584, + -2.835106372833252, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 4.873087328195572, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.3155106456279755, + 2.578922155332752, + -0.00040344681739812316, + 1.0628037837743758, + 0.6523159398913383, + 1.4510601159095766, + -0.05701846262365562, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 97.88268118405342, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8619644447565078, + 2.462775818249583, + -0.00040225529670712135, + 1.0223374055862426, + 0.5530510427355766, + 0.9148953475952148, + -0.038330637861788475, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 100.52368333494664, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0035309582017362118, + -0.03238903358578682, + 0.02132692001760006, + -0.001851493027061224, + 0.001852226909250021, + 0.0021616152953356504, + -0.0008467381703667343, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 77.51899719238281, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.001286643324419856, + -0.004494755994528532, + 0.004611603915691376, + 0.00022976390027906746, + -0.00047635435475967824, + 0.00019026569498237222, + -0.0002900872495956719, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 89.36774444580078, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.23230241239070892, + 0.6766408681869507, + 0.4803682267665863, + 0.2520758807659149, + 0.18142449855804443, + 0.29774317145347595, + 0.7227979898452759, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 41.74575424194336, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.14992249011993408, + 0.4257671535015106, + 0.27494487166404724, + 0.15455301105976105, + 0.09703756123781204, + 0.15753188729286194, + 0.4973582923412323, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 30.825206756591797, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.7381767271518707, + -2.1335647198200225, + -1.4483220024108887, + -0.8748203573703766, + -0.6415985270500184, + -0.9677291069030762, + -2.308521799659729, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.6180614602565765, + -1.739781426525116, + -0.9139452539682389, + -0.6549412292242051, + -0.3491792736053465, + -0.5659440845727921, + -2.1506297883987426, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.8003067836284639, + 1.9999838626384738, + 1.666527211999893, + 0.7973734945774078, + 0.5891278557777402, + 1.068362585258484, + 2.4429450938224795, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 99.98, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6246776551246644, + 1.7485109654426578, + 1.1746477506160735, + 0.5350400135040285, + 0.35704151229858416, + 0.5749539126873016, + 2.408058779096603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 99.98, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s16_a18/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s16_a18/norm_stats_meta.json new file mode 100644 index 0000000..bd80a20 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s16_a18/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_s16_a18", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/galaxea_r1_lite_s16_a18_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_970/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 9866, + "num_frames": 315700, + "estimated_total_batches": null, + "train_episodes": 922, + "train_bytes": 100400838947, + "elapsed_sec": 127.63867783546448, + "frames_per_sec": 2473.388202962743 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s16_a18/unified_action_space.json b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s16_a18/unified_action_space.json new file mode 100644 index 0000000..3c4ce7f --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_s16_a18/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "a9d0610a5115c532397c2f9a02c21890d70ef58ef0ad507847fa2ed1a15c88b5" +} diff --git a/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats.json b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats.json new file mode 100644 index 0000000..cca4530 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.2506558299064636, + 0.9469642043113708, + -0.6205059885978699, + -0.09196162223815918, + 0.012572923675179482, + 0.05519729480147362, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.500835657119751, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.25365200638771057, + 1.2202755212783813, + -0.7921632528305054, + -0.1521870344877243, + -0.024248279631137848, + -0.07879133522510529, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.3990261554718018, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3049851357936859, + 0.9031018614768982, + 0.610549807548523, + 0.4732515215873718, + 0.2458823025226593, + 0.3754640817642212, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4639884829521179, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3309071660041809, + 0.8979148268699646, + 0.645177960395813, + 0.5483866333961487, + 0.3284341096878052, + 0.47655388712882996, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.504631757736206, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.9940981630802155, + -0.003829787252470851, + -1.975389991865214, + -1.5265620398044586, + -0.6589046301603317, + -0.8917075432300567, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.10655710805431008, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.3503914684653282, + -0.0019148936262354255, + -2.000638246536255, + -1.5020018501758576, + -0.8032287443637849, + -1.7044098446369171, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.11476012961864471, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.20174685723781582, + 2.4619219403604045, + -0.000014638316631288006, + 0.8448675643444061, + 0.7823373777389526, + 1.5872856732606886, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7645925080850722, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.005140295803547, + 2.505199112719623, + -0.0003078718297184757, + 0.8889586254119872, + 0.8282026379823684, + 0.8900946237802505, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.751934207174182, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.002070083748549223, + -0.009222179651260376, + 0.006848389748483896, + 0.00026182294823229313, + 0.0015868792543187737, + 0.0003076336288359016, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.5008774995803833, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.002750544575974345, + -0.015298927202820778, + 0.009401840157806873, + 0.0033589310478419065, + -0.00035418258630670607, + -0.001279053627513349, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.3990696668624878, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1416667252779007, + 0.3391159176826477, + 0.22186781466007233, + 0.23835258185863495, + 0.14790737628936768, + 0.2196711003780365, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4638553559780121, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.19731104373931885, + 0.3913874328136444, + 0.2852989435195923, + 0.30727827548980713, + 0.22789299488067627, + 0.291481077671051, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5044052600860596, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4676544653892517, + -1.3689668506622314, + -0.673422367811203, + -0.8352519777297973, + -0.514826227092743, + -0.9340109244346619, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.10655710805431008, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7339063465595246, + -1.6019817955970765, + -0.8888794917106628, + -1.093386752319336, + -0.7658062780380249, + -0.9442028461456298, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.11476012961864471, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.5726149436473846, + 1.2395132839202878, + 0.8514690177440647, + 0.8724879892349242, + 0.4888856029987334, + 0.7179337068557738, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7645925080850722, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6569907176494598, + 1.3284557864189144, + 0.9647411026954651, + 1.0813313362121582, + 0.9232138740777969, + 1.3054971899032592, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.751934207174182, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats_meta.json new file mode 100644 index 0000000..a232606 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_upper_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Galaxea_R1_Lite_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_3650/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 27171, + "num_frames": 869469, + "estimated_total_batches": null, + "train_episodes": 1337, + "train_bytes": 205435325084, + "elapsed_sec": 271.46593260765076, + "frames_per_sec": 3202.8659789758667 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_upper_s14_a14/unified_action_space.json b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_upper_s14_a14/unified_action_space.json new file mode 100644 index 0000000..eaaba89 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_galaxea_r1_lite_upper_s14_a14/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "1fa4ae18cdd16834f62a84b6e7c7d297585f44534b6b912ad9d2e88896a34f45" +} diff --git a/assets/cotrain_real_robot/robocoin_leju_robot_s118_a54/norm_stats.json b/assets/cotrain_real_robot/robocoin_leju_robot_s118_a54/norm_stats.json new file mode 100644 index 0000000..c5a9296 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_leju_robot_s118_a54/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.14392921328544617, + -0.0496545284986496, + 0.03907515108585358, + -0.6383686661720276, + -0.33223956823349, + 0.1406169980764389, + -0.2197691947221756, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2658024728298187, + 1.0174024105072021, + 0.26580309867858887, + 0.26580342650413513, + 0.26580342650413513, + 0.26580342650413513, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.26310673356056213, + -0.026430761441588402, + 0.22182564437389374, + -1.0583513975143433, + 0.5696671009063721, + -0.14421126246452332, + -0.14368979632854462, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6819911003112793, + 1.1796563863754272, + 0.681991696357727, + 0.6819922924041748, + 0.6819922924041748, + 0.6819922924041748, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.005736132152378559, + -0.004845454357564449, + -0.5839594006538391, + 1.034613847732544, + -0.47432053089141846, + 0.0044976514764130116, + -0.011759890243411064, + 0.0016561566153541207, + -0.584376335144043, + 1.0361307859420776, + -0.48027747869491577, + 0.014017106033861637, + -0.006366158835589886, + 0.00004895150777883828, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.24559161067008972, + 0.1689794510602951, + 0.7688204646110535, + 0.5849611759185791, + 0.7876368165016174, + 0.2824043333530426, + 0.2779797911643982, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6225577592849731, + 0.8577785491943359, + 0.62255859375, + 0.6225588917732239, + 0.6225588917732239, + 0.6225588917732239, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.37637755274772644, + 0.21900226175785065, + 0.6015813946723938, + 0.6487521529197693, + 0.6114912033081055, + 0.3323651850223541, + 0.33078810572624207, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8369026184082031, + 0.813471257686615, + 0.8369022607803345, + 0.8369028568267822, + 0.8369029760360718, + 0.8369028568267822, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.011689109727740288, + 0.03091302700340748, + 0.05732341855764389, + 0.07677125930786133, + 0.0554114505648613, + 0.02481386624276638, + 0.01102852076292038, + 0.030867384746670723, + 0.057295337319374084, + 0.08059525489807129, + 0.055565595626831055, + 0.024815795943140984, + 0.0376923643052578, + 0.0022193610202521086, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.9992702881813049, + -0.34700471043586734, + -1.499725185585022, + -2.03459240322113, + -1.5663648304462434, + -0.6925698574066161, + -0.703081022977829, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.2768910852432251, + -0.6715401140213013, + -1.3412932807922364, + -2.273264695763588, + -1.2518772483825684, + -0.7010021484375, + -0.700609602355957, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.02395869474411011, + -0.11906609460711481, + -0.7370869652032852, + 0.9267490817084909, + -0.6330387302875519, + -0.049691598564386374, + -0.042447312104701984, + -0.10632696142792702, + -0.7380362022399902, + 0.9342303326725959, + -0.641259054350853, + -0.04123028814792634, + -0.11191192030906683, + -0.005750369654968376, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.3458903924465182, + 0.5226744106411935, + 1.44677988114357, + -0.06136881568431818, + 1.476704307556152, + 0.6961594585418704, + 0.5051051949501038, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.45043067569732687, + 0.3487966469764707, + 1.3253098982810974, + -0.12402725848555551, + 1.5689554569244386, + 0.7199650357246397, + 0.626018825149536, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.034869841480255126, + 0.09307707622647288, + -0.45076588833332076, + 1.2968151184253396, + -0.3549289156675338, + 0.06532029041647913, + 0.015565912073850607, + 0.10807942071557042, + -0.4488659531593323, + 1.2981121613249182, + -0.369503323701024, + 0.07134055135250089, + 0.09063195526599888, + 0.008523450748994951, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.025149166584014893, + -0.0007167551084421575, + 0.014958391897380352, + 0.029812512919306755, + -0.049611445516347885, + 0.018364058807492256, + -0.016904247924685478, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.26187270879745483, + 1.0055816173553467, + 0.2618729770183563, + 0.2618747055530548, + 0.2618747055530548, + 0.2618747055530548, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.023009758442640305, + 0.008779775351285934, + -0.01961400918662548, + 0.035789959132671356, + 0.03110627271234989, + -0.02077949233353138, + -0.022412974387407303, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6611509919166565, + 1.1648931503295898, + 0.661152720451355, + 0.661155104637146, + 0.661155104637146, + 0.661155104637146, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.006273355800658464, + -0.003994456026703119, + -0.5832089185714722, + 1.0329070091247559, + -0.4743139445781708, + 0.0038752786349505186, + -0.011729203164577484, + 0.0015189028345048428, + -0.5832836031913757, + 1.034032940864563, + -0.4801284670829773, + 0.013799047097563744, + -0.006342591252177954, + 0.000048941914428723976, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.13706213235855103, + 0.0861985832452774, + 0.2623814046382904, + 0.21836024522781372, + 0.38968393206596375, + 0.18734091520309448, + 0.1748584508895874, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6187314391136169, + 0.859600305557251, + 0.6187315583229065, + 0.6187350153923035, + 0.6187350153923035, + 0.6187350153923035, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.18466579914093018, + 0.11489593982696533, + 0.2676655650138855, + 0.30678436160087585, + 0.3512946665287018, + 0.2122993916273117, + 0.19419464468955994, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.833325207233429, + 0.8184693455696106, + 0.8333248496055603, + 0.8333266377449036, + 0.8333266377449036, + 0.8333266377449036, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.011661932803690434, + 0.03008849360048771, + 0.0570581778883934, + 0.07920322567224503, + 0.05598650872707367, + 0.02390815131366253, + 0.011079773306846619, + 0.030265456065535545, + 0.05669058859348297, + 0.08025062084197998, + 0.056270044296979904, + 0.02400575391948223, + 0.037728164345026016, + 0.0022195226047188044, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.49717133016586335, + -0.29087378101348893, + -0.9207378339767456, + -0.8032954450130463, + -1.5487773138046266, + -0.5106261265754701, + -0.7538997879028321, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.6092341652870177, + -0.3566183257102966, + -1.1042374740600585, + -1.0408703578948975, + -0.9910236114501954, + -0.8985654019355773, + -0.791315365076065, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.023514607763290396, + -0.11017253985404968, + -0.7403963661193848, + 0.9252302796959877, + -0.6394320577383041, + -0.04950896456241605, + -0.04293521931767463, + -0.102585978269577, + -0.7395257719516755, + 0.9335625804424286, + -0.6478451603651046, + -0.039510283565521276, + -0.11191192030906683, + -0.005750369654968376, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4264512014865871, + 0.29491566400527924, + 1.1406259435176853, + 0.8118304628849029, + 1.1148114137649534, + 0.7137140592575073, + 0.44641688156127923, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6106945888519291, + 0.36770981721878027, + 0.7981465461730957, + 1.0722906362533569, + 1.444993089199066, + 0.5342899666786192, + 0.5092106031179429, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.035736719590425514, + 0.09176966729164115, + -0.45266616611480714, + 1.2868420163989067, + -0.35557454228401186, + 0.06286471080780032, + 0.01590245109796523, + 0.10124850861430168, + -0.4510058415412903, + 1.2875499872922898, + -0.3704874509572982, + 0.06893986749649039, + 0.0910177531242371, + 0.008582760252058508, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_leju_robot_s118_a54/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_leju_robot_s118_a54/norm_stats_meta.json new file mode 100644 index 0000000..8250431 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_leju_robot_s118_a54/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_leju_robot_s118_a54", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/leju_robot_s118_a54_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_17897/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 458510, + "num_frames": 14672292, + "estimated_total_batches": null, + "train_episodes": 17002, + "train_bytes": 4898931416952, + "elapsed_sec": 5203.681373596191, + "frames_per_sec": 2819.598462436255 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_leju_robot_s118_a54/unified_action_space.json b/assets/cotrain_real_robot/robocoin_leju_robot_s118_a54/unified_action_space.json new file mode 100644 index 0000000..d356add --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_leju_robot_s118_a54/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "d97c871ea622a1d73832b3cfbbf5591efa01e5743172a70cab01099fbb596f69" +} diff --git a/assets/cotrain_real_robot/robocoin_leju_robot_s54_a54/norm_stats.json b/assets/cotrain_real_robot/robocoin_leju_robot_s54_a54/norm_stats.json new file mode 100644 index 0000000..9454472 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_leju_robot_s54_a54/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.12607264518737793, + 0.00008398429054068401, + -0.4544186294078827, + -0.20619818568229675, + 0.29890182614326477, + 0.2209627479314804, + -0.017372645437717438, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.001351677579805255, + 0.5195144414901733, + 0.001351677579805255, + 0.001351677579805255, + 0.001351677579805255, + 0.001351677579805255, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.5108049511909485, + -0.08366616070270538, + 0.6188738346099854, + -1.1367301940917969, + 0.9034554362297058, + -0.2741541564464569, + 0.19831663370132446, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.031201720237732, + 1.7022472620010376, + 1.031201720237732, + 1.031201720237732, + 1.031201720237732, + 1.031201720237732, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.009635113179683685, + -0.0028679377865046263, + -0.5325427055358887, + 0.9934707880020142, + -0.5009011626243591, + -0.004597402177751064, + -0.01032357569783926, + -0.0036452405620366335, + -0.5363783836364746, + 0.9893509745597839, + -0.49731943011283875, + 0.014525534585118294, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.052721500396728516, + 0.12329746037721634, + 0.9935592412948608, + 0.08448720723390579, + 1.079892873764038, + 0.2286582589149475, + 0.15934748947620392, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.04720721393823624, + 0.7929924130439758, + 0.04720721393823624, + 0.04720721393823624, + 0.04720721393823624, + 0.04720721393823624, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2641383111476898, + 0.1964256912469864, + 0.29711970686912537, + 0.3846171796321869, + 0.3384343981742859, + 0.21793775260448456, + 0.27180108428001404, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6186614036560059, + 0.2665689289569855, + 0.6186614036560059, + 0.6186614036560059, + 0.6186614036560059, + 0.6186614036560059, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.005319930147379637, + 0.008804247714579105, + 0.026858242228627205, + 0.026859907433390617, + 0.01961347460746765, + 0.008071155287325382, + 0.006057468242943287, + 0.009226891212165356, + 0.019773883745074272, + 0.01892995275557041, + 0.018627624958753586, + 0.011728359386324883, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.2895899209499359, + -0.2557414261460304, + -1.5707963705062866, + -0.44021003832817074, + -1.5707963705062866, + -0.3109862658381462, + -0.3420334379673004, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.1022463934540747, + -0.534395228278637, + -0.6099578330993651, + -1.928462313339114, + -0.31661461296081544, + -0.6981316804885864, + -0.48562039694786074, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0037947557039558887, + -0.023079702201485634, + -0.5913913312196731, + 0.9475534757256507, + -0.5512317831277848, + -0.020031942911073564, + -0.025517087894678117, + -0.02475028370320797, + -0.5832356173038483, + 0.9467111015081405, + -0.5315918558120728, + -0.008798553790897131, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.049132818818092394, + 0.23467275539636612, + 1.4445043423175812, + -0.06639479804039006, + 1.5632565479278564, + 0.6979118290841579, + 0.45560135209560393, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 1.7449801949739454, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.05763647654056547, + 0.3462985385417938, + 1.09225891494751, + -0.3024392062425614, + 1.4563934411764143, + 0.24852478170394898, + 0.6978524278163911, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.023831854006648064, + 0.018483441022038465, + -0.475257759898901, + 1.0377141551017761, + -0.4545027549982071, + 0.018488670980185272, + 0.0033708639562129994, + 0.015092507733032112, + -0.4920614863157272, + 1.031601612663269, + -0.453053707498312, + 0.04167234658449888, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.000044160395191283897, + -0.0004345428023952991, + 0.00018526075291447341, + 0.0004296721890568733, + 0.0005998000269755721, + 0.00017635914264246821, + -0.001342334202490747, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0027007008902728558, + 0.5137023329734802, + 0.0027007008902728558, + 0.0027007008902728558, + 0.0027007008902728558, + 0.0027007008902728558, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.003517469158396125, + 0.0013488056138157845, + -0.03338310495018959, + -0.0008356410544365644, + -0.06255348771810532, + -0.02151239477097988, + -0.03775149583816528, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9106055498123169, + 1.6855394840240479, + 0.9106055498123169, + 0.9106055498123169, + 0.9106055498123169, + 0.9106055498123169, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.00968371331691742, + -0.0032853996381163597, + -0.5326474905014038, + 0.9934975504875183, + -0.5008286237716675, + -0.004591429140418768, + -0.010270550847053528, + -0.0040542385540902615, + -0.5363346338272095, + 0.9892792105674744, + -0.49734926223754883, + 0.01452939584851265, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.01366458274424076, + 0.011578992940485477, + 0.02847292833030224, + 0.008184446953237057, + 0.02868589758872986, + 0.02419445477426052, + 0.020024960860610008, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.06765764206647873, + 0.7898082137107849, + 0.06765764206647873, + 0.06765764206647873, + 0.06765764206647873, + 0.06765764206647873, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1943008303642273, + 0.1138172596693039, + 0.16575030982494354, + 0.32405945658683777, + 0.24188394844532013, + 0.14207221567630768, + 0.1356537789106369, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6900458931922913, + 0.3119781017303467, + 0.6900458931922913, + 0.6900458931922913, + 0.6900458931922913, + 0.6900458931922913, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.005321471020579338, + 0.008934310637414455, + 0.026879318058490753, + 0.026879871264100075, + 0.019663553684949875, + 0.008062909357249737, + 0.006070638541132212, + 0.009430455975234509, + 0.01970670185983181, + 0.018973983824253082, + 0.018652407452464104, + 0.011722862720489502, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.045795693865418444, + -0.03490671157836914, + -0.08407489075660707, + -0.014965300846099844, + -0.0787550156712532, + -0.07334953966140745, + -0.06483746516704561, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5524677794218064, + -0.3814485204219818, + -0.7671195118427279, + -1.0123560002803802, + -1.083412933397293, + -0.5203610343933105, + -0.5161401920318603, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.003876279680989683, + -0.02480562933534384, + -0.5915251564919949, + 0.9474930867910385, + -0.5510238276004791, + -0.020000744584202767, + -0.025240602546930314, + -0.027418407713994383, + -0.5830148566961288, + 0.9471505891680717, + -0.531629569208622, + -0.008798553790897131, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.04847865233421325, + 0.029357151687145228, + 0.08701096346378329, + 0.020059467208385473, + 0.08130935577154164, + 0.06256101837754252, + 0.05499121507108207, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 1.7449801949739454, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7217966253280639, + 0.3419604907035827, + 0.28069199728965755, + 1.0181266004562377, + 0.43407146964073196, + 0.3849238431930544, + 0.33047570610046373, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.023847550930455326, + 0.01867716753706336, + -0.4757930609881878, + 1.0378349329710006, + -0.45402742807865143, + 0.01857039732933044, + 0.003428067821264265, + 0.015092507733032112, + -0.4920860152721405, + 1.031601612663269, + -0.45256343334317206, + 0.04163807480968535, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_leju_robot_s54_a54/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_leju_robot_s54_a54/norm_stats_meta.json new file mode 100644 index 0000000..29b3d90 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_leju_robot_s54_a54/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_leju_robot_s54_a54", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/leju_robot_s54_a54_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_394/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 2062, + "num_frames": 65982, + "estimated_total_batches": null, + "train_episodes": 374, + "train_bytes": 22504353358, + "elapsed_sec": 31.398486614227295, + "frames_per_sec": 2101.4388626648715 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_leju_robot_s54_a54/unified_action_space.json b/assets/cotrain_real_robot/robocoin_leju_robot_s54_a54/unified_action_space.json new file mode 100644 index 0000000..d356add --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_leju_robot_s54_a54/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "d97c871ea622a1d73832b3cfbbf5591efa01e5743172a70cab01099fbb596f69" +} diff --git a/assets/cotrain_real_robot/robocoin_realman_rmc_aida_l_s28_a28/norm_stats.json b/assets/cotrain_real_robot/robocoin_realman_rmc_aida_l_s28_a28/norm_stats.json new file mode 100644 index 0000000..f6e2759 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_realman_rmc_aida_l_s28_a28/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.7575891017913818, + -2.018211841583252, + 1.2673600912094116, + 1.1146199703216553, + 0.6891690492630005, + -0.3179693818092346, + -0.9597281217575073, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 555.3607177734375, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.8516546487808228, + 2.0185489654541016, + -1.024009346961975, + -0.8024208545684814, + -0.6040467619895935, + 0.35237857699394226, + 0.4313460886478424, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 634.1749267578125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.227471724152565, + 0.06362287700176239, + 0.25554585456848145, + 0.4349750280380249, + 1.4009367227554321, + 1.5048906803131104, + 1.4070923328399658, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 329.2973937988281, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2158181071281433, + 0.06811479479074478, + 0.2395617961883545, + 0.3499128818511963, + 1.5231932401657104, + 1.4194414615631104, + 1.436482548713684, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 325.5093994140625, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.2411617311716079, + -2.0655426728248596, + 0.7684333333969116, + 0.43966181900501256, + -0.9741751252412796, + -1.918311150074005, + -3.0002384185791016, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 44.9538, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.4035066569000483, + 1.6972570048332214, + -1.6375796434402465, + -1.7001429117143154, + -2.8975123698711394, + -1.826313526535034, + -1.312467015504837, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 26.3704, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.1553316257953643, + -1.7997828578948973, + 1.9979852621555327, + 1.867020208358765, + 2.8710006383657456, + 1.9273102951049803, + 0.8647150281906129, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 920.7366, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.3617565359920263, + 2.079939349913597, + -0.5856861970901488, + -0.16072266962528237, + 1.2208031419515608, + 1.863077091884613, + 2.6855830742359164, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 881.62, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.004745005629956722, + 0.001093511818908155, + -0.002022324362769723, + -0.003611444029957056, + -0.011031363159418106, + -0.0013529028510674834, + 0.010191795416176319, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 545.743896484375, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.002088882029056549, + -0.0009160805493593216, + -0.0011564826127141714, + -0.006964823696762323, + 0.008905000053346157, + -0.002275642240419984, + -0.00712719326838851, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 634.5043334960938, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.05028748884797096, + 0.015297401696443558, + 0.071743443608284, + 0.09484060853719711, + 0.09587708115577698, + 0.099430613219738, + 0.055593136698007584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 331.8141784667969, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0730854719877243, + 0.03070250153541565, + 0.06939690560102463, + 0.1734410673379898, + 0.13651607930660248, + 0.14600589871406555, + 0.10842622071504593, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 325.7297058105469, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.20747764117717743, + -0.04162785339355471, + -0.20748130631446837, + -0.3386043548583984, + -0.4205680692672731, + -0.3368758692741394, + -0.11896564942598342, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 44.9538, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.27733808026313783, + -0.11711480379104616, + -0.253275782763958, + -0.695207809829712, + -0.4655322723388673, + -0.4588191899299622, + -0.3640655764102936, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 26.3704, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.12971830923557282, + 0.06903154182434079, + 0.28166046774387365, + 0.34935000658035276, + 0.20638658781051622, + 0.3108922860622405, + 0.23591858417987832, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 922.6905999999999, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.24794143097400667, + 0.09158638322353363, + 0.2413436704993247, + 0.45366472196578966, + 0.5544114936828612, + 0.48090295810699457, + 0.34896428358554843, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 881.7984, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_realman_rmc_aida_l_s28_a28/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_realman_rmc_aida_l_s28_a28/norm_stats_meta.json new file mode 100644 index 0000000..0c0cfa3 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_realman_rmc_aida_l_s28_a28/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_realman_rmc_aida_l_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Realman_RMC-AIDA-L_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_693/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 9936, + "num_frames": 317940, + "estimated_total_batches": null, + "train_episodes": 658, + "train_bytes": 36471840854, + "elapsed_sec": 89.87298893928528, + "frames_per_sec": 3537.6591315416026 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_realman_rmc_aida_l_s28_a28/unified_action_space.json b/assets/cotrain_real_robot/robocoin_realman_rmc_aida_l_s28_a28/unified_action_space.json new file mode 100644 index 0000000..814b04c --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_realman_rmc_aida_l_s28_a28/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ef55a4aafbbe2ee823c0cee63ded3dbf686094cc4ac9049016b9941db4f30422" +} diff --git a/assets/cotrain_real_robot/robocoin_realman_rmc_aidal_s28_a28/norm_stats.json b/assets/cotrain_real_robot/robocoin_realman_rmc_aidal_s28_a28/norm_stats.json new file mode 100644 index 0000000..d51c279 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_realman_rmc_aidal_s28_a28/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.47839146852493286, + -2.059580087661743, + 0.6078921556472778, + 0.443592369556427, + 1.4694907665252686, + 1.1243274211883545, + -1.0638837814331055, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 533.576416015625, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5341330766677856, + 2.0288519859313965, + -0.7328935861587524, + -0.5111697316169739, + -1.5132325887680054, + -1.0845743417739868, + 1.057655930519104, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 554.112548828125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.21434840559959412, + 0.07314120978116989, + 1.1213843822479248, + 0.6602405905723572, + 1.2446599006652832, + 0.9368466138839722, + 1.2627320289611816, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 343.1611633300781, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.239162877202034, + 0.08330599218606949, + 0.8705637454986572, + 0.5838403701782227, + 1.1899601221084595, + 0.9443362951278687, + 1.3015942573547363, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 314.4317932128906, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0482353521347045, + -2.1750113368034363, + -2.646780677318573, + -1.6032505451679229, + -2.4177295753479005, + -1.6492822704315186, + -2.8623494152069093, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.6079999999999757, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.013312339687347463, + 1.8281194995880128, + -2.3761580247879026, + -1.6655417486190796, + -2.8879985211372374, + -2.024796287918091, + -2.8088368267059325, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7975999999999992, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.027407007861137256, + -1.8577467799186707, + 2.8453764088153832, + 1.6954893584251405, + 2.870450235891343, + 2.0029636798858643, + 2.808081196403503, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 948.4096, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.1564803113937376, + 2.1062067033290863, + 2.2962332958221428, + 1.4867680027008054, + 2.3619786128520968, + 1.6406866954803467, + 2.8881806318759917, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 944.6902000000001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0007135526975616813, + -0.0003534950374159962, + 0.0011087273014709353, + 0.00018156379519496113, + -0.0018077408894896507, + 0.00005206819696468301, + 0.0025921647902578115, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 533.2557983398438, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0009018750279210508, + 0.0002198505389969796, + -0.0011170865036547184, + -0.000418089737650007, + 0.0012902384623885155, + 0.0009497611899860203, + -0.0008871746831573546, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 553.1741333007812, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1037909984588623, + 0.03418908268213272, + 0.14360260963439941, + 0.16961778700351715, + 0.20701688528060913, + 0.2258588671684265, + 0.24374830722808838, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 343.0868225097656, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.11896975338459015, + 0.0325104221701622, + 0.1677417755126953, + 0.19693401455879211, + 0.24006836116313934, + 0.22501049935817719, + 0.28681400418281555, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 314.21026611328125, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.33542436039447776, + -0.11812768712043764, + -0.5185220909118653, + -0.5681056449890136, + -0.7323143272399903, + -0.7057940410137173, + -0.9256965145111082, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.6079999999999757, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4231953330039977, + -0.12260290641784666, + -0.5584167864799499, + -0.7264892864227295, + -0.8738897808074952, + -0.7326278971195221, + -1.0107426010131837, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7975999999999992, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.3840171305179596, + 0.12214941902160636, + 0.49682519912719725, + 0.6064030448913575, + 0.6977665336608885, + 0.7309729760646824, + 0.8620825569152837, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 948.4096, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.37962152361869816, + 0.10668836259841918, + 0.6009062723159793, + 0.6464898212432861, + 0.8375270114898674, + 0.6645073395252226, + 1.1167047012329103, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 944.6902000000001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_realman_rmc_aidal_s28_a28/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_realman_rmc_aidal_s28_a28/norm_stats_meta.json new file mode 100644 index 0000000..b2e9bcb --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_realman_rmc_aidal_s28_a28/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_realman_rmc_aidal_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/realman_rmc_aidal_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_18412/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 492790, + "num_frames": 15769266, + "estimated_total_batches": null, + "train_episodes": 17481, + "train_bytes": 1684550435506, + "elapsed_sec": 4069.850043296814, + "frames_per_sec": 3874.655290057317 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_realman_rmc_aidal_s28_a28/unified_action_space.json b/assets/cotrain_real_robot/robocoin_realman_rmc_aidal_s28_a28/unified_action_space.json new file mode 100644 index 0000000..814b04c --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_realman_rmc_aidal_s28_a28/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ef55a4aafbbe2ee823c0cee63ded3dbf686094cc4ac9049016b9941db4f30422" +} diff --git a/assets/cotrain_real_robot/robocoin_ruantong_a2d_s17_a17/norm_stats.json b/assets/cotrain_real_robot/robocoin_ruantong_a2d_s17_a17/norm_stats.json new file mode 100644 index 0000000..d3ba750 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_ruantong_a2d_s17_a17/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.4022698402404785, + 0.4008525311946869, + -1.8359957933425903, + 1.3991795778274536, + 1.6781357526779175, + -0.39159268140792847, + -0.11824289709329605, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5900587439537048, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.10200242698192596, + -0.36888185143470764, + 1.6269876956939697, + -1.5651452541351318, + -1.710113763809204, + 0.14229054749011993, + 0.0901879221200943, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7219226956367493, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.3285321593284607, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.47184816002845764, + 0.26041191816329956, + 0.30844730138778687, + 0.4104193449020386, + 0.3992116451263428, + 0.5433208346366882, + 0.4647732377052307, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.39009591937065125, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2526223659515381, + 0.1727783977985382, + 0.15735691785812378, + 0.30363792181015015, + 0.3119509518146515, + 0.3184160590171814, + 0.3587453365325928, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3384997248649597, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08604823052883148, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.15512949786186214, + -0.000247655253857372, + -2.7533860206604004, + 0.018561795279711076, + 0.348873460650444, + -1.5701000690460205, + -1.888011309146881, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1376806372463703, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.1755216784477236, + -0.9503723105043173, + 1.2927916605830192, + -2.0496549903660024, + -2.4722114605903625, + -0.1814788004875183, + -0.865350887775421, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1337790972352028, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5622645171403885, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.5952690245151522, + 1.1460021360963584, + -1.3690508592128754, + 2.049136744551986, + 2.751842607951164, + 0.8992856348037717, + 0.8812080025672913, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.965350421231985, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03684061706066122, + -0.09100282496213907, + 2.4757759820103646, + -0.0374427558146424, + -0.6511100595712662, + 1.4296446043968203, + 1.5782729723930364, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9653499048113824, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.2347364159733057, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0007815549615770578, + -0.0006295735365711153, + 0.00006955656135687605, + -0.00046953416313044727, + -0.0009421160793863237, + -0.000566480855923146, + 0.0007163064437918365, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5906252264976501, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.00038199048140086234, + 0.0004900511703453958, + -0.00028768597985617816, + -0.00026881968369707465, + -0.0003086130600422621, + -0.00019033218268305063, + -0.0003762365668080747, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7219077944755554, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.32853180170059204, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.19541341066360474, + 0.145516499876976, + 0.15332399308681488, + 0.19865047931671143, + 0.16601331532001495, + 0.20398183166980743, + 0.18197141587734222, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3904857337474823, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09083140641450882, + 0.059260159730911255, + 0.07308832556009293, + 0.12470908463001251, + 0.09311696887016296, + 0.08739949762821198, + 0.1316150426864624, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3384832441806793, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0860481858253479, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6090426849842071, + -0.4968913494586945, + -0.5529850662708282, + -0.6974553999900817, + -0.5849689860343932, + -0.8470925182104112, + -0.6177244747161865, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1376806372463703, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.3506921148777007, + -0.20023923506736763, + -0.2488031871795655, + -0.4694817880868911, + -0.3406314041137697, + -0.31274263751506814, + -0.5059143760204314, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.13361177916526795, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5622645171403885, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6863681363344192, + 0.5567416855335237, + 0.4736135180950165, + 0.6609690598249438, + 0.5248469697237015, + 0.5392340588569642, + 0.5923228402614593, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.965350421231985, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2980546859979629, + 0.20376526083946223, + 0.24556429748535136, + 0.442152768421173, + 0.33779594779014577, + 0.34090128064155567, + 0.4569228596687318, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9653499048113824, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.2347364159733057, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_ruantong_a2d_s17_a17/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_ruantong_a2d_s17_a17/norm_stats_meta.json new file mode 100644 index 0000000..b186237 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_ruantong_a2d_s17_a17/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_ruantong_a2d_s17_a17", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/ruantong_a2d_s17_a17_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_1719/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 32248, + "num_frames": 1031909, + "estimated_total_batches": null, + "train_episodes": 1633, + "train_bytes": 232098850893, + "elapsed_sec": 277.61806178092957, + "frames_per_sec": 3717.009597215209 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_ruantong_a2d_s17_a17/unified_action_space.json b/assets/cotrain_real_robot/robocoin_ruantong_a2d_s17_a17/unified_action_space.json new file mode 100644 index 0000000..46d05f0 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_ruantong_a2d_s17_a17/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "02e7c59245802e66825ab80d667297f376ddc17ad33bfbe771465efbd15789a2" +} diff --git a/assets/cotrain_real_robot/robocoin_ruantong_a2d_s41_a34/norm_stats.json b/assets/cotrain_real_robot/robocoin_ruantong_a2d_s41_a34/norm_stats.json new file mode 100644 index 0000000..fe95813 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_ruantong_a2d_s41_a34/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -1.3547803163528442, + 0.755029022693634, + 0.6068242788314819, + -0.9906300902366638, + 1.0170456171035767, + 1.3017445802688599, + -0.18157915771007538, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7635851502418518, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.3421299457550049, + -0.7070972323417664, + -0.5880898833274841, + 1.0016454458236694, + -0.9842587113380432, + -1.3245666027069092, + 0.13256670534610748, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7062156200408936, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0004295064427424222, + 0.3654797077178955, + 0.4781149625778198, + 0.404465913772583, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.40673211216926575, + 0.25750458240509033, + 0.44406312704086304, + 0.4298768639564514, + 0.4682933986186981, + 0.3272894322872162, + 0.4376765787601471, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.319647878408432, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.36325040459632874, + 0.26303979754447937, + 0.4294496476650238, + 0.41202446818351746, + 0.4376407861709595, + 0.26321712136268616, + 0.406250536441803, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.34777307510375977, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13882064819335938, + 0.0587720051407814, + 0.06267630308866501, + 0.06288386881351471, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -2.623746828877926, + 0.422594678670168, + 0.26733380875587465, + -1.3614243242025375, + 0.5744161965847017, + -0.005409026861190824, + -1.6480314255952835, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1908386861205101, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.9897309021949767, + -1.3695025413155555, + -2.06178382396698, + -0.01326705760955793, + -2.081861891722679, + -1.5936958384633064, + -0.853074108362198, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1906825377225876, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.26186463236808777, + 0.2617471218109131, + 0.3489969074726105, + 0.31707038768529894, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.7302417573094369, + 1.3694030942618847, + 2.445421035337448, + 0.009004551577567854, + 2.326905642080307, + 1.601938715982437, + 0.8492856928110122, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0012754402011632, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.3719133356809614, + -0.09056340849399569, + -0.16903709316253668, + 1.3555171401977542, + -0.2900681381464003, + -0.5199884833097457, + 1.707816768169403, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0010545860767364, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.26176494808197015, + 0.43632417860031125, + 0.6108229170560837, + 0.5188367841541767, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0010563352843746543, + 0.0017160391435027122, + 0.005159545224159956, + 0.0022106990218162537, + 0.0014503959100693464, + -0.005501764826476574, + 0.0010637474479153752, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6935475468635559, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0027838535606861115, + -0.0005895814974792302, + -0.0026668307837098837, + -0.002813382539898157, + -0.0016497792676091194, + 0.002556455321609974, + -0.000546303519513458, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6242499947547913, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.00042965743341483176, + 0.36547815799713135, + 0.47811827063560486, + 0.4044669568538666, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1597946286201477, + 0.11818362027406693, + 0.14702743291854858, + 0.2084183245897293, + 0.16728796064853668, + 0.16486595571041107, + 0.15998083353042603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4545469284057617, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.14823907613754272, + 0.12344123423099518, + 0.14680664241313934, + 0.18301677703857422, + 0.1618991196155548, + 0.11924934387207031, + 0.1484396904706955, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4780848026275635, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1388205587863922, + 0.058782149106264114, + 0.06265798956155777, + 0.06288007646799088, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6110378967523575, + -0.393797745513916, + -0.4590578153133391, + -0.6687536456108094, + -0.469356360435486, + -0.5654164524078369, + -0.5650752035140991, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4784718633651732, + -0.3966371303558349, + -0.4847236261367798, + -0.6575335870981217, + -0.660990184020996, + -0.41581965608596794, + -0.47923130426406857, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.2619338631629944, + 0.26169419288635254, + 0.3489546775817871, + 0.317028849452734, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.49575549707412714, + 0.43070048446655274, + 0.4998851660966874, + 0.8407508171796798, + 0.6952995580434798, + 0.6087248458862304, + 0.5395712120056153, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4941145238876343, + 0.4433111068725586, + 0.5403243355751037, + 0.6182873335599899, + 0.45763365707397474, + 0.4022696802139283, + 0.5173421204090118, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2617077342569828, + 0.43634983854293824, + 0.6108512703180313, + 0.5187769077837467, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_ruantong_a2d_s41_a34/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_ruantong_a2d_s41_a34/norm_stats_meta.json new file mode 100644 index 0000000..5858b0e --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_ruantong_a2d_s41_a34/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_ruantong_a2d_s41_a34", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/ruantong_a2d_s41_a34_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_6459/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 85004, + "num_frames": 2720116, + "estimated_total_batches": null, + "train_episodes": 6136, + "train_bytes": 1133795856617, + "elapsed_sec": 1135.4377226829529, + "frames_per_sec": 2395.654068611155 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_ruantong_a2d_s41_a34/unified_action_space.json b/assets/cotrain_real_robot/robocoin_ruantong_a2d_s41_a34/unified_action_space.json new file mode 100644 index 0000000..167fead --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_ruantong_a2d_s41_a34/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "c67f9a1a94cc29d855336aa75853afc3fe9f40256c371694d4c7688007dd8e61" +} diff --git a/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28/norm_stats.json b/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28/norm_stats.json new file mode 100644 index 0000000..f6275d8 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.1628706455230713, + 0.23347488045692444, + -0.04910242184996605, + 0.264553040266037, + 0.13043716549873352, + -0.33108076453208923, + -0.14998599886894226, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.29194653034210205, + 0.6853201985359192, + 0.6170122027397156, + -0.6644286513328552, + -1.1213622093200684, + -0.6663221120834351, + -0.8499442934989929, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.07948362082242966, + -0.17150138318538666, + 0.21232953667640686, + 0.0920492485165596, + -0.29347097873687744, + -0.30039313435554504, + 0.0853857547044754, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.3021090030670166, + -0.6288666725158691, + -0.6771913170814514, + 0.6895211338996887, + 1.1751788854599, + 0.6504865884780884, + 0.8789990544319153, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3626730144023895, + 0.19216300547122955, + 0.2810690999031067, + 0.5205802321434021, + 0.5020791888237, + 0.5364598631858826, + 0.36660030484199524, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.25213295221328735, + 0.207768052816391, + 0.4823054075241089, + 0.2749427855014801, + 0.6560249924659729, + 0.2500518560409546, + 0.6224695444107056, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3831944465637207, + 0.1589929163455963, + 0.24002577364444733, + 0.4983278810977936, + 0.46839040517807007, + 0.42183858156204224, + 0.32927024364471436, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.25350189208984375, + 0.2528623938560486, + 0.5577102303504944, + 0.22081902623176575, + 0.6477662324905396, + 0.20423410832881927, + 0.6250683069229126, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0871391372680663, + -0.20876111135482786, + -0.8388713676452637, + -0.8200110165596008, + -0.7363758310317993, + -1.3833980978965759, + -0.7764279620170593, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.943547477543354, + 0.09146377477645873, + 0.017375269904732704, + -1.098071245956421, + -1.7251344782330096, + -1.131031814558804, + -1.6974872374732048, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0471447103023528, + -0.528865817463398, + -0.20733413085937502, + -0.8457812840938568, + -1.2295815105915069, + -1.2434954173088073, + -0.86912408721447, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.902100967156887, + -0.9165206720232963, + -1.7268712982222438, + 0.06079141880832613, + 0.014800074510276318, + 0.11157027700543404, + 0.01750687765069306, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.47659769430160503, + 0.7076735383987427, + 0.45100675120353695, + 1.2377816146373748, + 1.335918707370758, + 0.9499077592849732, + 1.3439336926937102, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1254084028124809, + 0.9077776364326477, + 1.6320448531996459, + 0.013790484744310216, + -0.0170682890616356, + -0.011170641231536882, + -0.023183120945841296, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5287259579181671, + 0.14627059165239342, + 0.8642253021240234, + 1.3658753696680068, + 0.684262245941162, + 0.594153723692894, + 0.7332529784440993, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21299966784715663, + 0.005030459719896352, + -0.014311032612621899, + 1.052727247415483, + 1.73224950031098, + 1.0908084644936025, + 1.6659874871112406, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0016884017968550324, + 0.011546838097274303, + 0.00473940372467041, + -0.0024346469435840845, + -0.0031135918106883764, + -0.002420922042801976, + 0.0017203716561198235, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.2739558219909668, + 0.7384939193725586, + 0.6407151818275452, + -0.687782883644104, + -1.1394267082214355, + -0.6913239359855652, + -0.8725272417068481, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0007380479946732521, + -0.00810902751982212, + -0.0052103460766375065, + -0.002664201660081744, + 0.004933670163154602, + -0.002533601364120841, + -0.0018208746332675219, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.26942676305770874, + -0.6645417809486389, + -0.6903152465820312, + 0.7051751017570496, + 1.1936242580413818, + 0.6750840544700623, + 0.8997586965560913, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.15168355405330658, + 0.11104796826839447, + 0.14569349586963654, + 0.21772974729537964, + 0.2811240255832672, + 0.2331443876028061, + 0.23385126888751984, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.26519671082496643, + 0.20837455987930298, + 0.5007086396217346, + 0.2879154086112976, + 0.686345100402832, + 0.2576579451560974, + 0.6700758934020996, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13862664997577667, + 0.07791885733604431, + 0.11473166942596436, + 0.2046445906162262, + 0.18303248286247253, + 0.15754161775112152, + 0.16820472478866577, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.27345746755599976, + 0.25550195574760437, + 0.5730949640274048, + 0.2446984052658081, + 0.6683359146118164, + 0.22920526564121246, + 0.6644843816757202, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4647418713569641, + -0.36247115948200226, + -0.4871022036075593, + -0.6902964536190033, + -0.9688063781738281, + -0.8738521937131882, + -0.7369811347961426, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9890421652793884, + 0.19791983685493464, + -0.00033008601089240986, + -1.2235791976333363, + -1.7463293075561523, + -1.1852029679603175, + -1.7463293075561523, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.42307967765331267, + -0.26447365524768834, + -0.4067236483573914, + -0.6569536940097809, + -0.6593658556938171, + -0.4846822315454482, + -0.556758381319046, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9903689094781876, + -0.9210000038146973, + -1.7463293075561523, + -0.0010000000474974513, + -0.0003010683244559914, + 0.06110405158251524, + -0.0006505341859767214, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.5710441195964813, + 0.37983955030441297, + 0.47168680982589706, + 0.7756827896118161, + 1.0283435638427734, + 0.7458742338418958, + 0.7903891201019286, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2754032823443411, + 0.9206928329706192, + 1.6932202401782386, + 0.0006854407878826851, + 0.0006505341859766034, + 0.0006854407878826851, + 0.0006505341859766034, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5275774911642075, + 0.2503997765541076, + 0.3314345474720002, + 0.6707679876804353, + 0.5859755010604859, + 0.5634215530157092, + 0.5414131363868715, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.24682292762994762, + -0.05346022585034371, + -0.00028526860064581605, + 1.091015984294936, + 1.7459798416946315, + 1.2084764054469996, + 1.7459798416946315, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28/norm_stats_meta.json new file mode 100644 index 0000000..329799a --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unitree_g1_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unitree_g1_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_931/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 19765, + "num_frames": 632462, + "estimated_total_batches": null, + "train_episodes": 884, + "train_bytes": 137723586828, + "elapsed_sec": 202.07107949256897, + "frames_per_sec": 3129.898655404859 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28/unified_action_space.json b/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28/unified_action_space.json new file mode 100644 index 0000000..426641a --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "beb5c3de296f6dfdd1e27ccc8605130a15e00fbe16608d63c4a5e7e346171784" +} diff --git a/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28_high/norm_stats.json b/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28_high/norm_stats.json new file mode 100644 index 0000000..6633804 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28_high/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.7445161938667297, + 0.2046411782503128, + -0.24800196290016174, + 0.9919590950012207, + 0.3741361200809479, + -0.2801648676395416, + -0.13361211121082306, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.6758849024772644, + 0.8352697491645813, + 0.2204723358154297, + -0.3820844292640686, + -0.8395292162895203, + -0.3996052145957947, + -0.5619040131568909, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.36609283089637756, + -0.08858122676610947, + -0.30266183614730835, + 0.8333971500396729, + 0.29706326127052307, + -0.2599102556705475, + 0.45701661705970764, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.10622099041938782, + -0.8759199976921082, + -0.34643176198005676, + 0.814652144908905, + 1.2110474109649658, + 0.567145049571991, + 0.9029716849327087, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3898758292198181, + 0.20100830495357513, + 0.3866082727909088, + 0.4276141822338104, + 0.5115737915039062, + 0.2632923424243927, + 0.42600882053375244, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21897515654563904, + 0.10531293600797653, + 0.23290933668613434, + 0.2559126913547516, + 0.630479633808136, + 0.24550874531269073, + 0.5936964750289917, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17779535055160522, + 0.11882677674293518, + 0.14129222929477692, + 0.3587522506713867, + 0.23949897289276123, + 0.2896011471748352, + 0.5105559229850769, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7211710214614868, + 0.13480520248413086, + 0.32516923546791077, + 0.28521132469177246, + 0.520041286945343, + 0.3791837990283966, + 0.6520012617111206, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.2224115524291992, + -0.2226963701248169, + -0.7868920280456543, + -0.01173839816451075, + -0.6705473416090012, + -0.9839372223377227, + -1.1950472702026367, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.008761749792099, + 0.3164234099209309, + 0.015529673546552658, + -1.0354845005345996, + -1.7086090141598136, + -1.0038791944533587, + -1.6925374082896858, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7371529162883759, + -0.3936914521664381, + -0.7073566943407059, + 0.038411684036254876, + -0.06361387825012206, + -0.9945685440063476, + -0.2427892891407013, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.8244225978851318, + -0.917671856868267, + -1.6727701947420834, + 0.20956130823493002, + 0.016465356573462486, + -0.07792163744568825, + 0.013376317918300629, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.08535512161254899, + 0.6966267797470093, + 0.5173972716808319, + 1.3934486828446386, + 1.0134924908161163, + 0.3364450139045716, + 0.7313213119506838, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.21198543627262112, + 0.9117449419245124, + 0.8466709901146591, + -0.025526101072493645, + -0.036378498886898036, + -0.01881221437454217, + -0.020673312769085017, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.015156626367568982, + 0.11028196246623989, + -0.07709463704824449, + 1.2660695624351501, + 0.8034028644561768, + 0.18856437225341782, + 1.5178833255529405, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0496813233375548, + -0.12920548431873324, + -0.01758571497499939, + 1.5300610191166402, + 1.7329283000670372, + 1.1529876285791396, + 1.7253991491645575, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.001059380709193647, + 0.004219536203891039, + 0.0023536814842373133, + 0.004847630392760038, + -0.0044314186088740826, + 0.0032603945583105087, + 0.0002796429907903075, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.6260432600975037, + 0.8834512829780579, + 0.23747524619102478, + -0.4212741553783417, + -0.8709027171134949, + -0.433660089969635, + -0.5984626412391663, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.007231731899082661, + -0.001023879274725914, + -0.0034783456940203905, + -0.00010531584121054038, + 0.004821954760700464, + -0.0008869097218848765, + -0.000642355706077069, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.46016982197761536, + -0.8851051330566406, + -0.34612372517585754, + 0.8203089833259583, + 1.2152869701385498, + 0.7640361189842224, + 0.907231867313385, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.264655739068985, + 0.1654302030801773, + 0.2674410343170166, + 0.2734619677066803, + 0.3695032000541687, + 0.23066960275173187, + 0.32287293672561646, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2984951436519623, + 0.08304513990879059, + 0.2572486400604248, + 0.3235522210597992, + 0.7256113886833191, + 0.30972957611083984, + 0.689659059047699, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.04034788906574249, + 0.0261350329965353, + 0.01804332062602043, + 0.06059056892991066, + 0.022570159286260605, + 0.035094913095235825, + 0.03205068036913872, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21764817833900452, + 0.1374056339263916, + 0.3252909779548645, + 0.2921648323535919, + 0.5298183560371399, + 0.2756422162055969, + 0.677844226360321, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6967882361650467, + -0.376699486553669, + -0.7184161659240723, + -0.8877626407623291, + -1.1069273098468781, + -0.7469617376804352, + -1.1573144844055174, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0481975078582764, + 0.4381441333025694, + -0.0006127584492787719, + -1.1355026049411623, + -1.7463293075561523, + -1.1958755969752557, + -1.7463293075561523, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.10971371923685075, + -0.05946463347375394, + -0.05702475812435151, + -0.1925968414545059, + -0.058742796063423156, + -0.11493266266584395, + -0.0876838384628296, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0481975078582764, + -0.9210000038146973, + -1.6743681746596237, + 0.20299266990423204, + 0.0007594325964921152, + 0.03485975554860197, + -0.000051340521336533114, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.9039022744178773, + 0.5056628809690475, + 0.8582687198638914, + 0.8934240812301635, + 1.1677811064720154, + 0.6654134750127794, + 1.2087200176239015, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.06332860741019242, + 0.9208353751510382, + 0.943756352857803, + 0.0006854407878826851, + 0.0006505341859766034, + 0.000687336620897927, + 0.0006505341859766034, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13810114730000494, + 0.09025129990279673, + 0.04996730821132658, + 0.19269111961126328, + 0.0708820892572403, + 0.08923030090332035, + 0.08276398012638092, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13738033704161645, + -0.12135625495314606, + -0.001795823647105177, + 1.5714997634455563, + 1.745979983987019, + 1.4648461497579701, + 1.7459799615573373, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28_high/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28_high/norm_stats_meta.json new file mode 100644 index 0000000..18bb906 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28_high/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unitree_g1_s28_a28_high", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unitree_g1_s28_a28_fps30_cam_high__episodes_227/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 2287, + "num_frames": 73184, + "estimated_total_batches": null, + "train_episodes": 216, + "train_bytes": 3159483310, + "elapsed_sec": 28.13194966316223, + "frames_per_sec": 2601.4549605081866 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28_high/unified_action_space.json b/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28_high/unified_action_space.json new file mode 100644 index 0000000..426641a --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_unitree_g1_s28_a28_high/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "beb5c3de296f6dfdd1e27ccc8605130a15e00fbe16608d63c4a5e7e346171784" +} diff --git a/assets/cotrain_real_robot/robocoin_unknown_s30_a30_high/norm_stats.json b/assets/cotrain_real_robot/robocoin_unknown_s30_a30_high/norm_stats.json new file mode 100644 index 0000000..fce0f58 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_unknown_s30_a30_high/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.4601517915725708, + 0.28574568033218384, + -0.28942522406578064, + 0.6302258372306824, + -0.4861578345298767, + -0.5207346081733704, + -0.1987939476966858, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.1725141853094101, + 0.0685783177614212, + 0.12817345559597015, + -0.16918662190437317, + -0.4351489543914795, + -0.12865182757377625, + -0.2854554355144501, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.35936683416366577, + -0.39935022592544556, + 0.258500337600708, + 0.5848162770271301, + 0.21070364117622375, + -0.6088512539863586, + -0.01831921748816967, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.29934221506118774, + 0.19203908741474152, + -0.325772225856781, + 0.21082274615764618, + 0.3784441351890564, + 0.1499779373407364, + 0.3509950637817383, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.2189597487449646, + 0.14171771705150604, + 0.43653634190559387, + 0.362621009349823, + 0.499917209148407, + 0.36899834871292114, + 0.22155988216400146, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4452809989452362, + 0.6484705805778503, + 0.27489814162254333, + 0.4036325514316559, + 0.6206685304641724, + 0.3343346416950226, + 0.5257602334022522, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22628849744796753, + 0.1428905427455902, + 0.3611524999141693, + 0.4151686429977417, + 0.3856017589569092, + 0.3003835678100586, + 0.255756139755249, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22143076360225677, + 0.45618167519569397, + 0.5058495998382568, + 0.4284057021141052, + 0.5871851444244385, + 0.3656456768512726, + 0.5761141777038574, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.101659857749939, + -0.018607720243930814, + -1.584791460418701, + -0.30841166829466815, + -1.360724712395668, + -1.1547250646352767, + -0.7063347400903701, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5, + -0.7200000286102295, + 0.0, + -1.5700000524520874, + -1.745300054550171, + -1.3875660463571549, + -1.6754880523681641, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9737500015258789, + -0.7816216490864754, + -0.6477329211235047, + -0.3947790165305138, + -1.0113668236732483, + -1.1912066125869751, + -0.5944325535297394, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5, + -0.6045961649179459, + -1.587001287984848, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.18273090934753422, + 0.7255914891004562, + 0.7783089427948, + 1.3746503059208395, + 1.1035205349683763, + 0.49836549907922745, + 0.3299396315336227, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4998, + 0.9196720166802406, + 1.7449509945392607, + -0.0003140000104904228, + -0.0003490600109101738, + -0.0003140000104904228, + -0.0003490600109101738, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.23939910240173345, + -0.08035749015212068, + 1.2898316625356676, + 1.499683491653204, + 0.7804335985660553, + 0.2747516059875488, + 0.6979348600387574, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4166000000000001, + 0.7197225100278855, + -0.00033319363594053186, + 1.569686052441597, + 1.7449509945392607, + 1.369924903869629, + 1.675138992357254, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0014253475237637758, + 0.004040827043354511, + 0.00401429645717144, + -0.0006249065627343953, + -0.0007871320121921599, + 0.004092377610504627, + -0.007282583974301815, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.17188459634780884, + 0.09245369583368301, + 0.1286001205444336, + -0.17128616571426392, + -0.43959158658981323, + -0.13044847548007965, + -0.28975656628608704, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0018386616138741374, + -0.0017423932440578938, + -0.002052909228950739, + -0.0004560645029414445, + 0.006413742434233427, + -0.0015468160854652524, + 0.0011579451384022832, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.29914090037345886, + 0.1900770366191864, + -0.3282303512096405, + 0.21167583763599396, + 0.3810122311115265, + 0.15109674632549286, + 0.3544777035713196, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.08548260480165482, + 0.059953778982162476, + 0.14716483652591705, + 0.15606258809566498, + 0.15485815703868866, + 0.13305547833442688, + 0.08386557549238205, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.44540083408355713, + 0.6780035495758057, + 0.27485981583595276, + 0.40709882974624634, + 0.6220939755439758, + 0.3366040885448456, + 0.5278019905090332, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0954136922955513, + 0.053427211940288544, + 0.13860651850700378, + 0.17628909647464752, + 0.143167182803154, + 0.10808171331882477, + 0.08713337779045105, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22215959429740906, + 0.45735371112823486, + 0.5071426630020142, + 0.42950281500816345, + 0.5888646245002747, + 0.36695989966392517, + 0.5784511566162109, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.28645844354629524, + -0.18376410233974455, + -0.46031000661849975, + -0.5777189530849457, + -0.525499416065216, + -0.40847072732448586, + -0.3366838617324829, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5, + -0.7243000268936157, + 0.0, + -1.5707999467849731, + -1.745300054550171, + -1.3876446729898453, + -1.6754880523681641, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.3106002992868423, + -0.17958201030492782, + -0.5006137095689773, + -0.6031595508575439, + -0.48816414699554445, + -0.34850764927864075, + -0.2802416110396385, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5, + -0.6044009449958802, + -1.587001287984848, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.29917649668455115, + 0.21889999203681954, + 0.531090847492218, + 0.5048572306632997, + 0.5642101072788241, + 0.5288397431373595, + 0.24146718263626088, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4998, + 1.046845664525032, + 1.7449509945392607, + -0.0003141599893570213, + -0.0003490600109101738, + -0.0003141599893570213, + -0.0003490600109101738, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.32684008424282074, + 0.16315318412780755, + 0.41679275200367005, + 0.5781977668762206, + 0.5312393463134764, + 0.4175895518779753, + 0.3207163540005684, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4166000000000001, + 0.7240216483116149, + -0.00033319363594053186, + 1.569686052441597, + 1.7449509945392607, + 1.369924903869629, + 1.675138992357254, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_unknown_s30_a30_high/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_unknown_s30_a30_high/norm_stats_meta.json new file mode 100644 index 0000000..345f7da --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_unknown_s30_a30_high/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unknown_s30_a30_high", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unknown_s30_a30_fps30_cam_high__episodes_891/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 8154, + "num_frames": 260914, + "estimated_total_batches": null, + "train_episodes": 846, + "train_bytes": 20178322671, + "elapsed_sec": 82.17656183242798, + "frames_per_sec": 3175.041571245681 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_unknown_s30_a30_high/unified_action_space.json b/assets/cotrain_real_robot/robocoin_unknown_s30_a30_high/unified_action_space.json new file mode 100644 index 0000000..426641a --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_unknown_s30_a30_high/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "beb5c3de296f6dfdd1e27ccc8605130a15e00fbe16608d63c4a5e7e346171784" +} diff --git a/assets/cotrain_real_robot/robocoin_yinhe_s49_a16/norm_stats.json b/assets/cotrain_real_robot/robocoin_yinhe_s49_a16/norm_stats.json new file mode 100644 index 0000000..49a8dd4 --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_yinhe_s49_a16/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 1.524367094039917, + -1.3065650463104248, + -0.5391265749931335, + -1.9779719114303589, + 0.042856667190790176, + 0.1487847864627838, + -0.05886118486523628, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6645289063453674, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.49284985661506653, + 1.0417016744613647, + -0.322103887796402, + 1.5314422845840454, + 0.26630860567092896, + -0.10916095227003098, + -0.5114750862121582, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7098702192306519, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.2897261083126068, + 0.19842040538787842, + 0.2448112666606903, + 0.21612223982810974, + 0.6295380592346191, + 0.2960987687110901, + 0.1680130958557129, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2784114181995392, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.934599757194519, + 0.27511605620384216, + 0.8904873728752136, + 0.42886051535606384, + 0.34848248958587646, + 0.3541565239429474, + 0.565496027469635, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1976504921913147, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + 0.7376339052915573, + -1.6099701312497259, + -0.885706602358818, + -2.3163964335680007, + -1.0850703057050706, + -0.47425655221939084, + -0.44927409212589264, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.08486673181802035, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.891990763092041, + 0.4447629337310792, + -1.839495149588585, + 0.5765320897683501, + -0.5520781661987304, + -0.735830457687378, + -1.3432193279266358, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.10670718535780907, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.904548677366972, + -0.795198133945465, + 0.18943803424835215, + -1.2896517002105712, + 1.6342880125045776, + 0.7360185463428499, + 0.3375669756293296, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9067215650454163, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9615902823448184, + 1.5525214227437973, + 0.9610611121892929, + 2.3590748086735607, + 0.9761594358444214, + 0.7660390744209289, + 0.45407201790809637, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9067818530648947, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.00006569585093529895, + -0.0002367628476349637, + -0.0004524707910604775, + 0.0005102173890918493, + -0.001635607099160552, + -0.006574156228452921, + 0.0007140140514820814, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.665635883808136, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.01432245783507824, + 0.009032520465552807, + 0.010951328091323376, + 0.006414332427084446, + 0.004951334558427334, + 0.008958633057773113, + 0.008657954633235931, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.711277961730957, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1834850162267685, + 0.10580053180456161, + 0.18292799592018127, + 0.18817037343978882, + 0.3076501786708832, + 0.15092547237873077, + 0.1127411350607872, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2779955565929413, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.45669886469841003, + 0.2752196490764618, + 0.40178874135017395, + 0.2569642961025238, + 0.2553403973579407, + 0.24139155447483063, + 0.1890239715576172, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.19659824669361115, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6143484880447387, + -0.39371692562103267, + -0.6777150949001312, + -0.6583128417015075, + -1.4426410250663757, + -0.6675770700454713, + -0.4131294379234314, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.08486673181802035, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.7665856656551362, + -0.8687658917427064, + -1.09206223115921, + -0.84294264087677, + -0.609202272439003, + -0.8176013734817504, + -0.6940191761016845, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.10670718535780907, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6324825129508973, + 0.3164169328212738, + 0.6923210113048555, + 0.5968620174407961, + 1.15903103017807, + 0.5463467423677444, + 0.44189159464836125, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9067215650454163, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.2043245237350462, + 0.669174746847153, + 1.794497901535034, + 0.7042711029052735, + 0.8618204277515411, + 0.7357967818260196, + 0.7027042475700376, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9067818530648947, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_yinhe_s49_a16/norm_stats_meta.json b/assets/cotrain_real_robot/robocoin_yinhe_s49_a16/norm_stats_meta.json new file mode 100644 index 0000000..63d08ff --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_yinhe_s49_a16/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_yinhe_s49_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/yinhe_s49_a16_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5452/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 153600, + "num_frames": 4915186, + "estimated_total_batches": null, + "train_episodes": 5179, + "train_bytes": 711128217385, + "elapsed_sec": 1323.132462978363, + "frames_per_sec": 3714.810223109443 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robocoin_yinhe_s49_a16/unified_action_space.json b/assets/cotrain_real_robot/robocoin_yinhe_s49_a16/unified_action_space.json new file mode 100644 index 0000000..285dfcf --- /dev/null +++ b/assets/cotrain_real_robot/robocoin_yinhe_s49_a16/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "df6e3ea1278ba06ec1cd8fc9405c482c55982b5ac43bbfb1dee1f5bfcd1a468a" +} diff --git a/assets/cotrain_real_robot/robomind_agilex_cobot_magic_s14_a14/norm_stats.json b/assets/cotrain_real_robot/robomind_agilex_cobot_magic_s14_a14/norm_stats.json new file mode 100644 index 0000000..f699bd5 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_agilex_cobot_magic_s14_a14/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.2912142872810364, + 0.7706507444381714, + 0.8166523575782776, + -0.5391867160797119, + 0.17443010210990906, + -0.03291980177164078, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.037457823753357, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3165360689163208, + 0.7844910025596619, + 0.8448988199234009, + -0.6473979949951172, + -0.19697701930999756, + 0.09821853041648865, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.071836233139038, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.31844455003738403, + 0.6649036407470703, + 0.6359055638313293, + 0.3965521454811096, + 0.26199185848236084, + 0.19108326733112335, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.6735684871673584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2895064651966095, + 0.5852402448654175, + 0.5345459580421448, + 0.4037196934223175, + 0.25300946831703186, + 0.17583996057510376, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.6739572286605835, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.1008532051086426, + 0.0013943950653076175, + 0.014930963516235352, + -1.3446834449768066, + -0.46284152030944825, + -0.5668264865875243, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.01151485834121704, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.09137299480438232, + 0.0024674806594848636, + 0.013868572044372559, + -1.356740512084961, + -0.730856520652771, + -0.36164791870117186, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.015304181719198822, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.11911020965576169, + 2.1889521074295044, + 2.31054425239563, + 0.27205753517150866, + 0.8036104869842529, + 0.5188723945617677, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 5.357991581296921, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0514802862167358, + 2.167783304977417, + 2.112537544631958, + 0.07684082565307637, + 0.48839656925201425, + 0.5515233222961426, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 5.254145598340035, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.00031540499185211957, + -0.007605055347084999, + -0.013626378029584885, + 0.01294397097080946, + -0.008090313524007797, + 0.013309093192219734, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.3646289110183716, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0019422572804614902, + -0.007419590372592211, + -0.011846384033560753, + 0.012537145055830479, + 0.006900215987116098, + -0.007588144391775131, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.5834583044052124, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1662832796573639, + 0.3357270061969757, + 0.2942589521408081, + 0.2550986111164093, + 0.16362538933753967, + 0.1354900598526001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.0903167724609375, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.15850712358951569, + 0.3416793942451477, + 0.28663069009780884, + 0.2630174458026886, + 0.13510547578334808, + 0.12409359216690063, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.1895596981048584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.521558889389038, + -1.025707421875, + -1.1375078313827516, + -0.7164978378295899, + -0.5593309104919433, + -0.39902141418457027, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.09417187500000002, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5945680046081545, + -1.064510614013672, + -1.072522581100464, + -0.7810182523727416, + -0.42451723403930663, + -0.4333285047531128, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.16773752975463874, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6086202415466309, + 0.9857216306686398, + 0.8020620159149168, + 0.9357657577514651, + 0.5060111686706543, + 0.4612753326416015, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 6.653624244689942, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5080000579833981, + 1.0137772064208983, + 0.8535642738342282, + 0.9668074893951419, + 0.47746843833923336, + 0.33230566730499245, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 6.698792873382567, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_agilex_cobot_magic_s14_a14/norm_stats_meta.json b/assets/cotrain_real_robot/robomind_agilex_cobot_magic_s14_a14/norm_stats_meta.json new file mode 100644 index 0000000..af277e0 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_agilex_cobot_magic_s14_a14/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_agilex_cobot_magic_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/agilex_cobot_magic_agilex_dual_arm_h5_agilex_3rgb_real_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10374/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 196965, + "num_frames": 6302870, + "estimated_total_batches": null, + "train_episodes": 9855, + "train_bytes": 1015824843385, + "elapsed_sec": 1625.2714269161224, + "frames_per_sec": 3878.0414739459275 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_agilex_cobot_magic_s14_a14/unified_action_space.json b/assets/cotrain_real_robot/robomind_agilex_cobot_magic_s14_a14/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_real_robot/robomind_agilex_cobot_magic_s14_a14/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_real_robot/robomind_franka_fr3_dual_s16_a16/norm_stats.json b/assets/cotrain_real_robot/robomind_franka_fr3_dual_s16_a16/norm_stats.json new file mode 100644 index 0000000..56764de --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_fr3_dual_s16_a16/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.02872992493212223, + -0.03250863403081894, + -0.044107649475336075, + -1.9217846393585205, + -0.03335548937320709, + 1.8634817600250244, + -0.09915560483932495, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.27069082856178284, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.007103583309799433, + 0.09939762949943542, + 0.17450419068336487, + -1.4917900562286377, + -0.14953744411468506, + 1.5298478603363037, + 0.17748871445655823, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.17512521147727966, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.24050824344158173, + 0.18076345324516296, + 0.162387877702713, + 0.3688068687915802, + 0.26190441846847534, + 0.38791725039482117, + 0.42700111865997314, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.38373228907585144, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.20354995131492615, + 0.18818333745002747, + 0.14312860369682312, + 0.09749498218297958, + 0.42516154050827026, + 0.23171094059944153, + 0.315849632024765, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3484148383140564, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.7479126671791076, + -0.4948742458820343, + -0.4937059134244919, + -2.6657454515457153, + -0.7740779214859008, + 1.3427923250198364, + -1.4256502631664276, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.26181291670799256, + -0.12531252807974816, + -0.14902960658073428, + -1.8273668120980262, + -1.7342645349979402, + 1.3332580568790435, + -0.24545768320560457, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.004200000000000001, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6294316546440124, + 0.4177898835539817, + 0.3835556173324586, + -1.4613578771591187, + 0.8686296574592591, + 2.6317525205612182, + 1.02927272901535, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.991, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.665686247253418, + 0.6005449758857488, + 0.5071338846683502, + -1.253091666698456, + 0.17801692837476724, + 2.4559928531885147, + 1.320400775194168, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.991, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.00579951424151659, + 0.0009321922552771866, + 0.0001605675497557968, + 0.01468118466436863, + 0.004086125176399946, + -0.009518737904727459, + -0.0008803497767075896, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3470822870731354, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.009737007319927216, + -0.0050971596501767635, + 0.003751665586605668, + 0.002095873700454831, + 0.007014834322035313, + -0.006377325858920813, + -0.0024907798506319523, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.17645229399204254, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.18581676483154297, + 0.1604117602109909, + 0.09761915355920792, + 0.279049277305603, + 0.22557272017002106, + 0.3101310133934021, + 0.3323877155780792, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4602535367012024, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1281752586364746, + 0.11369078606367111, + 0.07542045414447784, + 0.07059511542320251, + 0.24174679815769196, + 0.14355233311653137, + 0.23310133814811707, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.35898837447166443, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6203167253017425, + -0.5089887523770332, + -0.31527611851692194, + -0.861568698644638, + -0.7907215990066527, + -0.9439559233188629, + -0.9502868450164795, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5435035077095032, + -0.4396112471818924, + -0.27968518979549417, + -0.2505410222053528, + -1.0277889500141142, + -0.5418802068948746, + -0.8036095057487488, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.00437053572118748, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6547829939365386, + 0.47977734111547465, + 0.3555985690355301, + 0.6909391857385636, + 0.7429793606758119, + 0.839421225786209, + 1.1230383680343627, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3702085198402405, + 0.3635676041245459, + 0.25351028020381916, + 0.2524659325599672, + 1.0453574712753295, + 0.48159508218765246, + 1.0040429187774658, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998000744047633, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_franka_fr3_dual_s16_a16/norm_stats_meta.json b/assets/cotrain_real_robot/robomind_franka_fr3_dual_s16_a16/norm_stats_meta.json new file mode 100644 index 0000000..3c018d2 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_fr3_dual_s16_a16/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_fr3_dual_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_fr3_dual_master_puppet_joint_position_h5_franka_fr3_dual_real_s16_a16_fps30_cam_high_cam_left_cam_right_cam_top__episodes_1774/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 11198, + "num_frames": 358321, + "estimated_total_batches": null, + "train_episodes": 1685, + "train_bytes": 186172127608, + "elapsed_sec": 205.53938150405884, + "frames_per_sec": 1743.3204156689756 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_franka_fr3_dual_s16_a16/unified_action_space.json b/assets/cotrain_real_robot/robomind_franka_fr3_dual_s16_a16/unified_action_space.json new file mode 100644 index 0000000..fd388aa --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_fr3_dual_s16_a16/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9a0d9895669ad5b106f765ca2cb33f8c41f383ef7498ec7c090f1b00097964c7" +} diff --git a/assets/cotrain_real_robot/robomind_franka_panda_s8_a8/norm_stats.json b/assets/cotrain_real_robot/robomind_franka_panda_s8_a8/norm_stats.json new file mode 100644 index 0000000..64bb6f7 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_panda_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.050074514001607895, + 0.2168712615966797, + -0.04304725304245949, + -1.6480380296707153, + -0.04889731854200363, + 1.981959581375122, + 0.027210397645831108, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.31860384345054626, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.20079824328422546, + 0.21306701004505157, + 0.14047782123088837, + 0.21161852777004242, + 0.18164995312690735, + 0.34882527589797974, + 0.35608425736427307, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3863016366958618, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.43048445436954497, + -0.1407027938723564, + -0.4342776439547539, + -2.307061647772789, + -0.8071739921569825, + 1.4752378027439117, + -0.8850302599906921, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.605513199532032, + 0.7539548544883727, + 0.3651459789872169, + -1.2252477578639984, + 0.34580575790405277, + 2.9056127210855482, + 1.1405179331779483, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.991, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.006179585587233305, + -0.029241317883133888, + -0.004109390079975128, + -0.010029942728579044, + 0.002001858549192548, + -0.020291229709982872, + 0.00541237648576498, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3327816426753998, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17788256704807281, + 0.24914397299289703, + 0.10994547605514526, + 0.2059284746646881, + 0.1720099151134491, + 0.399440199136734, + 0.3174999952316284, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4199410378932953, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5027609734058381, + -0.659905499958992, + -0.3669868229150772, + -0.6224279801130295, + -0.5189719449043273, + -1.0841700080633165, + -0.9586771881103513, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5086506120204923, + 0.5854389501810073, + 0.3575911468267441, + 0.6135797002315522, + 0.5958229855537414, + 1.0015189151763915, + 0.94854157409668, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_franka_panda_s8_a8/norm_stats_meta.json b/assets/cotrain_real_robot/robomind_franka_panda_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..2c43271 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_panda_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_panda_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_panda_master_puppet_joint_position_h5_franka_3rgb_real_s8_a8_fps30_cam_left_cam_right_cam_top__episodes_17219/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 57958, + "num_frames": 1854642, + "estimated_total_batches": null, + "train_episodes": 14956, + "train_bytes": 282424151738, + "elapsed_sec": 465.4217314720154, + "frames_per_sec": 3984.8633499218436 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_franka_panda_s8_a8/unified_action_space.json b/assets/cotrain_real_robot/robomind_franka_panda_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_panda_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_real_robot/robomind_franka_sim_franka_s8_a8/norm_stats.json b/assets/cotrain_real_robot/robomind_franka_sim_franka_s8_a8/norm_stats.json new file mode 100644 index 0000000..e18c97f --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_sim_franka_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.05431849882006645, + 0.2290264517068863, + 0.06054431572556496, + -1.7516008615493774, + -0.0009821689454838634, + 1.9669047594070435, + 0.10469292104244232, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3105355203151703, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.282229483127594, + 0.34571757912635803, + 0.26973626017570496, + 0.3954300284385681, + 0.2093062847852707, + 0.34419673681259155, + 0.6092366576194763, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.32808253169059753, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7128893469333648, + -0.7831290235042573, + -0.7018777868747712, + -2.654962126095593, + -0.7293025332927703, + 1.2178158522874118, + -1.579328977584839, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0008327009677886466, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7805238378047945, + 0.996611042022705, + 0.6962547571659083, + -0.801373397190869, + 0.5592271712780001, + 2.9440562456270682, + 1.834556310653686, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7858265437364578, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0003964641073253006, + -0.015292207710444927, + -0.005603020079433918, + 0.008090371266007423, + 0.0009030065848492086, + -0.013399748131632805, + 0.0025455045979470015, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3059731125831604, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.14430563151836395, + 0.23040126264095306, + 0.12359558790922165, + 0.25404950976371765, + 0.1299935132265091, + 0.2845810651779175, + 0.23000602424144745, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.32761436700820923, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4282694184303284, + -0.7556568478345871, + -0.3945588711738588, + -0.8038546324968339, + -0.384043906879425, + -0.9643010272979735, + -0.766740892744064, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0007800394535064648, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.44182890958786025, + 0.5628056311607361, + 0.3584979928016665, + 0.8073955500125884, + 0.43689187560081466, + 0.7673846399307251, + 0.7996728756904603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7859916551351547, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_franka_sim_franka_s8_a8/norm_stats_meta.json b/assets/cotrain_real_robot/robomind_franka_sim_franka_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..b68a98f --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_sim_franka_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_franka_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_sim_franka_3rgb_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_14488/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 48250, + "num_frames": 1543972, + "estimated_total_batches": null, + "train_episodes": 8445, + "train_bytes": 675920469639, + "elapsed_sec": 665.9570224285126, + "frames_per_sec": 2318.4258863577616 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_franka_sim_franka_s8_a8/unified_action_space.json b/assets/cotrain_real_robot/robomind_franka_sim_franka_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_sim_franka_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_real_robot/robomind_franka_sim_none_s8_a8/norm_stats.json b/assets/cotrain_real_robot/robomind_franka_sim_none_s8_a8/norm_stats.json new file mode 100644 index 0000000..61b96fe --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_sim_none_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.041941363364458084, + 0.23306936025619507, + 0.05907498672604561, + -1.8461532592773438, + -0.008388909511268139, + 2.0598065853118896, + 0.03718278184533119, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.16530641913414001, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3363783061504364, + 0.24904070794582367, + 0.27618101239204407, + 0.3934434950351715, + 0.12503312528133392, + 0.2713543772697449, + 0.481111615896225, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21115025877952576, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.842514001083374, + -0.14554469878673554, + -0.6748853764891625, + -2.5493086941719056, + -0.3112471418917179, + 1.444778957772255, + -1.0551550045967102, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0010764459133148496, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8897254436969759, + 1.0443386925697327, + 0.5906232087850571, + -0.7863341999053957, + 0.31217047451734536, + 2.5325355393886566, + 2.0018143637895585, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7445413999080657, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0013613005867227912, + -0.0019828719086945057, + -0.004892994649708271, + 0.040003255009651184, + 0.003110992955043912, + -0.026717711240053177, + 0.002946416148915887, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1649303436279297, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1734810769557953, + 0.18704959750175476, + 0.1274677813053131, + 0.26024433970451355, + 0.07944203168153763, + 0.23101893067359924, + 0.20181050896644592, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21115633845329285, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5883622665405273, + -0.5670622599601746, + -0.4257954135894776, + -0.7182313198089599, + -0.22942946300506595, + -0.6761015580177308, + -0.6581925751209259, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0007068812847137451, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5921108510971069, + 0.532150031197071, + 0.4482104328155516, + 0.7808476925373078, + 0.2439403713226318, + 0.6174762445449828, + 0.6635519044399261, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7441247965335847, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_franka_sim_none_s8_a8/norm_stats_meta.json b/assets/cotrain_real_robot/robomind_franka_sim_none_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..fc6ca81 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_sim_none_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_none_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_none_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_222/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1107, + "num_frames": 35418, + "estimated_total_batches": null, + "train_episodes": 211, + "train_bytes": 6706236456, + "elapsed_sec": 11.181196451187134, + "frames_per_sec": 3167.6395414946483 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_franka_sim_none_s8_a8/unified_action_space.json b/assets/cotrain_real_robot/robomind_franka_sim_none_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_sim_none_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_real_robot/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats.json b/assets/cotrain_real_robot/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats.json new file mode 100644 index 0000000..f9b87d7 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.12862539291381836, + 0.10420803725719452, + 0.1507907211780548, + -1.6999670267105103, + -0.14460554718971252, + 1.9053664207458496, + 0.4335462749004364, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.06511421501636505, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6245681643486023, + 0.34309419989585876, + 0.5870680809020996, + 0.40795278549194336, + 0.20813338458538055, + 0.2701113522052765, + 1.0759789943695068, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.12459228187799454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -2.8998490468978884, + -0.7582584895730018, + -0.744865327835083, + -2.576282403945923, + -0.6427169109582901, + 1.281201576291985, + -2.211445552444458, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.001115015268325692, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8701619072914122, + 0.8050513436913491, + 2.8916868991851805, + -0.970624508154392, + 0.5479656597852707, + 2.4191241051438204, + 2.5220915309906005, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5271702873706818, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.004356690216809511, + -0.010021368972957134, + -0.005047916434705257, + -0.016711799427866936, + -0.011854293756186962, + 0.03055323101580143, + 0.029920563101768494, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.06573743373155594, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17619915306568146, + 0.17244896292686462, + 0.18936899304389954, + 0.22039532661437988, + 0.11159107834100723, + 0.18016842007637024, + 0.2773687541484833, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.12432067841291428, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.559387174797058, + -0.5706956774711609, + -0.5846574388504027, + -0.8416802699804307, + -0.3643048192501068, + -0.4927735840797425, + -0.7364192728042602, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0008005832195281393, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5136722531795503, + 0.43214548578262324, + 0.5519980060100553, + 0.5205945446729658, + 0.3414099413871765, + 0.6120740163803098, + 1.1303667816162108, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5277051842689515, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats_meta.json b/assets/cotrain_real_robot/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..a224597 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_simulation_no_front_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_handeye_cam_left_external_cam_right_external__episodes_158/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1067, + "num_frames": 34125, + "estimated_total_batches": null, + "train_episodes": 150, + "train_bytes": 7133719955, + "elapsed_sec": 11.634025812149048, + "frames_per_sec": 2933.2064885367827 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_franka_sim_simulation_no_front_s8_a8/unified_action_space.json b/assets/cotrain_real_robot/robomind_franka_sim_simulation_no_front_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_sim_simulation_no_front_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_real_robot/robomind_franka_sim_simulation_s8_a8/norm_stats.json b/assets/cotrain_real_robot/robomind_franka_sim_simulation_s8_a8/norm_stats.json new file mode 100644 index 0000000..4454c2c --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_sim_simulation_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.058677639812231064, + -0.020728396251797676, + 0.061011988669633865, + -1.6386123895645142, + -0.0016661359695717692, + 1.85384202003479, + 0.0318516306579113, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.14600756764411926, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5181325078010559, + 0.3683291971683502, + 0.47908589243888855, + 0.40745365619659424, + 0.24538974463939667, + 0.3270070254802704, + 1.1062960624694824, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22717800736427307, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.9134195173263548, + -0.9667847575187684, + -1.4075731660842894, + -2.5127280881881715, + -0.7051276074171067, + 1.1881394446477294, + -2.1848897399902345, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.008432700586318953, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7120905005455018, + 0.8496470478296279, + 1.7842719498634345, + -0.7269027355104685, + 0.7306575120687486, + 2.559558767311461, + 2.2310024108886717, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7833485061168672, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0030864360742270947, + -0.014526627026498318, + -0.008263246156275272, + -0.021576467901468277, + 0.0018557735020294785, + 0.007785191759467125, + -0.005972929298877716, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1463216096162796, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2138717919588089, + 0.20189231634140015, + 0.20727543532848358, + 0.25472593307495117, + 0.12306797504425049, + 0.25284504890441895, + 0.3214346170425415, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2268107682466507, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.6992091821670527, + -0.6429719269752503, + -0.6553837590217593, + -0.8025883827686309, + -0.3720137566566468, + -0.8318469825267791, + -1.1202265443801882, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.009108828496933175, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.665241785526276, + 0.5787899346351622, + 0.5988114666938777, + 0.802218522644043, + 0.40542664546966556, + 0.7172769757270818, + 1.1334667954444884, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.783179182076454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_franka_sim_simulation_s8_a8/norm_stats_meta.json b/assets/cotrain_real_robot/robomind_franka_sim_simulation_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..8576f0d --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_sim_simulation_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_simulation_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_11422/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 53134, + "num_frames": 1700279, + "estimated_total_batches": null, + "train_episodes": 8662, + "train_bytes": 465501426716, + "elapsed_sec": 452.24869179725647, + "frames_per_sec": 3759.6106541359254 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_franka_sim_simulation_s8_a8/unified_action_space.json b/assets/cotrain_real_robot/robomind_franka_sim_simulation_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_franka_sim_simulation_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_real_robot/robomind_tienkung_gello_s16_a16/norm_stats.json b/assets/cotrain_real_robot/robomind_tienkung_gello_s16_a16/norm_stats.json new file mode 100644 index 0000000..13cf76b --- /dev/null +++ b/assets/cotrain_real_robot/robomind_tienkung_gello_s16_a16/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.854895830154419, + 0.2895817458629608, + -0.21138238906860352, + -0.6613888740539551, + 0.4681619107723236, + -0.15557539463043213, + -0.1758464127779007, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9139211773872375, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.26177895069122314, + -0.08320410549640656, + 0.13457360863685608, + 0.3343433141708374, + -0.2124287337064743, + 0.036814019083976746, + 0.17251014709472656, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9292864799499512, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.5788174271583557, + 0.25051409006118774, + 0.3781653642654419, + 0.4176454544067383, + 0.6007633805274963, + 0.24877780675888062, + 0.2531377375125885, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1635691225528717, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4761202931404114, + 0.1770811527967453, + 0.3033520579338074, + 0.3387700021266937, + 0.3307650685310364, + 0.14587220549583435, + 0.18914712965488434, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.10804925858974457, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.9158795733362437, + -0.0012460584171116347, + -1.2030685099601746, + -1.5389836430072785, + -0.4265326317191124, + -0.6112608863592148, + -0.6116086971282959, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.4938, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.1381313104391098, + -0.7465972574207931, + -0.48163455011844636, + 0.06347694122642278, + -1.4407999408245087, + -0.28010992536544804, + -0.1230062010616064, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.4978, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.15307473979890363, + 0.8836218490540981, + 0.8103051093101503, + -0.08349389228224768, + 1.8251103843450545, + 0.40191861500740034, + 0.5704657346725464, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5632996891856195, + -0.0001370591828597778, + 1.187215044903755, + 1.339963426311314, + 0.27724807739257784, + 0.5678760509967802, + 0.6107980014324189, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0002876046346500516, + 0.000031505733204539865, + 0.0002759836206678301, + 0.00006468334322562441, + -0.0006845134194009006, + 0.00026760270702652633, + 0.00043154990999028087, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.909492552280426, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.00037748011527583003, + 0.0005291275447234511, + -0.00015418844122905284, + -0.00017428975843358785, + 0.0007537910132668912, + -0.00006510389357572421, + -0.00021084601758047938, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9276549816131592, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.08800079673528671, + 0.07691292464733124, + 0.125771164894104, + 0.12257508188486099, + 0.21586425602436066, + 0.07356905937194824, + 0.06248171627521515, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17170776426792145, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.05351067706942558, + 0.052141688764095306, + 0.07220736891031265, + 0.05641496554017067, + 0.0876786857843399, + 0.03790133446455002, + 0.0318601094186306, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.11763474345207214, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.3049057404041289, + -0.23326391571760174, + -0.449493436717987, + -0.46661893243789676, + -0.8206052811384201, + -0.264598342704773, + -0.22057663996219634, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.5, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.179220182299614, + -0.19677410819530483, + -0.2365414365530012, + -0.17656873760223402, + -0.29757825162410745, + -0.13061386151313792, + -0.11544653077125544, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.5, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.2864243935346604, + 0.27934236091375353, + 0.4529821054458618, + 0.3896261790275575, + 0.7331835649967196, + 0.24467797489166254, + 0.2423023993253708, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9999, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1760005448102948, + 0.19438928351402285, + 0.2754443703889846, + 0.20665088987350444, + 0.28490007309913645, + 0.1408833035707473, + 0.10577272950410843, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9999, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_tienkung_gello_s16_a16/norm_stats_meta.json b/assets/cotrain_real_robot/robomind_tienkung_gello_s16_a16/norm_stats_meta.json new file mode 100644 index 0000000..f366f10 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_tienkung_gello_s16_a16/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_gello_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_6626/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 102313, + "num_frames": 3274013, + "estimated_total_batches": null, + "train_episodes": 5402, + "train_bytes": 214477074867, + "elapsed_sec": 861.7713775634766, + "frames_per_sec": 3799.1665599950165 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_tienkung_gello_s16_a16/unified_action_space.json b/assets/cotrain_real_robot/robomind_tienkung_gello_s16_a16/unified_action_space.json new file mode 100644 index 0000000..fd388aa --- /dev/null +++ b/assets/cotrain_real_robot/robomind_tienkung_gello_s16_a16/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9a0d9895669ad5b106f765ca2cb33f8c41f383ef7498ec7c090f1b00097964c7" +} diff --git a/assets/cotrain_real_robot/robomind_tienkung_prod1_gello_s16_a16/norm_stats.json b/assets/cotrain_real_robot/robomind_tienkung_prod1_gello_s16_a16/norm_stats.json new file mode 100644 index 0000000..bcdcf46 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_tienkung_prod1_gello_s16_a16/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.5683960318565369, + 0.22078832983970642, + -0.9512513875961304, + -0.4187726676464081, + -0.10543768852949142, + -0.6398162841796875, + -0.42031657695770264, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7417075634002686, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.4049739837646484, + -0.5157197117805481, + -0.6557912826538086, + 0.9174462556838989, + -0.31378185749053955, + 0.3021593987941742, + 0.06857848912477493, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.4635191261768341, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.064997598528862, + 0.07037549465894699, + 0.13303446769714355, + 0.11096090823411942, + 0.08682478964328766, + 0.11328177899122238, + 0.13669514656066895, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4326043128967285, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6458616256713867, + 0.26487383246421814, + 0.6870888471603394, + 0.4772903025150299, + 0.3747406303882599, + 0.3143857717514038, + 0.2010403573513031, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4886818826198578, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.7200056463241578, + 0.07263180047273636, + -1.2190638768672943, + -0.5876646458387375, + -0.2917385724902153, + -0.785775899887085, + -0.6443712908029556, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.3306755208015443, + -1.236551355423592, + -1.5572463144063948, + -0.05791391396522516, + -1.486474338889122, + -0.3266377056598663, + -0.3021904477119446, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.4484194566011429, + 0.3981429322063923, + -0.6136722717881203, + -0.19492976818084717, + 0.20381019022464752, + -0.33462102080285544, + -0.0783482120037079, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.5609298336505892, + -0.0006793295465874483, + 1.1604881446361541, + 1.7160904976725577, + 0.3718464797258374, + 0.7852976964950562, + 0.6216807430744171, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -1.9119422631774796e-6, + 0.00003626890611485578, + 0.000042202664189971983, + 2.2855781480757287e-6, + -0.000019521587091730908, + -0.00001689448436081875, + -0.00002351773582631722, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.995136022567749, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.020838096737861633, + 0.0010361943859606981, + -0.01129057165235281, + 0.014121136628091335, + 0.000757455884013325, + 0.00705363554880023, + -0.0017818119376897812, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.627912700176239, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0007892947178333998, + 0.0006520548486150801, + 0.0009216390899382532, + 0.0005412636674009264, + 0.0006694264011457562, + 0.0009917672723531723, + 0.0009289574227295816, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.49194738268852234, + 0.19771817326545715, + 0.34000205993652344, + 0.36470067501068115, + 0.19369961321353912, + 0.24002011120319366, + 0.07210414856672287, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4697430729866028, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.0017566436529159544, + -0.0015661208927631384, + -0.001643378257751467, + -0.0015505292415618896, + -0.001824682950973511, + -0.002112814867496482, + -0.0026672667026519936, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.9796605706214905, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.3261862396717072, + -0.548191284418106, + -1.2032444964885711, + -1.0167676458120347, + -0.6221477860212326, + -0.6264349913597107, + -0.27403422360420227, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.002321670353412627, + 0.0019566214606165887, + 0.0028617384910583493, + 0.00153787824511528, + 0.0016360209584236132, + 0.0017452585577964752, + 0.0024165729403495817, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9999959321141243, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.2985927095890046, + 0.5280053668022155, + 0.9517922229290008, + 1.048540046620369, + 0.6327526432275774, + 0.715945652127266, + 0.2349968707561494, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_tienkung_prod1_gello_s16_a16/norm_stats_meta.json b/assets/cotrain_real_robot/robomind_tienkung_prod1_gello_s16_a16/norm_stats_meta.json new file mode 100644 index 0000000..94e52cb --- /dev/null +++ b/assets/cotrain_real_robot/robomind_tienkung_prod1_gello_s16_a16/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_prod1_gello_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_prod1_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_2959/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 50624, + "num_frames": 1619947, + "estimated_total_batches": null, + "train_episodes": 2811, + "train_bytes": 247276602528, + "elapsed_sec": 426.9908273220062, + "frames_per_sec": 3793.868383918118 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_tienkung_prod1_gello_s16_a16/unified_action_space.json b/assets/cotrain_real_robot/robomind_tienkung_prod1_gello_s16_a16/unified_action_space.json new file mode 100644 index 0000000..fd388aa --- /dev/null +++ b/assets/cotrain_real_robot/robomind_tienkung_prod1_gello_s16_a16/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9a0d9895669ad5b106f765ca2cb33f8c41f383ef7498ec7c090f1b00097964c7" +} diff --git a/assets/cotrain_real_robot/robomind_tienkung_real_s38_a38/norm_stats.json b/assets/cotrain_real_robot/robomind_tienkung_real_s38_a38/norm_stats.json new file mode 100644 index 0000000..e0dfdfa --- /dev/null +++ b/assets/cotrain_real_robot/robomind_tienkung_real_s38_a38/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.29493895173072815, + 0.22533413767814636, + -0.1456715613603592, + -0.37044036388397217, + 0.25953322649002075, + -0.2537669241428375, + -0.14796751737594604, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.6502549648284912, + 0.28052079677581787, + 0.018628237769007683, + -0.00005931760824751109, + -0.06009761989116669, + -0.08868148177862167, + -0.05306922644376755, + -0.08859807997941971, + -0.04932575672864914, + -0.08857344835996628, + -0.04816029965877533, + -0.0868636965751648, + 0.33901673555374146, + -0.36104950308799744, + 0.3739446997642517, + 0.5144957900047302, + -0.25866034626960754, + 0.25732022523880005, + 0.2567217946052551, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.649032711982727, + -0.2628367841243744, + 0.0007943143136799335, + 0.0005952698993496597, + -0.07441623508930206, + -0.11178402602672577, + -0.06531063467264175, + -0.10965787619352341, + -0.05747656151652336, + -0.11185495555400848, + -0.05255016312003136, + -0.11343297362327576, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.42973142862319946, + 0.34801846742630005, + 0.22365431487560272, + 0.386581152677536, + 0.2664882242679596, + 0.27903592586517334, + 0.29781287908554077, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.07958385348320007, + 0.15354761481285095, + 0.0561688095331192, + 0.00017206600750796497, + 0.13671790063381195, + 0.20638827979564667, + 0.11897336691617966, + 0.20618008077144623, + 0.11050467938184738, + 0.2060556411743164, + 0.11131685972213745, + 0.20966513454914093, + 0.38633567094802856, + 0.40089690685272217, + 0.3132394552230835, + 0.5028060674667358, + 0.2161499261856079, + 0.31141015887260437, + 0.23277568817138672, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08685781061649323, + 0.16592749953269958, + 0.04572189226746559, + 0.021475350484251976, + 0.1447831094264984, + 0.2241557538509369, + 0.1266137659549713, + 0.21892304718494415, + 0.11279409378767014, + 0.22407935559749603, + 0.11696896702051163, + 0.22903063893318176, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.551503319787979, + -0.00008664713095640764, + -1.0151768641114236, + -1.3711347912874714, + -0.09397810050845146, + -0.6224041401863099, + -0.6123663410186768, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.4750549368372108, + -0.1695621688306332, + -0.0018915223360061462, + -0.00034682036133017397, + -0.5079660029932856, + -0.7161228560261428, + -0.41106695767641066, + -0.7180858494855463, + -0.3930065343528986, + -0.7158253021121025, + -0.43914203009605407, + -0.7168896266222, + -0.09407012546062465, + -1.2874860653210445, + -0.17408913574218754, + -0.001973554491996765, + -0.709429707813263, + -0.6109878363609313, + -0.16301011209487914, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.6588345624923706, + -0.35074032955169676, + -0.12010887455940245, + -0.0012235018730163416, + -0.4831454958856106, + -0.7578432049751282, + -0.4005000331997871, + -0.7217107752307659, + -0.37308507491350174, + -0.7606093155652285, + -0.38641987323760985, + -0.7735595872879029, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.0888273763179781, + 1.1172733630652465, + 0.2808457560360431, + -0.0002945801234921497, + 0.9796338315457105, + 0.4171795751750469, + 0.3170011445522307, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.6579432766681867, + 0.34925238815546034, + 0.3117895703554154, + 0.00018126516474876553, + 0.00030309055969124366, + 0.000028632073849399475, + 0.0002895187854766723, + 0.00010798151530322375, + 0.0008826640248298379, + 0.00007219264842572848, + 0.001360881042480444, + 0.00013528634309745158, + 1.1458640512943268, + -0.00027783659604163624, + 1.2385047981381414, + 1.7348896422088147, + 0.18065005381107335, + 0.614627125453949, + 0.694216549706459, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -1.4432021089196205, + 0.1512626721620559, + 0.17926564176082604, + 0.000026741600036628288, + -0.00002473595589402855, + 0.00024811214208597665, + 0.004195320993661933, + -0.00017910952835265004, + 0.004062597829103454, + 0.0002905553966761065, + 0.01533390641212462, + -0.0003688353538513489, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0007787835202179849, + 0.0004752471577376127, + -0.0004414436989463866, + -0.001414016354829073, + 0.0013652392663061619, + -0.00017888400179799646, + -0.0015178258763626218, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.6531866788864136, + 0.28111645579338074, + 0.018650267273187637, + -0.00005974648956907913, + -0.0601251944899559, + -0.0887242928147316, + -0.053092923015356064, + -0.08864081650972366, + -0.04934830963611603, + -0.08861598372459412, + -0.048186045140028, + -0.0869021937251091, + -0.00015493706450797617, + -0.0017026631394401193, + 0.002548813121393323, + 0.00300780707038939, + -0.003767275018617511, + 0.0016496209427714348, + 0.004904294386506081, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.6519732475280762, + -0.26343226432800293, + 0.0008141772705130279, + 0.0005978844128549099, + -0.07443948835134506, + -0.11183939129114151, + -0.06535311043262482, + -0.10971058905124664, + -0.05751331150531769, + -0.11190853267908096, + -0.052590757608413696, + -0.11349154263734818, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.03156838193535805, + 0.04225211963057518, + 0.021983617916703224, + 0.055804066359996796, + 0.027310846373438835, + 0.01656007580459118, + 0.03123629465699196, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.056290168315172195, + 0.1533438116312027, + 0.05616537109017372, + 0.0001719870779197663, + 0.1367076188325882, + 0.20637281239032745, + 0.11896534264087677, + 0.20616476237773895, + 0.11049602925777435, + 0.20604068040847778, + 0.11130741983652115, + 0.20963548123836517, + 0.04685088247060776, + 0.09096518158912659, + 0.04924608767032623, + 0.10160861164331436, + 0.05757398530840874, + 0.05817423388361931, + 0.06416540592908859, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.06600471585988998, + 0.16580142080783844, + 0.04570968449115753, + 0.021479224786162376, + 0.1447719931602478, + 0.2241283804178238, + 0.12659254670143127, + 0.21889713406562805, + 0.11277542263269424, + 0.22405214607715607, + 0.116791270673275, + 0.22902773320674896, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.09061183040142051, + -0.12404775338172913, + -0.0704024293661118, + -0.2184853252649307, + -0.06330916590690605, + -0.04272201628684996, + -0.06422994765043255, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.5703161955150513, + -0.1695621688306332, + -0.0015250724613666555, + -0.0003453201183583588, + -0.5081007151834667, + -0.7161228560261428, + -0.4112192991763354, + -0.7180858494855463, + -0.39313467007130387, + -0.7158253021121025, + -0.43934326486587527, + -0.7167883361458778, + -0.14155023992061622, + -0.38511696057319633, + -0.11559314941167831, + -0.28750722980499266, + -0.24779948472976687, + -0.16634117028713225, + -0.09492523908615103, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.65917573107481, + -0.35003675141334534, + -0.11971547834873197, + -0.0012235018730163416, + -0.48335779817700386, + -0.7578432049751282, + -0.400345036894083, + -0.7218900377564061, + -0.3732176400005818, + -0.7603991222307086, + -0.386447157740593, + -0.7735595872879029, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.09489202313423162, + 0.1605967822551727, + 0.05606685764789576, + 0.17829083396196377, + 0.08422680478096012, + 0.03788482583761216, + 0.03299186817407607, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.6579432766681867, + 0.34925238815546034, + 0.31197279529273514, + 0.00017976492177695035, + 0.00016837836951022478, + 0.000028632073849399475, + 0.00028995392620556615, + 0.00010798151530322375, + 0.0004982568696141332, + 0.00007219264842572848, + 0.0011596462726592982, + 0.00015841935873028845, + 0.15761798739433286, + 0.2344477727532388, + 0.1723205381035804, + 0.43932262992858884, + 0.1318270815849305, + 0.22612803225517264, + 0.25317158517837535, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -1.5372755635619164, + 0.1512626721620559, + 0.17887224555015568, + 0.000026741600036628288, + -0.00006495730280886569, + 0.00024811214208597665, + 0.003885328382253639, + -0.00017910952835265004, + 0.003930032742023526, + 0.0000803620621562251, + 0.015655354213714556, + -0.0003688353538513489, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_tienkung_real_s38_a38/norm_stats_meta.json b/assets/cotrain_real_robot/robomind_tienkung_real_s38_a38/norm_stats_meta.json new file mode 100644 index 0000000..18a2a87 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_tienkung_real_s38_a38/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_real_s38_a38", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_tiangong_joint_position_none_real_s38_a38_fps30_cam_chest_cam_head__episodes_146/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 3735, + "num_frames": 119501, + "estimated_total_batches": null, + "train_episodes": 139, + "train_bytes": 6479063622, + "elapsed_sec": 51.39154028892517, + "frames_per_sec": 2325.304891197284 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_tienkung_real_s38_a38/unified_action_space.json b/assets/cotrain_real_robot/robomind_tienkung_real_s38_a38/unified_action_space.json new file mode 100644 index 0000000..710243d --- /dev/null +++ b/assets/cotrain_real_robot/robomind_tienkung_real_s38_a38/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "b214ec84bd00be699f7085aa13f8ce94a5ec68921992fce7c0a2940630f38cc4" +} diff --git a/assets/cotrain_real_robot/robomind_tienkung_xsens_s14_a14/norm_stats.json b/assets/cotrain_real_robot/robomind_tienkung_xsens_s14_a14/norm_stats.json new file mode 100644 index 0000000..8f7426a --- /dev/null +++ b/assets/cotrain_real_robot/robomind_tienkung_xsens_s14_a14/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.2495279163122177, + 0.17678681015968323, + -0.9840797781944275, + -0.6926301717758179, + 1.2251882553100586, + 0.08307325094938278, + 0.08522151410579681, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.34397265315055847, + -0.25304967164993286, + 0.9509468078613281, + 0.7654147744178772, + -1.22251558303833, + -0.13512815535068512, + -0.06612176448106766, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.26420679688453674, + 0.13415028154850006, + 0.47677046060562134, + 0.511353075504303, + 0.6439276337623596, + 0.20034494996070862, + 0.2428995817899704, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3252720534801483, + 0.1595543771982193, + 0.486541211605072, + 0.5197448134422302, + 0.6544333100318909, + 0.1909613460302353, + 0.23475730419158936, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0170531200945376, + 0.0, + -1.9335804850578309, + -1.6159020401239395, + -0.25997581577301027, + -0.4047948722839355, + -0.5596908693313598, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.08971182259917254, + -0.7222377280950547, + 0.0475586646986194, + 0.18000000715255737, + -2.268928050994873, + -0.6213911081552506, + -0.6453999876976013, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.11371559751033788, + 0.5683805625915528, + -0.04447098979949926, + -0.1803198071599008, + 2.268323050069809, + 0.5785365489721299, + 0.6123555083274841, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.1841395626425744, + -0.0002228440999985093, + 2.0089757517626508, + 1.6936134419083595, + 0.35395139241218576, + 0.32321631383895877, + 0.5418778296709061, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0014831935986876488, + 0.00015102946781553328, + -0.004482831805944443, + -0.0021639675833284855, + -0.005934550892561674, + 0.0005814277101308107, + -0.00021758537332061678, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.005549073684960604, + -0.0006271626916714013, + 0.011006377637386322, + 0.00345456856302917, + 0.01563883200287819, + -0.0009500636951997876, + 0.005533472169190645, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.07221410423517227, + 0.039718322455883026, + 0.10084698349237442, + 0.08547154814004898, + 0.1351594477891922, + 0.0650010034441948, + 0.07518996298313141, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0988258570432663, + 0.05644811689853668, + 0.13093487918376923, + 0.0978231281042099, + 0.16362877190113068, + 0.06877110153436661, + 0.09312713146209717, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.21402704918384552, + -0.13221379663944244, + -0.42410457556247705, + -0.35352271614074704, + -0.5879369888305663, + -0.23091356999874113, + -0.27450559234619143, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.42848923683166507, + -0.21466804106235504, + -0.3375219912767411, + -0.2965521077394486, + -0.4419407671213149, + -0.23360881233215336, + -0.27623119473457325, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.2823349166870117, + 0.14318757643699642, + 0.28834942476749426, + 0.26326848864555363, + 0.3942917404174806, + 0.23076029906272888, + 0.2654346179962157, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2984188953399658, + 0.186484931564331, + 0.5955430841207503, + 0.3762691063404082, + 0.7537251217126846, + 0.2303286559104918, + 0.3970500724315644, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_tienkung_xsens_s14_a14/norm_stats_meta.json b/assets/cotrain_real_robot/robomind_tienkung_xsens_s14_a14/norm_stats_meta.json new file mode 100644 index 0000000..4499b07 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_tienkung_xsens_s14_a14/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_xsens_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_xsens_1rgb_real_s14_a14_fps30_cam_top__episodes_6126/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 103821, + "num_frames": 3322263, + "estimated_total_batches": null, + "train_episodes": 5775, + "train_bytes": 286470910041, + "elapsed_sec": 845.7928259372711, + "frames_per_sec": 3927.986734007127 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_tienkung_xsens_s14_a14/unified_action_space.json b/assets/cotrain_real_robot/robomind_tienkung_xsens_s14_a14/unified_action_space.json new file mode 100644 index 0000000..afc0e4f --- /dev/null +++ b/assets/cotrain_real_robot/robomind_tienkung_xsens_s14_a14/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "f93c8bfa8b83fa2fe49ad228c9db87bc4dd52e69118c7113e7db614a87543653" +} diff --git a/assets/cotrain_real_robot/robomind_ur5e_s7_a7/norm_stats.json b/assets/cotrain_real_robot/robomind_ur5e_s7_a7/norm_stats.json new file mode 100644 index 0000000..3128de2 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_ur5e_s7_a7/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 2.695399284362793, + -1.8317350149154663, + -1.590991497039795, + -1.160853624343872, + 1.3332312107086182, + 1.140396237373352, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2627898156642914, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5578770637512207, + 0.2017889767885208, + 0.21438661217689514, + 0.2472410500049591, + 0.4078080952167511, + 0.5581804513931274, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.306593120098114, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.819643810081482, + -2.436006836152077, + -2.2742806310653685, + -1.6289931789040566, + 0.1827675726890564, + 0.06774346570968626, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.018836079356074332, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 4.076547850751877, + -1.423432668375969, + -1.087432373046875, + -0.6889212518930434, + 2.1168328925490383, + 2.24854149518013, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9015686275437474, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.19636471569538116, + -0.0574476420879364, + 0.013684072531759739, + 0.09973897784948349, + -0.03993012756109238, + -0.14549808204174042, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3047395348548889, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5691956281661987, + 0.24521367251873016, + 0.22722239792346954, + 0.256473571062088, + 0.4543776214122772, + 0.5897438526153564, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.37293967604637146, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.8262648647785187, + -0.6060506603240967, + -0.6010523344516754, + -0.47804851830005646, + -1.4664543380737305, + -1.7500526297569277, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6849125693798066, + 0.605481555557251, + 0.5930862262487411, + 0.7191051467657088, + 1.1790077186584473, + 1.1551714324951172, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_ur5e_s7_a7/norm_stats_meta.json b/assets/cotrain_real_robot/robomind_ur5e_s7_a7/norm_stats_meta.json new file mode 100644 index 0000000..34a61b6 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_ur5e_s7_a7/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_ur5e_s7_a7", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/ur5e_master_puppet_joint_position_h5_ur_1rgb_real_s7_a7_fps30_cam_top__episodes_26380/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 118080, + "num_frames": 3778539, + "estimated_total_batches": null, + "train_episodes": 25061, + "train_bytes": 185868082632, + "elapsed_sec": 956.0188310146332, + "frames_per_sec": 3952.3688000892153 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot/robomind_ur5e_s7_a7/unified_action_space.json b/assets/cotrain_real_robot/robomind_ur5e_s7_a7/unified_action_space.json new file mode 100644 index 0000000..eee1142 --- /dev/null +++ b/assets/cotrain_real_robot/robomind_ur5e_s7_a7/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "6e093b089d4d4b4b7aa30decfa7266d28c6c842db12723952347da59fbb2cae4" +} diff --git a/assets/cotrain_real_robot_fix/agibot/norm_stats.json b/assets/cotrain_real_robot_fix/agibot/norm_stats.json new file mode 100644 index 0000000..3b0685f --- /dev/null +++ b/assets/cotrain_real_robot_fix/agibot/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.9210807681083679, + 0.5359001755714417, + 0.6545957326889038, + -0.7835156917572021, + 0.49938780069351196, + 1.1667169332504272, + 0.18891742825508118, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 68.11420440673828, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9076082110404968, + -0.46920207142829895, + -0.6356353163719177, + 0.7388717532157898, + -0.563096821308136, + -1.190690040588379, + -0.2128467708826065, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 62.9249153137207, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.015158376656472683, + 0.43660369515419006, + 0.46915775537490845, + 0.28688758611679077, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.1222560405731201, + 0.7990611791610718, + 0.9331700801849365, + 0.4298188388347626, + 0.5488388538360596, + 0.4325656592845917, + 0.7940273284912109, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 38.27954864501953, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0739389657974243, + 0.7449344992637634, + 0.9927517175674438, + 0.43602320551872253, + 0.58744877576828, + 0.409100741147995, + 0.741567075252533, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 36.552215576171875, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.044218555092811584, + 0.09825704991817474, + 0.14466187357902527, + 0.10195881873369217, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -2.3409746315956115, + -1.636828637123108, + -1.6977303141593931, + -1.4809685335159302, + -0.8208179449558255, + -0.6260671993255615, + -2.3568282432556154, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 34.4988072265625, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.9538713235855103, + -1.5447361523151397, + -2.1905040143489836, + -0.29421191997528084, + -2.4507909409999846, + -1.73033405251503, + -2.070129588508606, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 34.645408143234256, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.14006894874572756, + 0.05231554777622224, + -9.386273188283635e-7, + -0.00002157160452043172, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.9056857607841486, + 1.5327249885797505, + 2.1687543660163886, + 0.024525047016143775, + 1.6984838352680205, + 1.7286521408081055, + 1.8420831871032712, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 122.81813722076416, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.2422985345840454, + 1.4218171607971195, + 1.6568048201084142, + 1.475336287808418, + 0.9665897595882411, + 0.12981792721748353, + 2.1170754617691045, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 121.32148989295959, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08697387295961378, + 0.523526303935051, + 0.6805916502833599, + 0.44983564859252584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0007903198711574078, + 0.00011111732601420954, + 0.003278969321399927, + 0.0018502098973840475, + -0.0018388478783890605, + -0.0026262151077389717, + 0.0018169175600633025, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.42531853914260864, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0017990715568885207, + 0.00021451868815347552, + -0.005517459008842707, + -0.0024181653279811144, + 0.002791187958791852, + 0.002916863653808832, + -0.0025791008956730366, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3584616482257843, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.015158386901021004, + 0.43660271167755127, + 0.4691601097583771, + 0.28689104318618774, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.06166767701506615, + 0.06289893388748169, + 0.054367028176784515, + 0.06547970324754715, + 0.0702083557844162, + 0.07014007121324539, + 0.09278079867362976, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4933164119720459, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.06577219814062119, + 0.07637953013181686, + 0.06400372833013535, + 0.0757603719830513, + 0.07687703520059586, + 0.07965576648712158, + 0.10504146665334702, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.477949857711792, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.04421856254339218, + 0.09826167672872543, + 0.14465774595737457, + 0.10195144265890121, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.2101372690677643, + -0.2321174460649491, + -0.17257755661010732, + -0.20412157559394828, + -0.2611778012275696, + -0.27466095159053805, + -0.31812099928855897, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.21728988885879508, + -0.24020811669826514, + -0.24614887866973878, + -0.2764002819538116, + -0.24440300831794737, + -0.2453194079399108, + -0.3429291203022, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.14006894874572756, + 0.05231554777622224, + -9.386273188283635e-7, + -0.00002157160452043172, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.20963992025852196, + 0.1999978750944138, + 0.2047261504173281, + 0.24245942616462712, + 0.22355237565040564, + 0.21409198014736175, + 0.31090978384017953, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22425809392929086, + 0.27321109790802, + 0.18851629810333237, + 0.22489868850708006, + 0.27490250425338747, + 0.2988687011241915, + 0.3503418828487397, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08697387295961378, + 0.523526303935051, + 0.6805916502833599, + 0.44983564859252584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/agibot/norm_stats_meta.json b/assets/cotrain_real_robot_fix/agibot/norm_stats_meta.json new file mode 100644 index 0000000..dbd5f23 --- /dev/null +++ b/assets/cotrain_real_robot_fix/agibot/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "agibot", + "builder_dir": "/mnt/bos/bo23lu/AgiBot/agibot_world_robot_agibot_world_beta_mobile_dual_arm_joint_absolute_position_real_s20_a20_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_22986/agibot_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1059832, + "num_frames": 33914594, + "estimated_total_batches": null, + "train_episodes": 21837, + "train_bytes": 7547826566949, + "elapsed_sec": 9102.592523097992, + "frames_per_sec": 3725.8170036658357 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/agibot/unified_action_space.json b/assets/cotrain_real_robot_fix/agibot/unified_action_space.json new file mode 100644 index 0000000..cf12aa9 --- /dev/null +++ b/assets/cotrain_real_robot_fix/agibot/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "5e45fd3b2852b2a3e91da045db1d52fa4b8cd7429974403773734c355b6a795c" +} diff --git a/assets/cotrain_real_robot_fix/droid/norm_stats.json b/assets/cotrain_real_robot_fix/droid/norm_stats.json new file mode 100644 index 0000000..c9937ea --- /dev/null +++ b/assets/cotrain_real_robot_fix/droid/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.014264719560742378, + 0.23982040584087372, + -0.014591705054044724, + -2.0273144245147705, + -0.03576287254691124, + 2.323211669921875, + 0.0828426331281662, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3599560260772705, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.32424554228782654, + 0.5158682465553284, + 0.28870725631713867, + 0.5025275349617004, + 0.5316236019134521, + 0.46866557002067566, + 0.7423588037490845, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4027109742164612, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9240023367881773, + -0.8884155247688293, + -0.932663969230652, + -2.7749946952819826, + -1.845044603061676, + 1.1692317866563797, + -2.0730253297805787, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.982635237503052, + 1.4446059867143632, + 0.8277577193260188, + -0.44634648761749274, + 1.7120736752033237, + 3.5038524341106414, + 2.212446826171875, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.991, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0009084727498702705, + 0.04833802580833435, + -0.0012050201185047626, + 0.03542366996407509, + -0.0021518415305763483, + 0.019638868048787117, + 0.006257439497858286, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.40670886635780334, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17263764142990112, + 0.32643333077430725, + 0.16556227207183838, + 0.29040563106536865, + 0.2672358453273773, + 0.28381240367889404, + 0.3206557035446167, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.43752798438072205, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5209945830345153, + -0.7863647277832031, + -0.5066786664962768, + -0.82759104347229, + -0.8665996181488036, + -0.7820417912006377, + -0.9812896099090573, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5199369877338409, + 1.044959797668457, + 0.4928590750694273, + 0.9082127244472509, + 0.8440616558074954, + 0.8804159455299381, + 0.9947045337677007, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/droid/norm_stats_meta.json b/assets/cotrain_real_robot_fix/droid/norm_stats_meta.json new file mode 100644 index 0000000..3eaccb2 --- /dev/null +++ b/assets/cotrain_real_robot_fix/droid/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "droid", + "builder_dir": "/mnt/bos/bo23lu/DROID/droid_infidata/1.1.0", + "split": "train", + "batch_size": 32, + "num_batches": 578829, + "num_frames": 18522518, + "estimated_total_batches": null, + "train_episodes": 64124, + "train_bytes": 1185946441420, + "elapsed_sec": 4512.591522216797, + "frames_per_sec": 4104.629880371018 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/droid/unified_action_space.json b/assets/cotrain_real_robot_fix/droid/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_real_robot_fix/droid/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_real_robot_fix/full_norm_run_meta.json b/assets/cotrain_real_robot_fix/full_norm_run_meta.json new file mode 100644 index 0000000..7e242c9 --- /dev/null +++ b/assets/cotrain_real_robot_fix/full_norm_run_meta.json @@ -0,0 +1,527 @@ +{ + "config_name": "cotrain_real_robot", + "output_assets_dir": "/data/wudi/Atom-0/assets/cotrain_real_robot", + "dataset_id": null, + "skip_dataset_ids": [], + "copy_from_assets_name": null, + "datasets": [ + { + "config_name": "cotrain_real_robot", + "dataset_id": "piper30", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 69490, + "num_frames": 2223663, + "estimated_total_batches": null, + "train_episodes": 5307, + "train_bytes": 350058169358, + "elapsed_sec": 558.5227379798889, + "frames_per_sec": 3981.3294048559737 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "piper2", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_2/realworld_piper_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 21548, + "num_frames": 689528, + "estimated_total_batches": null, + "train_episodes": 902, + "train_bytes": 111529419925, + "elapsed_sec": 182.0517978668213, + "frames_per_sec": 3787.537437583667 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "agibot", + "builder_dir": "/mnt/bos/bo23lu/AgiBot/agibot_world_robot_agibot_world_beta_mobile_dual_arm_joint_absolute_position_real_s20_a20_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_22986/agibot_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1059832, + "num_frames": 33914594, + "estimated_total_batches": null, + "train_episodes": 21837, + "train_bytes": 7547826566949, + "elapsed_sec": 9102.592523097992, + "frames_per_sec": 3725.8170036658357 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "droid", + "builder_dir": "/mnt/bos/bo23lu/DROID/droid_infidata/1.1.0", + "split": "train", + "batch_size": 32, + "num_batches": 578829, + "num_frames": 18522518, + "estimated_total_batches": null, + "train_episodes": 64124, + "train_bytes": 1185946441420, + "elapsed_sec": 4512.591522216797, + "frames_per_sec": 4104.629880371018 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_cobot_magic_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Agilex_Cobot_Magic_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_8284/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 187608, + "num_frames": 6003434, + "estimated_total_batches": null, + "train_episodes": 7870, + "train_bytes": 690618678004, + "elapsed_sec": 1551.8257114887238, + "frames_per_sec": 3868.6264543462707 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_airbot_mmk2_s36_a36", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Airbot_MMK2_s36_a36_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10532/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 81017, + "num_frames": 2592540, + "estimated_total_batches": null, + "train_episodes": 10005, + "train_bytes": 431087330611, + "elapsed_sec": 690.6267569065094, + "frames_per_sec": 3753.8945227269173 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_upper_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Galaxea_R1_Lite_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_3650/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 27171, + "num_frames": 869469, + "estimated_total_batches": null, + "train_episodes": 1337, + "train_bytes": 205435325084, + "elapsed_sec": 271.46593260765076, + "frames_per_sec": 3202.8659789758667 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_realman_rmc_aida_l_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Realman_RMC-AIDA-L_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_693/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 9936, + "num_frames": 317940, + "estimated_total_batches": null, + "train_episodes": 658, + "train_bytes": 36471840854, + "elapsed_sec": 89.87298893928528, + "frames_per_sec": 3537.6591315416026 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s14_a14_fps30", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_7778/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 142767, + "num_frames": 4568537, + "estimated_total_batches": null, + "train_episodes": 7389, + "train_bytes": 1807557839316, + "elapsed_sec": 1851.0555272102356, + "frames_per_sec": 2468.0712884314917 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s14_a14_fps50", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s14_a14_fps50_cam_high_cam_left_wrist_cam_right_wrist__episodes_3397/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 54108, + "num_frames": 1731438, + "estimated_total_batches": null, + "train_episodes": 3227, + "train_bytes": 264209590712, + "elapsed_sec": 452.58451652526855, + "frames_per_sec": 3825.667774260525 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_23712/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 413112, + "num_frames": 13219572, + "estimated_total_batches": null, + "train_episodes": 18406, + "train_bytes": 1649570846072, + "elapsed_sec": 3489.1643438339233, + "frames_per_sec": 3788.750169753891 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_aloha_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/aloha_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_4879/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 198055, + "num_frames": 6337741, + "estimated_total_batches": null, + "train_episodes": 4634, + "train_bytes": 962548578236, + "elapsed_sec": 1664.1732065677643, + "frames_per_sec": 3808.3421695456377 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_alpha_bot_2_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/alpha_bot_2_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_857/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 22703, + "num_frames": 726485, + "estimated_total_batches": null, + "train_episodes": 814, + "train_bytes": 109263908150, + "elapsed_sec": 205.29979014396667, + "frames_per_sec": 3538.6543721771545 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_discover_aitbot_mmk2_s36_a36", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/discover_robotics_aitbot_mmk2_s36_a36_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5747/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 36260, + "num_frames": 1160293, + "estimated_total_batches": null, + "train_episodes": 5460, + "train_bytes": 194302774076, + "elapsed_sec": 348.6094217300415, + "frames_per_sec": 3328.34664720713 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/galaxea_r1_lite_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5167/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 245253, + "num_frames": 7848088, + "estimated_total_batches": null, + "train_episodes": 4886, + "train_bytes": 3346209600799, + "elapsed_sec": 3871.8957114219666, + "frames_per_sec": 2026.9368249894735 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_s16_a18", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/galaxea_r1_lite_s16_a18_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_970/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 9866, + "num_frames": 315700, + "estimated_total_batches": null, + "train_episodes": 922, + "train_bytes": 100400838947, + "elapsed_sec": 127.63867783546448, + "frames_per_sec": 2473.388202962743 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_leju_robot_s118_a54", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/leju_robot_s118_a54_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_17897/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 458510, + "num_frames": 14672292, + "estimated_total_batches": null, + "train_episodes": 17002, + "train_bytes": 4898931416952, + "elapsed_sec": 5203.681373596191, + "frames_per_sec": 2819.598462436255 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_leju_robot_s54_a54", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/leju_robot_s54_a54_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_394/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 2062, + "num_frames": 65982, + "estimated_total_batches": null, + "train_episodes": 374, + "train_bytes": 22504353358, + "elapsed_sec": 31.398486614227295, + "frames_per_sec": 2101.4388626648715 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_realman_rmc_aidal_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/realman_rmc_aidal_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_18412/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 492790, + "num_frames": 15769266, + "estimated_total_batches": null, + "train_episodes": 17481, + "train_bytes": 1684550435506, + "elapsed_sec": 4069.850043296814, + "frames_per_sec": 3874.655290057317 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_ruantong_a2d_s17_a17", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/ruantong_a2d_s17_a17_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_1719/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 32248, + "num_frames": 1031909, + "estimated_total_batches": null, + "train_episodes": 1633, + "train_bytes": 232098850893, + "elapsed_sec": 277.61806178092957, + "frames_per_sec": 3717.009597215209 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_ruantong_a2d_s41_a34", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/ruantong_a2d_s41_a34_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_6459/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 85004, + "num_frames": 2720116, + "estimated_total_batches": null, + "train_episodes": 6136, + "train_bytes": 1133795856617, + "elapsed_sec": 1135.4377226829529, + "frames_per_sec": 2395.654068611155 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unitree_g1_s28_a28_high", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unitree_g1_s28_a28_fps30_cam_high__episodes_227/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 2287, + "num_frames": 73184, + "estimated_total_batches": null, + "train_episodes": 216, + "train_bytes": 3159483310, + "elapsed_sec": 28.13194966316223, + "frames_per_sec": 2601.4549605081866 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unitree_g1_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unitree_g1_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_931/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 19765, + "num_frames": 632462, + "estimated_total_batches": null, + "train_episodes": 884, + "train_bytes": 137723586828, + "elapsed_sec": 202.07107949256897, + "frames_per_sec": 3129.898655404859 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unknown_s30_a30_high", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unknown_s30_a30_fps30_cam_high__episodes_891/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 8154, + "num_frames": 260914, + "estimated_total_batches": null, + "train_episodes": 846, + "train_bytes": 20178322671, + "elapsed_sec": 82.17656183242798, + "frames_per_sec": 3175.041571245681 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_yinhe_s49_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/yinhe_s49_a16_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5452/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 153600, + "num_frames": 4915186, + "estimated_total_batches": null, + "train_episodes": 5179, + "train_bytes": 711128217385, + "elapsed_sec": 1323.132462978363, + "frames_per_sec": 3714.810223109443 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_agilex_cobot_magic_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/agilex_cobot_magic_agilex_dual_arm_h5_agilex_3rgb_real_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10374/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 196965, + "num_frames": 6302870, + "estimated_total_batches": null, + "train_episodes": 9855, + "train_bytes": 1015824843385, + "elapsed_sec": 1625.2714269161224, + "frames_per_sec": 3878.0414739459275 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_fr3_dual_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_fr3_dual_master_puppet_joint_position_h5_franka_fr3_dual_real_s16_a16_fps30_cam_high_cam_left_cam_right_cam_top__episodes_1774/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 11198, + "num_frames": 358321, + "estimated_total_batches": null, + "train_episodes": 1685, + "train_bytes": 186172127608, + "elapsed_sec": 205.53938150405884, + "frames_per_sec": 1743.3204156689756 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_panda_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_panda_master_puppet_joint_position_h5_franka_3rgb_real_s8_a8_fps30_cam_left_cam_right_cam_top__episodes_17219/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 57958, + "num_frames": 1854642, + "estimated_total_batches": null, + "train_episodes": 14956, + "train_bytes": 282424151738, + "elapsed_sec": 465.4217314720154, + "frames_per_sec": 3984.8633499218436 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_franka_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_sim_franka_3rgb_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_14488/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 48250, + "num_frames": 1543972, + "estimated_total_batches": null, + "train_episodes": 8445, + "train_bytes": 675920469639, + "elapsed_sec": 665.9570224285126, + "frames_per_sec": 2318.4258863577616 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_simulation_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_11422/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 53134, + "num_frames": 1700279, + "estimated_total_batches": null, + "train_episodes": 8662, + "train_bytes": 465501426716, + "elapsed_sec": 452.24869179725647, + "frames_per_sec": 3759.6106541359254 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_simulation_no_front_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_handeye_cam_left_external_cam_right_external__episodes_158/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1067, + "num_frames": 34125, + "estimated_total_batches": null, + "train_episodes": 150, + "train_bytes": 7133719955, + "elapsed_sec": 11.634025812149048, + "frames_per_sec": 2933.2064885367827 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_none_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_none_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_222/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1107, + "num_frames": 35418, + "estimated_total_batches": null, + "train_episodes": 211, + "train_bytes": 6706236456, + "elapsed_sec": 11.181196451187134, + "frames_per_sec": 3167.6395414946483 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_gello_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_6626/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 102313, + "num_frames": 3274013, + "estimated_total_batches": null, + "train_episodes": 5402, + "train_bytes": 214477074867, + "elapsed_sec": 861.7713775634766, + "frames_per_sec": 3799.1665599950165 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_prod1_gello_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_prod1_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_2959/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 50624, + "num_frames": 1619947, + "estimated_total_batches": null, + "train_episodes": 2811, + "train_bytes": 247276602528, + "elapsed_sec": 426.9908273220062, + "frames_per_sec": 3793.868383918118 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_xsens_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_xsens_1rgb_real_s14_a14_fps30_cam_top__episodes_6126/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 103821, + "num_frames": 3322263, + "estimated_total_batches": null, + "train_episodes": 5775, + "train_bytes": 286470910041, + "elapsed_sec": 845.7928259372711, + "frames_per_sec": 3927.986734007127 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_real_s38_a38", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_tiangong_joint_position_none_real_s38_a38_fps30_cam_chest_cam_head__episodes_146/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 3735, + "num_frames": 119501, + "estimated_total_batches": null, + "train_episodes": 139, + "train_bytes": 6479063622, + "elapsed_sec": 51.39154028892517, + "frames_per_sec": 2325.304891197284 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_ur5e_s7_a7", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/ur5e_master_puppet_joint_position_h5_ur_1rgb_real_s7_a7_fps30_cam_top__episodes_26380/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 118080, + "num_frames": 3778539, + "estimated_total_batches": null, + "train_episodes": 25061, + "train_bytes": 185868082632, + "elapsed_sec": 956.0188310146332, + "frames_per_sec": 3952.3688000892153 + } + ] +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/piper2/norm_stats.json b/assets/cotrain_real_robot_fix/piper2/norm_stats.json new file mode 100644 index 0000000..f4b690f --- /dev/null +++ b/assets/cotrain_real_robot_fix/piper2/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.08570596575737, + 0.9424582123756409, + -0.5610473155975342, + -0.018378613516688347, + 0.15650981664657593, + -0.04922034963965416, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.008945055305957794, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.22233717143535614, + 1.3927223682403564, + -0.8957882523536682, + 0.17042388021945953, + 0.3040333390235901, + -0.07112878561019897, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01350892148911953, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1714383214712143, + 0.7361369132995605, + 0.5368331670761108, + 0.3496498763561249, + 0.4911200702190399, + 0.28332507610321045, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.02536850981414318, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2436714768409729, + 0.651149570941925, + 0.6894615888595581, + 0.3136552572250366, + 0.6569122076034546, + 0.2134801149368286, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.030022503808140755, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4991710331201553, + 0.0054144344157539305, + -1.7947804824004416, + -1.1790875864982606, + -0.9716636402130128, + -0.539963323020935, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.002318800112977624, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.2646023983061313, + 0.08680244942149147, + -2.2326956740360706, + -0.39387080802917473, + -0.9721601041316986, + -0.6741397899150849, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.003800000064074993, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.38600136826038356, + 2.2529563539030497, + -0.002522718032682114, + 0.6737772881984712, + 1.2084734504699708, + 0.8707268574714662, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09907970115607603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7167606556713582, + 2.391043433867162, + 0.00008864541053776875, + 1.1195562719345094, + 1.2258558490276337, + 0.3745928731918333, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09959649641532452, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0010017158929258585, + 0.0017170342616736889, + -0.0017244319897145033, + -0.005731134209781885, + 0.002714053960517049, + 0.002033872064203024, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.008943209424614906, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0010065166279673576, + 0.0033344815019518137, + -0.00027303790557198226, + 0.0020667631179094315, + 0.001737685059197247, + -0.0029692337848246098, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01350709330290556, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.08381801843643188, + 0.31304702162742615, + 0.23983915150165558, + 0.10776226967573166, + 0.18366022408008575, + 0.09571901708841324, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.025366676971316338, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1489294171333313, + 0.33599135279655457, + 0.27681979537010193, + 0.1537630707025528, + 0.19053618609905243, + 0.09432122856378555, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.030021704733371735, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.3243094861030579, + -0.9993304105758667, + -0.7881305526733398, + -0.4524798871994018, + -0.6921295278072357, + -0.2691142694234848, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.002318800112977624, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5554006125926971, + -1.084025181722641, + -0.9235458539009094, + -0.5143094916582107, + -0.686023402261734, + -0.3556695580482483, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.003800000064074993, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.3279062141418456, + 1.0899867341041567, + 0.9700191698074341, + 0.33629278821945197, + 0.6258798820972444, + 0.406562376332283, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09907970115607603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4854212229251862, + 1.2325074484825134, + 0.9927912852764131, + 0.5601088427543641, + 0.6361501549243929, + 0.30015870928764343, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09959649641532452, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/piper2/norm_stats_meta.json b/assets/cotrain_real_robot_fix/piper2/norm_stats_meta.json new file mode 100644 index 0000000..c3f6eff --- /dev/null +++ b/assets/cotrain_real_robot_fix/piper2/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "piper2", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_2/realworld_piper_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 21548, + "num_frames": 689528, + "estimated_total_batches": null, + "train_episodes": 902, + "train_bytes": 111529419925, + "elapsed_sec": 182.0517978668213, + "frames_per_sec": 3787.537437583667 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/piper2/unified_action_space.json b/assets/cotrain_real_robot_fix/piper2/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_real_robot_fix/piper2/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_real_robot_fix/piper30/norm_stats.json b/assets/cotrain_real_robot_fix/piper30/norm_stats.json new file mode 100644 index 0000000..6130c4e --- /dev/null +++ b/assets/cotrain_real_robot_fix/piper30/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0760473981499672, + 1.0517759323120117, + -0.7747761011123657, + 0.15242573618888855, + 0.4494738280773163, + -0.09137012809515, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.016618814319372177, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07727460563182831, + 0.7200653553009033, + -0.4604390561580658, + -0.2260405272245407, + 0.24460497498512268, + 0.16355007886886597, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01185830868780613, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.28079867362976074, + 0.8831034302711487, + 0.7211003303527832, + 0.7177441716194153, + 0.5327411890029907, + 0.6071151494979858, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03437401354312897, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2081252783536911, + 0.8027406930923462, + 0.5713866949081421, + 0.6549085378646851, + 0.4776606559753418, + 0.4999569356441498, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.031229877844452858, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4875116139650345, + -0.00043919531644787645, + -2.2551212312346323, + -1.5829997071027755, + -0.6845841318130493, + -1.615586260795593, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0029380800276063383, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4486167727947235, + -0.005599666852504015, + -1.8685801381547935, + -1.7327060890197754, + -0.762030679988861, + -0.9720964525461196, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0035174399364739655, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.8876427154064179, + 2.4845687208327694, + 0.0026788388188001555, + 1.7340745076179505, + 1.2515803995132444, + 1.6471686191558836, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09956015744088217, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6083275032162665, + 2.198549814021401, + 0.005637001402210462, + 1.3888049545288084, + 1.2151789251804352, + 1.545086481523514, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09957936216918752, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0020336343441158533, + -0.0003478959552012384, + 0.0036158752627670765, + -0.0018518087454140186, + -0.002676568226888776, + 0.0017340786289423704, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01780613325536251, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.002196062356233597, + 0.0025906015653163195, + -0.0007922314689494669, + -0.0006751723121851683, + -0.0008008037693798542, + -0.000598791753873229, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.012778770178556442, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.13291876018047333, + 0.4570249021053314, + 0.3580925762653351, + 0.3361109495162964, + 0.2754795253276825, + 0.30054646730422974, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03545059636235237, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09071528911590576, + 0.31943845748901367, + 0.23047679662704468, + 0.20181375741958618, + 0.183805450797081, + 0.1964036524295807, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03226304054260254, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.5487480565547943, + -1.598214064502716, + -1.1666529998779296, + -1.2725653482437136, + -1.0261658200979231, + -1.0280169901371001, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0029380800276063383, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.3517950798034668, + -1.1833345177173613, + -0.9023950806617738, + -0.7187113502502438, + -0.6822588787078857, + -0.7689471103668215, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0035174399364739655, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.40653051655292516, + 1.6554438406944278, + 1.3955223114013675, + 1.2879812050342556, + 1.0254203120470047, + 1.127150822353363, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09956015744088217, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3331105176448823, + 1.3341810100555422, + 0.9261858076095582, + 0.7806027033805849, + 0.7630852434158326, + 0.6658555793762204, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09957936216918752, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/piper30/norm_stats_meta.json b/assets/cotrain_real_robot_fix/piper30/norm_stats_meta.json new file mode 100644 index 0000000..cc22714 --- /dev/null +++ b/assets/cotrain_real_robot_fix/piper30/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "piper30", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 69490, + "num_frames": 2223663, + "estimated_total_batches": null, + "train_episodes": 5307, + "train_bytes": 350058169358, + "elapsed_sec": 558.5227379798889, + "frames_per_sec": 3981.3294048559737 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/piper30/unified_action_space.json b/assets/cotrain_real_robot_fix/piper30/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_real_robot_fix/piper30/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_agilex_cobot_magic_s26_a26/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_agilex_cobot_magic_s26_a26/norm_stats.json new file mode 100644 index 0000000..6693060 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_agilex_cobot_magic_s26_a26/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.19811221957206726, + 0.772533118724823, + -0.8077450394630432, + -0.028649263083934784, + 0.8329925537109375, + 0.1338183581829071, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6504519581794739, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.213411346077919, + 0.936856210231781, + -0.8555614352226257, + 0.052240047603845596, + 0.8344802260398865, + -0.13020701706409454, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6270856261253357, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.28874093294143677, + 0.9208551049232483, + 0.47005847096443176, + 0.3561064600944519, + 0.4977680742740631, + 0.4375063478946686, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.40372464060783386, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.29861217737197876, + 0.9481472373008728, + 0.46235257387161255, + 0.424010694026947, + 0.45311257243156433, + 0.437126100063324, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.40041401982307434, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0729224056005477, + -0.01197078370004892, + -2.2129377588272092, + -1.6497411670684814, + -1.1689142931699754, + -0.6284993870735169, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.000586399725265801, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.14700397849082947, + -0.01449557845443487, + -2.117433346748352, + -1.4916880182743073, + -1.008069571685791, + -1.5053448512077332, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0001424004912376417, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.1663727890253066, + 2.4838475979313257, + -0.36945127830505387, + 1.2129275941848756, + 1.2130273148536679, + 2.074979570531845, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9997992000000551, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0338315951824188, + 2.445226298929751, + -0.36191145629882815, + 1.535950502681732, + 1.217853112411499, + 0.877599804019928, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9997936999998986, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.00009146828961092979, + -0.0016088075935840607, + 0.0007087555713951588, + -0.000026479769076104276, + 0.00020575610687956214, + 0.00001443375185772311, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6503733396530151, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0000202807059395127, + -0.0018799782264977694, + 0.0007903146906755865, + -0.00026286765933036804, + 0.0001462479995097965, + 0.00015752519539091736, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6271259188652039, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.12023629993200302, + 0.322498619556427, + 0.1985558718442917, + 0.14494362473487854, + 0.19618654251098633, + 0.1817934215068817, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4035850465297699, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13321657478809357, + 0.34202784299850464, + 0.2128268927335739, + 0.15731655061244965, + 0.1797640025615692, + 0.19996008276939392, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.40015628933906555, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4558506237030029, + -1.2673018789291381, + -0.63129927778244, + -0.4630223393440245, + -0.5986795719146729, + -0.6356411955833434, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.000586399725265801, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5149496856689453, + -1.3162814127922058, + -0.6802423383712766, + -0.5557396152496339, + -0.549421439886093, + -0.7112965393543245, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0001424004912376417, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4595871042251587, + 1.1543425884246825, + 0.8348300868988039, + 0.4428232517242434, + 0.6962429767608644, + 0.6384128303527827, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9997992000000551, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.49019248924255354, + 1.2172323634624478, + 0.8798893958568579, + 0.5399059474945069, + 0.6080126795768739, + 0.7685098371028896, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9997936999998986, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_agilex_cobot_magic_s26_a26/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_agilex_cobot_magic_s26_a26/norm_stats_meta.json new file mode 100644 index 0000000..f32d261 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_agilex_cobot_magic_s26_a26/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_cobot_magic_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Agilex_Cobot_Magic_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_8284/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 187608, + "num_frames": 6003434, + "estimated_total_batches": null, + "train_episodes": 7870, + "train_bytes": 690618678004, + "elapsed_sec": 1551.8257114887238, + "frames_per_sec": 3868.6264543462707 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_agilex_cobot_magic_s26_a26/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_agilex_cobot_magic_s26_a26/unified_action_space.json new file mode 100644 index 0000000..ed9f81b --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_agilex_cobot_magic_s26_a26/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9fbd0a367f6d113a176cae2124ffec508f6202dee702a6b29236e6e8f60d0775" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats.json new file mode 100644 index 0000000..8c2d277 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.17712397873401642, + 0.810139000415802, + -0.6855402588844299, + -0.11222872883081436, + 0.6206351518630981, + -0.015597881749272346, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.12833420932292938, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.20979192852973938, + 0.7679632306098938, + -0.6718887686729431, + 0.12151588499546051, + 0.6151161789894104, + -0.0631631389260292, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1681675761938095, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.2495959997177124, + 0.8154167532920837, + 0.6811779141426086, + 0.31063228845596313, + 0.35135722160339355, + 0.36757487058639526, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.16275501251220703, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2519766390323639, + 0.8133144378662109, + 3.9310410022735596, + 0.27127107977867126, + 3.887181282043457, + 0.3052545189857483, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.16318519413471222, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.8187637863636017, + -0.02233026457130909, + -2.2677624532647433, + -1.1966205580234528, + -0.281935452222824, + -0.8411327709198, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.036514745473861694, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.20716872844696044, + -0.017633342403545978, + -2.928503234863282, + -0.45736086540222165, + -0.40014072451591487, + -1.0153934538841247, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.022415564626455307, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.28984460719823835, + 2.3611703608632086, + 0.030060533820092772, + 0.5438134195804598, + 1.2402318687438965, + 1.1925266407012938, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5767497708797455, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8714975715160369, + 2.347538023441285, + -0.006531738281250199, + 0.9904942384719853, + 1.255498284292221, + 0.6571380303382872, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5836906126737594, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.000010739619938249234, + -0.00011467040894785896, + 0.00014792964793741703, + 0.0007788547081872821, + 0.0009138808236457407, + 0.0005021721590310335, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1263725459575653, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.00003737088627531193, + -9.091671017813496e-6, + 0.000014992138858360704, + -0.0002670294779818505, + -0.000504948606248945, + -0.0003584008663892746, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.16686192154884338, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.13647353649139404, + 0.3363063931465149, + 0.29653409123420715, + 0.17680639028549194, + 0.2150084674358368, + 0.16584904491901398, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.16264137625694275, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1296338587999344, + 0.3418736457824707, + 4.995156764984131, + 0.17120759189128876, + 4.817986965179443, + 0.17061470448970795, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.16310515999794006, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.46183118805885304, + -1.1268640749931336, + -0.9779461513519287, + -0.6261398021697997, + -0.6543991428375244, + -0.5273366480827333, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.036514745473861694, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4657173981189727, + -1.2373619970321654, + -2.843096435547068, + -0.5746413822174072, + -1.665887695312449, + -0.6153451510906218, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.022415564626455307, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4982637989044192, + 1.243240743112564, + 1.0069862585067746, + 0.5738323686599736, + 0.8133578369140624, + 0.5755800625801086, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5767497708797455, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.44999427776336676, + 1.1858594246387484, + -0.3609619140625, + 0.5913829717636108, + -0.011474609375, + 0.5490435281276707, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5836906126737594, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats_meta.json new file mode 100644 index 0000000..442082b --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s14_a14_fps30", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_7778/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 142767, + "num_frames": 4568537, + "estimated_total_batches": null, + "train_episodes": 7389, + "train_bytes": 1807557839316, + "elapsed_sec": 1851.0555272102356, + "frames_per_sec": 2468.0712884314917 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps30/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps30/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps30/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats.json new file mode 100644 index 0000000..1b7d607 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.18395932018756866, + 0.6204625964164734, + -0.4631445109844208, + -0.23754161596298218, + 0.4260796904563904, + 0.19697996973991394, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.03740339353680611, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.34836313128471375, + 0.9311373829841614, + -0.6445428133010864, + 0.1876247376203537, + 0.5610071420669556, + -0.2014002650976181, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.06348947435617447, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 8.889402389526367, + 0.8190888166427612, + 6.3224287033081055, + 0.5763419270515442, + 8.891359329223633, + 0.6356603503227234, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1149676963686943, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 7.469509124755859, + 0.8587527275085449, + 10.9024019241333, + 0.5616274476051331, + 17.77461051940918, + 0.497711181640625, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1467103362083435, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.2224408164978016, + -0.048768813323974314, + -3.1735438541412364, + -1.754286388516423, + -1.0873907352447496, + -1.7334829847335815, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.010585385131834713, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.32128357887268066, + -0.029370736694339428, + -2.3842309326171893, + -1.6665922879934314, + -1.6808630374908446, + -1.864675362110138, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.030337583923339295, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.028758340454100306, + 2.2350878536224386, + -0.252602658843994, + 1.732205913901332, + 0.9988536895751956, + 2.2490956929683685, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4851716857910162, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.1486983525276184, + 2.3825244842529294, + -0.2982371582031256, + 1.6962036300897623, + 0.811102850341797, + 0.850507028102875, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5553146308898924, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.000168978440342471, + -0.00004291267759981565, + -0.008930332958698273, + 0.0005509143229573965, + 0.001174811739474535, + 0.00036979885771870613, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.03738488256931305, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.052020419389009476, + -0.00030458776745945215, + 0.0002838746877387166, + -0.0010981028899550438, + 0.0015408481704071164, + -0.00013526561087928712, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.06346680968999863, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 11.449225425720215, + 0.2850877344608307, + 6.8585004806518555, + 0.2127268761396408, + 11.449126243591309, + 0.19846822321414948, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.114939384162426, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 12.08963680267334, + 0.3889652192592621, + 14.02609634399414, + 0.2564218044281006, + 22.619991302490234, + 0.21812041103839874, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1467045396566391, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -3.307166406249962, + -1.0169535324096692, + -1.7231761718749112, + -0.7101557079315199, + -0.9217864257811925, + -0.6735999629974365, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.010585385131834713, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0927529046773912, + -1.2218059524536145, + -1.4543429687500975, + -0.8870759811401356, + -3.3070429687504657, + -0.7426593418121337, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.030337583923339295, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.0, + 1.06085080718994, + -0.069580078125, + 0.7230888339996326, + -0.094970703125, + 0.7179217052459719, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4851716857910162, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.35748368697166444, + 1.2583869689941416, + 0.199462890625, + 0.7453906723022463, + 0.0, + 0.7603769851684574, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5553146308898924, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats_meta.json new file mode 100644 index 0000000..a931283 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps50/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s14_a14_fps50", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s14_a14_fps50_cam_high_cam_left_wrist_cam_right_wrist__episodes_3397/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 54108, + "num_frames": 1731438, + "estimated_total_batches": null, + "train_episodes": 3227, + "train_bytes": 264209590712, + "elapsed_sec": 452.58451652526855, + "frames_per_sec": 3825.667774260525 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps50/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps50/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s14_a14_fps50/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s26_a26/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s26_a26/norm_stats.json new file mode 100644 index 0000000..507448d --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s26_a26/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.1473880410194397, + 1.0951837301254272, + -0.8093733787536621, + -0.044470593333244324, + 0.6143806576728821, + 0.10511482506990433, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.34241217374801636, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2605332136154175, + 1.1816539764404297, + -0.9464854001998901, + 0.11799541115760803, + 0.8017933964729309, + -0.17529724538326263, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.405638188123703, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 41.68538284301758, + 0.9224587678909302, + 38.59687042236328, + 0.6133480072021484, + 47.269283294677734, + 0.5478372573852539, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21091148257255554, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 32.797828674316406, + 0.9076418876647949, + 48.98924255371094, + 0.5494855046272278, + 36.38861846923828, + 0.5369770526885986, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.19287677109241486, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -5.736323272705079, + -0.33980635690687677, + -5.736323272705079, + -2.075542514848678, + -5.736323272705079, + -1.100138540649425, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.01225560375750065, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7841103076934814, + -0.041734788560859215, + -5.736323272705079, + -1.6427277302742027, + -1.374133825302124, + -2.087989719390862, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.008527963295578964, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -5.736323272705079, + 2.2613047045707617, + -5.736323272705079, + 1.2822194180488964, + 0.9365347900390475, + 1.9173174562931194, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6947139580100774, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.7841103076934814, + 2.5007953918457133, + -5.736323272705079, + 1.6563580117225456, + -1.374133825302124, + 0.8698811097145267, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6936624691188336, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.000662580132484436, + -0.01188171748071909, + 0.004983395803719759, + 0.004785665310919285, + 0.059429604560136795, + -0.003149193711578846, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3419666290283203, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0008587968768551946, + -0.011704837903380394, + -0.00011223426554352045, + -0.004071489907801151, + 0.0016946460818871856, + 0.0025044300127774477, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.4053061008453369, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 58.244407653808594, + 0.4607780873775482, + 54.42818832397461, + 0.4003729224205017, + 79.35120391845703, + 0.3238682746887207, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21048828959465027, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 46.16695022583008, + 0.3498035669326782, + 67.50092315673828, + 0.35201311111450195, + 51.13288497924805, + 0.336516410112381, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1928727924823761, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -66.19360546875396, + -1.297709326171855, + -66.14727343749837, + -0.8074677490234308, + -39.68732343750162, + -0.7606428283691571, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.012083003766834736, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -26.45730312500382, + -1.2876695068359254, + -132.03077109374863, + -0.841793878173803, + -39.69122031250299, + -1.0079220458984537, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.008527963295578964, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.048828125, + 0.931832128906251, + 0.0, + 0.597741333007832, + 0.0, + 0.6446259460449255, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6948865580007434, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 1.0535477783203078, + -12.442476562500815, + 0.4462808105469094, + -0.00390625, + 0.7484962890625297, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6936624691188336, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s26_a26/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s26_a26/norm_stats_meta.json new file mode 100644 index 0000000..a788d2f --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s26_a26/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_23712/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 413112, + "num_frames": 13219572, + "estimated_total_batches": null, + "train_episodes": 18406, + "train_bytes": 1649570846072, + "elapsed_sec": 3489.1643438339233, + "frames_per_sec": 3788.750169753891 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s26_a26/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s26_a26/unified_action_space.json new file mode 100644 index 0000000..ed9f81b --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_agilex_decoupled_magic_s26_a26/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9fbd0a367f6d113a176cae2124ffec508f6202dee702a6b29236e6e8f60d0775" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_airbot_mmk2_s36_a36/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_airbot_mmk2_s36_a36/norm_stats.json new file mode 100644 index 0000000..2950c4d --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_airbot_mmk2_s36_a36/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.656104564666748, + -0.9286631345748901, + 1.1376307010650635, + 0.26833200454711914, + -0.7974550127983093, + 0.666283369064331, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6109161972999573, + 1.1354148387908936, + 0.05313194915652275, + 0.04620625823736191, + 0.2840001881122589, + 0.20867326855659485, + 0.2837749719619751, + 0.229059636592865, + 0.28277507424354553, + 0.29497388005256653, + 0.19066499173641205, + 0.6302139759063721, + -0.5758194327354431, + -0.9821283221244812, + 1.1268115043640137, + -0.312242329120636, + 0.6558502316474915, + -0.5029338598251343, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7588454484939575, + 1.1244360208511353, + 0.027878623455762863, + 0.028719335794448853, + 0.41041722893714905, + 0.3171558082103729, + 0.4310058355331421, + 0.3283737301826477, + 0.4280836880207062, + 0.4432540833950043, + 0.3348432183265686, + 0.7939622402191162, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.37944644689559937, + 0.20388081669807434, + 0.32835978269577026, + 1.0097854137420654, + 0.5454671382904053, + 0.9213322997093201, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5214293003082275, + 1.5734562873840332, + 0.1687859445810318, + 0.26329222321510315, + 0.6345346570014954, + 0.9055659770965576, + 0.566385805606842, + 1.1926363706588745, + 0.7770596742630005, + 1.4154009819030762, + 1.1830897331237793, + 2.1479766368865967, + 0.3583245575428009, + 0.25541460514068604, + 0.28430697321891785, + 0.8124368786811829, + 0.4906386733055115, + 0.7573658227920532, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.3276747465133667, + 2.0278005599975586, + 0.0906292200088501, + 0.18109284341335297, + 0.7365971207618713, + 0.843729555606842, + 0.5977146625518799, + 1.1447561979293823, + 0.7890268564224243, + 1.423203706741333, + 0.937105655670166, + 1.9108370542526245, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.2660007301330565, + -1.4333736974075437, + 0.4356580541580915, + -1.9504818211078643, + -1.6451347438812256, + -1.8191361523151397, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.02764731553643942, + 0.6425251462459565, + -0.045348355709016325, + -0.027506217300891866, + -0.022329308092594147, + -0.09238497734069828, + -0.024358250200748444, + -0.09911597261428828, + -0.039008110761642456, + -0.11104497890472415, + -0.0007199482643045485, + -0.04047631531506777, + -1.4152819886207582, + -1.6223039834365247, + 0.5030766827851535, + -2.9765801676273345, + -1.0918529442310332, + -2.2726008594036102, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.03560483766421676, + 0.533134201271506, + -0.018681111001968342, + -0.06725717177391055, + -0.014882088518142697, + -0.10332602539062496, + -0.01015378902256489, + -0.14988748073577884, + -0.04092251509428024, + -0.09312500059604645, + -0.027990717440843582, + -0.09531154389381413, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.3870359558820726, + -0.4766218247368932, + 2.0458251606374978, + 2.9873292702674874, + 1.2033420748710633, + 2.8095779489994044, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.436717178581655, + 1.5006087846755982, + 0.7540547889098526, + 0.16416254246234896, + 1.1690624284669757, + 1.8746440391540524, + 1.3250284303724764, + 1.9000630604505542, + 1.4752081572890283, + 1.8975300592899322, + 1.5322988895563174, + 1.916251375775039, + 0.09408731651306135, + -0.44272861089557414, + 1.842128035542369, + 1.3823009697437287, + 1.6149869574546818, + 2.057234740734101, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5249140445381404, + 1.432080620987946, + 0.5501983883857726, + 0.1652949625492096, + 1.2420855182886126, + 1.8982259277343752, + 1.4232810721755027, + 1.844093188524246, + 1.5325359046399594, + 1.9072029188483954, + 1.5810911833979189, + 1.8818939134597779, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.008245001547038555, + 0.003524184925481677, + -0.0033301268704235554, + -0.005722424481064081, + -0.028624283149838448, + -0.013749456964433193, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6072289347648621, + 1.1415867805480957, + 0.04519025981426239, + 0.048069972544908524, + 0.2835055887699127, + 0.21826808154582977, + 0.28481268882751465, + 0.23658189177513123, + 0.28419241309165955, + 0.29990312457084656, + 0.1941748708486557, + 0.6240943074226379, + 0.005694512277841568, + -0.0015219070482999086, + 0.0012326255673542619, + 0.0017124107107520103, + 0.013287597335875034, + 0.003072197549045086, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7632090449333191, + 1.1186587810516357, + 0.026140810921788216, + 0.03224867209792137, + 0.4089101254940033, + 0.32769083976745605, + 0.4338189363479614, + 0.3394289016723633, + 0.4323977828025818, + 0.4540572166442871, + 0.3410424292087555, + 0.7965958714485168, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.14493174850940704, + 0.11448817700147629, + 0.1269613653421402, + 0.1739502102136612, + 0.18158121407032013, + 0.1614755392074585, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5181316137313843, + 1.554349660873413, + 0.16171063482761383, + 0.26538777351379395, + 0.6293736100196838, + 0.9130929708480835, + 0.5623818039894104, + 1.1972023248672485, + 0.7720032334327698, + 1.4170503616333008, + 1.183464765548706, + 2.0660579204559326, + 0.15685060620307922, + 0.1503192037343979, + 0.15110182762145996, + 0.2234863042831421, + 0.1935572475194931, + 0.17087143659591675, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.3793450593948364, + 1.940362811088562, + 0.08931182324886322, + 0.1979440450668335, + 0.7187049388885498, + 0.8383364677429199, + 0.5950126051902771, + 1.1504135131835938, + 0.7922107577323914, + 1.421832799911499, + 0.9409822821617126, + 1.8833327293395996, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.463122957611084, + -0.3534732172966003, + -0.47352954545021053, + -0.495609849691391, + -0.6788331735134125, + -0.6095462135314942, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.02764731553643942, + 0.6563652049303055, + -0.045348355709016325, + -0.02539996719360349, + -0.022329308092594147, + -0.09238497734069828, + -0.024358250200748444, + -0.07714697225093836, + -0.039008110761642456, + -0.11104497890472415, + -0.0007199482643045485, + -0.04047631531506777, + -0.5393749005317688, + -0.4192069751739502, + -0.516749444961548, + -0.7370876592636111, + -0.5087261302947998, + -0.5691930844306947, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.03560483766421676, + 0.5849964947166852, + -0.018681111001968342, + -0.06725717177391055, + -0.005501733243465423, + -0.10332602539062496, + -0.01015378902256489, + -0.14988748073577884, + -0.04092251509428024, + -0.07114337510764598, + -0.027990717440843582, + -0.09531154389381413, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4853410655975341, + 0.4104335291147232, + 0.4124767607688904, + 0.5189733442783355, + 0.48261117458343517, + 0.4103264465332028, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.4217746837437153, + 1.5006087846755982, + 0.7503308612175286, + 0.16416254246234896, + 1.2192262910589577, + 1.8746440391540524, + 1.3543629234284162, + 1.9000630604505542, + 1.4936742093384268, + 1.8975300592899322, + 1.5541991586680406, + 1.916251375775039, + 0.47509324531555164, + 0.49790313148498533, + 0.4241397476196289, + 0.7494047117233276, + 0.7297798655986787, + 0.6161350169181823, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5249140445381404, + 1.432080620987946, + 0.5355839768886566, + 0.1652949625492096, + 1.2702265841126443, + 1.8982259277343752, + 1.4551351802021264, + 1.844093188524246, + 1.5616740235239268, + 1.9291845443367959, + 1.6142681298069657, + 1.8818939134597779, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_airbot_mmk2_s36_a36/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_airbot_mmk2_s36_a36/norm_stats_meta.json new file mode 100644 index 0000000..730f37f --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_airbot_mmk2_s36_a36/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_airbot_mmk2_s36_a36", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Airbot_MMK2_s36_a36_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10532/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 81017, + "num_frames": 2592540, + "estimated_total_batches": null, + "train_episodes": 10005, + "train_bytes": 431087330611, + "elapsed_sec": 690.6267569065094, + "frames_per_sec": 3753.8945227269173 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_airbot_mmk2_s36_a36/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_airbot_mmk2_s36_a36/unified_action_space.json new file mode 100644 index 0000000..c4f3388 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_airbot_mmk2_s36_a36/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "d6e787ab780ebbd92810789ae8513778330304683dedcb7f65a2b300e65955ce" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_aloha_s26_a26/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_aloha_s26_a26/norm_stats.json new file mode 100644 index 0000000..de7f907 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_aloha_s26_a26/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.10469576716423035, + 0.662298321723938, + -0.8370406031608582, + -0.10997393727302551, + 0.904748260974884, + 0.07077445834875107, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7056493759155273, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.27609941363334656, + 1.1175321340560913, + -0.9066898822784424, + 0.14160014688968658, + 0.6277921199798584, + -0.06411521136760712, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5476592779159546, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.22630704939365387, + 0.9324061870574951, + 0.5762600898742676, + 0.2787526547908783, + 0.4267621338367462, + 0.27670159935951233, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3804008364677429, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.28160029649734497, + 0.9456371068954468, + 0.5779625177383423, + 0.4162033498287201, + 0.7083861827850342, + 0.6169491410255432, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3376106917858124, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.7981000185012819, + -0.00996200017258525, + -2.4786146493900567, + -1.187614440536499, + -0.8754767679214477, + -0.5012200522422794, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.12335600751638409, + -0.011225800144672393, + -2.364402155338973, + -0.8539300444126129, + -1.2095284074306487, + -1.7727100169658663, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.17913497328758243, + 2.635528483106941, + -0.2574722047377378, + 0.6021799695491787, + 1.2177728406429291, + 1.1242267260074614, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9938087919116021, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9705784217238427, + 2.609351033627987, + -0.2859095926374198, + 1.5181279491424564, + 1.2223220269680022, + 1.4456859633922576, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9828610047101975, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.00021051804651506245, + -0.008932504802942276, + 0.0005696771549992263, + -0.0027484409511089325, + -0.0041058543138206005, + -0.0012933430261909962, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7096610069274902, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0023133684881031513, + -0.007879610173404217, + -0.00265696132555604, + -0.005429517012089491, + -0.00999925285577774, + -0.0018341426039114594, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5347478985786438, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.10313262045383453, + 0.26865464448928833, + 0.1893138587474823, + 0.1421351581811905, + 0.21144385635852814, + 0.11594098061323166, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3865589499473572, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.11798860132694244, + 0.32088905572891235, + 0.22832293808460236, + 0.20490100979804993, + 0.25481829047203064, + 0.2950364947319031, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3538452088832855, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.3765264230728149, + -1.035756023645401, + -0.6352756193161011, + -0.5489855407714845, + -0.7912163681030273, + -0.38275416326522826, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.41121598720550545, + -1.0773520893096924, + -0.7255493785858156, + -0.6334800750732423, + -0.9088775737762451, + -1.1001116996288298, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4181219642162324, + 0.9378215560436245, + 0.7591589970588686, + 0.4850448505401608, + 0.8666135650634765, + 0.399302637004852, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0348727851867676, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4695387895107268, + 1.0134398870468138, + 0.8453243877410888, + 0.7469199135780338, + 0.9517094232559207, + 1.151939422655106, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.986791200876236, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_aloha_s26_a26/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_aloha_s26_a26/norm_stats_meta.json new file mode 100644 index 0000000..b0badf7 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_aloha_s26_a26/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_aloha_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/aloha_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_4879/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 198055, + "num_frames": 6337741, + "estimated_total_batches": null, + "train_episodes": 4634, + "train_bytes": 962548578236, + "elapsed_sec": 1664.1732065677643, + "frames_per_sec": 3808.3421695456377 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_aloha_s26_a26/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_aloha_s26_a26/unified_action_space.json new file mode 100644 index 0000000..0667d62 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_aloha_s26_a26/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "67e063860a9fbe208d546d4b111c935599875ffd6e1810a7b5d300da746fc215" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_alpha_bot_2_s28_a28/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_alpha_bot_2_s28_a28/norm_stats.json new file mode 100644 index 0000000..1fb88cd --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_alpha_bot_2_s28_a28/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.12981835007667542, + 0.3803384602069855, + 0.2765718102455139, + -1.5070769786834717, + -0.2064417600631714, + -0.05623231828212738, + -0.3460264205932617, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 746.6767578125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.19400940835475922, + 0.31934040784835815, + -0.35299500823020935, + -1.4869228601455688, + 0.357273131608963, + 0.013851415365934372, + 0.2367955446243286, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 779.4723510742188, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.2857164740562439, + 0.19170787930488586, + 0.20447394251823425, + 0.2694042921066284, + 0.38139572739601135, + 0.24085566401481628, + 0.34607115387916565, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 397.1971435546875, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2606230676174164, + 0.24536000192165375, + 0.14477461576461792, + 0.2577556073665619, + 0.5735127925872803, + 0.18255352973937988, + 0.37184131145477295, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 382.7496643066406, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.899166699886322, + 0.07630084578692914, + -0.059025124704837784, + -2.0594145153187213, + -1.1295509833812714, + -0.7071796939969063, + -1.1954483671784402, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.40404443359375, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.21597237800359725, + -0.05071561908125878, + -0.7550483275800943, + -2.029019742440432, + -1.0360802779436111, + -0.3993901081085205, + -0.2278318267703056, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.2564, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.37486589574813856, + 0.901134452560544, + 0.8977918334484101, + -0.7051934836871923, + 1.031851346349716, + 0.6692254953861236, + 0.42736211544275293, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1009.909061767578, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9338733216404915, + 0.9485346036761999, + -0.05054059450328352, + -0.7290169551871717, + 1.6272616389274597, + 0.5994619083404542, + 1.411613534462452, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1005.2062000000001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0006919320439919829, + -0.0019002234330400825, + -0.0010903198271989822, + -0.0009687251294963062, + 0.0009565133950673044, + 0.0017697216244414449, + -0.0055458988063037395, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 746.5861206054688, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.003108932636678219, + -0.003951332066208124, + 0.0004939803038723767, + 0.002362956991419196, + -0.002410163637250662, + 0.00205172598361969, + 0.005838938523083925, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 778.9148559570312, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.08611934632062912, + 0.051137592643499374, + 0.06047236919403076, + 0.10187217593193054, + 0.0747617855668068, + 0.06468275189399719, + 0.08414533734321594, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 397.2435607910156, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.07241197675466537, + 0.043015606701374054, + 0.04393547773361206, + 0.09733308106660843, + 0.08626998215913773, + 0.06080825254321098, + 0.06849385052919388, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 383.0844421386719, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.2659748669624329, + -0.16955485401153564, + -0.22237293572425842, + -0.38058049020767215, + -0.25508818566799163, + -0.19396575808525085, + -0.33569938838481905, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.40404443359375, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.26165361976623525, + -0.1465015360713005, + -0.14308811855316161, + -0.3606649603843688, + -0.2566977259159088, + -0.18858413553237918, + -0.19983974138498306, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.2564, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.31394535303115845, + 0.18444163522720336, + 0.19062521643638597, + 0.29662441864013656, + 0.2051439446210861, + 0.24560414199829106, + 0.26784982144832603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1009.909061767578, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.23274346752166752, + 0.15374321049451822, + 0.16777842110395425, + 0.3051075954437257, + 0.3131138361454009, + 0.2351794544696808, + 0.2710840149283409, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1005.2062000000001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_alpha_bot_2_s28_a28/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_alpha_bot_2_s28_a28/norm_stats_meta.json new file mode 100644 index 0000000..65587db --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_alpha_bot_2_s28_a28/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_alpha_bot_2_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/alpha_bot_2_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_857/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 22703, + "num_frames": 726485, + "estimated_total_batches": null, + "train_episodes": 814, + "train_bytes": 109263908150, + "elapsed_sec": 205.29979014396667, + "frames_per_sec": 3538.6543721771545 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_alpha_bot_2_s28_a28/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_alpha_bot_2_s28_a28/unified_action_space.json new file mode 100644 index 0000000..7c12829 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_alpha_bot_2_s28_a28/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "c8188bef9dda322c15e6f6fd6d51c66ced6ac424e8fb05dc7e607aa1709e3e58" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats.json new file mode 100644 index 0000000..9a50eed --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.789222240447998, + -0.9489473104476929, + 1.102475643157959, + 0.06056652218103409, + -0.8004094958305359, + 0.8569042086601257, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 43.4145393371582, + 58.51406478881836, + 6.561944484710693, + 3.8180127143859863, + 19.267641067504883, + 14.541945457458496, + 19.904767990112305, + 16.158863067626953, + 19.30022430419922, + 21.157934188842773, + 12.348743438720703, + 44.948116302490234, + -0.7468658089637756, + -0.9740761518478394, + 1.1814908981323242, + -0.2708401083946228, + 0.7773710489273071, + -0.5048773288726807, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 41.62311935424805, + 59.72103500366211, + 1.6600639820098877, + 2.397747278213501, + 21.124330520629883, + 16.384376525878906, + 23.463788986206055, + 16.421628952026367, + 23.28516960144043, + 26.225006103515625, + 18.233783721923828, + 47.79250717163086, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3196251094341278, + 0.19099053740501404, + 0.267301082611084, + 0.7343452572822571, + 0.5074834823608398, + 0.8002901077270508, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 18.43718147277832, + 11.881536483764648, + 12.745183944702148, + 3.668595314025879, + 17.491971969604492, + 25.543888092041016, + 18.778554916381836, + 28.954769134521484, + 20.36393928527832, + 33.26520919799805, + 20.258453369140625, + 38.15335464477539, + 0.3138468265533447, + 0.20916512608528137, + 0.2719564437866211, + 0.7614434361457825, + 0.5056568384170532, + 0.7291929721832275, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 20.863088607788086, + 12.029555320739746, + 5.3629679679870605, + 3.2656631469726562, + 17.44062042236328, + 25.945985794067383, + 20.877904891967773, + 27.181493759155273, + 22.829547882080078, + 35.53911209106445, + 24.12516212463379, + 39.613216400146484, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + 0.1670591546058655, + -1.460646178598702, + 0.6757955211639405, + -0.8247669435024263, + -1.6326164110422134, + -2.040982316064835, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.1410077957153328, + 35.85638677425385, + -1.2471387302875518, + -1.260823583698273, + 0.6530760291576385, + -1.0140843429565431, + 0.6394474706172943, + -1.961733321762085, + 0.6345568585395811, + -3.7215022659301757, + 0.6377890274167062, + -0.8760666087865829, + -1.524050800561905, + -1.514172021174431, + 0.6718438099384307, + -2.9777743816375732, + -1.145575943374634, + -1.595018073940277, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.0329510523796084, + 32.098736600399015, + -1.2586004912137985, + -1.7484696573257446, + 0.609222595214844, + -0.9381469581604005, + 0.5784229578018187, + -1.1616932260990143, + 0.6429713370800019, + -0.5089542884826661, + 0.42454957976341245, + -3.384034348487854, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.4689757689952851, + -0.5967689686983824, + 1.8580087474823, + 2.982538466739655, + 1.0367245502233509, + 2.3800237551689145, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 78.29060504226685, + 84.12461102142335, + 48.262709696531296, + 9.748627821445465, + 61.9573547662735, + 105.95414351844786, + 69.24682767877579, + 109.27585434875488, + 82.92672660541534, + 109.9159403591156, + 89.5799179440558, + 110.60623623168469, + -0.051988855361938535, + -0.5652352955192328, + 1.8889653580904007, + 0.7004047698974611, + 1.6166751742362973, + 2.2183819183826445, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 87.63163614215851, + 82.51696020936966, + 31.86803058552742, + 9.559157132148743, + 61.57964798583985, + 109.06843588314057, + 77.23728513393402, + 108.36883417010307, + 88.44751836946011, + 110.32461710197926, + 91.96601235146522, + 110.372048163414, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.01735016703605652, + 0.007876871153712273, + -0.008764179423451424, + -0.016196714714169502, + -0.050610072910785675, + -0.01787901297211647, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 42.77833557128906, + 59.01993179321289, + 5.597373008728027, + 3.9695675373077393, + 18.594154357910156, + 14.54702091217041, + 19.29161262512207, + 15.878710746765137, + 18.78414535522461, + 20.612062454223633, + 12.175747871398926, + 43.39402389526367, + 0.0064604626968503, + 0.0005611882661469281, + -0.002839392749592662, + 0.005142479669302702, + 0.02126043289899826, + 0.004430062603205442, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 41.64952087402344, + 59.36911392211914, + 1.4767431020736694, + 2.656665325164795, + 20.36819076538086, + 16.421306610107422, + 22.942644119262695, + 16.397327423095703, + 22.899627685546875, + 26.112388610839844, + 18.08662986755371, + 46.756378173828125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.17858079075813293, + 0.14265654981136322, + 0.1634504795074463, + 0.16256660223007202, + 0.22381845116615295, + 0.16158242523670197, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 18.521772384643555, + 11.979036331176758, + 12.285548210144043, + 3.6960418224334717, + 17.73102569580078, + 25.79263687133789, + 19.03911781311035, + 28.994144439697266, + 20.55314064025879, + 33.25821304321289, + 20.360509872436523, + 38.552024841308594, + 0.1852763444185257, + 0.14883209764957428, + 0.1630040854215622, + 0.19241678714752197, + 0.22506338357925415, + 0.11058518290519714, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 20.7370662689209, + 11.900763511657715, + 5.080607891082764, + 3.428765296936035, + 17.76552391052246, + 26.203529357910156, + 21.202436447143555, + 27.423065185546875, + 23.11931610107422, + 35.659122467041016, + 24.31511878967285, + 40.17205047607422, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.530792695760727, + -0.4047769084453583, + -0.5680815444231033, + -0.5259286925792694, + -0.7873582234382629, + -0.6316696793556211, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.1191337959289553, + 36.04583902816773, + -1.2471387302875518, + -1.2319020826339724, + 0.612784028673172, + -1.1057648468017578, + 0.6174649713516236, + -1.961733321762085, + 0.6345568585395811, + -3.7215022659301757, + 0.6377890274167062, + -0.8989019842147827, + -0.6441029361724854, + -0.3842984503507614, + -0.5623678423643113, + -0.5740927570819856, + -0.5532707916736603, + -0.31753806543350205, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.0329510523796084, + 32.50419783921242, + -1.2795799915790558, + -1.7369956575393677, + 0.609222595214844, + -1.0078890859127045, + 0.5372969587802885, + -1.207598727941513, + 0.6429713370800019, + -0.5318018604040147, + 0.44674683067798604, + -3.384034348487854, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.5975871762037279, + 0.46891435046195973, + 0.4889618165016174, + 0.5089293518066405, + 0.5531848000526427, + 0.45593350839614866, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 78.44372304077149, + 84.31406327533722, + 48.388156947612764, + 9.75184132156372, + 62.259544769906995, + 106.59590704536437, + 70.23604014573097, + 109.41469885177612, + 83.82831159305573, + 109.93952148437499, + 90.24482296959758, + 110.60623623168469, + 0.5124633223056794, + 0.4904771469831468, + 0.44247493512630465, + 0.6567382140159608, + 0.8311843288183209, + 0.3665271113872528, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 87.65422906808853, + 82.55221770839691, + 29.686162547540665, + 9.607921631240846, + 61.768294104003914, + 109.09168325905799, + 77.54573012659549, + 108.78198368668556, + 88.99643401732445, + 110.3474646739006, + 92.43215462067127, + 110.39570791435241, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats_meta.json new file mode 100644 index 0000000..f5f3479 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_discover_aitbot_mmk2_s36_a36", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/discover_robotics_aitbot_mmk2_s36_a36_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5747/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 36260, + "num_frames": 1160293, + "estimated_total_batches": null, + "train_episodes": 5460, + "train_bytes": 194302774076, + "elapsed_sec": 348.6094217300415, + "frames_per_sec": 3328.34664720713 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_discover_aitbot_mmk2_s36_a36/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_discover_aitbot_mmk2_s36_a36/unified_action_space.json new file mode 100644 index 0000000..c4f3388 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_discover_aitbot_mmk2_s36_a36/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "d6e787ab780ebbd92810789ae8513778330304683dedcb7f65a2b300e65955ce" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s14_a14/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s14_a14/norm_stats.json new file mode 100644 index 0000000..7db58db --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s14_a14/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.1465437263250351, + 0.7869630455970764, + -0.5143190622329712, + -0.10306041687726974, + -0.017123211175203323, + -0.07089352607727051, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.24394427239894867, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.11253274977207184, + 0.9243168234825134, + -0.6134981513023376, + -0.08301904797554016, + 0.0349244549870491, + 0.0044456711038947105, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.28358498215675354, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3259853720664978, + 0.9173845052719116, + 0.6484797596931458, + 0.4867860972881317, + 0.29930099844932556, + 0.3141402006149292, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4647968113422394, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3464672863483429, + 0.9285209774971008, + 0.66539466381073, + 0.4866812229156494, + 0.318434476852417, + 0.42792943120002747, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5048031210899353, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0725928758382797, + -0.005822717398405078, + -1.9497726845741272, + -1.5304360511302948, + -1.0978304373025893, + -1.0819920077323915, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.02160907292770571, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9586778641700744, + -0.006923790359497084, + -1.9687591208517552, + -1.5304557082414627, + -0.838190191078186, + -1.5145600032806397, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.006071952342987061, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6792541539669039, + 2.5427422587573525, + 0.026177544593811053, + 1.1008840367794037, + 0.7871663888692857, + 0.968535971164703, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7061504119382762, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9739351847410203, + 2.5719604786753654, + 0.030489080250263534, + 1.004168446135521, + 1.0753058356285097, + 1.1564639692306518, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7056269750595094, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.00018698995700106025, + -0.0027333006728440523, + 0.0018787827575579286, + 0.00032728881342336535, + 0.0004975892370566726, + 0.0002555204264353961, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.24358518421649933, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.00009762104309629649, + -0.0025566816329956055, + 0.002047769259661436, + -0.0003735595673788339, + -0.00020275445422157645, + -0.0001948690478457138, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.28345298767089844, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.16635392606258392, + 0.3440786600112915, + 0.258118212223053, + 0.2430180013179779, + 0.15079589188098907, + 0.15765906870365143, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4644833207130432, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.18295352160930634, + 0.4124230444431305, + 0.29375508427619934, + 0.27331775426864624, + 0.16929855942726135, + 0.18614333868026733, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5047915577888489, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6040997364997862, + -1.3266730127334594, + -0.92285426902771, + -0.8444594205856322, + -0.5463665382385252, + -0.5456839828491211, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.02160907292770571, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.6485135001182556, + -1.5401852423667908, + -0.9946665182113648, + -0.9465401615142826, + -0.5940469908714294, + -0.6444087917327881, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.006071952342987061, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6266800019741057, + 1.3451034955978391, + 0.9451263523101807, + 0.9366976721286777, + 0.516585234260559, + 0.55905809340477, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7061504119382762, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.642640541267395, + 1.5440051584720607, + 1.0398419427871701, + 1.007892139816284, + 0.5927413930892942, + 0.6252514398574824, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7056269750595094, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s14_a14/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s14_a14/norm_stats_meta.json new file mode 100644 index 0000000..31311e3 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s14_a14/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/galaxea_r1_lite_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5167/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 245253, + "num_frames": 7848088, + "estimated_total_batches": null, + "train_episodes": 4886, + "train_bytes": 3346209600799, + "elapsed_sec": 3871.8957114219666, + "frames_per_sec": 2026.9368249894735 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s14_a14/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s14_a14/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s14_a14/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s16_a18/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s16_a18/norm_stats.json new file mode 100644 index 0000000..4bc585b --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s16_a18/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.16373606026172638, + 0.9926406741142273, + -0.7024933695793152, + 0.13910958170890808, + -0.07944614440202713, + 0.0691065564751625, + -2.2582452297210693, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 80.80658721923828, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0637373998761177, + 0.40384504199028015, + -0.29242828488349915, + 0.10572875291109085, + 0.023374492302536964, + 0.010431193746626377, + -2.5006213188171387, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 89.0853271484375, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.29857853055000305, + 1.0033091306686401, + 0.7319855690002441, + 0.3954618573188782, + 0.24940426647663116, + 0.4646410644054413, + 0.8846869468688965, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 30.198925018310547, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2049432396888733, + 0.7930189371109009, + 0.5714349150657654, + 0.26710253953933716, + 0.12996964156627655, + 0.27238354086875916, + 0.7039861083030701, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 24.03177833557129, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.017169194972515, + -0.004680851008743048, + -1.986572128868103, + -1.1477862263917924, + -0.8641180778265, + -1.1129386113166808, + -2.76129431829527, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 5.472231944561004, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.25645644221305847, + -0.0042553190141916275, + -1.9533517208099365, + -0.4285504687309265, + -0.31070470275878903, + -0.9370759090423584, + -2.835106372833252, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 4.873087328195572, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.3155106456279755, + 2.578922155332752, + -0.00040344681739812316, + 1.0628037837743758, + 0.6523159398913383, + 1.4510601159095766, + -0.05701846262365562, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 97.88268118405342, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8619644447565078, + 2.462775818249583, + -0.00040225529670712135, + 1.0223374055862426, + 0.5530510427355766, + 0.9148953475952148, + -0.038330637861788475, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 100.52368333494664, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0035309582017362118, + -0.03238903358578682, + 0.02132692001760006, + -0.001851493027061224, + 0.001852226909250021, + 0.0021616152953356504, + -0.0008467381703667343, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 77.51899719238281, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.001286643324419856, + -0.004494755994528532, + 0.004611603915691376, + 0.00022976390027906746, + -0.00047635435475967824, + 0.00019026569498237222, + -0.0002900872495956719, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 89.36774444580078, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.23230241239070892, + 0.6766408681869507, + 0.4803682267665863, + 0.2520758807659149, + 0.18142449855804443, + 0.29774317145347595, + 0.7227979898452759, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 41.74575424194336, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.14992249011993408, + 0.4257671535015106, + 0.27494487166404724, + 0.15455301105976105, + 0.09703756123781204, + 0.15753188729286194, + 0.4973582923412323, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 30.825206756591797, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.7381767271518707, + -2.1335647198200225, + -1.4483220024108887, + -0.8748203573703766, + -0.6415985270500184, + -0.9677291069030762, + -2.308521799659729, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.6180614602565765, + -1.739781426525116, + -0.9139452539682389, + -0.6549412292242051, + -0.3491792736053465, + -0.5659440845727921, + -2.1506297883987426, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.8003067836284639, + 1.9999838626384738, + 1.666527211999893, + 0.7973734945774078, + 0.5891278557777402, + 1.068362585258484, + 2.4429450938224795, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 99.98, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6246776551246644, + 1.7485109654426578, + 1.1746477506160735, + 0.5350400135040285, + 0.35704151229858416, + 0.5749539126873016, + 2.408058779096603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 99.98, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s16_a18/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s16_a18/norm_stats_meta.json new file mode 100644 index 0000000..bd80a20 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s16_a18/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_s16_a18", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/galaxea_r1_lite_s16_a18_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_970/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 9866, + "num_frames": 315700, + "estimated_total_batches": null, + "train_episodes": 922, + "train_bytes": 100400838947, + "elapsed_sec": 127.63867783546448, + "frames_per_sec": 2473.388202962743 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s16_a18/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s16_a18/unified_action_space.json new file mode 100644 index 0000000..3c4ce7f --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_s16_a18/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "a9d0610a5115c532397c2f9a02c21890d70ef58ef0ad507847fa2ed1a15c88b5" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats.json new file mode 100644 index 0000000..cca4530 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.2506558299064636, + 0.9469642043113708, + -0.6205059885978699, + -0.09196162223815918, + 0.012572923675179482, + 0.05519729480147362, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.500835657119751, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.25365200638771057, + 1.2202755212783813, + -0.7921632528305054, + -0.1521870344877243, + -0.024248279631137848, + -0.07879133522510529, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.3990261554718018, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3049851357936859, + 0.9031018614768982, + 0.610549807548523, + 0.4732515215873718, + 0.2458823025226593, + 0.3754640817642212, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4639884829521179, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3309071660041809, + 0.8979148268699646, + 0.645177960395813, + 0.5483866333961487, + 0.3284341096878052, + 0.47655388712882996, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.504631757736206, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.9940981630802155, + -0.003829787252470851, + -1.975389991865214, + -1.5265620398044586, + -0.6589046301603317, + -0.8917075432300567, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.10655710805431008, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.3503914684653282, + -0.0019148936262354255, + -2.000638246536255, + -1.5020018501758576, + -0.8032287443637849, + -1.7044098446369171, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.11476012961864471, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.20174685723781582, + 2.4619219403604045, + -0.000014638316631288006, + 0.8448675643444061, + 0.7823373777389526, + 1.5872856732606886, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7645925080850722, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.005140295803547, + 2.505199112719623, + -0.0003078718297184757, + 0.8889586254119872, + 0.8282026379823684, + 0.8900946237802505, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.751934207174182, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.002070083748549223, + -0.009222179651260376, + 0.006848389748483896, + 0.00026182294823229313, + 0.0015868792543187737, + 0.0003076336288359016, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.5008774995803833, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.002750544575974345, + -0.015298927202820778, + 0.009401840157806873, + 0.0033589310478419065, + -0.00035418258630670607, + -0.001279053627513349, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.3990696668624878, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1416667252779007, + 0.3391159176826477, + 0.22186781466007233, + 0.23835258185863495, + 0.14790737628936768, + 0.2196711003780365, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4638553559780121, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.19731104373931885, + 0.3913874328136444, + 0.2852989435195923, + 0.30727827548980713, + 0.22789299488067627, + 0.291481077671051, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5044052600860596, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4676544653892517, + -1.3689668506622314, + -0.673422367811203, + -0.8352519777297973, + -0.514826227092743, + -0.9340109244346619, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.10655710805431008, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7339063465595246, + -1.6019817955970765, + -0.8888794917106628, + -1.093386752319336, + -0.7658062780380249, + -0.9442028461456298, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.11476012961864471, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.5726149436473846, + 1.2395132839202878, + 0.8514690177440647, + 0.8724879892349242, + 0.4888856029987334, + 0.7179337068557738, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7645925080850722, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6569907176494598, + 1.3284557864189144, + 0.9647411026954651, + 1.0813313362121582, + 0.9232138740777969, + 1.3054971899032592, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.751934207174182, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats_meta.json new file mode 100644 index 0000000..a232606 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_upper_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Galaxea_R1_Lite_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_3650/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 27171, + "num_frames": 869469, + "estimated_total_batches": null, + "train_episodes": 1337, + "train_bytes": 205435325084, + "elapsed_sec": 271.46593260765076, + "frames_per_sec": 3202.8659789758667 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_upper_s14_a14/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_upper_s14_a14/unified_action_space.json new file mode 100644 index 0000000..eaaba89 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_galaxea_r1_lite_upper_s14_a14/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "1fa4ae18cdd16834f62a84b6e7c7d297585f44534b6b912ad9d2e88896a34f45" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_leju_robot_s118_a54/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_leju_robot_s118_a54/norm_stats.json new file mode 100644 index 0000000..c5a9296 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_leju_robot_s118_a54/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.14392921328544617, + -0.0496545284986496, + 0.03907515108585358, + -0.6383686661720276, + -0.33223956823349, + 0.1406169980764389, + -0.2197691947221756, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2658024728298187, + 1.0174024105072021, + 0.26580309867858887, + 0.26580342650413513, + 0.26580342650413513, + 0.26580342650413513, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.26310673356056213, + -0.026430761441588402, + 0.22182564437389374, + -1.0583513975143433, + 0.5696671009063721, + -0.14421126246452332, + -0.14368979632854462, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6819911003112793, + 1.1796563863754272, + 0.681991696357727, + 0.6819922924041748, + 0.6819922924041748, + 0.6819922924041748, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.005736132152378559, + -0.004845454357564449, + -0.5839594006538391, + 1.034613847732544, + -0.47432053089141846, + 0.0044976514764130116, + -0.011759890243411064, + 0.0016561566153541207, + -0.584376335144043, + 1.0361307859420776, + -0.48027747869491577, + 0.014017106033861637, + -0.006366158835589886, + 0.00004895150777883828, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.24559161067008972, + 0.1689794510602951, + 0.7688204646110535, + 0.5849611759185791, + 0.7876368165016174, + 0.2824043333530426, + 0.2779797911643982, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6225577592849731, + 0.8577785491943359, + 0.62255859375, + 0.6225588917732239, + 0.6225588917732239, + 0.6225588917732239, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.37637755274772644, + 0.21900226175785065, + 0.6015813946723938, + 0.6487521529197693, + 0.6114912033081055, + 0.3323651850223541, + 0.33078810572624207, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8369026184082031, + 0.813471257686615, + 0.8369022607803345, + 0.8369028568267822, + 0.8369029760360718, + 0.8369028568267822, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.011689109727740288, + 0.03091302700340748, + 0.05732341855764389, + 0.07677125930786133, + 0.0554114505648613, + 0.02481386624276638, + 0.01102852076292038, + 0.030867384746670723, + 0.057295337319374084, + 0.08059525489807129, + 0.055565595626831055, + 0.024815795943140984, + 0.0376923643052578, + 0.0022193610202521086, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.9992702881813049, + -0.34700471043586734, + -1.499725185585022, + -2.03459240322113, + -1.5663648304462434, + -0.6925698574066161, + -0.703081022977829, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.2768910852432251, + -0.6715401140213013, + -1.3412932807922364, + -2.273264695763588, + -1.2518772483825684, + -0.7010021484375, + -0.700609602355957, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.02395869474411011, + -0.11906609460711481, + -0.7370869652032852, + 0.9267490817084909, + -0.6330387302875519, + -0.049691598564386374, + -0.042447312104701984, + -0.10632696142792702, + -0.7380362022399902, + 0.9342303326725959, + -0.641259054350853, + -0.04123028814792634, + -0.11191192030906683, + -0.005750369654968376, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.3458903924465182, + 0.5226744106411935, + 1.44677988114357, + -0.06136881568431818, + 1.476704307556152, + 0.6961594585418704, + 0.5051051949501038, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.45043067569732687, + 0.3487966469764707, + 1.3253098982810974, + -0.12402725848555551, + 1.5689554569244386, + 0.7199650357246397, + 0.626018825149536, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.034869841480255126, + 0.09307707622647288, + -0.45076588833332076, + 1.2968151184253396, + -0.3549289156675338, + 0.06532029041647913, + 0.015565912073850607, + 0.10807942071557042, + -0.4488659531593323, + 1.2981121613249182, + -0.369503323701024, + 0.07134055135250089, + 0.09063195526599888, + 0.008523450748994951, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.025149166584014893, + -0.0007167551084421575, + 0.014958391897380352, + 0.029812512919306755, + -0.049611445516347885, + 0.018364058807492256, + -0.016904247924685478, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.26187270879745483, + 1.0055816173553467, + 0.2618729770183563, + 0.2618747055530548, + 0.2618747055530548, + 0.2618747055530548, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.023009758442640305, + 0.008779775351285934, + -0.01961400918662548, + 0.035789959132671356, + 0.03110627271234989, + -0.02077949233353138, + -0.022412974387407303, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6611509919166565, + 1.1648931503295898, + 0.661152720451355, + 0.661155104637146, + 0.661155104637146, + 0.661155104637146, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.006273355800658464, + -0.003994456026703119, + -0.5832089185714722, + 1.0329070091247559, + -0.4743139445781708, + 0.0038752786349505186, + -0.011729203164577484, + 0.0015189028345048428, + -0.5832836031913757, + 1.034032940864563, + -0.4801284670829773, + 0.013799047097563744, + -0.006342591252177954, + 0.000048941914428723976, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.13706213235855103, + 0.0861985832452774, + 0.2623814046382904, + 0.21836024522781372, + 0.38968393206596375, + 0.18734091520309448, + 0.1748584508895874, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6187314391136169, + 0.859600305557251, + 0.6187315583229065, + 0.6187350153923035, + 0.6187350153923035, + 0.6187350153923035, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.18466579914093018, + 0.11489593982696533, + 0.2676655650138855, + 0.30678436160087585, + 0.3512946665287018, + 0.2122993916273117, + 0.19419464468955994, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.833325207233429, + 0.8184693455696106, + 0.8333248496055603, + 0.8333266377449036, + 0.8333266377449036, + 0.8333266377449036, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.011661932803690434, + 0.03008849360048771, + 0.0570581778883934, + 0.07920322567224503, + 0.05598650872707367, + 0.02390815131366253, + 0.011079773306846619, + 0.030265456065535545, + 0.05669058859348297, + 0.08025062084197998, + 0.056270044296979904, + 0.02400575391948223, + 0.037728164345026016, + 0.0022195226047188044, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.49717133016586335, + -0.29087378101348893, + -0.9207378339767456, + -0.8032954450130463, + -1.5487773138046266, + -0.5106261265754701, + -0.7538997879028321, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.6092341652870177, + -0.3566183257102966, + -1.1042374740600585, + -1.0408703578948975, + -0.9910236114501954, + -0.8985654019355773, + -0.791315365076065, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.023514607763290396, + -0.11017253985404968, + -0.7403963661193848, + 0.9252302796959877, + -0.6394320577383041, + -0.04950896456241605, + -0.04293521931767463, + -0.102585978269577, + -0.7395257719516755, + 0.9335625804424286, + -0.6478451603651046, + -0.039510283565521276, + -0.11191192030906683, + -0.005750369654968376, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4264512014865871, + 0.29491566400527924, + 1.1406259435176853, + 0.8118304628849029, + 1.1148114137649534, + 0.7137140592575073, + 0.44641688156127923, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6106945888519291, + 0.36770981721878027, + 0.7981465461730957, + 1.0722906362533569, + 1.444993089199066, + 0.5342899666786192, + 0.5092106031179429, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.035736719590425514, + 0.09176966729164115, + -0.45266616611480714, + 1.2868420163989067, + -0.35557454228401186, + 0.06286471080780032, + 0.01590245109796523, + 0.10124850861430168, + -0.4510058415412903, + 1.2875499872922898, + -0.3704874509572982, + 0.06893986749649039, + 0.0910177531242371, + 0.008582760252058508, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_leju_robot_s118_a54/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_leju_robot_s118_a54/norm_stats_meta.json new file mode 100644 index 0000000..8250431 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_leju_robot_s118_a54/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_leju_robot_s118_a54", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/leju_robot_s118_a54_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_17897/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 458510, + "num_frames": 14672292, + "estimated_total_batches": null, + "train_episodes": 17002, + "train_bytes": 4898931416952, + "elapsed_sec": 5203.681373596191, + "frames_per_sec": 2819.598462436255 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_leju_robot_s118_a54/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_leju_robot_s118_a54/unified_action_space.json new file mode 100644 index 0000000..d356add --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_leju_robot_s118_a54/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "d97c871ea622a1d73832b3cfbbf5591efa01e5743172a70cab01099fbb596f69" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_leju_robot_s54_a54/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_leju_robot_s54_a54/norm_stats.json new file mode 100644 index 0000000..9454472 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_leju_robot_s54_a54/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.12607264518737793, + 0.00008398429054068401, + -0.4544186294078827, + -0.20619818568229675, + 0.29890182614326477, + 0.2209627479314804, + -0.017372645437717438, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.001351677579805255, + 0.5195144414901733, + 0.001351677579805255, + 0.001351677579805255, + 0.001351677579805255, + 0.001351677579805255, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.5108049511909485, + -0.08366616070270538, + 0.6188738346099854, + -1.1367301940917969, + 0.9034554362297058, + -0.2741541564464569, + 0.19831663370132446, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.031201720237732, + 1.7022472620010376, + 1.031201720237732, + 1.031201720237732, + 1.031201720237732, + 1.031201720237732, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.009635113179683685, + -0.0028679377865046263, + -0.5325427055358887, + 0.9934707880020142, + -0.5009011626243591, + -0.004597402177751064, + -0.01032357569783926, + -0.0036452405620366335, + -0.5363783836364746, + 0.9893509745597839, + -0.49731943011283875, + 0.014525534585118294, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.052721500396728516, + 0.12329746037721634, + 0.9935592412948608, + 0.08448720723390579, + 1.079892873764038, + 0.2286582589149475, + 0.15934748947620392, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.04720721393823624, + 0.7929924130439758, + 0.04720721393823624, + 0.04720721393823624, + 0.04720721393823624, + 0.04720721393823624, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2641383111476898, + 0.1964256912469864, + 0.29711970686912537, + 0.3846171796321869, + 0.3384343981742859, + 0.21793775260448456, + 0.27180108428001404, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6186614036560059, + 0.2665689289569855, + 0.6186614036560059, + 0.6186614036560059, + 0.6186614036560059, + 0.6186614036560059, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.005319930147379637, + 0.008804247714579105, + 0.026858242228627205, + 0.026859907433390617, + 0.01961347460746765, + 0.008071155287325382, + 0.006057468242943287, + 0.009226891212165356, + 0.019773883745074272, + 0.01892995275557041, + 0.018627624958753586, + 0.011728359386324883, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.2895899209499359, + -0.2557414261460304, + -1.5707963705062866, + -0.44021003832817074, + -1.5707963705062866, + -0.3109862658381462, + -0.3420334379673004, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.1022463934540747, + -0.534395228278637, + -0.6099578330993651, + -1.928462313339114, + -0.31661461296081544, + -0.6981316804885864, + -0.48562039694786074, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0037947557039558887, + -0.023079702201485634, + -0.5913913312196731, + 0.9475534757256507, + -0.5512317831277848, + -0.020031942911073564, + -0.025517087894678117, + -0.02475028370320797, + -0.5832356173038483, + 0.9467111015081405, + -0.5315918558120728, + -0.008798553790897131, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.049132818818092394, + 0.23467275539636612, + 1.4445043423175812, + -0.06639479804039006, + 1.5632565479278564, + 0.6979118290841579, + 0.45560135209560393, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 1.7449801949739454, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.05763647654056547, + 0.3462985385417938, + 1.09225891494751, + -0.3024392062425614, + 1.4563934411764143, + 0.24852478170394898, + 0.6978524278163911, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.023831854006648064, + 0.018483441022038465, + -0.475257759898901, + 1.0377141551017761, + -0.4545027549982071, + 0.018488670980185272, + 0.0033708639562129994, + 0.015092507733032112, + -0.4920614863157272, + 1.031601612663269, + -0.453053707498312, + 0.04167234658449888, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.000044160395191283897, + -0.0004345428023952991, + 0.00018526075291447341, + 0.0004296721890568733, + 0.0005998000269755721, + 0.00017635914264246821, + -0.001342334202490747, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0027007008902728558, + 0.5137023329734802, + 0.0027007008902728558, + 0.0027007008902728558, + 0.0027007008902728558, + 0.0027007008902728558, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.003517469158396125, + 0.0013488056138157845, + -0.03338310495018959, + -0.0008356410544365644, + -0.06255348771810532, + -0.02151239477097988, + -0.03775149583816528, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9106055498123169, + 1.6855394840240479, + 0.9106055498123169, + 0.9106055498123169, + 0.9106055498123169, + 0.9106055498123169, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.00968371331691742, + -0.0032853996381163597, + -0.5326474905014038, + 0.9934975504875183, + -0.5008286237716675, + -0.004591429140418768, + -0.010270550847053528, + -0.0040542385540902615, + -0.5363346338272095, + 0.9892792105674744, + -0.49734926223754883, + 0.01452939584851265, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.01366458274424076, + 0.011578992940485477, + 0.02847292833030224, + 0.008184446953237057, + 0.02868589758872986, + 0.02419445477426052, + 0.020024960860610008, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.06765764206647873, + 0.7898082137107849, + 0.06765764206647873, + 0.06765764206647873, + 0.06765764206647873, + 0.06765764206647873, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1943008303642273, + 0.1138172596693039, + 0.16575030982494354, + 0.32405945658683777, + 0.24188394844532013, + 0.14207221567630768, + 0.1356537789106369, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6900458931922913, + 0.3119781017303467, + 0.6900458931922913, + 0.6900458931922913, + 0.6900458931922913, + 0.6900458931922913, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.005321471020579338, + 0.008934310637414455, + 0.026879318058490753, + 0.026879871264100075, + 0.019663553684949875, + 0.008062909357249737, + 0.006070638541132212, + 0.009430455975234509, + 0.01970670185983181, + 0.018973983824253082, + 0.018652407452464104, + 0.011722862720489502, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.045795693865418444, + -0.03490671157836914, + -0.08407489075660707, + -0.014965300846099844, + -0.0787550156712532, + -0.07334953966140745, + -0.06483746516704561, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5524677794218064, + -0.3814485204219818, + -0.7671195118427279, + -1.0123560002803802, + -1.083412933397293, + -0.5203610343933105, + -0.5161401920318603, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.003876279680989683, + -0.02480562933534384, + -0.5915251564919949, + 0.9474930867910385, + -0.5510238276004791, + -0.020000744584202767, + -0.025240602546930314, + -0.027418407713994383, + -0.5830148566961288, + 0.9471505891680717, + -0.531629569208622, + -0.008798553790897131, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.04847865233421325, + 0.029357151687145228, + 0.08701096346378329, + 0.020059467208385473, + 0.08130935577154164, + 0.06256101837754252, + 0.05499121507108207, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 1.7449801949739454, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7217966253280639, + 0.3419604907035827, + 0.28069199728965755, + 1.0181266004562377, + 0.43407146964073196, + 0.3849238431930544, + 0.33047570610046373, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.023847550930455326, + 0.01867716753706336, + -0.4757930609881878, + 1.0378349329710006, + -0.45402742807865143, + 0.01857039732933044, + 0.003428067821264265, + 0.015092507733032112, + -0.4920860152721405, + 1.031601612663269, + -0.45256343334317206, + 0.04163807480968535, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_leju_robot_s54_a54/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_leju_robot_s54_a54/norm_stats_meta.json new file mode 100644 index 0000000..29b3d90 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_leju_robot_s54_a54/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_leju_robot_s54_a54", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/leju_robot_s54_a54_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_394/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 2062, + "num_frames": 65982, + "estimated_total_batches": null, + "train_episodes": 374, + "train_bytes": 22504353358, + "elapsed_sec": 31.398486614227295, + "frames_per_sec": 2101.4388626648715 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_leju_robot_s54_a54/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_leju_robot_s54_a54/unified_action_space.json new file mode 100644 index 0000000..d356add --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_leju_robot_s54_a54/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "d97c871ea622a1d73832b3cfbbf5591efa01e5743172a70cab01099fbb596f69" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aida_l_s28_a28/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aida_l_s28_a28/norm_stats.json new file mode 100644 index 0000000..f6e2759 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aida_l_s28_a28/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.7575891017913818, + -2.018211841583252, + 1.2673600912094116, + 1.1146199703216553, + 0.6891690492630005, + -0.3179693818092346, + -0.9597281217575073, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 555.3607177734375, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.8516546487808228, + 2.0185489654541016, + -1.024009346961975, + -0.8024208545684814, + -0.6040467619895935, + 0.35237857699394226, + 0.4313460886478424, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 634.1749267578125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.227471724152565, + 0.06362287700176239, + 0.25554585456848145, + 0.4349750280380249, + 1.4009367227554321, + 1.5048906803131104, + 1.4070923328399658, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 329.2973937988281, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2158181071281433, + 0.06811479479074478, + 0.2395617961883545, + 0.3499128818511963, + 1.5231932401657104, + 1.4194414615631104, + 1.436482548713684, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 325.5093994140625, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.2411617311716079, + -2.0655426728248596, + 0.7684333333969116, + 0.43966181900501256, + -0.9741751252412796, + -1.918311150074005, + -3.0002384185791016, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 44.9538, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.4035066569000483, + 1.6972570048332214, + -1.6375796434402465, + -1.7001429117143154, + -2.8975123698711394, + -1.826313526535034, + -1.312467015504837, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 26.3704, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.1553316257953643, + -1.7997828578948973, + 1.9979852621555327, + 1.867020208358765, + 2.8710006383657456, + 1.9273102951049803, + 0.8647150281906129, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 920.7366, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.3617565359920263, + 2.079939349913597, + -0.5856861970901488, + -0.16072266962528237, + 1.2208031419515608, + 1.863077091884613, + 2.6855830742359164, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 881.62, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.004745005629956722, + 0.001093511818908155, + -0.002022324362769723, + -0.003611444029957056, + -0.011031363159418106, + -0.0013529028510674834, + 0.010191795416176319, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 545.743896484375, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.002088882029056549, + -0.0009160805493593216, + -0.0011564826127141714, + -0.006964823696762323, + 0.008905000053346157, + -0.002275642240419984, + -0.00712719326838851, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 634.5043334960938, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.05028748884797096, + 0.015297401696443558, + 0.071743443608284, + 0.09484060853719711, + 0.09587708115577698, + 0.099430613219738, + 0.055593136698007584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 331.8141784667969, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0730854719877243, + 0.03070250153541565, + 0.06939690560102463, + 0.1734410673379898, + 0.13651607930660248, + 0.14600589871406555, + 0.10842622071504593, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 325.7297058105469, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.20747764117717743, + -0.04162785339355471, + -0.20748130631446837, + -0.3386043548583984, + -0.4205680692672731, + -0.3368758692741394, + -0.11896564942598342, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 44.9538, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.27733808026313783, + -0.11711480379104616, + -0.253275782763958, + -0.695207809829712, + -0.4655322723388673, + -0.4588191899299622, + -0.3640655764102936, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 26.3704, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.12971830923557282, + 0.06903154182434079, + 0.28166046774387365, + 0.34935000658035276, + 0.20638658781051622, + 0.3108922860622405, + 0.23591858417987832, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 922.6905999999999, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.24794143097400667, + 0.09158638322353363, + 0.2413436704993247, + 0.45366472196578966, + 0.5544114936828612, + 0.48090295810699457, + 0.34896428358554843, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 881.7984, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aida_l_s28_a28/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aida_l_s28_a28/norm_stats_meta.json new file mode 100644 index 0000000..0c0cfa3 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aida_l_s28_a28/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_realman_rmc_aida_l_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Realman_RMC-AIDA-L_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_693/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 9936, + "num_frames": 317940, + "estimated_total_batches": null, + "train_episodes": 658, + "train_bytes": 36471840854, + "elapsed_sec": 89.87298893928528, + "frames_per_sec": 3537.6591315416026 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aida_l_s28_a28/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aida_l_s28_a28/unified_action_space.json new file mode 100644 index 0000000..814b04c --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aida_l_s28_a28/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ef55a4aafbbe2ee823c0cee63ded3dbf686094cc4ac9049016b9941db4f30422" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aidal_s28_a28/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aidal_s28_a28/norm_stats.json new file mode 100644 index 0000000..d51c279 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aidal_s28_a28/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.47839146852493286, + -2.059580087661743, + 0.6078921556472778, + 0.443592369556427, + 1.4694907665252686, + 1.1243274211883545, + -1.0638837814331055, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 533.576416015625, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5341330766677856, + 2.0288519859313965, + -0.7328935861587524, + -0.5111697316169739, + -1.5132325887680054, + -1.0845743417739868, + 1.057655930519104, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 554.112548828125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.21434840559959412, + 0.07314120978116989, + 1.1213843822479248, + 0.6602405905723572, + 1.2446599006652832, + 0.9368466138839722, + 1.2627320289611816, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 343.1611633300781, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.239162877202034, + 0.08330599218606949, + 0.8705637454986572, + 0.5838403701782227, + 1.1899601221084595, + 0.9443362951278687, + 1.3015942573547363, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 314.4317932128906, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0482353521347045, + -2.1750113368034363, + -2.646780677318573, + -1.6032505451679229, + -2.4177295753479005, + -1.6492822704315186, + -2.8623494152069093, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.6079999999999757, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.013312339687347463, + 1.8281194995880128, + -2.3761580247879026, + -1.6655417486190796, + -2.8879985211372374, + -2.024796287918091, + -2.8088368267059325, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7975999999999992, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.027407007861137256, + -1.8577467799186707, + 2.8453764088153832, + 1.6954893584251405, + 2.870450235891343, + 2.0029636798858643, + 2.808081196403503, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 948.4096, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.1564803113937376, + 2.1062067033290863, + 2.2962332958221428, + 1.4867680027008054, + 2.3619786128520968, + 1.6406866954803467, + 2.8881806318759917, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 944.6902000000001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0007135526975616813, + -0.0003534950374159962, + 0.0011087273014709353, + 0.00018156379519496113, + -0.0018077408894896507, + 0.00005206819696468301, + 0.0025921647902578115, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 533.2557983398438, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0009018750279210508, + 0.0002198505389969796, + -0.0011170865036547184, + -0.000418089737650007, + 0.0012902384623885155, + 0.0009497611899860203, + -0.0008871746831573546, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 553.1741333007812, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1037909984588623, + 0.03418908268213272, + 0.14360260963439941, + 0.16961778700351715, + 0.20701688528060913, + 0.2258588671684265, + 0.24374830722808838, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 343.0868225097656, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.11896975338459015, + 0.0325104221701622, + 0.1677417755126953, + 0.19693401455879211, + 0.24006836116313934, + 0.22501049935817719, + 0.28681400418281555, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 314.21026611328125, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.33542436039447776, + -0.11812768712043764, + -0.5185220909118653, + -0.5681056449890136, + -0.7323143272399903, + -0.7057940410137173, + -0.9256965145111082, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.6079999999999757, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4231953330039977, + -0.12260290641784666, + -0.5584167864799499, + -0.7264892864227295, + -0.8738897808074952, + -0.7326278971195221, + -1.0107426010131837, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7975999999999992, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.3840171305179596, + 0.12214941902160636, + 0.49682519912719725, + 0.6064030448913575, + 0.6977665336608885, + 0.7309729760646824, + 0.8620825569152837, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 948.4096, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.37962152361869816, + 0.10668836259841918, + 0.6009062723159793, + 0.6464898212432861, + 0.8375270114898674, + 0.6645073395252226, + 1.1167047012329103, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 944.6902000000001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aidal_s28_a28/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aidal_s28_a28/norm_stats_meta.json new file mode 100644 index 0000000..b2e9bcb --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aidal_s28_a28/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_realman_rmc_aidal_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/realman_rmc_aidal_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_18412/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 492790, + "num_frames": 15769266, + "estimated_total_batches": null, + "train_episodes": 17481, + "train_bytes": 1684550435506, + "elapsed_sec": 4069.850043296814, + "frames_per_sec": 3874.655290057317 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aidal_s28_a28/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aidal_s28_a28/unified_action_space.json new file mode 100644 index 0000000..814b04c --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_realman_rmc_aidal_s28_a28/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ef55a4aafbbe2ee823c0cee63ded3dbf686094cc4ac9049016b9941db4f30422" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s17_a17/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s17_a17/norm_stats.json new file mode 100644 index 0000000..d3ba750 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s17_a17/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.4022698402404785, + 0.4008525311946869, + -1.8359957933425903, + 1.3991795778274536, + 1.6781357526779175, + -0.39159268140792847, + -0.11824289709329605, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5900587439537048, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.10200242698192596, + -0.36888185143470764, + 1.6269876956939697, + -1.5651452541351318, + -1.710113763809204, + 0.14229054749011993, + 0.0901879221200943, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7219226956367493, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.3285321593284607, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.47184816002845764, + 0.26041191816329956, + 0.30844730138778687, + 0.4104193449020386, + 0.3992116451263428, + 0.5433208346366882, + 0.4647732377052307, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.39009591937065125, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2526223659515381, + 0.1727783977985382, + 0.15735691785812378, + 0.30363792181015015, + 0.3119509518146515, + 0.3184160590171814, + 0.3587453365325928, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3384997248649597, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08604823052883148, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.15512949786186214, + -0.000247655253857372, + -2.7533860206604004, + 0.018561795279711076, + 0.348873460650444, + -1.5701000690460205, + -1.888011309146881, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1376806372463703, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.1755216784477236, + -0.9503723105043173, + 1.2927916605830192, + -2.0496549903660024, + -2.4722114605903625, + -0.1814788004875183, + -0.865350887775421, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1337790972352028, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5622645171403885, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.5952690245151522, + 1.1460021360963584, + -1.3690508592128754, + 2.049136744551986, + 2.751842607951164, + 0.8992856348037717, + 0.8812080025672913, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.965350421231985, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03684061706066122, + -0.09100282496213907, + 2.4757759820103646, + -0.0374427558146424, + -0.6511100595712662, + 1.4296446043968203, + 1.5782729723930364, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9653499048113824, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.2347364159733057, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0007815549615770578, + -0.0006295735365711153, + 0.00006955656135687605, + -0.00046953416313044727, + -0.0009421160793863237, + -0.000566480855923146, + 0.0007163064437918365, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5906252264976501, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.00038199048140086234, + 0.0004900511703453958, + -0.00028768597985617816, + -0.00026881968369707465, + -0.0003086130600422621, + -0.00019033218268305063, + -0.0003762365668080747, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7219077944755554, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.32853180170059204, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.19541341066360474, + 0.145516499876976, + 0.15332399308681488, + 0.19865047931671143, + 0.16601331532001495, + 0.20398183166980743, + 0.18197141587734222, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3904857337474823, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09083140641450882, + 0.059260159730911255, + 0.07308832556009293, + 0.12470908463001251, + 0.09311696887016296, + 0.08739949762821198, + 0.1316150426864624, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3384832441806793, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0860481858253479, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6090426849842071, + -0.4968913494586945, + -0.5529850662708282, + -0.6974553999900817, + -0.5849689860343932, + -0.8470925182104112, + -0.6177244747161865, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1376806372463703, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.3506921148777007, + -0.20023923506736763, + -0.2488031871795655, + -0.4694817880868911, + -0.3406314041137697, + -0.31274263751506814, + -0.5059143760204314, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.13361177916526795, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5622645171403885, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6863681363344192, + 0.5567416855335237, + 0.4736135180950165, + 0.6609690598249438, + 0.5248469697237015, + 0.5392340588569642, + 0.5923228402614593, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.965350421231985, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2980546859979629, + 0.20376526083946223, + 0.24556429748535136, + 0.442152768421173, + 0.33779594779014577, + 0.34090128064155567, + 0.4569228596687318, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9653499048113824, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.2347364159733057, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s17_a17/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s17_a17/norm_stats_meta.json new file mode 100644 index 0000000..b186237 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s17_a17/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_ruantong_a2d_s17_a17", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/ruantong_a2d_s17_a17_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_1719/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 32248, + "num_frames": 1031909, + "estimated_total_batches": null, + "train_episodes": 1633, + "train_bytes": 232098850893, + "elapsed_sec": 277.61806178092957, + "frames_per_sec": 3717.009597215209 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s17_a17/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s17_a17/unified_action_space.json new file mode 100644 index 0000000..46d05f0 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s17_a17/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "02e7c59245802e66825ab80d667297f376ddc17ad33bfbe771465efbd15789a2" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s41_a34/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s41_a34/norm_stats.json new file mode 100644 index 0000000..fe95813 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s41_a34/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -1.3547803163528442, + 0.755029022693634, + 0.6068242788314819, + -0.9906300902366638, + 1.0170456171035767, + 1.3017445802688599, + -0.18157915771007538, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7635851502418518, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.3421299457550049, + -0.7070972323417664, + -0.5880898833274841, + 1.0016454458236694, + -0.9842587113380432, + -1.3245666027069092, + 0.13256670534610748, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7062156200408936, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0004295064427424222, + 0.3654797077178955, + 0.4781149625778198, + 0.404465913772583, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.40673211216926575, + 0.25750458240509033, + 0.44406312704086304, + 0.4298768639564514, + 0.4682933986186981, + 0.3272894322872162, + 0.4376765787601471, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.319647878408432, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.36325040459632874, + 0.26303979754447937, + 0.4294496476650238, + 0.41202446818351746, + 0.4376407861709595, + 0.26321712136268616, + 0.406250536441803, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.34777307510375977, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13882064819335938, + 0.0587720051407814, + 0.06267630308866501, + 0.06288386881351471, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -2.623746828877926, + 0.422594678670168, + 0.26733380875587465, + -1.3614243242025375, + 0.5744161965847017, + -0.005409026861190824, + -1.6480314255952835, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1908386861205101, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.9897309021949767, + -1.3695025413155555, + -2.06178382396698, + -0.01326705760955793, + -2.081861891722679, + -1.5936958384633064, + -0.853074108362198, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1906825377225876, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.26186463236808777, + 0.2617471218109131, + 0.3489969074726105, + 0.31707038768529894, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.7302417573094369, + 1.3694030942618847, + 2.445421035337448, + 0.009004551577567854, + 2.326905642080307, + 1.601938715982437, + 0.8492856928110122, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0012754402011632, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.3719133356809614, + -0.09056340849399569, + -0.16903709316253668, + 1.3555171401977542, + -0.2900681381464003, + -0.5199884833097457, + 1.707816768169403, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0010545860767364, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.26176494808197015, + 0.43632417860031125, + 0.6108229170560837, + 0.5188367841541767, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0010563352843746543, + 0.0017160391435027122, + 0.005159545224159956, + 0.0022106990218162537, + 0.0014503959100693464, + -0.005501764826476574, + 0.0010637474479153752, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6935475468635559, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0027838535606861115, + -0.0005895814974792302, + -0.0026668307837098837, + -0.002813382539898157, + -0.0016497792676091194, + 0.002556455321609974, + -0.000546303519513458, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6242499947547913, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.00042965743341483176, + 0.36547815799713135, + 0.47811827063560486, + 0.4044669568538666, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1597946286201477, + 0.11818362027406693, + 0.14702743291854858, + 0.2084183245897293, + 0.16728796064853668, + 0.16486595571041107, + 0.15998083353042603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4545469284057617, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.14823907613754272, + 0.12344123423099518, + 0.14680664241313934, + 0.18301677703857422, + 0.1618991196155548, + 0.11924934387207031, + 0.1484396904706955, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4780848026275635, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1388205587863922, + 0.058782149106264114, + 0.06265798956155777, + 0.06288007646799088, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6110378967523575, + -0.393797745513916, + -0.4590578153133391, + -0.6687536456108094, + -0.469356360435486, + -0.5654164524078369, + -0.5650752035140991, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4784718633651732, + -0.3966371303558349, + -0.4847236261367798, + -0.6575335870981217, + -0.660990184020996, + -0.41581965608596794, + -0.47923130426406857, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.2619338631629944, + 0.26169419288635254, + 0.3489546775817871, + 0.317028849452734, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.49575549707412714, + 0.43070048446655274, + 0.4998851660966874, + 0.8407508171796798, + 0.6952995580434798, + 0.6087248458862304, + 0.5395712120056153, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4941145238876343, + 0.4433111068725586, + 0.5403243355751037, + 0.6182873335599899, + 0.45763365707397474, + 0.4022696802139283, + 0.5173421204090118, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2617077342569828, + 0.43634983854293824, + 0.6108512703180313, + 0.5187769077837467, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s41_a34/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s41_a34/norm_stats_meta.json new file mode 100644 index 0000000..5858b0e --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s41_a34/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_ruantong_a2d_s41_a34", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/ruantong_a2d_s41_a34_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_6459/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 85004, + "num_frames": 2720116, + "estimated_total_batches": null, + "train_episodes": 6136, + "train_bytes": 1133795856617, + "elapsed_sec": 1135.4377226829529, + "frames_per_sec": 2395.654068611155 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s41_a34/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s41_a34/unified_action_space.json new file mode 100644 index 0000000..167fead --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_ruantong_a2d_s41_a34/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "c67f9a1a94cc29d855336aa75853afc3fe9f40256c371694d4c7688007dd8e61" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28/norm_stats.json new file mode 100644 index 0000000..f6275d8 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.1628706455230713, + 0.23347488045692444, + -0.04910242184996605, + 0.264553040266037, + 0.13043716549873352, + -0.33108076453208923, + -0.14998599886894226, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.29194653034210205, + 0.6853201985359192, + 0.6170122027397156, + -0.6644286513328552, + -1.1213622093200684, + -0.6663221120834351, + -0.8499442934989929, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.07948362082242966, + -0.17150138318538666, + 0.21232953667640686, + 0.0920492485165596, + -0.29347097873687744, + -0.30039313435554504, + 0.0853857547044754, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.3021090030670166, + -0.6288666725158691, + -0.6771913170814514, + 0.6895211338996887, + 1.1751788854599, + 0.6504865884780884, + 0.8789990544319153, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3626730144023895, + 0.19216300547122955, + 0.2810690999031067, + 0.5205802321434021, + 0.5020791888237, + 0.5364598631858826, + 0.36660030484199524, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.25213295221328735, + 0.207768052816391, + 0.4823054075241089, + 0.2749427855014801, + 0.6560249924659729, + 0.2500518560409546, + 0.6224695444107056, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3831944465637207, + 0.1589929163455963, + 0.24002577364444733, + 0.4983278810977936, + 0.46839040517807007, + 0.42183858156204224, + 0.32927024364471436, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.25350189208984375, + 0.2528623938560486, + 0.5577102303504944, + 0.22081902623176575, + 0.6477662324905396, + 0.20423410832881927, + 0.6250683069229126, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0871391372680663, + -0.20876111135482786, + -0.8388713676452637, + -0.8200110165596008, + -0.7363758310317993, + -1.3833980978965759, + -0.7764279620170593, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.943547477543354, + 0.09146377477645873, + 0.017375269904732704, + -1.098071245956421, + -1.7251344782330096, + -1.131031814558804, + -1.6974872374732048, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0471447103023528, + -0.528865817463398, + -0.20733413085937502, + -0.8457812840938568, + -1.2295815105915069, + -1.2434954173088073, + -0.86912408721447, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.902100967156887, + -0.9165206720232963, + -1.7268712982222438, + 0.06079141880832613, + 0.014800074510276318, + 0.11157027700543404, + 0.01750687765069306, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.47659769430160503, + 0.7076735383987427, + 0.45100675120353695, + 1.2377816146373748, + 1.335918707370758, + 0.9499077592849732, + 1.3439336926937102, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1254084028124809, + 0.9077776364326477, + 1.6320448531996459, + 0.013790484744310216, + -0.0170682890616356, + -0.011170641231536882, + -0.023183120945841296, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5287259579181671, + 0.14627059165239342, + 0.8642253021240234, + 1.3658753696680068, + 0.684262245941162, + 0.594153723692894, + 0.7332529784440993, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21299966784715663, + 0.005030459719896352, + -0.014311032612621899, + 1.052727247415483, + 1.73224950031098, + 1.0908084644936025, + 1.6659874871112406, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0016884017968550324, + 0.011546838097274303, + 0.00473940372467041, + -0.0024346469435840845, + -0.0031135918106883764, + -0.002420922042801976, + 0.0017203716561198235, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.2739558219909668, + 0.7384939193725586, + 0.6407151818275452, + -0.687782883644104, + -1.1394267082214355, + -0.6913239359855652, + -0.8725272417068481, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0007380479946732521, + -0.00810902751982212, + -0.0052103460766375065, + -0.002664201660081744, + 0.004933670163154602, + -0.002533601364120841, + -0.0018208746332675219, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.26942676305770874, + -0.6645417809486389, + -0.6903152465820312, + 0.7051751017570496, + 1.1936242580413818, + 0.6750840544700623, + 0.8997586965560913, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.15168355405330658, + 0.11104796826839447, + 0.14569349586963654, + 0.21772974729537964, + 0.2811240255832672, + 0.2331443876028061, + 0.23385126888751984, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.26519671082496643, + 0.20837455987930298, + 0.5007086396217346, + 0.2879154086112976, + 0.686345100402832, + 0.2576579451560974, + 0.6700758934020996, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13862664997577667, + 0.07791885733604431, + 0.11473166942596436, + 0.2046445906162262, + 0.18303248286247253, + 0.15754161775112152, + 0.16820472478866577, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.27345746755599976, + 0.25550195574760437, + 0.5730949640274048, + 0.2446984052658081, + 0.6683359146118164, + 0.22920526564121246, + 0.6644843816757202, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4647418713569641, + -0.36247115948200226, + -0.4871022036075593, + -0.6902964536190033, + -0.9688063781738281, + -0.8738521937131882, + -0.7369811347961426, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9890421652793884, + 0.19791983685493464, + -0.00033008601089240986, + -1.2235791976333363, + -1.7463293075561523, + -1.1852029679603175, + -1.7463293075561523, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.42307967765331267, + -0.26447365524768834, + -0.4067236483573914, + -0.6569536940097809, + -0.6593658556938171, + -0.4846822315454482, + -0.556758381319046, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9903689094781876, + -0.9210000038146973, + -1.7463293075561523, + -0.0010000000474974513, + -0.0003010683244559914, + 0.06110405158251524, + -0.0006505341859767214, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.5710441195964813, + 0.37983955030441297, + 0.47168680982589706, + 0.7756827896118161, + 1.0283435638427734, + 0.7458742338418958, + 0.7903891201019286, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2754032823443411, + 0.9206928329706192, + 1.6932202401782386, + 0.0006854407878826851, + 0.0006505341859766034, + 0.0006854407878826851, + 0.0006505341859766034, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5275774911642075, + 0.2503997765541076, + 0.3314345474720002, + 0.6707679876804353, + 0.5859755010604859, + 0.5634215530157092, + 0.5414131363868715, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.24682292762994762, + -0.05346022585034371, + -0.00028526860064581605, + 1.091015984294936, + 1.7459798416946315, + 1.2084764054469996, + 1.7459798416946315, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28/norm_stats_meta.json new file mode 100644 index 0000000..329799a --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unitree_g1_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unitree_g1_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_931/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 19765, + "num_frames": 632462, + "estimated_total_batches": null, + "train_episodes": 884, + "train_bytes": 137723586828, + "elapsed_sec": 202.07107949256897, + "frames_per_sec": 3129.898655404859 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28/unified_action_space.json new file mode 100644 index 0000000..426641a --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "beb5c3de296f6dfdd1e27ccc8605130a15e00fbe16608d63c4a5e7e346171784" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28_high/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28_high/norm_stats.json new file mode 100644 index 0000000..6633804 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28_high/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.7445161938667297, + 0.2046411782503128, + -0.24800196290016174, + 0.9919590950012207, + 0.3741361200809479, + -0.2801648676395416, + -0.13361211121082306, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.6758849024772644, + 0.8352697491645813, + 0.2204723358154297, + -0.3820844292640686, + -0.8395292162895203, + -0.3996052145957947, + -0.5619040131568909, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.36609283089637756, + -0.08858122676610947, + -0.30266183614730835, + 0.8333971500396729, + 0.29706326127052307, + -0.2599102556705475, + 0.45701661705970764, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.10622099041938782, + -0.8759199976921082, + -0.34643176198005676, + 0.814652144908905, + 1.2110474109649658, + 0.567145049571991, + 0.9029716849327087, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3898758292198181, + 0.20100830495357513, + 0.3866082727909088, + 0.4276141822338104, + 0.5115737915039062, + 0.2632923424243927, + 0.42600882053375244, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21897515654563904, + 0.10531293600797653, + 0.23290933668613434, + 0.2559126913547516, + 0.630479633808136, + 0.24550874531269073, + 0.5936964750289917, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17779535055160522, + 0.11882677674293518, + 0.14129222929477692, + 0.3587522506713867, + 0.23949897289276123, + 0.2896011471748352, + 0.5105559229850769, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7211710214614868, + 0.13480520248413086, + 0.32516923546791077, + 0.28521132469177246, + 0.520041286945343, + 0.3791837990283966, + 0.6520012617111206, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.2224115524291992, + -0.2226963701248169, + -0.7868920280456543, + -0.01173839816451075, + -0.6705473416090012, + -0.9839372223377227, + -1.1950472702026367, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.008761749792099, + 0.3164234099209309, + 0.015529673546552658, + -1.0354845005345996, + -1.7086090141598136, + -1.0038791944533587, + -1.6925374082896858, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7371529162883759, + -0.3936914521664381, + -0.7073566943407059, + 0.038411684036254876, + -0.06361387825012206, + -0.9945685440063476, + -0.2427892891407013, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.8244225978851318, + -0.917671856868267, + -1.6727701947420834, + 0.20956130823493002, + 0.016465356573462486, + -0.07792163744568825, + 0.013376317918300629, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.08535512161254899, + 0.6966267797470093, + 0.5173972716808319, + 1.3934486828446386, + 1.0134924908161163, + 0.3364450139045716, + 0.7313213119506838, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.21198543627262112, + 0.9117449419245124, + 0.8466709901146591, + -0.025526101072493645, + -0.036378498886898036, + -0.01881221437454217, + -0.020673312769085017, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.015156626367568982, + 0.11028196246623989, + -0.07709463704824449, + 1.2660695624351501, + 0.8034028644561768, + 0.18856437225341782, + 1.5178833255529405, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0496813233375548, + -0.12920548431873324, + -0.01758571497499939, + 1.5300610191166402, + 1.7329283000670372, + 1.1529876285791396, + 1.7253991491645575, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.001059380709193647, + 0.004219536203891039, + 0.0023536814842373133, + 0.004847630392760038, + -0.0044314186088740826, + 0.0032603945583105087, + 0.0002796429907903075, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.6260432600975037, + 0.8834512829780579, + 0.23747524619102478, + -0.4212741553783417, + -0.8709027171134949, + -0.433660089969635, + -0.5984626412391663, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.007231731899082661, + -0.001023879274725914, + -0.0034783456940203905, + -0.00010531584121054038, + 0.004821954760700464, + -0.0008869097218848765, + -0.000642355706077069, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.46016982197761536, + -0.8851051330566406, + -0.34612372517585754, + 0.8203089833259583, + 1.2152869701385498, + 0.7640361189842224, + 0.907231867313385, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.264655739068985, + 0.1654302030801773, + 0.2674410343170166, + 0.2734619677066803, + 0.3695032000541687, + 0.23066960275173187, + 0.32287293672561646, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2984951436519623, + 0.08304513990879059, + 0.2572486400604248, + 0.3235522210597992, + 0.7256113886833191, + 0.30972957611083984, + 0.689659059047699, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.04034788906574249, + 0.0261350329965353, + 0.01804332062602043, + 0.06059056892991066, + 0.022570159286260605, + 0.035094913095235825, + 0.03205068036913872, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21764817833900452, + 0.1374056339263916, + 0.3252909779548645, + 0.2921648323535919, + 0.5298183560371399, + 0.2756422162055969, + 0.677844226360321, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6967882361650467, + -0.376699486553669, + -0.7184161659240723, + -0.8877626407623291, + -1.1069273098468781, + -0.7469617376804352, + -1.1573144844055174, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0481975078582764, + 0.4381441333025694, + -0.0006127584492787719, + -1.1355026049411623, + -1.7463293075561523, + -1.1958755969752557, + -1.7463293075561523, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.10971371923685075, + -0.05946463347375394, + -0.05702475812435151, + -0.1925968414545059, + -0.058742796063423156, + -0.11493266266584395, + -0.0876838384628296, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0481975078582764, + -0.9210000038146973, + -1.6743681746596237, + 0.20299266990423204, + 0.0007594325964921152, + 0.03485975554860197, + -0.000051340521336533114, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.9039022744178773, + 0.5056628809690475, + 0.8582687198638914, + 0.8934240812301635, + 1.1677811064720154, + 0.6654134750127794, + 1.2087200176239015, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.06332860741019242, + 0.9208353751510382, + 0.943756352857803, + 0.0006854407878826851, + 0.0006505341859766034, + 0.000687336620897927, + 0.0006505341859766034, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13810114730000494, + 0.09025129990279673, + 0.04996730821132658, + 0.19269111961126328, + 0.0708820892572403, + 0.08923030090332035, + 0.08276398012638092, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13738033704161645, + -0.12135625495314606, + -0.001795823647105177, + 1.5714997634455563, + 1.745979983987019, + 1.4648461497579701, + 1.7459799615573373, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28_high/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28_high/norm_stats_meta.json new file mode 100644 index 0000000..18bb906 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28_high/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unitree_g1_s28_a28_high", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unitree_g1_s28_a28_fps30_cam_high__episodes_227/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 2287, + "num_frames": 73184, + "estimated_total_batches": null, + "train_episodes": 216, + "train_bytes": 3159483310, + "elapsed_sec": 28.13194966316223, + "frames_per_sec": 2601.4549605081866 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28_high/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28_high/unified_action_space.json new file mode 100644 index 0000000..426641a --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_unitree_g1_s28_a28_high/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "beb5c3de296f6dfdd1e27ccc8605130a15e00fbe16608d63c4a5e7e346171784" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_unknown_s30_a30_high/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_unknown_s30_a30_high/norm_stats.json new file mode 100644 index 0000000..fce0f58 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_unknown_s30_a30_high/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.4601517915725708, + 0.28574568033218384, + -0.28942522406578064, + 0.6302258372306824, + -0.4861578345298767, + -0.5207346081733704, + -0.1987939476966858, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.1725141853094101, + 0.0685783177614212, + 0.12817345559597015, + -0.16918662190437317, + -0.4351489543914795, + -0.12865182757377625, + -0.2854554355144501, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.35936683416366577, + -0.39935022592544556, + 0.258500337600708, + 0.5848162770271301, + 0.21070364117622375, + -0.6088512539863586, + -0.01831921748816967, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.29934221506118774, + 0.19203908741474152, + -0.325772225856781, + 0.21082274615764618, + 0.3784441351890564, + 0.1499779373407364, + 0.3509950637817383, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.2189597487449646, + 0.14171771705150604, + 0.43653634190559387, + 0.362621009349823, + 0.499917209148407, + 0.36899834871292114, + 0.22155988216400146, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4452809989452362, + 0.6484705805778503, + 0.27489814162254333, + 0.4036325514316559, + 0.6206685304641724, + 0.3343346416950226, + 0.5257602334022522, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22628849744796753, + 0.1428905427455902, + 0.3611524999141693, + 0.4151686429977417, + 0.3856017589569092, + 0.3003835678100586, + 0.255756139755249, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22143076360225677, + 0.45618167519569397, + 0.5058495998382568, + 0.4284057021141052, + 0.5871851444244385, + 0.3656456768512726, + 0.5761141777038574, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.101659857749939, + -0.018607720243930814, + -1.584791460418701, + -0.30841166829466815, + -1.360724712395668, + -1.1547250646352767, + -0.7063347400903701, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5, + -0.7200000286102295, + 0.0, + -1.5700000524520874, + -1.745300054550171, + -1.3875660463571549, + -1.6754880523681641, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9737500015258789, + -0.7816216490864754, + -0.6477329211235047, + -0.3947790165305138, + -1.0113668236732483, + -1.1912066125869751, + -0.5944325535297394, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5, + -0.6045961649179459, + -1.587001287984848, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.18273090934753422, + 0.7255914891004562, + 0.7783089427948, + 1.3746503059208395, + 1.1035205349683763, + 0.49836549907922745, + 0.3299396315336227, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4998, + 0.9196720166802406, + 1.7449509945392607, + -0.0003140000104904228, + -0.0003490600109101738, + -0.0003140000104904228, + -0.0003490600109101738, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.23939910240173345, + -0.08035749015212068, + 1.2898316625356676, + 1.499683491653204, + 0.7804335985660553, + 0.2747516059875488, + 0.6979348600387574, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4166000000000001, + 0.7197225100278855, + -0.00033319363594053186, + 1.569686052441597, + 1.7449509945392607, + 1.369924903869629, + 1.675138992357254, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0014253475237637758, + 0.004040827043354511, + 0.00401429645717144, + -0.0006249065627343953, + -0.0007871320121921599, + 0.004092377610504627, + -0.007282583974301815, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.17188459634780884, + 0.09245369583368301, + 0.1286001205444336, + -0.17128616571426392, + -0.43959158658981323, + -0.13044847548007965, + -0.28975656628608704, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0018386616138741374, + -0.0017423932440578938, + -0.002052909228950739, + -0.0004560645029414445, + 0.006413742434233427, + -0.0015468160854652524, + 0.0011579451384022832, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.29914090037345886, + 0.1900770366191864, + -0.3282303512096405, + 0.21167583763599396, + 0.3810122311115265, + 0.15109674632549286, + 0.3544777035713196, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.08548260480165482, + 0.059953778982162476, + 0.14716483652591705, + 0.15606258809566498, + 0.15485815703868866, + 0.13305547833442688, + 0.08386557549238205, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.44540083408355713, + 0.6780035495758057, + 0.27485981583595276, + 0.40709882974624634, + 0.6220939755439758, + 0.3366040885448456, + 0.5278019905090332, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0954136922955513, + 0.053427211940288544, + 0.13860651850700378, + 0.17628909647464752, + 0.143167182803154, + 0.10808171331882477, + 0.08713337779045105, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22215959429740906, + 0.45735371112823486, + 0.5071426630020142, + 0.42950281500816345, + 0.5888646245002747, + 0.36695989966392517, + 0.5784511566162109, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.28645844354629524, + -0.18376410233974455, + -0.46031000661849975, + -0.5777189530849457, + -0.525499416065216, + -0.40847072732448586, + -0.3366838617324829, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5, + -0.7243000268936157, + 0.0, + -1.5707999467849731, + -1.745300054550171, + -1.3876446729898453, + -1.6754880523681641, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.3106002992868423, + -0.17958201030492782, + -0.5006137095689773, + -0.6031595508575439, + -0.48816414699554445, + -0.34850764927864075, + -0.2802416110396385, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5, + -0.6044009449958802, + -1.587001287984848, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.29917649668455115, + 0.21889999203681954, + 0.531090847492218, + 0.5048572306632997, + 0.5642101072788241, + 0.5288397431373595, + 0.24146718263626088, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4998, + 1.046845664525032, + 1.7449509945392607, + -0.0003141599893570213, + -0.0003490600109101738, + -0.0003141599893570213, + -0.0003490600109101738, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.32684008424282074, + 0.16315318412780755, + 0.41679275200367005, + 0.5781977668762206, + 0.5312393463134764, + 0.4175895518779753, + 0.3207163540005684, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4166000000000001, + 0.7240216483116149, + -0.00033319363594053186, + 1.569686052441597, + 1.7449509945392607, + 1.369924903869629, + 1.675138992357254, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_unknown_s30_a30_high/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_unknown_s30_a30_high/norm_stats_meta.json new file mode 100644 index 0000000..345f7da --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_unknown_s30_a30_high/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unknown_s30_a30_high", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unknown_s30_a30_fps30_cam_high__episodes_891/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 8154, + "num_frames": 260914, + "estimated_total_batches": null, + "train_episodes": 846, + "train_bytes": 20178322671, + "elapsed_sec": 82.17656183242798, + "frames_per_sec": 3175.041571245681 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_unknown_s30_a30_high/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_unknown_s30_a30_high/unified_action_space.json new file mode 100644 index 0000000..426641a --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_unknown_s30_a30_high/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "beb5c3de296f6dfdd1e27ccc8605130a15e00fbe16608d63c4a5e7e346171784" +} diff --git a/assets/cotrain_real_robot_fix/robocoin_yinhe_s49_a16/norm_stats.json b/assets/cotrain_real_robot_fix/robocoin_yinhe_s49_a16/norm_stats.json new file mode 100644 index 0000000..49a8dd4 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_yinhe_s49_a16/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 1.524367094039917, + -1.3065650463104248, + -0.5391265749931335, + -1.9779719114303589, + 0.042856667190790176, + 0.1487847864627838, + -0.05886118486523628, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6645289063453674, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.49284985661506653, + 1.0417016744613647, + -0.322103887796402, + 1.5314422845840454, + 0.26630860567092896, + -0.10916095227003098, + -0.5114750862121582, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7098702192306519, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.2897261083126068, + 0.19842040538787842, + 0.2448112666606903, + 0.21612223982810974, + 0.6295380592346191, + 0.2960987687110901, + 0.1680130958557129, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2784114181995392, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.934599757194519, + 0.27511605620384216, + 0.8904873728752136, + 0.42886051535606384, + 0.34848248958587646, + 0.3541565239429474, + 0.565496027469635, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1976504921913147, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + 0.7376339052915573, + -1.6099701312497259, + -0.885706602358818, + -2.3163964335680007, + -1.0850703057050706, + -0.47425655221939084, + -0.44927409212589264, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.08486673181802035, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.891990763092041, + 0.4447629337310792, + -1.839495149588585, + 0.5765320897683501, + -0.5520781661987304, + -0.735830457687378, + -1.3432193279266358, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.10670718535780907, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.904548677366972, + -0.795198133945465, + 0.18943803424835215, + -1.2896517002105712, + 1.6342880125045776, + 0.7360185463428499, + 0.3375669756293296, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9067215650454163, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9615902823448184, + 1.5525214227437973, + 0.9610611121892929, + 2.3590748086735607, + 0.9761594358444214, + 0.7660390744209289, + 0.45407201790809637, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9067818530648947, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.00006569585093529895, + -0.0002367628476349637, + -0.0004524707910604775, + 0.0005102173890918493, + -0.001635607099160552, + -0.006574156228452921, + 0.0007140140514820814, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.665635883808136, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.01432245783507824, + 0.009032520465552807, + 0.010951328091323376, + 0.006414332427084446, + 0.004951334558427334, + 0.008958633057773113, + 0.008657954633235931, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.711277961730957, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1834850162267685, + 0.10580053180456161, + 0.18292799592018127, + 0.18817037343978882, + 0.3076501786708832, + 0.15092547237873077, + 0.1127411350607872, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2779955565929413, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.45669886469841003, + 0.2752196490764618, + 0.40178874135017395, + 0.2569642961025238, + 0.2553403973579407, + 0.24139155447483063, + 0.1890239715576172, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.19659824669361115, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6143484880447387, + -0.39371692562103267, + -0.6777150949001312, + -0.6583128417015075, + -1.4426410250663757, + -0.6675770700454713, + -0.4131294379234314, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.08486673181802035, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.7665856656551362, + -0.8687658917427064, + -1.09206223115921, + -0.84294264087677, + -0.609202272439003, + -0.8176013734817504, + -0.6940191761016845, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.10670718535780907, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6324825129508973, + 0.3164169328212738, + 0.6923210113048555, + 0.5968620174407961, + 1.15903103017807, + 0.5463467423677444, + 0.44189159464836125, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9067215650454163, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.2043245237350462, + 0.669174746847153, + 1.794497901535034, + 0.7042711029052735, + 0.8618204277515411, + 0.7357967818260196, + 0.7027042475700376, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9067818530648947, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_yinhe_s49_a16/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robocoin_yinhe_s49_a16/norm_stats_meta.json new file mode 100644 index 0000000..63d08ff --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_yinhe_s49_a16/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_yinhe_s49_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/yinhe_s49_a16_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5452/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 153600, + "num_frames": 4915186, + "estimated_total_batches": null, + "train_episodes": 5179, + "train_bytes": 711128217385, + "elapsed_sec": 1323.132462978363, + "frames_per_sec": 3714.810223109443 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robocoin_yinhe_s49_a16/unified_action_space.json b/assets/cotrain_real_robot_fix/robocoin_yinhe_s49_a16/unified_action_space.json new file mode 100644 index 0000000..285dfcf --- /dev/null +++ b/assets/cotrain_real_robot_fix/robocoin_yinhe_s49_a16/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "df6e3ea1278ba06ec1cd8fc9405c482c55982b5ac43bbfb1dee1f5bfcd1a468a" +} diff --git a/assets/cotrain_real_robot_fix/robomind_agilex_cobot_magic_s14_a14/norm_stats.json b/assets/cotrain_real_robot_fix/robomind_agilex_cobot_magic_s14_a14/norm_stats.json new file mode 100644 index 0000000..f699bd5 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_agilex_cobot_magic_s14_a14/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.2912142872810364, + 0.7706507444381714, + 0.8166523575782776, + -0.5391867160797119, + 0.17443010210990906, + -0.03291980177164078, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.037457823753357, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3165360689163208, + 0.7844910025596619, + 0.8448988199234009, + -0.6473979949951172, + -0.19697701930999756, + 0.09821853041648865, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.071836233139038, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.31844455003738403, + 0.6649036407470703, + 0.6359055638313293, + 0.3965521454811096, + 0.26199185848236084, + 0.19108326733112335, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.6735684871673584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2895064651966095, + 0.5852402448654175, + 0.5345459580421448, + 0.4037196934223175, + 0.25300946831703186, + 0.17583996057510376, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.6739572286605835, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.1008532051086426, + 0.0013943950653076175, + 0.014930963516235352, + -1.3446834449768066, + -0.46284152030944825, + -0.5668264865875243, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.01151485834121704, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.09137299480438232, + 0.0024674806594848636, + 0.013868572044372559, + -1.356740512084961, + -0.730856520652771, + -0.36164791870117186, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.015304181719198822, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.11911020965576169, + 2.1889521074295044, + 2.31054425239563, + 0.27205753517150866, + 0.8036104869842529, + 0.5188723945617677, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 5.357991581296921, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0514802862167358, + 2.167783304977417, + 2.112537544631958, + 0.07684082565307637, + 0.48839656925201425, + 0.5515233222961426, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 5.254145598340035, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.00031540499185211957, + -0.007605055347084999, + -0.013626378029584885, + 0.01294397097080946, + -0.008090313524007797, + 0.013309093192219734, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.3646289110183716, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0019422572804614902, + -0.007419590372592211, + -0.011846384033560753, + 0.012537145055830479, + 0.006900215987116098, + -0.007588144391775131, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.5834583044052124, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1662832796573639, + 0.3357270061969757, + 0.2942589521408081, + 0.2550986111164093, + 0.16362538933753967, + 0.1354900598526001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.0903167724609375, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.15850712358951569, + 0.3416793942451477, + 0.28663069009780884, + 0.2630174458026886, + 0.13510547578334808, + 0.12409359216690063, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.1895596981048584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.521558889389038, + -1.025707421875, + -1.1375078313827516, + -0.7164978378295899, + -0.5593309104919433, + -0.39902141418457027, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.09417187500000002, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5945680046081545, + -1.064510614013672, + -1.072522581100464, + -0.7810182523727416, + -0.42451723403930663, + -0.4333285047531128, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.16773752975463874, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6086202415466309, + 0.9857216306686398, + 0.8020620159149168, + 0.9357657577514651, + 0.5060111686706543, + 0.4612753326416015, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 6.653624244689942, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5080000579833981, + 1.0137772064208983, + 0.8535642738342282, + 0.9668074893951419, + 0.47746843833923336, + 0.33230566730499245, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 6.698792873382567, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_agilex_cobot_magic_s14_a14/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robomind_agilex_cobot_magic_s14_a14/norm_stats_meta.json new file mode 100644 index 0000000..af277e0 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_agilex_cobot_magic_s14_a14/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_agilex_cobot_magic_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/agilex_cobot_magic_agilex_dual_arm_h5_agilex_3rgb_real_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10374/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 196965, + "num_frames": 6302870, + "estimated_total_batches": null, + "train_episodes": 9855, + "train_bytes": 1015824843385, + "elapsed_sec": 1625.2714269161224, + "frames_per_sec": 3878.0414739459275 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_agilex_cobot_magic_s14_a14/unified_action_space.json b/assets/cotrain_real_robot_fix/robomind_agilex_cobot_magic_s14_a14/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_agilex_cobot_magic_s14_a14/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_real_robot_fix/robomind_franka_fr3_dual_s16_a16/norm_stats.json b/assets/cotrain_real_robot_fix/robomind_franka_fr3_dual_s16_a16/norm_stats.json new file mode 100644 index 0000000..56764de --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_fr3_dual_s16_a16/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.02872992493212223, + -0.03250863403081894, + -0.044107649475336075, + -1.9217846393585205, + -0.03335548937320709, + 1.8634817600250244, + -0.09915560483932495, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.27069082856178284, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.007103583309799433, + 0.09939762949943542, + 0.17450419068336487, + -1.4917900562286377, + -0.14953744411468506, + 1.5298478603363037, + 0.17748871445655823, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.17512521147727966, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.24050824344158173, + 0.18076345324516296, + 0.162387877702713, + 0.3688068687915802, + 0.26190441846847534, + 0.38791725039482117, + 0.42700111865997314, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.38373228907585144, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.20354995131492615, + 0.18818333745002747, + 0.14312860369682312, + 0.09749498218297958, + 0.42516154050827026, + 0.23171094059944153, + 0.315849632024765, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3484148383140564, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.7479126671791076, + -0.4948742458820343, + -0.4937059134244919, + -2.6657454515457153, + -0.7740779214859008, + 1.3427923250198364, + -1.4256502631664276, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.26181291670799256, + -0.12531252807974816, + -0.14902960658073428, + -1.8273668120980262, + -1.7342645349979402, + 1.3332580568790435, + -0.24545768320560457, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.004200000000000001, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6294316546440124, + 0.4177898835539817, + 0.3835556173324586, + -1.4613578771591187, + 0.8686296574592591, + 2.6317525205612182, + 1.02927272901535, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.991, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.665686247253418, + 0.6005449758857488, + 0.5071338846683502, + -1.253091666698456, + 0.17801692837476724, + 2.4559928531885147, + 1.320400775194168, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.991, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.00579951424151659, + 0.0009321922552771866, + 0.0001605675497557968, + 0.01468118466436863, + 0.004086125176399946, + -0.009518737904727459, + -0.0008803497767075896, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3470822870731354, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.009737007319927216, + -0.0050971596501767635, + 0.003751665586605668, + 0.002095873700454831, + 0.007014834322035313, + -0.006377325858920813, + -0.0024907798506319523, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.17645229399204254, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.18581676483154297, + 0.1604117602109909, + 0.09761915355920792, + 0.279049277305603, + 0.22557272017002106, + 0.3101310133934021, + 0.3323877155780792, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4602535367012024, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1281752586364746, + 0.11369078606367111, + 0.07542045414447784, + 0.07059511542320251, + 0.24174679815769196, + 0.14355233311653137, + 0.23310133814811707, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.35898837447166443, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6203167253017425, + -0.5089887523770332, + -0.31527611851692194, + -0.861568698644638, + -0.7907215990066527, + -0.9439559233188629, + -0.9502868450164795, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5435035077095032, + -0.4396112471818924, + -0.27968518979549417, + -0.2505410222053528, + -1.0277889500141142, + -0.5418802068948746, + -0.8036095057487488, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.00437053572118748, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6547829939365386, + 0.47977734111547465, + 0.3555985690355301, + 0.6909391857385636, + 0.7429793606758119, + 0.839421225786209, + 1.1230383680343627, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3702085198402405, + 0.3635676041245459, + 0.25351028020381916, + 0.2524659325599672, + 1.0453574712753295, + 0.48159508218765246, + 1.0040429187774658, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998000744047633, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_franka_fr3_dual_s16_a16/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robomind_franka_fr3_dual_s16_a16/norm_stats_meta.json new file mode 100644 index 0000000..3c018d2 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_fr3_dual_s16_a16/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_fr3_dual_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_fr3_dual_master_puppet_joint_position_h5_franka_fr3_dual_real_s16_a16_fps30_cam_high_cam_left_cam_right_cam_top__episodes_1774/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 11198, + "num_frames": 358321, + "estimated_total_batches": null, + "train_episodes": 1685, + "train_bytes": 186172127608, + "elapsed_sec": 205.53938150405884, + "frames_per_sec": 1743.3204156689756 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_franka_fr3_dual_s16_a16/unified_action_space.json b/assets/cotrain_real_robot_fix/robomind_franka_fr3_dual_s16_a16/unified_action_space.json new file mode 100644 index 0000000..fd388aa --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_fr3_dual_s16_a16/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9a0d9895669ad5b106f765ca2cb33f8c41f383ef7498ec7c090f1b00097964c7" +} diff --git a/assets/cotrain_real_robot_fix/robomind_franka_panda_s8_a8/norm_stats.json b/assets/cotrain_real_robot_fix/robomind_franka_panda_s8_a8/norm_stats.json new file mode 100644 index 0000000..64bb6f7 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_panda_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.050074514001607895, + 0.2168712615966797, + -0.04304725304245949, + -1.6480380296707153, + -0.04889731854200363, + 1.981959581375122, + 0.027210397645831108, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.31860384345054626, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.20079824328422546, + 0.21306701004505157, + 0.14047782123088837, + 0.21161852777004242, + 0.18164995312690735, + 0.34882527589797974, + 0.35608425736427307, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3863016366958618, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.43048445436954497, + -0.1407027938723564, + -0.4342776439547539, + -2.307061647772789, + -0.8071739921569825, + 1.4752378027439117, + -0.8850302599906921, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.605513199532032, + 0.7539548544883727, + 0.3651459789872169, + -1.2252477578639984, + 0.34580575790405277, + 2.9056127210855482, + 1.1405179331779483, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.991, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.006179585587233305, + -0.029241317883133888, + -0.004109390079975128, + -0.010029942728579044, + 0.002001858549192548, + -0.020291229709982872, + 0.00541237648576498, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3327816426753998, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17788256704807281, + 0.24914397299289703, + 0.10994547605514526, + 0.2059284746646881, + 0.1720099151134491, + 0.399440199136734, + 0.3174999952316284, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4199410378932953, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5027609734058381, + -0.659905499958992, + -0.3669868229150772, + -0.6224279801130295, + -0.5189719449043273, + -1.0841700080633165, + -0.9586771881103513, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5086506120204923, + 0.5854389501810073, + 0.3575911468267441, + 0.6135797002315522, + 0.5958229855537414, + 1.0015189151763915, + 0.94854157409668, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_franka_panda_s8_a8/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robomind_franka_panda_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..2c43271 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_panda_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_panda_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_panda_master_puppet_joint_position_h5_franka_3rgb_real_s8_a8_fps30_cam_left_cam_right_cam_top__episodes_17219/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 57958, + "num_frames": 1854642, + "estimated_total_batches": null, + "train_episodes": 14956, + "train_bytes": 282424151738, + "elapsed_sec": 465.4217314720154, + "frames_per_sec": 3984.8633499218436 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_franka_panda_s8_a8/unified_action_space.json b/assets/cotrain_real_robot_fix/robomind_franka_panda_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_panda_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_real_robot_fix/robomind_franka_sim_franka_s8_a8/norm_stats.json b/assets/cotrain_real_robot_fix/robomind_franka_sim_franka_s8_a8/norm_stats.json new file mode 100644 index 0000000..e18c97f --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_sim_franka_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.05431849882006645, + 0.2290264517068863, + 0.06054431572556496, + -1.7516008615493774, + -0.0009821689454838634, + 1.9669047594070435, + 0.10469292104244232, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3105355203151703, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.282229483127594, + 0.34571757912635803, + 0.26973626017570496, + 0.3954300284385681, + 0.2093062847852707, + 0.34419673681259155, + 0.6092366576194763, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.32808253169059753, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7128893469333648, + -0.7831290235042573, + -0.7018777868747712, + -2.654962126095593, + -0.7293025332927703, + 1.2178158522874118, + -1.579328977584839, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0008327009677886466, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7805238378047945, + 0.996611042022705, + 0.6962547571659083, + -0.801373397190869, + 0.5592271712780001, + 2.9440562456270682, + 1.834556310653686, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7858265437364578, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0003964641073253006, + -0.015292207710444927, + -0.005603020079433918, + 0.008090371266007423, + 0.0009030065848492086, + -0.013399748131632805, + 0.0025455045979470015, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3059731125831604, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.14430563151836395, + 0.23040126264095306, + 0.12359558790922165, + 0.25404950976371765, + 0.1299935132265091, + 0.2845810651779175, + 0.23000602424144745, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.32761436700820923, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4282694184303284, + -0.7556568478345871, + -0.3945588711738588, + -0.8038546324968339, + -0.384043906879425, + -0.9643010272979735, + -0.766740892744064, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0007800394535064648, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.44182890958786025, + 0.5628056311607361, + 0.3584979928016665, + 0.8073955500125884, + 0.43689187560081466, + 0.7673846399307251, + 0.7996728756904603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7859916551351547, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_franka_sim_franka_s8_a8/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robomind_franka_sim_franka_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..b68a98f --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_sim_franka_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_franka_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_sim_franka_3rgb_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_14488/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 48250, + "num_frames": 1543972, + "estimated_total_batches": null, + "train_episodes": 8445, + "train_bytes": 675920469639, + "elapsed_sec": 665.9570224285126, + "frames_per_sec": 2318.4258863577616 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_franka_sim_franka_s8_a8/unified_action_space.json b/assets/cotrain_real_robot_fix/robomind_franka_sim_franka_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_sim_franka_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_real_robot_fix/robomind_franka_sim_none_s8_a8/norm_stats.json b/assets/cotrain_real_robot_fix/robomind_franka_sim_none_s8_a8/norm_stats.json new file mode 100644 index 0000000..61b96fe --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_sim_none_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.041941363364458084, + 0.23306936025619507, + 0.05907498672604561, + -1.8461532592773438, + -0.008388909511268139, + 2.0598065853118896, + 0.03718278184533119, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.16530641913414001, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3363783061504364, + 0.24904070794582367, + 0.27618101239204407, + 0.3934434950351715, + 0.12503312528133392, + 0.2713543772697449, + 0.481111615896225, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21115025877952576, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.842514001083374, + -0.14554469878673554, + -0.6748853764891625, + -2.5493086941719056, + -0.3112471418917179, + 1.444778957772255, + -1.0551550045967102, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0010764459133148496, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8897254436969759, + 1.0443386925697327, + 0.5906232087850571, + -0.7863341999053957, + 0.31217047451734536, + 2.5325355393886566, + 2.0018143637895585, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7445413999080657, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0013613005867227912, + -0.0019828719086945057, + -0.004892994649708271, + 0.040003255009651184, + 0.003110992955043912, + -0.026717711240053177, + 0.002946416148915887, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1649303436279297, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1734810769557953, + 0.18704959750175476, + 0.1274677813053131, + 0.26024433970451355, + 0.07944203168153763, + 0.23101893067359924, + 0.20181050896644592, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21115633845329285, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5883622665405273, + -0.5670622599601746, + -0.4257954135894776, + -0.7182313198089599, + -0.22942946300506595, + -0.6761015580177308, + -0.6581925751209259, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0007068812847137451, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5921108510971069, + 0.532150031197071, + 0.4482104328155516, + 0.7808476925373078, + 0.2439403713226318, + 0.6174762445449828, + 0.6635519044399261, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7441247965335847, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_franka_sim_none_s8_a8/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robomind_franka_sim_none_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..fc6ca81 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_sim_none_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_none_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_none_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_222/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1107, + "num_frames": 35418, + "estimated_total_batches": null, + "train_episodes": 211, + "train_bytes": 6706236456, + "elapsed_sec": 11.181196451187134, + "frames_per_sec": 3167.6395414946483 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_franka_sim_none_s8_a8/unified_action_space.json b/assets/cotrain_real_robot_fix/robomind_franka_sim_none_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_sim_none_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats.json b/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats.json new file mode 100644 index 0000000..f9b87d7 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.12862539291381836, + 0.10420803725719452, + 0.1507907211780548, + -1.6999670267105103, + -0.14460554718971252, + 1.9053664207458496, + 0.4335462749004364, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.06511421501636505, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6245681643486023, + 0.34309419989585876, + 0.5870680809020996, + 0.40795278549194336, + 0.20813338458538055, + 0.2701113522052765, + 1.0759789943695068, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.12459228187799454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -2.8998490468978884, + -0.7582584895730018, + -0.744865327835083, + -2.576282403945923, + -0.6427169109582901, + 1.281201576291985, + -2.211445552444458, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.001115015268325692, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8701619072914122, + 0.8050513436913491, + 2.8916868991851805, + -0.970624508154392, + 0.5479656597852707, + 2.4191241051438204, + 2.5220915309906005, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5271702873706818, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.004356690216809511, + -0.010021368972957134, + -0.005047916434705257, + -0.016711799427866936, + -0.011854293756186962, + 0.03055323101580143, + 0.029920563101768494, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.06573743373155594, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17619915306568146, + 0.17244896292686462, + 0.18936899304389954, + 0.22039532661437988, + 0.11159107834100723, + 0.18016842007637024, + 0.2773687541484833, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.12432067841291428, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.559387174797058, + -0.5706956774711609, + -0.5846574388504027, + -0.8416802699804307, + -0.3643048192501068, + -0.4927735840797425, + -0.7364192728042602, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0008005832195281393, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5136722531795503, + 0.43214548578262324, + 0.5519980060100553, + 0.5205945446729658, + 0.3414099413871765, + 0.6120740163803098, + 1.1303667816162108, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5277051842689515, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..a224597 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_simulation_no_front_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_handeye_cam_left_external_cam_right_external__episodes_158/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1067, + "num_frames": 34125, + "estimated_total_batches": null, + "train_episodes": 150, + "train_bytes": 7133719955, + "elapsed_sec": 11.634025812149048, + "frames_per_sec": 2933.2064885367827 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_no_front_s8_a8/unified_action_space.json b/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_no_front_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_no_front_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_s8_a8/norm_stats.json b/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_s8_a8/norm_stats.json new file mode 100644 index 0000000..4454c2c --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.058677639812231064, + -0.020728396251797676, + 0.061011988669633865, + -1.6386123895645142, + -0.0016661359695717692, + 1.85384202003479, + 0.0318516306579113, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.14600756764411926, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5181325078010559, + 0.3683291971683502, + 0.47908589243888855, + 0.40745365619659424, + 0.24538974463939667, + 0.3270070254802704, + 1.1062960624694824, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22717800736427307, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.9134195173263548, + -0.9667847575187684, + -1.4075731660842894, + -2.5127280881881715, + -0.7051276074171067, + 1.1881394446477294, + -2.1848897399902345, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.008432700586318953, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7120905005455018, + 0.8496470478296279, + 1.7842719498634345, + -0.7269027355104685, + 0.7306575120687486, + 2.559558767311461, + 2.2310024108886717, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7833485061168672, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0030864360742270947, + -0.014526627026498318, + -0.008263246156275272, + -0.021576467901468277, + 0.0018557735020294785, + 0.007785191759467125, + -0.005972929298877716, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1463216096162796, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2138717919588089, + 0.20189231634140015, + 0.20727543532848358, + 0.25472593307495117, + 0.12306797504425049, + 0.25284504890441895, + 0.3214346170425415, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2268107682466507, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.6992091821670527, + -0.6429719269752503, + -0.6553837590217593, + -0.8025883827686309, + -0.3720137566566468, + -0.8318469825267791, + -1.1202265443801882, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.009108828496933175, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.665241785526276, + 0.5787899346351622, + 0.5988114666938777, + 0.802218522644043, + 0.40542664546966556, + 0.7172769757270818, + 1.1334667954444884, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.783179182076454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_s8_a8/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..8576f0d --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_simulation_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_11422/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 53134, + "num_frames": 1700279, + "estimated_total_batches": null, + "train_episodes": 8662, + "train_bytes": 465501426716, + "elapsed_sec": 452.24869179725647, + "frames_per_sec": 3759.6106541359254 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_s8_a8/unified_action_space.json b/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_franka_sim_simulation_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_real_robot_fix/robomind_tienkung_gello_s16_a16/norm_stats.json b/assets/cotrain_real_robot_fix/robomind_tienkung_gello_s16_a16/norm_stats.json new file mode 100644 index 0000000..13cf76b --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_tienkung_gello_s16_a16/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.854895830154419, + 0.2895817458629608, + -0.21138238906860352, + -0.6613888740539551, + 0.4681619107723236, + -0.15557539463043213, + -0.1758464127779007, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9139211773872375, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.26177895069122314, + -0.08320410549640656, + 0.13457360863685608, + 0.3343433141708374, + -0.2124287337064743, + 0.036814019083976746, + 0.17251014709472656, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9292864799499512, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.5788174271583557, + 0.25051409006118774, + 0.3781653642654419, + 0.4176454544067383, + 0.6007633805274963, + 0.24877780675888062, + 0.2531377375125885, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1635691225528717, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4761202931404114, + 0.1770811527967453, + 0.3033520579338074, + 0.3387700021266937, + 0.3307650685310364, + 0.14587220549583435, + 0.18914712965488434, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.10804925858974457, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.9158795733362437, + -0.0012460584171116347, + -1.2030685099601746, + -1.5389836430072785, + -0.4265326317191124, + -0.6112608863592148, + -0.6116086971282959, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.4938, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.1381313104391098, + -0.7465972574207931, + -0.48163455011844636, + 0.06347694122642278, + -1.4407999408245087, + -0.28010992536544804, + -0.1230062010616064, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.4978, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.15307473979890363, + 0.8836218490540981, + 0.8103051093101503, + -0.08349389228224768, + 1.8251103843450545, + 0.40191861500740034, + 0.5704657346725464, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5632996891856195, + -0.0001370591828597778, + 1.187215044903755, + 1.339963426311314, + 0.27724807739257784, + 0.5678760509967802, + 0.6107980014324189, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0002876046346500516, + 0.000031505733204539865, + 0.0002759836206678301, + 0.00006468334322562441, + -0.0006845134194009006, + 0.00026760270702652633, + 0.00043154990999028087, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.909492552280426, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.00037748011527583003, + 0.0005291275447234511, + -0.00015418844122905284, + -0.00017428975843358785, + 0.0007537910132668912, + -0.00006510389357572421, + -0.00021084601758047938, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9276549816131592, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.08800079673528671, + 0.07691292464733124, + 0.125771164894104, + 0.12257508188486099, + 0.21586425602436066, + 0.07356905937194824, + 0.06248171627521515, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17170776426792145, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.05351067706942558, + 0.052141688764095306, + 0.07220736891031265, + 0.05641496554017067, + 0.0876786857843399, + 0.03790133446455002, + 0.0318601094186306, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.11763474345207214, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.3049057404041289, + -0.23326391571760174, + -0.449493436717987, + -0.46661893243789676, + -0.8206052811384201, + -0.264598342704773, + -0.22057663996219634, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.5, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.179220182299614, + -0.19677410819530483, + -0.2365414365530012, + -0.17656873760223402, + -0.29757825162410745, + -0.13061386151313792, + -0.11544653077125544, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.5, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.2864243935346604, + 0.27934236091375353, + 0.4529821054458618, + 0.3896261790275575, + 0.7331835649967196, + 0.24467797489166254, + 0.2423023993253708, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9999, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1760005448102948, + 0.19438928351402285, + 0.2754443703889846, + 0.20665088987350444, + 0.28490007309913645, + 0.1408833035707473, + 0.10577272950410843, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9999, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_tienkung_gello_s16_a16/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robomind_tienkung_gello_s16_a16/norm_stats_meta.json new file mode 100644 index 0000000..f366f10 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_tienkung_gello_s16_a16/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_gello_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_6626/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 102313, + "num_frames": 3274013, + "estimated_total_batches": null, + "train_episodes": 5402, + "train_bytes": 214477074867, + "elapsed_sec": 861.7713775634766, + "frames_per_sec": 3799.1665599950165 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_tienkung_gello_s16_a16/unified_action_space.json b/assets/cotrain_real_robot_fix/robomind_tienkung_gello_s16_a16/unified_action_space.json new file mode 100644 index 0000000..fd388aa --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_tienkung_gello_s16_a16/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9a0d9895669ad5b106f765ca2cb33f8c41f383ef7498ec7c090f1b00097964c7" +} diff --git a/assets/cotrain_real_robot_fix/robomind_tienkung_prod1_gello_s16_a16/norm_stats.json b/assets/cotrain_real_robot_fix/robomind_tienkung_prod1_gello_s16_a16/norm_stats.json new file mode 100644 index 0000000..bcdcf46 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_tienkung_prod1_gello_s16_a16/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.5683960318565369, + 0.22078832983970642, + -0.9512513875961304, + -0.4187726676464081, + -0.10543768852949142, + -0.6398162841796875, + -0.42031657695770264, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7417075634002686, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.4049739837646484, + -0.5157197117805481, + -0.6557912826538086, + 0.9174462556838989, + -0.31378185749053955, + 0.3021593987941742, + 0.06857848912477493, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.4635191261768341, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.064997598528862, + 0.07037549465894699, + 0.13303446769714355, + 0.11096090823411942, + 0.08682478964328766, + 0.11328177899122238, + 0.13669514656066895, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4326043128967285, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6458616256713867, + 0.26487383246421814, + 0.6870888471603394, + 0.4772903025150299, + 0.3747406303882599, + 0.3143857717514038, + 0.2010403573513031, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4886818826198578, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.7200056463241578, + 0.07263180047273636, + -1.2190638768672943, + -0.5876646458387375, + -0.2917385724902153, + -0.785775899887085, + -0.6443712908029556, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.3306755208015443, + -1.236551355423592, + -1.5572463144063948, + -0.05791391396522516, + -1.486474338889122, + -0.3266377056598663, + -0.3021904477119446, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.4484194566011429, + 0.3981429322063923, + -0.6136722717881203, + -0.19492976818084717, + 0.20381019022464752, + -0.33462102080285544, + -0.0783482120037079, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.5609298336505892, + -0.0006793295465874483, + 1.1604881446361541, + 1.7160904976725577, + 0.3718464797258374, + 0.7852976964950562, + 0.6216807430744171, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -1.9119422631774796e-6, + 0.00003626890611485578, + 0.000042202664189971983, + 2.2855781480757287e-6, + -0.000019521587091730908, + -0.00001689448436081875, + -0.00002351773582631722, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.995136022567749, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.020838096737861633, + 0.0010361943859606981, + -0.01129057165235281, + 0.014121136628091335, + 0.000757455884013325, + 0.00705363554880023, + -0.0017818119376897812, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.627912700176239, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0007892947178333998, + 0.0006520548486150801, + 0.0009216390899382532, + 0.0005412636674009264, + 0.0006694264011457562, + 0.0009917672723531723, + 0.0009289574227295816, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.49194738268852234, + 0.19771817326545715, + 0.34000205993652344, + 0.36470067501068115, + 0.19369961321353912, + 0.24002011120319366, + 0.07210414856672287, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4697430729866028, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.0017566436529159544, + -0.0015661208927631384, + -0.001643378257751467, + -0.0015505292415618896, + -0.001824682950973511, + -0.002112814867496482, + -0.0026672667026519936, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.9796605706214905, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.3261862396717072, + -0.548191284418106, + -1.2032444964885711, + -1.0167676458120347, + -0.6221477860212326, + -0.6264349913597107, + -0.27403422360420227, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.002321670353412627, + 0.0019566214606165887, + 0.0028617384910583493, + 0.00153787824511528, + 0.0016360209584236132, + 0.0017452585577964752, + 0.0024165729403495817, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9999959321141243, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.2985927095890046, + 0.5280053668022155, + 0.9517922229290008, + 1.048540046620369, + 0.6327526432275774, + 0.715945652127266, + 0.2349968707561494, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_tienkung_prod1_gello_s16_a16/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robomind_tienkung_prod1_gello_s16_a16/norm_stats_meta.json new file mode 100644 index 0000000..94e52cb --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_tienkung_prod1_gello_s16_a16/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_prod1_gello_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_prod1_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_2959/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 50624, + "num_frames": 1619947, + "estimated_total_batches": null, + "train_episodes": 2811, + "train_bytes": 247276602528, + "elapsed_sec": 426.9908273220062, + "frames_per_sec": 3793.868383918118 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_tienkung_prod1_gello_s16_a16/unified_action_space.json b/assets/cotrain_real_robot_fix/robomind_tienkung_prod1_gello_s16_a16/unified_action_space.json new file mode 100644 index 0000000..fd388aa --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_tienkung_prod1_gello_s16_a16/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9a0d9895669ad5b106f765ca2cb33f8c41f383ef7498ec7c090f1b00097964c7" +} diff --git a/assets/cotrain_real_robot_fix/robomind_tienkung_real_s38_a38/norm_stats.json b/assets/cotrain_real_robot_fix/robomind_tienkung_real_s38_a38/norm_stats.json new file mode 100644 index 0000000..e0dfdfa --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_tienkung_real_s38_a38/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.29493895173072815, + 0.22533413767814636, + -0.1456715613603592, + -0.37044036388397217, + 0.25953322649002075, + -0.2537669241428375, + -0.14796751737594604, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.6502549648284912, + 0.28052079677581787, + 0.018628237769007683, + -0.00005931760824751109, + -0.06009761989116669, + -0.08868148177862167, + -0.05306922644376755, + -0.08859807997941971, + -0.04932575672864914, + -0.08857344835996628, + -0.04816029965877533, + -0.0868636965751648, + 0.33901673555374146, + -0.36104950308799744, + 0.3739446997642517, + 0.5144957900047302, + -0.25866034626960754, + 0.25732022523880005, + 0.2567217946052551, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.649032711982727, + -0.2628367841243744, + 0.0007943143136799335, + 0.0005952698993496597, + -0.07441623508930206, + -0.11178402602672577, + -0.06531063467264175, + -0.10965787619352341, + -0.05747656151652336, + -0.11185495555400848, + -0.05255016312003136, + -0.11343297362327576, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.42973142862319946, + 0.34801846742630005, + 0.22365431487560272, + 0.386581152677536, + 0.2664882242679596, + 0.27903592586517334, + 0.29781287908554077, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.07958385348320007, + 0.15354761481285095, + 0.0561688095331192, + 0.00017206600750796497, + 0.13671790063381195, + 0.20638827979564667, + 0.11897336691617966, + 0.20618008077144623, + 0.11050467938184738, + 0.2060556411743164, + 0.11131685972213745, + 0.20966513454914093, + 0.38633567094802856, + 0.40089690685272217, + 0.3132394552230835, + 0.5028060674667358, + 0.2161499261856079, + 0.31141015887260437, + 0.23277568817138672, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08685781061649323, + 0.16592749953269958, + 0.04572189226746559, + 0.021475350484251976, + 0.1447831094264984, + 0.2241557538509369, + 0.1266137659549713, + 0.21892304718494415, + 0.11279409378767014, + 0.22407935559749603, + 0.11696896702051163, + 0.22903063893318176, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.551503319787979, + -0.00008664713095640764, + -1.0151768641114236, + -1.3711347912874714, + -0.09397810050845146, + -0.6224041401863099, + -0.6123663410186768, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.4750549368372108, + -0.1695621688306332, + -0.0018915223360061462, + -0.00034682036133017397, + -0.5079660029932856, + -0.7161228560261428, + -0.41106695767641066, + -0.7180858494855463, + -0.3930065343528986, + -0.7158253021121025, + -0.43914203009605407, + -0.7168896266222, + -0.09407012546062465, + -1.2874860653210445, + -0.17408913574218754, + -0.001973554491996765, + -0.709429707813263, + -0.6109878363609313, + -0.16301011209487914, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.6588345624923706, + -0.35074032955169676, + -0.12010887455940245, + -0.0012235018730163416, + -0.4831454958856106, + -0.7578432049751282, + -0.4005000331997871, + -0.7217107752307659, + -0.37308507491350174, + -0.7606093155652285, + -0.38641987323760985, + -0.7735595872879029, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.0888273763179781, + 1.1172733630652465, + 0.2808457560360431, + -0.0002945801234921497, + 0.9796338315457105, + 0.4171795751750469, + 0.3170011445522307, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.6579432766681867, + 0.34925238815546034, + 0.3117895703554154, + 0.00018126516474876553, + 0.00030309055969124366, + 0.000028632073849399475, + 0.0002895187854766723, + 0.00010798151530322375, + 0.0008826640248298379, + 0.00007219264842572848, + 0.001360881042480444, + 0.00013528634309745158, + 1.1458640512943268, + -0.00027783659604163624, + 1.2385047981381414, + 1.7348896422088147, + 0.18065005381107335, + 0.614627125453949, + 0.694216549706459, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -1.4432021089196205, + 0.1512626721620559, + 0.17926564176082604, + 0.000026741600036628288, + -0.00002473595589402855, + 0.00024811214208597665, + 0.004195320993661933, + -0.00017910952835265004, + 0.004062597829103454, + 0.0002905553966761065, + 0.01533390641212462, + -0.0003688353538513489, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0007787835202179849, + 0.0004752471577376127, + -0.0004414436989463866, + -0.001414016354829073, + 0.0013652392663061619, + -0.00017888400179799646, + -0.0015178258763626218, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.6531866788864136, + 0.28111645579338074, + 0.018650267273187637, + -0.00005974648956907913, + -0.0601251944899559, + -0.0887242928147316, + -0.053092923015356064, + -0.08864081650972366, + -0.04934830963611603, + -0.08861598372459412, + -0.048186045140028, + -0.0869021937251091, + -0.00015493706450797617, + -0.0017026631394401193, + 0.002548813121393323, + 0.00300780707038939, + -0.003767275018617511, + 0.0016496209427714348, + 0.004904294386506081, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.6519732475280762, + -0.26343226432800293, + 0.0008141772705130279, + 0.0005978844128549099, + -0.07443948835134506, + -0.11183939129114151, + -0.06535311043262482, + -0.10971058905124664, + -0.05751331150531769, + -0.11190853267908096, + -0.052590757608413696, + -0.11349154263734818, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.03156838193535805, + 0.04225211963057518, + 0.021983617916703224, + 0.055804066359996796, + 0.027310846373438835, + 0.01656007580459118, + 0.03123629465699196, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.056290168315172195, + 0.1533438116312027, + 0.05616537109017372, + 0.0001719870779197663, + 0.1367076188325882, + 0.20637281239032745, + 0.11896534264087677, + 0.20616476237773895, + 0.11049602925777435, + 0.20604068040847778, + 0.11130741983652115, + 0.20963548123836517, + 0.04685088247060776, + 0.09096518158912659, + 0.04924608767032623, + 0.10160861164331436, + 0.05757398530840874, + 0.05817423388361931, + 0.06416540592908859, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.06600471585988998, + 0.16580142080783844, + 0.04570968449115753, + 0.021479224786162376, + 0.1447719931602478, + 0.2241283804178238, + 0.12659254670143127, + 0.21889713406562805, + 0.11277542263269424, + 0.22405214607715607, + 0.116791270673275, + 0.22902773320674896, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.09061183040142051, + -0.12404775338172913, + -0.0704024293661118, + -0.2184853252649307, + -0.06330916590690605, + -0.04272201628684996, + -0.06422994765043255, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.5703161955150513, + -0.1695621688306332, + -0.0015250724613666555, + -0.0003453201183583588, + -0.5081007151834667, + -0.7161228560261428, + -0.4112192991763354, + -0.7180858494855463, + -0.39313467007130387, + -0.7158253021121025, + -0.43934326486587527, + -0.7167883361458778, + -0.14155023992061622, + -0.38511696057319633, + -0.11559314941167831, + -0.28750722980499266, + -0.24779948472976687, + -0.16634117028713225, + -0.09492523908615103, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.65917573107481, + -0.35003675141334534, + -0.11971547834873197, + -0.0012235018730163416, + -0.48335779817700386, + -0.7578432049751282, + -0.400345036894083, + -0.7218900377564061, + -0.3732176400005818, + -0.7603991222307086, + -0.386447157740593, + -0.7735595872879029, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.09489202313423162, + 0.1605967822551727, + 0.05606685764789576, + 0.17829083396196377, + 0.08422680478096012, + 0.03788482583761216, + 0.03299186817407607, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.6579432766681867, + 0.34925238815546034, + 0.31197279529273514, + 0.00017976492177695035, + 0.00016837836951022478, + 0.000028632073849399475, + 0.00028995392620556615, + 0.00010798151530322375, + 0.0004982568696141332, + 0.00007219264842572848, + 0.0011596462726592982, + 0.00015841935873028845, + 0.15761798739433286, + 0.2344477727532388, + 0.1723205381035804, + 0.43932262992858884, + 0.1318270815849305, + 0.22612803225517264, + 0.25317158517837535, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -1.5372755635619164, + 0.1512626721620559, + 0.17887224555015568, + 0.000026741600036628288, + -0.00006495730280886569, + 0.00024811214208597665, + 0.003885328382253639, + -0.00017910952835265004, + 0.003930032742023526, + 0.0000803620621562251, + 0.015655354213714556, + -0.0003688353538513489, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_tienkung_real_s38_a38/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robomind_tienkung_real_s38_a38/norm_stats_meta.json new file mode 100644 index 0000000..18a2a87 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_tienkung_real_s38_a38/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_real_s38_a38", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_tiangong_joint_position_none_real_s38_a38_fps30_cam_chest_cam_head__episodes_146/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 3735, + "num_frames": 119501, + "estimated_total_batches": null, + "train_episodes": 139, + "train_bytes": 6479063622, + "elapsed_sec": 51.39154028892517, + "frames_per_sec": 2325.304891197284 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_tienkung_real_s38_a38/unified_action_space.json b/assets/cotrain_real_robot_fix/robomind_tienkung_real_s38_a38/unified_action_space.json new file mode 100644 index 0000000..710243d --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_tienkung_real_s38_a38/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "b214ec84bd00be699f7085aa13f8ce94a5ec68921992fce7c0a2940630f38cc4" +} diff --git a/assets/cotrain_real_robot_fix/robomind_tienkung_xsens_s14_a14/norm_stats.json b/assets/cotrain_real_robot_fix/robomind_tienkung_xsens_s14_a14/norm_stats.json new file mode 100644 index 0000000..8f7426a --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_tienkung_xsens_s14_a14/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.2495279163122177, + 0.17678681015968323, + -0.9840797781944275, + -0.6926301717758179, + 1.2251882553100586, + 0.08307325094938278, + 0.08522151410579681, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.34397265315055847, + -0.25304967164993286, + 0.9509468078613281, + 0.7654147744178772, + -1.22251558303833, + -0.13512815535068512, + -0.06612176448106766, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.26420679688453674, + 0.13415028154850006, + 0.47677046060562134, + 0.511353075504303, + 0.6439276337623596, + 0.20034494996070862, + 0.2428995817899704, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3252720534801483, + 0.1595543771982193, + 0.486541211605072, + 0.5197448134422302, + 0.6544333100318909, + 0.1909613460302353, + 0.23475730419158936, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0170531200945376, + 0.0, + -1.9335804850578309, + -1.6159020401239395, + -0.25997581577301027, + -0.4047948722839355, + -0.5596908693313598, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.08971182259917254, + -0.7222377280950547, + 0.0475586646986194, + 0.18000000715255737, + -2.268928050994873, + -0.6213911081552506, + -0.6453999876976013, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.11371559751033788, + 0.5683805625915528, + -0.04447098979949926, + -0.1803198071599008, + 2.268323050069809, + 0.5785365489721299, + 0.6123555083274841, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.1841395626425744, + -0.0002228440999985093, + 2.0089757517626508, + 1.6936134419083595, + 0.35395139241218576, + 0.32321631383895877, + 0.5418778296709061, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0014831935986876488, + 0.00015102946781553328, + -0.004482831805944443, + -0.0021639675833284855, + -0.005934550892561674, + 0.0005814277101308107, + -0.00021758537332061678, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.005549073684960604, + -0.0006271626916714013, + 0.011006377637386322, + 0.00345456856302917, + 0.01563883200287819, + -0.0009500636951997876, + 0.005533472169190645, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.07221410423517227, + 0.039718322455883026, + 0.10084698349237442, + 0.08547154814004898, + 0.1351594477891922, + 0.0650010034441948, + 0.07518996298313141, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0988258570432663, + 0.05644811689853668, + 0.13093487918376923, + 0.0978231281042099, + 0.16362877190113068, + 0.06877110153436661, + 0.09312713146209717, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.21402704918384552, + -0.13221379663944244, + -0.42410457556247705, + -0.35352271614074704, + -0.5879369888305663, + -0.23091356999874113, + -0.27450559234619143, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.42848923683166507, + -0.21466804106235504, + -0.3375219912767411, + -0.2965521077394486, + -0.4419407671213149, + -0.23360881233215336, + -0.27623119473457325, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.2823349166870117, + 0.14318757643699642, + 0.28834942476749426, + 0.26326848864555363, + 0.3942917404174806, + 0.23076029906272888, + 0.2654346179962157, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2984188953399658, + 0.186484931564331, + 0.5955430841207503, + 0.3762691063404082, + 0.7537251217126846, + 0.2303286559104918, + 0.3970500724315644, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_tienkung_xsens_s14_a14/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robomind_tienkung_xsens_s14_a14/norm_stats_meta.json new file mode 100644 index 0000000..4499b07 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_tienkung_xsens_s14_a14/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_xsens_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_xsens_1rgb_real_s14_a14_fps30_cam_top__episodes_6126/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 103821, + "num_frames": 3322263, + "estimated_total_batches": null, + "train_episodes": 5775, + "train_bytes": 286470910041, + "elapsed_sec": 845.7928259372711, + "frames_per_sec": 3927.986734007127 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_tienkung_xsens_s14_a14/unified_action_space.json b/assets/cotrain_real_robot_fix/robomind_tienkung_xsens_s14_a14/unified_action_space.json new file mode 100644 index 0000000..afc0e4f --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_tienkung_xsens_s14_a14/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "f93c8bfa8b83fa2fe49ad228c9db87bc4dd52e69118c7113e7db614a87543653" +} diff --git a/assets/cotrain_real_robot_fix/robomind_ur5e_s7_a7/norm_stats.json b/assets/cotrain_real_robot_fix/robomind_ur5e_s7_a7/norm_stats.json new file mode 100644 index 0000000..3128de2 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_ur5e_s7_a7/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 2.695399284362793, + -1.8317350149154663, + -1.590991497039795, + -1.160853624343872, + 1.3332312107086182, + 1.140396237373352, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2627898156642914, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5578770637512207, + 0.2017889767885208, + 0.21438661217689514, + 0.2472410500049591, + 0.4078080952167511, + 0.5581804513931274, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.306593120098114, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.819643810081482, + -2.436006836152077, + -2.2742806310653685, + -1.6289931789040566, + 0.1827675726890564, + 0.06774346570968626, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.018836079356074332, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 4.076547850751877, + -1.423432668375969, + -1.087432373046875, + -0.6889212518930434, + 2.1168328925490383, + 2.24854149518013, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9015686275437474, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.19636471569538116, + -0.0574476420879364, + 0.013684072531759739, + 0.09973897784948349, + -0.03993012756109238, + -0.14549808204174042, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3047395348548889, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5691956281661987, + 0.24521367251873016, + 0.22722239792346954, + 0.256473571062088, + 0.4543776214122772, + 0.5897438526153564, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.37293967604637146, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.8262648647785187, + -0.6060506603240967, + -0.6010523344516754, + -0.47804851830005646, + -1.4664543380737305, + -1.7500526297569277, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6849125693798066, + 0.605481555557251, + 0.5930862262487411, + 0.7191051467657088, + 1.1790077186584473, + 1.1551714324951172, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_ur5e_s7_a7/norm_stats_meta.json b/assets/cotrain_real_robot_fix/robomind_ur5e_s7_a7/norm_stats_meta.json new file mode 100644 index 0000000..34a61b6 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_ur5e_s7_a7/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_ur5e_s7_a7", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/ur5e_master_puppet_joint_position_h5_ur_1rgb_real_s7_a7_fps30_cam_top__episodes_26380/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 118080, + "num_frames": 3778539, + "estimated_total_batches": null, + "train_episodes": 25061, + "train_bytes": 185868082632, + "elapsed_sec": 956.0188310146332, + "frames_per_sec": 3952.3688000892153 +} \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/robomind_ur5e_s7_a7/unified_action_space.json b/assets/cotrain_real_robot_fix/robomind_ur5e_s7_a7/unified_action_space.json new file mode 100644 index 0000000..eee1142 --- /dev/null +++ b/assets/cotrain_real_robot_fix/robomind_ur5e_s7_a7/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "6e093b089d4d4b4b7aa30decfa7266d28c6c842db12723952347da59fbb2cae4" +} From e31fed896f37f562077fb37de4ef9bfcb356fbd4 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Sat, 18 Jul 2026 19:32:48 +0800 Subject: [PATCH 16/64] add norm, clean config --- .../agibot/norm_stats.json | 664 ++++++++++++++++ .../agibot/norm_stats_meta.json | 14 + .../agibot/unified_action_space.json | 5 + .../droid/norm_stats.json | 664 ++++++++++++++++ .../droid/norm_stats_meta.json | 14 + .../droid/unified_action_space.json | 5 + .../egoverse_aria/norm_stats.json | 664 ++++++++++++++++ .../egoverse_aria/norm_stats_meta.json | 14 + .../egoverse_aria/unified_action_space.json | 5 + .../full_norm_run_meta.json | 527 +++++++++++++ .../piper2/norm_stats.json | 664 ++++++++++++++++ .../piper2/norm_stats_meta.json | 14 + .../piper2/unified_action_space.json | 5 + .../piper30/norm_stats.json | 664 ++++++++++++++++ .../piper30/norm_stats_meta.json | 14 + .../piper30/unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../robocoin_aloha_s26_a26/norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../robocoin_yinhe_s49_a16/norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++ .../norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + .../robomind_ur5e_s7_a7/norm_stats.json | 664 ++++++++++++++++ .../robomind_ur5e_s7_a7/norm_stats_meta.json | 14 + .../unified_action_space.json | 5 + ...00\346\234\257\350\247\204\350\214\203.md" | 737 ++++++++++++++++++ scripts/audit_unified_action_space.py | 9 +- .../compute_agibot_full_norm_stats_light.py | 2 +- scripts/count_cotrain_frames.py | 3 +- scripts/preflight_cotrain_baige.py | 10 +- scripts/train_cotrain.py | 2 +- src/openpi/cotrain/config-fps30.py | 240 ------ src/openpi/cotrain/config.py | 186 +---- tests/cotrain/test_unified_config.py | 19 + 115 files changed, 25234 insertions(+), 406 deletions(-) create mode 100644 assets/cotrain_full_all_full_norm/agibot/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/agibot/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/agibot/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/droid/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/droid/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/droid/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/egoverse_aria/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/egoverse_aria/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/egoverse_aria/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/full_norm_run_meta.json create mode 100644 assets/cotrain_full_all_full_norm/piper2/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/piper2/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/piper2/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/piper30/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/piper30/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/piper30/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_agilex_cobot_magic_s26_a26/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_agilex_cobot_magic_s26_a26/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_agilex_cobot_magic_s26_a26/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_agilex_decoupled_magic_s14_a14_fps30/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_airbot_mmk2_s36_a36/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_airbot_mmk2_s36_a36/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_airbot_mmk2_s36_a36/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_aloha_s26_a26/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_aloha_s26_a26/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_aloha_s26_a26/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_alpha_bot_2_s28_a28/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_alpha_bot_2_s28_a28/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_alpha_bot_2_s28_a28/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_discover_aitbot_mmk2_s36_a36/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s14_a14/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s14_a14/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s14_a14/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s16_a18/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s16_a18/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s16_a18/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_upper_s14_a14/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_leju_robot_s118_a54/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_leju_robot_s118_a54/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_leju_robot_s118_a54/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aida_l_s28_a28/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aida_l_s28_a28/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aida_l_s28_a28/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aidal_s28_a28/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aidal_s28_a28/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aidal_s28_a28/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s17_a17/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s17_a17/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s17_a17/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s41_a34/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s41_a34/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s41_a34/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28_high/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28_high/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28_high/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_unknown_s30_a30_high/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_unknown_s30_a30_high/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_unknown_s30_a30_high/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_yinhe_s49_a16/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_yinhe_s49_a16/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robocoin_yinhe_s49_a16/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_agilex_cobot_magic_s14_a14/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_agilex_cobot_magic_s14_a14/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_agilex_cobot_magic_s14_a14/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_fr3_dual_s16_a16/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_fr3_dual_s16_a16/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_fr3_dual_s16_a16/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_panda_s8_a8/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_panda_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_panda_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_sim_franka_s8_a8/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_sim_franka_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_sim_franka_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_sim_none_s8_a8/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_sim_none_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_sim_none_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_no_front_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_s8_a8/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_s8_a8/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_s8_a8/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_tienkung_gello_s16_a16/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_tienkung_gello_s16_a16/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_tienkung_gello_s16_a16/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_tienkung_prod1_gello_s16_a16/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_tienkung_prod1_gello_s16_a16/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_tienkung_prod1_gello_s16_a16/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_tienkung_real_s38_a38/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_tienkung_real_s38_a38/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_tienkung_real_s38_a38/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_tienkung_xsens_s14_a14/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_tienkung_xsens_s14_a14/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_tienkung_xsens_s14_a14/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_ur5e_s7_a7/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_ur5e_s7_a7/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/robomind_ur5e_s7_a7/unified_action_space.json create mode 100644 "docs/\346\250\241\345\236\213\350\276\223\345\205\245\350\276\223\345\207\272\346\212\200\346\234\257\350\247\204\350\214\203.md" delete mode 100644 src/openpi/cotrain/config-fps30.py diff --git a/assets/cotrain_full_all_full_norm/agibot/norm_stats.json b/assets/cotrain_full_all_full_norm/agibot/norm_stats.json new file mode 100644 index 0000000..3b0685f --- /dev/null +++ b/assets/cotrain_full_all_full_norm/agibot/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.9210807681083679, + 0.5359001755714417, + 0.6545957326889038, + -0.7835156917572021, + 0.49938780069351196, + 1.1667169332504272, + 0.18891742825508118, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 68.11420440673828, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9076082110404968, + -0.46920207142829895, + -0.6356353163719177, + 0.7388717532157898, + -0.563096821308136, + -1.190690040588379, + -0.2128467708826065, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 62.9249153137207, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.015158376656472683, + 0.43660369515419006, + 0.46915775537490845, + 0.28688758611679077, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.1222560405731201, + 0.7990611791610718, + 0.9331700801849365, + 0.4298188388347626, + 0.5488388538360596, + 0.4325656592845917, + 0.7940273284912109, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 38.27954864501953, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0739389657974243, + 0.7449344992637634, + 0.9927517175674438, + 0.43602320551872253, + 0.58744877576828, + 0.409100741147995, + 0.741567075252533, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 36.552215576171875, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.044218555092811584, + 0.09825704991817474, + 0.14466187357902527, + 0.10195881873369217, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -2.3409746315956115, + -1.636828637123108, + -1.6977303141593931, + -1.4809685335159302, + -0.8208179449558255, + -0.6260671993255615, + -2.3568282432556154, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 34.4988072265625, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.9538713235855103, + -1.5447361523151397, + -2.1905040143489836, + -0.29421191997528084, + -2.4507909409999846, + -1.73033405251503, + -2.070129588508606, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 34.645408143234256, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.14006894874572756, + 0.05231554777622224, + -9.386273188283635e-7, + -0.00002157160452043172, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.9056857607841486, + 1.5327249885797505, + 2.1687543660163886, + 0.024525047016143775, + 1.6984838352680205, + 1.7286521408081055, + 1.8420831871032712, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 122.81813722076416, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.2422985345840454, + 1.4218171607971195, + 1.6568048201084142, + 1.475336287808418, + 0.9665897595882411, + 0.12981792721748353, + 2.1170754617691045, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 121.32148989295959, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08697387295961378, + 0.523526303935051, + 0.6805916502833599, + 0.44983564859252584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0007903198711574078, + 0.00011111732601420954, + 0.003278969321399927, + 0.0018502098973840475, + -0.0018388478783890605, + -0.0026262151077389717, + 0.0018169175600633025, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.42531853914260864, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0017990715568885207, + 0.00021451868815347552, + -0.005517459008842707, + -0.0024181653279811144, + 0.002791187958791852, + 0.002916863653808832, + -0.0025791008956730366, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3584616482257843, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.015158386901021004, + 0.43660271167755127, + 0.4691601097583771, + 0.28689104318618774, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.06166767701506615, + 0.06289893388748169, + 0.054367028176784515, + 0.06547970324754715, + 0.0702083557844162, + 0.07014007121324539, + 0.09278079867362976, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4933164119720459, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.06577219814062119, + 0.07637953013181686, + 0.06400372833013535, + 0.0757603719830513, + 0.07687703520059586, + 0.07965576648712158, + 0.10504146665334702, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.477949857711792, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.04421856254339218, + 0.09826167672872543, + 0.14465774595737457, + 0.10195144265890121, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.2101372690677643, + -0.2321174460649491, + -0.17257755661010732, + -0.20412157559394828, + -0.2611778012275696, + -0.27466095159053805, + -0.31812099928855897, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.21728988885879508, + -0.24020811669826514, + -0.24614887866973878, + -0.2764002819538116, + -0.24440300831794737, + -0.2453194079399108, + -0.3429291203022, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.14006894874572756, + 0.05231554777622224, + -9.386273188283635e-7, + -0.00002157160452043172, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.20963992025852196, + 0.1999978750944138, + 0.2047261504173281, + 0.24245942616462712, + 0.22355237565040564, + 0.21409198014736175, + 0.31090978384017953, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22425809392929086, + 0.27321109790802, + 0.18851629810333237, + 0.22489868850708006, + 0.27490250425338747, + 0.2988687011241915, + 0.3503418828487397, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08697387295961378, + 0.523526303935051, + 0.6805916502833599, + 0.44983564859252584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/agibot/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/agibot/norm_stats_meta.json new file mode 100644 index 0000000..dbd5f23 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/agibot/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "agibot", + "builder_dir": "/mnt/bos/bo23lu/AgiBot/agibot_world_robot_agibot_world_beta_mobile_dual_arm_joint_absolute_position_real_s20_a20_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_22986/agibot_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1059832, + "num_frames": 33914594, + "estimated_total_batches": null, + "train_episodes": 21837, + "train_bytes": 7547826566949, + "elapsed_sec": 9102.592523097992, + "frames_per_sec": 3725.8170036658357 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/agibot/unified_action_space.json b/assets/cotrain_full_all_full_norm/agibot/unified_action_space.json new file mode 100644 index 0000000..cf12aa9 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/agibot/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "5e45fd3b2852b2a3e91da045db1d52fa4b8cd7429974403773734c355b6a795c" +} diff --git a/assets/cotrain_full_all_full_norm/droid/norm_stats.json b/assets/cotrain_full_all_full_norm/droid/norm_stats.json new file mode 100644 index 0000000..c9937ea --- /dev/null +++ b/assets/cotrain_full_all_full_norm/droid/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.014264719560742378, + 0.23982040584087372, + -0.014591705054044724, + -2.0273144245147705, + -0.03576287254691124, + 2.323211669921875, + 0.0828426331281662, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3599560260772705, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.32424554228782654, + 0.5158682465553284, + 0.28870725631713867, + 0.5025275349617004, + 0.5316236019134521, + 0.46866557002067566, + 0.7423588037490845, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4027109742164612, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9240023367881773, + -0.8884155247688293, + -0.932663969230652, + -2.7749946952819826, + -1.845044603061676, + 1.1692317866563797, + -2.0730253297805787, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.982635237503052, + 1.4446059867143632, + 0.8277577193260188, + -0.44634648761749274, + 1.7120736752033237, + 3.5038524341106414, + 2.212446826171875, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.991, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0009084727498702705, + 0.04833802580833435, + -0.0012050201185047626, + 0.03542366996407509, + -0.0021518415305763483, + 0.019638868048787117, + 0.006257439497858286, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.40670886635780334, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17263764142990112, + 0.32643333077430725, + 0.16556227207183838, + 0.29040563106536865, + 0.2672358453273773, + 0.28381240367889404, + 0.3206557035446167, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.43752798438072205, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5209945830345153, + -0.7863647277832031, + -0.5066786664962768, + -0.82759104347229, + -0.8665996181488036, + -0.7820417912006377, + -0.9812896099090573, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5199369877338409, + 1.044959797668457, + 0.4928590750694273, + 0.9082127244472509, + 0.8440616558074954, + 0.8804159455299381, + 0.9947045337677007, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/droid/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/droid/norm_stats_meta.json new file mode 100644 index 0000000..3eaccb2 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/droid/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "droid", + "builder_dir": "/mnt/bos/bo23lu/DROID/droid_infidata/1.1.0", + "split": "train", + "batch_size": 32, + "num_batches": 578829, + "num_frames": 18522518, + "estimated_total_batches": null, + "train_episodes": 64124, + "train_bytes": 1185946441420, + "elapsed_sec": 4512.591522216797, + "frames_per_sec": 4104.629880371018 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/droid/unified_action_space.json b/assets/cotrain_full_all_full_norm/droid/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/droid/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_full_all_full_norm/egoverse_aria/norm_stats.json b/assets/cotrain_full_all_full_norm/egoverse_aria/norm_stats.json new file mode 100644 index 0000000..488a717 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_aria/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.1237354576587677, + 0.22281472384929657, + 0.4135497510433197, + -0.5345580577850342, + 0.4574829339981079, + 0.5661123394966125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.23999233543872833, + 0.2156621366739273, + 0.4135463237762451, + 0.392553448677063, + -0.37075382471084595, + 0.6305035948753357, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09448008239269257, + 0.1390148252248764, + 0.13480989634990692, + 0.6640503406524658, + 0.36818432807922363, + 0.47777312994003296, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09318281710147858, + 0.12346088886260986, + 0.12323341518640518, + 0.5742001533508301, + 0.33239632844924927, + 0.4351201057434082, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.40826590067148205, + -0.0633718746900559, + 0.10133763028979298, + -2.376308674287796, + -0.42891319904327396, + -0.6833999870300294, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.009949410390853897, + -0.04882786560058594, + 0.11043006829023364, + -0.9852206703186033, + -1.1525526161193849, + -0.5167706930160523, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09921277326345446, + 0.6891006307601928, + 0.6761623608112335, + 0.8519294291496275, + 1.300363561630249, + 1.800707028961181, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4527019081532955, + 0.5603916673779488, + 0.649153945991397, + 1.9130708467483526, + 0.30745352001190196, + 1.7899679994583124, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.1237083300948143, + 0.2224075198173523, + 0.4124659299850464, + -0.5308079719543457, + 0.45824843645095825, + 0.5701283812522888, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.23988841474056244, + 0.21513883769512177, + 0.4124043583869934, + 0.38800638914108276, + -0.3718161880970001, + 0.6356124877929688, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.094383604824543, + 0.13944111764431, + 0.13589079678058624, + 0.6678398251533508, + 0.36833837628364563, + 0.48809731006622314, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09314189106225967, + 0.12398742139339447, + 0.12469295412302017, + 0.5789963006973267, + 0.33315789699554443, + 0.4461691379547119, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.40860332000255584, + -0.0633718746900559, + 0.08884144049584863, + -2.3750520615577697, + -0.42769023103713977, + -0.6846564903259278, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.009949410390853897, + -0.04882786560058594, + 0.09366739218831063, + -1.0379854053497315, + -1.1543685441493987, + -0.5180270866394046, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.098537934601307, + 0.6887713211297988, + 0.6759431294113397, + 0.9034505510807032, + 1.300975045633316, + 1.9866695167541497, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4527019081532955, + 0.5621253598451614, + 0.649153945991397, + 1.9118145435333256, + 0.30745352001190196, + 1.9834526174545282, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/egoverse_aria/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/egoverse_aria/norm_stats_meta.json new file mode 100644 index 0000000..d5e0545 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_aria/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_full_all_full_norm", + "dataset_id": "egoverse_aria", + "builder_dir": "/mnt/bos/bo23lu/EgoVerse_full/aria_bimanual_front_1/ego_verse_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 129135, + "num_frames": 4132315, + "estimated_total_batches": null, + "train_episodes": 910, + "train_bytes": 238580138454, + "elapsed_sec": 1016.5545732975006, + "frames_per_sec": 4065.0203231053233 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/egoverse_aria/unified_action_space.json b/assets/cotrain_full_all_full_norm/egoverse_aria/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_aria/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git a/assets/cotrain_full_all_full_norm/full_norm_run_meta.json b/assets/cotrain_full_all_full_norm/full_norm_run_meta.json new file mode 100644 index 0000000..7e242c9 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/full_norm_run_meta.json @@ -0,0 +1,527 @@ +{ + "config_name": "cotrain_real_robot", + "output_assets_dir": "/data/wudi/Atom-0/assets/cotrain_real_robot", + "dataset_id": null, + "skip_dataset_ids": [], + "copy_from_assets_name": null, + "datasets": [ + { + "config_name": "cotrain_real_robot", + "dataset_id": "piper30", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 69490, + "num_frames": 2223663, + "estimated_total_batches": null, + "train_episodes": 5307, + "train_bytes": 350058169358, + "elapsed_sec": 558.5227379798889, + "frames_per_sec": 3981.3294048559737 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "piper2", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_2/realworld_piper_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 21548, + "num_frames": 689528, + "estimated_total_batches": null, + "train_episodes": 902, + "train_bytes": 111529419925, + "elapsed_sec": 182.0517978668213, + "frames_per_sec": 3787.537437583667 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "agibot", + "builder_dir": "/mnt/bos/bo23lu/AgiBot/agibot_world_robot_agibot_world_beta_mobile_dual_arm_joint_absolute_position_real_s20_a20_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_22986/agibot_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1059832, + "num_frames": 33914594, + "estimated_total_batches": null, + "train_episodes": 21837, + "train_bytes": 7547826566949, + "elapsed_sec": 9102.592523097992, + "frames_per_sec": 3725.8170036658357 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "droid", + "builder_dir": "/mnt/bos/bo23lu/DROID/droid_infidata/1.1.0", + "split": "train", + "batch_size": 32, + "num_batches": 578829, + "num_frames": 18522518, + "estimated_total_batches": null, + "train_episodes": 64124, + "train_bytes": 1185946441420, + "elapsed_sec": 4512.591522216797, + "frames_per_sec": 4104.629880371018 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_cobot_magic_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Agilex_Cobot_Magic_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_8284/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 187608, + "num_frames": 6003434, + "estimated_total_batches": null, + "train_episodes": 7870, + "train_bytes": 690618678004, + "elapsed_sec": 1551.8257114887238, + "frames_per_sec": 3868.6264543462707 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_airbot_mmk2_s36_a36", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Airbot_MMK2_s36_a36_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10532/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 81017, + "num_frames": 2592540, + "estimated_total_batches": null, + "train_episodes": 10005, + "train_bytes": 431087330611, + "elapsed_sec": 690.6267569065094, + "frames_per_sec": 3753.8945227269173 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_upper_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Galaxea_R1_Lite_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_3650/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 27171, + "num_frames": 869469, + "estimated_total_batches": null, + "train_episodes": 1337, + "train_bytes": 205435325084, + "elapsed_sec": 271.46593260765076, + "frames_per_sec": 3202.8659789758667 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_realman_rmc_aida_l_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Realman_RMC-AIDA-L_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_693/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 9936, + "num_frames": 317940, + "estimated_total_batches": null, + "train_episodes": 658, + "train_bytes": 36471840854, + "elapsed_sec": 89.87298893928528, + "frames_per_sec": 3537.6591315416026 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s14_a14_fps30", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_7778/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 142767, + "num_frames": 4568537, + "estimated_total_batches": null, + "train_episodes": 7389, + "train_bytes": 1807557839316, + "elapsed_sec": 1851.0555272102356, + "frames_per_sec": 2468.0712884314917 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s14_a14_fps50", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s14_a14_fps50_cam_high_cam_left_wrist_cam_right_wrist__episodes_3397/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 54108, + "num_frames": 1731438, + "estimated_total_batches": null, + "train_episodes": 3227, + "train_bytes": 264209590712, + "elapsed_sec": 452.58451652526855, + "frames_per_sec": 3825.667774260525 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_23712/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 413112, + "num_frames": 13219572, + "estimated_total_batches": null, + "train_episodes": 18406, + "train_bytes": 1649570846072, + "elapsed_sec": 3489.1643438339233, + "frames_per_sec": 3788.750169753891 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_aloha_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/aloha_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_4879/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 198055, + "num_frames": 6337741, + "estimated_total_batches": null, + "train_episodes": 4634, + "train_bytes": 962548578236, + "elapsed_sec": 1664.1732065677643, + "frames_per_sec": 3808.3421695456377 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_alpha_bot_2_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/alpha_bot_2_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_857/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 22703, + "num_frames": 726485, + "estimated_total_batches": null, + "train_episodes": 814, + "train_bytes": 109263908150, + "elapsed_sec": 205.29979014396667, + "frames_per_sec": 3538.6543721771545 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_discover_aitbot_mmk2_s36_a36", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/discover_robotics_aitbot_mmk2_s36_a36_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5747/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 36260, + "num_frames": 1160293, + "estimated_total_batches": null, + "train_episodes": 5460, + "train_bytes": 194302774076, + "elapsed_sec": 348.6094217300415, + "frames_per_sec": 3328.34664720713 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/galaxea_r1_lite_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5167/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 245253, + "num_frames": 7848088, + "estimated_total_batches": null, + "train_episodes": 4886, + "train_bytes": 3346209600799, + "elapsed_sec": 3871.8957114219666, + "frames_per_sec": 2026.9368249894735 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_s16_a18", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/galaxea_r1_lite_s16_a18_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_970/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 9866, + "num_frames": 315700, + "estimated_total_batches": null, + "train_episodes": 922, + "train_bytes": 100400838947, + "elapsed_sec": 127.63867783546448, + "frames_per_sec": 2473.388202962743 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_leju_robot_s118_a54", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/leju_robot_s118_a54_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_17897/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 458510, + "num_frames": 14672292, + "estimated_total_batches": null, + "train_episodes": 17002, + "train_bytes": 4898931416952, + "elapsed_sec": 5203.681373596191, + "frames_per_sec": 2819.598462436255 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_leju_robot_s54_a54", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/leju_robot_s54_a54_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_394/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 2062, + "num_frames": 65982, + "estimated_total_batches": null, + "train_episodes": 374, + "train_bytes": 22504353358, + "elapsed_sec": 31.398486614227295, + "frames_per_sec": 2101.4388626648715 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_realman_rmc_aidal_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/realman_rmc_aidal_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_18412/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 492790, + "num_frames": 15769266, + "estimated_total_batches": null, + "train_episodes": 17481, + "train_bytes": 1684550435506, + "elapsed_sec": 4069.850043296814, + "frames_per_sec": 3874.655290057317 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_ruantong_a2d_s17_a17", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/ruantong_a2d_s17_a17_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_1719/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 32248, + "num_frames": 1031909, + "estimated_total_batches": null, + "train_episodes": 1633, + "train_bytes": 232098850893, + "elapsed_sec": 277.61806178092957, + "frames_per_sec": 3717.009597215209 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_ruantong_a2d_s41_a34", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/ruantong_a2d_s41_a34_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_6459/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 85004, + "num_frames": 2720116, + "estimated_total_batches": null, + "train_episodes": 6136, + "train_bytes": 1133795856617, + "elapsed_sec": 1135.4377226829529, + "frames_per_sec": 2395.654068611155 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unitree_g1_s28_a28_high", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unitree_g1_s28_a28_fps30_cam_high__episodes_227/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 2287, + "num_frames": 73184, + "estimated_total_batches": null, + "train_episodes": 216, + "train_bytes": 3159483310, + "elapsed_sec": 28.13194966316223, + "frames_per_sec": 2601.4549605081866 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unitree_g1_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unitree_g1_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_931/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 19765, + "num_frames": 632462, + "estimated_total_batches": null, + "train_episodes": 884, + "train_bytes": 137723586828, + "elapsed_sec": 202.07107949256897, + "frames_per_sec": 3129.898655404859 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unknown_s30_a30_high", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unknown_s30_a30_fps30_cam_high__episodes_891/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 8154, + "num_frames": 260914, + "estimated_total_batches": null, + "train_episodes": 846, + "train_bytes": 20178322671, + "elapsed_sec": 82.17656183242798, + "frames_per_sec": 3175.041571245681 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_yinhe_s49_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/yinhe_s49_a16_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5452/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 153600, + "num_frames": 4915186, + "estimated_total_batches": null, + "train_episodes": 5179, + "train_bytes": 711128217385, + "elapsed_sec": 1323.132462978363, + "frames_per_sec": 3714.810223109443 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_agilex_cobot_magic_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/agilex_cobot_magic_agilex_dual_arm_h5_agilex_3rgb_real_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10374/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 196965, + "num_frames": 6302870, + "estimated_total_batches": null, + "train_episodes": 9855, + "train_bytes": 1015824843385, + "elapsed_sec": 1625.2714269161224, + "frames_per_sec": 3878.0414739459275 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_fr3_dual_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_fr3_dual_master_puppet_joint_position_h5_franka_fr3_dual_real_s16_a16_fps30_cam_high_cam_left_cam_right_cam_top__episodes_1774/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 11198, + "num_frames": 358321, + "estimated_total_batches": null, + "train_episodes": 1685, + "train_bytes": 186172127608, + "elapsed_sec": 205.53938150405884, + "frames_per_sec": 1743.3204156689756 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_panda_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_panda_master_puppet_joint_position_h5_franka_3rgb_real_s8_a8_fps30_cam_left_cam_right_cam_top__episodes_17219/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 57958, + "num_frames": 1854642, + "estimated_total_batches": null, + "train_episodes": 14956, + "train_bytes": 282424151738, + "elapsed_sec": 465.4217314720154, + "frames_per_sec": 3984.8633499218436 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_franka_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_sim_franka_3rgb_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_14488/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 48250, + "num_frames": 1543972, + "estimated_total_batches": null, + "train_episodes": 8445, + "train_bytes": 675920469639, + "elapsed_sec": 665.9570224285126, + "frames_per_sec": 2318.4258863577616 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_simulation_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_11422/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 53134, + "num_frames": 1700279, + "estimated_total_batches": null, + "train_episodes": 8662, + "train_bytes": 465501426716, + "elapsed_sec": 452.24869179725647, + "frames_per_sec": 3759.6106541359254 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_simulation_no_front_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_handeye_cam_left_external_cam_right_external__episodes_158/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1067, + "num_frames": 34125, + "estimated_total_batches": null, + "train_episodes": 150, + "train_bytes": 7133719955, + "elapsed_sec": 11.634025812149048, + "frames_per_sec": 2933.2064885367827 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_none_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_none_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_222/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1107, + "num_frames": 35418, + "estimated_total_batches": null, + "train_episodes": 211, + "train_bytes": 6706236456, + "elapsed_sec": 11.181196451187134, + "frames_per_sec": 3167.6395414946483 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_gello_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_6626/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 102313, + "num_frames": 3274013, + "estimated_total_batches": null, + "train_episodes": 5402, + "train_bytes": 214477074867, + "elapsed_sec": 861.7713775634766, + "frames_per_sec": 3799.1665599950165 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_prod1_gello_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_prod1_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_2959/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 50624, + "num_frames": 1619947, + "estimated_total_batches": null, + "train_episodes": 2811, + "train_bytes": 247276602528, + "elapsed_sec": 426.9908273220062, + "frames_per_sec": 3793.868383918118 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_xsens_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_xsens_1rgb_real_s14_a14_fps30_cam_top__episodes_6126/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 103821, + "num_frames": 3322263, + "estimated_total_batches": null, + "train_episodes": 5775, + "train_bytes": 286470910041, + "elapsed_sec": 845.7928259372711, + "frames_per_sec": 3927.986734007127 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_real_s38_a38", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_tiangong_joint_position_none_real_s38_a38_fps30_cam_chest_cam_head__episodes_146/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 3735, + "num_frames": 119501, + "estimated_total_batches": null, + "train_episodes": 139, + "train_bytes": 6479063622, + "elapsed_sec": 51.39154028892517, + "frames_per_sec": 2325.304891197284 + }, + { + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_ur5e_s7_a7", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/ur5e_master_puppet_joint_position_h5_ur_1rgb_real_s7_a7_fps30_cam_top__episodes_26380/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 118080, + "num_frames": 3778539, + "estimated_total_batches": null, + "train_episodes": 25061, + "train_bytes": 185868082632, + "elapsed_sec": 956.0188310146332, + "frames_per_sec": 3952.3688000892153 + } + ] +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/piper2/norm_stats.json b/assets/cotrain_full_all_full_norm/piper2/norm_stats.json new file mode 100644 index 0000000..f4b690f --- /dev/null +++ b/assets/cotrain_full_all_full_norm/piper2/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.08570596575737, + 0.9424582123756409, + -0.5610473155975342, + -0.018378613516688347, + 0.15650981664657593, + -0.04922034963965416, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.008945055305957794, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.22233717143535614, + 1.3927223682403564, + -0.8957882523536682, + 0.17042388021945953, + 0.3040333390235901, + -0.07112878561019897, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01350892148911953, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1714383214712143, + 0.7361369132995605, + 0.5368331670761108, + 0.3496498763561249, + 0.4911200702190399, + 0.28332507610321045, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.02536850981414318, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2436714768409729, + 0.651149570941925, + 0.6894615888595581, + 0.3136552572250366, + 0.6569122076034546, + 0.2134801149368286, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.030022503808140755, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4991710331201553, + 0.0054144344157539305, + -1.7947804824004416, + -1.1790875864982606, + -0.9716636402130128, + -0.539963323020935, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.002318800112977624, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.2646023983061313, + 0.08680244942149147, + -2.2326956740360706, + -0.39387080802917473, + -0.9721601041316986, + -0.6741397899150849, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.003800000064074993, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.38600136826038356, + 2.2529563539030497, + -0.002522718032682114, + 0.6737772881984712, + 1.2084734504699708, + 0.8707268574714662, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09907970115607603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7167606556713582, + 2.391043433867162, + 0.00008864541053776875, + 1.1195562719345094, + 1.2258558490276337, + 0.3745928731918333, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09959649641532452, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0010017158929258585, + 0.0017170342616736889, + -0.0017244319897145033, + -0.005731134209781885, + 0.002714053960517049, + 0.002033872064203024, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.008943209424614906, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0010065166279673576, + 0.0033344815019518137, + -0.00027303790557198226, + 0.0020667631179094315, + 0.001737685059197247, + -0.0029692337848246098, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01350709330290556, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.08381801843643188, + 0.31304702162742615, + 0.23983915150165558, + 0.10776226967573166, + 0.18366022408008575, + 0.09571901708841324, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.025366676971316338, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1489294171333313, + 0.33599135279655457, + 0.27681979537010193, + 0.1537630707025528, + 0.19053618609905243, + 0.09432122856378555, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.030021704733371735, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.3243094861030579, + -0.9993304105758667, + -0.7881305526733398, + -0.4524798871994018, + -0.6921295278072357, + -0.2691142694234848, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.002318800112977624, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5554006125926971, + -1.084025181722641, + -0.9235458539009094, + -0.5143094916582107, + -0.686023402261734, + -0.3556695580482483, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.003800000064074993, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.3279062141418456, + 1.0899867341041567, + 0.9700191698074341, + 0.33629278821945197, + 0.6258798820972444, + 0.406562376332283, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09907970115607603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4854212229251862, + 1.2325074484825134, + 0.9927912852764131, + 0.5601088427543641, + 0.6361501549243929, + 0.30015870928764343, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09959649641532452, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/piper2/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/piper2/norm_stats_meta.json new file mode 100644 index 0000000..c3f6eff --- /dev/null +++ b/assets/cotrain_full_all_full_norm/piper2/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "piper2", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_2/realworld_piper_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 21548, + "num_frames": 689528, + "estimated_total_batches": null, + "train_episodes": 902, + "train_bytes": 111529419925, + "elapsed_sec": 182.0517978668213, + "frames_per_sec": 3787.537437583667 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/piper2/unified_action_space.json b/assets/cotrain_full_all_full_norm/piper2/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_full_all_full_norm/piper2/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_full_all_full_norm/piper30/norm_stats.json b/assets/cotrain_full_all_full_norm/piper30/norm_stats.json new file mode 100644 index 0000000..6130c4e --- /dev/null +++ b/assets/cotrain_full_all_full_norm/piper30/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0760473981499672, + 1.0517759323120117, + -0.7747761011123657, + 0.15242573618888855, + 0.4494738280773163, + -0.09137012809515, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.016618814319372177, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07727460563182831, + 0.7200653553009033, + -0.4604390561580658, + -0.2260405272245407, + 0.24460497498512268, + 0.16355007886886597, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01185830868780613, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.28079867362976074, + 0.8831034302711487, + 0.7211003303527832, + 0.7177441716194153, + 0.5327411890029907, + 0.6071151494979858, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03437401354312897, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2081252783536911, + 0.8027406930923462, + 0.5713866949081421, + 0.6549085378646851, + 0.4776606559753418, + 0.4999569356441498, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.031229877844452858, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4875116139650345, + -0.00043919531644787645, + -2.2551212312346323, + -1.5829997071027755, + -0.6845841318130493, + -1.615586260795593, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0029380800276063383, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4486167727947235, + -0.005599666852504015, + -1.8685801381547935, + -1.7327060890197754, + -0.762030679988861, + -0.9720964525461196, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0035174399364739655, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.8876427154064179, + 2.4845687208327694, + 0.0026788388188001555, + 1.7340745076179505, + 1.2515803995132444, + 1.6471686191558836, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09956015744088217, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6083275032162665, + 2.198549814021401, + 0.005637001402210462, + 1.3888049545288084, + 1.2151789251804352, + 1.545086481523514, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09957936216918752, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0020336343441158533, + -0.0003478959552012384, + 0.0036158752627670765, + -0.0018518087454140186, + -0.002676568226888776, + 0.0017340786289423704, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.01780613325536251, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.002196062356233597, + 0.0025906015653163195, + -0.0007922314689494669, + -0.0006751723121851683, + -0.0008008037693798542, + -0.000598791753873229, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.012778770178556442, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.13291876018047333, + 0.4570249021053314, + 0.3580925762653351, + 0.3361109495162964, + 0.2754795253276825, + 0.30054646730422974, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03545059636235237, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09071528911590576, + 0.31943845748901367, + 0.23047679662704468, + 0.20181375741958618, + 0.183805450797081, + 0.1964036524295807, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03226304054260254, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.5487480565547943, + -1.598214064502716, + -1.1666529998779296, + -1.2725653482437136, + -1.0261658200979231, + -1.0280169901371001, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0029380800276063383, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.3517950798034668, + -1.1833345177173613, + -0.9023950806617738, + -0.7187113502502438, + -0.6822588787078857, + -0.7689471103668215, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0035174399364739655, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.40653051655292516, + 1.6554438406944278, + 1.3955223114013675, + 1.2879812050342556, + 1.0254203120470047, + 1.127150822353363, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09956015744088217, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3331105176448823, + 1.3341810100555422, + 0.9261858076095582, + 0.7806027033805849, + 0.7630852434158326, + 0.6658555793762204, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09957936216918752, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/piper30/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/piper30/norm_stats_meta.json new file mode 100644 index 0000000..cc22714 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/piper30/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "piper30", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 69490, + "num_frames": 2223663, + "estimated_total_batches": null, + "train_episodes": 5307, + "train_bytes": 350058169358, + "elapsed_sec": 558.5227379798889, + "frames_per_sec": 3981.3294048559737 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/piper30/unified_action_space.json b/assets/cotrain_full_all_full_norm/piper30/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_full_all_full_norm/piper30/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_agilex_cobot_magic_s26_a26/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_agilex_cobot_magic_s26_a26/norm_stats.json new file mode 100644 index 0000000..6693060 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_agilex_cobot_magic_s26_a26/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.19811221957206726, + 0.772533118724823, + -0.8077450394630432, + -0.028649263083934784, + 0.8329925537109375, + 0.1338183581829071, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6504519581794739, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.213411346077919, + 0.936856210231781, + -0.8555614352226257, + 0.052240047603845596, + 0.8344802260398865, + -0.13020701706409454, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6270856261253357, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.28874093294143677, + 0.9208551049232483, + 0.47005847096443176, + 0.3561064600944519, + 0.4977680742740631, + 0.4375063478946686, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.40372464060783386, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.29861217737197876, + 0.9481472373008728, + 0.46235257387161255, + 0.424010694026947, + 0.45311257243156433, + 0.437126100063324, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.40041401982307434, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0729224056005477, + -0.01197078370004892, + -2.2129377588272092, + -1.6497411670684814, + -1.1689142931699754, + -0.6284993870735169, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.000586399725265801, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.14700397849082947, + -0.01449557845443487, + -2.117433346748352, + -1.4916880182743073, + -1.008069571685791, + -1.5053448512077332, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0001424004912376417, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.1663727890253066, + 2.4838475979313257, + -0.36945127830505387, + 1.2129275941848756, + 1.2130273148536679, + 2.074979570531845, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9997992000000551, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0338315951824188, + 2.445226298929751, + -0.36191145629882815, + 1.535950502681732, + 1.217853112411499, + 0.877599804019928, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9997936999998986, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.00009146828961092979, + -0.0016088075935840607, + 0.0007087555713951588, + -0.000026479769076104276, + 0.00020575610687956214, + 0.00001443375185772311, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6503733396530151, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0000202807059395127, + -0.0018799782264977694, + 0.0007903146906755865, + -0.00026286765933036804, + 0.0001462479995097965, + 0.00015752519539091736, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6271259188652039, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.12023629993200302, + 0.322498619556427, + 0.1985558718442917, + 0.14494362473487854, + 0.19618654251098633, + 0.1817934215068817, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4035850465297699, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13321657478809357, + 0.34202784299850464, + 0.2128268927335739, + 0.15731655061244965, + 0.1797640025615692, + 0.19996008276939392, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.40015628933906555, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4558506237030029, + -1.2673018789291381, + -0.63129927778244, + -0.4630223393440245, + -0.5986795719146729, + -0.6356411955833434, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.000586399725265801, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5149496856689453, + -1.3162814127922058, + -0.6802423383712766, + -0.5557396152496339, + -0.549421439886093, + -0.7112965393543245, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0001424004912376417, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4595871042251587, + 1.1543425884246825, + 0.8348300868988039, + 0.4428232517242434, + 0.6962429767608644, + 0.6384128303527827, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9997992000000551, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.49019248924255354, + 1.2172323634624478, + 0.8798893958568579, + 0.5399059474945069, + 0.6080126795768739, + 0.7685098371028896, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9997936999998986, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_agilex_cobot_magic_s26_a26/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_agilex_cobot_magic_s26_a26/norm_stats_meta.json new file mode 100644 index 0000000..f32d261 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_agilex_cobot_magic_s26_a26/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_cobot_magic_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Agilex_Cobot_Magic_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_8284/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 187608, + "num_frames": 6003434, + "estimated_total_batches": null, + "train_episodes": 7870, + "train_bytes": 690618678004, + "elapsed_sec": 1551.8257114887238, + "frames_per_sec": 3868.6264543462707 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_agilex_cobot_magic_s26_a26/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_agilex_cobot_magic_s26_a26/unified_action_space.json new file mode 100644 index 0000000..ed9f81b --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_agilex_cobot_magic_s26_a26/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9fbd0a367f6d113a176cae2124ffec508f6202dee702a6b29236e6e8f60d0775" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats.json new file mode 100644 index 0000000..8c2d277 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.17712397873401642, + 0.810139000415802, + -0.6855402588844299, + -0.11222872883081436, + 0.6206351518630981, + -0.015597881749272346, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.12833420932292938, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.20979192852973938, + 0.7679632306098938, + -0.6718887686729431, + 0.12151588499546051, + 0.6151161789894104, + -0.0631631389260292, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1681675761938095, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.2495959997177124, + 0.8154167532920837, + 0.6811779141426086, + 0.31063228845596313, + 0.35135722160339355, + 0.36757487058639526, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.16275501251220703, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2519766390323639, + 0.8133144378662109, + 3.9310410022735596, + 0.27127107977867126, + 3.887181282043457, + 0.3052545189857483, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.16318519413471222, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.8187637863636017, + -0.02233026457130909, + -2.2677624532647433, + -1.1966205580234528, + -0.281935452222824, + -0.8411327709198, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.036514745473861694, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.20716872844696044, + -0.017633342403545978, + -2.928503234863282, + -0.45736086540222165, + -0.40014072451591487, + -1.0153934538841247, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.022415564626455307, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.28984460719823835, + 2.3611703608632086, + 0.030060533820092772, + 0.5438134195804598, + 1.2402318687438965, + 1.1925266407012938, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5767497708797455, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8714975715160369, + 2.347538023441285, + -0.006531738281250199, + 0.9904942384719853, + 1.255498284292221, + 0.6571380303382872, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5836906126737594, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.000010739619938249234, + -0.00011467040894785896, + 0.00014792964793741703, + 0.0007788547081872821, + 0.0009138808236457407, + 0.0005021721590310335, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1263725459575653, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.00003737088627531193, + -9.091671017813496e-6, + 0.000014992138858360704, + -0.0002670294779818505, + -0.000504948606248945, + -0.0003584008663892746, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.16686192154884338, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.13647353649139404, + 0.3363063931465149, + 0.29653409123420715, + 0.17680639028549194, + 0.2150084674358368, + 0.16584904491901398, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.16264137625694275, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1296338587999344, + 0.3418736457824707, + 4.995156764984131, + 0.17120759189128876, + 4.817986965179443, + 0.17061470448970795, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.16310515999794006, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.46183118805885304, + -1.1268640749931336, + -0.9779461513519287, + -0.6261398021697997, + -0.6543991428375244, + -0.5273366480827333, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.036514745473861694, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4657173981189727, + -1.2373619970321654, + -2.843096435547068, + -0.5746413822174072, + -1.665887695312449, + -0.6153451510906218, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.022415564626455307, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4982637989044192, + 1.243240743112564, + 1.0069862585067746, + 0.5738323686599736, + 0.8133578369140624, + 0.5755800625801086, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5767497708797455, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.44999427776336676, + 1.1858594246387484, + -0.3609619140625, + 0.5913829717636108, + -0.011474609375, + 0.5490435281276707, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5836906126737594, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats_meta.json new file mode 100644 index 0000000..442082b --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_agilex_decoupled_magic_s14_a14_fps30/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_agilex_decoupled_magic_s14_a14_fps30", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_7778/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 142767, + "num_frames": 4568537, + "estimated_total_batches": null, + "train_episodes": 7389, + "train_bytes": 1807557839316, + "elapsed_sec": 1851.0555272102356, + "frames_per_sec": 2468.0712884314917 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_agilex_decoupled_magic_s14_a14_fps30/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_agilex_decoupled_magic_s14_a14_fps30/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_agilex_decoupled_magic_s14_a14_fps30/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_airbot_mmk2_s36_a36/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_airbot_mmk2_s36_a36/norm_stats.json new file mode 100644 index 0000000..2950c4d --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_airbot_mmk2_s36_a36/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.656104564666748, + -0.9286631345748901, + 1.1376307010650635, + 0.26833200454711914, + -0.7974550127983093, + 0.666283369064331, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6109161972999573, + 1.1354148387908936, + 0.05313194915652275, + 0.04620625823736191, + 0.2840001881122589, + 0.20867326855659485, + 0.2837749719619751, + 0.229059636592865, + 0.28277507424354553, + 0.29497388005256653, + 0.19066499173641205, + 0.6302139759063721, + -0.5758194327354431, + -0.9821283221244812, + 1.1268115043640137, + -0.312242329120636, + 0.6558502316474915, + -0.5029338598251343, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7588454484939575, + 1.1244360208511353, + 0.027878623455762863, + 0.028719335794448853, + 0.41041722893714905, + 0.3171558082103729, + 0.4310058355331421, + 0.3283737301826477, + 0.4280836880207062, + 0.4432540833950043, + 0.3348432183265686, + 0.7939622402191162, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.37944644689559937, + 0.20388081669807434, + 0.32835978269577026, + 1.0097854137420654, + 0.5454671382904053, + 0.9213322997093201, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5214293003082275, + 1.5734562873840332, + 0.1687859445810318, + 0.26329222321510315, + 0.6345346570014954, + 0.9055659770965576, + 0.566385805606842, + 1.1926363706588745, + 0.7770596742630005, + 1.4154009819030762, + 1.1830897331237793, + 2.1479766368865967, + 0.3583245575428009, + 0.25541460514068604, + 0.28430697321891785, + 0.8124368786811829, + 0.4906386733055115, + 0.7573658227920532, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.3276747465133667, + 2.0278005599975586, + 0.0906292200088501, + 0.18109284341335297, + 0.7365971207618713, + 0.843729555606842, + 0.5977146625518799, + 1.1447561979293823, + 0.7890268564224243, + 1.423203706741333, + 0.937105655670166, + 1.9108370542526245, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.2660007301330565, + -1.4333736974075437, + 0.4356580541580915, + -1.9504818211078643, + -1.6451347438812256, + -1.8191361523151397, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.02764731553643942, + 0.6425251462459565, + -0.045348355709016325, + -0.027506217300891866, + -0.022329308092594147, + -0.09238497734069828, + -0.024358250200748444, + -0.09911597261428828, + -0.039008110761642456, + -0.11104497890472415, + -0.0007199482643045485, + -0.04047631531506777, + -1.4152819886207582, + -1.6223039834365247, + 0.5030766827851535, + -2.9765801676273345, + -1.0918529442310332, + -2.2726008594036102, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.03560483766421676, + 0.533134201271506, + -0.018681111001968342, + -0.06725717177391055, + -0.014882088518142697, + -0.10332602539062496, + -0.01015378902256489, + -0.14988748073577884, + -0.04092251509428024, + -0.09312500059604645, + -0.027990717440843582, + -0.09531154389381413, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.3870359558820726, + -0.4766218247368932, + 2.0458251606374978, + 2.9873292702674874, + 1.2033420748710633, + 2.8095779489994044, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.436717178581655, + 1.5006087846755982, + 0.7540547889098526, + 0.16416254246234896, + 1.1690624284669757, + 1.8746440391540524, + 1.3250284303724764, + 1.9000630604505542, + 1.4752081572890283, + 1.8975300592899322, + 1.5322988895563174, + 1.916251375775039, + 0.09408731651306135, + -0.44272861089557414, + 1.842128035542369, + 1.3823009697437287, + 1.6149869574546818, + 2.057234740734101, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5249140445381404, + 1.432080620987946, + 0.5501983883857726, + 0.1652949625492096, + 1.2420855182886126, + 1.8982259277343752, + 1.4232810721755027, + 1.844093188524246, + 1.5325359046399594, + 1.9072029188483954, + 1.5810911833979189, + 1.8818939134597779, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.008245001547038555, + 0.003524184925481677, + -0.0033301268704235554, + -0.005722424481064081, + -0.028624283149838448, + -0.013749456964433193, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6072289347648621, + 1.1415867805480957, + 0.04519025981426239, + 0.048069972544908524, + 0.2835055887699127, + 0.21826808154582977, + 0.28481268882751465, + 0.23658189177513123, + 0.28419241309165955, + 0.29990312457084656, + 0.1941748708486557, + 0.6240943074226379, + 0.005694512277841568, + -0.0015219070482999086, + 0.0012326255673542619, + 0.0017124107107520103, + 0.013287597335875034, + 0.003072197549045086, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7632090449333191, + 1.1186587810516357, + 0.026140810921788216, + 0.03224867209792137, + 0.4089101254940033, + 0.32769083976745605, + 0.4338189363479614, + 0.3394289016723633, + 0.4323977828025818, + 0.4540572166442871, + 0.3410424292087555, + 0.7965958714485168, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.14493174850940704, + 0.11448817700147629, + 0.1269613653421402, + 0.1739502102136612, + 0.18158121407032013, + 0.1614755392074585, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5181316137313843, + 1.554349660873413, + 0.16171063482761383, + 0.26538777351379395, + 0.6293736100196838, + 0.9130929708480835, + 0.5623818039894104, + 1.1972023248672485, + 0.7720032334327698, + 1.4170503616333008, + 1.183464765548706, + 2.0660579204559326, + 0.15685060620307922, + 0.1503192037343979, + 0.15110182762145996, + 0.2234863042831421, + 0.1935572475194931, + 0.17087143659591675, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.3793450593948364, + 1.940362811088562, + 0.08931182324886322, + 0.1979440450668335, + 0.7187049388885498, + 0.8383364677429199, + 0.5950126051902771, + 1.1504135131835938, + 0.7922107577323914, + 1.421832799911499, + 0.9409822821617126, + 1.8833327293395996, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.463122957611084, + -0.3534732172966003, + -0.47352954545021053, + -0.495609849691391, + -0.6788331735134125, + -0.6095462135314942, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.02764731553643942, + 0.6563652049303055, + -0.045348355709016325, + -0.02539996719360349, + -0.022329308092594147, + -0.09238497734069828, + -0.024358250200748444, + -0.07714697225093836, + -0.039008110761642456, + -0.11104497890472415, + -0.0007199482643045485, + -0.04047631531506777, + -0.5393749005317688, + -0.4192069751739502, + -0.516749444961548, + -0.7370876592636111, + -0.5087261302947998, + -0.5691930844306947, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.03560483766421676, + 0.5849964947166852, + -0.018681111001968342, + -0.06725717177391055, + -0.005501733243465423, + -0.10332602539062496, + -0.01015378902256489, + -0.14988748073577884, + -0.04092251509428024, + -0.07114337510764598, + -0.027990717440843582, + -0.09531154389381413, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4853410655975341, + 0.4104335291147232, + 0.4124767607688904, + 0.5189733442783355, + 0.48261117458343517, + 0.4103264465332028, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.4217746837437153, + 1.5006087846755982, + 0.7503308612175286, + 0.16416254246234896, + 1.2192262910589577, + 1.8746440391540524, + 1.3543629234284162, + 1.9000630604505542, + 1.4936742093384268, + 1.8975300592899322, + 1.5541991586680406, + 1.916251375775039, + 0.47509324531555164, + 0.49790313148498533, + 0.4241397476196289, + 0.7494047117233276, + 0.7297798655986787, + 0.6161350169181823, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5249140445381404, + 1.432080620987946, + 0.5355839768886566, + 0.1652949625492096, + 1.2702265841126443, + 1.8982259277343752, + 1.4551351802021264, + 1.844093188524246, + 1.5616740235239268, + 1.9291845443367959, + 1.6142681298069657, + 1.8818939134597779, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_airbot_mmk2_s36_a36/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_airbot_mmk2_s36_a36/norm_stats_meta.json new file mode 100644 index 0000000..730f37f --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_airbot_mmk2_s36_a36/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_airbot_mmk2_s36_a36", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Airbot_MMK2_s36_a36_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10532/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 81017, + "num_frames": 2592540, + "estimated_total_batches": null, + "train_episodes": 10005, + "train_bytes": 431087330611, + "elapsed_sec": 690.6267569065094, + "frames_per_sec": 3753.8945227269173 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_airbot_mmk2_s36_a36/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_airbot_mmk2_s36_a36/unified_action_space.json new file mode 100644 index 0000000..c4f3388 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_airbot_mmk2_s36_a36/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "d6e787ab780ebbd92810789ae8513778330304683dedcb7f65a2b300e65955ce" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_aloha_s26_a26/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_aloha_s26_a26/norm_stats.json new file mode 100644 index 0000000..de7f907 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_aloha_s26_a26/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.10469576716423035, + 0.662298321723938, + -0.8370406031608582, + -0.10997393727302551, + 0.904748260974884, + 0.07077445834875107, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7056493759155273, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.27609941363334656, + 1.1175321340560913, + -0.9066898822784424, + 0.14160014688968658, + 0.6277921199798584, + -0.06411521136760712, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5476592779159546, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.22630704939365387, + 0.9324061870574951, + 0.5762600898742676, + 0.2787526547908783, + 0.4267621338367462, + 0.27670159935951233, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3804008364677429, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.28160029649734497, + 0.9456371068954468, + 0.5779625177383423, + 0.4162033498287201, + 0.7083861827850342, + 0.6169491410255432, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3376106917858124, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.7981000185012819, + -0.00996200017258525, + -2.4786146493900567, + -1.187614440536499, + -0.8754767679214477, + -0.5012200522422794, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.12335600751638409, + -0.011225800144672393, + -2.364402155338973, + -0.8539300444126129, + -1.2095284074306487, + -1.7727100169658663, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.17913497328758243, + 2.635528483106941, + -0.2574722047377378, + 0.6021799695491787, + 1.2177728406429291, + 1.1242267260074614, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9938087919116021, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9705784217238427, + 2.609351033627987, + -0.2859095926374198, + 1.5181279491424564, + 1.2223220269680022, + 1.4456859633922576, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9828610047101975, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.00021051804651506245, + -0.008932504802942276, + 0.0005696771549992263, + -0.0027484409511089325, + -0.0041058543138206005, + -0.0012933430261909962, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7096610069274902, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0023133684881031513, + -0.007879610173404217, + -0.00265696132555604, + -0.005429517012089491, + -0.00999925285577774, + -0.0018341426039114594, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5347478985786438, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.10313262045383453, + 0.26865464448928833, + 0.1893138587474823, + 0.1421351581811905, + 0.21144385635852814, + 0.11594098061323166, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3865589499473572, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.11798860132694244, + 0.32088905572891235, + 0.22832293808460236, + 0.20490100979804993, + 0.25481829047203064, + 0.2950364947319031, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3538452088832855, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.3765264230728149, + -1.035756023645401, + -0.6352756193161011, + -0.5489855407714845, + -0.7912163681030273, + -0.38275416326522826, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.41121598720550545, + -1.0773520893096924, + -0.7255493785858156, + -0.6334800750732423, + -0.9088775737762451, + -1.1001116996288298, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4181219642162324, + 0.9378215560436245, + 0.7591589970588686, + 0.4850448505401608, + 0.8666135650634765, + 0.399302637004852, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0348727851867676, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4695387895107268, + 1.0134398870468138, + 0.8453243877410888, + 0.7469199135780338, + 0.9517094232559207, + 1.151939422655106, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.986791200876236, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_aloha_s26_a26/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_aloha_s26_a26/norm_stats_meta.json new file mode 100644 index 0000000..b0badf7 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_aloha_s26_a26/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_aloha_s26_a26", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/aloha_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_4879/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 198055, + "num_frames": 6337741, + "estimated_total_batches": null, + "train_episodes": 4634, + "train_bytes": 962548578236, + "elapsed_sec": 1664.1732065677643, + "frames_per_sec": 3808.3421695456377 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_aloha_s26_a26/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_aloha_s26_a26/unified_action_space.json new file mode 100644 index 0000000..0667d62 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_aloha_s26_a26/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "67e063860a9fbe208d546d4b111c935599875ffd6e1810a7b5d300da746fc215" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_alpha_bot_2_s28_a28/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_alpha_bot_2_s28_a28/norm_stats.json new file mode 100644 index 0000000..1fb88cd --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_alpha_bot_2_s28_a28/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.12981835007667542, + 0.3803384602069855, + 0.2765718102455139, + -1.5070769786834717, + -0.2064417600631714, + -0.05623231828212738, + -0.3460264205932617, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 746.6767578125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.19400940835475922, + 0.31934040784835815, + -0.35299500823020935, + -1.4869228601455688, + 0.357273131608963, + 0.013851415365934372, + 0.2367955446243286, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 779.4723510742188, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.2857164740562439, + 0.19170787930488586, + 0.20447394251823425, + 0.2694042921066284, + 0.38139572739601135, + 0.24085566401481628, + 0.34607115387916565, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 397.1971435546875, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2606230676174164, + 0.24536000192165375, + 0.14477461576461792, + 0.2577556073665619, + 0.5735127925872803, + 0.18255352973937988, + 0.37184131145477295, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 382.7496643066406, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.899166699886322, + 0.07630084578692914, + -0.059025124704837784, + -2.0594145153187213, + -1.1295509833812714, + -0.7071796939969063, + -1.1954483671784402, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.40404443359375, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.21597237800359725, + -0.05071561908125878, + -0.7550483275800943, + -2.029019742440432, + -1.0360802779436111, + -0.3993901081085205, + -0.2278318267703056, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.2564, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.37486589574813856, + 0.901134452560544, + 0.8977918334484101, + -0.7051934836871923, + 1.031851346349716, + 0.6692254953861236, + 0.42736211544275293, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1009.909061767578, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9338733216404915, + 0.9485346036761999, + -0.05054059450328352, + -0.7290169551871717, + 1.6272616389274597, + 0.5994619083404542, + 1.411613534462452, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1005.2062000000001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0006919320439919829, + -0.0019002234330400825, + -0.0010903198271989822, + -0.0009687251294963062, + 0.0009565133950673044, + 0.0017697216244414449, + -0.0055458988063037395, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 746.5861206054688, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.003108932636678219, + -0.003951332066208124, + 0.0004939803038723767, + 0.002362956991419196, + -0.002410163637250662, + 0.00205172598361969, + 0.005838938523083925, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 778.9148559570312, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.08611934632062912, + 0.051137592643499374, + 0.06047236919403076, + 0.10187217593193054, + 0.0747617855668068, + 0.06468275189399719, + 0.08414533734321594, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 397.2435607910156, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.07241197675466537, + 0.043015606701374054, + 0.04393547773361206, + 0.09733308106660843, + 0.08626998215913773, + 0.06080825254321098, + 0.06849385052919388, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 383.0844421386719, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.2659748669624329, + -0.16955485401153564, + -0.22237293572425842, + -0.38058049020767215, + -0.25508818566799163, + -0.19396575808525085, + -0.33569938838481905, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.40404443359375, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.26165361976623525, + -0.1465015360713005, + -0.14308811855316161, + -0.3606649603843688, + -0.2566977259159088, + -0.18858413553237918, + -0.19983974138498306, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.2564, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.31394535303115845, + 0.18444163522720336, + 0.19062521643638597, + 0.29662441864013656, + 0.2051439446210861, + 0.24560414199829106, + 0.26784982144832603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1009.909061767578, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.23274346752166752, + 0.15374321049451822, + 0.16777842110395425, + 0.3051075954437257, + 0.3131138361454009, + 0.2351794544696808, + 0.2710840149283409, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1005.2062000000001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_alpha_bot_2_s28_a28/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_alpha_bot_2_s28_a28/norm_stats_meta.json new file mode 100644 index 0000000..65587db --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_alpha_bot_2_s28_a28/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_alpha_bot_2_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/alpha_bot_2_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_857/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 22703, + "num_frames": 726485, + "estimated_total_batches": null, + "train_episodes": 814, + "train_bytes": 109263908150, + "elapsed_sec": 205.29979014396667, + "frames_per_sec": 3538.6543721771545 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_alpha_bot_2_s28_a28/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_alpha_bot_2_s28_a28/unified_action_space.json new file mode 100644 index 0000000..7c12829 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_alpha_bot_2_s28_a28/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "c8188bef9dda322c15e6f6fd6d51c66ced6ac424e8fb05dc7e607aa1709e3e58" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats.json new file mode 100644 index 0000000..9a50eed --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.789222240447998, + -0.9489473104476929, + 1.102475643157959, + 0.06056652218103409, + -0.8004094958305359, + 0.8569042086601257, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 43.4145393371582, + 58.51406478881836, + 6.561944484710693, + 3.8180127143859863, + 19.267641067504883, + 14.541945457458496, + 19.904767990112305, + 16.158863067626953, + 19.30022430419922, + 21.157934188842773, + 12.348743438720703, + 44.948116302490234, + -0.7468658089637756, + -0.9740761518478394, + 1.1814908981323242, + -0.2708401083946228, + 0.7773710489273071, + -0.5048773288726807, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 41.62311935424805, + 59.72103500366211, + 1.6600639820098877, + 2.397747278213501, + 21.124330520629883, + 16.384376525878906, + 23.463788986206055, + 16.421628952026367, + 23.28516960144043, + 26.225006103515625, + 18.233783721923828, + 47.79250717163086, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3196251094341278, + 0.19099053740501404, + 0.267301082611084, + 0.7343452572822571, + 0.5074834823608398, + 0.8002901077270508, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 18.43718147277832, + 11.881536483764648, + 12.745183944702148, + 3.668595314025879, + 17.491971969604492, + 25.543888092041016, + 18.778554916381836, + 28.954769134521484, + 20.36393928527832, + 33.26520919799805, + 20.258453369140625, + 38.15335464477539, + 0.3138468265533447, + 0.20916512608528137, + 0.2719564437866211, + 0.7614434361457825, + 0.5056568384170532, + 0.7291929721832275, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 20.863088607788086, + 12.029555320739746, + 5.3629679679870605, + 3.2656631469726562, + 17.44062042236328, + 25.945985794067383, + 20.877904891967773, + 27.181493759155273, + 22.829547882080078, + 35.53911209106445, + 24.12516212463379, + 39.613216400146484, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + 0.1670591546058655, + -1.460646178598702, + 0.6757955211639405, + -0.8247669435024263, + -1.6326164110422134, + -2.040982316064835, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.1410077957153328, + 35.85638677425385, + -1.2471387302875518, + -1.260823583698273, + 0.6530760291576385, + -1.0140843429565431, + 0.6394474706172943, + -1.961733321762085, + 0.6345568585395811, + -3.7215022659301757, + 0.6377890274167062, + -0.8760666087865829, + -1.524050800561905, + -1.514172021174431, + 0.6718438099384307, + -2.9777743816375732, + -1.145575943374634, + -1.595018073940277, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.0329510523796084, + 32.098736600399015, + -1.2586004912137985, + -1.7484696573257446, + 0.609222595214844, + -0.9381469581604005, + 0.5784229578018187, + -1.1616932260990143, + 0.6429713370800019, + -0.5089542884826661, + 0.42454957976341245, + -3.384034348487854, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.4689757689952851, + -0.5967689686983824, + 1.8580087474823, + 2.982538466739655, + 1.0367245502233509, + 2.3800237551689145, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 78.29060504226685, + 84.12461102142335, + 48.262709696531296, + 9.748627821445465, + 61.9573547662735, + 105.95414351844786, + 69.24682767877579, + 109.27585434875488, + 82.92672660541534, + 109.9159403591156, + 89.5799179440558, + 110.60623623168469, + -0.051988855361938535, + -0.5652352955192328, + 1.8889653580904007, + 0.7004047698974611, + 1.6166751742362973, + 2.2183819183826445, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 87.63163614215851, + 82.51696020936966, + 31.86803058552742, + 9.559157132148743, + 61.57964798583985, + 109.06843588314057, + 77.23728513393402, + 108.36883417010307, + 88.44751836946011, + 110.32461710197926, + 91.96601235146522, + 110.372048163414, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.01735016703605652, + 0.007876871153712273, + -0.008764179423451424, + -0.016196714714169502, + -0.050610072910785675, + -0.01787901297211647, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 42.77833557128906, + 59.01993179321289, + 5.597373008728027, + 3.9695675373077393, + 18.594154357910156, + 14.54702091217041, + 19.29161262512207, + 15.878710746765137, + 18.78414535522461, + 20.612062454223633, + 12.175747871398926, + 43.39402389526367, + 0.0064604626968503, + 0.0005611882661469281, + -0.002839392749592662, + 0.005142479669302702, + 0.02126043289899826, + 0.004430062603205442, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 41.64952087402344, + 59.36911392211914, + 1.4767431020736694, + 2.656665325164795, + 20.36819076538086, + 16.421306610107422, + 22.942644119262695, + 16.397327423095703, + 22.899627685546875, + 26.112388610839844, + 18.08662986755371, + 46.756378173828125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.17858079075813293, + 0.14265654981136322, + 0.1634504795074463, + 0.16256660223007202, + 0.22381845116615295, + 0.16158242523670197, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 18.521772384643555, + 11.979036331176758, + 12.285548210144043, + 3.6960418224334717, + 17.73102569580078, + 25.79263687133789, + 19.03911781311035, + 28.994144439697266, + 20.55314064025879, + 33.25821304321289, + 20.360509872436523, + 38.552024841308594, + 0.1852763444185257, + 0.14883209764957428, + 0.1630040854215622, + 0.19241678714752197, + 0.22506338357925415, + 0.11058518290519714, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 20.7370662689209, + 11.900763511657715, + 5.080607891082764, + 3.428765296936035, + 17.76552391052246, + 26.203529357910156, + 21.202436447143555, + 27.423065185546875, + 23.11931610107422, + 35.659122467041016, + 24.31511878967285, + 40.17205047607422, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.530792695760727, + -0.4047769084453583, + -0.5680815444231033, + -0.5259286925792694, + -0.7873582234382629, + -0.6316696793556211, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.1191337959289553, + 36.04583902816773, + -1.2471387302875518, + -1.2319020826339724, + 0.612784028673172, + -1.1057648468017578, + 0.6174649713516236, + -1.961733321762085, + 0.6345568585395811, + -3.7215022659301757, + 0.6377890274167062, + -0.8989019842147827, + -0.6441029361724854, + -0.3842984503507614, + -0.5623678423643113, + -0.5740927570819856, + -0.5532707916736603, + -0.31753806543350205, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.0329510523796084, + 32.50419783921242, + -1.2795799915790558, + -1.7369956575393677, + 0.609222595214844, + -1.0078890859127045, + 0.5372969587802885, + -1.207598727941513, + 0.6429713370800019, + -0.5318018604040147, + 0.44674683067798604, + -3.384034348487854, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.5975871762037279, + 0.46891435046195973, + 0.4889618165016174, + 0.5089293518066405, + 0.5531848000526427, + 0.45593350839614866, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 78.44372304077149, + 84.31406327533722, + 48.388156947612764, + 9.75184132156372, + 62.259544769906995, + 106.59590704536437, + 70.23604014573097, + 109.41469885177612, + 83.82831159305573, + 109.93952148437499, + 90.24482296959758, + 110.60623623168469, + 0.5124633223056794, + 0.4904771469831468, + 0.44247493512630465, + 0.6567382140159608, + 0.8311843288183209, + 0.3665271113872528, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 87.65422906808853, + 82.55221770839691, + 29.686162547540665, + 9.607921631240846, + 61.768294104003914, + 109.09168325905799, + 77.54573012659549, + 108.78198368668556, + 88.99643401732445, + 110.3474646739006, + 92.43215462067127, + 110.39570791435241, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats_meta.json new file mode 100644 index 0000000..f5f3479 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_discover_aitbot_mmk2_s36_a36/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_discover_aitbot_mmk2_s36_a36", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/discover_robotics_aitbot_mmk2_s36_a36_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5747/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 36260, + "num_frames": 1160293, + "estimated_total_batches": null, + "train_episodes": 5460, + "train_bytes": 194302774076, + "elapsed_sec": 348.6094217300415, + "frames_per_sec": 3328.34664720713 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_discover_aitbot_mmk2_s36_a36/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_discover_aitbot_mmk2_s36_a36/unified_action_space.json new file mode 100644 index 0000000..c4f3388 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_discover_aitbot_mmk2_s36_a36/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "d6e787ab780ebbd92810789ae8513778330304683dedcb7f65a2b300e65955ce" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s14_a14/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s14_a14/norm_stats.json new file mode 100644 index 0000000..7db58db --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s14_a14/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.1465437263250351, + 0.7869630455970764, + -0.5143190622329712, + -0.10306041687726974, + -0.017123211175203323, + -0.07089352607727051, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.24394427239894867, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.11253274977207184, + 0.9243168234825134, + -0.6134981513023376, + -0.08301904797554016, + 0.0349244549870491, + 0.0044456711038947105, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.28358498215675354, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3259853720664978, + 0.9173845052719116, + 0.6484797596931458, + 0.4867860972881317, + 0.29930099844932556, + 0.3141402006149292, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4647968113422394, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3464672863483429, + 0.9285209774971008, + 0.66539466381073, + 0.4866812229156494, + 0.318434476852417, + 0.42792943120002747, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5048031210899353, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0725928758382797, + -0.005822717398405078, + -1.9497726845741272, + -1.5304360511302948, + -1.0978304373025893, + -1.0819920077323915, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.02160907292770571, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9586778641700744, + -0.006923790359497084, + -1.9687591208517552, + -1.5304557082414627, + -0.838190191078186, + -1.5145600032806397, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.006071952342987061, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6792541539669039, + 2.5427422587573525, + 0.026177544593811053, + 1.1008840367794037, + 0.7871663888692857, + 0.968535971164703, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7061504119382762, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9739351847410203, + 2.5719604786753654, + 0.030489080250263534, + 1.004168446135521, + 1.0753058356285097, + 1.1564639692306518, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7056269750595094, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.00018698995700106025, + -0.0027333006728440523, + 0.0018787827575579286, + 0.00032728881342336535, + 0.0004975892370566726, + 0.0002555204264353961, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.24358518421649933, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.00009762104309629649, + -0.0025566816329956055, + 0.002047769259661436, + -0.0003735595673788339, + -0.00020275445422157645, + -0.0001948690478457138, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.28345298767089844, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.16635392606258392, + 0.3440786600112915, + 0.258118212223053, + 0.2430180013179779, + 0.15079589188098907, + 0.15765906870365143, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4644833207130432, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.18295352160930634, + 0.4124230444431305, + 0.29375508427619934, + 0.27331775426864624, + 0.16929855942726135, + 0.18614333868026733, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5047915577888489, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6040997364997862, + -1.3266730127334594, + -0.92285426902771, + -0.8444594205856322, + -0.5463665382385252, + -0.5456839828491211, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.02160907292770571, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.6485135001182556, + -1.5401852423667908, + -0.9946665182113648, + -0.9465401615142826, + -0.5940469908714294, + -0.6444087917327881, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.006071952342987061, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6266800019741057, + 1.3451034955978391, + 0.9451263523101807, + 0.9366976721286777, + 0.516585234260559, + 0.55905809340477, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7061504119382762, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.642640541267395, + 1.5440051584720607, + 1.0398419427871701, + 1.007892139816284, + 0.5927413930892942, + 0.6252514398574824, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7056269750595094, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s14_a14/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s14_a14/norm_stats_meta.json new file mode 100644 index 0000000..31311e3 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s14_a14/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/galaxea_r1_lite_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5167/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 245253, + "num_frames": 7848088, + "estimated_total_batches": null, + "train_episodes": 4886, + "train_bytes": 3346209600799, + "elapsed_sec": 3871.8957114219666, + "frames_per_sec": 2026.9368249894735 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s14_a14/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s14_a14/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s14_a14/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s16_a18/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s16_a18/norm_stats.json new file mode 100644 index 0000000..4bc585b --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s16_a18/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.16373606026172638, + 0.9926406741142273, + -0.7024933695793152, + 0.13910958170890808, + -0.07944614440202713, + 0.0691065564751625, + -2.2582452297210693, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 80.80658721923828, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0637373998761177, + 0.40384504199028015, + -0.29242828488349915, + 0.10572875291109085, + 0.023374492302536964, + 0.010431193746626377, + -2.5006213188171387, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 89.0853271484375, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.29857853055000305, + 1.0033091306686401, + 0.7319855690002441, + 0.3954618573188782, + 0.24940426647663116, + 0.4646410644054413, + 0.8846869468688965, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 30.198925018310547, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2049432396888733, + 0.7930189371109009, + 0.5714349150657654, + 0.26710253953933716, + 0.12996964156627655, + 0.27238354086875916, + 0.7039861083030701, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 24.03177833557129, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.017169194972515, + -0.004680851008743048, + -1.986572128868103, + -1.1477862263917924, + -0.8641180778265, + -1.1129386113166808, + -2.76129431829527, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 5.472231944561004, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.25645644221305847, + -0.0042553190141916275, + -1.9533517208099365, + -0.4285504687309265, + -0.31070470275878903, + -0.9370759090423584, + -2.835106372833252, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 4.873087328195572, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.3155106456279755, + 2.578922155332752, + -0.00040344681739812316, + 1.0628037837743758, + 0.6523159398913383, + 1.4510601159095766, + -0.05701846262365562, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 97.88268118405342, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8619644447565078, + 2.462775818249583, + -0.00040225529670712135, + 1.0223374055862426, + 0.5530510427355766, + 0.9148953475952148, + -0.038330637861788475, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 100.52368333494664, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0035309582017362118, + -0.03238903358578682, + 0.02132692001760006, + -0.001851493027061224, + 0.001852226909250021, + 0.0021616152953356504, + -0.0008467381703667343, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 77.51899719238281, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.001286643324419856, + -0.004494755994528532, + 0.004611603915691376, + 0.00022976390027906746, + -0.00047635435475967824, + 0.00019026569498237222, + -0.0002900872495956719, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 89.36774444580078, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.23230241239070892, + 0.6766408681869507, + 0.4803682267665863, + 0.2520758807659149, + 0.18142449855804443, + 0.29774317145347595, + 0.7227979898452759, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 41.74575424194336, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.14992249011993408, + 0.4257671535015106, + 0.27494487166404724, + 0.15455301105976105, + 0.09703756123781204, + 0.15753188729286194, + 0.4973582923412323, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 30.825206756591797, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.7381767271518707, + -2.1335647198200225, + -1.4483220024108887, + -0.8748203573703766, + -0.6415985270500184, + -0.9677291069030762, + -2.308521799659729, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.6180614602565765, + -1.739781426525116, + -0.9139452539682389, + -0.6549412292242051, + -0.3491792736053465, + -0.5659440845727921, + -2.1506297883987426, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.8003067836284639, + 1.9999838626384738, + 1.666527211999893, + 0.7973734945774078, + 0.5891278557777402, + 1.068362585258484, + 2.4429450938224795, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 99.98, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6246776551246644, + 1.7485109654426578, + 1.1746477506160735, + 0.5350400135040285, + 0.35704151229858416, + 0.5749539126873016, + 2.408058779096603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 99.98, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s16_a18/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s16_a18/norm_stats_meta.json new file mode 100644 index 0000000..bd80a20 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s16_a18/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_s16_a18", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/galaxea_r1_lite_s16_a18_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_970/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 9866, + "num_frames": 315700, + "estimated_total_batches": null, + "train_episodes": 922, + "train_bytes": 100400838947, + "elapsed_sec": 127.63867783546448, + "frames_per_sec": 2473.388202962743 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s16_a18/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s16_a18/unified_action_space.json new file mode 100644 index 0000000..3c4ce7f --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_s16_a18/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "a9d0610a5115c532397c2f9a02c21890d70ef58ef0ad507847fa2ed1a15c88b5" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats.json new file mode 100644 index 0000000..cca4530 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.2506558299064636, + 0.9469642043113708, + -0.6205059885978699, + -0.09196162223815918, + 0.012572923675179482, + 0.05519729480147362, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.500835657119751, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.25365200638771057, + 1.2202755212783813, + -0.7921632528305054, + -0.1521870344877243, + -0.024248279631137848, + -0.07879133522510529, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.3990261554718018, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3049851357936859, + 0.9031018614768982, + 0.610549807548523, + 0.4732515215873718, + 0.2458823025226593, + 0.3754640817642212, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4639884829521179, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3309071660041809, + 0.8979148268699646, + 0.645177960395813, + 0.5483866333961487, + 0.3284341096878052, + 0.47655388712882996, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.504631757736206, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.9940981630802155, + -0.003829787252470851, + -1.975389991865214, + -1.5265620398044586, + -0.6589046301603317, + -0.8917075432300567, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.10655710805431008, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.3503914684653282, + -0.0019148936262354255, + -2.000638246536255, + -1.5020018501758576, + -0.8032287443637849, + -1.7044098446369171, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.11476012961864471, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.20174685723781582, + 2.4619219403604045, + -0.000014638316631288006, + 0.8448675643444061, + 0.7823373777389526, + 1.5872856732606886, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7645925080850722, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.005140295803547, + 2.505199112719623, + -0.0003078718297184757, + 0.8889586254119872, + 0.8282026379823684, + 0.8900946237802505, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.751934207174182, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.002070083748549223, + -0.009222179651260376, + 0.006848389748483896, + 0.00026182294823229313, + 0.0015868792543187737, + 0.0003076336288359016, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.5008774995803833, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.002750544575974345, + -0.015298927202820778, + 0.009401840157806873, + 0.0033589310478419065, + -0.00035418258630670607, + -0.001279053627513349, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.3990696668624878, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1416667252779007, + 0.3391159176826477, + 0.22186781466007233, + 0.23835258185863495, + 0.14790737628936768, + 0.2196711003780365, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4638553559780121, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.19731104373931885, + 0.3913874328136444, + 0.2852989435195923, + 0.30727827548980713, + 0.22789299488067627, + 0.291481077671051, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5044052600860596, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4676544653892517, + -1.3689668506622314, + -0.673422367811203, + -0.8352519777297973, + -0.514826227092743, + -0.9340109244346619, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.10655710805431008, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7339063465595246, + -1.6019817955970765, + -0.8888794917106628, + -1.093386752319336, + -0.7658062780380249, + -0.9442028461456298, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.11476012961864471, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.5726149436473846, + 1.2395132839202878, + 0.8514690177440647, + 0.8724879892349242, + 0.4888856029987334, + 0.7179337068557738, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7645925080850722, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6569907176494598, + 1.3284557864189144, + 0.9647411026954651, + 1.0813313362121582, + 0.9232138740777969, + 1.3054971899032592, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.751934207174182, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats_meta.json new file mode 100644 index 0000000..a232606 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_upper_s14_a14/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_galaxea_r1_lite_upper_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Galaxea_R1_Lite_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_3650/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 27171, + "num_frames": 869469, + "estimated_total_batches": null, + "train_episodes": 1337, + "train_bytes": 205435325084, + "elapsed_sec": 271.46593260765076, + "frames_per_sec": 3202.8659789758667 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_upper_s14_a14/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_upper_s14_a14/unified_action_space.json new file mode 100644 index 0000000..eaaba89 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_galaxea_r1_lite_upper_s14_a14/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "1fa4ae18cdd16834f62a84b6e7c7d297585f44534b6b912ad9d2e88896a34f45" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_leju_robot_s118_a54/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_leju_robot_s118_a54/norm_stats.json new file mode 100644 index 0000000..c5a9296 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_leju_robot_s118_a54/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.14392921328544617, + -0.0496545284986496, + 0.03907515108585358, + -0.6383686661720276, + -0.33223956823349, + 0.1406169980764389, + -0.2197691947221756, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2658024728298187, + 1.0174024105072021, + 0.26580309867858887, + 0.26580342650413513, + 0.26580342650413513, + 0.26580342650413513, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.26310673356056213, + -0.026430761441588402, + 0.22182564437389374, + -1.0583513975143433, + 0.5696671009063721, + -0.14421126246452332, + -0.14368979632854462, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6819911003112793, + 1.1796563863754272, + 0.681991696357727, + 0.6819922924041748, + 0.6819922924041748, + 0.6819922924041748, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.005736132152378559, + -0.004845454357564449, + -0.5839594006538391, + 1.034613847732544, + -0.47432053089141846, + 0.0044976514764130116, + -0.011759890243411064, + 0.0016561566153541207, + -0.584376335144043, + 1.0361307859420776, + -0.48027747869491577, + 0.014017106033861637, + -0.006366158835589886, + 0.00004895150777883828, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.24559161067008972, + 0.1689794510602951, + 0.7688204646110535, + 0.5849611759185791, + 0.7876368165016174, + 0.2824043333530426, + 0.2779797911643982, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6225577592849731, + 0.8577785491943359, + 0.62255859375, + 0.6225588917732239, + 0.6225588917732239, + 0.6225588917732239, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.37637755274772644, + 0.21900226175785065, + 0.6015813946723938, + 0.6487521529197693, + 0.6114912033081055, + 0.3323651850223541, + 0.33078810572624207, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8369026184082031, + 0.813471257686615, + 0.8369022607803345, + 0.8369028568267822, + 0.8369029760360718, + 0.8369028568267822, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.011689109727740288, + 0.03091302700340748, + 0.05732341855764389, + 0.07677125930786133, + 0.0554114505648613, + 0.02481386624276638, + 0.01102852076292038, + 0.030867384746670723, + 0.057295337319374084, + 0.08059525489807129, + 0.055565595626831055, + 0.024815795943140984, + 0.0376923643052578, + 0.0022193610202521086, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.9992702881813049, + -0.34700471043586734, + -1.499725185585022, + -2.03459240322113, + -1.5663648304462434, + -0.6925698574066161, + -0.703081022977829, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.2768910852432251, + -0.6715401140213013, + -1.3412932807922364, + -2.273264695763588, + -1.2518772483825684, + -0.7010021484375, + -0.700609602355957, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.02395869474411011, + -0.11906609460711481, + -0.7370869652032852, + 0.9267490817084909, + -0.6330387302875519, + -0.049691598564386374, + -0.042447312104701984, + -0.10632696142792702, + -0.7380362022399902, + 0.9342303326725959, + -0.641259054350853, + -0.04123028814792634, + -0.11191192030906683, + -0.005750369654968376, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.3458903924465182, + 0.5226744106411935, + 1.44677988114357, + -0.06136881568431818, + 1.476704307556152, + 0.6961594585418704, + 0.5051051949501038, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.45043067569732687, + 0.3487966469764707, + 1.3253098982810974, + -0.12402725848555551, + 1.5689554569244386, + 0.7199650357246397, + 0.626018825149536, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.034869841480255126, + 0.09307707622647288, + -0.45076588833332076, + 1.2968151184253396, + -0.3549289156675338, + 0.06532029041647913, + 0.015565912073850607, + 0.10807942071557042, + -0.4488659531593323, + 1.2981121613249182, + -0.369503323701024, + 0.07134055135250089, + 0.09063195526599888, + 0.008523450748994951, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.025149166584014893, + -0.0007167551084421575, + 0.014958391897380352, + 0.029812512919306755, + -0.049611445516347885, + 0.018364058807492256, + -0.016904247924685478, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.26187270879745483, + 1.0055816173553467, + 0.2618729770183563, + 0.2618747055530548, + 0.2618747055530548, + 0.2618747055530548, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.023009758442640305, + 0.008779775351285934, + -0.01961400918662548, + 0.035789959132671356, + 0.03110627271234989, + -0.02077949233353138, + -0.022412974387407303, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6611509919166565, + 1.1648931503295898, + 0.661152720451355, + 0.661155104637146, + 0.661155104637146, + 0.661155104637146, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.006273355800658464, + -0.003994456026703119, + -0.5832089185714722, + 1.0329070091247559, + -0.4743139445781708, + 0.0038752786349505186, + -0.011729203164577484, + 0.0015189028345048428, + -0.5832836031913757, + 1.034032940864563, + -0.4801284670829773, + 0.013799047097563744, + -0.006342591252177954, + 0.000048941914428723976, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.13706213235855103, + 0.0861985832452774, + 0.2623814046382904, + 0.21836024522781372, + 0.38968393206596375, + 0.18734091520309448, + 0.1748584508895874, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6187314391136169, + 0.859600305557251, + 0.6187315583229065, + 0.6187350153923035, + 0.6187350153923035, + 0.6187350153923035, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.18466579914093018, + 0.11489593982696533, + 0.2676655650138855, + 0.30678436160087585, + 0.3512946665287018, + 0.2122993916273117, + 0.19419464468955994, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.833325207233429, + 0.8184693455696106, + 0.8333248496055603, + 0.8333266377449036, + 0.8333266377449036, + 0.8333266377449036, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.011661932803690434, + 0.03008849360048771, + 0.0570581778883934, + 0.07920322567224503, + 0.05598650872707367, + 0.02390815131366253, + 0.011079773306846619, + 0.030265456065535545, + 0.05669058859348297, + 0.08025062084197998, + 0.056270044296979904, + 0.02400575391948223, + 0.037728164345026016, + 0.0022195226047188044, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.49717133016586335, + -0.29087378101348893, + -0.9207378339767456, + -0.8032954450130463, + -1.5487773138046266, + -0.5106261265754701, + -0.7538997879028321, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.6092341652870177, + -0.3566183257102966, + -1.1042374740600585, + -1.0408703578948975, + -0.9910236114501954, + -0.8985654019355773, + -0.791315365076065, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.023514607763290396, + -0.11017253985404968, + -0.7403963661193848, + 0.9252302796959877, + -0.6394320577383041, + -0.04950896456241605, + -0.04293521931767463, + -0.102585978269577, + -0.7395257719516755, + 0.9335625804424286, + -0.6478451603651046, + -0.039510283565521276, + -0.11191192030906683, + -0.005750369654968376, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.4264512014865871, + 0.29491566400527924, + 1.1406259435176853, + 0.8118304628849029, + 1.1148114137649534, + 0.7137140592575073, + 0.44641688156127923, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6106945888519291, + 0.36770981721878027, + 0.7981465461730957, + 1.0722906362533569, + 1.444993089199066, + 0.5342899666786192, + 0.5092106031179429, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.7449801949739454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.035736719590425514, + 0.09176966729164115, + -0.45266616611480714, + 1.2868420163989067, + -0.35557454228401186, + 0.06286471080780032, + 0.01590245109796523, + 0.10124850861430168, + -0.4510058415412903, + 1.2875499872922898, + -0.3704874509572982, + 0.06893986749649039, + 0.0910177531242371, + 0.008582760252058508, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_leju_robot_s118_a54/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_leju_robot_s118_a54/norm_stats_meta.json new file mode 100644 index 0000000..8250431 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_leju_robot_s118_a54/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_leju_robot_s118_a54", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/leju_robot_s118_a54_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_17897/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 458510, + "num_frames": 14672292, + "estimated_total_batches": null, + "train_episodes": 17002, + "train_bytes": 4898931416952, + "elapsed_sec": 5203.681373596191, + "frames_per_sec": 2819.598462436255 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_leju_robot_s118_a54/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_leju_robot_s118_a54/unified_action_space.json new file mode 100644 index 0000000..d356add --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_leju_robot_s118_a54/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "d97c871ea622a1d73832b3cfbbf5591efa01e5743172a70cab01099fbb596f69" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aida_l_s28_a28/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aida_l_s28_a28/norm_stats.json new file mode 100644 index 0000000..f6e2759 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aida_l_s28_a28/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.7575891017913818, + -2.018211841583252, + 1.2673600912094116, + 1.1146199703216553, + 0.6891690492630005, + -0.3179693818092346, + -0.9597281217575073, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 555.3607177734375, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.8516546487808228, + 2.0185489654541016, + -1.024009346961975, + -0.8024208545684814, + -0.6040467619895935, + 0.35237857699394226, + 0.4313460886478424, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 634.1749267578125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.227471724152565, + 0.06362287700176239, + 0.25554585456848145, + 0.4349750280380249, + 1.4009367227554321, + 1.5048906803131104, + 1.4070923328399658, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 329.2973937988281, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2158181071281433, + 0.06811479479074478, + 0.2395617961883545, + 0.3499128818511963, + 1.5231932401657104, + 1.4194414615631104, + 1.436482548713684, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 325.5093994140625, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.2411617311716079, + -2.0655426728248596, + 0.7684333333969116, + 0.43966181900501256, + -0.9741751252412796, + -1.918311150074005, + -3.0002384185791016, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 44.9538, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.4035066569000483, + 1.6972570048332214, + -1.6375796434402465, + -1.7001429117143154, + -2.8975123698711394, + -1.826313526535034, + -1.312467015504837, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 26.3704, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.1553316257953643, + -1.7997828578948973, + 1.9979852621555327, + 1.867020208358765, + 2.8710006383657456, + 1.9273102951049803, + 0.8647150281906129, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 920.7366, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.3617565359920263, + 2.079939349913597, + -0.5856861970901488, + -0.16072266962528237, + 1.2208031419515608, + 1.863077091884613, + 2.6855830742359164, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 881.62, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.004745005629956722, + 0.001093511818908155, + -0.002022324362769723, + -0.003611444029957056, + -0.011031363159418106, + -0.0013529028510674834, + 0.010191795416176319, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 545.743896484375, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.002088882029056549, + -0.0009160805493593216, + -0.0011564826127141714, + -0.006964823696762323, + 0.008905000053346157, + -0.002275642240419984, + -0.00712719326838851, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 634.5043334960938, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.05028748884797096, + 0.015297401696443558, + 0.071743443608284, + 0.09484060853719711, + 0.09587708115577698, + 0.099430613219738, + 0.055593136698007584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 331.8141784667969, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0730854719877243, + 0.03070250153541565, + 0.06939690560102463, + 0.1734410673379898, + 0.13651607930660248, + 0.14600589871406555, + 0.10842622071504593, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 325.7297058105469, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.20747764117717743, + -0.04162785339355471, + -0.20748130631446837, + -0.3386043548583984, + -0.4205680692672731, + -0.3368758692741394, + -0.11896564942598342, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 44.9538, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.27733808026313783, + -0.11711480379104616, + -0.253275782763958, + -0.695207809829712, + -0.4655322723388673, + -0.4588191899299622, + -0.3640655764102936, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 26.3704, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.12971830923557282, + 0.06903154182434079, + 0.28166046774387365, + 0.34935000658035276, + 0.20638658781051622, + 0.3108922860622405, + 0.23591858417987832, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 922.6905999999999, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.24794143097400667, + 0.09158638322353363, + 0.2413436704993247, + 0.45366472196578966, + 0.5544114936828612, + 0.48090295810699457, + 0.34896428358554843, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 881.7984, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aida_l_s28_a28/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aida_l_s28_a28/norm_stats_meta.json new file mode 100644 index 0000000..0c0cfa3 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aida_l_s28_a28/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_realman_rmc_aida_l_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Realman_RMC-AIDA-L_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_693/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 9936, + "num_frames": 317940, + "estimated_total_batches": null, + "train_episodes": 658, + "train_bytes": 36471840854, + "elapsed_sec": 89.87298893928528, + "frames_per_sec": 3537.6591315416026 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aida_l_s28_a28/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aida_l_s28_a28/unified_action_space.json new file mode 100644 index 0000000..814b04c --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aida_l_s28_a28/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ef55a4aafbbe2ee823c0cee63ded3dbf686094cc4ac9049016b9941db4f30422" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aidal_s28_a28/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aidal_s28_a28/norm_stats.json new file mode 100644 index 0000000..d51c279 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aidal_s28_a28/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.47839146852493286, + -2.059580087661743, + 0.6078921556472778, + 0.443592369556427, + 1.4694907665252686, + 1.1243274211883545, + -1.0638837814331055, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 533.576416015625, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5341330766677856, + 2.0288519859313965, + -0.7328935861587524, + -0.5111697316169739, + -1.5132325887680054, + -1.0845743417739868, + 1.057655930519104, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 554.112548828125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.21434840559959412, + 0.07314120978116989, + 1.1213843822479248, + 0.6602405905723572, + 1.2446599006652832, + 0.9368466138839722, + 1.2627320289611816, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 343.1611633300781, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.239162877202034, + 0.08330599218606949, + 0.8705637454986572, + 0.5838403701782227, + 1.1899601221084595, + 0.9443362951278687, + 1.3015942573547363, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 314.4317932128906, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0482353521347045, + -2.1750113368034363, + -2.646780677318573, + -1.6032505451679229, + -2.4177295753479005, + -1.6492822704315186, + -2.8623494152069093, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.6079999999999757, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.013312339687347463, + 1.8281194995880128, + -2.3761580247879026, + -1.6655417486190796, + -2.8879985211372374, + -2.024796287918091, + -2.8088368267059325, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7975999999999992, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.027407007861137256, + -1.8577467799186707, + 2.8453764088153832, + 1.6954893584251405, + 2.870450235891343, + 2.0029636798858643, + 2.808081196403503, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 948.4096, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.1564803113937376, + 2.1062067033290863, + 2.2962332958221428, + 1.4867680027008054, + 2.3619786128520968, + 1.6406866954803467, + 2.8881806318759917, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 944.6902000000001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0007135526975616813, + -0.0003534950374159962, + 0.0011087273014709353, + 0.00018156379519496113, + -0.0018077408894896507, + 0.00005206819696468301, + 0.0025921647902578115, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 533.2557983398438, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0009018750279210508, + 0.0002198505389969796, + -0.0011170865036547184, + -0.000418089737650007, + 0.0012902384623885155, + 0.0009497611899860203, + -0.0008871746831573546, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 553.1741333007812, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1037909984588623, + 0.03418908268213272, + 0.14360260963439941, + 0.16961778700351715, + 0.20701688528060913, + 0.2258588671684265, + 0.24374830722808838, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 343.0868225097656, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.11896975338459015, + 0.0325104221701622, + 0.1677417755126953, + 0.19693401455879211, + 0.24006836116313934, + 0.22501049935817719, + 0.28681400418281555, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 314.21026611328125, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.33542436039447776, + -0.11812768712043764, + -0.5185220909118653, + -0.5681056449890136, + -0.7323143272399903, + -0.7057940410137173, + -0.9256965145111082, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.6079999999999757, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4231953330039977, + -0.12260290641784666, + -0.5584167864799499, + -0.7264892864227295, + -0.8738897808074952, + -0.7326278971195221, + -1.0107426010131837, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7975999999999992, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.3840171305179596, + 0.12214941902160636, + 0.49682519912719725, + 0.6064030448913575, + 0.6977665336608885, + 0.7309729760646824, + 0.8620825569152837, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 948.4096, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.37962152361869816, + 0.10668836259841918, + 0.6009062723159793, + 0.6464898212432861, + 0.8375270114898674, + 0.6645073395252226, + 1.1167047012329103, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 944.6902000000001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aidal_s28_a28/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aidal_s28_a28/norm_stats_meta.json new file mode 100644 index 0000000..b2e9bcb --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aidal_s28_a28/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_realman_rmc_aidal_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/realman_rmc_aidal_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_18412/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 492790, + "num_frames": 15769266, + "estimated_total_batches": null, + "train_episodes": 17481, + "train_bytes": 1684550435506, + "elapsed_sec": 4069.850043296814, + "frames_per_sec": 3874.655290057317 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aidal_s28_a28/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aidal_s28_a28/unified_action_space.json new file mode 100644 index 0000000..814b04c --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_realman_rmc_aidal_s28_a28/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ef55a4aafbbe2ee823c0cee63ded3dbf686094cc4ac9049016b9941db4f30422" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s17_a17/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s17_a17/norm_stats.json new file mode 100644 index 0000000..d3ba750 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s17_a17/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.4022698402404785, + 0.4008525311946869, + -1.8359957933425903, + 1.3991795778274536, + 1.6781357526779175, + -0.39159268140792847, + -0.11824289709329605, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5900587439537048, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.10200242698192596, + -0.36888185143470764, + 1.6269876956939697, + -1.5651452541351318, + -1.710113763809204, + 0.14229054749011993, + 0.0901879221200943, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7219226956367493, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.3285321593284607, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.47184816002845764, + 0.26041191816329956, + 0.30844730138778687, + 0.4104193449020386, + 0.3992116451263428, + 0.5433208346366882, + 0.4647732377052307, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.39009591937065125, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2526223659515381, + 0.1727783977985382, + 0.15735691785812378, + 0.30363792181015015, + 0.3119509518146515, + 0.3184160590171814, + 0.3587453365325928, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3384997248649597, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08604823052883148, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.15512949786186214, + -0.000247655253857372, + -2.7533860206604004, + 0.018561795279711076, + 0.348873460650444, + -1.5701000690460205, + -1.888011309146881, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1376806372463703, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.1755216784477236, + -0.9503723105043173, + 1.2927916605830192, + -2.0496549903660024, + -2.4722114605903625, + -0.1814788004875183, + -0.865350887775421, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1337790972352028, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5622645171403885, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.5952690245151522, + 1.1460021360963584, + -1.3690508592128754, + 2.049136744551986, + 2.751842607951164, + 0.8992856348037717, + 0.8812080025672913, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.965350421231985, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03684061706066122, + -0.09100282496213907, + 2.4757759820103646, + -0.0374427558146424, + -0.6511100595712662, + 1.4296446043968203, + 1.5782729723930364, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9653499048113824, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.2347364159733057, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0007815549615770578, + -0.0006295735365711153, + 0.00006955656135687605, + -0.00046953416313044727, + -0.0009421160793863237, + -0.000566480855923146, + 0.0007163064437918365, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5906252264976501, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.00038199048140086234, + 0.0004900511703453958, + -0.00028768597985617816, + -0.00026881968369707465, + -0.0003086130600422621, + -0.00019033218268305063, + -0.0003762365668080747, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7219077944755554, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.32853180170059204, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.19541341066360474, + 0.145516499876976, + 0.15332399308681488, + 0.19865047931671143, + 0.16601331532001495, + 0.20398183166980743, + 0.18197141587734222, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3904857337474823, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09083140641450882, + 0.059260159730911255, + 0.07308832556009293, + 0.12470908463001251, + 0.09311696887016296, + 0.08739949762821198, + 0.1316150426864624, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3384832441806793, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0860481858253479, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6090426849842071, + -0.4968913494586945, + -0.5529850662708282, + -0.6974553999900817, + -0.5849689860343932, + -0.8470925182104112, + -0.6177244747161865, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1376806372463703, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.3506921148777007, + -0.20023923506736763, + -0.2488031871795655, + -0.4694817880868911, + -0.3406314041137697, + -0.31274263751506814, + -0.5059143760204314, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.13361177916526795, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5622645171403885, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6863681363344192, + 0.5567416855335237, + 0.4736135180950165, + 0.6609690598249438, + 0.5248469697237015, + 0.5392340588569642, + 0.5923228402614593, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.965350421231985, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2980546859979629, + 0.20376526083946223, + 0.24556429748535136, + 0.442152768421173, + 0.33779594779014577, + 0.34090128064155567, + 0.4569228596687318, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9653499048113824, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.2347364159733057, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s17_a17/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s17_a17/norm_stats_meta.json new file mode 100644 index 0000000..b186237 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s17_a17/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_ruantong_a2d_s17_a17", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/ruantong_a2d_s17_a17_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_1719/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 32248, + "num_frames": 1031909, + "estimated_total_batches": null, + "train_episodes": 1633, + "train_bytes": 232098850893, + "elapsed_sec": 277.61806178092957, + "frames_per_sec": 3717.009597215209 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s17_a17/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s17_a17/unified_action_space.json new file mode 100644 index 0000000..46d05f0 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s17_a17/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "02e7c59245802e66825ab80d667297f376ddc17ad33bfbe771465efbd15789a2" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s41_a34/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s41_a34/norm_stats.json new file mode 100644 index 0000000..fe95813 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s41_a34/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -1.3547803163528442, + 0.755029022693634, + 0.6068242788314819, + -0.9906300902366638, + 1.0170456171035767, + 1.3017445802688599, + -0.18157915771007538, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7635851502418518, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.3421299457550049, + -0.7070972323417664, + -0.5880898833274841, + 1.0016454458236694, + -0.9842587113380432, + -1.3245666027069092, + 0.13256670534610748, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7062156200408936, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0004295064427424222, + 0.3654797077178955, + 0.4781149625778198, + 0.404465913772583, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.40673211216926575, + 0.25750458240509033, + 0.44406312704086304, + 0.4298768639564514, + 0.4682933986186981, + 0.3272894322872162, + 0.4376765787601471, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.319647878408432, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.36325040459632874, + 0.26303979754447937, + 0.4294496476650238, + 0.41202446818351746, + 0.4376407861709595, + 0.26321712136268616, + 0.406250536441803, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.34777307510375977, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13882064819335938, + 0.0587720051407814, + 0.06267630308866501, + 0.06288386881351471, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -2.623746828877926, + 0.422594678670168, + 0.26733380875587465, + -1.3614243242025375, + 0.5744161965847017, + -0.005409026861190824, + -1.6480314255952835, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1908386861205101, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.9897309021949767, + -1.3695025413155555, + -2.06178382396698, + -0.01326705760955793, + -2.081861891722679, + -1.5936958384633064, + -0.853074108362198, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.1906825377225876, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.26186463236808777, + 0.2617471218109131, + 0.3489969074726105, + 0.31707038768529894, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.7302417573094369, + 1.3694030942618847, + 2.445421035337448, + 0.009004551577567854, + 2.326905642080307, + 1.601938715982437, + 0.8492856928110122, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0012754402011632, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.3719133356809614, + -0.09056340849399569, + -0.16903709316253668, + 1.3555171401977542, + -0.2900681381464003, + -0.5199884833097457, + 1.707816768169403, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0010545860767364, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.26176494808197015, + 0.43632417860031125, + 0.6108229170560837, + 0.5188367841541767, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0010563352843746543, + 0.0017160391435027122, + 0.005159545224159956, + 0.0022106990218162537, + 0.0014503959100693464, + -0.005501764826476574, + 0.0010637474479153752, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6935475468635559, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0027838535606861115, + -0.0005895814974792302, + -0.0026668307837098837, + -0.002813382539898157, + -0.0016497792676091194, + 0.002556455321609974, + -0.000546303519513458, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6242499947547913, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.00042965743341483176, + 0.36547815799713135, + 0.47811827063560486, + 0.4044669568538666, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1597946286201477, + 0.11818362027406693, + 0.14702743291854858, + 0.2084183245897293, + 0.16728796064853668, + 0.16486595571041107, + 0.15998083353042603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4545469284057617, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.14823907613754272, + 0.12344123423099518, + 0.14680664241313934, + 0.18301677703857422, + 0.1618991196155548, + 0.11924934387207031, + 0.1484396904706955, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4780848026275635, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1388205587863922, + 0.058782149106264114, + 0.06265798956155777, + 0.06288007646799088, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6110378967523575, + -0.393797745513916, + -0.4590578153133391, + -0.6687536456108094, + -0.469356360435486, + -0.5654164524078369, + -0.5650752035140991, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4784718633651732, + -0.3966371303558349, + -0.4847236261367798, + -0.6575335870981217, + -0.660990184020996, + -0.41581965608596794, + -0.47923130426406857, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.2619338631629944, + 0.26169419288635254, + 0.3489546775817871, + 0.317028849452734, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.49575549707412714, + 0.43070048446655274, + 0.4998851660966874, + 0.8407508171796798, + 0.6952995580434798, + 0.6087248458862304, + 0.5395712120056153, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4941145238876343, + 0.4433111068725586, + 0.5403243355751037, + 0.6182873335599899, + 0.45763365707397474, + 0.4022696802139283, + 0.5173421204090118, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2617077342569828, + 0.43634983854293824, + 0.6108512703180313, + 0.5187769077837467, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s41_a34/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s41_a34/norm_stats_meta.json new file mode 100644 index 0000000..5858b0e --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s41_a34/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_ruantong_a2d_s41_a34", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/ruantong_a2d_s41_a34_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_6459/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 85004, + "num_frames": 2720116, + "estimated_total_batches": null, + "train_episodes": 6136, + "train_bytes": 1133795856617, + "elapsed_sec": 1135.4377226829529, + "frames_per_sec": 2395.654068611155 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s41_a34/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s41_a34/unified_action_space.json new file mode 100644 index 0000000..167fead --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_ruantong_a2d_s41_a34/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "c67f9a1a94cc29d855336aa75853afc3fe9f40256c371694d4c7688007dd8e61" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28/norm_stats.json new file mode 100644 index 0000000..f6275d8 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.1628706455230713, + 0.23347488045692444, + -0.04910242184996605, + 0.264553040266037, + 0.13043716549873352, + -0.33108076453208923, + -0.14998599886894226, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.29194653034210205, + 0.6853201985359192, + 0.6170122027397156, + -0.6644286513328552, + -1.1213622093200684, + -0.6663221120834351, + -0.8499442934989929, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.07948362082242966, + -0.17150138318538666, + 0.21232953667640686, + 0.0920492485165596, + -0.29347097873687744, + -0.30039313435554504, + 0.0853857547044754, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.3021090030670166, + -0.6288666725158691, + -0.6771913170814514, + 0.6895211338996887, + 1.1751788854599, + 0.6504865884780884, + 0.8789990544319153, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3626730144023895, + 0.19216300547122955, + 0.2810690999031067, + 0.5205802321434021, + 0.5020791888237, + 0.5364598631858826, + 0.36660030484199524, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.25213295221328735, + 0.207768052816391, + 0.4823054075241089, + 0.2749427855014801, + 0.6560249924659729, + 0.2500518560409546, + 0.6224695444107056, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3831944465637207, + 0.1589929163455963, + 0.24002577364444733, + 0.4983278810977936, + 0.46839040517807007, + 0.42183858156204224, + 0.32927024364471436, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.25350189208984375, + 0.2528623938560486, + 0.5577102303504944, + 0.22081902623176575, + 0.6477662324905396, + 0.20423410832881927, + 0.6250683069229126, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0871391372680663, + -0.20876111135482786, + -0.8388713676452637, + -0.8200110165596008, + -0.7363758310317993, + -1.3833980978965759, + -0.7764279620170593, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.943547477543354, + 0.09146377477645873, + 0.017375269904732704, + -1.098071245956421, + -1.7251344782330096, + -1.131031814558804, + -1.6974872374732048, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0471447103023528, + -0.528865817463398, + -0.20733413085937502, + -0.8457812840938568, + -1.2295815105915069, + -1.2434954173088073, + -0.86912408721447, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.902100967156887, + -0.9165206720232963, + -1.7268712982222438, + 0.06079141880832613, + 0.014800074510276318, + 0.11157027700543404, + 0.01750687765069306, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.47659769430160503, + 0.7076735383987427, + 0.45100675120353695, + 1.2377816146373748, + 1.335918707370758, + 0.9499077592849732, + 1.3439336926937102, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1254084028124809, + 0.9077776364326477, + 1.6320448531996459, + 0.013790484744310216, + -0.0170682890616356, + -0.011170641231536882, + -0.023183120945841296, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5287259579181671, + 0.14627059165239342, + 0.8642253021240234, + 1.3658753696680068, + 0.684262245941162, + 0.594153723692894, + 0.7332529784440993, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21299966784715663, + 0.005030459719896352, + -0.014311032612621899, + 1.052727247415483, + 1.73224950031098, + 1.0908084644936025, + 1.6659874871112406, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0016884017968550324, + 0.011546838097274303, + 0.00473940372467041, + -0.0024346469435840845, + -0.0031135918106883764, + -0.002420922042801976, + 0.0017203716561198235, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.2739558219909668, + 0.7384939193725586, + 0.6407151818275452, + -0.687782883644104, + -1.1394267082214355, + -0.6913239359855652, + -0.8725272417068481, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0007380479946732521, + -0.00810902751982212, + -0.0052103460766375065, + -0.002664201660081744, + 0.004933670163154602, + -0.002533601364120841, + -0.0018208746332675219, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.26942676305770874, + -0.6645417809486389, + -0.6903152465820312, + 0.7051751017570496, + 1.1936242580413818, + 0.6750840544700623, + 0.8997586965560913, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.15168355405330658, + 0.11104796826839447, + 0.14569349586963654, + 0.21772974729537964, + 0.2811240255832672, + 0.2331443876028061, + 0.23385126888751984, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.26519671082496643, + 0.20837455987930298, + 0.5007086396217346, + 0.2879154086112976, + 0.686345100402832, + 0.2576579451560974, + 0.6700758934020996, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13862664997577667, + 0.07791885733604431, + 0.11473166942596436, + 0.2046445906162262, + 0.18303248286247253, + 0.15754161775112152, + 0.16820472478866577, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.27345746755599976, + 0.25550195574760437, + 0.5730949640274048, + 0.2446984052658081, + 0.6683359146118164, + 0.22920526564121246, + 0.6644843816757202, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.4647418713569641, + -0.36247115948200226, + -0.4871022036075593, + -0.6902964536190033, + -0.9688063781738281, + -0.8738521937131882, + -0.7369811347961426, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9890421652793884, + 0.19791983685493464, + -0.00033008601089240986, + -1.2235791976333363, + -1.7463293075561523, + -1.1852029679603175, + -1.7463293075561523, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.42307967765331267, + -0.26447365524768834, + -0.4067236483573914, + -0.6569536940097809, + -0.6593658556938171, + -0.4846822315454482, + -0.556758381319046, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9903689094781876, + -0.9210000038146973, + -1.7463293075561523, + -0.0010000000474974513, + -0.0003010683244559914, + 0.06110405158251524, + -0.0006505341859767214, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.5710441195964813, + 0.37983955030441297, + 0.47168680982589706, + 0.7756827896118161, + 1.0283435638427734, + 0.7458742338418958, + 0.7903891201019286, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2754032823443411, + 0.9206928329706192, + 1.6932202401782386, + 0.0006854407878826851, + 0.0006505341859766034, + 0.0006854407878826851, + 0.0006505341859766034, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5275774911642075, + 0.2503997765541076, + 0.3314345474720002, + 0.6707679876804353, + 0.5859755010604859, + 0.5634215530157092, + 0.5414131363868715, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.24682292762994762, + -0.05346022585034371, + -0.00028526860064581605, + 1.091015984294936, + 1.7459798416946315, + 1.2084764054469996, + 1.7459798416946315, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28/norm_stats_meta.json new file mode 100644 index 0000000..329799a --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unitree_g1_s28_a28", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unitree_g1_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_931/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 19765, + "num_frames": 632462, + "estimated_total_batches": null, + "train_episodes": 884, + "train_bytes": 137723586828, + "elapsed_sec": 202.07107949256897, + "frames_per_sec": 3129.898655404859 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28/unified_action_space.json new file mode 100644 index 0000000..426641a --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "beb5c3de296f6dfdd1e27ccc8605130a15e00fbe16608d63c4a5e7e346171784" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28_high/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28_high/norm_stats.json new file mode 100644 index 0000000..6633804 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28_high/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.7445161938667297, + 0.2046411782503128, + -0.24800196290016174, + 0.9919590950012207, + 0.3741361200809479, + -0.2801648676395416, + -0.13361211121082306, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.6758849024772644, + 0.8352697491645813, + 0.2204723358154297, + -0.3820844292640686, + -0.8395292162895203, + -0.3996052145957947, + -0.5619040131568909, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.36609283089637756, + -0.08858122676610947, + -0.30266183614730835, + 0.8333971500396729, + 0.29706326127052307, + -0.2599102556705475, + 0.45701661705970764, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.10622099041938782, + -0.8759199976921082, + -0.34643176198005676, + 0.814652144908905, + 1.2110474109649658, + 0.567145049571991, + 0.9029716849327087, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.3898758292198181, + 0.20100830495357513, + 0.3866082727909088, + 0.4276141822338104, + 0.5115737915039062, + 0.2632923424243927, + 0.42600882053375244, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21897515654563904, + 0.10531293600797653, + 0.23290933668613434, + 0.2559126913547516, + 0.630479633808136, + 0.24550874531269073, + 0.5936964750289917, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17779535055160522, + 0.11882677674293518, + 0.14129222929477692, + 0.3587522506713867, + 0.23949897289276123, + 0.2896011471748352, + 0.5105559229850769, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7211710214614868, + 0.13480520248413086, + 0.32516923546791077, + 0.28521132469177246, + 0.520041286945343, + 0.3791837990283966, + 0.6520012617111206, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.2224115524291992, + -0.2226963701248169, + -0.7868920280456543, + -0.01173839816451075, + -0.6705473416090012, + -0.9839372223377227, + -1.1950472702026367, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.008761749792099, + 0.3164234099209309, + 0.015529673546552658, + -1.0354845005345996, + -1.7086090141598136, + -1.0038791944533587, + -1.6925374082896858, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7371529162883759, + -0.3936914521664381, + -0.7073566943407059, + 0.038411684036254876, + -0.06361387825012206, + -0.9945685440063476, + -0.2427892891407013, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.8244225978851318, + -0.917671856868267, + -1.6727701947420834, + 0.20956130823493002, + 0.016465356573462486, + -0.07792163744568825, + 0.013376317918300629, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.08535512161254899, + 0.6966267797470093, + 0.5173972716808319, + 1.3934486828446386, + 1.0134924908161163, + 0.3364450139045716, + 0.7313213119506838, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.21198543627262112, + 0.9117449419245124, + 0.8466709901146591, + -0.025526101072493645, + -0.036378498886898036, + -0.01881221437454217, + -0.020673312769085017, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.015156626367568982, + 0.11028196246623989, + -0.07709463704824449, + 1.2660695624351501, + 0.8034028644561768, + 0.18856437225341782, + 1.5178833255529405, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0496813233375548, + -0.12920548431873324, + -0.01758571497499939, + 1.5300610191166402, + 1.7329283000670372, + 1.1529876285791396, + 1.7253991491645575, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.001059380709193647, + 0.004219536203891039, + 0.0023536814842373133, + 0.004847630392760038, + -0.0044314186088740826, + 0.0032603945583105087, + 0.0002796429907903075, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.6260432600975037, + 0.8834512829780579, + 0.23747524619102478, + -0.4212741553783417, + -0.8709027171134949, + -0.433660089969635, + -0.5984626412391663, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.007231731899082661, + -0.001023879274725914, + -0.0034783456940203905, + -0.00010531584121054038, + 0.004821954760700464, + -0.0008869097218848765, + -0.000642355706077069, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.46016982197761536, + -0.8851051330566406, + -0.34612372517585754, + 0.8203089833259583, + 1.2152869701385498, + 0.7640361189842224, + 0.907231867313385, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.264655739068985, + 0.1654302030801773, + 0.2674410343170166, + 0.2734619677066803, + 0.3695032000541687, + 0.23066960275173187, + 0.32287293672561646, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2984951436519623, + 0.08304513990879059, + 0.2572486400604248, + 0.3235522210597992, + 0.7256113886833191, + 0.30972957611083984, + 0.689659059047699, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.04034788906574249, + 0.0261350329965353, + 0.01804332062602043, + 0.06059056892991066, + 0.022570159286260605, + 0.035094913095235825, + 0.03205068036913872, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21764817833900452, + 0.1374056339263916, + 0.3252909779548645, + 0.2921648323535919, + 0.5298183560371399, + 0.2756422162055969, + 0.677844226360321, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6967882361650467, + -0.376699486553669, + -0.7184161659240723, + -0.8877626407623291, + -1.1069273098468781, + -0.7469617376804352, + -1.1573144844055174, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0481975078582764, + 0.4381441333025694, + -0.0006127584492787719, + -1.1355026049411623, + -1.7463293075561523, + -1.1958755969752557, + -1.7463293075561523, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.10971371923685075, + -0.05946463347375394, + -0.05702475812435151, + -0.1925968414545059, + -0.058742796063423156, + -0.11493266266584395, + -0.0876838384628296, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0481975078582764, + -0.9210000038146973, + -1.6743681746596237, + 0.20299266990423204, + 0.0007594325964921152, + 0.03485975554860197, + -0.000051340521336533114, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.9039022744178773, + 0.5056628809690475, + 0.8582687198638914, + 0.8934240812301635, + 1.1677811064720154, + 0.6654134750127794, + 1.2087200176239015, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -0.06332860741019242, + 0.9208353751510382, + 0.943756352857803, + 0.0006854407878826851, + 0.0006505341859766034, + 0.000687336620897927, + 0.0006505341859766034, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13810114730000494, + 0.09025129990279673, + 0.04996730821132658, + 0.19269111961126328, + 0.0708820892572403, + 0.08923030090332035, + 0.08276398012638092, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.13738033704161645, + -0.12135625495314606, + -0.001795823647105177, + 1.5714997634455563, + 1.745979983987019, + 1.4648461497579701, + 1.7459799615573373, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28_high/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28_high/norm_stats_meta.json new file mode 100644 index 0000000..18bb906 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28_high/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unitree_g1_s28_a28_high", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unitree_g1_s28_a28_fps30_cam_high__episodes_227/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 2287, + "num_frames": 73184, + "estimated_total_batches": null, + "train_episodes": 216, + "train_bytes": 3159483310, + "elapsed_sec": 28.13194966316223, + "frames_per_sec": 2601.4549605081866 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28_high/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28_high/unified_action_space.json new file mode 100644 index 0000000..426641a --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_unitree_g1_s28_a28_high/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "beb5c3de296f6dfdd1e27ccc8605130a15e00fbe16608d63c4a5e7e346171784" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_unknown_s30_a30_high/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_unknown_s30_a30_high/norm_stats.json new file mode 100644 index 0000000..fce0f58 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_unknown_s30_a30_high/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.4601517915725708, + 0.28574568033218384, + -0.28942522406578064, + 0.6302258372306824, + -0.4861578345298767, + -0.5207346081733704, + -0.1987939476966858, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.1725141853094101, + 0.0685783177614212, + 0.12817345559597015, + -0.16918662190437317, + -0.4351489543914795, + -0.12865182757377625, + -0.2854554355144501, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.35936683416366577, + -0.39935022592544556, + 0.258500337600708, + 0.5848162770271301, + 0.21070364117622375, + -0.6088512539863586, + -0.01831921748816967, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.29934221506118774, + 0.19203908741474152, + -0.325772225856781, + 0.21082274615764618, + 0.3784441351890564, + 0.1499779373407364, + 0.3509950637817383, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.2189597487449646, + 0.14171771705150604, + 0.43653634190559387, + 0.362621009349823, + 0.499917209148407, + 0.36899834871292114, + 0.22155988216400146, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4452809989452362, + 0.6484705805778503, + 0.27489814162254333, + 0.4036325514316559, + 0.6206685304641724, + 0.3343346416950226, + 0.5257602334022522, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22628849744796753, + 0.1428905427455902, + 0.3611524999141693, + 0.4151686429977417, + 0.3856017589569092, + 0.3003835678100586, + 0.255756139755249, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22143076360225677, + 0.45618167519569397, + 0.5058495998382568, + 0.4284057021141052, + 0.5871851444244385, + 0.3656456768512726, + 0.5761141777038574, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.101659857749939, + -0.018607720243930814, + -1.584791460418701, + -0.30841166829466815, + -1.360724712395668, + -1.1547250646352767, + -0.7063347400903701, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5, + -0.7200000286102295, + 0.0, + -1.5700000524520874, + -1.745300054550171, + -1.3875660463571549, + -1.6754880523681641, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.9737500015258789, + -0.7816216490864754, + -0.6477329211235047, + -0.3947790165305138, + -1.0113668236732483, + -1.1912066125869751, + -0.5944325535297394, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5, + -0.6045961649179459, + -1.587001287984848, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.18273090934753422, + 0.7255914891004562, + 0.7783089427948, + 1.3746503059208395, + 1.1035205349683763, + 0.49836549907922745, + 0.3299396315336227, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4998, + 0.9196720166802406, + 1.7449509945392607, + -0.0003140000104904228, + -0.0003490600109101738, + -0.0003140000104904228, + -0.0003490600109101738, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.23939910240173345, + -0.08035749015212068, + 1.2898316625356676, + 1.499683491653204, + 0.7804335985660553, + 0.2747516059875488, + 0.6979348600387574, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4166000000000001, + 0.7197225100278855, + -0.00033319363594053186, + 1.569686052441597, + 1.7449509945392607, + 1.369924903869629, + 1.675138992357254, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0014253475237637758, + 0.004040827043354511, + 0.00401429645717144, + -0.0006249065627343953, + -0.0007871320121921599, + 0.004092377610504627, + -0.007282583974301815, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.17188459634780884, + 0.09245369583368301, + 0.1286001205444336, + -0.17128616571426392, + -0.43959158658981323, + -0.13044847548007965, + -0.28975656628608704, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0018386616138741374, + -0.0017423932440578938, + -0.002052909228950739, + -0.0004560645029414445, + 0.006413742434233427, + -0.0015468160854652524, + 0.0011579451384022832, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.29914090037345886, + 0.1900770366191864, + -0.3282303512096405, + 0.21167583763599396, + 0.3810122311115265, + 0.15109674632549286, + 0.3544777035713196, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.08548260480165482, + 0.059953778982162476, + 0.14716483652591705, + 0.15606258809566498, + 0.15485815703868866, + 0.13305547833442688, + 0.08386557549238205, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.44540083408355713, + 0.6780035495758057, + 0.27485981583595276, + 0.40709882974624634, + 0.6220939755439758, + 0.3366040885448456, + 0.5278019905090332, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0954136922955513, + 0.053427211940288544, + 0.13860651850700378, + 0.17628909647464752, + 0.143167182803154, + 0.10808171331882477, + 0.08713337779045105, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22215959429740906, + 0.45735371112823486, + 0.5071426630020142, + 0.42950281500816345, + 0.5888646245002747, + 0.36695989966392517, + 0.5784511566162109, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.28645844354629524, + -0.18376410233974455, + -0.46031000661849975, + -0.5777189530849457, + -0.525499416065216, + -0.40847072732448586, + -0.3366838617324829, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5, + -0.7243000268936157, + 0.0, + -1.5707999467849731, + -1.745300054550171, + -1.3876446729898453, + -1.6754880523681641, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.3106002992868423, + -0.17958201030492782, + -0.5006137095689773, + -0.6031595508575439, + -0.48816414699554445, + -0.34850764927864075, + -0.2802416110396385, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5, + -0.6044009449958802, + -1.587001287984848, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.29917649668455115, + 0.21889999203681954, + 0.531090847492218, + 0.5048572306632997, + 0.5642101072788241, + 0.5288397431373595, + 0.24146718263626088, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4998, + 1.046845664525032, + 1.7449509945392607, + -0.0003141599893570213, + -0.0003490600109101738, + -0.0003141599893570213, + -0.0003490600109101738, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.32684008424282074, + 0.16315318412780755, + 0.41679275200367005, + 0.5781977668762206, + 0.5312393463134764, + 0.4175895518779753, + 0.3207163540005684, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4166000000000001, + 0.7240216483116149, + -0.00033319363594053186, + 1.569686052441597, + 1.7449509945392607, + 1.369924903869629, + 1.675138992357254, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_unknown_s30_a30_high/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_unknown_s30_a30_high/norm_stats_meta.json new file mode 100644 index 0000000..345f7da --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_unknown_s30_a30_high/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_unknown_s30_a30_high", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unknown_s30_a30_fps30_cam_high__episodes_891/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 8154, + "num_frames": 260914, + "estimated_total_batches": null, + "train_episodes": 846, + "train_bytes": 20178322671, + "elapsed_sec": 82.17656183242798, + "frames_per_sec": 3175.041571245681 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_unknown_s30_a30_high/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_unknown_s30_a30_high/unified_action_space.json new file mode 100644 index 0000000..426641a --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_unknown_s30_a30_high/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "beb5c3de296f6dfdd1e27ccc8605130a15e00fbe16608d63c4a5e7e346171784" +} diff --git a/assets/cotrain_full_all_full_norm/robocoin_yinhe_s49_a16/norm_stats.json b/assets/cotrain_full_all_full_norm/robocoin_yinhe_s49_a16/norm_stats.json new file mode 100644 index 0000000..49a8dd4 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_yinhe_s49_a16/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 1.524367094039917, + -1.3065650463104248, + -0.5391265749931335, + -1.9779719114303589, + 0.042856667190790176, + 0.1487847864627838, + -0.05886118486523628, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.6645289063453674, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.49284985661506653, + 1.0417016744613647, + -0.322103887796402, + 1.5314422845840454, + 0.26630860567092896, + -0.10916095227003098, + -0.5114750862121582, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7098702192306519, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.2897261083126068, + 0.19842040538787842, + 0.2448112666606903, + 0.21612223982810974, + 0.6295380592346191, + 0.2960987687110901, + 0.1680130958557129, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2784114181995392, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.934599757194519, + 0.27511605620384216, + 0.8904873728752136, + 0.42886051535606384, + 0.34848248958587646, + 0.3541565239429474, + 0.565496027469635, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1976504921913147, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + 0.7376339052915573, + -1.6099701312497259, + -0.885706602358818, + -2.3163964335680007, + -1.0850703057050706, + -0.47425655221939084, + -0.44927409212589264, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.08486673181802035, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.891990763092041, + 0.4447629337310792, + -1.839495149588585, + 0.5765320897683501, + -0.5520781661987304, + -0.735830457687378, + -1.3432193279266358, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.10670718535780907, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.904548677366972, + -0.795198133945465, + 0.18943803424835215, + -1.2896517002105712, + 1.6342880125045776, + 0.7360185463428499, + 0.3375669756293296, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9067215650454163, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9615902823448184, + 1.5525214227437973, + 0.9610611121892929, + 2.3590748086735607, + 0.9761594358444214, + 0.7660390744209289, + 0.45407201790809637, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9067818530648947, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.00006569585093529895, + -0.0002367628476349637, + -0.0004524707910604775, + 0.0005102173890918493, + -0.001635607099160552, + -0.006574156228452921, + 0.0007140140514820814, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.665635883808136, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.01432245783507824, + 0.009032520465552807, + 0.010951328091323376, + 0.006414332427084446, + 0.004951334558427334, + 0.008958633057773113, + 0.008657954633235931, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.711277961730957, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1834850162267685, + 0.10580053180456161, + 0.18292799592018127, + 0.18817037343978882, + 0.3076501786708832, + 0.15092547237873077, + 0.1127411350607872, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2779955565929413, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.45669886469841003, + 0.2752196490764618, + 0.40178874135017395, + 0.2569642961025238, + 0.2553403973579407, + 0.24139155447483063, + 0.1890239715576172, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.19659824669361115, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6143484880447387, + -0.39371692562103267, + -0.6777150949001312, + -0.6583128417015075, + -1.4426410250663757, + -0.6675770700454713, + -0.4131294379234314, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.08486673181802035, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.7665856656551362, + -0.8687658917427064, + -1.09206223115921, + -0.84294264087677, + -0.609202272439003, + -0.8176013734817504, + -0.6940191761016845, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.10670718535780907, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6324825129508973, + 0.3164169328212738, + 0.6923210113048555, + 0.5968620174407961, + 1.15903103017807, + 0.5463467423677444, + 0.44189159464836125, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9067215650454163, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.2043245237350462, + 0.669174746847153, + 1.794497901535034, + 0.7042711029052735, + 0.8618204277515411, + 0.7357967818260196, + 0.7027042475700376, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9067818530648947, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_yinhe_s49_a16/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robocoin_yinhe_s49_a16/norm_stats_meta.json new file mode 100644 index 0000000..63d08ff --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_yinhe_s49_a16/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robocoin_yinhe_s49_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/yinhe_s49_a16_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5452/robocoin_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 153600, + "num_frames": 4915186, + "estimated_total_batches": null, + "train_episodes": 5179, + "train_bytes": 711128217385, + "elapsed_sec": 1323.132462978363, + "frames_per_sec": 3714.810223109443 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robocoin_yinhe_s49_a16/unified_action_space.json b/assets/cotrain_full_all_full_norm/robocoin_yinhe_s49_a16/unified_action_space.json new file mode 100644 index 0000000..285dfcf --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robocoin_yinhe_s49_a16/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "df6e3ea1278ba06ec1cd8fc9405c482c55982b5ac43bbfb1dee1f5bfcd1a468a" +} diff --git a/assets/cotrain_full_all_full_norm/robomind_agilex_cobot_magic_s14_a14/norm_stats.json b/assets/cotrain_full_all_full_norm/robomind_agilex_cobot_magic_s14_a14/norm_stats.json new file mode 100644 index 0000000..f699bd5 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_agilex_cobot_magic_s14_a14/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.2912142872810364, + 0.7706507444381714, + 0.8166523575782776, + -0.5391867160797119, + 0.17443010210990906, + -0.03291980177164078, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.037457823753357, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3165360689163208, + 0.7844910025596619, + 0.8448988199234009, + -0.6473979949951172, + -0.19697701930999756, + 0.09821853041648865, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.071836233139038, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.31844455003738403, + 0.6649036407470703, + 0.6359055638313293, + 0.3965521454811096, + 0.26199185848236084, + 0.19108326733112335, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.6735684871673584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2895064651966095, + 0.5852402448654175, + 0.5345459580421448, + 0.4037196934223175, + 0.25300946831703186, + 0.17583996057510376, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.6739572286605835, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.1008532051086426, + 0.0013943950653076175, + 0.014930963516235352, + -1.3446834449768066, + -0.46284152030944825, + -0.5668264865875243, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.01151485834121704, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.09137299480438232, + 0.0024674806594848636, + 0.013868572044372559, + -1.356740512084961, + -0.730856520652771, + -0.36164791870117186, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.015304181719198822, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.11911020965576169, + 2.1889521074295044, + 2.31054425239563, + 0.27205753517150866, + 0.8036104869842529, + 0.5188723945617677, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 5.357991581296921, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0514802862167358, + 2.167783304977417, + 2.112537544631958, + 0.07684082565307637, + 0.48839656925201425, + 0.5515233222961426, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 5.254145598340035, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.00031540499185211957, + -0.007605055347084999, + -0.013626378029584885, + 0.01294397097080946, + -0.008090313524007797, + 0.013309093192219734, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.3646289110183716, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0019422572804614902, + -0.007419590372592211, + -0.011846384033560753, + 0.012537145055830479, + 0.006900215987116098, + -0.007588144391775131, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.5834583044052124, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.1662832796573639, + 0.3357270061969757, + 0.2942589521408081, + 0.2550986111164093, + 0.16362538933753967, + 0.1354900598526001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.0903167724609375, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.15850712358951569, + 0.3416793942451477, + 0.28663069009780884, + 0.2630174458026886, + 0.13510547578334808, + 0.12409359216690063, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.1895596981048584, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.521558889389038, + -1.025707421875, + -1.1375078313827516, + -0.7164978378295899, + -0.5593309104919433, + -0.39902141418457027, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.09417187500000002, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5945680046081545, + -1.064510614013672, + -1.072522581100464, + -0.7810182523727416, + -0.42451723403930663, + -0.4333285047531128, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.16773752975463874, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6086202415466309, + 0.9857216306686398, + 0.8020620159149168, + 0.9357657577514651, + 0.5060111686706543, + 0.4612753326416015, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 6.653624244689942, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5080000579833981, + 1.0137772064208983, + 0.8535642738342282, + 0.9668074893951419, + 0.47746843833923336, + 0.33230566730499245, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 6.698792873382567, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_agilex_cobot_magic_s14_a14/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robomind_agilex_cobot_magic_s14_a14/norm_stats_meta.json new file mode 100644 index 0000000..af277e0 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_agilex_cobot_magic_s14_a14/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_agilex_cobot_magic_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/agilex_cobot_magic_agilex_dual_arm_h5_agilex_3rgb_real_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10374/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 196965, + "num_frames": 6302870, + "estimated_total_batches": null, + "train_episodes": 9855, + "train_bytes": 1015824843385, + "elapsed_sec": 1625.2714269161224, + "frames_per_sec": 3878.0414739459275 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_agilex_cobot_magic_s14_a14/unified_action_space.json b/assets/cotrain_full_all_full_norm/robomind_agilex_cobot_magic_s14_a14/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_agilex_cobot_magic_s14_a14/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_fr3_dual_s16_a16/norm_stats.json b/assets/cotrain_full_all_full_norm/robomind_franka_fr3_dual_s16_a16/norm_stats.json new file mode 100644 index 0000000..56764de --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_fr3_dual_s16_a16/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.02872992493212223, + -0.03250863403081894, + -0.044107649475336075, + -1.9217846393585205, + -0.03335548937320709, + 1.8634817600250244, + -0.09915560483932495, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.27069082856178284, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.007103583309799433, + 0.09939762949943542, + 0.17450419068336487, + -1.4917900562286377, + -0.14953744411468506, + 1.5298478603363037, + 0.17748871445655823, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.17512521147727966, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.24050824344158173, + 0.18076345324516296, + 0.162387877702713, + 0.3688068687915802, + 0.26190441846847534, + 0.38791725039482117, + 0.42700111865997314, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.38373228907585144, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.20354995131492615, + 0.18818333745002747, + 0.14312860369682312, + 0.09749498218297958, + 0.42516154050827026, + 0.23171094059944153, + 0.315849632024765, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3484148383140564, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.7479126671791076, + -0.4948742458820343, + -0.4937059134244919, + -2.6657454515457153, + -0.7740779214859008, + 1.3427923250198364, + -1.4256502631664276, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.26181291670799256, + -0.12531252807974816, + -0.14902960658073428, + -1.8273668120980262, + -1.7342645349979402, + 1.3332580568790435, + -0.24545768320560457, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.004200000000000001, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6294316546440124, + 0.4177898835539817, + 0.3835556173324586, + -1.4613578771591187, + 0.8686296574592591, + 2.6317525205612182, + 1.02927272901535, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.991, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.665686247253418, + 0.6005449758857488, + 0.5071338846683502, + -1.253091666698456, + 0.17801692837476724, + 2.4559928531885147, + 1.320400775194168, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.991, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.00579951424151659, + 0.0009321922552771866, + 0.0001605675497557968, + 0.01468118466436863, + 0.004086125176399946, + -0.009518737904727459, + -0.0008803497767075896, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3470822870731354, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.009737007319927216, + -0.0050971596501767635, + 0.003751665586605668, + 0.002095873700454831, + 0.007014834322035313, + -0.006377325858920813, + -0.0024907798506319523, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.17645229399204254, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.18581676483154297, + 0.1604117602109909, + 0.09761915355920792, + 0.279049277305603, + 0.22557272017002106, + 0.3101310133934021, + 0.3323877155780792, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4602535367012024, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1281752586364746, + 0.11369078606367111, + 0.07542045414447784, + 0.07059511542320251, + 0.24174679815769196, + 0.14355233311653137, + 0.23310133814811707, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.35898837447166443, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.6203167253017425, + -0.5089887523770332, + -0.31527611851692194, + -0.861568698644638, + -0.7907215990066527, + -0.9439559233188629, + -0.9502868450164795, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5435035077095032, + -0.4396112471818924, + -0.27968518979549417, + -0.2505410222053528, + -1.0277889500141142, + -0.5418802068948746, + -0.8036095057487488, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.00437053572118748, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.6547829939365386, + 0.47977734111547465, + 0.3555985690355301, + 0.6909391857385636, + 0.7429793606758119, + 0.839421225786209, + 1.1230383680343627, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3702085198402405, + 0.3635676041245459, + 0.25351028020381916, + 0.2524659325599672, + 1.0453574712753295, + 0.48159508218765246, + 1.0040429187774658, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998000744047633, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_fr3_dual_s16_a16/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robomind_franka_fr3_dual_s16_a16/norm_stats_meta.json new file mode 100644 index 0000000..3c018d2 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_fr3_dual_s16_a16/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_fr3_dual_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_fr3_dual_master_puppet_joint_position_h5_franka_fr3_dual_real_s16_a16_fps30_cam_high_cam_left_cam_right_cam_top__episodes_1774/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 11198, + "num_frames": 358321, + "estimated_total_batches": null, + "train_episodes": 1685, + "train_bytes": 186172127608, + "elapsed_sec": 205.53938150405884, + "frames_per_sec": 1743.3204156689756 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_fr3_dual_s16_a16/unified_action_space.json b/assets/cotrain_full_all_full_norm/robomind_franka_fr3_dual_s16_a16/unified_action_space.json new file mode 100644 index 0000000..fd388aa --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_fr3_dual_s16_a16/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9a0d9895669ad5b106f765ca2cb33f8c41f383ef7498ec7c090f1b00097964c7" +} diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_panda_s8_a8/norm_stats.json b/assets/cotrain_full_all_full_norm/robomind_franka_panda_s8_a8/norm_stats.json new file mode 100644 index 0000000..64bb6f7 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_panda_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.050074514001607895, + 0.2168712615966797, + -0.04304725304245949, + -1.6480380296707153, + -0.04889731854200363, + 1.981959581375122, + 0.027210397645831108, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.31860384345054626, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.20079824328422546, + 0.21306701004505157, + 0.14047782123088837, + 0.21161852777004242, + 0.18164995312690735, + 0.34882527589797974, + 0.35608425736427307, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3863016366958618, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.43048445436954497, + -0.1407027938723564, + -0.4342776439547539, + -2.307061647772789, + -0.8071739921569825, + 1.4752378027439117, + -0.8850302599906921, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.605513199532032, + 0.7539548544883727, + 0.3651459789872169, + -1.2252477578639984, + 0.34580575790405277, + 2.9056127210855482, + 1.1405179331779483, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.991, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.006179585587233305, + -0.029241317883133888, + -0.004109390079975128, + -0.010029942728579044, + 0.002001858549192548, + -0.020291229709982872, + 0.00541237648576498, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3327816426753998, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17788256704807281, + 0.24914397299289703, + 0.10994547605514526, + 0.2059284746646881, + 0.1720099151134491, + 0.399440199136734, + 0.3174999952316284, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4199410378932953, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5027609734058381, + -0.659905499958992, + -0.3669868229150772, + -0.6224279801130295, + -0.5189719449043273, + -1.0841700080633165, + -0.9586771881103513, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5086506120204923, + 0.5854389501810073, + 0.3575911468267441, + 0.6135797002315522, + 0.5958229855537414, + 1.0015189151763915, + 0.94854157409668, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_panda_s8_a8/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robomind_franka_panda_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..2c43271 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_panda_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_panda_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_panda_master_puppet_joint_position_h5_franka_3rgb_real_s8_a8_fps30_cam_left_cam_right_cam_top__episodes_17219/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 57958, + "num_frames": 1854642, + "estimated_total_batches": null, + "train_episodes": 14956, + "train_bytes": 282424151738, + "elapsed_sec": 465.4217314720154, + "frames_per_sec": 3984.8633499218436 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_panda_s8_a8/unified_action_space.json b/assets/cotrain_full_all_full_norm/robomind_franka_panda_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_panda_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_sim_franka_s8_a8/norm_stats.json b/assets/cotrain_full_all_full_norm/robomind_franka_sim_franka_s8_a8/norm_stats.json new file mode 100644 index 0000000..e18c97f --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_sim_franka_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.05431849882006645, + 0.2290264517068863, + 0.06054431572556496, + -1.7516008615493774, + -0.0009821689454838634, + 1.9669047594070435, + 0.10469292104244232, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3105355203151703, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.282229483127594, + 0.34571757912635803, + 0.26973626017570496, + 0.3954300284385681, + 0.2093062847852707, + 0.34419673681259155, + 0.6092366576194763, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.32808253169059753, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.7128893469333648, + -0.7831290235042573, + -0.7018777868747712, + -2.654962126095593, + -0.7293025332927703, + 1.2178158522874118, + -1.579328977584839, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0008327009677886466, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7805238378047945, + 0.996611042022705, + 0.6962547571659083, + -0.801373397190869, + 0.5592271712780001, + 2.9440562456270682, + 1.834556310653686, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7858265437364578, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0003964641073253006, + -0.015292207710444927, + -0.005603020079433918, + 0.008090371266007423, + 0.0009030065848492086, + -0.013399748131632805, + 0.0025455045979470015, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3059731125831604, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.14430563151836395, + 0.23040126264095306, + 0.12359558790922165, + 0.25404950976371765, + 0.1299935132265091, + 0.2845810651779175, + 0.23000602424144745, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.32761436700820923, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.4282694184303284, + -0.7556568478345871, + -0.3945588711738588, + -0.8038546324968339, + -0.384043906879425, + -0.9643010272979735, + -0.766740892744064, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0007800394535064648, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.44182890958786025, + 0.5628056311607361, + 0.3584979928016665, + 0.8073955500125884, + 0.43689187560081466, + 0.7673846399307251, + 0.7996728756904603, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7859916551351547, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_sim_franka_s8_a8/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robomind_franka_sim_franka_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..b68a98f --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_sim_franka_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_franka_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_sim_franka_3rgb_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_14488/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 48250, + "num_frames": 1543972, + "estimated_total_batches": null, + "train_episodes": 8445, + "train_bytes": 675920469639, + "elapsed_sec": 665.9570224285126, + "frames_per_sec": 2318.4258863577616 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_sim_franka_s8_a8/unified_action_space.json b/assets/cotrain_full_all_full_norm/robomind_franka_sim_franka_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_sim_franka_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_sim_none_s8_a8/norm_stats.json b/assets/cotrain_full_all_full_norm/robomind_franka_sim_none_s8_a8/norm_stats.json new file mode 100644 index 0000000..61b96fe --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_sim_none_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.041941363364458084, + 0.23306936025619507, + 0.05907498672604561, + -1.8461532592773438, + -0.008388909511268139, + 2.0598065853118896, + 0.03718278184533119, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.16530641913414001, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3363783061504364, + 0.24904070794582367, + 0.27618101239204407, + 0.3934434950351715, + 0.12503312528133392, + 0.2713543772697449, + 0.481111615896225, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21115025877952576, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.842514001083374, + -0.14554469878673554, + -0.6748853764891625, + -2.5493086941719056, + -0.3112471418917179, + 1.444778957772255, + -1.0551550045967102, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0010764459133148496, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8897254436969759, + 1.0443386925697327, + 0.5906232087850571, + -0.7863341999053957, + 0.31217047451734536, + 2.5325355393886566, + 2.0018143637895585, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7445413999080657, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0013613005867227912, + -0.0019828719086945057, + -0.004892994649708271, + 0.040003255009651184, + 0.003110992955043912, + -0.026717711240053177, + 0.002946416148915887, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1649303436279297, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1734810769557953, + 0.18704959750175476, + 0.1274677813053131, + 0.26024433970451355, + 0.07944203168153763, + 0.23101893067359924, + 0.20181050896644592, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.21115633845329285, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.5883622665405273, + -0.5670622599601746, + -0.4257954135894776, + -0.7182313198089599, + -0.22942946300506595, + -0.6761015580177308, + -0.6581925751209259, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0007068812847137451, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5921108510971069, + 0.532150031197071, + 0.4482104328155516, + 0.7808476925373078, + 0.2439403713226318, + 0.6174762445449828, + 0.6635519044399261, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7441247965335847, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_sim_none_s8_a8/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robomind_franka_sim_none_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..fc6ca81 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_sim_none_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_none_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_none_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_222/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1107, + "num_frames": 35418, + "estimated_total_batches": null, + "train_episodes": 211, + "train_bytes": 6706236456, + "elapsed_sec": 11.181196451187134, + "frames_per_sec": 3167.6395414946483 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_sim_none_s8_a8/unified_action_space.json b/assets/cotrain_full_all_full_norm/robomind_franka_sim_none_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_sim_none_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats.json b/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats.json new file mode 100644 index 0000000..f9b87d7 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.12862539291381836, + 0.10420803725719452, + 0.1507907211780548, + -1.6999670267105103, + -0.14460554718971252, + 1.9053664207458496, + 0.4335462749004364, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.06511421501636505, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6245681643486023, + 0.34309419989585876, + 0.5870680809020996, + 0.40795278549194336, + 0.20813338458538055, + 0.2701113522052765, + 1.0759789943695068, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.12459228187799454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -2.8998490468978884, + -0.7582584895730018, + -0.744865327835083, + -2.576282403945923, + -0.6427169109582901, + 1.281201576291985, + -2.211445552444458, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.001115015268325692, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8701619072914122, + 0.8050513436913491, + 2.8916868991851805, + -0.970624508154392, + 0.5479656597852707, + 2.4191241051438204, + 2.5220915309906005, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5271702873706818, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.004356690216809511, + -0.010021368972957134, + -0.005047916434705257, + -0.016711799427866936, + -0.011854293756186962, + 0.03055323101580143, + 0.029920563101768494, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.06573743373155594, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17619915306568146, + 0.17244896292686462, + 0.18936899304389954, + 0.22039532661437988, + 0.11159107834100723, + 0.18016842007637024, + 0.2773687541484833, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.12432067841291428, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.559387174797058, + -0.5706956774711609, + -0.5846574388504027, + -0.8416802699804307, + -0.3643048192501068, + -0.4927735840797425, + -0.7364192728042602, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0008005832195281393, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5136722531795503, + 0.43214548578262324, + 0.5519980060100553, + 0.5205945446729658, + 0.3414099413871765, + 0.6120740163803098, + 1.1303667816162108, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5277051842689515, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..a224597 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_no_front_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_simulation_no_front_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_handeye_cam_left_external_cam_right_external__episodes_158/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 1067, + "num_frames": 34125, + "estimated_total_batches": null, + "train_episodes": 150, + "train_bytes": 7133719955, + "elapsed_sec": 11.634025812149048, + "frames_per_sec": 2933.2064885367827 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_no_front_s8_a8/unified_action_space.json b/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_no_front_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_no_front_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_s8_a8/norm_stats.json b/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_s8_a8/norm_stats.json new file mode 100644 index 0000000..4454c2c --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_s8_a8/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.058677639812231064, + -0.020728396251797676, + 0.061011988669633865, + -1.6386123895645142, + -0.0016661359695717692, + 1.85384202003479, + 0.0318516306579113, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.14600756764411926, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5181325078010559, + 0.3683291971683502, + 0.47908589243888855, + 0.40745365619659424, + 0.24538974463939667, + 0.3270070254802704, + 1.1062960624694824, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.22717800736427307, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.9134195173263548, + -0.9667847575187684, + -1.4075731660842894, + -2.5127280881881715, + -0.7051276074171067, + 1.1881394446477294, + -2.1848897399902345, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.008432700586318953, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.7120905005455018, + 0.8496470478296279, + 1.7842719498634345, + -0.7269027355104685, + 0.7306575120687486, + 2.559558767311461, + 2.2310024108886717, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7833485061168672, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0030864360742270947, + -0.014526627026498318, + -0.008263246156275272, + -0.021576467901468277, + 0.0018557735020294785, + 0.007785191759467125, + -0.005972929298877716, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1463216096162796, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2138717919588089, + 0.20189231634140015, + 0.20727543532848358, + 0.25472593307495117, + 0.12306797504425049, + 0.25284504890441895, + 0.3214346170425415, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2268107682466507, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.6992091821670527, + -0.6429719269752503, + -0.6553837590217593, + -0.8025883827686309, + -0.3720137566566468, + -0.8318469825267791, + -1.1202265443801882, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.009108828496933175, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.665241785526276, + 0.5787899346351622, + 0.5988114666938777, + 0.802218522644043, + 0.40542664546966556, + 0.7172769757270818, + 1.1334667954444884, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.783179182076454, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_s8_a8/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_s8_a8/norm_stats_meta.json new file mode 100644 index 0000000..8576f0d --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_s8_a8/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_franka_sim_simulation_s8_a8", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_11422/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 53134, + "num_frames": 1700279, + "estimated_total_batches": null, + "train_episodes": 8662, + "train_bytes": 465501426716, + "elapsed_sec": 452.24869179725647, + "frames_per_sec": 3759.6106541359254 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_s8_a8/unified_action_space.json b/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_s8_a8/unified_action_space.json new file mode 100644 index 0000000..0239421 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_franka_sim_simulation_s8_a8/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "ae5b84bc780ecc377d0bc80c6485614806e3656f6b59653aaaf81b2395f49727" +} diff --git a/assets/cotrain_full_all_full_norm/robomind_tienkung_gello_s16_a16/norm_stats.json b/assets/cotrain_full_all_full_norm/robomind_tienkung_gello_s16_a16/norm_stats.json new file mode 100644 index 0000000..13cf76b --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_tienkung_gello_s16_a16/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.854895830154419, + 0.2895817458629608, + -0.21138238906860352, + -0.6613888740539551, + 0.4681619107723236, + -0.15557539463043213, + -0.1758464127779007, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9139211773872375, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.26177895069122314, + -0.08320410549640656, + 0.13457360863685608, + 0.3343433141708374, + -0.2124287337064743, + 0.036814019083976746, + 0.17251014709472656, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9292864799499512, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.5788174271583557, + 0.25051409006118774, + 0.3781653642654419, + 0.4176454544067383, + 0.6007633805274963, + 0.24877780675888062, + 0.2531377375125885, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1635691225528717, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4761202931404114, + 0.1770811527967453, + 0.3033520579338074, + 0.3387700021266937, + 0.3307650685310364, + 0.14587220549583435, + 0.18914712965488434, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.10804925858974457, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.9158795733362437, + -0.0012460584171116347, + -1.2030685099601746, + -1.5389836430072785, + -0.4265326317191124, + -0.6112608863592148, + -0.6116086971282959, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.4938, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.1381313104391098, + -0.7465972574207931, + -0.48163455011844636, + 0.06347694122642278, + -1.4407999408245087, + -0.28010992536544804, + -0.1230062010616064, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.4978, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.15307473979890363, + 0.8836218490540981, + 0.8103051093101503, + -0.08349389228224768, + 1.8251103843450545, + 0.40191861500740034, + 0.5704657346725464, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.5632996891856195, + -0.0001370591828597778, + 1.187215044903755, + 1.339963426311314, + 0.27724807739257784, + 0.5678760509967802, + 0.6107980014324189, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.0002876046346500516, + 0.000031505733204539865, + 0.0002759836206678301, + 0.00006468334322562441, + -0.0006845134194009006, + 0.00026760270702652633, + 0.00043154990999028087, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.909492552280426, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.00037748011527583003, + 0.0005291275447234511, + -0.00015418844122905284, + -0.00017428975843358785, + 0.0007537910132668912, + -0.00006510389357572421, + -0.00021084601758047938, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.9276549816131592, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.08800079673528671, + 0.07691292464733124, + 0.125771164894104, + 0.12257508188486099, + 0.21586425602436066, + 0.07356905937194824, + 0.06248171627521515, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.17170776426792145, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.05351067706942558, + 0.052141688764095306, + 0.07220736891031265, + 0.05641496554017067, + 0.0876786857843399, + 0.03790133446455002, + 0.0318601094186306, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.11763474345207214, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.3049057404041289, + -0.23326391571760174, + -0.449493436717987, + -0.46661893243789676, + -0.8206052811384201, + -0.264598342704773, + -0.22057663996219634, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.5, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.179220182299614, + -0.19677410819530483, + -0.2365414365530012, + -0.17656873760223402, + -0.29757825162410745, + -0.13061386151313792, + -0.11544653077125544, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.5, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.2864243935346604, + 0.27934236091375353, + 0.4529821054458618, + 0.3896261790275575, + 0.7331835649967196, + 0.24467797489166254, + 0.2423023993253708, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9999, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1760005448102948, + 0.19438928351402285, + 0.2754443703889846, + 0.20665088987350444, + 0.28490007309913645, + 0.1408833035707473, + 0.10577272950410843, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9999, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_tienkung_gello_s16_a16/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robomind_tienkung_gello_s16_a16/norm_stats_meta.json new file mode 100644 index 0000000..f366f10 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_tienkung_gello_s16_a16/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_gello_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_6626/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 102313, + "num_frames": 3274013, + "estimated_total_batches": null, + "train_episodes": 5402, + "train_bytes": 214477074867, + "elapsed_sec": 861.7713775634766, + "frames_per_sec": 3799.1665599950165 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_tienkung_gello_s16_a16/unified_action_space.json b/assets/cotrain_full_all_full_norm/robomind_tienkung_gello_s16_a16/unified_action_space.json new file mode 100644 index 0000000..fd388aa --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_tienkung_gello_s16_a16/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9a0d9895669ad5b106f765ca2cb33f8c41f383ef7498ec7c090f1b00097964c7" +} diff --git a/assets/cotrain_full_all_full_norm/robomind_tienkung_prod1_gello_s16_a16/norm_stats.json b/assets/cotrain_full_all_full_norm/robomind_tienkung_prod1_gello_s16_a16/norm_stats.json new file mode 100644 index 0000000..bcdcf46 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_tienkung_prod1_gello_s16_a16/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.5683960318565369, + 0.22078832983970642, + -0.9512513875961304, + -0.4187726676464081, + -0.10543768852949142, + -0.6398162841796875, + -0.42031657695770264, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.7417075634002686, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.4049739837646484, + -0.5157197117805481, + -0.6557912826538086, + 0.9174462556838989, + -0.31378185749053955, + 0.3021593987941742, + 0.06857848912477493, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.4635191261768341, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.064997598528862, + 0.07037549465894699, + 0.13303446769714355, + 0.11096090823411942, + 0.08682478964328766, + 0.11328177899122238, + 0.13669514656066895, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4326043128967285, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6458616256713867, + 0.26487383246421814, + 0.6870888471603394, + 0.4772903025150299, + 0.3747406303882599, + 0.3143857717514038, + 0.2010403573513031, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4886818826198578, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.7200056463241578, + 0.07263180047273636, + -1.2190638768672943, + -0.5876646458387375, + -0.2917385724902153, + -0.785775899887085, + -0.6443712908029556, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.3306755208015443, + -1.236551355423592, + -1.5572463144063948, + -0.05791391396522516, + -1.486474338889122, + -0.3266377056598663, + -0.3021904477119446, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + -0.4484194566011429, + 0.3981429322063923, + -0.6136722717881203, + -0.19492976818084717, + 0.20381019022464752, + -0.33462102080285544, + -0.0783482120037079, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 2.5609298336505892, + -0.0006793295465874483, + 1.1604881446361541, + 1.7160904976725577, + 0.3718464797258374, + 0.7852976964950562, + 0.6216807430744171, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -1.9119422631774796e-6, + 0.00003626890611485578, + 0.000042202664189971983, + 2.2855781480757287e-6, + -0.000019521587091730908, + -0.00001689448436081875, + -0.00002351773582631722, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.995136022567749, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.020838096737861633, + 0.0010361943859606981, + -0.01129057165235281, + 0.014121136628091335, + 0.000757455884013325, + 0.00705363554880023, + -0.0017818119376897812, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.627912700176239, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0007892947178333998, + 0.0006520548486150801, + 0.0009216390899382532, + 0.0005412636674009264, + 0.0006694264011457562, + 0.0009917672723531723, + 0.0009289574227295816, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.49194738268852234, + 0.19771817326545715, + 0.34000205993652344, + 0.36470067501068115, + 0.19369961321353912, + 0.24002011120319366, + 0.07210414856672287, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4697430729866028, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.0017566436529159544, + -0.0015661208927631384, + -0.001643378257751467, + -0.0015505292415618896, + -0.001824682950973511, + -0.002112814867496482, + -0.0026672667026519936, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.9796605706214905, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.3261862396717072, + -0.548191284418106, + -1.2032444964885711, + -1.0167676458120347, + -0.6221477860212326, + -0.6264349913597107, + -0.27403422360420227, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.002321670353412627, + 0.0019566214606165887, + 0.0028617384910583493, + 0.00153787824511528, + 0.0016360209584236132, + 0.0017452585577964752, + 0.0024165729403495817, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9999959321141243, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.2985927095890046, + 0.5280053668022155, + 0.9517922229290008, + 1.048540046620369, + 0.6327526432275774, + 0.715945652127266, + 0.2349968707561494, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_tienkung_prod1_gello_s16_a16/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robomind_tienkung_prod1_gello_s16_a16/norm_stats_meta.json new file mode 100644 index 0000000..94e52cb --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_tienkung_prod1_gello_s16_a16/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_prod1_gello_s16_a16", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_prod1_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_2959/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 50624, + "num_frames": 1619947, + "estimated_total_batches": null, + "train_episodes": 2811, + "train_bytes": 247276602528, + "elapsed_sec": 426.9908273220062, + "frames_per_sec": 3793.868383918118 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_tienkung_prod1_gello_s16_a16/unified_action_space.json b/assets/cotrain_full_all_full_norm/robomind_tienkung_prod1_gello_s16_a16/unified_action_space.json new file mode 100644 index 0000000..fd388aa --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_tienkung_prod1_gello_s16_a16/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9a0d9895669ad5b106f765ca2cb33f8c41f383ef7498ec7c090f1b00097964c7" +} diff --git a/assets/cotrain_full_all_full_norm/robomind_tienkung_real_s38_a38/norm_stats.json b/assets/cotrain_full_all_full_norm/robomind_tienkung_real_s38_a38/norm_stats.json new file mode 100644 index 0000000..e0dfdfa --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_tienkung_real_s38_a38/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.29493895173072815, + 0.22533413767814636, + -0.1456715613603592, + -0.37044036388397217, + 0.25953322649002075, + -0.2537669241428375, + -0.14796751737594604, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.6502549648284912, + 0.28052079677581787, + 0.018628237769007683, + -0.00005931760824751109, + -0.06009761989116669, + -0.08868148177862167, + -0.05306922644376755, + -0.08859807997941971, + -0.04932575672864914, + -0.08857344835996628, + -0.04816029965877533, + -0.0868636965751648, + 0.33901673555374146, + -0.36104950308799744, + 0.3739446997642517, + 0.5144957900047302, + -0.25866034626960754, + 0.25732022523880005, + 0.2567217946052551, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.649032711982727, + -0.2628367841243744, + 0.0007943143136799335, + 0.0005952698993496597, + -0.07441623508930206, + -0.11178402602672577, + -0.06531063467264175, + -0.10965787619352341, + -0.05747656151652336, + -0.11185495555400848, + -0.05255016312003136, + -0.11343297362327576, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.42973142862319946, + 0.34801846742630005, + 0.22365431487560272, + 0.386581152677536, + 0.2664882242679596, + 0.27903592586517334, + 0.29781287908554077, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.07958385348320007, + 0.15354761481285095, + 0.0561688095331192, + 0.00017206600750796497, + 0.13671790063381195, + 0.20638827979564667, + 0.11897336691617966, + 0.20618008077144623, + 0.11050467938184738, + 0.2060556411743164, + 0.11131685972213745, + 0.20966513454914093, + 0.38633567094802856, + 0.40089690685272217, + 0.3132394552230835, + 0.5028060674667358, + 0.2161499261856079, + 0.31141015887260437, + 0.23277568817138672, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08685781061649323, + 0.16592749953269958, + 0.04572189226746559, + 0.021475350484251976, + 0.1447831094264984, + 0.2241557538509369, + 0.1266137659549713, + 0.21892304718494415, + 0.11279409378767014, + 0.22407935559749603, + 0.11696896702051163, + 0.22903063893318176, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.551503319787979, + -0.00008664713095640764, + -1.0151768641114236, + -1.3711347912874714, + -0.09397810050845146, + -0.6224041401863099, + -0.6123663410186768, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.4750549368372108, + -0.1695621688306332, + -0.0018915223360061462, + -0.00034682036133017397, + -0.5079660029932856, + -0.7161228560261428, + -0.41106695767641066, + -0.7180858494855463, + -0.3930065343528986, + -0.7158253021121025, + -0.43914203009605407, + -0.7168896266222, + -0.09407012546062465, + -1.2874860653210445, + -0.17408913574218754, + -0.001973554491996765, + -0.709429707813263, + -0.6109878363609313, + -0.16301011209487914, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.6588345624923706, + -0.35074032955169676, + -0.12010887455940245, + -0.0012235018730163416, + -0.4831454958856106, + -0.7578432049751282, + -0.4005000331997871, + -0.7217107752307659, + -0.37308507491350174, + -0.7606093155652285, + -0.38641987323760985, + -0.7735595872879029, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.0888273763179781, + 1.1172733630652465, + 0.2808457560360431, + -0.0002945801234921497, + 0.9796338315457105, + 0.4171795751750469, + 0.3170011445522307, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.6579432766681867, + 0.34925238815546034, + 0.3117895703554154, + 0.00018126516474876553, + 0.00030309055969124366, + 0.000028632073849399475, + 0.0002895187854766723, + 0.00010798151530322375, + 0.0008826640248298379, + 0.00007219264842572848, + 0.001360881042480444, + 0.00013528634309745158, + 1.1458640512943268, + -0.00027783659604163624, + 1.2385047981381414, + 1.7348896422088147, + 0.18065005381107335, + 0.614627125453949, + 0.694216549706459, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -1.4432021089196205, + 0.1512626721620559, + 0.17926564176082604, + 0.000026741600036628288, + -0.00002473595589402855, + 0.00024811214208597665, + 0.004195320993661933, + -0.00017910952835265004, + 0.004062597829103454, + 0.0002905553966761065, + 0.01533390641212462, + -0.0003688353538513489, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0007787835202179849, + 0.0004752471577376127, + -0.0004414436989463866, + -0.001414016354829073, + 0.0013652392663061619, + -0.00017888400179799646, + -0.0015178258763626218, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.6531866788864136, + 0.28111645579338074, + 0.018650267273187637, + -0.00005974648956907913, + -0.0601251944899559, + -0.0887242928147316, + -0.053092923015356064, + -0.08864081650972366, + -0.04934830963611603, + -0.08861598372459412, + -0.048186045140028, + -0.0869021937251091, + -0.00015493706450797617, + -0.0017026631394401193, + 0.002548813121393323, + 0.00300780707038939, + -0.003767275018617511, + 0.0016496209427714348, + 0.004904294386506081, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.6519732475280762, + -0.26343226432800293, + 0.0008141772705130279, + 0.0005978844128549099, + -0.07443948835134506, + -0.11183939129114151, + -0.06535311043262482, + -0.10971058905124664, + -0.05751331150531769, + -0.11190853267908096, + -0.052590757608413696, + -0.11349154263734818, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.03156838193535805, + 0.04225211963057518, + 0.021983617916703224, + 0.055804066359996796, + 0.027310846373438835, + 0.01656007580459118, + 0.03123629465699196, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.056290168315172195, + 0.1533438116312027, + 0.05616537109017372, + 0.0001719870779197663, + 0.1367076188325882, + 0.20637281239032745, + 0.11896534264087677, + 0.20616476237773895, + 0.11049602925777435, + 0.20604068040847778, + 0.11130741983652115, + 0.20963548123836517, + 0.04685088247060776, + 0.09096518158912659, + 0.04924608767032623, + 0.10160861164331436, + 0.05757398530840874, + 0.05817423388361931, + 0.06416540592908859, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.06600471585988998, + 0.16580142080783844, + 0.04570968449115753, + 0.021479224786162376, + 0.1447719931602478, + 0.2241283804178238, + 0.12659254670143127, + 0.21889713406562805, + 0.11277542263269424, + 0.22405214607715607, + 0.116791270673275, + 0.22902773320674896, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.09061183040142051, + -0.12404775338172913, + -0.0704024293661118, + -0.2184853252649307, + -0.06330916590690605, + -0.04272201628684996, + -0.06422994765043255, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.5703161955150513, + -0.1695621688306332, + -0.0015250724613666555, + -0.0003453201183583588, + -0.5081007151834667, + -0.7161228560261428, + -0.4112192991763354, + -0.7180858494855463, + -0.39313467007130387, + -0.7158253021121025, + -0.43934326486587527, + -0.7167883361458778, + -0.14155023992061622, + -0.38511696057319633, + -0.11559314941167831, + -0.28750722980499266, + -0.24779948472976687, + -0.16634117028713225, + -0.09492523908615103, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.65917573107481, + -0.35003675141334534, + -0.11971547834873197, + -0.0012235018730163416, + -0.48335779817700386, + -0.7578432049751282, + -0.400345036894083, + -0.7218900377564061, + -0.3732176400005818, + -0.7603991222307086, + -0.386447157740593, + -0.7735595872879029, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.09489202313423162, + 0.1605967822551727, + 0.05606685764789576, + 0.17829083396196377, + 0.08422680478096012, + 0.03788482583761216, + 0.03299186817407607, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.6579432766681867, + 0.34925238815546034, + 0.31197279529273514, + 0.00017976492177695035, + 0.00016837836951022478, + 0.000028632073849399475, + 0.00028995392620556615, + 0.00010798151530322375, + 0.0004982568696141332, + 0.00007219264842572848, + 0.0011596462726592982, + 0.00015841935873028845, + 0.15761798739433286, + 0.2344477727532388, + 0.1723205381035804, + 0.43932262992858884, + 0.1318270815849305, + 0.22612803225517264, + 0.25317158517837535, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -1.5372755635619164, + 0.1512626721620559, + 0.17887224555015568, + 0.000026741600036628288, + -0.00006495730280886569, + 0.00024811214208597665, + 0.003885328382253639, + -0.00017910952835265004, + 0.003930032742023526, + 0.0000803620621562251, + 0.015655354213714556, + -0.0003688353538513489, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_tienkung_real_s38_a38/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robomind_tienkung_real_s38_a38/norm_stats_meta.json new file mode 100644 index 0000000..18a2a87 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_tienkung_real_s38_a38/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_real_s38_a38", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_tiangong_joint_position_none_real_s38_a38_fps30_cam_chest_cam_head__episodes_146/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 3735, + "num_frames": 119501, + "estimated_total_batches": null, + "train_episodes": 139, + "train_bytes": 6479063622, + "elapsed_sec": 51.39154028892517, + "frames_per_sec": 2325.304891197284 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_tienkung_real_s38_a38/unified_action_space.json b/assets/cotrain_full_all_full_norm/robomind_tienkung_real_s38_a38/unified_action_space.json new file mode 100644 index 0000000..710243d --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_tienkung_real_s38_a38/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "b214ec84bd00be699f7085aa13f8ce94a5ec68921992fce7c0a2940630f38cc4" +} diff --git a/assets/cotrain_full_all_full_norm/robomind_tienkung_xsens_s14_a14/norm_stats.json b/assets/cotrain_full_all_full_norm/robomind_tienkung_xsens_s14_a14/norm_stats.json new file mode 100644 index 0000000..8f7426a --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_tienkung_xsens_s14_a14/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + -0.2495279163122177, + 0.17678681015968323, + -0.9840797781944275, + -0.6926301717758179, + 1.2251882553100586, + 0.08307325094938278, + 0.08522151410579681, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.34397265315055847, + -0.25304967164993286, + 0.9509468078613281, + 0.7654147744178772, + -1.22251558303833, + -0.13512815535068512, + -0.06612176448106766, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.26420679688453674, + 0.13415028154850006, + 0.47677046060562134, + 0.511353075504303, + 0.6439276337623596, + 0.20034494996070862, + 0.2428995817899704, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3252720534801483, + 0.1595543771982193, + 0.486541211605072, + 0.5197448134422302, + 0.6544333100318909, + 0.1909613460302353, + 0.23475730419158936, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0170531200945376, + 0.0, + -1.9335804850578309, + -1.6159020401239395, + -0.25997581577301027, + -0.4047948722839355, + -0.5596908693313598, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.08971182259917254, + -0.7222377280950547, + 0.0475586646986194, + 0.18000000715255737, + -2.268928050994873, + -0.6213911081552506, + -0.6453999876976013, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.11371559751033788, + 0.5683805625915528, + -0.04447098979949926, + -0.1803198071599008, + 2.268323050069809, + 0.5785365489721299, + 0.6123555083274841, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.1841395626425744, + -0.0002228440999985093, + 2.0089757517626508, + 1.6936134419083595, + 0.35395139241218576, + 0.32321631383895877, + 0.5418778296709061, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0014831935986876488, + 0.00015102946781553328, + -0.004482831805944443, + -0.0021639675833284855, + -0.005934550892561674, + 0.0005814277101308107, + -0.00021758537332061678, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.005549073684960604, + -0.0006271626916714013, + 0.011006377637386322, + 0.00345456856302917, + 0.01563883200287819, + -0.0009500636951997876, + 0.005533472169190645, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.07221410423517227, + 0.039718322455883026, + 0.10084698349237442, + 0.08547154814004898, + 0.1351594477891922, + 0.0650010034441948, + 0.07518996298313141, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0988258570432663, + 0.05644811689853668, + 0.13093487918376923, + 0.0978231281042099, + 0.16362877190113068, + 0.06877110153436661, + 0.09312713146209717, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.21402704918384552, + -0.13221379663944244, + -0.42410457556247705, + -0.35352271614074704, + -0.5879369888305663, + -0.23091356999874113, + -0.27450559234619143, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.42848923683166507, + -0.21466804106235504, + -0.3375219912767411, + -0.2965521077394486, + -0.4419407671213149, + -0.23360881233215336, + -0.27623119473457325, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.2823349166870117, + 0.14318757643699642, + 0.28834942476749426, + 0.26326848864555363, + 0.3942917404174806, + 0.23076029906272888, + 0.2654346179962157, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.2984188953399658, + 0.186484931564331, + 0.5955430841207503, + 0.3762691063404082, + 0.7537251217126846, + 0.2303286559104918, + 0.3970500724315644, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_tienkung_xsens_s14_a14/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robomind_tienkung_xsens_s14_a14/norm_stats_meta.json new file mode 100644 index 0000000..4499b07 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_tienkung_xsens_s14_a14/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_tienkung_xsens_s14_a14", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_xsens_1rgb_real_s14_a14_fps30_cam_top__episodes_6126/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 103821, + "num_frames": 3322263, + "estimated_total_batches": null, + "train_episodes": 5775, + "train_bytes": 286470910041, + "elapsed_sec": 845.7928259372711, + "frames_per_sec": 3927.986734007127 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_tienkung_xsens_s14_a14/unified_action_space.json b/assets/cotrain_full_all_full_norm/robomind_tienkung_xsens_s14_a14/unified_action_space.json new file mode 100644 index 0000000..afc0e4f --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_tienkung_xsens_s14_a14/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "f93c8bfa8b83fa2fe49ad228c9db87bc4dd52e69118c7113e7db614a87543653" +} diff --git a/assets/cotrain_full_all_full_norm/robomind_ur5e_s7_a7/norm_stats.json b/assets/cotrain_full_all_full_norm/robomind_ur5e_s7_a7/norm_stats.json new file mode 100644 index 0000000..3128de2 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_ur5e_s7_a7/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 2.695399284362793, + -1.8317350149154663, + -1.590991497039795, + -1.160853624343872, + 1.3332312107086182, + 1.140396237373352, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2627898156642914, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5578770637512207, + 0.2017889767885208, + 0.21438661217689514, + 0.2472410500049591, + 0.4078080952167511, + 0.5581804513931274, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.306593120098114, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 1.819643810081482, + -2.436006836152077, + -2.2742806310653685, + -1.6289931789040566, + 0.1827675726890564, + 0.06774346570968626, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.018836079356074332, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 4.076547850751877, + -1.423432668375969, + -1.087432373046875, + -0.6889212518930434, + 2.1168328925490383, + 2.24854149518013, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9015686275437474, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.19636471569538116, + -0.0574476420879364, + 0.013684072531759739, + 0.09973897784948349, + -0.03993012756109238, + -0.14549808204174042, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.3047395348548889, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5691956281661987, + 0.24521367251873016, + 0.22722239792346954, + 0.256473571062088, + 0.4543776214122772, + 0.5897438526153564, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.37293967604637146, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.8262648647785187, + -0.6060506603240967, + -0.6010523344516754, + -0.47804851830005646, + -1.4664543380737305, + -1.7500526297569277, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6849125693798066, + 0.605481555557251, + 0.5930862262487411, + 0.7191051467657088, + 1.1790077186584473, + 1.1551714324951172, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_ur5e_s7_a7/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/robomind_ur5e_s7_a7/norm_stats_meta.json new file mode 100644 index 0000000..34a61b6 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_ur5e_s7_a7/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_robot", + "dataset_id": "robomind_ur5e_s7_a7", + "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/ur5e_master_puppet_joint_position_h5_ur_1rgb_real_s7_a7_fps30_cam_top__episodes_26380/robomind_full_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 118080, + "num_frames": 3778539, + "estimated_total_batches": null, + "train_episodes": 25061, + "train_bytes": 185868082632, + "elapsed_sec": 956.0188310146332, + "frames_per_sec": 3952.3688000892153 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/robomind_ur5e_s7_a7/unified_action_space.json b/assets/cotrain_full_all_full_norm/robomind_ur5e_s7_a7/unified_action_space.json new file mode 100644 index 0000000..eee1142 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/robomind_ur5e_s7_a7/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "6e093b089d4d4b4b7aa30decfa7266d28c6c842db12723952347da59fbb2cae4" +} diff --git "a/docs/\346\250\241\345\236\213\350\276\223\345\205\245\350\276\223\345\207\272\346\212\200\346\234\257\350\247\204\350\214\203.md" "b/docs/\346\250\241\345\236\213\350\276\223\345\205\245\350\276\223\345\207\272\346\212\200\346\234\257\350\247\204\350\214\203.md" new file mode 100644 index 0000000..ab4b6ef --- /dev/null +++ "b/docs/\346\250\241\345\236\213\350\276\223\345\205\245\350\276\223\345\207\272\346\212\200\346\234\257\350\247\204\350\214\203.md" @@ -0,0 +1,737 @@ +# Atom-0 统一动作模型输入输出技术规范 + +## 摘要 + +本文给出 Atom-0 当前 co-training 系统中低层视觉—语言—动作模型的形式化输入输出定义。规范以 +`src/openpi/cotrain/config.py` 中现存的四个训练配置为准:`cotrain_real_only`、 +`cotrain_real_robot`、`cotrain_real_robot_fix` 和 `cotrain_full_all_full_norm`。四者共享同一个 +π0.5 模型结构与统一 80 维动作空间,区别仅在训练数据混合组成和每数据集归一化统计。 + +本文区分三个容易混淆的接口层次: + +1. **RLDS 数据接口**:数据集原生 state/action、图像和文本字段; +2. **模型接口**:经过 80D 映射、差分、归一化、图像处理和 tokenization 后的 + `Observation` 与监督动作块; +3. **执行接口**:模型采样得到统一 80D 动作块后,经过反归一化、可选逆差分和 native + 维度恢复后交给机器人控制器的动作。 + +核心模型的规范输出不是机器人可直接执行的原生绝对动作,而是**归一化空间中的统一 80D +动作块**。任何部署实现都必须显式说明其输出停留在哪一个接口层次。 + +--- + +## 1. 适用范围与符号 + +### 1.1 当前基准配置 + +当前四个 co-training 配置使用同一个 `_UNIFIED_PI05_MODEL`: + +| 配置 | active dataset 数 | 数据范围 | +| --- | ---: | --- | +| `cotrain_real_only` | 2 | Piper30 + Piper2 | +| `cotrain_real_robot` | 37 | 真机 + 开源 robot,保留三个审计风险集 | +| `cotrain_real_robot_fix` | 34 | 上述混合排除三个审计风险集 | +| `cotrain_full_all_full_norm` | 39 | `real_robot_fix` 的 34 个数据集 + 5 个 EgoVerse | + +模型超参数为: + +| 参数 | 当前值 | 含义 | +| --- | ---: | --- | +| 模型类型 | π0.5 | state 以离散 token 进入语言前缀 | +| `action_dim` | 80 | 统一 state/action 宽度 | +| `action_horizon` | 50 | 每次预测未来 50 步动作 | +| `max_token_len` | 384 | 主任务文本与离散 state 的固定 token 长度 | +| 图像槽位数 | 3 | base、left wrist、right wrist | +| 图像分辨率 | 224 × 224 | resize-with-pad 后的模型分辨率 | +| VLM | Gemma 2B | prefix 专家,宽度 2048,18 层 | +| action expert | Gemma 300M | action suffix 专家,宽度 1024,18 层 | +| vision encoder | SigLIP So400m/14 | 14 × 14 patch,输出视觉 patch token | +| 默认 ODE 步数 | 10 | `sample_actions()` 的 Euler 去噪步数 | +| 数值主 dtype | bfloat16 | Transformer 内部矩阵计算配置 | + +当前配置中 `history_length=1`、`ki_enabled=False`、`diverse_context_enabled=False`、 +`use_subgoal_image=False`。因此本文主体描述单时刻、无 KI、无 DCC、无长短期 memory 的实际训练路径; +相关可选字段在附录中单独定义。 + +### 1.2 记号 + +| 记号 | 当前值 | 定义 | +| --- | ---: | --- | +| \(B\) | 运行时决定 | global batch size | +| \(H\) | 50 | action horizon | +| \(D\) | 80 | unified action dimension | +| \(L\) | 384 | prompt token length | +| \(V\) | 3 | image view count | +| \(P\) | 256 | 单路 224×224 图像的 14×14 patch token 数 | +| \(N_p\) | 1152 | 当前 prefix 长度:\(3P+L=768+384\) | +| \(N_s\) | 50 | π0.5 action suffix token 数 | + +所有槽位索引在代码中均为 **0-based**。本文同时给出便于人工阅读的 1-based 编号。 + +--- + +## 2. 端到端接口概览 + +训练数据从 RLDS 到模型的主路径为: + +```text +RLDS trajectory + │ 原生 state[T, Ds] / action[T, Da] / encoded images / prompt[T] + ▼ +dataset-specific restructure + │ 统一字段名、三路 canonical camera、image_mask、dataset_id + ▼ +UnifiedActionSpec scatter + │ state[T,80] / actions[T,80] / action_mask[T,80] + ▼ +action chunking + flatten + mixed-dataset batching + │ state[B,80] / actions[B,50,80] / action_mask[B,80] + ▼ +StandardizedInputs → DispatchDeltaActions → DispatchNormalize + │ 每数据集 delta 语义与 quantile normalization + ▼ +ResizeImages → TokenizePrompt → PadStatesAndActions + │ + ▼ +Observation + supervised Actions + │ + ▼ +π0.5 flow-matching model + ├─ training: masked flow loss[B,50] → scalar mean + └─ inference: normalized unified action chunk[ B,50,80 ] +``` + +`dataset_id` 只用于选择每数据集 delta mask 和 norm stats。`DispatchNormalize` 完成后会将其从样本 +字典中移除,因此**模型不会直接接收 dataset ID**。 + +--- + +## 3. RLDS 标准化输入契约 + +### 3.1 trajectory 级标准字段 + +每个 dataset-specific restructure 最终必须产生以下 trajectory 字段。首维 \(T\) 为 episode +时间长度。 + +| 字段 | dtype | shape | 必需 | 语义 | +| --- | --- | --- | --- | --- | +| `state` | float | `[T, Ds]` | 是 | 数据集原生 proprioceptive state | +| `actions` | float | `[T, Da]` | 是 | 数据集原生逐帧监督动作 | +| `image/base_0_rgb` | encoded bytes | `[T]` | 是 | 主视角图像 | +| `image/left_wrist_0_rgb` | encoded bytes | `[T]` | 是 | 左腕图像或 blank placeholder | +| `image/right_wrist_0_rgb` | encoded bytes | `[T]` | 是 | 右腕图像或 blank placeholder | +| `image_mask/*` | bool | `[T]` | 是 | 对应相机在该帧是否真实存在 | +| `prompt` | string | `[T]` | 是 | 任务语言指令 | +| `prompt_prefix` | string | `[T]` | 推荐 | action mode 与 EEF frame 元信息 | +| `dataset_id` | string | `[T]` | 是 | norm/delta dispatch 键 | + +缺失相机不能仅用全零图像表示,必须同时令对应 `image_mask=False`。当前 EgoVerse、RoboCOIN 和 +RoboMIND 的部分 builder 使用 blank JPEG 补齐结构,并依靠 image mask 阻止模型 attention 到该视角。 + +### 3.2 canonical image slots + +模型始终要求以下三个键存在: + +```text +base_0_rgb +left_wrist_0_rgb +right_wrist_0_rgb +``` + +不同数据集的物理相机通过 restructure 映射到这三个逻辑槽。例如 Piper 使用 `cam_high` 和两个 +wrist camera;EgoVerse 使用 `front_1` 作为 base;只有第一视角的 Ego/Robo 数据会填充两个 masked +wrist placeholder。 + +### 3.3 action chunk 构造 + +对于 trajectory 中第 \(t\) 帧,监督动作块定义为: + +\[ +A_t[h] = a_{\min(t+h,\,T-1)}, \qquad h=0,\ldots,H-1. +\] + +因此 episode 尾部不足 50 步时,不是用零 padding,而是重复最后一个真实动作。chunk 后 trajectory +中的 action shape 从 `[T,80]` 变为 `[T,50,80]`;随后 flatten 产生逐帧样本。 + +--- + +## 4. 统一 80D state/action 空间 + +### 4.1 物理槽位定义 + +统一空间不是“原生向量放在前 \(D_a\) 维、尾部补零”,而是按固定物理语义 scatter。完整槽位如下。 + +| 0-based 范围 | 1-based 范围 | 宽度 | 物理语义 | +| --- | --- | ---: | --- | +| `0:7` | 1–7 | 7 | left arm joints | +| `7:10` | 8–10 | 3 | left EEF position | +| `10:13` | 11–13 | 3 | left EEF Euler rotation | +| `13:16` | 14–16 | 3 | reserved | +| `16` | 17 | 1 | left gripper | +| `17:29` | 18–29 | 12 | left hand joints | +| `29:36` | 30–36 | 7 | right arm joints | +| `36:39` | 37–39 | 3 | right EEF position | +| `39:42` | 40–42 | 3 | right EEF Euler rotation | +| `42:45` | 43–45 | 3 | reserved | +| `45` | 46 | 1 | right gripper | +| `46:58` | 47–58 | 12 | right hand joints | +| `58:64` | 59–64 | 6 | left leg joints | +| `64:70` | 65–70 | 6 | right leg joints | +| `70:72` | 71–72 | 2 | head joints | +| `72:74` | 73–74 | 2 | waist joints | +| `74:80` | 75–80 | 6 | other body joints | + +### 4.2 `UnifiedActionSpec` + +每个 dataset ID 必须注册唯一的 `UnifiedActionSpec`: + +```python +UnifiedActionSpec( + state_mapping=((source_dim, unified_slot), ...), + action_mapping=((source_dim, unified_slot), ...), + absolute_to_delta_slots=(...), + already_delta_slots=(...), +) +``` + +该 spec 同时决定: + +- 原生 state 到 80D 的 scatter; +- 原生 action 到 80D 的 scatter; +- 哪些统一槽位有 action supervision; +- 哪些绝对动作槽需要转成相对当前 state 的 delta; +- norm stats 对应的 mapping fingerprint。 + +对于原生数组 \(x\) 和 mapping \(\mathcal M\),scatter 定义为: + +\[ +u_j = +\begin{cases} +x_i, & (i,j)\in\mathcal M,\\ +0, & j\notin \operatorname{target}(\mathcal M). +\end{cases} +\] + +### 4.3 action mask + +每个数据集的 binary action mask 由 `action_mapping` 自动推导: + +\[ +m_j = \mathbb{1}\left[j\in\operatorname{target}(\mathcal M_a)\right], +\qquad m\in\{0,1\}^{80}. +\] + +trajectory mapping 阶段生成 `[T,80]` mask;flatten 后单样本为 `[80]`;batch 后模型输入为 +`[B,80]`。mask 可以非连续,不能用“前 \(D_a\) 维有效”替代。 + +典型例子: + +- **EgoVerse**:12 个有效槽,分别为左右 EEF position + Euler;68 个槽无监督; +- **DROID/单臂 Franka**:单臂统一写入 right-arm 槽 `29:36`,gripper 写入槽 45; +- **Piper**:左右 6 轴分别写入 `0:6` 与 `29:35`,gripper 写入槽 16 和 45; +- **双臂 7-DoF**:左右 arm 通常使用 `0:7` 与 `29:36`,手或夹爪写入各自语义槽。 + +### 4.4 delta/absolute 混合语义 + +对于 `absolute_to_delta_slots` 中的槽位,训练 action 在归一化前转换为: + +\[ +\Delta a_{t,h,j}=a_{t+h,j}-s_{t,j}. +\] + +注意所有 horizon 动作都减去**当前 observation state \(s_t\)**,而不是分别减去未来 state。 +`already_delta_slots` 不会再次求差;未列入 delta mask 的有效槽保持绝对语义。因此同一个 80D +向量可以同时包含 joint delta、absolute gripper 和 absolute EEF pose。 + +当前 EgoVerse 的 EEF pose 保持 absolute,不做欧拉角差分;Piper、DROID、AgiBot 和多数 +RoboCOIN/RoboMIND 的 arm joint 使用 delta,gripper/hand/body 等依 spec 保持 absolute。 + +--- + +## 5. 归一化与文本状态表示 + +### 5.1 每数据集 quantile normalization + +π0.5 配置使用 quantile normalization。对每个 dataset、每个 state/action 槽独立统计 +\(q_{0.01}\) 和 \(q_{0.99}\),变换为: + +\[ +\tilde{x}=2\frac{x-q_{0.01}}{q_{0.99}-q_{0.01}+10^{-6}}-1. +\] + +归一化不执行显式 clipping,因此极端值可能落在 `[-1,1]` 之外。state 与 action 使用各自的 +80D stats;action stats 是在完成 delta 转换后计算的。 + +未映射槽的 stats 被强制设为: + +```text +mean = 0, std = 1, q01 = -1, q99 = 1 +``` + +因此 scatter 产生的零值归一化后仍为零。加载 stats 时必须同时满足: + +- state/action stats 宽度均为 80; +- `unified_action_space.json` 宽度为 80; +- metadata fingerprint 与当前 `UnifiedActionSpec` 完全一致。 + +当前实现对“整个 dataset norm 目录不存在”只记录 warning 并跳过归一化;这属于危险降级,不应作为 +合法训练模式。生产训练前应通过 preflight 验证所有 active dataset 的 norm 完整性。 + +### 5.2 π0.5 离散 state tokenization + +归一化后的 `state[80]` 仍保留在 `Observation.state` 中,但 π0.5 不把它作为连续 suffix token。 +`TokenizePrompt(discrete_state_input=True)` 将 80 个 state 值分别量化到 256 个 bin,并写入文本: + +```text +{prompt_prefix}Task: {cleaned_prompt}, State: i_1 i_2 ... i_80; +Action: +``` + +其中 nominal 输入范围 `[-1,1]` 被离散为整数 bin。代码使用 `np.digitize`,不额外 clip;因此 +严重越界的 state 应在数据质量检查中提前发现。 + +`prompt_prefix` 的当前格式为: + +```text +Action Mode: joint. +``` + +或: + +```text +Action Mode: eef. EEF Frame: {frame}. +``` + +任务文本会去除首尾空白,将下划线替换为空格,并将换行替换为空格。token 序列使用 BOS,超过 +384 token 时截断,不足时以 token ID 0 padding;`tokenized_prompt_mask` 标记真实 token。 + +一个重要性质是:虽然 `action_mask` 屏蔽了无效 action loss,80 个 state 槽仍全部出现在离散 +state 文本中。无效 state 槽因为映射值和中性 norm 都为零,表现为固定的中性离散 bin。 + +--- + +## 6. 模型级输入定义 + +### 6.1 当前训练 batch + +数据加载器最终产生二元组: + +```python +(observation: Observation, actions: float[B, 50, 80]) +``` + +当前必需字段如下。 + +| `Observation` 字段 | dtype | shape | 数值/语义 | +| --- | --- | --- | --- | +| `images[base_0_rgb]` | float32 | `[B,224,224,3]` | RGB,范围通常为 `[-1,1]` | +| `images[left_wrist_0_rgb]` | float32 | `[B,224,224,3]` | 左腕或 masked placeholder | +| `images[right_wrist_0_rgb]` | float32 | `[B,224,224,3]` | 右腕或 masked placeholder | +| `image_masks[base_0_rgb]` | bool | `[B]` | base 图像有效性 | +| `image_masks[left_wrist_0_rgb]` | bool | `[B]` | 左腕有效性 | +| `image_masks[right_wrist_0_rgb]` | bool | `[B]` | 右腕有效性 | +| `state` | float32 | `[B,80]` | 每数据集 quantile-normalized unified state | +| `action_mask` | bool | `[B,80]` | 逐样本有效 action 槽 | +| `tokenized_prompt` | int32 | `[B,384]` | 任务、action mode、离散 state token | +| `tokenized_prompt_mask` | bool | `[B,384]` | 文本 token padding mask | +| 监督 `actions` | float32 | `[B,50,80]` | normalized unified mixed-semantics action chunk | + +`Observation.from_dict()` 会把 uint8 RGB 从 `[0,255]` 映射到 float32 `[-1,1]`。模型前向要求三个 +canonical image key 全部存在;缺键会立即报错。 + +### 6.2 训练图像增强 + +`compute_loss(train=True)` 内部对图像执行以下处理: + +- 如尺寸不是 224×224,使用保持宽高比的 resize-with-pad; +- 非 wrist 相机:95% random crop、恢复原尺寸、随机旋转 ±5°; +- 所有相机:brightness 0.3、contrast 0.4、saturation 0.5 的 color jitter; +- 推理 `train=False` 时不执行随机增强。 + +图像 mask 不改变像素本身,而是在 token attention mask 中屏蔽对应视角的全部 patch token。 + +### 6.3 mask 缺省行为 + +如果 `Observation.action_mask is None`,`_broadcast_action_mask()` 会返回与 action tensor 同 shape +的全 True mask,即所有 80 维均参与 loss 和采样。这是兼容旧数据的 fallback,不是统一动作训练的 +正常路径。若提供 mask,其 shape 必须严格为 `[B,80]`,随后广播到 `[B,50,80]`;错误宽度会抛出 +`ValueError`。 + +训练时 action mask 由 RLDS 的 `map_trajectory_tensorflow()` 自动生成。在线推理不经过这段 +trajectory mapping;`StandardizedInputs` 只会转发调用方已经提供的 `action_mask`,不会根据 +`dataset_id` 重新生成。因此 dataset-specific inference adapter 必须从目标 `UnifiedActionSpec` +注入 `[80]` mask,随后 `Policy.infer()` 才会添加 batch 维成为 `[1,80]`。否则 sampler 会按 +全 80 维有效运行。 + +同理,在线输入若使用现有 `DispatchNormalize`,必须在 transform 前提供正确 `dataset_id`,使其能 +选择目标数据集 stats;该字段会在进入模型前被移除。 + +--- + +## 7. 模型内部条件表示 + +### 7.1 视觉—语言 prefix + +每路 224×224 图像通过 SigLIP So400m/14 编码。14×14 patch size 在每个空间方向产生 16 个 +patch,因此每路产生 \(16\times16=256\) 个视觉 token。三路图像共 768 token,经 projection +对齐到 Gemma 2B 的 2048 hidden width。 + +固定长度文本产生 384 个 token。当前 prefix 因而为: + +\[ +Z_p\in\mathbb R^{B\times1152\times2048}. +\] + +prefix 内视觉和语言 token 采用 full attention block;padding 文本 token 和无效相机 patch +通过 `input_mask` 屏蔽。 + +### 7.2 action suffix + +训练时的 noisy action \(x_t\in\mathbb R^{B\times50\times80}\) 先经过线性层: + +\[ +\operatorname{Linear}_{in}:\mathbb R^{80}\rightarrow\mathbb R^{1024}, +\] + +形成 50 个 action expert token。标量时间 \(t\) 使用正余弦 embedding 和两层 MLP 映射到 +1024 维,并作为 π0.5 action expert 的 adaptive RMSNorm 条件。与 π0 不同,π0.5 不在 suffix +中加入连续 state token。 + +suffix attention mask 使全部 action token 能读取 prefix,并允许同一个 action block 内的 token +相互作用;prefix token 不能反向读取 action suffix。动作 horizon 不是逐 token 自回归生成。 + +action expert 输出最后 50 个 hidden states,再经: + +\[ +\operatorname{Linear}_{out}:\mathbb R^{1024}\rightarrow\mathbb R^{80} +\] + +得到向量场预测 \(v_\theta(x_t,t,o)\in\mathbb R^{B\times50\times80}\)。 + +--- + +## 8. 训练输出与目标函数 + +### 8.1 flow-matching 构造 + +令 \(a\) 为归一化后的监督动作块,\(m\) 为广播后的 action mask。模型首先执行: + +\[ +a\leftarrow m\odot a,\qquad +\epsilon\leftarrow m\odot\epsilon,\qquad +\epsilon\sim\mathcal N(0,I). +\] + +时间采样为: + +\[ +t=0.999\,z+0.001,\qquad z\sim\operatorname{Beta}(1.5,1). +\] + +代码采用“\(t=1\) 为噪声、\(t=0\) 为数据”的约定: + +\[ +x_t=t\epsilon+(1-t)a, +\qquad +u_t=\epsilon-a. +\] + +模型学习预测速度场 \(u_t\)。 + +### 8.2 masked flow loss + +逐样本、逐 horizon 的 loss 为: + +\[ +\mathcal L_{b,h}= +\frac{\sum_{d=1}^{80}m_{b,d} +\left(v_{\theta,b,h,d}-u_{b,h,d}\right)^2} +{\max\left(\sum_{d=1}^{80}m_{b,d},1\right)}. +\] + +`compute_loss()` 在当前无 KI 配置下返回 shape `[B,50]` 的数组。训练入口再计算: + +\[ +\mathcal L_{train}=\frac{1}{BH}\sum_{b,h}\mathcal L_{b,h}, +\] + +得到用于反向传播的 scalar。该归一化保证有效维度较少的数据集不会因 80D padding 被系统性稀释, +也不会仅因有效维度较多而产生更大的 loss 尺度。 + +无效维度同时满足: + +- ground-truth action 为零; +- sampled noise 为零; +- squared error 乘 mask 后为零; +- 不进入分母的有效维数计数; +- 对该维误差不产生直接梯度。 + +### 8.3 模型训练“输出”的含义 + +训练前向的直接输出是 loss,不是动作: + +```text +compute_loss(...) -> flow_loss[B,50] +train_step(...) -> scalar loss + metrics +``` + +`v_t[B,50,80]` 是内部向量场,不应解释为最终动作预测。 + +--- + +## 9. 推理输出定义 + +### 9.1 ODE 采样 + +`sample_actions()` 从 masked Gaussian noise 开始: + +\[ +x_1=m\odot\epsilon. +\] + +采用显式 Euler 积分,默认 \(N=10\),步长 \(\Delta t=-1/N\): + +\[ +x_{t+\Delta t}=m\odot\left(x_t+\Delta t\, +v_\theta(x_t,t,o)\right), +\qquad t:1\rightarrow0. +\] + +prefix 只计算一次并缓存 KV;每个 ODE step 只重新计算 action suffix。每一步都用 `where(mask, ..., 0)` +强制无效槽为零,因此在正确提供 mask 时最终输出无效维严格为零。 + +### 9.2 核心模型输出 + +核心模型直接返回: + +| 属性 | 定义 | +| --- | --- | +| shape | `[B,50,80]` | +| dtype | float32(`Actions` 接口与 ODE state 的规范 dtype) | +| 空间 | 每数据集 quantile-normalized unified 80D | +| 时间语义 | 从当前 observation 开始的未来 50 步 action chunk | +| 槽位语义 | `UnifiedActionSpec` 定义的 mixed delta/absolute action | +| 无效槽 | 提供 action mask 时严格为 0 | +| 不确定性 | 不单独输出;可通过不同 RNG/noise 重复采样估计 | + +模型不输出 value、success probability、domain label、confidence 或 termination signal。 + +### 9.3 从模型输出恢复到执行动作 + +部署端必须先指定希望得到哪一种输出: + +#### A. normalized unified action + +直接使用模型输出,适合模型内部评估,不适合机器人控制器。 + +#### B. physical-scale unified mixed-semantics action + +使用当前 dataset 的 action quantile stats 反归一化: + +\[ +a=(\tilde a+1)\frac{q_{0.99}-q_{0.01}+10^{-6}}{2}+q_{0.01}. +\] + +结果仍为 `[50,80]`,且仍混合 joint delta 与 absolute gripper/EEF 等语义。 + +#### C. native-layout mixed-semantics action + +按 `action_mapping` 做 inverse gather: + +\[ +y_i=a_j\quad\text{if }(i,j)\in\mathcal M_a. +\] + +输出 shape 为 `[50,Da]`。设计中主动丢弃且没有 mapping 的原生源维度恢复为 0。 + +#### D. native-layout original absolute target + +若控制接口要求恢复数据集原始 absolute joint target,则必须在物理尺度下先逆 delta: + +\[ +a^{abs}_{h,j}=a^{delta}_{h,j}+s_{current,j} +\] + +仅对 `delta_mask=True` 的槽执行,然后再 inverse gather。其他 absolute 槽保持不变。 + +### 9.4 当前 output pipeline 的实现边界 + +仓库已经提供 `StandardizedOutputs`,可执行 unified 80D 到 native source layout 的 inverse mapping; +但当前 `CotrainDataConfig.create()` 没有把它注册到 `data_transforms.outputs`。此外,co-training 的 +per-dataset normalization 由输入侧 `DispatchNormalize` 完成,通用 `create_trained_policy()` 的单份 +`Unnormalize` 不能自动表达一个混合配置中 39 份不同 stats。 + +因此当前代码可以可靠定义和评估**核心模型的 normalized 80D 输出**,但不能假定通用 policy factory +会自动完成以下操作: + +- 根据部署目标 dataset 选择正确 action stats; +- 反归一化 80D action; +- 可选逆 delta; +- 80D 到 native layout 的逆映射。 + +生产部署应构造 dataset-specific policy/output adapter,并显式传入目标 `dataset_id`、对应 norm stats、 +`UnifiedActionSpec` 以及控制器期望的 delta/absolute 语义。 + +--- + +## 10. 训练与推理接口对照 + +| 项目 | 训练 | 推理 | +| --- | --- | --- | +| 图像 | 3 路,允许 masked placeholder | 同训练 | +| 图像增强 | crop/rotate/color jitter | 无随机增强 | +| state | 80D normalized,并写入 prompt token | 同训练 | +| prompt | 必需,固定 384 token | 必需,固定 384 token | +| action mask | `[B,80]`,控制 loss | `[B,80]`,控制 noise 与 ODE 状态 | +| GT actions | `[B,50,80]`,必需 | 不提供 | +| 随机量 | noise + Beta timestep | 初始 Gaussian noise | +| 直接返回 | `flow_loss[B,50]` | `actions[B,50,80]` | +| 默认最终聚合 | batch/horizon mean scalar | 无聚合,返回完整 chunk | + +--- + +## 11. 典型样本实例 + +### 11.1 EgoVerse 样本 + +模型输入中: + +```text +state [B,80] +actions [B,50,80] +action_mask [B,80] +active action slots 7:13 and 36:42 (0-based, end-exclusive) +active dimensions 12 +inactive dimensions 68 +action semantics absolute left/right EEF position + Euler +prompt prefix Action Mode: eef. EEF Frame: . +``` + +仅 Eva 等带真实 wrist camera 的子集对应 wrist masks 为 True;其他 Ego 子集的 wrist images 是 masked +placeholder。loss 只在 12 个 EEF 槽上计算。 + +### 11.2 Piper 样本 + +```text +native state/action 14D +unified arm slots left 0:6, right 29:35 +unified grippers 16, 45 +active dimensions 14 +delta slots 12 arm joints +absolute slots 2 grippers +prompt prefix Action Mode: joint. +``` + +模型输出反归一化后仍是“12 个 joint delta + 2 个 absolute gripper”的 mixed-semantics 动作。 + +### 11.3 DROID/单臂样本 + +单臂动作统一放在 right-arm 区域,而不是 80D 前缀: + +```text +right arm joints slots 29:36 +right gripper slot 45 +active dimensions 8 +``` + +这说明任何 prefix mask 或简单截取 `actions[..., :Da]` 都不能替代 `UnifiedActionSpec` inverse mapping。 + +--- + +## 12. 不变量与失败条件 + +生产训练和推理必须维护以下不变量。 + +1. 所有 co-training 模型的 `action_dim` 必须等于 80; +2. 每个 active dataset ID 必须存在唯一 `UnifiedActionSpec`; +3. state/action mapping 的 source 和 target 索引不能重复; +4. 所有 target slot 必须位于 `[0,79]`; +5. delta slot 必须同时存在于 state mapping 和 action mapping; +6. batch 中 action mask 必须为 `[B,80]`; +7. 监督 action 必须为 `[B,50,80]`; +8. 三个 canonical image key 必须全部存在; +9. prompt 与 prompt mask 必须同时存在; +10. norm stats 必须为 80D,且 mapping fingerprint 与代码一致; +11. 多数据集 batch 前所有样本必须具有相同 nested structure; +12. `dataset_id` 必须在 normalization 前存在,并在进入 JAX model 前移除。 + +以下行为虽有 fallback,但不应在生产中依赖: + +- 缺失 action mask → 全 80 维有效; +- 缺失整个 dataset norm 目录 → 跳过该 dataset normalization; +- 缺失 image mask → 模型预处理默认该图像有效; +- episode 尾部 future action 不足 → 重复最后动作。 + +--- + +## 13. 当前未进入主路径的可选字段 + +`Observation` 数据结构还支持以下扩展,但当前四个 co-training 配置均未启用: + +| 字段组 | 用途 | 当前状态 | +| --- | --- | --- | +| `state_history[B,T,80]` | MEM proprioceptive history | `history_length=1`,关闭 | +| 5D image history | MEM visual history | 关闭 | +| `subgoal_images` / masks | π0.7 future visual subgoal | 关闭 | +| `dcc_metadata_*` | quality/speed/mistake/success context | 关闭 | +| `dcc_control_*` | control-mode context | 关闭 | +| `dcc_subtask_*` | low-level subtask context | 关闭 | +| `ki_fast_tokens` / masks | KI 辅助 FAST-token supervision | co-training 显式禁止 | +| `memory_summary_*` | high-level memory supervision | 不属于当前低层 action model | + +特别地,当前系统没有 `domain_mask` 模型输入,也没有 Ego/robot 双头输出。Ego 与 robot 样本共享同一个 +action expert,通过视觉、语言、离散 state、action mode、per-dataset normalization 和 action mask +共同条件化。 + +--- + +## 14. 代码依据索引 + +| 主题 | 代码位置 | +| --- | --- | +| 当前四个配置和 π0.5 参数 | `src/openpi/cotrain/config.py` | +| RLDS restructure 与 chunking | `src/openpi/cotrain/rlds_dataset.py` | +| 统一 80D slot/spec/mask | `src/openpi/cotrain/action_space.py` | +| standardized input、delta、per-dataset norm | `src/openpi/cotrain/transforms.py` | +| model transform 顺序 | `src/openpi/training/config.py` | +| normalization 数学 | `src/openpi/transforms.py` | +| state/prompt tokenization | `src/openpi/models/tokenizer.py` | +| `Observation` 数据结构 | `src/openpi/models/model.py` | +| π0.5 input spec | `src/openpi/models/pi0_config.py` | +| prefix/suffix、flow loss、ODE sampler | `src/openpi/models/pi0.py` | +| batch → `Observation` 转换 | `src/openpi/training/data_loader.py` | +| co-training loader | `src/openpi/cotrain/data_loader.py` | +| validation flow/action MSE | `src/openpi/cotrain/eval.py` | +| 通用 policy 输入输出 transform 顺序 | `src/openpi/policies/policy_config.py` | + +--- + +## 15. 规范性总结 + +当前 Atom-0 co-training 模型的最简形式化接口为: + +\[ +f_\theta: +\left( +I^{B\times3\times224\times224\times3}, +M_I^{B\times3}, +S^{B\times80}, +T^{B\times384}, +M_T^{B\times384}, +M_A^{B\times80} +\right) +\longrightarrow +A^{B\times50\times80}. +\] + +其中: + +- 图像为三路 canonical RGB; +- state 是 per-dataset normalized unified 80D,并以离散 token 进入 π0.5; +- task token 同时包含 action mode、可选 EEF frame 和 state 序列; +- action mask 定义每个样本真正受监督/可采样的统一槽位; +- 输出是 normalized unified 80D mixed-semantics action chunk; +- 机器人执行前必须进行 dataset-specific postprocessing。 + +任何声称模型“输入 80D、输出原生机器人动作”的接口描述都不完整;至少还必须说明 normalization、 +mask、delta/absolute 语义、native mapping 和 action horizon。 diff --git a/scripts/audit_unified_action_space.py b/scripts/audit_unified_action_space.py index f52e358..a72b578 100644 --- a/scripts/audit_unified_action_space.py +++ b/scripts/audit_unified_action_space.py @@ -34,10 +34,11 @@ def _configured_datasets(): missing = sorted(set(action_space.UNIFIED_ACTION_SPECS) - set(by_id)) extra = sorted(set(by_id) - set(action_space.UNIFIED_ACTION_SPECS)) raise ValueError(f"Config/spec registry mismatch: missing={missing}, extra={extra}") - active_ids = {dataset.uid for dataset in config._FULL_ALL_DATA.datasets} - # cotrain_full_all predates the second in-house Piper drop; the two new mixtures cover it. - expected_active = set(by_id) - config._FULL_ALL_EXCLUDED_DATASET_IDS - {"piper2"} - if active_ids != expected_active or len(active_ids) != 41: + active_ids = {dataset.uid for dataset in config._FULL_ALL_FIX_DATA.datasets} + expected_active = ( + set(by_id) - config._FULL_ALL_EXCLUDED_DATASET_IDS - config._REAL_ROBOT_FIX_EXCLUDED_DATASET_IDS + ) + if active_ids != expected_active or len(active_ids) != 39: raise ValueError( f"full-all active dataset mismatch: expected={sorted(expected_active)}, got={sorted(active_ids)}" ) diff --git a/scripts/compute_agibot_full_norm_stats_light.py b/scripts/compute_agibot_full_norm_stats_light.py index 92c78d4..6c4e2b3 100644 --- a/scripts/compute_agibot_full_norm_stats_light.py +++ b/scripts/compute_agibot_full_norm_stats_light.py @@ -18,7 +18,7 @@ def main( - config_name: str = "cotrain_full_all", + config_name: str = "cotrain_full_all_full_norm", exp_name: str = "cotrain_full_all_agibot_full_norm_probe", output_assets_name: str = "cotrain_full_all_agibot_full_norm_probe", dataset_id: str = "agibot", diff --git a/scripts/count_cotrain_frames.py b/scripts/count_cotrain_frames.py index 514077a..ff13e5d 100644 --- a/scripts/count_cotrain_frames.py +++ b/scripts/count_cotrain_frames.py @@ -5,7 +5,7 @@ images (cheap). Use the printed frames to set sampling weights for an "N-epoch" run. Usage: - uv run --group rlds python scripts/count_cotrain_frames.py --config-name cotrain_all + uv run --group rlds python scripts/count_cotrain_frames.py --config-name cotrain_full_all_full_norm """ import numpy as np @@ -25,7 +25,6 @@ def cli_main(config_name: str) -> None: for ds in datasets: builder = tfds.builder_from_directory(ds.builder_dir) split = ds.train_split - n_eps = builder.info.splits[split].num_examples # Read ONLY episode_metadata/num_frames (no steps -> no image decode). dset = builder.as_dataset(split=split, shuffle_files=False) frames = 0 diff --git a/scripts/preflight_cotrain_baige.py b/scripts/preflight_cotrain_baige.py index 0c0e11f..7cb493b 100755 --- a/scripts/preflight_cotrain_baige.py +++ b/scripts/preflight_cotrain_baige.py @@ -25,15 +25,19 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: ids = [dataset.uid for dataset in datasets] assert "piper30" in ids assert "piper2" in ids - assert not any(dataset_id.startswith("egoverse_") for dataset_id in ids) expected_counts = { "cotrain_real_only": 2, "cotrain_real_robot": 37, "cotrain_real_robot_fix": 34, + "cotrain_full_all_full_norm": 39, } expected_count = expected_counts[config_name] assert len(ids) == expected_count, (config_name, len(ids), expected_count) - if config_name == "cotrain_real_robot_fix": + if config_name == "cotrain_full_all_full_norm": + assert sum(dataset_id.startswith("egoverse_") for dataset_id in ids) == 5 + else: + assert not any(dataset_id.startswith("egoverse_") for dataset_id in ids) + if config_name in {"cotrain_real_robot_fix", "cotrain_full_all_full_norm"}: assert set(ids).isdisjoint(FIX_EXCLUDED_DATASET_IDS) for marker in ("_CHECKPOINT_METADATA", "manifest.ocdbt"): @@ -81,7 +85,7 @@ def main() -> None: parser = argparse.ArgumentParser() parser.add_argument( "config", - choices=("cotrain_real_only", "cotrain_real_robot", "cotrain_real_robot_fix"), + choices=("cotrain_real_only", "cotrain_real_robot", "cotrain_real_robot_fix", "cotrain_full_all_full_norm"), ) parser.add_argument("--assets-base", type=Path, default=Path("assets")) parser.add_argument("--params-path", type=Path, default=Path(os.environ["PARAMS_PATH"])) diff --git a/scripts/train_cotrain.py b/scripts/train_cotrain.py index 17bfc0c..bc59e9d 100644 --- a/scripts/train_cotrain.py +++ b/scripts/train_cotrain.py @@ -9,7 +9,7 @@ logged per-dataset and aggregated, via `openpi.cotrain.eval` Run with this module's own config registry, e.g.: - uv run python scripts/train_cotrain.py cotrain_droid_sanity \ + uv run python scripts/train_cotrain.py cotrain_real_only \ --exp_name=my_run --data.rlds_data_dir=/path/to/rlds """ diff --git a/src/openpi/cotrain/config-fps30.py b/src/openpi/cotrain/config-fps30.py deleted file mode 100644 index f6344e6..0000000 --- a/src/openpi/cotrain/config-fps30.py +++ /dev/null @@ -1,240 +0,0 @@ -"""Config for multi-dataset RLDS co-training with train/val splits. - -Subclasses the frozen `openpi.training.config.TrainConfig` to add validation-eval -knobs, and provides a `CotrainDataConfig` factory mirroring `RLDSDroidDataConfig` but -backed by `CotrainRLDSDataset` (per-dataset train/val splits). Nothing in openpi is -modified; this module only imports from it. -""" - -import dataclasses -import logging -import pathlib -from typing import Literal - -from typing_extensions import override -import tyro - -import openpi.models.model as _model -import openpi.models.pi0_config as pi0_config -import openpi.shared.download as _download -import openpi.shared.normalize as _normalize -import openpi.training.config as _config -import openpi.training.droid_rlds_dataset as droid_rlds_dataset -import openpi.training.weight_loaders as weight_loaders -import openpi.transforms as _transforms - -import openpi.cotrain.transforms as cotrain_transforms -import openpi.cotrain.weight_loaders as cotrain_weight_loaders -from openpi.cotrain.rlds_dataset import CotrainRLDSDataset - -logger = logging.getLogger(__name__) - - -def load_per_dataset_norm_stats(assets_dirs: pathlib.Path, datasets) -> dict: - """Load per-dataset norm stats from `/` (skip if missing). - - Returns {dataset_name: {"state": NormStats, "actions": NormStats}} for the DispatchNormalize. - """ - stats: dict = {} - for ds in datasets: - try: - d = str(pathlib.Path(assets_dirs) / ds.uid) - stats[ds.uid] = _normalize.load(_download.maybe_download(d)) - logger.info(f"Loaded per-dataset norm stats for '{ds.uid}' from {d}") - except FileNotFoundError: - logger.warning(f"Norm stats for dataset '{ds.uid}' not found under {assets_dirs}; skipping (no norm).") - return stats - - -@dataclasses.dataclass(frozen=True) -class CotrainDataConfig(_config.DataConfigFactory): - """Multi-dataset RLDS data config with per-dataset train/val splits. - - Currently assumes the DROID schema for repack/data transforms (the framework - milestone starts from DROID-format data). Heterogeneous schemas plug in via the - restructure registry in `rlds_dataset.py` plus per-dataset repack transforms here. - """ - - # RLDS path does not use a LeRobot repo_id; give it a default so it isn't a required CLI - # arg. Per-dataset norm stats live under /, not under repo_id. - repo_id: str = "cotrain" - rlds_data_dir: str | None = None - action_space: droid_rlds_dataset.DroidActionSpace | None = None - datasets: tuple[CotrainRLDSDataset, ...] = () - - @override - def create(self, assets_dirs: pathlib.Path, model_config: _model.BaseModelConfig) -> _config.DataConfig: - assert self.rlds_data_dir is not None, "Need to set rlds_data_dir for the co-training RLDS loader." - assert len(self.datasets) > 0, "Need at least one dataset in `datasets`." - - base = self.create_base_config(assets_dirs, model_config) - - # Per-dataset absolute->delta action conversion (e.g. RoboMIND absolute joint). - delta_masks = { - ds.uid: _transforms.make_bool_mask(*ds.delta_action_mask_dims) - for ds in self.datasets - if ds.delta_action_mask_dims is not None - } - dispatch_delta = cotrain_transforms.DispatchDeltaActions(masks_by_dataset=delta_masks) - - # Per-dataset normalization (dispatched at runtime by dataset_id). Quantile norm for - # pi05 (use_quantile_norm is True for non-PI0 models in create_base_config). - per_dataset_stats = load_per_dataset_norm_stats(assets_dirs, self.datasets) - dispatch_norm = cotrain_transforms.DispatchNormalize( - norm_stats_by_dataset=per_dataset_stats, - use_quantiles=base.use_quantile_norm, - ) - - # Generic inputs (uniform schema across datasets) -> per-dataset delta -> per-dataset - # normalization. No per-dataset repack needed (StandardizedInputs reads the nested - # standardized keys directly). Delta MUST precede normalization (stats are on deltas). - data_transforms = _transforms.Group( - inputs=[ - cotrain_transforms.StandardizedInputs(model_type=model_config.model_type), - dispatch_delta, - dispatch_norm, - ], - ) - - model_transforms = _config.ModelTransformFactory()(model_config) - - return dataclasses.replace( - base, - data_transforms=data_transforms, - model_transforms=model_transforms, - rlds_data_dir=self.rlds_data_dir, - action_space=self.action_space, - datasets=self.datasets, - ) - - -@dataclasses.dataclass(frozen=True) -class CotrainTrainConfig(_config.TrainConfig): - """TrainConfig + validation-eval knobs.""" - - # How often (in steps) to run validation. - eval_interval: int = 1000 - # Number of val batches per dataset for the (cheap) flow-loss pass. - num_val_batches: int = 20 - # Whether to also run the (expensive) action-MSE sampling pass. - run_action_mse: bool = True - # Number of val batches per dataset for the action-MSE pass. - num_action_mse_batches: int = 5 - # Denoising steps used by sample_actions during action-MSE eval. - action_mse_num_denoise_steps: int = 10 - # NOTE: the number of valid (non-padded) action dims for the MSE mask is taken - # per-dataset from each CotrainRLDSDataset.action_dim (0 -> all dims). - # Flow-loss estimator(s): "fixed_seed", "multi_sample", or "both". - val_flow_loss_mode: Literal["fixed_seed", "multi_sample", "both"] = "both" - # K for the multi-sample flow-loss estimator. - val_flow_loss_num_samples: int = 8 - # Fixed rng seed for all validation metrics (deterministic, comparable curves). - val_seed: int = 0 - # Evaluate on EMA params instead of live params. - eval_on_ema: bool = False - # Log predicted-vs-GT action-chunk trajectory plots to wandb at each eval. - viz_action_traj: bool = True - # Number of samples per dataset to draw in the trajectory plot. - viz_num_samples: int = 1 - # Shuffle buffer size for the TRAIN loader. Images are buffered ENCODED, but this still - # costs ~buffer_size * (encoded image bytes); lower it if you hit OOM. (val uses ~1.) - shuffle_buffer_size: int = 50_000 - # tf.data parallelism for RLDS reading and mapping. -1 keeps TensorFlow AUTOTUNE. - data_num_parallel_reads: int = -1 - data_num_parallel_calls: int = -1 - - -# --------------------------------------------------------------------------- -# Config registry (separate from openpi's _CONFIGS; selected via this module's cli()). -# --------------------------------------------------------------------------- -# This edited registry intentionally keeps ONLY the requested piper30 RLDS dataset: -# /mnt/data/RLDS/realworld_piper/ -# piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist -# -# Initialization choices: -# - cotrain_piper30_only / cotrain_all / cotrain_all_2ep: -# fine-tune FROM pi05_base checkpoint (the choice we want). -# - cotrain_piper30_only_paligemma: -# initialize FROM raw PaliGemma VLM backbone only (action expert random-init), kept -# as an explicit optional config so the two training starts remain selectable. -# -# For pi05 checkpoint compatibility, keep the model at the default pi05 action_dim -# (do NOT widen to 40; that was only needed for RoboCOIN in the old multi-dataset mix). - -_PIPER30_ROOT = ( - "/mnt/data/RLDS/realworld_piper/" - "piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist" -) -_PIPER30_BUILDER_DIR = f"{_PIPER30_ROOT}/realworld_piper_infidata/1.0.0" - -_PIPER30_DATA = CotrainDataConfig( - rlds_data_dir=_PIPER30_ROOT, - datasets=( - CotrainRLDSDataset( - name="realworld_piper_infidata", - dataset_id="piper30", - version="1.0.0", - builder_dir=_PIPER30_BUILDER_DIR, - weight=1.0, - train_split="train", - val_splits={"seen": "seen_test", "unseen": "unseen_test"}, - restructure_name="three_cam_task", - action_dim=14, - # Piper stores absolute joint targets: delta the 6 arm joints on each side, - # keep both gripper dims absolute. - delta_action_mask_dims=(6, -1, 6, -1), - ), - ), -) - -_PIPER30_ONLY_PI05 = CotrainTrainConfig( - name="cotrain_piper30_only", - model=pi0_config.Pi0Config(pi05=True), - data=_PIPER30_DATA, - # Fine-tune from the trained pi05 VLA checkpoint. This is the selected start point. - # Public openpi checkpoint; includes the PaliGemma backbone plus the trained pi05 action expert. - weight_loader=weight_loaders.CheckpointWeightLoader("gs://openpi-assets/checkpoints/pi05_base/params"), - batch_size=32, - num_train_steps=30_000, - log_interval=100, - save_interval=2_000, - eval_interval=1_000, - num_val_batches=10, - num_action_mse_batches=2, - exp_name=tyro.MISSING, -) - -_PIPER30_ONLY_PALIGEMMA = dataclasses.replace( - _PIPER30_ONLY_PI05, - name="cotrain_piper30_only_paligemma", - # Initialize from the raw PaliGemma VLM backbone only (action expert random-init). - # Use this only if you intentionally want the PaliGemma-start baseline. - weight_loader=cotrain_weight_loaders.LocalPaliGemmaWeightLoader( - npz_path="/mnt/data/cache/openpi/vertex-model-garden-paligemma-us/paligemma/pt_224.npz" - ), -) - -_COTRAIN_CONFIGS = [ - # Clear explicit name for the intended training run. - _PIPER30_ONLY_PI05, - # Backward-compatible aliases: old launch commands will still train ONLY piper30 and - # will now start from pi05, not from PaliGemma. - dataclasses.replace(_PIPER30_ONLY_PI05, name="cotrain_all"), - dataclasses.replace(_PIPER30_ONLY_PI05, name="cotrain_all_2ep"), - # Optional baseline, selectable only by the explicit *_paligemma name. - _PIPER30_ONLY_PALIGEMMA, -] - -if len({c.name for c in _COTRAIN_CONFIGS}) != len(_COTRAIN_CONFIGS): - raise ValueError("Co-train config names must be unique.") -_COTRAIN_CONFIGS_DICT = {c.name: c for c in _COTRAIN_CONFIGS} - - -def cli() -> CotrainTrainConfig: - return tyro.extras.overridable_config_cli({k: (k, v) for k, v in _COTRAIN_CONFIGS_DICT.items()}) - - -def get_config(config_name: str) -> CotrainTrainConfig: - if config_name not in _COTRAIN_CONFIGS_DICT: - raise ValueError(f"Co-train config '{config_name}' not found. Available: {list(_COTRAIN_CONFIGS_DICT)}") - return _COTRAIN_CONFIGS_DICT[config_name] diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index b85f8b5..286b782454 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -737,11 +737,12 @@ def _make_robomind_full_dataset( ) -_FULL_ALL_TRAIN_EPISODES = ( +_ALL_TRAIN_EPISODES = ( _AGIBOT_TRAIN_EPISODES + _DROID_TRAIN_EPISODES + _EGOVERSE_FULL_TRAIN_EPISODES + _PIPER30_TRAIN_EPISODES + + _PIPER2_TRAIN_EPISODES + _ROBOCOIN_TRAIN_EPISODES + _ROBOMIND_FULL_EPISODES ) @@ -749,7 +750,7 @@ def _make_robomind_full_dataset( def _scale_dataset_weights(datasets: tuple[CotrainRLDSDataset, ...], train_episodes: int): return tuple( - dataclasses.replace(ds, weight=ds.weight * train_episodes / _FULL_ALL_TRAIN_EPISODES) for ds in datasets + dataclasses.replace(ds, weight=ds.weight * train_episodes / _ALL_TRAIN_EPISODES) for ds in datasets ) @@ -773,20 +774,6 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): return _drop_dataset_ids_and_renormalize(datasets, _FULL_ALL_EXCLUDED_DATASET_IDS) -_FULL_ALL_DATA = CotrainDataConfig( - rlds_data_dir=_RLDS_ROOT, - datasets=_drop_excluded_and_renormalize( - ( - *_scale_dataset_weights(_AGIBOT_DATA.datasets, _AGIBOT_TRAIN_EPISODES), - *_scale_dataset_weights(_DROID_DATA.datasets, _DROID_TRAIN_EPISODES), - *_scale_dataset_weights(_EGOVERSE_FULL_DATA.datasets, _EGOVERSE_FULL_TRAIN_EPISODES), - *_scale_dataset_weights(_PIPER30_DATA.datasets, _PIPER30_TRAIN_EPISODES), - *_scale_dataset_weights(_ROBOCOIN_DATA.datasets, _ROBOCOIN_TRAIN_EPISODES), - *_scale_dataset_weights(_ROBOMIND_FULL_DATA.datasets, _ROBOMIND_FULL_EPISODES), - ) - ), -) - # In-house real-robot mixture. Weights are proportional to train episode counts. _REAL_ONLY_DATA = CotrainDataConfig( rlds_data_dir=_RLDS_ROOT, @@ -831,6 +818,25 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): ), ) +# Production all-data mixture: the audited real+robot mixture plus EgoVerse. This +# includes both in-house Piper datasets and excludes the two globally disabled +# datasets as well as the three datasets rejected by the real-robot audit. +_FULL_ALL_FIX_DATA = CotrainDataConfig( + rlds_data_dir=_RLDS_ROOT, + datasets=_drop_dataset_ids_and_renormalize( + ( + *_scale_dataset_weights(_PIPER30_DATA.datasets, _PIPER30_TRAIN_EPISODES), + *_scale_dataset_weights(_PIPER2_DATA.datasets, _PIPER2_TRAIN_EPISODES), + *_scale_dataset_weights(_AGIBOT_DATA.datasets, _AGIBOT_TRAIN_EPISODES), + *_scale_dataset_weights(_DROID_DATA.datasets, _DROID_TRAIN_EPISODES), + *_scale_dataset_weights(_EGOVERSE_FULL_DATA.datasets, _EGOVERSE_FULL_TRAIN_EPISODES), + *_scale_dataset_weights(_ROBOCOIN_DATA.datasets, _ROBOCOIN_TRAIN_EPISODES), + *_scale_dataset_weights(_ROBOMIND_FULL_DATA.datasets, _ROBOMIND_FULL_EPISODES), + ), + _FULL_ALL_EXCLUDED_DATASET_IDS | _REAL_ROBOT_FIX_EXCLUDED_DATASET_IDS, + ), +) + _UNIFIED_PI05_MODEL = pi0_config.Pi0Config( pi05=True, @@ -842,111 +848,10 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): ) -_PIPER30_ONLY_PI05 = CotrainTrainConfig( - name="cotrain_piper30_only", - model=_UNIFIED_PI05_MODEL, - data=_PIPER30_DATA, - # Fine-tune from the trained pi05 VLA checkpoint. This is the selected start point. - # Public openpi checkpoint; includes the PaliGemma backbone plus the trained pi05 action expert. - weight_loader=_PI05_BASE_SHAPE_SAFE_LOADER, - batch_size=32, - num_train_steps=30_000, - log_interval=100, - save_interval=5_000, - keep_period=5_000, - eval_interval=1_000, - num_val_batches=10, - num_action_mse_batches=2, - exp_name=tyro.MISSING, -) - -_DROID_ONLY_PI05 = CotrainTrainConfig( - name="cotrain_droid", - model=_UNIFIED_PI05_MODEL, - data=_DROID_DATA, - weight_loader=_PI05_BASE_SHAPE_SAFE_LOADER, - batch_size=32, - num_train_steps=30_000, - log_interval=100, - save_interval=2_000, - eval_interval=1_000, - num_val_batches=10, - num_action_mse_batches=2, - exp_name=tyro.MISSING, -) - -_AGIBOT_ONLY_PI05 = CotrainTrainConfig( - name="cotrain_agibot", - model=_UNIFIED_PI05_MODEL, - data=_AGIBOT_DATA, - weight_loader=_PI05_BASE_SHAPE_SAFE_LOADER, - batch_size=32, - num_train_steps=30_000, - log_interval=100, - save_interval=2_000, - eval_interval=1_000, - num_val_batches=10, - num_action_mse_batches=2, - exp_name=tyro.MISSING, -) - -_EGOVERSE_FULL_ONLY_PI05 = CotrainTrainConfig( - name="cotrain_egoverse_full", - model=_UNIFIED_PI05_MODEL, - data=_EGOVERSE_FULL_DATA, - weight_loader=_PI05_BASE_SHAPE_SAFE_LOADER, - batch_size=32, - num_train_steps=30_000, - log_interval=100, - save_interval=2_000, - eval_interval=1_000, - num_val_batches=10, - num_action_mse_batches=2, - exp_name=tyro.MISSING, -) - -_ROBOCOIN_ONLY_PI05 = CotrainTrainConfig( - name="cotrain_robocoin", - model=_UNIFIED_PI05_MODEL, - data=_ROBOCOIN_DATA, - # Load the PaliGemma VLM backbone and leave the unified 80D action expert randomly initialized. - weight_loader=cotrain_weight_loaders.LocalPaliGemmaWeightLoader( - npz_path="/mnt/data/cache/openpi/vertex-model-garden-paligemma-us/paligemma/pt_224.npz" - ), - batch_size=32, - num_train_steps=30_000, - log_interval=100, - save_interval=2_000, - eval_interval=1_000, - num_val_batches=10, - num_action_mse_batches=2, - exp_name=tyro.MISSING, -) - -_ROBOMIND_FULL_ONLY_PI05 = CotrainTrainConfig( - name="cotrain_robomind_full", - model=_UNIFIED_PI05_MODEL, - data=_ROBOMIND_FULL_DATA, - weight_loader=cotrain_weight_loaders.LocalPaliGemmaWeightLoader( - npz_path="/mnt/data/cache/openpi/vertex-model-garden-paligemma-us/paligemma/pt_224.npz" - ), - batch_size=32, - num_train_steps=30_000, - log_interval=100, - save_interval=2_000, - eval_interval=1_000, - num_val_batches=10, - num_action_mse_batches=2, - exp_name=tyro.MISSING, -) - -_FULL_ALL_PI05 = CotrainTrainConfig( - name="cotrain_full_all", +_REAL_ONLY_PI05 = CotrainTrainConfig( + name="cotrain_real_only", model=_UNIFIED_PI05_MODEL, - data=_FULL_ALL_DATA, - # Initialize from pi05_base for consistency with the piper30-only reproduction. The widened - # 80D action projection/head is not shape-compatible with pi05_base's 32D head, - # so the shape-safe loader skips only those mismatched keys and keeps their random init. + data=_REAL_ONLY_DATA, weight_loader=_PI05_BASE_SHAPE_SAFE_LOADER, lr_schedule=_optimizer.CosineDecaySchedule( warmup_steps=10_000, @@ -965,19 +870,8 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): exp_name=tyro.MISSING, ) -_FULL_ALL_PI05_FULL_NORM = dataclasses.replace( - _FULL_ALL_PI05, - name="cotrain_full_all_full_norm", -) - -_REAL_ONLY_PI05 = dataclasses.replace( - _FULL_ALL_PI05, - name="cotrain_real_only", - data=_REAL_ONLY_DATA, -) - _REAL_ROBOT_PI05 = dataclasses.replace( - _FULL_ALL_PI05, + _REAL_ONLY_PI05, name="cotrain_real_robot", data=_REAL_ROBOT_DATA, ) @@ -988,35 +882,17 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): data=_REAL_ROBOT_FIX_DATA, ) -_PIPER30_ONLY_PALIGEMMA = dataclasses.replace( - _PIPER30_ONLY_PI05, - name="cotrain_piper30_only_paligemma", - # Initialize from the raw PaliGemma VLM backbone only (action expert random-init). - # Use this only if you intentionally want the PaliGemma-start baseline. - weight_loader=cotrain_weight_loaders.LocalPaliGemmaWeightLoader( - npz_path="/mnt/data/cache/openpi/vertex-model-garden-paligemma-us/paligemma/pt_224.npz" - ), +_FULL_ALL_PI05_FULL_NORM = dataclasses.replace( + _REAL_ONLY_PI05, + name="cotrain_full_all_full_norm", + data=_FULL_ALL_FIX_DATA, ) _COTRAIN_CONFIGS = [ - _AGIBOT_ONLY_PI05, - _DROID_ONLY_PI05, - _EGOVERSE_FULL_ONLY_PI05, - _ROBOCOIN_ONLY_PI05, - _ROBOMIND_FULL_ONLY_PI05, - _FULL_ALL_PI05, - _FULL_ALL_PI05_FULL_NORM, _REAL_ONLY_PI05, _REAL_ROBOT_PI05, _REAL_ROBOT_FIX_PI05, - # Clear explicit name for the intended training run. - _PIPER30_ONLY_PI05, - # Backward-compatible aliases: old launch commands will still train ONLY piper30 and - # will now start from pi05, not from PaliGemma. - dataclasses.replace(_PIPER30_ONLY_PI05, name="cotrain_all"), - dataclasses.replace(_PIPER30_ONLY_PI05, name="cotrain_all_2ep"), - # Optional baseline, selectable only by the explicit *_paligemma name. - _PIPER30_ONLY_PALIGEMMA, + _FULL_ALL_PI05_FULL_NORM, ] if len({c.name for c in _COTRAIN_CONFIGS}) != len(_COTRAIN_CONFIGS): diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index a1df335..67b55e6 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -8,6 +8,12 @@ def test_all_registered_cotrain_configs_resolve_to_unified_80d() -> None: + assert {train_config.name for train_config in config._COTRAIN_CONFIGS} == { + "cotrain_real_only", + "cotrain_real_robot", + "cotrain_real_robot_fix", + "cotrain_full_all_full_norm", + } for train_config in config._COTRAIN_CONFIGS: assert train_config.model.action_dim == action_space.UNIFIED_ACTION_DIM datasets = config._resolve_unified_datasets(train_config.data.datasets, train_config.model) @@ -52,3 +58,16 @@ def test_real_robot_fix_excludes_audited_risky_datasets_and_renormalizes() -> No assert len(fixed_ids) == 34 assert sum(dataset.weight for dataset in config._REAL_ROBOT_FIX_DATA.datasets) == pytest.approx(1.0) assert config.get_config("cotrain_real_robot_fix").data is config._REAL_ROBOT_FIX_DATA + + +def test_full_all_full_norm_adds_egoverse_to_audited_real_robot_data() -> None: + real_robot_fix_ids = {dataset.uid for dataset in config._REAL_ROBOT_FIX_DATA.datasets} + full_ids = {dataset.uid for dataset in config._FULL_ALL_FIX_DATA.datasets} + ego_ids = {dataset.uid for dataset in config._EGOVERSE_FULL_DATA.datasets} + + assert full_ids == real_robot_fix_ids | ego_ids + assert len(full_ids) == 39 + assert full_ids.isdisjoint(config._FULL_ALL_EXCLUDED_DATASET_IDS) + assert full_ids.isdisjoint(config._REAL_ROBOT_FIX_EXCLUDED_DATASET_IDS) + assert sum(dataset.weight for dataset in config._FULL_ALL_FIX_DATA.datasets) == pytest.approx(1.0) + assert config.get_config("cotrain_full_all_full_norm").data is config._FULL_ALL_FIX_DATA From e92c916585b132c97276df93ad35fe3c53628116 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Sat, 18 Jul 2026 19:53:02 +0800 Subject: [PATCH 17/64] fix eval bc --- .../egoverse_eva/norm_stats.json | 664 ++++++++++++++++++ .../egoverse_eva/norm_stats_meta.json | 14 + .../egoverse_eva/unified_action_space.json | 5 + ...55\347\273\203\346\214\207\345\215\227.md" | 40 +- scripts/train_cotrain.py | 6 + scripts/train_cotrain_baige.sh | 12 +- src/openpi/cotrain/config.py | 5 + src/openpi/cotrain/data_loader.py | 13 +- tests/cotrain/test_unified_config.py | 14 + 9 files changed, 752 insertions(+), 21 deletions(-) create mode 100644 assets/cotrain_full_all_full_norm/egoverse_eva/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/egoverse_eva/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/egoverse_eva/unified_action_space.json diff --git a/assets/cotrain_full_all_full_norm/egoverse_eva/norm_stats.json b/assets/cotrain_full_all_full_norm/egoverse_eva/norm_stats.json new file mode 100644 index 0000000..4417268 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_eva/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.21694764494895935, + -0.009640873409807682, + 0.2151523381471634, + -1.9103224277496338, + -0.1957010179758072, + -1.4218719005584717, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.23587121069431305, + 0.027654636651277542, + 0.2138872593641281, + -1.9093618392944336, + 0.14110930263996124, + -1.5940476655960083, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.10040386766195297, + 0.10600412636995316, + 0.06951714307069778, + 0.4378910958766937, + 0.36618074774742126, + 0.39978307485580444, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.10580147802829742, + 0.11908546090126038, + 0.08416055142879486, + 0.4722394049167633, + 0.36369559168815613, + 0.4683108627796173, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.07156820869445801, + -0.27314887706041335, + 0.08985615784972906, + -2.8726577929496764, + -1.2694663866996765, + -2.2832934657096864, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.080521536539495, + -0.2719711718440056, + 0.08599748057797552, + -2.876261902332306, + -0.6304698666334152, + -2.772032193851471, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.48046706307828435, + 0.2520531875252724, + 0.40384964402318, + -1.141017590713501, + 0.467980182552338, + -0.10307310924530055, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5282290590241552, + 0.3299795808672905, + 0.4632355015926063, + -1.0881690950393677, + 1.2117802228927612, + -0.5955814230918883, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.21877987682819366, + -0.009804160334169865, + 0.21646617352962494, + -1.9133343696594238, + -0.1973571479320526, + -1.4190794229507446, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.23829756677150726, + 0.02833499200642109, + 0.21577005088329315, + -1.9111192226409912, + 0.14449475705623627, + -1.5943996906280518, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09991287440061569, + 0.10649452358484268, + 0.06974497437477112, + 0.4387741684913635, + 0.3688918352127075, + 0.40340012311935425, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.10463140159845352, + 0.11977929621934891, + 0.08459924161434174, + 0.4759199321269989, + 0.36665916442871094, + 0.476701557636261, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.07050927714407446, + -0.27332960729599, + 0.08985615784972906, + -2.873914425897598, + -1.2705495828151703, + -2.2895765214920045, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.07990006579756738, + -0.2719711718440056, + 0.0858757123336196, + -2.876261902332306, + -0.6316696387529374, + -2.7795718616485594, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4807696149498225, + 0.252233917760849, + 0.4045200927481055, + -1.1385043248176574, + 0.4712297708988191, + -0.09930327577590958, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5282290590241552, + 0.33019138619899746, + 0.4639661110587418, + -1.0730903081893923, + 1.2153795392513276, + -0.5754756422996521, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/egoverse_eva/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/egoverse_eva/norm_stats_meta.json new file mode 100644 index 0000000..862d429 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_eva/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_full_all_full_norm", + "dataset_id": "egoverse_eva", + "builder_dir": "/mnt/bos/bo23lu/EgoVerse_full/eva_bimanual_front_1_left_wrist_right_wrist/ego_verse_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 97890, + "num_frames": 3132452, + "estimated_total_batches": null, + "train_episodes": 2813, + "train_bytes": 495006312915, + "elapsed_sec": 775.7602636814117, + "frames_per_sec": 4037.912415279924 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/egoverse_eva/unified_action_space.json b/assets/cotrain_full_all_full_norm/egoverse_eva/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_eva/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index e1b1208..e26ba80 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -28,12 +28,12 @@ export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu MODE=smoke CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_1x8_smoke \ -INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 \ +INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ .venv/bin/python atom0_train_job.py MODE=smoke CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_3x8_smoke \ -INSTANCES=3 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1536 \ +INSTANCES=3 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1536 VAL_BATCH_SIZE=96 \ SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ .venv/bin/python atom0_train_job.py ``` @@ -54,7 +54,8 @@ cd /data/wudi/baige-cluster | source frames | 2,913,191 | | 节点 × GPU | 1 × 8 B200 | | FSDP devices | 4 | -| global batch size | 512 | +| train global batch size | 512 | +| validation global batch size | 96 | | samples / GPU | 64 | | train steps | 10000 | | warmup / decay steps | 200 / 10000 | @@ -68,7 +69,7 @@ export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu MODE=train CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_v1 \ -INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 \ +INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ NUM_TRAIN_STEPS=10000 WARMUP_STEPS=200 DECAY_STEPS=10000 \ EVAL_INTERVAL=1000 SAVE_INTERVAL=2000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ @@ -85,11 +86,12 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ | source frames | 150,109,749 | | 节点 × GPU | 3 × 8 B200 | | FSDP devices | 4 | -| global batch size | 1,536 | +| train global batch size | 1,536 | +| validation global batch size | 96 | | samples / GPU | 64 | | train steps | 97,728 | | warmup / decay steps | 5,000 / 97,728 | -| eval / save interval | 5,000 / 10,000 | +| eval / save interval | 1,000 / 10,000 | | validation batches | 5 | | action MSE | 关闭 | @@ -98,9 +100,9 @@ cd /data/wudi/baige-cluster export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu -MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_v1 \ -INSTANCES=3 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1536 \ -NUM_TRAIN_STEPS=100000 WARMUP_STEPS=5000 DECAY_STEPS=100000 \ +MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_val96_v2 \ +INSTANCES=3 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1536 VAL_BATCH_SIZE=96 \ +NUM_TRAIN_STEPS=97728 WARMUP_STEPS=5000 DECAY_STEPS=97728 \ EVAL_INTERVAL=1000 SAVE_INTERVAL=10000 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py @@ -110,18 +112,18 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ 下表保持与上述推荐命令相同的总样本训练量(每卡 batch 均为 64)。 -| 配置 | GPU 拓扑 | global batch | train steps | -| --- | ---: | ---: | ---: | -| `cotrain_real_only` | 2 × 8 | 1,024 | 5,000 | -| `cotrain_real_only` | 4 × 8 | 2,048 | 2,500 | -| `cotrain_real_robot_fix` | 2 × 8 | 1,024 | 146,592 | -| `cotrain_real_robot_fix` | 4 × 8 | 2,048 | 73,296 | +| 配置 | GPU 拓扑 | train global batch | validation global batch | train steps | +| --- | ---: | ---: | ---: | ---: | +| `cotrain_real_only` | 2 × 8 | 1,024 | 96 | 5,000 | +| `cotrain_real_only` | 4 × 8 | 2,048 | 96 | 2,500 | +| `cotrain_real_robot_fix` | 2 × 8 | 1,024 | 96 | 146,592 | +| `cotrain_real_robot_fix` | 4 × 8 | 2,048 | 96 | 73,296 | ```bash # 仅自采真机数据:16 卡 cd /data/wudi/baige-cluster MODE=train CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_16gpu_v1 \ -INSTANCES=2 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1024 \ +INSTANCES=2 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1024 VAL_BATCH_SIZE=96 \ NUM_TRAIN_STEPS=5000 WARMUP_STEPS=100 DECAY_STEPS=5000 \ EVAL_INTERVAL=500 SAVE_INTERVAL=1000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ @@ -129,7 +131,7 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ # 仅自采真机数据:32 卡 MODE=train CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_32gpu_v1 \ -INSTANCES=4 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=2048 \ +INSTANCES=4 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=2048 VAL_BATCH_SIZE=96 \ NUM_TRAIN_STEPS=2500 WARMUP_STEPS=50 DECAY_STEPS=2500 \ EVAL_INTERVAL=250 SAVE_INTERVAL=500 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ @@ -140,7 +142,7 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ # 自采真机 + 开源 Robot:16 卡 cd /data/wudi/baige-cluster MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_16gpu_v1 \ -INSTANCES=2 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1024 \ +INSTANCES=2 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1024 VAL_BATCH_SIZE=96 \ NUM_TRAIN_STEPS=146592 WARMUP_STEPS=7330 DECAY_STEPS=146592 \ EVAL_INTERVAL=7500 SAVE_INTERVAL=15000 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ @@ -148,7 +150,7 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ # 自采真机 + 开源 Robot:32 卡 MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_32gpu_v1 \ -INSTANCES=4 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=2048 \ +INSTANCES=4 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=2048 VAL_BATCH_SIZE=96 \ NUM_TRAIN_STEPS=73296 WARMUP_STEPS=3665 DECAY_STEPS=73296 \ EVAL_INTERVAL=3750 SAVE_INTERVAL=7500 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ diff --git a/scripts/train_cotrain.py b/scripts/train_cotrain.py index bc59e9d..46c607f 100644 --- a/scripts/train_cotrain.py +++ b/scripts/train_cotrain.py @@ -290,6 +290,12 @@ def main(config: cotrain_config.CotrainTrainConfig): raise ValueError( f"Batch size {config.batch_size} must be divisible by the number of devices {jax.device_count()}." ) + val_batch_size = cotrain_data_loader.resolve_val_batch_size(config) + if val_batch_size % jax.device_count() != 0: + raise ValueError( + f"Validation batch size {val_batch_size} must be divisible by the number of devices " + f"{jax.device_count()}." + ) # Training pods share /data but their home directories are ephemeral. Honour the # host/job-provided cache location so recompilations can be reused across restarts. diff --git a/scripts/train_cotrain_baige.sh b/scripts/train_cotrain_baige.sh index 4b31934..decb862 100755 --- a/scripts/train_cotrain_baige.sh +++ b/scripts/train_cotrain_baige.sh @@ -20,6 +20,7 @@ case "${CONFIG_NAME}" in DEFAULT_WARMUP=200 DEFAULT_EVAL_INTERVAL=1000 DEFAULT_SAVE_INTERVAL=2000 + DEFAULT_VAL_BATCH_SIZE=96 DEFAULT_VAL_BATCHES=10 DEFAULT_ACTION_MSE=1 ;; @@ -35,6 +36,7 @@ case "${CONFIG_NAME}" in DEFAULT_WARMUP=5000 DEFAULT_EVAL_INTERVAL=5000 DEFAULT_SAVE_INTERVAL=10000 + DEFAULT_VAL_BATCH_SIZE=96 DEFAULT_VAL_BATCHES=5 DEFAULT_ACTION_MSE=0 ;; @@ -50,6 +52,7 @@ WARMUP_STEPS="${WARMUP_STEPS:-${DEFAULT_WARMUP}}" DECAY_STEPS="${DECAY_STEPS:-${NUM_TRAIN_STEPS}}" EVAL_INTERVAL="${EVAL_INTERVAL:-${DEFAULT_EVAL_INTERVAL}}" SAVE_INTERVAL="${SAVE_INTERVAL:-${DEFAULT_SAVE_INTERVAL}}" +VAL_BATCH_SIZE="${VAL_BATCH_SIZE:-${DEFAULT_VAL_BATCH_SIZE}}" NUM_VAL_BATCHES="${NUM_VAL_BATCHES:-${DEFAULT_VAL_BATCHES}}" RUN_ACTION_MSE="${RUN_ACTION_MSE:-${DEFAULT_ACTION_MSE}}" LOG_INTERVAL="${LOG_INTERVAL:-100}" @@ -76,6 +79,12 @@ if (( WARMUP_STEPS < 0 || DECAY_STEPS <= WARMUP_STEPS )); then exit 2 fi +GLOBAL_DEVICE_COUNT=$((${WORLD_SIZE:-1} * ${NPROC_PER_NODE:-8})) +if (( VAL_BATCH_SIZE <= 0 || VAL_BATCH_SIZE % GLOBAL_DEVICE_COUNT != 0 )); then + echo "Invalid VAL_BATCH_SIZE=${VAL_BATCH_SIZE}: must be positive and divisible by ${GLOBAL_DEVICE_COUNT} devices" >&2 + exit 2 +fi + test -f "${PARAMS_PATH}/_CHECKPOINT_METADATA" test -f "${PARAMS_PATH}/manifest.ocdbt" test -d "${RLDS_DATA_DIR}" @@ -97,6 +106,7 @@ args=( "--lr-schedule.warmup-steps=${WARMUP_STEPS}" "--lr-schedule.decay-steps=${DECAY_STEPS}" "--eval-interval=${EVAL_INTERVAL}" + "--val-batch-size=${VAL_BATCH_SIZE}" "--save-interval=${SAVE_INTERVAL}" "--log-interval=${LOG_INTERVAL}" "--num-val-batches=${NUM_VAL_BATCHES}" @@ -126,6 +136,6 @@ mkdir -p "${LOG_DIR}" exec > >(tee -a "${LOG_DIR}/baige_${CONFIG_NAME}_${EXP_NAME}_rank${RANK_ID}.log") 2>&1 echo "CONFIG_NAME=${CONFIG_NAME} EXP_NAME=${EXP_NAME} MODE=${MODE}" echo "WORLD_SIZE=${WORLD_SIZE:-1} RANK=${RANK_ID} MASTER=${JAX_COORDINATOR_ADDRESS}" -echo "FSDP_DEVICES=${FSDP_DEVICES} BATCH_SIZE=${BATCH_SIZE} NUM_TRAIN_STEPS=${NUM_TRAIN_STEPS}" +echo "FSDP_DEVICES=${FSDP_DEVICES} BATCH_SIZE=${BATCH_SIZE} VAL_BATCH_SIZE=${VAL_BATCH_SIZE} NUM_TRAIN_STEPS=${NUM_TRAIN_STEPS}" exec .venv/bin/python -u scripts/train_cotrain.py "${args[@]}" diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 286b782454..436e8f7 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -145,6 +145,10 @@ class CotrainTrainConfig(_config.TrainConfig): # How often (in steps) to run validation. eval_interval: int = 1000 + # Independent global validation batch size. None preserves the legacy behavior of + # reusing the training batch size. Large co-training batches should set this explicitly + # to avoid creating an enormous XLA graph for validation. + val_batch_size: int | None = None # Number of val batches per dataset for the (cheap) flow-loss pass. num_val_batches: int = 20 # Whether to also run the (expensive) action-MSE sampling pass. @@ -865,6 +869,7 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): log_interval=100, save_interval=2_000, eval_interval=1_000, + val_batch_size=96, num_val_batches=10, num_action_mse_batches=2, exp_name=tyro.MISSING, diff --git a/src/openpi/cotrain/data_loader.py b/src/openpi/cotrain/data_loader.py index ce93df5..17942e2 100644 --- a/src/openpi/cotrain/data_loader.py +++ b/src/openpi/cotrain/data_loader.py @@ -25,6 +25,15 @@ _MODEL_IMAGE_HW = (224, 224) +def resolve_val_batch_size(config: _config.TrainConfig) -> int: + """Return the configured global validation batch size with legacy fallback.""" + configured = getattr(config, "val_batch_size", None) + val_batch_size = config.batch_size if configured is None else configured + if val_batch_size <= 0: + raise ValueError(f"val_batch_size must be positive, got {val_batch_size}.") + return val_batch_size + + class CotrainRLDSDataLoader(RLDSDataLoader): """openpi RLDSDataLoader, but without the hard `process_count() > 1` block. @@ -165,6 +174,8 @@ def build_val_loaders( finite and deterministic. Only datasets that expose a given label appear under it. """ data_config = config.data.create(config.assets_dirs, config.model) + val_batch_size = resolve_val_batch_size(config) + logging.info(f"Building validation loaders with global batch size {val_batch_size}.") loaders: dict[str, dict[str, DataLoaderImpl]] = {} for ds in data_config.datasets: single = dataclasses.replace(ds, weight=1.0) @@ -174,7 +185,7 @@ def build_val_loaders( loaders.setdefault(label, {})[ds.uid] = create_cotrain_rlds_data_loader( dc, action_horizon=config.model.action_horizon, - batch_size=config.batch_size, + batch_size=val_batch_size, split_label=label, sharding=sharding, skip_norm_stats=skip_norm_stats, diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index 67b55e6..23e2534 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -4,6 +4,7 @@ from openpi.cotrain import action_space from openpi.cotrain import config +from openpi.cotrain import data_loader from openpi.cotrain.rlds_dataset import CotrainRLDSDataset @@ -23,6 +24,19 @@ def test_all_registered_cotrain_configs_resolve_to_unified_80d() -> None: ) +def test_validation_batch_size_is_independent_with_legacy_fallback() -> None: + train_config = config.get_config("cotrain_real_robot_fix") + assert train_config.batch_size == 32 + assert data_loader.resolve_val_batch_size(train_config) == 96 + + legacy = dataclasses.replace(train_config, batch_size=512, val_batch_size=None) + assert data_loader.resolve_val_batch_size(legacy) == 512 + + invalid = dataclasses.replace(train_config, val_batch_size=0) + with pytest.raises(ValueError, match="val_batch_size must be positive"): + data_loader.resolve_val_batch_size(invalid) + + def test_cotrain_rejects_non_80d_model() -> None: model = dataclasses.replace(config._UNIFIED_PI05_MODEL, action_dim=32) with pytest.raises(ValueError, match="require action_dim=80"): From d56e2dcd558b877f8fe70e4b392c3984501f3109 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Sun, 19 Jul 2026 20:57:25 +0800 Subject: [PATCH 18/64] finish ego norm --- .../egoverse_human/norm_stats.json | 664 ++++++++++++++++++ .../egoverse_human/norm_stats_meta.json | 14 + .../egoverse_human/unified_action_space.json | 5 + .../egoverse_mecka/norm_stats.json | 664 ++++++++++++++++++ .../egoverse_mecka/norm_stats_meta.json | 14 + .../egoverse_mecka/unified_action_space.json | 5 + .../egoverse_scale/norm_stats.json | 664 ++++++++++++++++++ .../egoverse_scale/norm_stats_meta.json | 14 + .../egoverse_scale/unified_action_space.json | 5 + .../full_norm_run_meta.json | 544 ++------------ ...55\347\273\203\346\214\207\345\215\227.md" | 2 +- 11 files changed, 2098 insertions(+), 497 deletions(-) create mode 100644 assets/cotrain_full_all_full_norm/egoverse_human/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/egoverse_human/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/egoverse_human/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/egoverse_mecka/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/egoverse_mecka/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/egoverse_mecka/unified_action_space.json create mode 100644 assets/cotrain_full_all_full_norm/egoverse_scale/norm_stats.json create mode 100644 assets/cotrain_full_all_full_norm/egoverse_scale/norm_stats_meta.json create mode 100644 assets/cotrain_full_all_full_norm/egoverse_scale/unified_action_space.json diff --git a/assets/cotrain_full_all_full_norm/egoverse_human/norm_stats.json b/assets/cotrain_full_all_full_norm/egoverse_human/norm_stats.json new file mode 100644 index 0000000..d876ebc --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_human/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.13278847932815552, + 0.25358638167381287, + 0.39440473914146423, + -0.5164129734039307, + 0.45461416244506836, + 0.5348803997039795, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.22135232388973236, + 0.23480337858200073, + 0.40805959701538086, + -1.061488151550293, + 0.40719759464263916, + -0.5603905320167542, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08735541254281998, + 0.14708226919174194, + 0.12885919213294983, + 0.6739702224731445, + 0.37603452801704407, + 0.5113381147384644, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0899120345711708, + 0.12682215869426727, + 0.12714530527591705, + 2.4207730293273926, + 0.34021061658859253, + 0.4550102651119232, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.40276508654356, + -0.09111102044582364, + 0.06784694593548776, + -2.313262580871582, + -0.4733985605239869, + -0.7512297741889951, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.022609282189607616, + -0.04833615143299097, + 0.087336487826705, + -3.132796044588089, + -0.3232776385307312, + -1.9775105066299439, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.052280654907226554, + 0.7193538117408753, + 0.6608095567524434, + 0.9136210708618169, + 1.277564356088638, + 2.1048292052745827, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.428047583770752, + 0.5751397661685944, + 0.653310035583377, + 3.1277687819004054, + 1.1855421765804293, + 0.5077422828674312, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.1326771229505539, + 0.2529814541339874, + 0.3930101692676544, + -0.511993408203125, + 0.4558451771736145, + 0.5400097966194153, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.22120068967342377, + 0.23400859534740448, + 0.4066513478755951, + -1.049866795539856, + 0.408670574426651, + -0.5663299560546875, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08721435815095901, + 0.14747834205627441, + 0.1301773339509964, + 0.6781909465789795, + 0.3763260245323181, + 0.5212813019752502, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08977361023426056, + 0.12735961377620697, + 0.12886583805084229, + 2.4244773387908936, + 0.34084805846214294, + 0.46859076619148254, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.40276508654356, + -0.09111102044582364, + 0.0571974737584591, + -2.313262580871582, + -0.4710363845825196, + -0.752486289358139, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.02229034597873686, + -0.04833615143299097, + 0.06897475059032443, + -3.132796044588089, + -0.3214048791408539, + -2.1810549716949463, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.05179293171167365, + 0.7193538117408753, + 0.6608095567524434, + 0.9777063770294188, + 1.2787454440593717, + 2.261893601417542, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.42772864755988127, + 0.5751397661685944, + 0.653310035583377, + 3.1277687819004054, + 1.1880391891002655, + 0.5077422828674312, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/egoverse_human/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/egoverse_human/norm_stats_meta.json new file mode 100644 index 0000000..8e467fc --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_human/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_full_all_full_norm", + "dataset_id": "egoverse_human", + "builder_dir": "/mnt/bos/bo23lu/EgoVerse_full/human_bimanual_front_1/ego_verse_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 86433, + "num_frames": 2765837, + "estimated_total_batches": null, + "train_episodes": 770, + "train_bytes": 165171872779, + "elapsed_sec": 699.2333681583405, + "frames_per_sec": 3955.5277621900905 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/egoverse_human/unified_action_space.json b/assets/cotrain_full_all_full_norm/egoverse_human/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_human/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git a/assets/cotrain_full_all_full_norm/egoverse_mecka/norm_stats.json b/assets/cotrain_full_all_full_norm/egoverse_mecka/norm_stats.json new file mode 100644 index 0000000..c64f7d7 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_mecka/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.041593775153160095, + 0.01809024065732956, + 0.4336625337600708, + -0.30219587683677673, + 0.7917072176933289, + 0.7685811519622803, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1646425724029541, + 0.009214046411216259, + 0.4192745089530945, + 0.059009943157434464, + -0.754741370677948, + 1.0451016426086426, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.06731975078582764, + 0.08390043675899506, + 0.11328946799039841, + 1.3936139345169067, + 0.39510378241539, + 1.3605327606201172, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.07234678417444229, + 0.08271792531013489, + 0.11482502520084381, + 1.1829566955566406, + 0.4004928767681122, + 1.22183096408844, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.2535398484706879, + -0.176541473031044, + 0.20236107791662217, + -3.0196984797000885, + -0.11313679714202896, + -2.8399992027282717, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.011995019078254732, + -0.1841508715748787, + 0.19274571672677987, + -2.8601055866241456, + -1.4848803995370865, + -2.833716210603714, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.10195999357700347, + 0.23882590889930733, + 0.7274418544650079, + 2.9757164247512824, + 1.4888115955829617, + 2.925450264167785, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.38614967095851904, + 0.2215468589305878, + 0.717825494045019, + 2.9455571378707894, + 0.1778057978153229, + 2.934247405290604, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.04153601825237274, + 0.01804027333855629, + 0.4333791434764862, + -0.30083194375038147, + 0.7917574644088745, + 0.7673069834709167, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.16457948088645935, + 0.009198518469929695, + 0.41921862959861755, + 0.05899553745985031, + -0.7547769546508789, + 1.0449683666229248, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.06722988188266754, + 0.08389326184988022, + 0.11335357278585434, + 1.395126461982727, + 0.3952288329601288, + 1.3617289066314697, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.07232033461332321, + 0.0827069878578186, + 0.11478634178638458, + 1.182900309562683, + 0.40042030811309814, + 1.2218166589736938, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.2532519943475723, + -0.1768362689018249, + 0.20147809454798693, + -3.0209551166534423, + -0.11313679714202896, + -2.8399992027282717, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.011995019078254732, + -0.18473969266414642, + 0.19274571672677987, + -2.8601055866241456, + -1.4848803995370865, + -2.833716210603714, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.10195999357700347, + 0.23853111302852636, + 0.7268531988859177, + 2.9794863356113437, + 1.4888115955829617, + 2.925450264167785, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3858789367675781, + 0.22125244838595393, + 0.717533620905876, + 2.9455571378707894, + 0.1778057978153229, + 2.934247405290604, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/egoverse_mecka/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/egoverse_mecka/norm_stats_meta.json new file mode 100644 index 0000000..c9933be --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_mecka/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_full_all_full_norm", + "dataset_id": "egoverse_mecka", + "builder_dir": "/mnt/bos/bo23lu/EgoVerse_full/mecka_bimanual_front_1/ego_verse_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 2648638, + "num_frames": 84756414, + "estimated_total_batches": null, + "train_episodes": 39530, + "train_bytes": 5245861061807, + "elapsed_sec": 21032.688819646835, + "frames_per_sec": 4029.746968006688 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/egoverse_mecka/unified_action_space.json b/assets/cotrain_full_all_full_norm/egoverse_mecka/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_mecka/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git a/assets/cotrain_full_all_full_norm/egoverse_scale/norm_stats.json b/assets/cotrain_full_all_full_norm/egoverse_scale/norm_stats.json new file mode 100644 index 0000000..a8217d5 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_scale/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 3.0206408500671387, + 0.16416476666927338, + 0.26503488421440125, + -0.3463878035545349, + 0.596845269203186, + 1.030470609664917, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.170013427734375, + -1.5855753421783447, + 0.43506184220314026, + 0.1590956449508667, + -0.6534832119941711, + 1.105573296546936, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 321.0220947265625, + 382.44036865234375, + 14.960860252380371, + 1.0038799047470093, + 0.46120506525039673, + 1.0673586130142212, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 400.94293212890625, + 442.1720275878906, + 12.560502052307129, + 0.9142194986343384, + 0.40043696761131287, + 0.8207637667655945, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -192.11779687499802, + -182.7525671874755, + -28.753003515626915, + -2.9367602179050447, + -0.5884218775033951, + -3.019698713493347, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -103.9304843749851, + -153.6360640625062, + -16.5517509765632, + -2.1852897234916684, + -1.4648067719221114, + -1.589645679950714, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -21.830884374998277, + -50.34746406247723, + -3.9932171875007043, + 2.730672011613845, + 1.4696639620065688, + 3.0410615425109864, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -37.796249999984866, + -11.347060937521746, + -1.7286826171875873, + 2.839999736785889, + 0.19088510720729834, + 2.249378901481629, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 3.0093843936920166, + 0.276274174451828, + 0.274105966091156, + -0.3466625213623047, + 0.5965198874473572, + 1.0305031538009644, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.8300988674163818, + -1.7392069101333618, + 0.44093745946884155, + 0.15884530544281006, + -0.6533203125, + 1.105553388595581, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 310.94073486328125, + 340.82623291015625, + 11.471299171447754, + 1.0034235715866089, + 0.4613035023212433, + 1.0672434568405151, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 422.8359375, + 476.3694763183594, + 12.064456939697266, + 0.9140304327011108, + 0.40047487616539, + 0.8208750486373901, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -149.54606875000172, + -182.7525671874755, + -28.753003515626915, + -2.9367602179050447, + -0.5884218775033951, + -3.019698713493347, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -103.9304843749851, + -224.78056562499842, + -9.140216796875393, + -2.1815198139190675, + -1.4641800906658173, + -1.589645679950714, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -21.830884374998277, + -50.34746406247723, + -3.9932171875007043, + 2.7256454641818992, + 1.4696639620065688, + 3.0410615425109864, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + -37.796249999984866, + -11.347060937521746, + -1.7286826171875873, + 2.839999736785889, + 0.1921384697198869, + 2.250635538005829, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/egoverse_scale/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/egoverse_scale/norm_stats_meta.json new file mode 100644 index 0000000..1d7ba27 --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_scale/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_full_all_full_norm", + "dataset_id": "egoverse_scale", + "builder_dir": "/mnt/bos/bo23lu/EgoVerse_full/scale_front_1/ego_verse_infidata/1.0.0", + "split": "train", + "batch_size": 32, + "num_batches": 681185, + "num_frames": 21797912, + "estimated_total_batches": null, + "train_episodes": 16223, + "train_bytes": 1624982378880, + "elapsed_sec": 5440.526676416397, + "frames_per_sec": 4006.581218412111 +} \ No newline at end of file diff --git a/assets/cotrain_full_all_full_norm/egoverse_scale/unified_action_space.json b/assets/cotrain_full_all_full_norm/egoverse_scale/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/cotrain_full_all_full_norm/egoverse_scale/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git a/assets/cotrain_full_all_full_norm/full_norm_run_meta.json b/assets/cotrain_full_all_full_norm/full_norm_run_meta.json index 7e242c9..fe33d51 100644 --- a/assets/cotrain_full_all_full_norm/full_norm_run_meta.json +++ b/assets/cotrain_full_all_full_norm/full_norm_run_meta.json @@ -1,527 +1,79 @@ { - "config_name": "cotrain_real_robot", - "output_assets_dir": "/data/wudi/Atom-0/assets/cotrain_real_robot", - "dataset_id": null, + "config_name": "cotrain_full_all_full_norm", + "output_assets_dir": "/data/wudi/Atom-0/assets/cotrain_full_all_full_norm", + "dataset_id": "egoverse_aria,egoverse_eva,egoverse_human,egoverse_mecka,egoverse_scale", "skip_dataset_ids": [], "copy_from_assets_name": null, "datasets": [ { - "config_name": "cotrain_real_robot", - "dataset_id": "piper30", - "builder_dir": "/mnt/bos/bo23lu/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0", + "config_name": "cotrain_full_all_full_norm", + "dataset_id": "egoverse_aria", + "builder_dir": "/mnt/bos/bo23lu/EgoVerse_full/aria_bimanual_front_1/ego_verse_infidata/1.0.0", "split": "train", "batch_size": 32, - "num_batches": 69490, - "num_frames": 2223663, + "num_batches": 129135, + "num_frames": 4132315, "estimated_total_batches": null, - "train_episodes": 5307, - "train_bytes": 350058169358, - "elapsed_sec": 558.5227379798889, - "frames_per_sec": 3981.3294048559737 + "train_episodes": 910, + "train_bytes": 238580138454, + "elapsed_sec": 1016.5545732975006, + "frames_per_sec": 4065.0203231053233 }, { - "config_name": "cotrain_real_robot", - "dataset_id": "piper2", - "builder_dir": "/mnt/bos/bo23lu/realworld_piper_2/realworld_piper_infidata/1.0.0", + "config_name": "cotrain_full_all_full_norm", + "dataset_id": "egoverse_eva", + "builder_dir": "/mnt/bos/bo23lu/EgoVerse_full/eva_bimanual_front_1_left_wrist_right_wrist/ego_verse_infidata/1.0.0", "split": "train", "batch_size": 32, - "num_batches": 21548, - "num_frames": 689528, + "num_batches": 97890, + "num_frames": 3132452, "estimated_total_batches": null, - "train_episodes": 902, - "train_bytes": 111529419925, - "elapsed_sec": 182.0517978668213, - "frames_per_sec": 3787.537437583667 + "train_episodes": 2813, + "train_bytes": 495006312915, + "elapsed_sec": 775.7602636814117, + "frames_per_sec": 4037.912415279924 }, { - "config_name": "cotrain_real_robot", - "dataset_id": "agibot", - "builder_dir": "/mnt/bos/bo23lu/AgiBot/agibot_world_robot_agibot_world_beta_mobile_dual_arm_joint_absolute_position_real_s20_a20_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_22986/agibot_infidata/1.0.0", + "config_name": "cotrain_full_all_full_norm", + "dataset_id": "egoverse_human", + "builder_dir": "/mnt/bos/bo23lu/EgoVerse_full/human_bimanual_front_1/ego_verse_infidata/1.0.0", "split": "train", "batch_size": 32, - "num_batches": 1059832, - "num_frames": 33914594, + "num_batches": 86433, + "num_frames": 2765837, "estimated_total_batches": null, - "train_episodes": 21837, - "train_bytes": 7547826566949, - "elapsed_sec": 9102.592523097992, - "frames_per_sec": 3725.8170036658357 + "train_episodes": 770, + "train_bytes": 165171872779, + "elapsed_sec": 699.2333681583405, + "frames_per_sec": 3955.5277621900905 }, { - "config_name": "cotrain_real_robot", - "dataset_id": "droid", - "builder_dir": "/mnt/bos/bo23lu/DROID/droid_infidata/1.1.0", + "config_name": "cotrain_full_all_full_norm", + "dataset_id": "egoverse_mecka", + "builder_dir": "/mnt/bos/bo23lu/EgoVerse_full/mecka_bimanual_front_1/ego_verse_infidata/1.0.0", "split": "train", "batch_size": 32, - "num_batches": 578829, - "num_frames": 18522518, + "num_batches": 2648638, + "num_frames": 84756414, "estimated_total_batches": null, - "train_episodes": 64124, - "train_bytes": 1185946441420, - "elapsed_sec": 4512.591522216797, - "frames_per_sec": 4104.629880371018 + "train_episodes": 39530, + "train_bytes": 5245861061807, + "elapsed_sec": 21032.688819646835, + "frames_per_sec": 4029.746968006688 }, { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_agilex_cobot_magic_s26_a26", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Agilex_Cobot_Magic_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_8284/robocoin_infidata/1.0.0", + "config_name": "cotrain_full_all_full_norm", + "dataset_id": "egoverse_scale", + "builder_dir": "/mnt/bos/bo23lu/EgoVerse_full/scale_front_1/ego_verse_infidata/1.0.0", "split": "train", "batch_size": 32, - "num_batches": 187608, - "num_frames": 6003434, + "num_batches": 681185, + "num_frames": 21797912, "estimated_total_batches": null, - "train_episodes": 7870, - "train_bytes": 690618678004, - "elapsed_sec": 1551.8257114887238, - "frames_per_sec": 3868.6264543462707 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_airbot_mmk2_s36_a36", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Airbot_MMK2_s36_a36_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10532/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 81017, - "num_frames": 2592540, - "estimated_total_batches": null, - "train_episodes": 10005, - "train_bytes": 431087330611, - "elapsed_sec": 690.6267569065094, - "frames_per_sec": 3753.8945227269173 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_galaxea_r1_lite_upper_s14_a14", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Galaxea_R1_Lite_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_3650/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 27171, - "num_frames": 869469, - "estimated_total_batches": null, - "train_episodes": 1337, - "train_bytes": 205435325084, - "elapsed_sec": 271.46593260765076, - "frames_per_sec": 3202.8659789758667 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_realman_rmc_aida_l_s28_a28", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/Realman_RMC-AIDA-L_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_693/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 9936, - "num_frames": 317940, - "estimated_total_batches": null, - "train_episodes": 658, - "train_bytes": 36471840854, - "elapsed_sec": 89.87298893928528, - "frames_per_sec": 3537.6591315416026 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_agilex_decoupled_magic_s14_a14_fps30", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_7778/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 142767, - "num_frames": 4568537, - "estimated_total_batches": null, - "train_episodes": 7389, - "train_bytes": 1807557839316, - "elapsed_sec": 1851.0555272102356, - "frames_per_sec": 2468.0712884314917 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_agilex_decoupled_magic_s14_a14_fps50", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s14_a14_fps50_cam_high_cam_left_wrist_cam_right_wrist__episodes_3397/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 54108, - "num_frames": 1731438, - "estimated_total_batches": null, - "train_episodes": 3227, - "train_bytes": 264209590712, - "elapsed_sec": 452.58451652526855, - "frames_per_sec": 3825.667774260525 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_agilex_decoupled_magic_s26_a26", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/agilex_cobot_decoupled_magic_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_23712/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 413112, - "num_frames": 13219572, - "estimated_total_batches": null, - "train_episodes": 18406, - "train_bytes": 1649570846072, - "elapsed_sec": 3489.1643438339233, - "frames_per_sec": 3788.750169753891 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_aloha_s26_a26", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/aloha_s26_a26_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_4879/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 198055, - "num_frames": 6337741, - "estimated_total_batches": null, - "train_episodes": 4634, - "train_bytes": 962548578236, - "elapsed_sec": 1664.1732065677643, - "frames_per_sec": 3808.3421695456377 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_alpha_bot_2_s28_a28", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/alpha_bot_2_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_857/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 22703, - "num_frames": 726485, - "estimated_total_batches": null, - "train_episodes": 814, - "train_bytes": 109263908150, - "elapsed_sec": 205.29979014396667, - "frames_per_sec": 3538.6543721771545 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_discover_aitbot_mmk2_s36_a36", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/discover_robotics_aitbot_mmk2_s36_a36_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5747/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 36260, - "num_frames": 1160293, - "estimated_total_batches": null, - "train_episodes": 5460, - "train_bytes": 194302774076, - "elapsed_sec": 348.6094217300415, - "frames_per_sec": 3328.34664720713 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_galaxea_r1_lite_s14_a14", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/galaxea_r1_lite_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5167/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 245253, - "num_frames": 7848088, - "estimated_total_batches": null, - "train_episodes": 4886, - "train_bytes": 3346209600799, - "elapsed_sec": 3871.8957114219666, - "frames_per_sec": 2026.9368249894735 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_galaxea_r1_lite_s16_a18", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/galaxea_r1_lite_s16_a18_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_970/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 9866, - "num_frames": 315700, - "estimated_total_batches": null, - "train_episodes": 922, - "train_bytes": 100400838947, - "elapsed_sec": 127.63867783546448, - "frames_per_sec": 2473.388202962743 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_leju_robot_s118_a54", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/leju_robot_s118_a54_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_17897/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 458510, - "num_frames": 14672292, - "estimated_total_batches": null, - "train_episodes": 17002, - "train_bytes": 4898931416952, - "elapsed_sec": 5203.681373596191, - "frames_per_sec": 2819.598462436255 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_leju_robot_s54_a54", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/leju_robot_s54_a54_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_394/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 2062, - "num_frames": 65982, - "estimated_total_batches": null, - "train_episodes": 374, - "train_bytes": 22504353358, - "elapsed_sec": 31.398486614227295, - "frames_per_sec": 2101.4388626648715 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_realman_rmc_aidal_s28_a28", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/realman_rmc_aidal_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_18412/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 492790, - "num_frames": 15769266, - "estimated_total_batches": null, - "train_episodes": 17481, - "train_bytes": 1684550435506, - "elapsed_sec": 4069.850043296814, - "frames_per_sec": 3874.655290057317 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_ruantong_a2d_s17_a17", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/ruantong_a2d_s17_a17_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_1719/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 32248, - "num_frames": 1031909, - "estimated_total_batches": null, - "train_episodes": 1633, - "train_bytes": 232098850893, - "elapsed_sec": 277.61806178092957, - "frames_per_sec": 3717.009597215209 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_ruantong_a2d_s41_a34", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/ruantong_a2d_s41_a34_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_6459/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 85004, - "num_frames": 2720116, - "estimated_total_batches": null, - "train_episodes": 6136, - "train_bytes": 1133795856617, - "elapsed_sec": 1135.4377226829529, - "frames_per_sec": 2395.654068611155 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_unitree_g1_s28_a28_high", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unitree_g1_s28_a28_fps30_cam_high__episodes_227/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 2287, - "num_frames": 73184, - "estimated_total_batches": null, - "train_episodes": 216, - "train_bytes": 3159483310, - "elapsed_sec": 28.13194966316223, - "frames_per_sec": 2601.4549605081866 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_unitree_g1_s28_a28", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unitree_g1_s28_a28_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_931/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 19765, - "num_frames": 632462, - "estimated_total_batches": null, - "train_episodes": 884, - "train_bytes": 137723586828, - "elapsed_sec": 202.07107949256897, - "frames_per_sec": 3129.898655404859 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_unknown_s30_a30_high", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/unknown_s30_a30_fps30_cam_high__episodes_891/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 8154, - "num_frames": 260914, - "estimated_total_batches": null, - "train_episodes": 846, - "train_bytes": 20178322671, - "elapsed_sec": 82.17656183242798, - "frames_per_sec": 3175.041571245681 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robocoin_yinhe_s49_a16", - "builder_dir": "/mnt/bos/bo23lu/RoboCOIN/yinhe_s49_a16_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_5452/robocoin_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 153600, - "num_frames": 4915186, - "estimated_total_batches": null, - "train_episodes": 5179, - "train_bytes": 711128217385, - "elapsed_sec": 1323.132462978363, - "frames_per_sec": 3714.810223109443 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robomind_agilex_cobot_magic_s14_a14", - "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/agilex_cobot_magic_agilex_dual_arm_h5_agilex_3rgb_real_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10374/robomind_full_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 196965, - "num_frames": 6302870, - "estimated_total_batches": null, - "train_episodes": 9855, - "train_bytes": 1015824843385, - "elapsed_sec": 1625.2714269161224, - "frames_per_sec": 3878.0414739459275 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robomind_franka_fr3_dual_s16_a16", - "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_fr3_dual_master_puppet_joint_position_h5_franka_fr3_dual_real_s16_a16_fps30_cam_high_cam_left_cam_right_cam_top__episodes_1774/robomind_full_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 11198, - "num_frames": 358321, - "estimated_total_batches": null, - "train_episodes": 1685, - "train_bytes": 186172127608, - "elapsed_sec": 205.53938150405884, - "frames_per_sec": 1743.3204156689756 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robomind_franka_panda_s8_a8", - "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_panda_master_puppet_joint_position_h5_franka_3rgb_real_s8_a8_fps30_cam_left_cam_right_cam_top__episodes_17219/robomind_full_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 57958, - "num_frames": 1854642, - "estimated_total_batches": null, - "train_episodes": 14956, - "train_bytes": 282424151738, - "elapsed_sec": 465.4217314720154, - "frames_per_sec": 3984.8633499218436 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robomind_franka_sim_franka_s8_a8", - "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_sim_franka_3rgb_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_14488/robomind_full_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 48250, - "num_frames": 1543972, - "estimated_total_batches": null, - "train_episodes": 8445, - "train_bytes": 675920469639, - "elapsed_sec": 665.9570224285126, - "frames_per_sec": 2318.4258863577616 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robomind_franka_sim_simulation_s8_a8", - "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_11422/robomind_full_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 53134, - "num_frames": 1700279, - "estimated_total_batches": null, - "train_episodes": 8662, - "train_bytes": 465501426716, - "elapsed_sec": 452.24869179725647, - "frames_per_sec": 3759.6106541359254 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robomind_franka_sim_simulation_no_front_s8_a8", - "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_handeye_cam_left_external_cam_right_external__episodes_158/robomind_full_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 1067, - "num_frames": 34125, - "estimated_total_batches": null, - "train_episodes": 150, - "train_bytes": 7133719955, - "elapsed_sec": 11.634025812149048, - "frames_per_sec": 2933.2064885367827 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robomind_franka_sim_none_s8_a8", - "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/franka_sim_simulation_franka_joint_position_none_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_222/robomind_full_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 1107, - "num_frames": 35418, - "estimated_total_batches": null, - "train_episodes": 211, - "train_bytes": 6706236456, - "elapsed_sec": 11.181196451187134, - "frames_per_sec": 3167.6395414946483 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robomind_tienkung_gello_s16_a16", - "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_6626/robomind_full_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 102313, - "num_frames": 3274013, - "estimated_total_batches": null, - "train_episodes": 5402, - "train_bytes": 214477074867, - "elapsed_sec": 861.7713775634766, - "frames_per_sec": 3799.1665599950165 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robomind_tienkung_prod1_gello_s16_a16", - "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_prod1_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_2959/robomind_full_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 50624, - "num_frames": 1619947, - "estimated_total_batches": null, - "train_episodes": 2811, - "train_bytes": 247276602528, - "elapsed_sec": 426.9908273220062, - "frames_per_sec": 3793.868383918118 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robomind_tienkung_xsens_s14_a14", - "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_master_puppet_joint_position_h5_tienkung_xsens_1rgb_real_s14_a14_fps30_cam_top__episodes_6126/robomind_full_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 103821, - "num_frames": 3322263, - "estimated_total_batches": null, - "train_episodes": 5775, - "train_bytes": 286470910041, - "elapsed_sec": 845.7928259372711, - "frames_per_sec": 3927.986734007127 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robomind_tienkung_real_s38_a38", - "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/tienkung_humanoid_tiangong_joint_position_none_real_s38_a38_fps30_cam_chest_cam_head__episodes_146/robomind_full_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 3735, - "num_frames": 119501, - "estimated_total_batches": null, - "train_episodes": 139, - "train_bytes": 6479063622, - "elapsed_sec": 51.39154028892517, - "frames_per_sec": 2325.304891197284 - }, - { - "config_name": "cotrain_real_robot", - "dataset_id": "robomind_ur5e_s7_a7", - "builder_dir": "/mnt/bos/bo23lu/RoboMIND_full/ur5e_master_puppet_joint_position_h5_ur_1rgb_real_s7_a7_fps30_cam_top__episodes_26380/robomind_full_infidata/1.0.0", - "split": "train", - "batch_size": 32, - "num_batches": 118080, - "num_frames": 3778539, - "estimated_total_batches": null, - "train_episodes": 25061, - "train_bytes": 185868082632, - "elapsed_sec": 956.0188310146332, - "frames_per_sec": 3952.3688000892153 + "train_episodes": 16223, + "train_bytes": 1624982378880, + "elapsed_sec": 5440.526676416397, + "frames_per_sec": 4006.581218412111 } ] } \ No newline at end of file diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index e26ba80..721e642 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -100,7 +100,7 @@ cd /data/wudi/baige-cluster export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu -MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_val96_v2 \ +MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_0719 \ INSTANCES=3 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1536 VAL_BATCH_SIZE=96 \ NUM_TRAIN_STEPS=97728 WARMUP_STEPS=5000 DECAY_STEPS=97728 \ EVAL_INTERVAL=1000 SAVE_INTERVAL=10000 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ From 3753d261a52cdfd0cfd6dd9465e41e58ad7f051a Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 20 Jul 2026 10:20:39 +0800 Subject: [PATCH 19/64] Add parallel-gripper staged training workflow --- README.md | 3 + docs/egoscale_staged_training.md | 156 +++++++++++++++ ...00\345\217\221\346\227\245\345\277\227.md" | 2 + scripts/audit_unified_action_space.py | 7 +- scripts/check_egoscale_setup.py | 90 +++++++++ scripts/compute_cotrain_norm_stats_light.py | 11 ++ scripts/run_egoscale_stage.sh | 93 +++++++++ scripts/setup_aliyun_dsw_env.sh | 33 ++++ src/openpi/cotrain/action_space.py | 24 +++ src/openpi/cotrain/config.py | 181 ++++++++++++++++-- src/openpi/cotrain/rlds_dataset.py | 40 ++++ tests/cotrain/test_action_space.py | 29 ++- tests/cotrain/test_unified_config.py | 52 +++++ 13 files changed, 700 insertions(+), 21 deletions(-) create mode 100644 docs/egoscale_staged_training.md create mode 100755 scripts/check_egoscale_setup.py create mode 100755 scripts/run_egoscale_stage.sh create mode 100755 scripts/setup_aliyun_dsw_env.sh diff --git a/README.md b/README.md index d16e43d..9bed814 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # openpi +> Project-specific staged Ego-to-robot training and Alibaba Cloud DSW/DLC instructions: +> [docs/egoscale_staged_training.md](docs/egoscale_staged_training.md). + openpi holds open-source models and packages for robotics, published by the [Physical Intelligence team](https://www.physicalintelligence.company/). Currently, this repo contains three types of models: diff --git a/docs/egoscale_staged_training.md b/docs/egoscale_staged_training.md new file mode 100644 index 0000000..eaf1e62 --- /dev/null +++ b/docs/egoscale_staged_training.md @@ -0,0 +1,156 @@ +# EgoScale-inspired staged training(平行夹爪版) + +本文档对应以下配置: + +| 阶段 | 配置 | 数据 | 初始化 | +|---|---|---|---| +| Stage 1 | `egoscale_stage1_ego` | EgoVerse 5 个 builder | 32D `pi05_base` shape-safe 加载到 80D | +| Stage 2 baseline | `egoscale_stage2_robot` | full-all 去掉全部 EgoVerse | Stage 1 严格 checkpoint | +| Stage 2 aligned | `egoscale_stage2_aligned` | 新采 human/robot EEF+gripper | Stage 1 严格 checkpoint | +| Stage 3 | `egoscale_stage3_robot` | robot-only | aligned Stage 2 严格 checkpoint | + +后续阶段必须显式传 `--weight-loader.params-path`。加载器要求 checkpoint 与当前 80D +模型完全同构,任何 shape 或缺失参数都会在训练前失败,避免静默随机初始化。 + +## NAS 路径 + +所有现有 builder 路径由一个环境变量控制: + +```bash +export ATOM_RLDS_ROOT=/mnt/workspace/RLDS +``` + +目录结构保持现有约定: + +```text +/mnt/workspace/RLDS/ + AgiBot/ + DROID/ + EgoVerse_full/ + realworld_piper/ + RoboCOIN/ + RoboMIND_full/ + aligned_parallel_gripper/ # 尚未采集时可不存在 +``` + +aligned 数据也可单独设置: + +```bash +export ATOM_ALIGNED_RLDS_ROOT=/mnt/workspace/RLDS/aligned_parallel_gripper +export ATOM_ALIGNED_HUMAN_BUILDER_DIR=/path/to/human/aligned_parallel_gripper/1.0.0 +export ATOM_ALIGNED_ROBOT_BUILDER_DIR=/path/to/robot/aligned_parallel_gripper/1.0.0 +``` + +## Aligned RLDS 14D contract + +human 和 robot 分别保存为独立 TFDS builder,便于独立归一化和评估。每帧必须包含: + +```text +state[T,14] = L xyz, L yaw/pitch/roll, L gripper, + R xyz, R yaw/pitch/roll, R gripper +actions[T,14] = 同一顺序的 absolute target +image_base[T], image_left_wrist[T], image_right_wrist[T] = encoded JPEG +image_mask_base[T], image_mask_left_wrist[T], image_mask_right_wrist[T] = bool +prompt[T] = string +eef_frame = scalar episode string +``` + +EEF 保持项目最新版统一动作空间约定:absolute `xyz + yaw/pitch/roll`,不做 SE(3) delta; +夹爪为连续 absolute target,统一 `0=open, 1=closed`。映射槽位为 +`U8-U13/U17` 和 `U37-U42/U46`。 + +默认 human:robot 采样权重为 `0.8:0.2`,正式实验前应依据采集规模做消融。 + +## Norm stats + +Stage 1 直接复用 wudi 已提交的 `assets/cotrain_full_all_full_norm` 中 5 个 EgoVerse stats; +robot 阶段复用经过数据审计的 `assets/cotrain_real_robot_fix`。它们都已随 Git 仓库提供, +`ASSETS_BASE_DIR` 默认就是仓库内的 `assets`,无需在 DSW 重新计算。未来新增 aligned builder +时,才需要先计算它自己的 smoke stats: + +```bash +uv run --group rlds python scripts/compute_cotrain_norm_stats_light.py \ + --config-name egoscale_stage2_aligned \ + --exp-name norm_probe \ + --assets-base-dir ./assets \ + --max-frames 10000 +``` + +robot/aligned 阶段替换 config name 即可。正式训练前必须运行 +`compute_cotrain_full_norm_stats_light.py` 得到全量统计,不能把 probe stats 用于论文实验。 + +## DSW smoke + +```bash +export ATOM_RLDS_ROOT=/mnt/workspace/RLDS +export ATOM_PI05_BASE_PARAMS=/mnt/workspace/cache/openpi/openpi-assets/checkpoints/pi05_base/params +export ASSETS_BASE_DIR=$PWD/assets +export CHECKPOINT_BASE_DIR=/mnt/workspace/Atom-0-checkpoints + +STAGE=stage1_ego \ +EXP_NAME=stage1_dsw_smoke \ +FSDP_DEVICES=2 BATCH_SIZE=2 NUM_TRAIN_STEPS=20 \ +bash scripts/run_egoscale_stage.sh +``` + +Stage 2: + +```bash +export STAGE1_EXP=stage1_dsw_smoke +export STAGE1_STEP=19 # 以 NAS 中真实生成的 checkpoint 步数为准 +export PARAMS_PATH=/mnt/workspace/Atom-0-checkpoints/egoscale_stage1_ego/${STAGE1_EXP}/${STAGE1_STEP}/params +export ASSETS_BASE_DIR=$PWD/assets +export CHECKPOINT_BASE_DIR=/mnt/workspace/Atom-0-checkpoints +STAGE=stage2_robot \ +EXP_NAME=stage2_dsw_smoke \ +FSDP_DEVICES=2 BATCH_SIZE=2 NUM_TRAIN_STEPS=20 \ +bash scripts/run_egoscale_stage.sh +``` + +首次 smoke 默认关闭 W&B、action-MSE 和轨迹图,减少 JIT 时间。数据、loss、保存恢复通过后再设置 +`WANDB_ENABLED=1 RUN_ACTION_MSE=1`。 + +## 阿里云 DSW / DLC 环境 + +推荐使用阿里云 PAI 官方镜像: + +```text +modelscope:1.31.0-pytorch2.8.0-gpu-py311-cu124-ubuntu22.04 +``` + +项目会在独立 `.venv` 中按 `uv.lock` 安装 JAX 0.5.3、Torch 2.7.1 和 TensorFlow CPU 2.15; +官方镜像提供兼容的 Ubuntu、Python 3.11、CUDA 12 和驱动基础。不要在 DSW 内升级 NVIDIA driver。 + +上传代码后执行: + +```bash +bash scripts/setup_aliyun_dsw_env.sh +``` + +当前 DSW 已实测为 2×L20Y 80GB、128GB RAM、128GB `/dev/shm`,适合用 +`FSDP_DEVICES=2 BATCH_SIZE=2` 做 smoke。全参数大规模训练仍建议使用 8×80GB GPU、至少 +512GB 主机内存。当前 NAS 挂载点是 `/mnt/workspace`;DLC 若使用不同挂载点,只需同步修改 +`ATOM_RLDS_ROOT` 和 checkpoint 环境变量。 + +DLC 使用与 DSW 相同的镜像或把验证后的 DSW 环境制作成同地域 ACR 自定义镜像。DLC 的 +`WORLD_SIZE/RANK` 是节点级变量,当前 JAX 入口每个节点只启动一个 Python 进程: + +```bash +cd /mnt/workspace/junhe/Atom-0 +ATOM_RLDS_ROOT=/mnt/workspace/RLDS \ +ATOM_PI05_BASE_PARAMS=/mnt/workspace/cache/openpi/openpi-assets/checkpoints/pi05_base/params \ +ASSETS_BASE_DIR=$PWD/assets \ +CHECKPOINT_BASE_DIR=/mnt/workspace/Atom-0-checkpoints \ +STAGE=stage1_ego FSDP_DEVICES=8 BATCH_SIZE=512 NUM_TRAIN_STEPS=100000 \ +WANDB_ENABLED=1 RUN_ACTION_MSE=1 bash scripts/run_egoscale_stage.sh +``` + +不要用 `torchrun --nproc_per_node=8` 包裹该命令;否则会在每个节点启动 8 个 JAX 进程, +与当前 node-level JAX distributed 和 `fsdp_devices=8` 冲突。 + +大规模训练前先在 DLC 做 2 节点 × 8 卡、100 steps 测试,确认:两个节点均加入、各节点读取 +不同 split、只有 rank 0 创建 W&B run、checkpoint 能保存并恢复。 + +首次启动默认使用 `OVERWRITE=1`。中断后从同一个实验目录恢复时设置 `RESUME=1`(脚本会自动 +关闭 overwrite);不要同时设置 `RESUME=1 OVERWRITE=1`。后续阶段的 `PARAMS_PATH` 必须填写 +checkpoint 目录中真实存在的 `/params`,不要按总步数猜目录名。 diff --git "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" index bcee153..978ddaf 100644 --- "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" +++ "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\345\274\200\345\217\221\346\227\245\345\277\227.md" @@ -139,6 +139,8 @@ - 删除 full-all 专用 attach 路径,full-all、单数据集和后续新配置共用同一不变量。 - 现有 Piper、DROID、AgiBot、EgoVerse、RoboCOIN、RoboMIND 配置全部改为 80D;从 32D π0.5 checkpoint 初始化的配置统一使用 shape-safe loader。 +- 分阶段 Ego 迁移为尚未采集的 aligned human/robot 平行夹爪数据预留 2 个可选 mapping;它们不计入 + 上述 43 个真实 builder 审计,数据 contract 见 `docs/egoscale_staged_training.md`。 ### 验证 diff --git a/scripts/audit_unified_action_space.py b/scripts/audit_unified_action_space.py index a72b578..c1b63b8 100644 --- a/scripts/audit_unified_action_space.py +++ b/scripts/audit_unified_action_space.py @@ -30,9 +30,10 @@ def _configured_datasets(): ) datasets = tuple(dataset for group in groups for dataset in group) by_id = {dataset.uid: dataset for dataset in datasets} - if set(by_id) != set(action_space.UNIFIED_ACTION_SPECS): - missing = sorted(set(action_space.UNIFIED_ACTION_SPECS) - set(by_id)) - extra = sorted(set(by_id) - set(action_space.UNIFIED_ACTION_SPECS)) + audited_specs = set(action_space.UNIFIED_ACTION_SPECS) - action_space.OPTIONAL_ALIGNED_DATASET_IDS + if set(by_id) != audited_specs: + missing = sorted(audited_specs - set(by_id)) + extra = sorted(set(by_id) - audited_specs) raise ValueError(f"Config/spec registry mismatch: missing={missing}, extra={extra}") active_ids = {dataset.uid for dataset in config._FULL_ALL_FIX_DATA.datasets} expected_active = ( diff --git a/scripts/check_egoscale_setup.py b/scripts/check_egoscale_setup.py new file mode 100755 index 0000000..eec2972 --- /dev/null +++ b/scripts/check_egoscale_setup.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +"""Preflight a staged EgoScale-inspired run before allocating GPUs.""" + +from __future__ import annotations + +import argparse +import dataclasses +import os +from pathlib import Path +import sys + + +def _params_look_valid(path: Path) -> bool: + if not path.is_dir(): + return False + markers = ("_CHECKPOINT_METADATA", "manifest.ocdbt", "_METADATA") + return any((path / marker).exists() for marker in markers) or any(path.iterdir()) + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--config-name", required=True) + parser.add_argument("--assets-base-dir", default="./assets") + parser.add_argument("--params-path") + parser.add_argument("--allow-missing-norm-stats", action="store_true") + args = parser.parse_args() + + # Import after ATOM_RLDS_ROOT is set; config paths are resolved at import time. + from openpi.cotrain import action_space + from openpi.cotrain import config as cotrain_config + + config = cotrain_config.get_config(args.config_name) + datasets = cotrain_config._resolve_unified_datasets(config.data.datasets, config.model) + config = dataclasses.replace(config, assets_base_dir=args.assets_base_dir) + assets_root = Path(config.assets_dirs) + failures: list[str] = [] + + print(f"config={config.name}") + print(f"ATOM_RLDS_ROOT={os.environ.get('ATOM_RLDS_ROOT', '/mnt/data/RLDS')}") + print(f"datasets={len(datasets)} assets={assets_root}") + for dataset in datasets: + builder = Path(dataset.builder_dir) if dataset.builder_dir is not None else None + builder_ok = ( + builder is not None + and (builder / "dataset_info.json").exists() + and (builder / "features.json").exists() + ) + stats_dir = assets_root / dataset.uid + stats_ok = (stats_dir / "norm_stats.json").exists() + mapping_ok = (stats_dir / "unified_action_space.json").exists() + status = "OK" if builder_ok and stats_ok and mapping_ok else "MISSING" + print( + f"[{status}] {dataset.uid}: builder={builder} " + f"norm_stats={stats_ok} mapping_meta={mapping_ok}" + ) + if not builder_ok: + failures.append(f"missing/invalid TFDS builder: {builder}") + if not args.allow_missing_norm_stats: + if not stats_ok: + failures.append(f"missing norm stats: {stats_dir / 'norm_stats.json'}") + elif not mapping_ok: + failures.append(f"missing mapping metadata: {stats_dir / 'unified_action_space.json'}") + else: + try: + action_space.validate_metadata(stats_dir, dataset.unified_action_spec) + except ValueError as exc: + failures.append(str(exc)) + + params_path = args.params_path + if params_path is None and args.config_name == "egoscale_stage1_ego": + params_path = os.environ.get("ATOM_PI05_BASE_PARAMS") + if params_path and not params_path.startswith("gs://"): + resolved_params = Path(params_path).expanduser().resolve() + print(f"params={resolved_params}") + if not _params_look_valid(resolved_params): + failures.append(f"missing/invalid params directory: {resolved_params}") + elif args.config_name != "egoscale_stage1_ego" and not params_path: + failures.append("later stages require --params-path pointing to the previous stage's ...//params") + + if failures: + print("\nPreflight FAILED:", file=sys.stderr) + for failure in failures: + print(f"- {failure}", file=sys.stderr) + return 1 + print("\nPreflight OK") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/compute_cotrain_norm_stats_light.py b/scripts/compute_cotrain_norm_stats_light.py index 587e466..c43c17f 100644 --- a/scripts/compute_cotrain_norm_stats_light.py +++ b/scripts/compute_cotrain_norm_stats_light.py @@ -41,6 +41,14 @@ def _light_restructure(traj, dataset_id: str, restructure_name: str): "dataset_id": tf.fill([n], dataset_id), } + if restructure_name == "aligned_parallel_gripper": + n = tf.shape(traj["actions"])[0] + return { + "actions": traj["actions"], + "state": traj["state"], + "dataset_id": tf.fill([n], dataset_id), + } + # All currently registered full-data schemas store proprio/action in this layout. if restructure_name in { "agibot", @@ -355,6 +363,7 @@ def main( exp_name: str, max_frames: int = 1_000_000, rlds_data_dir: str | None = None, + assets_base_dir: str | None = None, overwrite: bool = False, dataset_id: str | None = None, verify_against_old: bool = False, @@ -363,6 +372,8 @@ def main( ) -> None: config = cotrain_config.get_config(config_name) config = dataclasses.replace(config, exp_name=exp_name) + if assets_base_dir is not None: + config = dataclasses.replace(config, assets_base_dir=assets_base_dir) if rlds_data_dir is not None: config = dataclasses.replace(config, data=dataclasses.replace(config.data, rlds_data_dir=rlds_data_dir)) if verify_against_old: diff --git a/scripts/run_egoscale_stage.sh b/scripts/run_egoscale_stage.sh new file mode 100755 index 0000000..e71562a --- /dev/null +++ b/scripts/run_egoscale_stage.sh @@ -0,0 +1,93 @@ +#!/usr/bin/env bash +set -euo pipefail + +REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +PYTHON_BIN="${PYTHON_BIN:-${REPO_DIR}/.venv/bin/python}" +STAGE="${STAGE:-stage1_ego}" +ATOM_RLDS_ROOT="${ATOM_RLDS_ROOT:-/mnt/data/RLDS}" +ASSETS_BASE_DIR="${ASSETS_BASE_DIR:-${REPO_DIR}/assets}" +CHECKPOINT_BASE_DIR="${CHECKPOINT_BASE_DIR:-${REPO_DIR}/checkpoints}" +RESUME="${RESUME:-0}" +if [[ -z "${OVERWRITE+x}" ]]; then + if [[ "${RESUME}" == "1" ]]; then + OVERWRITE=0 + else + OVERWRITE=1 + fi +fi + +if [[ "${RESUME}" == "1" && "${OVERWRITE}" == "1" ]]; then + echo "RESUME=1 and OVERWRITE=1 are mutually exclusive" >&2 + exit 2 +fi + +case "${STAGE}" in + stage1_ego) CONFIG_NAME="egoscale_stage1_ego" ;; + stage2_robot) CONFIG_NAME="egoscale_stage2_robot" ;; + stage2_aligned) CONFIG_NAME="egoscale_stage2_aligned" ;; + stage3_robot) CONFIG_NAME="egoscale_stage3_robot" ;; + *) echo "Unknown STAGE=${STAGE}" >&2; exit 2 ;; +esac + +if [[ ! -x "${PYTHON_BIN}" ]]; then + echo "Python environment not found: ${PYTHON_BIN}" >&2 + exit 1 +fi +if [[ "${STAGE}" == "stage1_ego" ]]; then + : "${ATOM_PI05_BASE_PARAMS:?Set ATOM_PI05_BASE_PARAMS to the local pi05_base/params directory}" +else + : "${PARAMS_PATH:?Set PARAMS_PATH to the previous-stage /params directory}" +fi + +export ATOM_RLDS_ROOT +export ATOM_PI05_BASE_PARAMS="${ATOM_PI05_BASE_PARAMS:-}" +export PYTHONPATH="${REPO_DIR}/src:${REPO_DIR}/packages/openpi-client/src:${PYTHONPATH:-}" +export XLA_PYTHON_CLIENT_MEM_FRACTION="${XLA_PYTHON_CLIENT_MEM_FRACTION:-0.90}" +export TF_FORCE_GPU_ALLOW_GROWTH=true + +PREFLIGHT_ARGS=( + --config-name "${CONFIG_NAME}" + --assets-base-dir "${ASSETS_BASE_DIR}" +) +if [[ "${STAGE}" != "stage1_ego" ]]; then + PREFLIGHT_ARGS+=(--params-path "${PARAMS_PATH}") +fi +"${PYTHON_BIN}" "${REPO_DIR}/scripts/check_egoscale_setup.py" "${PREFLIGHT_ARGS[@]}" + +TRAIN_ARGS=( + "${CONFIG_NAME}" + --exp-name "${EXP_NAME:-${CONFIG_NAME}_smoke}" + --assets-base-dir "${ASSETS_BASE_DIR}" + --checkpoint-base-dir "${CHECKPOINT_BASE_DIR}" + --fsdp-devices "${FSDP_DEVICES:-1}" + --batch-size "${BATCH_SIZE:-2}" + --num-train-steps "${NUM_TRAIN_STEPS:-20}" + --log-interval "${LOG_INTERVAL:-1}" + --save-interval "${SAVE_INTERVAL:-10}" + --eval-interval "${EVAL_INTERVAL:-10}" + --num-val-batches "${NUM_VAL_BATCHES:-1}" + --num-action-mse-batches "${NUM_ACTION_MSE_BATCHES:-1}" + --shuffle-buffer-size "${SHUFFLE_BUFFER_SIZE:-256}" + --data-num-parallel-reads "${DATA_NUM_PARALLEL_READS:-1}" + --data-num-parallel-calls "${DATA_NUM_PARALLEL_CALLS:-2}" +) +if [[ "${RESUME}" == "1" ]]; then + TRAIN_ARGS+=(--resume) +elif [[ "${OVERWRITE}" == "1" ]]; then + TRAIN_ARGS+=(--overwrite) +fi +if [[ "${STAGE}" != "stage1_ego" ]]; then + TRAIN_ARGS+=(--weight-loader.params-path "${PARAMS_PATH}") +fi +if [[ "${WANDB_ENABLED:-0}" == "0" ]]; then + TRAIN_ARGS+=(--no-wandb-enabled) +else + : "${WANDB_API_KEY:?Set WANDB_API_KEY when WANDB_ENABLED=1}" +fi +if [[ "${RUN_ACTION_MSE:-0}" == "0" ]]; then + TRAIN_ARGS+=(--no-run-action-mse --no-viz-action-traj --val-flow-loss-mode fixed_seed) +fi + +cd "${REPO_DIR}" +echo "Launching ${CONFIG_NAME} on host $(hostname); do not wrap this JAX command in torchrun." +"${PYTHON_BIN}" -u scripts/train_cotrain.py "${TRAIN_ARGS[@]}" "$@" diff --git a/scripts/setup_aliyun_dsw_env.sh b/scripts/setup_aliyun_dsw_env.sh new file mode 100755 index 0000000..bd021ee --- /dev/null +++ b/scripts/setup_aliyun_dsw_env.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -euo pipefail + +REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "${REPO_DIR}" + +if ! command -v python3.11 >/dev/null 2>&1; then + echo "Python 3.11 is required. Select a PAI image tagged py311." >&2 + exit 1 +fi +if ! command -v uv >/dev/null 2>&1; then + python3.11 -m pip install --user uv + export PATH="${HOME}/.local/bin:${PATH}" +fi + +export GIT_LFS_SKIP_SMUDGE=1 +uv venv --python 3.11 +uv sync --frozen --group dev --group rlds +uv pip install -e . + +.venv/bin/python - <<'PY' +import jax +import tensorflow as tf +import torch + +print("jax", jax.__version__, "devices", jax.devices()) +print("tensorflow", tf.__version__) +print("torch", torch.__version__, "cuda", torch.version.cuda) +if not any(device.platform == "gpu" for device in jax.devices()): + raise SystemExit("JAX did not detect a GPU") +PY + +echo "DSW environment is ready: ${REPO_DIR}/.venv" diff --git a/src/openpi/cotrain/action_space.py b/src/openpi/cotrain/action_space.py index e225f4b..ab4e19c 100644 --- a/src/openpi/cotrain/action_space.py +++ b/src/openpi/cotrain/action_space.py @@ -246,6 +246,20 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct + dims(9, RIGHT_EEF_EULER, 3) ) +# Canonical source layout for newly collected aligned human/robot play data: +# [left xyz, left yaw/pitch/roll, left gripper, +# right xyz, right yaw/pitch/roll, right gripper] +# EEF state/actions remain absolute xyz + yaw/pitch/roll, matching the project's +# final EgoVerse convention. Grippers are absolute in [0, 1]. +_ALIGNED_PARALLEL_GRIPPER_MAPPING = ( + dims(0, LEFT_EEF_POSITION, 3) + + dims(3, LEFT_EEF_EULER, 3) + + dims(6, LEFT_GRIPPER, 1) + + dims(7, RIGHT_EEF_POSITION, 3) + + dims(10, RIGHT_EEF_EULER, 3) + + dims(13, RIGHT_GRIPPER, 1) +) + _AGIBOT_MAPPING = ( _dual_arm(7) + dims(14, LEFT_GRIPPER, 1) + dims(15, RIGHT_GRIPPER, 1) + dims(16, HEAD, 2) + dims(18, WAIST, 2) ) @@ -261,10 +275,20 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct "egoverse_human": _same(_EGO_MAPPING), "egoverse_mecka": _same(_EGO_MAPPING), "egoverse_scale": _same(_EGO_MAPPING), + "aligned_parallel_gripper_human": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), + "aligned_parallel_gripper_robot": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), "piper30": _same(_PIPER_MAPPING, delta=slots(LEFT_ARM, 6) + slots(RIGHT_ARM, 6)), "piper2": _same(_PIPER_MAPPING, delta=slots(LEFT_ARM, 6) + slots(RIGHT_ARM, 6)), } +# These two specs reserve the agreed mapping for future aligned collection and +# intentionally have no real builder yet. Real-data audits exclude them until the +# corresponding NAS directories are populated. +OPTIONAL_ALIGNED_DATASET_IDS = { + "aligned_parallel_gripper_human", + "aligned_parallel_gripper_robot", +} + def _register_robocoin() -> None: specs = UNIFIED_ACTION_SPECS diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 436e8f7..7530f1b 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -12,6 +12,7 @@ import pathlib from typing import Literal +import flax.nnx as nnx from typing_extensions import override import tyro @@ -22,10 +23,12 @@ import openpi.models.model as _model import openpi.models.pi0_config as pi0_config import openpi.shared.download as _download +import openpi.shared.nnx_utils as nnx_utils import openpi.shared.normalize as _normalize import openpi.training.config as _config import openpi.training.droid_rlds_dataset as droid_rlds_dataset import openpi.training.optimizer as _optimizer +import openpi.training.weight_loaders as _weight_loaders import openpi.transforms as _transforms logger = logging.getLogger(__name__) @@ -143,6 +146,11 @@ def create(self, assets_dirs: pathlib.Path, model_config: _model.BaseModelConfig class CotrainTrainConfig(_config.TrainConfig): """TrainConfig + validation-eval knobs.""" + # Optional existing assets subdirectory to reuse. Staged runs change the + # training config name but should reuse exactly the same per-dataset 80D stats + # as their corresponding Ego-only/full-all baseline. + norm_stats_assets_name: str | None = None + # How often (in steps) to run validation. eval_interval: int = 1000 # Independent global validation batch size. None preserves the legacy behavior of @@ -177,6 +185,11 @@ class CotrainTrainConfig(_config.TrainConfig): data_num_parallel_reads: int = -1 data_num_parallel_calls: int = -1 + @property + def assets_dirs(self) -> pathlib.Path: + name = self.norm_stats_assets_name or self.name + return (pathlib.Path(self.assets_base_dir) / name).resolve() + # --------------------------------------------------------------------------- # Config registry (separate from openpi's _CONFIGS; selected via this module's cli()). @@ -185,7 +198,15 @@ class CotrainTrainConfig(_config.TrainConfig): # 32D projection/head, so checkpoint-start configs use the shape-safe loader and randomly # initialize only parameters whose shapes changed. -_RLDS_ROOT = os.environ.get("RLDS_DATA_DIR", "/mnt/bos/bo23lu") +# DSW/DLC should mount the NAS dataset tree at this root. Keeping the root in an +# environment variable lets the exact same checkout run in a developer instance and +# a distributed job without editing forty-plus builder paths. RLDS_DATA_DIR remains +# supported for the existing Baidu jobs. +_RLDS_ROOT = os.environ.get("ATOM_RLDS_ROOT", os.environ.get("RLDS_DATA_DIR", "/mnt/data/RLDS")).rstrip("/") +_PI05_BASE_PARAMS = os.environ.get( + "ATOM_PI05_BASE_PARAMS", + "gs://openpi-assets/checkpoints/pi05_base/params", +) _PIPER30_ROOT = ( f"{_RLDS_ROOT}/realworld_piper/" @@ -517,6 +538,47 @@ class CotrainTrainConfig(_config.TrainConfig): ), ) +# Optional aligned human/robot play data. These paths are intentionally stable +# placeholders under ATOM_RLDS_ROOT; they do not need to exist for the existing +# configs. See docs/egoscale_staged_training.md for the exact 14D RLDS contract. +_ALIGNED_PARALLEL_GRIPPER_ROOT = os.environ.get( + "ATOM_ALIGNED_RLDS_ROOT", + f"{_RLDS_ROOT}/aligned_parallel_gripper", +).rstrip("/") +_ALIGNED_PARALLEL_GRIPPER_DATA = CotrainDataConfig( + rlds_data_dir=_ALIGNED_PARALLEL_GRIPPER_ROOT, + datasets=( + CotrainRLDSDataset( + name="aligned_parallel_gripper", + dataset_id="aligned_parallel_gripper_human", + version="1.0.0", + builder_dir=os.environ.get( + "ATOM_ALIGNED_HUMAN_BUILDER_DIR", + f"{_ALIGNED_PARALLEL_GRIPPER_ROOT}/human/aligned_parallel_gripper/1.0.0", + ), + weight=0.8, + train_split="train", + val_splits={"seen": "seen_test", "unseen": "unseen_test"}, + restructure_name="aligned_parallel_gripper", + action_dim=14, + ), + CotrainRLDSDataset( + name="aligned_parallel_gripper", + dataset_id="aligned_parallel_gripper_robot", + version="1.0.0", + builder_dir=os.environ.get( + "ATOM_ALIGNED_ROBOT_BUILDER_DIR", + f"{_ALIGNED_PARALLEL_GRIPPER_ROOT}/robot/aligned_parallel_gripper/1.0.0", + ), + weight=0.2, + train_split="train", + val_splits={"seen": "seen_test", "unseen": "unseen_test"}, + restructure_name="aligned_parallel_gripper", + action_dim=14, + ), + ), +) + def _make_robocoin_dataset( dataset_id: str, @@ -555,13 +617,15 @@ def _make_robocoin_dataset( _ROBOMIND_FULL_ROOT = f"{_RLDS_ROOT}/RoboMIND_full" # RoboMIND_full tuple format: -# dataset_id, repo dir, episodes, action_dim, delta mask dims, camera keys +# dataset_id, repo dir, train episodes, action_dim, delta mask dims, camera keys # where camera keys are (base_0_rgb, left_wrist_0_rgb, right_wrist_0_rgb). +# Train counts below come from each builder's dataset_info.json shardLengths on +# /mnt/workspace/RLDS, not from the total episode count embedded in its directory name. _ROBOMIND_FULL_REPOS = ( ( "robomind_agilex_cobot_magic_s14_a14", "agilex_cobot_magic_agilex_dual_arm_h5_agilex_3rgb_real_s14_a14_fps30_cam_high_cam_left_wrist_cam_right_wrist__episodes_10374", - 10_374, + 9_855, 14, (6, -1, 6, -1), ("cam_high", "cam_left_wrist", "cam_right_wrist"), @@ -569,7 +633,7 @@ def _make_robocoin_dataset( ( "robomind_franka_fr3_dual_s16_a16", "franka_fr3_dual_master_puppet_joint_position_h5_franka_fr3_dual_real_s16_a16_fps30_cam_high_cam_left_cam_right_cam_top__episodes_1774", - 1_774, + 1_685, 16, (7, -1, 7, -1), ("cam_high", "cam_left", "cam_right"), @@ -577,7 +641,7 @@ def _make_robocoin_dataset( ( "robomind_franka_panda_s8_a8", "franka_panda_master_puppet_joint_position_h5_franka_3rgb_real_s8_a8_fps30_cam_left_cam_right_cam_top__episodes_17219", - 17_219, + 14_956, 8, (7, -1), ("cam_top", "cam_left", "cam_right"), @@ -585,7 +649,7 @@ def _make_robocoin_dataset( ( "robomind_franka_sim_franka_s8_a8", "franka_sim_simulation_franka_joint_position_h5_sim_franka_3rgb_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_14488", - 14_488, + 8_445, 8, (7, -1), ("cam_front_external", "cam_handeye", "cam_right_external"), @@ -593,7 +657,7 @@ def _make_robocoin_dataset( ( "robomind_franka_sim_simulation_s8_a8", "franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_11422", - 11_422, + 8_662, 8, (7, -1), ("cam_front_external", "cam_handeye", "cam_right_external"), @@ -601,7 +665,7 @@ def _make_robocoin_dataset( ( "robomind_franka_sim_simulation_no_front_s8_a8", "franka_sim_simulation_franka_joint_position_h5_simulation_sim_s8_a8_fps30_cam_handeye_cam_left_external_cam_right_external__episodes_158", - 158, + 150, 8, (7, -1), ("cam_left_external", "cam_handeye", "cam_right_external"), @@ -609,7 +673,7 @@ def _make_robocoin_dataset( ( "robomind_franka_sim_none_s8_a8", "franka_sim_simulation_franka_joint_position_none_sim_s8_a8_fps30_cam_front_external_cam_handeye_cam_left_external_cam_right_external__episodes_222", - 222, + 211, 8, (7, -1), ("cam_front_external", "cam_handeye", "cam_right_external"), @@ -617,7 +681,7 @@ def _make_robocoin_dataset( ( "robomind_tienkung_gello_s16_a16", "tienkung_humanoid_master_puppet_joint_position_h5_tienkung_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_6626", - 6_626, + 5_402, 16, # arm7 delta + hand-closure absolute, per side. (7, -1, 7, -1), @@ -626,7 +690,7 @@ def _make_robocoin_dataset( ( "robomind_tienkung_prod1_gello_s16_a16", "tienkung_humanoid_master_puppet_joint_position_h5_tienkung_prod1_gello_1rgb_real_s16_a16_fps30_cam_top__episodes_2959", - 2_959, + 2_811, 16, # arm7 delta + hand-closure absolute, per side. (7, -1, 7, -1), @@ -635,7 +699,7 @@ def _make_robocoin_dataset( ( "robomind_tienkung_xsens_s14_a14", "tienkung_humanoid_master_puppet_joint_position_h5_tienkung_xsens_1rgb_real_s14_a14_fps30_cam_top__episodes_6126", - 6_126, + 5_775, 14, (14,), ("cam_top", None, None), @@ -643,7 +707,7 @@ def _make_robocoin_dataset( ( "robomind_tienkung_sim_s38_a38", "tienkung_humanoid_tiangong_joint_position_h5_sim_tienkung_1rgb_sim_s38_a38_fps30_cam_chest_cam_head__episodes_3965", - 3_965, + 3_767, 38, # arm7 delta + dex-hand12 absolute, per side. (7, -12, 7, -12), @@ -652,7 +716,7 @@ def _make_robocoin_dataset( ( "robomind_tienkung_real_s38_a38", "tienkung_humanoid_tiangong_joint_position_none_real_s38_a38_fps30_cam_chest_cam_head__episodes_146", - 146, + 139, 38, # arm7 delta + dex-hand12 absolute, per side. (7, -12, 7, -12), @@ -661,7 +725,7 @@ def _make_robocoin_dataset( ( "robomind_ur5e_s7_a7", "ur5e_master_puppet_joint_position_h5_ur_1rgb_real_s7_a7_fps30_cam_top__episodes_26380", - 26_380, + 25_061, 7, (6, -1), ("cam_top", None, None), @@ -841,6 +905,10 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): ), ) +_EGOVERSE_DATASET_IDS = {dataset.uid for dataset in _EGOVERSE_FULL_DATA.datasets} +# Use wudi's audited production robot mixture for staged robot adaptation. +_ROBOT_ALL_DATA = _REAL_ROBOT_FIX_DATA + _UNIFIED_PI05_MODEL = pi0_config.Pi0Config( pi05=True, @@ -848,10 +916,29 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): max_token_len=384, ) _PI05_BASE_SHAPE_SAFE_LOADER = cotrain_weight_loaders.ShapeSafeCheckpointWeightLoader( - params_path="gs://openpi-assets/checkpoints/pi05_base/params", + params_path=_PI05_BASE_PARAMS, ) +def _freeze_vlm_language_filter(): + """Freeze the PaliGemma language transformer but keep vision/action modules trainable. + + Pi0 stores the shared VLM language stack under ``llm`` and the action expert + under the same tree with ``_1`` in its path. Stage-II uses this filter to + preserve language representations while adapting the image encoder and action + expert, following the part of EgoScale's recipe that applies to this codebase. + """ + return nnx.All( + nnx_utils.PathRegex(".*llm.*"), + nnx.Not(nnx_utils.PathRegex(".*llm.*_1.*")), + ) + + +def _strict_stage_checkpoint_loader() -> _weight_loaders.CheckpointWeightLoader: + """Require an explicit, fully shape-compatible previous-stage checkpoint.""" + return _weight_loaders.CheckpointWeightLoader(params_path=tyro.MISSING) + + _REAL_ONLY_PI05 = CotrainTrainConfig( name="cotrain_real_only", model=_UNIFIED_PI05_MODEL, @@ -893,11 +980,73 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): data=_FULL_ALL_FIX_DATA, ) +# --------------------------------------------------------------------------- +# EgoScale-inspired staged transfer for parallel-gripper robots. +# +# Stage 1 learns from the existing 12D EgoVerse EEF trajectories. Stage 2 can +# either adapt directly to all robot joint/gripper data (the required project +# baseline), or mid-train on newly collected aligned 14D EEF+gripper play data. +# Stage 3 is the robot adaptation after aligned mid-training. Every later stage +# requires --weight-loader.params-path and uses the strict upstream loader so a +# width/shape mismatch cannot silently random-initialize parameters. +# --------------------------------------------------------------------------- +_EGOSCALE_STAGE1_EGO = dataclasses.replace( + _REAL_ONLY_PI05, + name="egoscale_stage1_ego", + data=_EGOVERSE_FULL_DATA, + lr_schedule=_optimizer.CosineDecaySchedule( + warmup_steps=2_000, + peak_lr=2.5e-5, + decay_steps=100_000, + decay_lr=2.5e-6, + ), + num_train_steps=100_000, + save_interval=5_000, + keep_period=10_000, + # wudi's completed full-all stats contain all five EgoVerse builders. + norm_stats_assets_name="cotrain_full_all_full_norm", +) + +_EGOSCALE_STAGE2_ROBOT = dataclasses.replace( + _REAL_ROBOT_FIX_PI05, + name="egoscale_stage2_robot", + data=_ROBOT_ALL_DATA, + weight_loader=_strict_stage_checkpoint_loader(), + freeze_filter=_freeze_vlm_language_filter(), + lr_schedule=_optimizer.CosineDecaySchedule( + warmup_steps=2_000, + peak_lr=3.0e-6, + decay_steps=100_000, + decay_lr=3.0e-7, + ), + num_train_steps=100_000, + save_interval=5_000, + keep_period=10_000, + norm_stats_assets_name="cotrain_real_robot_fix", +) + +_EGOSCALE_STAGE2_ALIGNED = dataclasses.replace( + _EGOSCALE_STAGE2_ROBOT, + name="egoscale_stage2_aligned", + data=_ALIGNED_PARALLEL_GRIPPER_DATA, + num_train_steps=50_000, + norm_stats_assets_name="egoscale_stage2_aligned", +) + +_EGOSCALE_STAGE3_ROBOT = dataclasses.replace( + _EGOSCALE_STAGE2_ROBOT, + name="egoscale_stage3_robot", +) + _COTRAIN_CONFIGS = [ _REAL_ONLY_PI05, _REAL_ROBOT_PI05, _REAL_ROBOT_FIX_PI05, _FULL_ALL_PI05_FULL_NORM, + _EGOSCALE_STAGE1_EGO, + _EGOSCALE_STAGE2_ROBOT, + _EGOSCALE_STAGE2_ALIGNED, + _EGOSCALE_STAGE3_ROBOT, ] if len({c.name for c in _COTRAIN_CONFIGS}) != len(_COTRAIN_CONFIGS): diff --git a/src/openpi/cotrain/rlds_dataset.py b/src/openpi/cotrain/rlds_dataset.py index 156ada1..f58d069 100644 --- a/src/openpi/cotrain/rlds_dataset.py +++ b/src/openpi/cotrain/rlds_dataset.py @@ -220,6 +220,45 @@ def _standardized_restructure(traj, dataset_name: str): } +def _aligned_parallel_gripper_restructure(traj, dataset_name: str): + """Aligned human/robot play data with a shared 14D EEF+gripper interface. + + This uses the same image/prompt fields as ``standardized`` and requires: + + state[T,14] = [L xyz, L ypr, L grip, R xyz, R ypr, R grip] + actions[T,14] = [L absolute xyz, L absolute ypr, L grip, + R absolute xyz, R absolute ypr, R grip] + + EEF poses are kept in the source dataset's documented frame and are not + differenced, matching the project's final unified-action-space design. + Gripper values are absolute, normalized to 0=open and 1=closed. + ``eef_frame`` is a scalar episode string included in prompt metadata. + """ + import tensorflow as tf + + n = tf.shape(traj["actions"])[0] + tf.debugging.assert_equal(tf.shape(traj["state"])[-1], 14) + tf.debugging.assert_equal(tf.shape(traj["actions"])[-1], 14) + eef_frame = traj.get("eef_frame", tf.constant("chunk_start_local")) + return { + "actions": traj["actions"], + "state": traj["state"], + "image": { + "base_0_rgb": traj["image_base"], + "left_wrist_0_rgb": traj["image_left_wrist"], + "right_wrist_0_rgb": traj["image_right_wrist"], + }, + "image_mask": { + "base_0_rgb": traj["image_mask_base"], + "left_wrist_0_rgb": traj["image_mask_left_wrist"], + "right_wrist_0_rgb": traj["image_mask_right_wrist"], + }, + "prompt": traj["prompt"], + "prompt_prefix": _fill_action_prompt_prefix(n, "eef", eef_frame), + "dataset_id": tf.fill([n], dataset_name), + } + + def _robomind_restructure(traj, dataset_name: str): """Map the raw RoboMIND (robomind_infidata) RLDS schema -> common co-training keys. @@ -568,6 +607,7 @@ def image_or_blank(key): # All feed the same prepare path (chunk + decode). The images they emit are encoded; the # prepare path decodes them. Add new clean datasets here. STD_RESTRUCTURE_FNS = { + "aligned_parallel_gripper": _aligned_parallel_gripper_restructure, "standardized": _standardized_restructure, "agibot": _agibot_restructure, "robomind": _robomind_restructure, diff --git a/tests/cotrain/test_action_space.py b/tests/cotrain/test_action_space.py index 82d16b0..6e8177f 100644 --- a/tests/cotrain/test_action_space.py +++ b/tests/cotrain/test_action_space.py @@ -9,6 +9,8 @@ EXPECTED_DATASET_IDS = { "agibot", + "aligned_parallel_gripper_human", + "aligned_parallel_gripper_robot", "droid", "egoverse_aria", "egoverse_eva", @@ -57,7 +59,11 @@ def test_registry_covers_all_documented_builders() -> None: assert set(action_space.UNIFIED_ACTION_SPECS) == EXPECTED_DATASET_IDS - assert len(EXPECTED_DATASET_IDS) == 44 + assert len(EXPECTED_DATASET_IDS) == 46 + assert action_space.OPTIONAL_ALIGNED_DATASET_IDS == { + "aligned_parallel_gripper_human", + "aligned_parallel_gripper_robot", + } @pytest.mark.parametrize("dataset_id", sorted(EXPECTED_DATASET_IDS)) @@ -71,7 +77,7 @@ def test_masks_are_80d_and_temporal_slots_are_mapped(dataset_id: str) -> None: assert not spec.already_delta_slots -def test_only_egoverse_maps_eef_slots() -> None: +def test_only_ego_and_aligned_play_map_eef_slots() -> None: eef_slots = set(range(action_space.LEFT_EEF_POSITION, action_space.LEFT_EEF_EULER + 3)) eef_slots |= set(range(action_space.RIGHT_EEF_POSITION, action_space.RIGHT_EEF_EULER + 3)) users = { @@ -85,9 +91,28 @@ def test_only_egoverse_maps_eef_slots() -> None: "egoverse_human", "egoverse_mecka", "egoverse_scale", + "aligned_parallel_gripper_human", + "aligned_parallel_gripper_robot", } +@pytest.mark.parametrize( + "dataset_id", + ["aligned_parallel_gripper_human", "aligned_parallel_gripper_robot"], +) +def test_aligned_parallel_gripper_layout(dataset_id: str) -> None: + spec = action_space.UNIFIED_ACTION_SPECS[dataset_id] + source = np.arange(14, dtype=np.float32) + mapped = action_space.map_array(source, spec.action_mapping) + np.testing.assert_array_equal(mapped[action_space.LEFT_EEF_POSITION : action_space.LEFT_EEF_EULER + 3], source[:6]) + assert mapped[action_space.LEFT_GRIPPER] == source[6] + np.testing.assert_array_equal( + mapped[action_space.RIGHT_EEF_POSITION : action_space.RIGHT_EEF_EULER + 3], source[7:13] + ) + assert mapped[action_space.RIGHT_GRIPPER] == source[13] + assert not any(spec.delta_mask) + + def test_robocoin_mixed_eef_sources_are_dropped() -> None: expected_dropped = { "robocoin_agilex_cobot_magic_s26_a26": set(range(7, 13)) | set(range(20, 26)), diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index 23e2534..92c6d85 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -14,6 +14,10 @@ def test_all_registered_cotrain_configs_resolve_to_unified_80d() -> None: "cotrain_real_robot", "cotrain_real_robot_fix", "cotrain_full_all_full_norm", + "egoscale_stage1_ego", + "egoscale_stage2_robot", + "egoscale_stage2_aligned", + "egoscale_stage3_robot", } for train_config in config._COTRAIN_CONFIGS: assert train_config.model.action_dim == action_space.UNIFIED_ACTION_DIM @@ -85,3 +89,51 @@ def test_full_all_full_norm_adds_egoverse_to_audited_real_robot_data() -> None: assert full_ids.isdisjoint(config._REAL_ROBOT_FIX_EXCLUDED_DATASET_IDS) assert sum(dataset.weight for dataset in config._FULL_ALL_FIX_DATA.datasets) == pytest.approx(1.0) assert config.get_config("cotrain_full_all_full_norm").data is config._FULL_ALL_FIX_DATA + + +def test_robomind_weights_use_actual_train_split_episode_counts() -> None: + expected = { + "robomind_agilex_cobot_magic_s14_a14": 9_855, + "robomind_franka_fr3_dual_s16_a16": 1_685, + "robomind_franka_panda_s8_a8": 14_956, + "robomind_franka_sim_franka_s8_a8": 8_445, + "robomind_franka_sim_simulation_s8_a8": 8_662, + "robomind_franka_sim_simulation_no_front_s8_a8": 150, + "robomind_franka_sim_none_s8_a8": 211, + "robomind_tienkung_gello_s16_a16": 5_402, + "robomind_tienkung_prod1_gello_s16_a16": 2_811, + "robomind_tienkung_xsens_s14_a14": 5_775, + "robomind_tienkung_sim_s38_a38": 3_767, + "robomind_tienkung_real_s38_a38": 139, + "robomind_ur5e_s7_a7": 25_061, + } + actual = {dataset_id: train_episodes for dataset_id, _, train_episodes, _, _, _ in config._ROBOMIND_FULL_REPOS} + assert actual == expected + assert config._ROBOMIND_FULL_EPISODES == 86_919 + + +def test_robot_stage_excludes_all_egoverse_datasets() -> None: + robot_ids = {dataset.uid for dataset in config._ROBOT_ALL_DATA.datasets} + assert robot_ids + assert robot_ids.isdisjoint(config._EGOVERSE_DATASET_IDS) + assert abs(sum(dataset.weight for dataset in config._ROBOT_ALL_DATA.datasets) - 1.0) < 1e-6 + + +def test_staged_configs_use_expected_data_and_strict_checkpoint_loader() -> None: + assert {dataset.uid for dataset in config._EGOSCALE_STAGE1_EGO.data.datasets} == config._EGOVERSE_DATASET_IDS + assert config._EGOSCALE_STAGE2_ROBOT.data is config._ROBOT_ALL_DATA + assert config._EGOSCALE_STAGE2_ALIGNED.data is config._ALIGNED_PARALLEL_GRIPPER_DATA + assert config._EGOSCALE_STAGE3_ROBOT.data is config._ROBOT_ALL_DATA + for staged in ( + config._EGOSCALE_STAGE2_ROBOT, + config._EGOSCALE_STAGE2_ALIGNED, + config._EGOSCALE_STAGE3_ROBOT, + ): + assert staged.weight_loader.__class__.__name__ == "CheckpointWeightLoader" + + +def test_stage2_freeze_filter_keeps_action_expert_and_vision_trainable() -> None: + freeze = config._freeze_vlm_language_filter() + assert freeze(("PaliGemma", "llm", "layers", "attn"), object()) + assert not freeze(("PaliGemma", "llm", "layers", "attn_1"), object()) + assert not freeze(("PaliGemma", "img", "encoderblock", "attn"), object()) From edef0c4aa34200d8a681385171e26c483f9900f4 Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 20 Jul 2026 10:27:14 +0800 Subject: [PATCH 20/64] Fix fresh-clone DSW environment setup --- scripts/setup_aliyun_dsw_env.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/setup_aliyun_dsw_env.sh b/scripts/setup_aliyun_dsw_env.sh index bd021ee..c349801 100755 --- a/scripts/setup_aliyun_dsw_env.sh +++ b/scripts/setup_aliyun_dsw_env.sh @@ -14,6 +14,10 @@ if ! command -v uv >/dev/null 2>&1; then fi export GIT_LFS_SKIP_SMUDGE=1 +# pyproject.toml keeps an optional local wheel source for environments that ship +# a lightweight rerun stub. Fresh Git clones do not contain this ignored directory; +# uv requires every find-links path to exist even when it resolves rerun-sdk from PyPI. +mkdir -p third_party/rerun-stub/dist uv venv --python 3.11 uv sync --frozen --group dev --group rlds uv pip install -e . From 358b790d0466a19d0290eb821ced4bfe1174de65 Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 20 Jul 2026 10:45:25 +0800 Subject: [PATCH 21/64] Make DSW setup idempotent --- scripts/setup_aliyun_dsw_env.sh | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/scripts/setup_aliyun_dsw_env.sh b/scripts/setup_aliyun_dsw_env.sh index c349801..fdc6dd3 100755 --- a/scripts/setup_aliyun_dsw_env.sh +++ b/scripts/setup_aliyun_dsw_env.sh @@ -3,6 +3,7 @@ set -euo pipefail REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "${REPO_DIR}" +export PATH="${HOME}/.local/bin:${PATH}" if ! command -v python3.11 >/dev/null 2>&1; then echo "Python 3.11 is required. Select a PAI image tagged py311." >&2 @@ -10,7 +11,6 @@ if ! command -v python3.11 >/dev/null 2>&1; then fi if ! command -v uv >/dev/null 2>&1; then python3.11 -m pip install --user uv - export PATH="${HOME}/.local/bin:${PATH}" fi export GIT_LFS_SKIP_SMUDGE=1 @@ -18,7 +18,18 @@ export GIT_LFS_SKIP_SMUDGE=1 # a lightweight rerun stub. Fresh Git clones do not contain this ignored directory; # uv requires every find-links path to exist even when it resolves rerun-sdk from PyPI. mkdir -p third_party/rerun-stub/dist -uv venv --python 3.11 +if [[ "${UV_VENV_CLEAR:-0}" == "1" ]]; then + uv venv --clear --python 3.11 +elif [[ -x .venv/bin/python ]]; then + VENV_PYTHON_VERSION="$(.venv/bin/python -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')" + if [[ "${VENV_PYTHON_VERSION}" != "3.11" ]]; then + echo ".venv uses Python ${VENV_PYTHON_VERSION}; rerun with UV_VENV_CLEAR=1" >&2 + exit 1 + fi + echo "Reusing existing Python ${VENV_PYTHON_VERSION} environment at ${REPO_DIR}/.venv" +else + uv venv --python 3.11 +fi uv sync --frozen --group dev --group rlds uv pip install -e . From 2f955b7dcd453b0e69cea85ce0d56f5107c61f67 Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 20 Jul 2026 10:50:53 +0800 Subject: [PATCH 22/64] Speed up DSW dependency setup --- docs/egoscale_staged_training.md | 6 +++-- scripts/setup_aliyun_dsw_env.sh | 45 +++++++++++++++++++++++++------- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/docs/egoscale_staged_training.md b/docs/egoscale_staged_training.md index eaf1e62..1ed0930 100644 --- a/docs/egoscale_staged_training.md +++ b/docs/egoscale_staged_training.md @@ -118,8 +118,10 @@ bash scripts/run_egoscale_stage.sh modelscope:1.31.0-pytorch2.8.0-gpu-py311-cu124-ubuntu22.04 ``` -项目会在独立 `.venv` 中按 `uv.lock` 安装 JAX 0.5.3、Torch 2.7.1 和 TensorFlow CPU 2.15; -官方镜像提供兼容的 Ubuntu、Python 3.11、CUDA 12 和驱动基础。不要在 DSW 内升级 NVIDIA driver。 +项目会在实例本地 `${HOME}/.cache/atom0/venvs/Atom-0-py311` 中按 `uv.lock` 安装 +JAX 0.5.3、Torch 2.7.1 和 TensorFlow CPU 2.15,并在仓库创建 `.venv` 软链接;这样可避免 +向 NAS 写入大量 Python 小文件。安装默认使用阿里云 PyPI 且只加入训练所需的 `rlds` group; +需要开发工具时设置 `INSTALL_DEV=1`。不要在 DSW 内升级 NVIDIA driver。 上传代码后执行: diff --git a/scripts/setup_aliyun_dsw_env.sh b/scripts/setup_aliyun_dsw_env.sh index fdc6dd3..490fdb9 100755 --- a/scripts/setup_aliyun_dsw_env.sh +++ b/scripts/setup_aliyun_dsw_env.sh @@ -4,6 +4,10 @@ set -euo pipefail REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "${REPO_DIR}" export PATH="${HOME}/.local/bin:${PATH}" +export UV_DEFAULT_INDEX="${UV_DEFAULT_INDEX:-https://mirrors.aliyun.com/pypi/simple}" +export UV_CACHE_DIR="${UV_CACHE_DIR:-${HOME}/.cache/uv}" +export UV_HTTP_TIMEOUT="${UV_HTTP_TIMEOUT:-600}" +export UV_LINK_MODE="${UV_LINK_MODE:-copy}" if ! command -v python3.11 >/dev/null 2>&1; then echo "Python 3.11 is required. Select a PAI image tagged py311." >&2 @@ -18,22 +22,45 @@ export GIT_LFS_SKIP_SMUDGE=1 # a lightweight rerun stub. Fresh Git clones do not contain this ignored directory; # uv requires every find-links path to exist even when it resolves rerun-sdk from PyPI. mkdir -p third_party/rerun-stub/dist + +# Keep the environment on the instance-local overlay. Installing hundreds of +# Python package files directly into the NAS-mounted repository is much slower. +VENV_DIR="${ATOM_VENV_DIR:-${HOME}/.cache/atom0/venvs/Atom-0-py311}" +export UV_PROJECT_ENVIRONMENT="${VENV_DIR}" +if [[ -d .venv && ! -L .venv && "$(realpath .venv)" != "$(realpath -m "${VENV_DIR}")" ]]; then + echo "Found a NAS-backed .venv directory at ${REPO_DIR}/.venv." >&2 + echo "Move it aside once (for example: mv .venv .venv.nfs-partial) and rerun." >&2 + exit 2 +fi +mkdir -p "$(dirname "${VENV_DIR}")" + if [[ "${UV_VENV_CLEAR:-0}" == "1" ]]; then - uv venv --clear --python 3.11 -elif [[ -x .venv/bin/python ]]; then - VENV_PYTHON_VERSION="$(.venv/bin/python -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')" + uv venv "${VENV_DIR}" --clear --python 3.11 +elif [[ -x "${VENV_DIR}/bin/python" ]]; then + VENV_PYTHON_VERSION="$("${VENV_DIR}/bin/python" -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')" if [[ "${VENV_PYTHON_VERSION}" != "3.11" ]]; then - echo ".venv uses Python ${VENV_PYTHON_VERSION}; rerun with UV_VENV_CLEAR=1" >&2 + echo "${VENV_DIR} uses Python ${VENV_PYTHON_VERSION}; rerun with UV_VENV_CLEAR=1" >&2 exit 1 fi - echo "Reusing existing Python ${VENV_PYTHON_VERSION} environment at ${REPO_DIR}/.venv" + echo "Reusing existing Python ${VENV_PYTHON_VERSION} environment at ${VENV_DIR}" else - uv venv --python 3.11 + uv venv "${VENV_DIR}" --python 3.11 +fi + +if [[ ! -e .venv && ! -L .venv ]]; then + ln -s "${VENV_DIR}" .venv +elif [[ -L .venv && "$(realpath -m .venv)" != "$(realpath -m "${VENV_DIR}")" ]]; then + echo ".venv points to $(readlink .venv), expected ${VENV_DIR}" >&2 + exit 1 +fi + +SYNC_ARGS=(--frozen --group rlds) +if [[ "${INSTALL_DEV:-0}" == "1" ]]; then + SYNC_ARGS+=(--group dev) fi -uv sync --frozen --group dev --group rlds -uv pip install -e . +uv sync "${SYNC_ARGS[@]}" -.venv/bin/python - <<'PY' +"${VENV_DIR}/bin/python" - <<'PY' import jax import tensorflow as tf import torch From 0580754729cc29566d0752ce1bf05364f9198545 Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 20 Jul 2026 10:59:57 +0800 Subject: [PATCH 23/64] Route locked DSW installs through Alibaba mirror --- scripts/setup_aliyun_dsw_env.sh | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/scripts/setup_aliyun_dsw_env.sh b/scripts/setup_aliyun_dsw_env.sh index 490fdb9..511b1f5 100755 --- a/scripts/setup_aliyun_dsw_env.sh +++ b/scripts/setup_aliyun_dsw_env.sh @@ -54,11 +54,22 @@ elif [[ -L .venv && "$(realpath -m .venv)" != "$(realpath -m "${VENV_DIR}")" ]]; exit 1 fi -SYNC_ARGS=(--frozen --group rlds) +EXPORT_ARGS=(--frozen --group rlds --no-hashes --no-emit-project) if [[ "${INSTALL_DEV:-0}" == "1" ]]; then - SYNC_ARGS+=(--group dev) + EXPORT_ARGS+=(--group dev) fi -uv sync "${SYNC_ARGS[@]}" + +# `uv sync --frozen` follows wheel URLs embedded in uv.lock, which point at the +# slow files.pythonhosted.org CDN even when UV_DEFAULT_INDEX is set. Exporting +# the same locked versions as named requirements lets uv fetch the identical +# releases from the Alibaba mirror without rewriting uv.lock. +REQUIREMENTS_FILE="${UV_CACHE_DIR}/atom0-locked-requirements.txt" +uv export "${EXPORT_ARGS[@]}" --output-file "${REQUIREMENTS_FILE}" +uv pip install \ + --python "${VENV_DIR}/bin/python" \ + --default-index "${UV_DEFAULT_INDEX}" \ + --requirements "${REQUIREMENTS_FILE}" +uv pip install --python "${VENV_DIR}/bin/python" --no-deps --editable . "${VENV_DIR}/bin/python" - <<'PY' import jax From 340018105d3697b1c3acd140e2e337e987366509 Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 20 Jul 2026 11:35:07 +0800 Subject: [PATCH 24/64] Add low-memory params-only checkpoints --- docs/egoscale_staged_training.md | 9 +++++--- scripts/run_egoscale_stage.sh | 7 +++++++ scripts/train_cotrain.py | 8 +++++++- src/openpi/cotrain/config.py | 7 +++++++ src/openpi/training/checkpoints.py | 11 +++++++++- tests/training/checkpoints_test.py | 33 ++++++++++++++++++++++++++++++ 6 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 tests/training/checkpoints_test.py diff --git a/docs/egoscale_staged_training.md b/docs/egoscale_staged_training.md index 1ed0930..b70625a 100644 --- a/docs/egoscale_staged_training.md +++ b/docs/egoscale_staged_training.md @@ -130,9 +130,12 @@ bash scripts/setup_aliyun_dsw_env.sh ``` 当前 DSW 已实测为 2×L20Y 80GB、128GB RAM、128GB `/dev/shm`,适合用 -`FSDP_DEVICES=2 BATCH_SIZE=2` 做 smoke。全参数大规模训练仍建议使用 8×80GB GPU、至少 -512GB 主机内存。当前 NAS 挂载点是 `/mnt/workspace`;DLC 若使用不同挂载点,只需同步修改 -`ATOM_RLDS_ROOT` 和 checkpoint 环境变量。 +`FSDP_DEVICES=2 BATCH_SIZE=2` 做计算和数据链路 smoke。该配置保存完整 Adam 训练状态时会在 +Orbax 的 GPU-to-host 回传阶段超过 128GB 主机内存,因此 DSW smoke 应设置 +`CHECKPOINT_PARAMS_ONLY=1`。此模式仍生成可用于推理和下一阶段初始化的 `/params` 以及 +norm assets,但不包含优化器状态,不能用于 `RESUME=1`。全参数大规模训练仍建议使用 8×80GB +GPU、至少 512GB 主机内存,并保持默认的完整 checkpoint。当前 NAS 挂载点是 +`/mnt/workspace`;DLC 若使用不同挂载点,只需同步修改 `ATOM_RLDS_ROOT` 和 checkpoint 环境变量。 DLC 使用与 DSW 相同的镜像或把验证后的 DSW 环境制作成同地域 ACR 自定义镜像。DLC 的 `WORLD_SIZE/RANK` 是节点级变量,当前 JAX 入口每个节点只启动一个 Python 进程: diff --git a/scripts/run_egoscale_stage.sh b/scripts/run_egoscale_stage.sh index e71562a..d9bc1e6 100755 --- a/scripts/run_egoscale_stage.sh +++ b/scripts/run_egoscale_stage.sh @@ -84,6 +84,13 @@ if [[ "${WANDB_ENABLED:-0}" == "0" ]]; then else : "${WANDB_API_KEY:?Set WANDB_API_KEY when WANDB_ENABLED=1}" fi +if [[ "${CHECKPOINT_PARAMS_ONLY:-0}" == "1" ]]; then + if [[ "${RESUME}" == "1" ]]; then + echo "CHECKPOINT_PARAMS_ONLY=1 cannot be combined with RESUME=1" >&2 + exit 2 + fi + TRAIN_ARGS+=(--checkpoint-params-only) +fi if [[ "${RUN_ACTION_MSE:-0}" == "0" ]]; then TRAIN_ARGS+=(--no-run-action-mse --no-viz-action-traj --val-flow-loss-mode fixed_seed) fi diff --git a/scripts/train_cotrain.py b/scripts/train_cotrain.py index 46c607f..a0fe91a 100644 --- a/scripts/train_cotrain.py +++ b/scripts/train_cotrain.py @@ -482,7 +482,13 @@ def _run_eval(step: int): _run_eval(step) if (step % config.save_interval == 0 and step > start_step) or step == config.num_train_steps - 1: - _checkpoints.save_state(checkpoint_manager, train_state, data_loader, step) + _checkpoints.save_state( + checkpoint_manager, + train_state, + data_loader, + step, + params_only=config.checkpoint_params_only, + ) logging.info("Waiting for checkpoint manager to finish") checkpoint_manager.wait_until_finished() diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 7530f1b..839c30d 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -151,6 +151,13 @@ class CotrainTrainConfig(_config.TrainConfig): # as their corresponding Ego-only/full-all baseline. norm_stats_assets_name: str | None = None + # Save only inference/stage-transfer params and normalization assets. This + # avoids materializing the much larger Adam optimizer state in host memory + # while writing a checkpoint, which is useful for low-memory DSW smoke + # tests. Params-only checkpoints intentionally cannot resume training; + # production jobs should keep the default full-state checkpoints. + checkpoint_params_only: bool = False + # How often (in steps) to run validation. eval_interval: int = 1000 # Independent global validation batch size. None preserves the legacy behavior of diff --git a/src/openpi/training/checkpoints.py b/src/openpi/training/checkpoints.py index f32a831..722691e 100644 --- a/src/openpi/training/checkpoints.py +++ b/src/openpi/training/checkpoints.py @@ -67,6 +67,8 @@ def save_state( state: training_utils.TrainState, data_loader: _data_loader.DataLoader, step: int, + *, + params_only: bool = False, ): def save_assets(directory: epath.Path): # Save the normalization stats. @@ -80,9 +82,16 @@ def save_assets(directory: epath.Path): train_state, params = _split_params(state) items = { "assets": save_assets, - "train_state": train_state, "params": {"params": params}, } + if params_only: + logging.warning( + "Saving a params-only checkpoint at step %d; it can be used for inference or stage transfer " + "but cannot resume optimizer state.", + step, + ) + else: + items["train_state"] = train_state checkpoint_manager.save(step, items) diff --git a/tests/training/checkpoints_test.py b/tests/training/checkpoints_test.py new file mode 100644 index 0000000..d068583 --- /dev/null +++ b/tests/training/checkpoints_test.py @@ -0,0 +1,33 @@ +from openpi.training import checkpoints + + +class _RecordingManager: + def __init__(self): + self.step = None + self.items = None + + def save(self, step, items): + self.step = step + self.items = items + + +def test_save_state_params_only_omits_train_state(monkeypatch) -> None: + manager = _RecordingManager() + monkeypatch.setattr(checkpoints, "_split_params", lambda state: ("optimizer-state", "model-params")) + + checkpoints.save_state(manager, object(), object(), 10, params_only=True) + + assert manager.step == 10 + assert set(manager.items) == {"assets", "params"} + assert manager.items["params"] == {"params": "model-params"} + + +def test_save_state_defaults_to_full_train_state(monkeypatch) -> None: + manager = _RecordingManager() + monkeypatch.setattr(checkpoints, "_split_params", lambda state: ("optimizer-state", "model-params")) + + checkpoints.save_state(manager, object(), object(), 20) + + assert manager.step == 20 + assert set(manager.items) == {"assets", "params", "train_state"} + assert manager.items["train_state"] == "optimizer-state" From d23f6e08e9d8564911ce1b3622eba1800dfadd40 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Tue, 21 Jul 2026 13:03:55 +0800 Subject: [PATCH 25/64] Add B200 9999 validation evaluation --- .../IMPLEMENTATION_PLAN.md | 17 + pi07_validation_eva_b200_9999/README_CN.md | 57 ++ .../config/eval_defaults.env | 21 + .../scripts/evaluate_validation.py | 906 ++++++++++++++++++ .../scripts/run_validation.sh | 26 + .../tests/test_static_mapping.py | 32 + 6 files changed, 1059 insertions(+) create mode 100644 pi07_validation_eva_b200_9999/IMPLEMENTATION_PLAN.md create mode 100644 pi07_validation_eva_b200_9999/README_CN.md create mode 100644 pi07_validation_eva_b200_9999/config/eval_defaults.env create mode 100644 pi07_validation_eva_b200_9999/scripts/evaluate_validation.py create mode 100644 pi07_validation_eva_b200_9999/scripts/run_validation.sh create mode 100644 pi07_validation_eva_b200_9999/tests/test_static_mapping.py diff --git a/pi07_validation_eva_b200_9999/IMPLEMENTATION_PLAN.md b/pi07_validation_eva_b200_9999/IMPLEMENTATION_PLAN.md new file mode 100644 index 0000000..448eb98 --- /dev/null +++ b/pi07_validation_eva_b200_9999/IMPLEMENTATION_PLAN.md @@ -0,0 +1,17 @@ +# B200 9999 Validation Version + +本目录目标是保存当前 Piper 使用的 B200 real-only 9999 离线测评代码,便于和 GitHub 标准目录结构对齐。 + +已包含: + +- `config/eval_defaults.env`: B200/9999 默认路径与参数。 +- `scripts/evaluate_validation.py`: Piper 当前 80D 适配版离线测评脚本。 +- `scripts/run_validation.sh`: 标准入口脚本。 +- `README_CN.md`: 使用说明。 + +主要实现要求: + +- 支持 80D unified action space。 +- 支持 14D Piper action/state 和 80D model action 的双向映射。 +- 支持 `cotrain_real_only` / `piper30` / B200 9999 checkpoint。 +- 不导入或调用真机硬件、CAN、相机控制代码。 diff --git a/pi07_validation_eva_b200_9999/README_CN.md b/pi07_validation_eva_b200_9999/README_CN.md new file mode 100644 index 0000000..3bb45e7 --- /dev/null +++ b/pi07_validation_eva_b200_9999/README_CN.md @@ -0,0 +1,57 @@ +# B200 real-only 9999 Piper 离线测评脚本 + +这个目录保存 Piper 当前使用的 B200 `cotrain_real_only_b200_v1/9999` 离线测评版本。 + +## 关键点 + +- 模型动作空间是 80D unified action space。 +- Piper 数据集原始 action/state 是 14D。 +- 脚本不会把 `80D[:14]` 当成 Piper action。 +- Piper 14D 映射到 80D 槽位为: + +```text +left_joint_1..6 -> 80D[0:6] +left_gripper -> 80D[16] +right_joint_1..6 -> 80D[29:35] +right_gripper -> 80D[45] +``` + +## 默认路径 + +默认路径写在: + +```bash +config/eval_defaults.env +``` + +这些默认路径面向 Piper 电脑: + +```bash +/home/ps/Documents/zhengdongchen/b200_cotrain_real_only_9999 +``` + +## 运行 + +在 Piper 上: + +```bash +bash /home/ps/Documents/zhengdongchen/pi07_validation_eva_b200_9999/scripts/run_validation.sh --validate-only +``` + +最小 smoke: + +```bash +EPISODES=1 \ +ANCHORS_PER_EPISODE=1 \ +ACTIONS_PER_INFERENCE=8 \ +NATIVE_VAL_LOSS_SAMPLES=0 \ +SPLIT=seen_test \ +DEVICE=cuda \ +bash /home/ps/Documents/zhengdongchen/pi07_validation_eva_b200_9999/scripts/run_validation.sh +``` + +全量 seen/unseen 需要注意内存占用,建议使用 GPU,并且不要和真机 server 同时占用显存。 + +## 说明 + +这个目录不是原始 `pi07_validation_eva` 的通用 H800 多 checkpoint 工程,而是当前 B200/9999 的专用版本。 diff --git a/pi07_validation_eva_b200_9999/config/eval_defaults.env b/pi07_validation_eva_b200_9999/config/eval_defaults.env new file mode 100644 index 0000000..d84fc08 --- /dev/null +++ b/pi07_validation_eva_b200_9999/config/eval_defaults.env @@ -0,0 +1,21 @@ +# B200 cotrain_real_only 9999 validation defaults. +# These paths are for the Piper machine. Override them when running elsewhere. + +: "${BASE_DIR:=/home/ps/Documents/zhengdongchen/b200_cotrain_real_only_9999}" +: "${OPENPI_ROOT:=${BASE_DIR}}" +: "${CHECKPOINT_DIR:=${BASE_DIR}/checkpoints/cotrain_real_only/cotrain_real_only_b200_v1/9999}" +: "${NORM_STATS_PATH:=${BASE_DIR}/assets/cotrain_real_only/piper30/norm_stats.json}" +: "${DATASET_DIR:=/home/ps/Documents/zhengdongchen/pi07_seen_test_eval/dataset/realworld_piper_infidata/1.0.0}" +: "${RESULT_ROOT:=${BASE_DIR}/results}" +: "${PYTHON_BIN:=/home/ps/Documents/zhengdongchen/pi07_seen_test_eval/envs/openpi_eval/bin/python3.11}" + +: "${CONFIG_NAME:=cotrain_real_only}" +: "${SPLIT:=seen_test}" +: "${EPISODES:=1}" +: "${ANCHORS_PER_EPISODE:=1}" +: "${STRIDE:=1}" +: "${ACTIONS_PER_INFERENCE:=8}" +: "${NATIVE_VAL_LOSS_SAMPLES:=0}" +: "${SEED:=0}" +: "${NUM_SAMPLES:=1}" +: "${DEVICE:=cuda}" diff --git a/pi07_validation_eva_b200_9999/scripts/evaluate_validation.py b/pi07_validation_eva_b200_9999/scripts/evaluate_validation.py new file mode 100644 index 0000000..5f66a89 --- /dev/null +++ b/pi07_validation_eva_b200_9999/scripts/evaluate_validation.py @@ -0,0 +1,906 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import csv +import dataclasses +import importlib.util +import json +import math +import os +from pathlib import Path +import sys +from typing import Any + + +CONFIG_NAME_DEFAULT = "cotrain_all_2ep" +DATASET_ID = "piper30" +PIPER_ACTION_DIM = 14 +UNIFIED_ACTION_DIM = 80 +LEFT_JOINT_DIMS = tuple(range(0, 6)) +LEFT_GRIPPER_DIM = 6 +RIGHT_JOINT_DIMS = tuple(range(7, 13)) +RIGHT_GRIPPER_DIM = 13 +JOINT_DELTA_DIMS = LEFT_JOINT_DIMS + RIGHT_JOINT_DIMS +GRIPPER_DIMS = (LEFT_GRIPPER_DIM, RIGHT_GRIPPER_DIM) +UNIFIED_LEFT_JOINT_DIMS = tuple(range(0, 6)) +UNIFIED_LEFT_GRIPPER_DIM = 16 +UNIFIED_RIGHT_JOINT_DIMS = tuple(range(29, 35)) +UNIFIED_RIGHT_GRIPPER_DIM = 45 +UNIFIED_PIPER_DIMS = ( + UNIFIED_LEFT_JOINT_DIMS + + (UNIFIED_LEFT_GRIPPER_DIM,) + + UNIFIED_RIGHT_JOINT_DIMS + + (UNIFIED_RIGHT_GRIPPER_DIM,) +) +UNIFIED_JOINT_DELTA_DIMS = UNIFIED_LEFT_JOINT_DIMS + UNIFIED_RIGHT_JOINT_DIMS + + +SOURCE_EVIDENCE = { + "config_piper30": "src/openpi/cotrain/config.py:194-210", + "config_alias": "src/openpi/cotrain/config.py:256-264", + "standardized_inputs": "src/openpi/cotrain/transforms.py:48-85", + "dispatch_delta": "src/openpi/cotrain/transforms.py:101-119", + "dispatch_normalize": "src/openpi/cotrain/transforms.py:122-147", + "raw_dataset_mapping": "src/openpi/cotrain/rlds_dataset.py:229-257", + "action_chunking": "src/openpi/cotrain/rlds_dataset.py:413-425,461-466", + "delta_relative_to_anchor": "src/openpi/transforms.py:567-583", + "mask_semantics": "src/openpi/transforms.py:852-871", + "policy_restore_and_transforms": "src/openpi/policies/policy_config.py:17-99", + "policy_infer": "src/openpi/policies/policy.py:70-104", + "sampler_random_noise": "src/openpi/models/pi0.py:379-442", + "native_validation_eval": "src/openpi/cotrain/eval.py:37-40,75-92,97-108", + "action_state_note": "docs/cotrain_技术文档.md:97-103", +} + + + + +def piper14_from_action(values, name: str = "action"): + import numpy as np + + arr = np.asarray(values, dtype=np.float32) + if arr.shape[-1] == PIPER_ACTION_DIM: + return arr.astype(np.float32, copy=False) + if arr.shape[-1] == UNIFIED_ACTION_DIM: + return arr[..., np.asarray(UNIFIED_PIPER_DIMS)].astype(np.float32, copy=True) + raise ValueError(f"{name} last dim must be 14 or 80, got shape {arr.shape}") + + +def piper_state_to_unified(state): + import numpy as np + + piper = np.asarray(state, dtype=np.float32) + if piper.shape != (PIPER_ACTION_DIM,): + raise ValueError(f"Expected Piper state shape (14,), got {piper.shape}") + unified = np.zeros((UNIFIED_ACTION_DIM,), dtype=np.float32) + unified[np.asarray(UNIFIED_PIPER_DIMS)] = piper + return unified + + +def piper_actions_to_unified(actions): + import numpy as np + + piper = np.asarray(actions, dtype=np.float32) + if piper.shape[-1] != PIPER_ACTION_DIM: + raise ValueError(f"Expected Piper actions last dim 14, got {piper.shape}") + unified = np.zeros((*piper.shape[:-1], UNIFIED_ACTION_DIM), dtype=np.float32) + unified[..., np.asarray(UNIFIED_PIPER_DIMS)] = piper + return unified + + +def state_for_policy(state, policy_state_dim: int): + import numpy as np + + piper = piper14_from_action(state, "state") + if piper.shape != (PIPER_ACTION_DIM,): + raise ValueError(f"Expected one Piper state vector, got {piper.shape}") + if policy_state_dim == UNIFIED_ACTION_DIM: + return piper_state_to_unified(piper) + if policy_state_dim == PIPER_ACTION_DIM: + return piper.astype(np.float32, copy=True) + raise ValueError(f"Unsupported policy state dim {policy_state_dim}; expected 14 or 80") + + +def env_path(name: str) -> Path | None: + value = os.environ.get(name) + return Path(value).expanduser() if value else None + + +def env_int(name: str, default: int) -> int: + value = os.environ.get(name) + return int(value) if value else default + + +def parse_args(argv: list[str] | None = None) -> argparse.Namespace: + openpi_root = env_path("OPENPI_ROOT") + checkpoint_dir = env_path("CHECKPOINT_DIR") + norm_stats_path = env_path("NORM_STATS_PATH") + dataset_dir = env_path("DATASET_DIR") + + parser = argparse.ArgumentParser( + description="Offline Piper JAX/Orbax validation trajectory evaluator for prepared TFDS data." + ) + parser.add_argument("--openpi-root", type=Path, default=openpi_root, required=openpi_root is None) + parser.add_argument("--checkpoint-dir", type=Path, default=checkpoint_dir, required=checkpoint_dir is None) + parser.add_argument("--norm-stats-path", type=Path, default=norm_stats_path, required=norm_stats_path is None) + parser.add_argument("--dataset-dir", type=Path, default=dataset_dir, required=dataset_dir is None) + parser.add_argument("--config-name", default=os.environ.get("CONFIG_NAME", CONFIG_NAME_DEFAULT)) + parser.add_argument("--split", choices=("seen_test", "unseen_test"), default=os.environ.get("SPLIT", "seen_test")) + parser.add_argument("--episodes", type=int, default=env_int("EPISODES", 1)) + parser.add_argument("--anchors-per-episode", type=int, default=env_int("ANCHORS_PER_EPISODE", 1)) + parser.add_argument("--stride", type=int, default=env_int("STRIDE", 1)) + parser.add_argument("--actions-per-inference", type=int, default=env_int("ACTIONS_PER_INFERENCE", 1)) + parser.add_argument("--seed", type=int, default=env_int("SEED", 0)) + parser.add_argument("--num-samples", type=int, default=env_int("NUM_SAMPLES", 1)) + parser.add_argument("--device", choices=("cpu", "cuda"), default=os.environ.get("DEVICE", "cuda")) + parser.add_argument("--output-json", type=Path, default=env_path("OUTPUT_JSON")) + parser.add_argument("--output-csv", type=Path, default=env_path("OUTPUT_CSV")) + parser.add_argument("--task-filter", default=os.environ.get("TASK_FILTER")) + parser.add_argument("--validate-only", action="store_true") + parser.add_argument("--metadata-only", action="store_true") + parser.add_argument( + "--native-val-loss-samples", + type=int, + default=env_int("NATIVE_VAL_LOSS_SAMPLES", 1), + help="Number of flow-loss noise samples per evaluated anchor; 0 disables this diagnostic.", + ) + return parser.parse_args(argv) + + +def configure_device(device: str) -> None: + if device == "cpu": + os.environ.setdefault("JAX_PLATFORMS", "cpu") + os.environ.setdefault("CUDA_VISIBLE_DEVICES", "") + else: + os.environ.setdefault("JAX_PLATFORMS", "cuda,cpu") + os.environ.setdefault("TF_CPP_MIN_LOG_LEVEL", "2") + + +def resolve_required_paths(args: argparse.Namespace) -> None: + args.openpi_root = args.openpi_root.expanduser().resolve() + args.checkpoint_dir = args.checkpoint_dir.expanduser().resolve() + args.norm_stats_path = args.norm_stats_path.expanduser().resolve() + args.dataset_dir = args.dataset_dir.expanduser().resolve() + if args.output_json is not None: + args.output_json = args.output_json.expanduser().resolve() + if args.output_csv is not None: + args.output_csv = args.output_csv.expanduser().resolve() + + +def add_openpi_path(openpi_root: Path) -> None: + package_dir = openpi_root / "src/openpi" + if not package_dir.is_dir(): + raise FileNotFoundError(f"Missing OpenPI package directory: {package_dir}") + src_dir = str((openpi_root / "src").resolve()) + if src_dir not in sys.path: + sys.path.insert(0, src_dir) + + +def require_positive_args(args: argparse.Namespace) -> None: + for name in ("episodes", "anchors_per_episode", "stride", "actions_per_inference", "num_samples"): + value = getattr(args, name) + if value < 1: + raise ValueError(f"--{name.replace('_', '-')} must be >= 1") + if args.native_val_loss_samples < 0: + raise ValueError("--native-val-loss-samples must be >= 0") + + +def import_status() -> dict[str, bool]: + return { + "jax": importlib.util.find_spec("jax") is not None, + "flax": importlib.util.find_spec("flax") is not None, + "orbax.checkpoint": importlib.util.find_spec("orbax.checkpoint") is not None, + "tensorflow": importlib.util.find_spec("tensorflow") is not None, + "tensorflow_datasets": importlib.util.find_spec("tensorflow_datasets") is not None, + } + + +def require_modules(names: tuple[str, ...]) -> None: + missing = [name for name in names if importlib.util.find_spec(name) is None] + if missing: + raise ModuleNotFoundError("Missing required Python modules: " + ", ".join(missing)) + + +def require_file(path: Path, label: str) -> None: + if not path.is_file(): + raise FileNotFoundError(f"Missing {label}: {path}") + + +def require_dir(path: Path, label: str) -> None: + if not path.is_dir(): + raise FileNotFoundError(f"Missing {label}: {path}") + + +def require_static_files(args: argparse.Namespace) -> dict[str, bool]: + layout = { + "openpi_package": (args.openpi_root / "src/openpi").is_dir(), + "checkpoint_params": (args.checkpoint_dir / "params").is_dir(), + "checkpoint_params_manifest": (args.checkpoint_dir / "params/manifest.ocdbt").is_file(), + "dataset_info": (args.dataset_dir / "dataset_info.json").is_file(), + "features": (args.dataset_dir / "features.json").is_file(), + "norm_stats": args.norm_stats_path.is_file(), + } + missing = [name for name, ok in layout.items() if not ok] + if missing: + raise FileNotFoundError(f"Missing required offline files: {missing}") + return layout + + +def tfds_metadata(dataset_dir: Path) -> dict[str, Any]: + require_modules(("tensorflow", "tensorflow_datasets")) + import tensorflow as tf + import tensorflow_datasets as tfds + + try: + tf.config.set_visible_devices([], "GPU") + except Exception: + pass + + builder = tfds.builder_from_directory(builder_dir=str(dataset_dir)) + splits = {} + for split_name, split_info in builder.info.splits.items(): + splits[split_name] = int(split_info.num_examples) + return { + "dataset_dir": str(dataset_dir), + "name": builder.info.name, + "version": str(builder.info.version), + "splits": splits, + "feature_schema": str(builder.info.features), + } + + +def infer_assets_base_dir(norm_stats_path: Path, config_name: str) -> Path: + # Expected H800 layout: //piper30/norm_stats.json. + if ( + norm_stats_path.name == "norm_stats.json" + and norm_stats_path.parent.name == DATASET_ID + and norm_stats_path.parent.parent.name == config_name + ): + return norm_stats_path.parent.parent.parent.resolve() + return norm_stats_path.parent.parent.parent.resolve() + + +def load_config_and_norm_stats(args: argparse.Namespace): + add_openpi_path(args.openpi_root) + from openpi.cotrain import config as cotrain_config + from openpi.shared import normalize + + train_config = cotrain_config.get_config(args.config_name) + train_config = dataclasses.replace( + train_config, + assets_base_dir=str(infer_assets_base_dir(args.norm_stats_path, args.config_name)), + ) + norm_stats = normalize.deserialize_json(args.norm_stats_path.read_text()) + return train_config, norm_stats + + +def config_summary(train_config) -> dict[str, Any]: + datasets = [] + for ds in train_config.data.datasets: + datasets.append( + { + "uid": ds.uid, + "name": ds.name, + "version": ds.version, + "restructure_name": ds.restructure_name, + "action_dim": ds.action_dim, + "delta_action_mask_dims": ds.delta_action_mask_dims, + "train_split": ds.train_split, + "val_splits": dict(ds.val_splits), + } + ) + return { + "name": train_config.name, + "model_action_dim": train_config.model.action_dim, + "model_action_horizon": train_config.model.action_horizon, + "model_type": str(train_config.model.model_type), + "assets_base_dir": str(train_config.assets_base_dir), + "assets_dirs": str(train_config.assets_dirs), + "datasets": datasets, + } + + +def validate_static(args: argparse.Namespace) -> dict[str, Any]: + require_positive_args(args) + layout = require_static_files(args) + train_config, norm_stats = load_config_and_norm_stats(args) + stats_summary = { + key: { + "mean_shape": list(value.mean.shape), + "std_shape": list(value.std.shape), + "has_quantiles": value.q01 is not None and value.q99 is not None, + } + for key, value in norm_stats.items() + } + return { + "paths": resolved_path_summary(args), + "file_layout": layout, + "dependency_import_status": import_status(), + "tfds_metadata": tfds_metadata(args.dataset_dir), + "config": config_summary(train_config), + "norm_stats": stats_summary, + "source_evidence": SOURCE_EVIDENCE, + } + + +def create_policy(args: argparse.Namespace, train_config, norm_stats): + from openpi.policies import policy_config + + return policy_config.create_trained_policy( + train_config, + args.checkpoint_dir, + default_prompt="", + norm_stats=norm_stats, + ) + + +def decode_text(value: Any) -> str: + item = value + try: + import numpy as np + + arr = np.asarray(value) + item = arr.reshape(-1)[0] if arr.ndim > 0 else arr.item() + except Exception: + pass + if isinstance(item, bytes): + return item.decode("utf-8") + return str(item) + + +def maybe_decode_image(value: Any): + import numpy as np + + arr = np.asarray(value) + if arr.dtype.kind in {"S", "O"}: + import tensorflow as tf + + raw = arr.item() if arr.ndim == 0 else arr.reshape(-1)[0] + if isinstance(raw, str): + raw = raw.encode("utf-8") + return tf.io.decode_image(raw, expand_animations=False, dtype=tf.uint8).numpy() + return arr + + +def get_nested(tree: dict[str, Any], *keys: str) -> Any: + cur: Any = tree + for key in keys: + if not isinstance(cur, dict) or key not in cur: + raise KeyError("Missing dataset key: " + "/".join(keys)) + cur = cur[key] + return cur + + +def step_from_columnar(steps: dict[str, Any], index: int) -> dict[str, Any]: + out = {} + for key, value in steps.items(): + if isinstance(value, dict): + out[key] = step_from_columnar(value, index) + else: + out[key] = value[index] + return out + + +def iter_episode_steps(raw_episode: dict[str, Any]): + steps = raw_episode.get("steps", raw_episode) + if isinstance(steps, dict): + first_value = next(iter(steps.values())) + while isinstance(first_value, dict): + first_value = next(iter(first_value.values())) + for i in range(len(first_value)): + yield step_from_columnar(steps, i) + return + + if hasattr(steps, "as_numpy_iterator"): + import tensorflow_datasets as tfds + + for step in tfds.as_numpy(steps): + yield step + return + + for step in steps: + yield step + + +def read_validation_episodes(args: argparse.Namespace): + require_modules(("tensorflow", "tensorflow_datasets")) + import tensorflow as tf + import tensorflow_datasets as tfds + + try: + tf.config.set_visible_devices([], "GPU") + except Exception: + pass + + builder = tfds.builder_from_directory(builder_dir=str(args.dataset_dir)) + dataset = builder.as_dataset(split=args.split, shuffle_files=False) + yielded = 0 + for raw_episode in tfds.as_numpy(dataset): + steps = list(iter_episode_steps(raw_episode)) + if not steps: + continue + task = decode_text(get_nested(steps[0], "task")) + if args.task_filter and args.task_filter not in task: + continue + yielded += 1 + yield normalize_episode(steps, yielded - 1, task) + if yielded >= args.episodes: + break + + +def normalize_episode(steps: list[dict[str, Any]], episode_index: int, task: str) -> dict[str, Any]: + import numpy as np + + states, actions, prompts = [], [], [] + images = {"cam_high": [], "cam_left_wrist": [], "cam_right_wrist": []} + for step in steps: + states.append(np.asarray(get_nested(step, "observation", "state"), dtype=np.float32)) + actions.append(np.asarray(get_nested(step, "action"), dtype=np.float32)) + prompts.append(decode_text(step.get("task", task))) + image_dict = get_nested(step, "observation", "images") + for key in images: + images[key].append(maybe_decode_image(image_dict[key])) + return { + "episode_index": episode_index, + "task": task, + "states": np.stack(states).astype(np.float32), + "actions": np.stack(actions).astype(np.float32), + "prompts": prompts, + "images": images, + } + + +def anchor_indices(num_steps: int, stride: int, limit: int) -> list[int]: + return list(range(0, num_steps, stride))[:limit] + + +def target_action_chunk(actions, anchor_index: int, horizon: int): + import numpy as np + + indices = np.minimum(np.arange(anchor_index, anchor_index + horizon), len(actions) - 1) + return piper14_from_action(actions[indices], "target actions") + + +def standardized_policy_observation( + episode: dict[str, Any], + anchor_index: int, + policy_state_dim: int, +) -> dict[str, Any]: + import numpy as np + + return { + "state": state_for_policy(episode["states"][anchor_index], policy_state_dim), + "image": { + "base_0_rgb": episode["images"]["cam_high"][anchor_index], + "left_wrist_0_rgb": episode["images"]["cam_left_wrist"][anchor_index], + "right_wrist_0_rgb": episode["images"]["cam_right_wrist"][anchor_index], + }, + "image_mask": { + "base_0_rgb": np.asarray(True), + "left_wrist_0_rgb": np.asarray(True), + "right_wrist_0_rgb": np.asarray(True), + }, + "prompt": episode["prompts"][anchor_index], + } + + +def standardized_training_sample( + episode: dict[str, Any], + anchor_index: int, + horizon: int, + policy_state_dim: int, +) -> dict[str, Any]: + import numpy as np + + sample = standardized_policy_observation(episode, anchor_index, policy_state_dim) + native_actions = target_action_chunk(episode["actions"], anchor_index, horizon) + if policy_state_dim == UNIFIED_ACTION_DIM: + sample["actions"] = piper_actions_to_unified(native_actions) + action_mask = np.zeros((UNIFIED_ACTION_DIM,), dtype=bool) + action_mask[np.asarray(UNIFIED_PIPER_DIMS)] = True + sample["action_mask"] = action_mask + else: + sample["actions"] = native_actions + sample["dataset_id"] = DATASET_ID + return sample + + +def native_to_absolute_actions(native_actions, current_state, actions_per_inference: int): + import numpy as np + + actions = np.asarray(native_actions, dtype=np.float32) + state = np.asarray(current_state, dtype=np.float32) + if state.shape != (PIPER_ACTION_DIM,): + raise ValueError(f"Expected state shape (14,), got {state.shape}") + if actions.ndim != 2: + raise ValueError(f"Expected native action chunk shape (H, D), got {actions.shape}") + if actions_per_inference > actions.shape[0]: + raise ValueError( + f"--actions-per-inference ({actions_per_inference}) exceeds model horizon ({actions.shape[0]})" + ) + if actions.shape[-1] >= UNIFIED_ACTION_DIM: + unified_state = piper_state_to_unified(state) + absolute_unified = actions[:actions_per_inference, :UNIFIED_ACTION_DIM].astype(np.float32, copy=True) + absolute_unified[:, np.asarray(UNIFIED_JOINT_DELTA_DIMS)] += unified_state[np.asarray(UNIFIED_JOINT_DELTA_DIMS)] + return piper14_from_action(absolute_unified, "absolute_unified") + if actions.shape[-1] >= PIPER_ACTION_DIM: + absolute = actions[:actions_per_inference, :PIPER_ACTION_DIM].astype(np.float32, copy=True) + absolute[:, np.asarray(JOINT_DELTA_DIMS)] += state[np.asarray(JOINT_DELTA_DIMS)] + return absolute + raise ValueError(f"Expected native action chunk last dim >=14 or >=80, got {actions.shape}") + + +def metric_dict(pred_absolute, target_absolute, current_state) -> dict[str, Any]: + import numpy as np + + pred = piper14_from_action(pred_absolute, "pred") + target = piper14_from_action(target_absolute, "target") + state = np.asarray(current_state, dtype=np.float32) + err = pred - target + abs_err = np.abs(err) + pred_joint_move = pred[:, JOINT_DELTA_DIMS] - state[list(JOINT_DELTA_DIMS)] + target_joint_move = target[:, JOINT_DELTA_DIMS] - state[list(JOINT_DELTA_DIMS)] + valid_direction = np.abs(target_joint_move) > 1e-8 + direction_match = ( + float(np.mean(np.sign(pred_joint_move[valid_direction]) == np.sign(target_joint_move[valid_direction]))) + if np.any(valid_direction) + else float("nan") + ) + return { + "inference_mae": float(np.mean(abs_err)), + "inference_mse": float(np.mean(err**2)), + "left_joints_mae": float(np.mean(abs_err[:, LEFT_JOINT_DIMS])), + "left_gripper_mae": float(np.mean(abs_err[:, LEFT_GRIPPER_DIM])), + "right_joints_mae": float(np.mean(abs_err[:, RIGHT_JOINT_DIMS])), + "right_gripper_mae": float(np.mean(abs_err[:, RIGHT_GRIPPER_DIM])), + "per_dimension_mae": np.mean(abs_err, axis=0).astype(float).tolist(), + "max_absolute_error": float(np.max(abs_err)), + "direction_match": direction_match, + "finite": { + "state": bool(np.isfinite(state).all()), + "prediction": bool(np.isfinite(pred).all()), + "target": bool(np.isfinite(target).all()), + "error": bool(np.isfinite(err).all()), + }, + } + + +def summarize_metric_dicts(items: list[dict[str, Any]]) -> dict[str, Any]: + import numpy as np + + if not items: + return {} + scalar_keys = [ + "inference_mae", + "inference_mse", + "left_joints_mae", + "left_gripper_mae", + "right_joints_mae", + "right_gripper_mae", + "max_absolute_error", + "direction_match", + ] + out: dict[str, Any] = {"count": len(items)} + for key in scalar_keys: + out[key] = float(np.nanmean(np.asarray([x[key] for x in items], dtype=np.float64))) + out["per_dimension_mae"] = np.nanmean( + np.asarray([x["per_dimension_mae"] for x in items], dtype=np.float64), axis=0 + ).tolist() + out["finite"] = { + "state": bool(all(x["finite"]["state"] for x in items)), + "prediction": bool(all(x["finite"]["prediction"] for x in items)), + "target": bool(all(x["finite"]["target"] for x in items)), + "error": bool(all(x["finite"]["error"] for x in items)), + } + return out + + +def sample_summary(samples: list[dict[str, Any]]) -> dict[str, Any]: + import numpy as np + + metrics = [s["metrics"] for s in samples] + best_index = int(np.nanargmin([m["inference_mae"] for m in metrics])) + mean_metrics = summarize_metric_dicts(metrics) + median_metrics = { + key: float(np.nanmedian([m[key] for m in metrics])) + for key in ( + "inference_mae", + "inference_mse", + "left_joints_mae", + "left_gripper_mae", + "right_joints_mae", + "right_gripper_mae", + "max_absolute_error", + "direction_match", + ) + } + median_metrics["per_dimension_mae"] = np.nanmedian( + np.asarray([m["per_dimension_mae"] for m in metrics], dtype=np.float64), axis=0 + ).tolist() + median_metrics["finite"] = mean_metrics["finite"] + return { + "anchor": samples[0]["metrics"], + "mean": mean_metrics, + "median": median_metrics, + "best_of_n": { + "sample_index": best_index, + "diagnostic_only": True, + **metrics[best_index], + }, + } + + +def sample_noise(seed: int, anchor_ordinal: int, sample_index: int, action_horizon: int, action_dim: int): + import numpy as np + + rng = np.random.default_rng(seed + anchor_ordinal * 1009 + sample_index * 9176) + return rng.standard_normal((action_horizon, action_dim), dtype=np.float32) + + +def infer_one_sample(policy, obs: dict[str, Any], noise): + return policy.infer(obs, noise=noise) + + +def compute_native_validation_loss( + policy, train_config, episode: dict[str, Any], anchor_index: int, seed: int, num_samples: int +) -> dict[str, Any]: + if num_samples <= 0: + return {"available": False, "reason": "disabled"} + try: + import jax + import jax.numpy as jnp + + from openpi import transforms as openpi_transforms + from openpi.cotrain import eval as cotrain_eval + from openpi.models import model as openpi_model + except Exception as exc: + return {"available": False, "reason": f"import_failed: {type(exc).__name__}: {exc}"} + + try: + data_config = train_config.data.create(train_config.assets_dirs, train_config.model) + sample = standardized_training_sample( + episode, + anchor_index, + train_config.model.action_horizon, + train_config.model.action_dim, + ) + transform = openpi_transforms.compose( + [*data_config.data_transforms.inputs, *data_config.model_transforms.inputs] + ) + transformed = transform(sample) + batch = jax.tree.map(lambda x: jnp.asarray(x)[None, ...], transformed) + observation = openpi_model.Observation.from_dict(batch) + actions = batch["actions"] + rng = jax.random.key(seed) + fixed = float(jax.device_get(cotrain_eval._flow_loss(policy._model, rng, observation, actions))) + values = [] + for i in range(num_samples): + sub_rng = jax.random.fold_in(rng, i) + values.append(float(jax.device_get(cotrain_eval._flow_loss(policy._model, sub_rng, observation, actions)))) + return { + "available": True, + "definition": "openpi.cotrain.eval._flow_loss", + "fixed": fixed, + "multi_sample_mean": float(sum(values) / len(values)), + "num_samples": num_samples, + } + except Exception as exc: + return {"available": False, "reason": f"{type(exc).__name__}: {exc}"} + + +def resolved_path_summary(args: argparse.Namespace) -> dict[str, str | None]: + return { + "openpi_root": str(args.openpi_root), + "checkpoint_dir": str(args.checkpoint_dir), + "norm_stats_path": str(args.norm_stats_path), + "dataset_dir": str(args.dataset_dir), + "output_json": str(args.output_json) if args.output_json else None, + "output_csv": str(args.output_csv) if args.output_csv else None, + } + + +def evaluate(args: argparse.Namespace, train_config, norm_stats) -> dict[str, Any]: + import numpy as np + + metadata = tfds_metadata(args.dataset_dir) + if args.split not in metadata["splits"]: + raise ValueError(f"Requested split {args.split!r} not present in dataset: {sorted(metadata['splits'])}") + + policy = create_policy(args, train_config, norm_stats) + if args.actions_per_inference > train_config.model.action_horizon: + raise ValueError( + f"--actions-per-inference ({args.actions_per_inference}) exceeds model horizon " + f"({train_config.model.action_horizon})" + ) + + records: list[dict[str, Any]] = [] + anchor_metrics: list[dict[str, Any]] = [] + episode_metrics: dict[str, list[dict[str, Any]]] = {} + task_metrics: dict[str, list[dict[str, Any]]] = {} + anchor_ordinal = 0 + + for episode in read_validation_episodes(args): + episode_key = str(episode["episode_index"]) + for anchor_index in anchor_indices(len(episode["states"]), args.stride, args.anchors_per_episode): + state = piper14_from_action(episode["states"][anchor_index], "state") + obs = standardized_policy_observation(episode, anchor_index, train_config.model.action_dim) + target = target_action_chunk(episode["actions"], anchor_index, args.actions_per_inference) + samples = [] + for sample_index in range(args.num_samples): + noise = sample_noise( + args.seed, + anchor_ordinal, + sample_index, + train_config.model.action_horizon, + train_config.model.action_dim, + ) + result = infer_one_sample(policy, obs, noise) + native = piper14_from_action( + np.asarray(result["actions"], dtype=np.float32)[: args.actions_per_inference], + "native prediction", + ) + pred_absolute = native_to_absolute_actions(result["actions"], state, args.actions_per_inference) + samples.append( + { + "sample_index": sample_index, + "native_prediction": native, + "absolute_prediction": pred_absolute, + "absolute_error": np.abs(pred_absolute - target), + "metrics": metric_dict(pred_absolute, target, state), + } + ) + summary = sample_summary(samples) + native_loss = compute_native_validation_loss( + policy, train_config, episode, anchor_index, args.seed + anchor_ordinal, args.native_val_loss_samples + ) + record = { + "task": episode["task"], + "episode": episode["episode_index"], + "anchor": anchor_index, + "frame": anchor_index, + "state": state, + "target_absolute_action": target, + "samples": samples, + "sample_summary": summary, + } + if native_loss.get("available"): + record["native_validation_loss"] = native_loss + else: + record["native_validation_loss_unavailable"] = native_loss + record["training_loss_note"] = ( + "Inference MAE/MSE are open-loop inference metrics and are not the training validation loss." + ) + records.append(record) + anchor_metrics.append(summary["anchor"]) + episode_metrics.setdefault(episode_key, []).append(summary["anchor"]) + task_metrics.setdefault(episode["task"], []).append(summary["anchor"]) + anchor_ordinal += 1 + + if not records: + raise RuntimeError("No validation anchors evaluated. Check split, episode count, and task filter.") + + return { + "run": { + "paths": resolved_path_summary(args), + "config_name": args.config_name, + "split": args.split, + "episodes": args.episodes, + "anchors_per_episode": args.anchors_per_episode, + "stride": args.stride, + "actions_per_inference": args.actions_per_inference, + "seed": args.seed, + "num_samples": args.num_samples, + "best_of_n_note": "best_of_n is diagnostic only and does not represent single deployment performance.", + }, + "source_evidence": SOURCE_EVIDENCE, + "tfds_metadata": metadata, + "config": config_summary(train_config), + "records": records, + "summaries": { + "split": summarize_metric_dicts(anchor_metrics), + "episodes": {key: summarize_metric_dicts(value) for key, value in episode_metrics.items()}, + "tasks": {key: summarize_metric_dicts(value) for key, value in task_metrics.items()}, + }, + } + + +def to_jsonable(value: Any) -> Any: + import numpy as np + + if isinstance(value, np.ndarray): + return value.tolist() + if isinstance(value, np.generic): + return value.item() + if isinstance(value, dict): + return {str(k): to_jsonable(v) for k, v in value.items()} + if isinstance(value, (list, tuple)): + return [to_jsonable(v) for v in value] + if isinstance(value, float) and (math.isnan(value) or math.isinf(value)): + return None + return value + + +def write_json(path: Path, data: dict[str, Any]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(to_jsonable(data), indent=2, ensure_ascii=False), encoding="utf-8") + + +def write_csv(path: Path, records: list[dict[str, Any]]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + fieldnames = [ + "task", + "episode", + "anchor", + "frame", + "sample_index", + "inference_mae", + "inference_mse", + "left_joints_mae", + "left_gripper_mae", + "right_joints_mae", + "right_gripper_mae", + "max_absolute_error", + "direction_match", + ] + with path.open("w", newline="", encoding="utf-8") as f: + writer = csv.DictWriter(f, fieldnames=fieldnames) + writer.writeheader() + for record in records: + for sample in record["samples"]: + metrics = sample["metrics"] + writer.writerow( + { + "task": record["task"], + "episode": record["episode"], + "anchor": record["anchor"], + "frame": record["frame"], + "sample_index": sample["sample_index"], + **{key: metrics[key] for key in fieldnames[5:]}, + } + ) + + +def print_json(data: dict[str, Any]) -> None: + print(json.dumps(to_jsonable(data), indent=2, ensure_ascii=False)) + + +def main(argv: list[str] | None = None) -> int: + args = parse_args(argv) + configure_device(args.device) + try: + resolve_required_paths(args) + require_positive_args(args) + if args.metadata_only: + require_file(args.dataset_dir / "dataset_info.json", "dataset_info.json") + require_file(args.dataset_dir / "features.json", "features.json") + print_json( + { + "metadata_only": True, + "paths": resolved_path_summary(args), + "dependency_import_status": import_status(), + "tfds_metadata": tfds_metadata(args.dataset_dir), + } + ) + return 0 + + static = validate_static(args) + if args.validate_only: + print_json({"validate_only": True, **static}) + return 0 + + train_config, norm_stats = load_config_and_norm_stats(args) + result = evaluate(args, train_config, norm_stats) + if args.output_json: + write_json(args.output_json, result) + if args.output_csv: + write_csv(args.output_csv, result["records"]) + print_json(result) + return 0 + except Exception as exc: + print(f"ERROR: {type(exc).__name__}: {exc}", file=sys.stderr) + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/pi07_validation_eva_b200_9999/scripts/run_validation.sh b/pi07_validation_eva_b200_9999/scripts/run_validation.sh new file mode 100644 index 0000000..8314875 --- /dev/null +++ b/pi07_validation_eva_b200_9999/scripts/run_validation.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) +DEFAULTS="${ROOT_DIR}/config/eval_defaults.env" +if [[ -f "${DEFAULTS}" ]]; then + set -a + source "${DEFAULTS}" + set +a +fi + +mkdir -p "${RESULT_ROOT}" + +if [[ "${1:-}" == "--validate-only" ]]; then + exec "${PYTHON_BIN}" "${ROOT_DIR}/scripts/evaluate_validation.py" --validate-only +fi + +if [[ "${1:-}" == "--metadata-only" ]]; then + exec "${PYTHON_BIN}" "${ROOT_DIR}/scripts/evaluate_validation.py" --metadata-only +fi + +OUTPUT_JSON="${OUTPUT_JSON:-${RESULT_ROOT}/b200_9999_${SPLIT}_e${EPISODES}_a${ANCHORS_PER_EPISODE}.json}" +OUTPUT_CSV="${OUTPUT_CSV:-${RESULT_ROOT}/b200_9999_${SPLIT}_e${EPISODES}_a${ANCHORS_PER_EPISODE}.csv}" +export OUTPUT_JSON OUTPUT_CSV + +exec "${PYTHON_BIN}" "${ROOT_DIR}/scripts/evaluate_validation.py" "$@" diff --git a/pi07_validation_eva_b200_9999/tests/test_static_mapping.py b/pi07_validation_eva_b200_9999/tests/test_static_mapping.py new file mode 100644 index 0000000..360e74d --- /dev/null +++ b/pi07_validation_eva_b200_9999/tests/test_static_mapping.py @@ -0,0 +1,32 @@ +from pathlib import Path +import sys + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "scripts")) + +import evaluate_validation as ev + + +def test_piper_14d_to_unified_80d_slots(): + assert ev.UNIFIED_ACTION_DIM == 80 + assert ev.UNIFIED_PIPER_DIMS == ( + 0, + 1, + 2, + 3, + 4, + 5, + 16, + 29, + 30, + 31, + 32, + 33, + 34, + 45, + ) + + +def test_piper_joint_delta_dims_are_arm_joints_only(): + assert ev.JOINT_DELTA_DIMS == (0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12) + assert ev.GRIPPER_DIMS == (6, 13) From e61cf18db658cdeee195234b450cad6b045c754c Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Tue, 21 Jul 2026 14:58:45 +0800 Subject: [PATCH 26/64] fix evaluation --- pi07_validation_eva_b200_9999/README_CN.md | 30 +++++- .../scripts/evaluate_validation.py | 67 ++++++++++--- .../tests/test_static_mapping.py | 95 +++++++++++++++++++ 3 files changed, 180 insertions(+), 12 deletions(-) diff --git a/pi07_validation_eva_b200_9999/README_CN.md b/pi07_validation_eva_b200_9999/README_CN.md index 3bb45e7..0ffebd0 100644 --- a/pi07_validation_eva_b200_9999/README_CN.md +++ b/pi07_validation_eva_b200_9999/README_CN.md @@ -7,6 +7,9 @@ - 模型动作空间是 80D unified action space。 - Piper 数据集原始 action/state 是 14D。 - 脚本不会把 `80D[:14]` 当成 Piper action。 +- 推理输入携带与训练一致的 80D Piper `action_mask`。 +- 推理 prompt 携带与训练一致的 `Action Mode: joint. ` 前缀。 +- `piper30` norm stats 在推理路径中只应用一次。 - Piper 14D 映射到 80D 槽位为: ```text @@ -50,7 +53,32 @@ DEVICE=cuda \ bash /home/ps/Documents/zhengdongchen/pi07_validation_eva_b200_9999/scripts/run_validation.sh ``` -全量 seen/unseen 需要注意内存占用,建议使用 GPU,并且不要和真机 server 同时占用显存。 +`EPISODES=0` 表示评估完整 split。正式评估时,anchor 会均匀覆盖每条轨迹,而不是只取轨迹开头。 +建议 seen/unseen 分别运行,例如: + +```bash +EPISODES=0 \ +ANCHORS_PER_EPISODE=20 \ +STRIDE=1 \ +ACTIONS_PER_INFERENCE=8 \ +NATIVE_VAL_LOSS_SAMPLES=0 \ +NUM_SAMPLES=1 \ +SPLIT=seen_test \ +DEVICE=cuda \ +bash /home/ps/Documents/zhengdongchen/pi07_validation_eva_b200_9999/scripts/run_validation.sh + +EPISODES=0 \ +ANCHORS_PER_EPISODE=20 \ +STRIDE=1 \ +ACTIONS_PER_INFERENCE=8 \ +NATIVE_VAL_LOSS_SAMPLES=0 \ +NUM_SAMPLES=1 \ +SPLIT=unseen_test \ +DEVICE=cuda \ +bash /home/ps/Documents/zhengdongchen/pi07_validation_eva_b200_9999/scripts/run_validation.sh +``` + +全量 seen/unseen 需要注意运行时间和内存占用,建议使用 GPU,并且不要和真机 server 同时占用显存。 ## 说明 diff --git a/pi07_validation_eva_b200_9999/scripts/evaluate_validation.py b/pi07_validation_eva_b200_9999/scripts/evaluate_validation.py index 5f66a89..b91542e 100644 --- a/pi07_validation_eva_b200_9999/scripts/evaluate_validation.py +++ b/pi07_validation_eva_b200_9999/scripts/evaluate_validation.py @@ -13,8 +13,9 @@ from typing import Any -CONFIG_NAME_DEFAULT = "cotrain_all_2ep" +CONFIG_NAME_DEFAULT = "cotrain_real_only" DATASET_ID = "piper30" +PROMPT_PREFIX = "Action Mode: joint. " PIPER_ACTION_DIM = 14 UNIFIED_ACTION_DIM = 80 LEFT_JOINT_DIMS = tuple(range(0, 6)) @@ -89,6 +90,18 @@ def piper_actions_to_unified(actions): return unified +def action_mask_for_policy(policy_action_dim: int): + import numpy as np + + if policy_action_dim == UNIFIED_ACTION_DIM: + mask = np.zeros((UNIFIED_ACTION_DIM,), dtype=bool) + mask[np.asarray(UNIFIED_PIPER_DIMS)] = True + return mask + if policy_action_dim == PIPER_ACTION_DIM: + return np.ones((PIPER_ACTION_DIM,), dtype=bool) + raise ValueError(f"Unsupported policy action dim {policy_action_dim}; expected 14 or 80") + + def state_for_policy(state, policy_state_dim: int): import numpy as np @@ -127,8 +140,18 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace: parser.add_argument("--dataset-dir", type=Path, default=dataset_dir, required=dataset_dir is None) parser.add_argument("--config-name", default=os.environ.get("CONFIG_NAME", CONFIG_NAME_DEFAULT)) parser.add_argument("--split", choices=("seen_test", "unseen_test"), default=os.environ.get("SPLIT", "seen_test")) - parser.add_argument("--episodes", type=int, default=env_int("EPISODES", 1)) - parser.add_argument("--anchors-per-episode", type=int, default=env_int("ANCHORS_PER_EPISODE", 1)) + parser.add_argument( + "--episodes", + type=int, + default=env_int("EPISODES", 1), + help="Number of episodes to evaluate; 0 evaluates the complete split.", + ) + parser.add_argument( + "--anchors-per-episode", + type=int, + default=env_int("ANCHORS_PER_EPISODE", 1), + help="Maximum uniformly spaced anchors per episode.", + ) parser.add_argument("--stride", type=int, default=env_int("STRIDE", 1)) parser.add_argument("--actions-per-inference", type=int, default=env_int("ACTIONS_PER_INFERENCE", 1)) parser.add_argument("--seed", type=int, default=env_int("SEED", 0)) @@ -178,7 +201,9 @@ def add_openpi_path(openpi_root: Path) -> None: def require_positive_args(args: argparse.Namespace) -> None: - for name in ("episodes", "anchors_per_episode", "stride", "actions_per_inference", "num_samples"): + if args.episodes < 0: + raise ValueError("--episodes must be >= 0 (0 means the complete split)") + for name in ("anchors_per_episode", "stride", "actions_per_inference", "num_samples"): value = getattr(args, name) if value < 1: raise ValueError(f"--{name.replace('_', '-')} must be >= 1") @@ -425,7 +450,7 @@ def read_validation_episodes(args: argparse.Namespace): continue yielded += 1 yield normalize_episode(steps, yielded - 1, task) - if yielded >= args.episodes: + if args.episodes > 0 and yielded >= args.episodes: break @@ -452,7 +477,19 @@ def normalize_episode(steps: list[dict[str, Any]], episode_index: int, task: str def anchor_indices(num_steps: int, stride: int, limit: int) -> list[int]: - return list(range(0, num_steps, stride))[:limit] + import numpy as np + + if num_steps <= 0 or limit <= 0: + return [] + if stride <= 0: + raise ValueError("stride must be positive") + candidates = np.arange(0, num_steps, stride, dtype=np.int64) + if len(candidates) <= limit: + return candidates.astype(int).tolist() + if limit == 1: + return [int(candidates[len(candidates) // 2])] + positions = np.rint(np.linspace(0, len(candidates) - 1, num=limit)).astype(np.int64) + return candidates[positions].astype(int).tolist() def target_action_chunk(actions, anchor_index: int, horizon: int): @@ -471,6 +508,10 @@ def standardized_policy_observation( return { "state": state_for_policy(episode["states"][anchor_index], policy_state_dim), + # Training and built-in validation always carry the per-sample Piper mask. Without + # it, Pi0.sample_actions treats all 80 slots as active and injects random noise into + # the 66 slots that Piper never trains. + "action_mask": action_mask_for_policy(policy_state_dim), "image": { "base_0_rgb": episode["images"]["cam_high"][anchor_index], "left_wrist_0_rgb": episode["images"]["cam_left_wrist"][anchor_index], @@ -482,6 +523,7 @@ def standardized_policy_observation( "right_wrist_0_rgb": np.asarray(True), }, "prompt": episode["prompts"][anchor_index], + "prompt_prefix": PROMPT_PREFIX, } @@ -491,15 +533,10 @@ def standardized_training_sample( horizon: int, policy_state_dim: int, ) -> dict[str, Any]: - import numpy as np - sample = standardized_policy_observation(episode, anchor_index, policy_state_dim) native_actions = target_action_chunk(episode["actions"], anchor_index, horizon) if policy_state_dim == UNIFIED_ACTION_DIM: sample["actions"] = piper_actions_to_unified(native_actions) - action_mask = np.zeros((UNIFIED_ACTION_DIM,), dtype=bool) - action_mask[np.asarray(UNIFIED_PIPER_DIMS)] = True - sample["action_mask"] = action_mask else: sample["actions"] = native_actions sample["dataset_id"] = DATASET_ID @@ -791,6 +828,14 @@ def evaluate(args: argparse.Namespace, train_config, norm_stats) -> dict[str, An "actions_per_inference": args.actions_per_inference, "seed": args.seed, "num_samples": args.num_samples, + "inference_contract": { + "dataset_id": DATASET_ID, + "prompt_prefix": PROMPT_PREFIX, + "policy_action_dim": train_config.model.action_dim, + "active_action_slots": list(UNIFIED_PIPER_DIMS), + "normalization": "piper30 stats exactly once", + "output": "gather unified Piper slots, then add current state to arm-joint deltas only", + }, "best_of_n_note": "best_of_n is diagnostic only and does not represent single deployment performance.", }, "source_evidence": SOURCE_EVIDENCE, diff --git a/pi07_validation_eva_b200_9999/tests/test_static_mapping.py b/pi07_validation_eva_b200_9999/tests/test_static_mapping.py index 360e74d..51123b5 100644 --- a/pi07_validation_eva_b200_9999/tests/test_static_mapping.py +++ b/pi07_validation_eva_b200_9999/tests/test_static_mapping.py @@ -1,6 +1,8 @@ from pathlib import Path import sys +import numpy as np + ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT / "scripts")) @@ -30,3 +32,96 @@ def test_piper_14d_to_unified_80d_slots(): def test_piper_joint_delta_dims_are_arm_joints_only(): assert ev.JOINT_DELTA_DIMS == (0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12) assert ev.GRIPPER_DIMS == (6, 13) + + +def test_eval_mapping_matches_training_registry(): + from openpi.cotrain import action_space + + spec = action_space.UNIFIED_ACTION_SPECS["piper30"] + assert tuple(target for _, target in spec.action_mapping) == ev.UNIFIED_PIPER_DIMS + assert tuple(np.flatnonzero(spec.action_mask)) == ev.UNIFIED_PIPER_DIMS + + +def _episode_fixture(): + states = np.arange(28, dtype=np.float32).reshape(2, 14) + return { + "states": states, + "actions": states + 10, + "prompts": ["pick the cube", "pick the cube"], + "images": { + "cam_high": [np.zeros((2, 2, 3), dtype=np.uint8)] * 2, + "cam_left_wrist": [np.zeros((2, 2, 3), dtype=np.uint8)] * 2, + "cam_right_wrist": [np.zeros((2, 2, 3), dtype=np.uint8)] * 2, + }, + } + + +def test_policy_observation_matches_piper_training_contract(): + obs = ev.standardized_policy_observation(_episode_fixture(), 0, ev.UNIFIED_ACTION_DIM) + + assert obs["state"].shape == (80,) + np.testing.assert_array_equal(obs["state"][list(ev.UNIFIED_PIPER_DIMS)], np.arange(14, dtype=np.float32)) + assert obs["action_mask"].dtype == np.bool_ + assert tuple(np.flatnonzero(obs["action_mask"])) == ev.UNIFIED_PIPER_DIMS + assert obs["prompt"] == "pick the cube" + assert obs["prompt_prefix"] == "Action Mode: joint. " + # The policy receives explicit piper30 norm stats. Keeping dataset_id out of inference + # avoids DispatchNormalize followed by the generic policy Normalize a second time. + assert "dataset_id" not in obs + + +def test_policy_state_is_normalized_exactly_once_like_training(): + from openpi import transforms + from openpi.cotrain import action_space + from openpi.cotrain import transforms as cotrain_transforms + from openpi.models import model + from openpi.shared import normalize + + repo_root = ROOT.parent + norm_stats = normalize.deserialize_json( + (repo_root / "assets/cotrain_real_only/piper30/norm_stats.json").read_text() + ) + spec = action_space.UNIFIED_ACTION_SPECS["piper30"] + training_inputs = [ + cotrain_transforms.StandardizedInputs(model_type=model.ModelType.PI05), + cotrain_transforms.DispatchDeltaActions(masks_by_dataset={"piper30": spec.delta_mask}), + cotrain_transforms.DispatchNormalize( + norm_stats_by_dataset={"piper30": norm_stats}, + use_quantiles=True, + ), + ] + + episode = _episode_fixture() + training_sample = ev.standardized_training_sample(episode, 0, horizon=1, policy_state_dim=80) + training_pre_model = transforms.compose(training_inputs)(training_sample) + + policy_obs = ev.standardized_policy_observation(episode, 0, policy_state_dim=80) + policy_pre_model = transforms.compose( + [ + *training_inputs, + transforms.Normalize(norm_stats, use_quantiles=True), + ] + )(policy_obs) + + np.testing.assert_allclose(policy_pre_model["state"], training_pre_model["state"]) + np.testing.assert_array_equal(policy_pre_model["action_mask"], training_pre_model["action_mask"]) + assert policy_pre_model["prompt"] == training_pre_model["prompt"] + assert policy_pre_model["prompt_prefix"] == training_pre_model["prompt_prefix"] + + +def test_unified_prediction_restores_native_absolute_piper_action(): + state = np.arange(14, dtype=np.float32) + native = np.arange(14, dtype=np.float32) / 10 + unified = ev.piper_actions_to_unified(native[None, :]) + + restored = ev.native_to_absolute_actions(unified, state, actions_per_inference=1)[0] + expected = native.copy() + expected[list(ev.JOINT_DELTA_DIMS)] += state[list(ev.JOINT_DELTA_DIMS)] + np.testing.assert_allclose(restored, expected) + np.testing.assert_allclose(restored[list(ev.GRIPPER_DIMS)], native[list(ev.GRIPPER_DIMS)]) + + +def test_anchor_indices_uniformly_cover_episode_instead_of_only_prefix(): + assert ev.anchor_indices(num_steps=101, stride=1, limit=5) == [0, 25, 50, 75, 100] + assert ev.anchor_indices(num_steps=101, stride=2, limit=3) == [0, 50, 100] + assert ev.anchor_indices(num_steps=100, stride=1, limit=1) == [50] From 2d8825820e87e7f490d15818d72eec5063e7809e Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Tue, 21 Jul 2026 17:00:16 +0800 Subject: [PATCH 27/64] Add legacy32 real-only action-space ablation --- ...55\347\273\203\346\214\207\345\215\227.md" | 62 +++++++++ scripts/preflight_cotrain_baige.py | 39 ++++-- scripts/train_cotrain_baige.sh | 11 +- src/openpi/cotrain/config.py | 130 ++++++++++++++++-- tests/cotrain/test_unified_config.py | 47 ++++++- 5 files changed, 261 insertions(+), 28 deletions(-) diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index 721e642..d1c1bae 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -76,6 +76,68 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py ``` +## 对比实验:相同真机数据,Legacy 32D 动作空间(4 卡) + +该配置只回退动作空间,其他训练条件与上面的 `cotrain_real_only_b200_v1` 保持一致: + +| 超参数 | 值 | +| --- | ---: | +| 配置 | `cotrain_real_only_legacy32` | +| 数据集及权重 | 与 `cotrain_real_only` 相同:`piper30 + piper2` | +| 动作空间 | Piper native 14D 位于 32D `[0:14]`,其余维补零 | +| 学习率 | peak `1e-6`,decay `1e-7` | +| 节点 × GPU | 1 × 4 B200 | +| FSDP devices | 4 | +| train global batch size | 256 | +| validation global batch size | 96 | +| samples / GPU | 64 | +| train steps | 20,000 | +| warmup / decay steps | 400 / 20,000 | +| eval / save interval | 2,000 / 4,000 | +| validation batches | 10 | +| action MSE | 开启 | + +`256 × 20,000 = 512 × 10,000 = 5,120,000`,因此该4卡实验与原8卡实验的总训练样本量一致;warmup、eval、save也按样本量等比例换算。 + +先做静态验收: + +```bash +cd /data/wudi/Atom-0 +source scripts/atom0_env.sh +.venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_only_legacy32 +``` + +建议先提交20步 smoke: + +```bash +cd /data/wudi/baige-cluster +export BOS_SOURCE=atom0-data/ +export BOS_MOUNT_PATH=/mnt/bos/bo23lu + +MODE=smoke CONFIG_NAME=cotrain_real_only_legacy32 \ +EXP_NAME=cotrain_real_only_legacy32_b200_4gpu_smoke \ +INSTANCES=1 GPU_PER_NODE=4 FSDP_DEVICES=4 BATCH_SIZE=256 VAL_BATCH_SIZE=96 \ +SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=0 \ +.venv/bin/python atom0_train_job.py +``` + +正式训练: + +```bash +cd /data/wudi/baige-cluster +export BOS_SOURCE=atom0-data/ +export BOS_MOUNT_PATH=/mnt/bos/bo23lu + +MODE=train CONFIG_NAME=cotrain_real_only_legacy32 \ +EXP_NAME=cotrain_real_only_legacy32_b200_4gpu_v1 \ +INSTANCES=1 GPU_PER_NODE=4 FSDP_DEVICES=4 BATCH_SIZE=256 VAL_BATCH_SIZE=96 \ +NUM_TRAIN_STEPS=20000 WARMUP_STEPS=400 DECAY_STEPS=20000 \ +EVAL_INTERVAL=2000 SAVE_INTERVAL=4000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ +.venv/bin/python atom0_train_job.py +``` + ## 正式训练 2:自采真机 + 开源 Robot(不含 EgoVerse) | 超参数 | 值 | diff --git a/scripts/preflight_cotrain_baige.py b/scripts/preflight_cotrain_baige.py index 7cb493b..e01385f 100755 --- a/scripts/preflight_cotrain_baige.py +++ b/scripts/preflight_cotrain_baige.py @@ -27,6 +27,7 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: assert "piper2" in ids expected_counts = { "cotrain_real_only": 2, + "cotrain_real_only_legacy32": 2, "cotrain_real_robot": 37, "cotrain_real_robot_fix": 34, "cotrain_full_all_full_norm": 39, @@ -48,30 +49,42 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: for dataset in datasets: builder_dir = Path(dataset.builder_dir) assert (builder_dir / "dataset_info.json").is_file(), builder_dir - directory = assets_base / config_name / dataset.uid + source_config = cfg.data.norm_stats_source_config or config_name + directory = assets_base / source_config / dataset.uid for filename in ("norm_stats.json", "norm_stats_meta.json", "unified_action_space.json"): assert (directory / filename).is_file(), directory / filename spec = action_space.UNIFIED_ACTION_SPECS[dataset.uid] action_space.validate_metadata(directory, spec) stats = normalize.load(directory) + if not cfg.data.unified_action_space: + stats = config.project_unified_norm_stats_to_native(stats, dataset.uid) meta = json.loads((directory / "norm_stats_meta.json").read_text()) assert Path(meta["builder_dir"]) == builder_dir, (dataset.uid, meta["builder_dir"], builder_dir) assert meta["num_frames"] > 0, dataset.uid total_frames += int(meta["num_frames"]) - state_mask = np.zeros(action_space.UNIFIED_ACTION_DIM, dtype=bool) - state_mask[list(spec.state_target_slots)] = True - for key, active in (("state", state_mask), ("actions", np.asarray(spec.action_mask, dtype=bool))): + if cfg.data.unified_action_space: + state_mask = np.zeros(action_space.UNIFIED_ACTION_DIM, dtype=bool) + state_mask[list(spec.state_target_slots)] = True + masks = (("state", state_mask), ("actions", np.asarray(spec.action_mask, dtype=bool))) + else: + masks = ( + ("state", np.ones(dataset.action_dim, dtype=bool)), + ("actions", np.ones(dataset.action_dim, dtype=bool)), + ) + for key, active in masks: value = stats[key] arrays = {field: np.asarray(getattr(value, field)) for field in ("mean", "std", "q01", "q99")} - assert all(array.shape == (action_space.UNIFIED_ACTION_DIM,) for array in arrays.values()) + expected_dim = action_space.UNIFIED_ACTION_DIM if cfg.data.unified_action_space else dataset.action_dim + assert all(array.shape == (expected_dim,) for array in arrays.values()) assert all(np.isfinite(array).all() for array in arrays.values()) inactive = ~active - assert np.allclose(arrays["mean"][inactive], 0) - assert np.allclose(arrays["std"][inactive], 1) - assert np.allclose(arrays["q01"][inactive], -1) - assert np.allclose(arrays["q99"][inactive], 1) + if inactive.any(): + assert np.allclose(arrays["mean"][inactive], 0) + assert np.allclose(arrays["std"][inactive], 1) + assert np.allclose(arrays["q01"][inactive], -1) + assert np.allclose(arrays["q99"][inactive], 1) bad = np.flatnonzero(active & (arrays["q99"] <= arrays["q01"])) if bad.size: degenerate.append(f"{dataset.uid}:{key}:{bad.tolist()}") @@ -85,7 +98,13 @@ def main() -> None: parser = argparse.ArgumentParser() parser.add_argument( "config", - choices=("cotrain_real_only", "cotrain_real_robot", "cotrain_real_robot_fix", "cotrain_full_all_full_norm"), + choices=( + "cotrain_real_only", + "cotrain_real_only_legacy32", + "cotrain_real_robot", + "cotrain_real_robot_fix", + "cotrain_full_all_full_norm", + ), ) parser.add_argument("--assets-base", type=Path, default=Path("assets")) parser.add_argument("--params-path", type=Path, default=Path(os.environ["PARAMS_PATH"])) diff --git a/scripts/train_cotrain_baige.sh b/scripts/train_cotrain_baige.sh index decb862..2ceea93 100755 --- a/scripts/train_cotrain_baige.sh +++ b/scripts/train_cotrain_baige.sh @@ -5,7 +5,7 @@ REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "${REPO_DIR}" source scripts/atom0_env.sh -CONFIG_NAME="${CONFIG_NAME:?Set CONFIG_NAME to cotrain_real_only or cotrain_real_robot_fix}" +CONFIG_NAME="${CONFIG_NAME:?Set CONFIG_NAME to cotrain_real_only, cotrain_real_only_legacy32, or cotrain_real_robot_fix}" EXP_NAME="${EXP_NAME:?Set EXP_NAME}" MODE="${MODE:-train}" # Keep 64 samples/GPU by default. WORLD_SIZE is the number of Baige nodes and @@ -13,7 +13,7 @@ MODE="${MODE:-train}" BATCH_SIZE="${BATCH_SIZE:-$((64 * ${WORLD_SIZE:-1} * ${NPROC_PER_NODE:-8}))}" case "${CONFIG_NAME}" in - cotrain_real_only) + cotrain_real_only|cotrain_real_only_legacy32) # One aggregate pass over the current piper30+piper2 norm metadata frames. TRAIN_SAMPLES="${TRAIN_SAMPLES:-2913191}" DEFAULT_STEPS=$(((TRAIN_SAMPLES + BATCH_SIZE - 1) / BATCH_SIZE)) @@ -58,6 +58,11 @@ RUN_ACTION_MSE="${RUN_ACTION_MSE:-${DEFAULT_ACTION_MSE}}" LOG_INTERVAL="${LOG_INTERVAL:-100}" CHECKPOINT_BASE_DIR="${CHECKPOINT_BASE_DIR:-${REPO_DIR}/checkpoints}" ASSETS_BASE_DIR="${ASSETS_BASE_DIR:-${REPO_DIR}/assets}" +ASSET_CONFIG_NAME="${CONFIG_NAME}" +if [[ "${CONFIG_NAME}" == "cotrain_real_only_legacy32" ]]; then + # Legacy32 projects the audited unified Piper stats back into native 14D order. + ASSET_CONFIG_NAME="cotrain_real_only" +fi RANK_ID="${RANK:-0}" if [[ "${MODE}" == "smoke" ]]; then @@ -88,7 +93,7 @@ fi test -f "${PARAMS_PATH}/_CHECKPOINT_METADATA" test -f "${PARAMS_PATH}/manifest.ocdbt" test -d "${RLDS_DATA_DIR}" -test -d "${ASSETS_BASE_DIR}/${CONFIG_NAME}" +test -d "${ASSETS_BASE_DIR}/${ASSET_CONFIG_NAME}" if [[ "${WANDB_ENABLED}" == "1" ]]; then : "${WANDB_API_KEY:?Set WANDB_API_KEY for production training}" diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 436e8f7..94f5bd1 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -12,6 +12,7 @@ import pathlib from typing import Literal +import numpy as np from typing_extensions import override import tyro @@ -26,10 +27,14 @@ import openpi.training.config as _config import openpi.training.droid_rlds_dataset as droid_rlds_dataset import openpi.training.optimizer as _optimizer +import openpi.training.weight_loaders as weight_loaders import openpi.transforms as _transforms logger = logging.getLogger(__name__) +LEGACY_ACTION_DIM = 32 +_LEGACY_REAL_ONLY_DATASET_IDS = frozenset({"piper30", "piper2"}) + def _resolve_unified_datasets(datasets, model_config: _model.BaseModelConfig): if model_config.action_dim != cotrain_action_space.UNIFIED_ACTION_DIM: @@ -50,7 +55,55 @@ def _resolve_unified_datasets(datasets, model_config: _model.BaseModelConfig): return tuple(resolved) -def load_per_dataset_norm_stats(assets_dirs: pathlib.Path, datasets) -> dict: +def _resolve_legacy32_datasets(datasets, model_config: _model.BaseModelConfig): + """Resolve the controlled Piper legacy baseline without unified slot remapping.""" + if model_config.action_dim != LEGACY_ACTION_DIM: + raise ValueError( + f"Legacy real-only co-training requires action_dim={LEGACY_ACTION_DIM}, got {model_config.action_dim}." + ) + dataset_ids = {ds.uid for ds in datasets} + if dataset_ids != _LEGACY_REAL_ONLY_DATASET_IDS: + raise ValueError( + f"Legacy32 is restricted to the controlled Piper30+Piper2 experiment; got datasets={sorted(dataset_ids)}." + ) + if any(ds.action_dim != 14 for ds in datasets): + raise ValueError("Legacy32 Piper datasets must both expose the native 14D action layout.") + return tuple(dataclasses.replace(ds, unified_action_spec=None) for ds in datasets) + + +def project_unified_norm_stats_to_native(loaded: dict, dataset_id: str) -> dict: + """Project audited 80D stats back into the source-native Piper dimension order.""" + spec = cotrain_action_space.UNIFIED_ACTION_SPECS[dataset_id] + mappings = {"state": spec.state_mapping, "actions": spec.action_mapping} + projected = dict(loaded) + for key, mapping in mappings.items(): + if key not in loaded: + continue + ordered = sorted(mapping) + sources = [source for source, _ in ordered] + if sources != list(range(len(sources))): + raise ValueError(f"Legacy32 projection for '{dataset_id}' requires contiguous native {key} dimensions.") + targets = np.asarray([target for _, target in ordered], dtype=np.int64) + stats = loaded[key] + + def take(value, indices=targets): + return None if value is None else np.asarray(value)[indices] + + projected[key] = _normalize.NormStats( + mean=take(stats.mean), + std=take(stats.std), + q01=take(stats.q01), + q99=take(stats.q99), + ) + return projected + + +def load_per_dataset_norm_stats( + assets_dirs: pathlib.Path, + datasets, + *, + project_unified_to_native: bool = False, +) -> dict: """Load per-dataset norm stats from `/` (skip if missing). Returns {dataset_name: {"state": NormStats, "actions": NormStats}} for the DispatchNormalize. @@ -61,14 +114,21 @@ def load_per_dataset_norm_stats(assets_dirs: pathlib.Path, datasets) -> dict: d = str(pathlib.Path(assets_dirs) / ds.uid) resolved = pathlib.Path(_download.maybe_download(d)) loaded = _normalize.load(resolved) - if ds.unified_action_spec is not None: - cotrain_action_space.validate_metadata(resolved, ds.unified_action_spec) + validation_spec = ( + cotrain_action_space.UNIFIED_ACTION_SPECS[ds.uid] + if project_unified_to_native + else ds.unified_action_spec + ) + if validation_spec is not None: + cotrain_action_space.validate_metadata(resolved, validation_spec) for key in ("state", "actions"): if key not in loaded or len(loaded[key].mean) != cotrain_action_space.UNIFIED_ACTION_DIM: raise ValueError( f"Unified norm stats for '{ds.uid}' key '{key}' must be " f"{cotrain_action_space.UNIFIED_ACTION_DIM}D." ) + if project_unified_to_native: + loaded = project_unified_norm_stats_to_native(loaded, ds.uid) stats[ds.uid] = loaded logger.info(f"Loaded per-dataset norm stats for '{ds.uid}' from {d}") except FileNotFoundError: @@ -91,12 +151,22 @@ class CotrainDataConfig(_config.DataConfigFactory): rlds_data_dir: str | None = None action_space: droid_rlds_dataset.DroidActionSpace | None = None datasets: tuple[CotrainRLDSDataset, ...] = () + # Production configs use the unified 80D registry. The only supported opt-out is the + # controlled Piper30+Piper2 legacy32 ablation. + unified_action_space: bool = True + # The legacy experiment reuses the audited unified stats and projects the active slots + # back to native Piper order, avoiding a second scan of the exact same source frames. + norm_stats_source_config: str | None = None @override def create(self, assets_dirs: pathlib.Path, model_config: _model.BaseModelConfig) -> _config.DataConfig: assert self.rlds_data_dir is not None, "Need to set rlds_data_dir for the co-training RLDS loader." assert len(self.datasets) > 0, "Need at least one dataset in `datasets`." - datasets = _resolve_unified_datasets(self.datasets, model_config) + datasets = ( + _resolve_unified_datasets(self.datasets, model_config) + if self.unified_action_space + else _resolve_legacy32_datasets(self.datasets, model_config) + ) if getattr(model_config, "ki_enabled", False): raise NotImplementedError("KI FAST-token supervision does not yet support per-dimension action masks.") @@ -105,12 +175,23 @@ def create(self, assets_dirs: pathlib.Path, model_config: _model.BaseModelConfig # Per-dataset absolute->delta action conversion (e.g. RoboMIND absolute joint). delta_masks = {} for ds in datasets: - delta_masks[ds.uid] = ds.unified_action_spec.delta_mask + delta_masks[ds.uid] = ( + ds.unified_action_spec.delta_mask + if ds.unified_action_spec is not None + else _transforms.make_bool_mask(*ds.delta_action_mask_dims) + ) dispatch_delta = cotrain_transforms.DispatchDeltaActions(masks_by_dataset=delta_masks) # Per-dataset normalization (dispatched at runtime by dataset_id). Quantile norm for # pi05 (use_quantile_norm is True for non-PI0 models in create_base_config). - per_dataset_stats = load_per_dataset_norm_stats(assets_dirs, datasets) + stats_assets_dirs = ( + assets_dirs.parent / self.norm_stats_source_config if self.norm_stats_source_config else assets_dirs + ) + per_dataset_stats = load_per_dataset_norm_stats( + stats_assets_dirs, + datasets, + project_unified_to_native=not self.unified_action_space, + ) dispatch_norm = cotrain_transforms.DispatchNormalize( norm_stats_by_dataset=per_dataset_stats, use_quantiles=base.use_quantile_norm, @@ -181,15 +262,15 @@ class CotrainTrainConfig(_config.TrainConfig): # --------------------------------------------------------------------------- # Config registry (separate from openpi's _CONFIGS; selected via this module's cli()). # --------------------------------------------------------------------------- -# Every config in this registry uses the fixed 80D state/action layout. pi05_base has a -# 32D projection/head, so checkpoint-start configs use the shape-safe loader and randomly -# initialize only parameters whose shapes changed. +# Production configs use the fixed 80D state/action layout. The explicitly named +# cotrain_real_only_legacy32 config is the only exception and exists solely as a controlled +# action-space ablation. pi05_base has a 32D projection/head, so unified checkpoint-start +# configs use the shape-safe loader while the legacy control loads the full matching head. _RLDS_ROOT = os.environ.get("RLDS_DATA_DIR", "/mnt/bos/bo23lu") _PIPER30_ROOT = ( - f"{_RLDS_ROOT}/realworld_piper/" - "piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist" + f"{_RLDS_ROOT}/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist" ) _PIPER30_BUILDER_DIR = f"{_PIPER30_ROOT}/realworld_piper_infidata/1.0.0" _PIPER30_TRAIN_EPISODES = 5_307 @@ -753,9 +834,7 @@ def _make_robomind_full_dataset( def _scale_dataset_weights(datasets: tuple[CotrainRLDSDataset, ...], train_episodes: int): - return tuple( - dataclasses.replace(ds, weight=ds.weight * train_episodes / _ALL_TRAIN_EPISODES) for ds in datasets - ) + return tuple(dataclasses.replace(ds, weight=ds.weight * train_episodes / _ALL_TRAIN_EPISODES) for ds in datasets) _FULL_ALL_EXCLUDED_DATASET_IDS = { @@ -847,6 +926,11 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): action_dim=cotrain_action_space.UNIFIED_ACTION_DIM, max_token_len=384, ) +_LEGACY32_PI05_MODEL = pi0_config.Pi0Config( + pi05=True, + action_dim=LEGACY_ACTION_DIM, + max_token_len=384, +) _PI05_BASE_SHAPE_SAFE_LOADER = cotrain_weight_loaders.ShapeSafeCheckpointWeightLoader( params_path="gs://openpi-assets/checkpoints/pi05_base/params", ) @@ -875,6 +959,23 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): exp_name=tyro.MISSING, ) +# Controlled action-space ablation: same Piper30+Piper2 mixture and optimizer recipe as +# cotrain_real_only, but retain the pre-unified pi0.5 layout (native Piper14 in slots 0:14, +# padded to the checkpoint-compatible 32D model width). Since the shapes match pi05_base, +# load the complete pretrained 32D action head instead of shape-skipping it. +_REAL_ONLY_LEGACY32_DATA = dataclasses.replace( + _REAL_ONLY_DATA, + unified_action_space=False, + norm_stats_source_config="cotrain_real_only", +) +_REAL_ONLY_LEGACY32_PI05 = dataclasses.replace( + _REAL_ONLY_PI05, + name="cotrain_real_only_legacy32", + model=_LEGACY32_PI05_MODEL, + data=_REAL_ONLY_LEGACY32_DATA, + weight_loader=weight_loaders.CheckpointWeightLoader("gs://openpi-assets/checkpoints/pi05_base/params"), +) + _REAL_ROBOT_PI05 = dataclasses.replace( _REAL_ONLY_PI05, name="cotrain_real_robot", @@ -895,6 +996,7 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): _COTRAIN_CONFIGS = [ _REAL_ONLY_PI05, + _REAL_ONLY_LEGACY32_PI05, _REAL_ROBOT_PI05, _REAL_ROBOT_FIX_PI05, _FULL_ALL_PI05_FULL_NORM, diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index 23e2534..e49b118 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -8,14 +8,17 @@ from openpi.cotrain.rlds_dataset import CotrainRLDSDataset -def test_all_registered_cotrain_configs_resolve_to_unified_80d() -> None: +def test_registered_cotrain_configs_include_controlled_legacy32_ablation() -> None: assert {train_config.name for train_config in config._COTRAIN_CONFIGS} == { "cotrain_real_only", + "cotrain_real_only_legacy32", "cotrain_real_robot", "cotrain_real_robot_fix", "cotrain_full_all_full_norm", } for train_config in config._COTRAIN_CONFIGS: + if train_config.name == "cotrain_real_only_legacy32": + continue assert train_config.model.action_dim == action_space.UNIFIED_ACTION_DIM datasets = config._resolve_unified_datasets(train_config.data.datasets, train_config.model) assert datasets @@ -54,6 +57,48 @@ def test_real_only_contains_both_in_house_piper_datasets() -> None: assert sum(dataset.weight for dataset in config._REAL_ONLY_DATA.datasets) == pytest.approx(1.0) +def test_legacy32_is_a_single_variable_action_space_ablation() -> None: + unified = config.get_config("cotrain_real_only") + legacy = config.get_config("cotrain_real_only_legacy32") + + assert legacy.model.action_dim == 32 + assert legacy.model.max_token_len == unified.model.max_token_len + assert legacy.data.datasets == unified.data.datasets + assert legacy.data.unified_action_space is False + assert legacy.data.norm_stats_source_config == "cotrain_real_only" + assert legacy.lr_schedule == unified.lr_schedule + assert legacy.optimizer == unified.optimizer + assert legacy.batch_size == unified.batch_size + assert legacy.num_train_steps == unified.num_train_steps + + resolved = config._resolve_legacy32_datasets(legacy.data.datasets, legacy.model) + assert {dataset.uid for dataset in resolved} == {"piper30", "piper2"} + assert all(dataset.unified_action_spec is None for dataset in resolved) + + +def test_legacy32_norm_projection_restores_native_piper_order() -> None: + legacy = config.get_config("cotrain_real_only_legacy32") + source_dir = legacy.assets_dirs.parent / legacy.data.norm_stats_source_config + datasets = config._resolve_legacy32_datasets(legacy.data.datasets, legacy.model) + projected = config.load_per_dataset_norm_stats( + source_dir, + datasets, + project_unified_to_native=True, + ) + + for dataset in datasets: + spec = action_space.UNIFIED_ACTION_SPECS[dataset.uid] + native_targets = [target for _, target in sorted(spec.action_mapping)] + unified = config.load_per_dataset_norm_stats( + source_dir, (dataclasses.replace(dataset, unified_action_spec=spec),) + ) + assert projected[dataset.uid]["state"].mean.shape == (14,) + assert projected[dataset.uid]["actions"].mean.shape == (14,) + assert projected[dataset.uid]["actions"].mean.tolist() == pytest.approx( + unified[dataset.uid]["actions"].mean[native_targets].tolist() + ) + + def test_real_robot_contains_public_robot_data_but_no_egoverse() -> None: dataset_ids = {dataset.uid for dataset in config._REAL_ROBOT_DATA.datasets} assert {"piper30", "piper2", "agibot", "droid"} <= dataset_ids From 7ab1b89604279a8f19ccf5e3cf2d9d7477598e98 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Tue, 21 Jul 2026 17:32:00 +0800 Subject: [PATCH 28/64] Use batch 512 for legacy32 four-GPU control --- ...55\347\273\203\346\214\207\345\215\227.md" | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index d1c1bae..4130a1f 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -88,16 +88,16 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ | 学习率 | peak `1e-6`,decay `1e-7` | | 节点 × GPU | 1 × 4 B200 | | FSDP devices | 4 | -| train global batch size | 256 | +| train global batch size | 512 | | validation global batch size | 96 | -| samples / GPU | 64 | -| train steps | 20,000 | -| warmup / decay steps | 400 / 20,000 | -| eval / save interval | 2,000 / 4,000 | +| samples / GPU | 128 | +| train steps | 10,000 | +| warmup / decay steps | 200 / 10,000 | +| eval / save interval | 1,000 / 2,000 | | validation batches | 10 | | action MSE | 开启 | -`256 × 20,000 = 512 × 10,000 = 5,120,000`,因此该4卡实验与原8卡实验的总训练样本量一致;warmup、eval、save也按样本量等比例换算。 +该4卡实验保持与原8卡实验相同的 global batch、optimizer update 次数和总训练样本量:`512 × 10,000 = 5,120,000`。每张 B200 处理128个样本;先通过 smoke 确认显存充足,再提交正式任务。相比降低 global batch 并增加 steps,这种设置不会额外改变梯度方差、AdamW 动量轨迹或学习率随 optimizer step 的变化。 先做静态验收: @@ -115,8 +115,8 @@ export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu MODE=smoke CONFIG_NAME=cotrain_real_only_legacy32 \ -EXP_NAME=cotrain_real_only_legacy32_b200_4gpu_smoke \ -INSTANCES=1 GPU_PER_NODE=4 FSDP_DEVICES=4 BATCH_SIZE=256 VAL_BATCH_SIZE=96 \ +EXP_NAME=cotrain_real_only_legacy32_b200_4gpu_b512_smoke \ +INSTANCES=1 GPU_PER_NODE=4 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=0 \ .venv/bin/python atom0_train_job.py @@ -130,10 +130,10 @@ export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu MODE=train CONFIG_NAME=cotrain_real_only_legacy32 \ -EXP_NAME=cotrain_real_only_legacy32_b200_4gpu_v1 \ -INSTANCES=1 GPU_PER_NODE=4 FSDP_DEVICES=4 BATCH_SIZE=256 VAL_BATCH_SIZE=96 \ -NUM_TRAIN_STEPS=20000 WARMUP_STEPS=400 DECAY_STEPS=20000 \ -EVAL_INTERVAL=2000 SAVE_INTERVAL=4000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ +EXP_NAME=cotrain_real_only_legacy32_b200_4gpu_b512_v1 \ +INSTANCES=1 GPU_PER_NODE=4 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ +NUM_TRAIN_STEPS=10000 WARMUP_STEPS=200 DECAY_STEPS=10000 \ +EVAL_INTERVAL=1000 SAVE_INTERVAL=2000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py ``` From f0fc981c9548bd3105961d154bb5faa60349822d Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Tue, 21 Jul 2026 17:40:52 +0800 Subject: [PATCH 29/64] Document branch checkout for legacy32 jobs --- ...50\256\255\347\273\203\346\214\207\345\215\227.md" | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index 4130a1f..0f37a8b 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -80,6 +80,17 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ 该配置只回退动作空间,其他训练条件与上面的 `cotrain_real_only_b200_v1` 保持一致: +百舸任务会直接进入共享目录 `/data/wudi/Atom-0` 并使用该目录当前检出的代码。提交 smoke 或正式训练前,必须先切换到实验分支并核对 commit: + +```bash +cd /data/wudi/Atom-0 +git switch exp/legacy32-real-only-b200 +git status --short +git log -1 --oneline +``` + +`git status --short` 应当没有输出;`git log -1` 应显示 Legacy32 实验的最新 commit。切换分支只需要在共享仓库执行一次,随后从 `/data/wudi/baige-cluster` 提交的任务会使用这个分支,无需在任务命令中再次切换。 + | 超参数 | 值 | | --- | ---: | | 配置 | `cotrain_real_only_legacy32` | From d6cb08aef6007c94389f9fd31e97d7960550cf8e Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Wed, 22 Jul 2026 16:21:32 +0800 Subject: [PATCH 30/64] Add Piper30 Aliyun legacy replay config --- ...55\347\273\203\346\214\207\345\215\227.md" | 89 ++++++++++++++++++- scripts/preflight_cotrain_baige.py | 5 +- scripts/train_cotrain_baige.sh | 16 +++- src/openpi/cotrain/config.py | 54 ++++++++--- src/openpi/cotrain/transforms.py | 9 ++ tests/cotrain/test_unified_config.py | 29 +++++- 6 files changed, 187 insertions(+), 15 deletions(-) diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index 0f37a8b..ad24e21 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -76,7 +76,7 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py ``` -## 对比实验:相同真机数据,Legacy 32D 动作空间(4 卡) +## 已完成对比实验:相同真机数据,Legacy 32D 动作空间(4 卡) 该配置只回退动作空间,其他训练条件与上面的 `cotrain_real_only_b200_v1` 保持一致: @@ -149,6 +149,93 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py ``` +## Aliyun 20000 复现实验:Piper30-only Legacy 32D(8 卡) + +该实验使用独立配置 `cotrain_piper30_legacy32_aliyun_replay`,不覆盖上一个 +`cotrain_real_only_legacy32` 动作空间消融。它恢复目前能够从 6 月代码确认的历史训练条件: + +- 只使用 `piper30`,不采样 `piper2`; +- Piper native 14D 位于 legacy 32D `[0:14]`,完整加载 `pi05_base` 的 32D head; +- 使用旧 prompt 合约,不添加 `Action Mode: joint.`; +- `max_token_len=200`; +- 训练 20,000 steps,warmup 1,000,30,000-step cosine decay; +- peak LR `2.5e-5`,decay LR `2.5e-6`; +- checkpoint间隔5,000 steps。 + +旧 Aliyun launch metadata 尚未找到,因此其实际 global batch 和命令行 LR 覆盖无法从 checkpoint +名称单独证明。本复现实验采用 **global batch 512**:假设旧16卡任务也是global batch 512,8张B200 +通过每卡64样本保持相同global batch、梯度尺度和optimizer update语义。不要把batch改成1024;那会改变 +梯度方差和每20,000步看到的总样本数,而不是“补偿少8张卡”。 + +当前机器也没有旧 `cotrain_all_2ep/piper30/norm_stats.json`。配置暂时使用当前全量Piper30 stats并投影 +回native 14D;取得旧stats后,应在正式提交前替换并逐维核对。这是本次仍未完全历史对齐的一项。 + +提交前切换并核对实验分支: + +```bash +cd /data/wudi/Atom-0 +git switch exp/legacy32-real-only-b200 +git status --short +git log -1 --oneline +``` + +| 超参数 | 值 | +| --- | ---: | +| 配置 | `cotrain_piper30_legacy32_aliyun_replay` | +| 数据集 | `piper30` only | +| 动作空间 | native 14D位于32D `[0:14]`,其余补零 | +| prompt prefix | 无(恢复0629格式) | +| max token length | 200 | +| 学习率 | peak `2.5e-5`,decay `2.5e-6` | +| 节点 × GPU | 1 × 8 B200 | +| FSDP devices | 4 | +| train global batch size | 512 | +| samples / GPU | 64 | +| train steps | 20,000 | +| 总训练样本 | 10,240,000 | +| warmup / decay steps | 1,000 / 30,000 | +| eval / save interval | 1,000 / 5,000 | +| validation global batch size | 96 | + +先做静态验收: + +```bash +cd /data/wudi/Atom-0 +source scripts/atom0_env.sh +.venv/bin/python scripts/preflight_cotrain_baige.py cotrain_piper30_legacy32_aliyun_replay +``` + +建议先提交20步smoke: + +```bash +cd /data/wudi/baige-cluster +export BOS_SOURCE=atom0-data/ +export BOS_MOUNT_PATH=/mnt/bos/bo23lu + +MODE=smoke CONFIG_NAME=cotrain_piper30_legacy32_aliyun_replay \ +EXP_NAME=cotrain_piper30_legacy32_aliyun_replay_b200_8gpu_b512_smoke \ +INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ +SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=0 \ +.venv/bin/python atom0_train_job.py +``` + +正式训练: + +```bash +cd /data/wudi/baige-cluster +export BOS_SOURCE=atom0-data/ +export BOS_MOUNT_PATH=/mnt/bos/bo23lu + +MODE=train CONFIG_NAME=cotrain_piper30_legacy32_aliyun_replay \ +EXP_NAME=cotrain_piper30_legacy32_aliyun_replay_b200_8gpu_b512_v1 \ +INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ +NUM_TRAIN_STEPS=20000 WARMUP_STEPS=1000 DECAY_STEPS=30000 \ +EVAL_INTERVAL=1000 SAVE_INTERVAL=5000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ +.venv/bin/python atom0_train_job.py +``` + ## 正式训练 2:自采真机 + 开源 Robot(不含 EgoVerse) | 超参数 | 值 | diff --git a/scripts/preflight_cotrain_baige.py b/scripts/preflight_cotrain_baige.py index e01385f..fed3dcb 100755 --- a/scripts/preflight_cotrain_baige.py +++ b/scripts/preflight_cotrain_baige.py @@ -24,16 +24,18 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: datasets = cfg.data.datasets ids = [dataset.uid for dataset in datasets] assert "piper30" in ids - assert "piper2" in ids expected_counts = { "cotrain_real_only": 2, "cotrain_real_only_legacy32": 2, + "cotrain_piper30_legacy32_aliyun_replay": 1, "cotrain_real_robot": 37, "cotrain_real_robot_fix": 34, "cotrain_full_all_full_norm": 39, } expected_count = expected_counts[config_name] assert len(ids) == expected_count, (config_name, len(ids), expected_count) + if config_name != "cotrain_piper30_legacy32_aliyun_replay": + assert "piper2" in ids if config_name == "cotrain_full_all_full_norm": assert sum(dataset_id.startswith("egoverse_") for dataset_id in ids) == 5 else: @@ -101,6 +103,7 @@ def main() -> None: choices=( "cotrain_real_only", "cotrain_real_only_legacy32", + "cotrain_piper30_legacy32_aliyun_replay", "cotrain_real_robot", "cotrain_real_robot_fix", "cotrain_full_all_full_norm", diff --git a/scripts/train_cotrain_baige.sh b/scripts/train_cotrain_baige.sh index 2ceea93..816a259 100755 --- a/scripts/train_cotrain_baige.sh +++ b/scripts/train_cotrain_baige.sh @@ -5,7 +5,7 @@ REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "${REPO_DIR}" source scripts/atom0_env.sh -CONFIG_NAME="${CONFIG_NAME:?Set CONFIG_NAME to cotrain_real_only, cotrain_real_only_legacy32, or cotrain_real_robot_fix}" +CONFIG_NAME="${CONFIG_NAME:?Set a supported co-training CONFIG_NAME}" EXP_NAME="${EXP_NAME:?Set EXP_NAME}" MODE="${MODE:-train}" # Keep 64 samples/GPU by default. WORLD_SIZE is the number of Baige nodes and @@ -24,6 +24,18 @@ case "${CONFIG_NAME}" in DEFAULT_VAL_BATCHES=10 DEFAULT_ACTION_MSE=1 ;; + cotrain_piper30_legacy32_aliyun_replay) + # Historical replay is explicitly run for 20k optimizer updates. This sample count is + # retained only for informative defaults if NUM_TRAIN_STEPS is omitted. + TRAIN_SAMPLES="${TRAIN_SAMPLES:-2223663}" + DEFAULT_STEPS=20000 + DEFAULT_WARMUP=1000 + DEFAULT_EVAL_INTERVAL=1000 + DEFAULT_SAVE_INTERVAL=5000 + DEFAULT_VAL_BATCH_SIZE=96 + DEFAULT_VAL_BATCHES=10 + DEFAULT_ACTION_MSE=1 + ;; cotrain_real_robot|cotrain_real_robot_fix) # One aggregate pass over norm metadata frames. The audited fix mixture removes # Leju s54, Agilex fps50 and Agilex s26 (34 datasets, 150,109,749 frames). @@ -59,7 +71,7 @@ LOG_INTERVAL="${LOG_INTERVAL:-100}" CHECKPOINT_BASE_DIR="${CHECKPOINT_BASE_DIR:-${REPO_DIR}/checkpoints}" ASSETS_BASE_DIR="${ASSETS_BASE_DIR:-${REPO_DIR}/assets}" ASSET_CONFIG_NAME="${CONFIG_NAME}" -if [[ "${CONFIG_NAME}" == "cotrain_real_only_legacy32" ]]; then +if [[ "${CONFIG_NAME}" == "cotrain_real_only_legacy32" || "${CONFIG_NAME}" == "cotrain_piper30_legacy32_aliyun_replay" ]]; then # Legacy32 projects the audited unified Piper stats back into native 14D order. ASSET_CONFIG_NAME="cotrain_real_only" fi diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 94f5bd1..61fddf2 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -34,6 +34,7 @@ LEGACY_ACTION_DIM = 32 _LEGACY_REAL_ONLY_DATASET_IDS = frozenset({"piper30", "piper2"}) +_LEGACY_REPLAY_DATASET_IDS = frozenset({"piper30"}) def _resolve_unified_datasets(datasets, model_config: _model.BaseModelConfig): @@ -62,12 +63,13 @@ def _resolve_legacy32_datasets(datasets, model_config: _model.BaseModelConfig): f"Legacy real-only co-training requires action_dim={LEGACY_ACTION_DIM}, got {model_config.action_dim}." ) dataset_ids = {ds.uid for ds in datasets} - if dataset_ids != _LEGACY_REAL_ONLY_DATASET_IDS: + if dataset_ids not in {_LEGACY_REAL_ONLY_DATASET_IDS, _LEGACY_REPLAY_DATASET_IDS}: raise ValueError( - f"Legacy32 is restricted to the controlled Piper30+Piper2 experiment; got datasets={sorted(dataset_ids)}." + "Legacy32 is restricted to the controlled Piper30+Piper2 ablation or the " + f"Piper30-only Aliyun replay; got datasets={sorted(dataset_ids)}." ) if any(ds.action_dim != 14 for ds in datasets): - raise ValueError("Legacy32 Piper datasets must both expose the native 14D action layout.") + raise ValueError("Legacy32 Piper datasets must expose the native 14D action layout.") return tuple(dataclasses.replace(ds, unified_action_spec=None) for ds in datasets) @@ -157,6 +159,9 @@ class CotrainDataConfig(_config.DataConfigFactory): # The legacy experiment reuses the audited unified stats and projects the active slots # back to native Piper order, avoiding a second scan of the exact same source frames. norm_stats_source_config: str | None = None + # The June-29 Piper-only run predates action-mode prompt metadata. Keep this switch scoped + # to its replay config; current production and action-space ablation configs retain it. + include_action_prompt_prefix: bool = True @override def create(self, assets_dirs: pathlib.Path, model_config: _model.BaseModelConfig) -> _config.DataConfig: @@ -200,13 +205,11 @@ def create(self, assets_dirs: pathlib.Path, model_config: _model.BaseModelConfig # Generic inputs (uniform schema across datasets) -> per-dataset delta -> per-dataset # normalization. No per-dataset repack needed (StandardizedInputs reads the nested # standardized keys directly). Delta MUST precede normalization (stats are on deltas). - data_transforms = _transforms.Group( - inputs=[ - cotrain_transforms.StandardizedInputs(model_type=model_config.model_type), - dispatch_delta, - dispatch_norm, - ], - ) + data_inputs = [cotrain_transforms.StandardizedInputs(model_type=model_config.model_type)] + if not self.include_action_prompt_prefix: + data_inputs.append(cotrain_transforms.DropPromptPrefix()) + data_inputs.extend((dispatch_delta, dispatch_norm)) + data_transforms = _transforms.Group(inputs=data_inputs) model_transforms = _config.ModelTransformFactory()(model_config) @@ -931,6 +934,11 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): action_dim=LEGACY_ACTION_DIM, max_token_len=384, ) +_LEGACY32_ALIYUN_REPLAY_MODEL = pi0_config.Pi0Config( + pi05=True, + action_dim=LEGACY_ACTION_DIM, + max_token_len=200, +) _PI05_BASE_SHAPE_SAFE_LOADER = cotrain_weight_loaders.ShapeSafeCheckpointWeightLoader( params_path="gs://openpi-assets/checkpoints/pi05_base/params", ) @@ -976,6 +984,31 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): weight_loader=weight_loaders.CheckpointWeightLoader("gs://openpi-assets/checkpoints/pi05_base/params"), ) +# Historical replay of the successful June-29 Aliyun Piper-only run. Unlike the controlled +# action-space ablation above, this also restores the old data mixture, prompt format, token +# length, training horizon, and code-default LR schedule. The old launch metadata/global batch +# and old norm file are unavailable; the Baige guide records the explicit assumptions used. +_PIPER30_LEGACY32_ALIYUN_REPLAY_DATA = dataclasses.replace( + _PIPER30_DATA, + unified_action_space=False, + norm_stats_source_config="cotrain_real_only", + include_action_prompt_prefix=False, +) +_PIPER30_LEGACY32_ALIYUN_REPLAY = dataclasses.replace( + _REAL_ONLY_LEGACY32_PI05, + name="cotrain_piper30_legacy32_aliyun_replay", + model=_LEGACY32_ALIYUN_REPLAY_MODEL, + data=_PIPER30_LEGACY32_ALIYUN_REPLAY_DATA, + lr_schedule=_optimizer.CosineDecaySchedule( + warmup_steps=1_000, + peak_lr=2.5e-5, + decay_steps=30_000, + decay_lr=2.5e-6, + ), + num_train_steps=20_000, + save_interval=5_000, +) + _REAL_ROBOT_PI05 = dataclasses.replace( _REAL_ONLY_PI05, name="cotrain_real_robot", @@ -997,6 +1030,7 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): _COTRAIN_CONFIGS = [ _REAL_ONLY_PI05, _REAL_ONLY_LEGACY32_PI05, + _PIPER30_LEGACY32_ALIYUN_REPLAY, _REAL_ROBOT_PI05, _REAL_ROBOT_FIX_PI05, _FULL_ALL_PI05_FULL_NORM, diff --git a/src/openpi/cotrain/transforms.py b/src/openpi/cotrain/transforms.py index 0fde6b5..4ce4484 100644 --- a/src/openpi/cotrain/transforms.py +++ b/src/openpi/cotrain/transforms.py @@ -110,6 +110,15 @@ def __call__(self, data: dict) -> dict: return {"actions": actions} +@dataclasses.dataclass(frozen=True) +class DropPromptPrefix(_transforms.DataTransformFn): + """Restore the pre-metadata prompt contract used by historical Piper checkpoints.""" + + def __call__(self, data: dict) -> dict: + data.pop("prompt_prefix", None) + return data + + @dataclasses.dataclass(frozen=True) class DispatchDeltaActions(_transforms.DataTransformFn): """Per-dataset absolute->delta action conversion, dispatched by `dataset_id`. diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index e49b118..2538b63 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -5,6 +5,7 @@ from openpi.cotrain import action_space from openpi.cotrain import config from openpi.cotrain import data_loader +from openpi.cotrain import transforms as cotrain_transforms from openpi.cotrain.rlds_dataset import CotrainRLDSDataset @@ -12,12 +13,13 @@ def test_registered_cotrain_configs_include_controlled_legacy32_ablation() -> No assert {train_config.name for train_config in config._COTRAIN_CONFIGS} == { "cotrain_real_only", "cotrain_real_only_legacy32", + "cotrain_piper30_legacy32_aliyun_replay", "cotrain_real_robot", "cotrain_real_robot_fix", "cotrain_full_all_full_norm", } for train_config in config._COTRAIN_CONFIGS: - if train_config.name == "cotrain_real_only_legacy32": + if train_config.name in {"cotrain_real_only_legacy32", "cotrain_piper30_legacy32_aliyun_replay"}: continue assert train_config.model.action_dim == action_space.UNIFIED_ACTION_DIM datasets = config._resolve_unified_datasets(train_config.data.datasets, train_config.model) @@ -99,6 +101,31 @@ def test_legacy32_norm_projection_restores_native_piper_order() -> None: ) +def test_aliyun_replay_restores_confirmed_historical_training_contract() -> None: + replay = config.get_config("cotrain_piper30_legacy32_aliyun_replay") + + assert [dataset.uid for dataset in replay.data.datasets] == ["piper30"] + assert replay.data.unified_action_space is False + assert replay.data.include_action_prompt_prefix is False + assert replay.model.action_dim == 32 + assert replay.model.max_token_len == 200 + assert replay.num_train_steps == 20_000 + assert replay.lr_schedule.warmup_steps == 1_000 + assert replay.lr_schedule.peak_lr == pytest.approx(2.5e-5) + assert replay.lr_schedule.decay_steps == 30_000 + assert replay.lr_schedule.decay_lr == pytest.approx(2.5e-6) + assert replay.save_interval == 5_000 + + data_config = replay.data.create(replay.assets_dirs, replay.model) + assert any( + isinstance(transform, cotrain_transforms.DropPromptPrefix) for transform in data_config.data_transforms.inputs + ) + + resolved = config._resolve_legacy32_datasets(replay.data.datasets, replay.model) + assert [dataset.uid for dataset in resolved] == ["piper30"] + assert resolved[0].unified_action_spec is None + + def test_real_robot_contains_public_robot_data_but_no_egoverse() -> None: dataset_ids = {dataset.uid for dataset in config._REAL_ROBOT_DATA.datasets} assert {"piper30", "piper2", "agibot", "droid"} <= dataset_ids From 8bf2e8145ba47d8da7fde79702f94b73fae60e50 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Wed, 22 Jul 2026 16:34:13 +0800 Subject: [PATCH 31/64] Align Aliyun replay with global batch 32 --- ...55\347\273\203\346\214\207\345\215\227.md" | 22 +++++++++---------- scripts/train_cotrain_baige.sh | 11 +++++++--- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index ad24e21..0e966b2 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -162,10 +162,11 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ - peak LR `2.5e-5`,decay LR `2.5e-6`; - checkpoint间隔5,000 steps。 -旧 Aliyun launch metadata 尚未找到,因此其实际 global batch 和命令行 LR 覆盖无法从 checkpoint -名称单独证明。本复现实验采用 **global batch 512**:假设旧16卡任务也是global batch 512,8张B200 -通过每卡64样本保持相同global batch、梯度尺度和optimizer update语义。不要把batch改成1024;那会改变 -梯度方差和每20,000步看到的总样本数,而不是“补偿少8张卡”。 +旧提交 `8662062` 的 `cotrain_all_2ep` 最终指向 Piper30-only 配置,其中明确写的是 +`batch_size=32`;基础 `TrainConfig` 同时注明该字段是 **global batch size**。旧 Aliyun launch metadata +尚未找到,因此仍无法排除当时通过CLI覆盖过该值;但在出现相反证据前,本复现实验严格采用代码中可确认的 +**global batch 32**,而不是此前无依据假设的512。旧16卡使用global batch 32时,8卡B200保持global +batch不变;更少的data-parallel replicas带来的单replica负载增加由B200显存承担。 当前机器也没有旧 `cotrain_all_2ep/piper30/norm_stats.json`。配置暂时使用当前全量Piper30 stats并投影 回native 14D;取得旧stats后,应在正式提交前替换并逐维核对。这是本次仍未完全历史对齐的一项。 @@ -189,10 +190,9 @@ git log -1 --oneline | 学习率 | peak `2.5e-5`,decay `2.5e-6` | | 节点 × GPU | 1 × 8 B200 | | FSDP devices | 4 | -| train global batch size | 512 | -| samples / GPU | 64 | +| train global batch size | 32 | | train steps | 20,000 | -| 总训练样本 | 10,240,000 | +| 总训练样本 | 640,000 | | warmup / decay steps | 1,000 / 30,000 | | eval / save interval | 1,000 / 5,000 | | validation global batch size | 96 | @@ -213,8 +213,8 @@ export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu MODE=smoke CONFIG_NAME=cotrain_piper30_legacy32_aliyun_replay \ -EXP_NAME=cotrain_piper30_legacy32_aliyun_replay_b200_8gpu_b512_smoke \ -INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ +EXP_NAME=cotrain_piper30_legacy32_aliyun_replay_b200_8gpu_b32_smoke \ +INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=32 VAL_BATCH_SIZE=96 \ SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=0 \ .venv/bin/python atom0_train_job.py @@ -228,8 +228,8 @@ export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu MODE=train CONFIG_NAME=cotrain_piper30_legacy32_aliyun_replay \ -EXP_NAME=cotrain_piper30_legacy32_aliyun_replay_b200_8gpu_b512_v1 \ -INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ +EXP_NAME=cotrain_piper30_legacy32_aliyun_replay_b200_8gpu_b32_v1 \ +INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=32 VAL_BATCH_SIZE=96 \ NUM_TRAIN_STEPS=20000 WARMUP_STEPS=1000 DECAY_STEPS=30000 \ EVAL_INTERVAL=1000 SAVE_INTERVAL=5000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ diff --git a/scripts/train_cotrain_baige.sh b/scripts/train_cotrain_baige.sh index 816a259..93bc1ed 100755 --- a/scripts/train_cotrain_baige.sh +++ b/scripts/train_cotrain_baige.sh @@ -8,9 +8,14 @@ source scripts/atom0_env.sh CONFIG_NAME="${CONFIG_NAME:?Set a supported co-training CONFIG_NAME}" EXP_NAME="${EXP_NAME:?Set EXP_NAME}" MODE="${MODE:-train}" -# Keep 64 samples/GPU by default. WORLD_SIZE is the number of Baige nodes and -# NPROC_PER_NODE is 8 for the B200 jobs submitted by atom0_train_job.py. -BATCH_SIZE="${BATCH_SIZE:-$((64 * ${WORLD_SIZE:-1} * ${NPROC_PER_NODE:-8}))}" +# Production B200 jobs default to 64 samples per physical GPU. The historical replay is +# different: its checked-in Aliyun config declares GLOBAL batch 32, so retain 32 unless the +# recovered launch metadata later proves that the old job overrode it. +if [[ "${CONFIG_NAME}" == "cotrain_piper30_legacy32_aliyun_replay" ]]; then + BATCH_SIZE="${BATCH_SIZE:-32}" +else + BATCH_SIZE="${BATCH_SIZE:-$((64 * ${WORLD_SIZE:-1} * ${NPROC_PER_NODE:-8}))}" +fi case "${CONFIG_NAME}" in cotrain_real_only|cotrain_real_only_legacy32) From dc0670a7c6ca42a908fb3db10fb08d8af4a6ce85 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Wed, 22 Jul 2026 16:37:44 +0800 Subject: [PATCH 32/64] Revert "Align Aliyun replay with global batch 32" This reverts commit 8bf2e8145ba47d8da7fde79702f94b73fae60e50. --- ...55\347\273\203\346\214\207\345\215\227.md" | 22 +++++++++---------- scripts/train_cotrain_baige.sh | 11 +++------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index 0e966b2..ad24e21 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -162,11 +162,10 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ - peak LR `2.5e-5`,decay LR `2.5e-6`; - checkpoint间隔5,000 steps。 -旧提交 `8662062` 的 `cotrain_all_2ep` 最终指向 Piper30-only 配置,其中明确写的是 -`batch_size=32`;基础 `TrainConfig` 同时注明该字段是 **global batch size**。旧 Aliyun launch metadata -尚未找到,因此仍无法排除当时通过CLI覆盖过该值;但在出现相反证据前,本复现实验严格采用代码中可确认的 -**global batch 32**,而不是此前无依据假设的512。旧16卡使用global batch 32时,8卡B200保持global -batch不变;更少的data-parallel replicas带来的单replica负载增加由B200显存承担。 +旧 Aliyun launch metadata 尚未找到,因此其实际 global batch 和命令行 LR 覆盖无法从 checkpoint +名称单独证明。本复现实验采用 **global batch 512**:假设旧16卡任务也是global batch 512,8张B200 +通过每卡64样本保持相同global batch、梯度尺度和optimizer update语义。不要把batch改成1024;那会改变 +梯度方差和每20,000步看到的总样本数,而不是“补偿少8张卡”。 当前机器也没有旧 `cotrain_all_2ep/piper30/norm_stats.json`。配置暂时使用当前全量Piper30 stats并投影 回native 14D;取得旧stats后,应在正式提交前替换并逐维核对。这是本次仍未完全历史对齐的一项。 @@ -190,9 +189,10 @@ git log -1 --oneline | 学习率 | peak `2.5e-5`,decay `2.5e-6` | | 节点 × GPU | 1 × 8 B200 | | FSDP devices | 4 | -| train global batch size | 32 | +| train global batch size | 512 | +| samples / GPU | 64 | | train steps | 20,000 | -| 总训练样本 | 640,000 | +| 总训练样本 | 10,240,000 | | warmup / decay steps | 1,000 / 30,000 | | eval / save interval | 1,000 / 5,000 | | validation global batch size | 96 | @@ -213,8 +213,8 @@ export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu MODE=smoke CONFIG_NAME=cotrain_piper30_legacy32_aliyun_replay \ -EXP_NAME=cotrain_piper30_legacy32_aliyun_replay_b200_8gpu_b32_smoke \ -INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=32 VAL_BATCH_SIZE=96 \ +EXP_NAME=cotrain_piper30_legacy32_aliyun_replay_b200_8gpu_b512_smoke \ +INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=0 \ .venv/bin/python atom0_train_job.py @@ -228,8 +228,8 @@ export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu MODE=train CONFIG_NAME=cotrain_piper30_legacy32_aliyun_replay \ -EXP_NAME=cotrain_piper30_legacy32_aliyun_replay_b200_8gpu_b32_v1 \ -INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=32 VAL_BATCH_SIZE=96 \ +EXP_NAME=cotrain_piper30_legacy32_aliyun_replay_b200_8gpu_b512_v1 \ +INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ NUM_TRAIN_STEPS=20000 WARMUP_STEPS=1000 DECAY_STEPS=30000 \ EVAL_INTERVAL=1000 SAVE_INTERVAL=5000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ diff --git a/scripts/train_cotrain_baige.sh b/scripts/train_cotrain_baige.sh index 93bc1ed..816a259 100755 --- a/scripts/train_cotrain_baige.sh +++ b/scripts/train_cotrain_baige.sh @@ -8,14 +8,9 @@ source scripts/atom0_env.sh CONFIG_NAME="${CONFIG_NAME:?Set a supported co-training CONFIG_NAME}" EXP_NAME="${EXP_NAME:?Set EXP_NAME}" MODE="${MODE:-train}" -# Production B200 jobs default to 64 samples per physical GPU. The historical replay is -# different: its checked-in Aliyun config declares GLOBAL batch 32, so retain 32 unless the -# recovered launch metadata later proves that the old job overrode it. -if [[ "${CONFIG_NAME}" == "cotrain_piper30_legacy32_aliyun_replay" ]]; then - BATCH_SIZE="${BATCH_SIZE:-32}" -else - BATCH_SIZE="${BATCH_SIZE:-$((64 * ${WORLD_SIZE:-1} * ${NPROC_PER_NODE:-8}))}" -fi +# Keep 64 samples/GPU by default. WORLD_SIZE is the number of Baige nodes and +# NPROC_PER_NODE is 8 for the B200 jobs submitted by atom0_train_job.py. +BATCH_SIZE="${BATCH_SIZE:-$((64 * ${WORLD_SIZE:-1} * ${NPROC_PER_NODE:-8}))}" case "${CONFIG_NAME}" in cotrain_real_only|cotrain_real_only_legacy32) From 6aae966ecea1f28005b716312d4c35c4e02b6b8c Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Thu, 23 Jul 2026 17:10:26 +0800 Subject: [PATCH 33/64] Add Piper comparison experiments with Aliyun recipe --- ...55\347\273\203\346\214\207\345\215\227.md" | 130 ++++++++++++++++++ scripts/preflight_cotrain_baige.py | 4 + scripts/train_cotrain_baige.sh | 21 ++- src/openpi/cotrain/config.py | 48 ++++++- tests/cotrain/test_unified_config.py | 47 ++++++- 5 files changed, 237 insertions(+), 13 deletions(-) diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index ad24e21..406bfef 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -236,6 +236,136 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py ``` +## 对比实验组:固定 Aliyun 20000 配方,依次比较 Piper2 和 Unified80 + +Aliyun 20000 Piper30-only Legacy32 复现实验已经成功,后续两个实验统一以它为基线。三个实验的 +global batch、optimizer update 数、学习率曲线、验证设置和初始化策略均由独立配置与测试固定,避免 +命令行遗漏造成对比漂移。 + +| 对比项 | A:已成功基线 | B:实验 1,加 Piper2 | C:实验 2,正式训练 1 + Aliyun 配方 | +| --- | --- | --- | --- | +| config | `cotrain_piper30_legacy32_aliyun_replay` | `cotrain_real_only_legacy32_aliyun_recipe` | `cotrain_real_only_unified80_aliyun_recipe` | +| 数据集 | Piper30 | Piper30 + Piper2 | Piper30 + Piper2 | +| 动作空间 | Legacy32 | Legacy32 | Unified80 | +| prompt prefix | 无 | 无 | `Action Mode: joint.` | +| max token length | 200 | 200 | 384 | +| pi05 32D head | 完整加载 | 完整加载 | 80D shape mismatch 部分随机初始化 | +| global batch | 512 | 512 | 512 | +| train steps | 20,000 | 20,000 | 20,000 | +| warmup / decay | 1,000 / 30,000 | 1,000 / 30,000 | 1,000 / 30,000 | +| peak / decay LR | `2.5e-5` / `2.5e-6` | `2.5e-5` / `2.5e-6` | `2.5e-5` / `2.5e-6` | +| eval / save | 1,000 / 5,000 | 1,000 / 5,000 | 1,000 / 5,000 | +| 节点 × GPU | 1 × 8 B200 | 1 × 8 B200 | 1 × 8 B200 | +| FSDP devices | 4 | 4 | 4 | + +因此: + +- A → B 只用于观察加入 Piper2 的影响; +- B → C 用于观察 Unified80 及其配套输入合约、80D head 初始化的整体影响; +- 正式训练 1 → C 保留数据、Unified80、prompt、token 长度、norm 和初始化不变,只替换成 Aliyun + 20000 的学习率/训练步数/save interval 配方。 + +注意:B 与 C 都使用 `assets/cotrain_real_only/{piper30,piper2}`。B 在运行时把统一统计投影回 +native 14D;C 直接使用 Unified80 统计,无需重新计算 norm。 + +### 提交前代码和静态验收 + +```bash +cd /data/wudi/Atom-0 +git switch exp/legacy32-real-only-b200 +git status --short +git log -1 --oneline + +source scripts/atom0_env.sh +.venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_only_legacy32_aliyun_recipe +.venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_only_unified80_aliyun_recipe +``` + +两次 preflight 都应输出 `datasets=2, source_frames=2,913,191`。提交脚本 +`/data/wudi/baige-cluster/atom0_train_job.py` 也必须是包含这两个 config allowlist 的当前版本。 + +### 实验 1:Legacy32,只加入 Piper2 + +先跑 20 steps smoke: + +```bash +cd /data/wudi/baige-cluster +export BOS_SOURCE=atom0-data/ +export BOS_MOUNT_PATH=/mnt/bos/bo23lu + +MODE=smoke CONFIG_NAME=cotrain_real_only_legacy32_aliyun_recipe \ +EXP_NAME=cotrain_real_only_legacy32_aliyun_recipe_b200_8gpu_b512_smoke \ +INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ +SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=0 \ +.venv/bin/python atom0_train_job.py +``` + +正式训练: + +```bash +cd /data/wudi/baige-cluster +export BOS_SOURCE=atom0-data/ +export BOS_MOUNT_PATH=/mnt/bos/bo23lu + +MODE=train CONFIG_NAME=cotrain_real_only_legacy32_aliyun_recipe \ +EXP_NAME=cotrain_real_only_legacy32_aliyun_recipe_b200_8gpu_b512_v1 \ +INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ +NUM_TRAIN_STEPS=20000 WARMUP_STEPS=1000 DECAY_STEPS=30000 \ +EVAL_INTERVAL=1000 SAVE_INTERVAL=5000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ +.venv/bin/python atom0_train_job.py +``` + +### 实验 2:正式训练 1 的 Unified80,改用 Aliyun 20000 配方 + +先跑 20 steps smoke: + +```bash +cd /data/wudi/baige-cluster +export BOS_SOURCE=atom0-data/ +export BOS_MOUNT_PATH=/mnt/bos/bo23lu + +MODE=smoke CONFIG_NAME=cotrain_real_only_unified80_aliyun_recipe \ +EXP_NAME=cotrain_real_only_unified80_aliyun_recipe_b200_8gpu_b512_smoke \ +INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ +SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=0 \ +.venv/bin/python atom0_train_job.py +``` + +正式训练: + +```bash +cd /data/wudi/baige-cluster +export BOS_SOURCE=atom0-data/ +export BOS_MOUNT_PATH=/mnt/bos/bo23lu + +MODE=train CONFIG_NAME=cotrain_real_only_unified80_aliyun_recipe \ +EXP_NAME=cotrain_real_only_unified80_aliyun_recipe_b200_8gpu_b512_v1 \ +INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ +NUM_TRAIN_STEPS=20000 WARMUP_STEPS=1000 DECAY_STEPS=30000 \ +EVAL_INTERVAL=1000 SAVE_INTERVAL=5000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ +.venv/bin/python atom0_train_job.py +``` + +### 运行后验收 + +每个正式任务都应在启动日志中打印: + +```text +FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 NUM_TRAIN_STEPS=20000 +``` + +同时核对: + +1. 训练 step 0 的 prompt-check:B 不应出现 `Action Mode: joint.`,C 应出现; +2. W&B config 中 action dim:B 为 32,C 为 80; +3. B/C 都应构建 `piper30` 和 `piper2` 的 seen/unseen validation loader; +4. step 5,000、10,000、15,000、20,000 均生成 checkpoint; +5. 比较效果时优先使用相同步数 checkpoint,并保持同一版真机 Server/eval 代码。 + ## 正式训练 2:自采真机 + 开源 Robot(不含 EgoVerse) | 超参数 | 值 | diff --git a/scripts/preflight_cotrain_baige.py b/scripts/preflight_cotrain_baige.py index fed3dcb..46ca1d3 100755 --- a/scripts/preflight_cotrain_baige.py +++ b/scripts/preflight_cotrain_baige.py @@ -28,6 +28,8 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: "cotrain_real_only": 2, "cotrain_real_only_legacy32": 2, "cotrain_piper30_legacy32_aliyun_replay": 1, + "cotrain_real_only_legacy32_aliyun_recipe": 2, + "cotrain_real_only_unified80_aliyun_recipe": 2, "cotrain_real_robot": 37, "cotrain_real_robot_fix": 34, "cotrain_full_all_full_norm": 39, @@ -104,6 +106,8 @@ def main() -> None: "cotrain_real_only", "cotrain_real_only_legacy32", "cotrain_piper30_legacy32_aliyun_replay", + "cotrain_real_only_legacy32_aliyun_recipe", + "cotrain_real_only_unified80_aliyun_recipe", "cotrain_real_robot", "cotrain_real_robot_fix", "cotrain_full_all_full_norm", diff --git a/scripts/train_cotrain_baige.sh b/scripts/train_cotrain_baige.sh index 816a259..45bcca4 100755 --- a/scripts/train_cotrain_baige.sh +++ b/scripts/train_cotrain_baige.sh @@ -24,10 +24,15 @@ case "${CONFIG_NAME}" in DEFAULT_VAL_BATCHES=10 DEFAULT_ACTION_MSE=1 ;; - cotrain_piper30_legacy32_aliyun_replay) - # Historical replay is explicitly run for 20k optimizer updates. This sample count is - # retained only for informative defaults if NUM_TRAIN_STEPS is omitted. - TRAIN_SAMPLES="${TRAIN_SAMPLES:-2223663}" + cotrain_piper30_legacy32_aliyun_replay|cotrain_real_only_legacy32_aliyun_recipe|cotrain_real_only_unified80_aliyun_recipe) + # Aliyun-recipe comparisons are explicitly run for 20k optimizer updates. + # Sample counts are informative only; all three variants intentionally use + # the same optimizer-step horizon and global batch. + if [[ "${CONFIG_NAME}" == "cotrain_piper30_legacy32_aliyun_replay" ]]; then + TRAIN_SAMPLES="${TRAIN_SAMPLES:-2223663}" + else + TRAIN_SAMPLES="${TRAIN_SAMPLES:-2913191}" + fi DEFAULT_STEPS=20000 DEFAULT_WARMUP=1000 DEFAULT_EVAL_INTERVAL=1000 @@ -71,8 +76,12 @@ LOG_INTERVAL="${LOG_INTERVAL:-100}" CHECKPOINT_BASE_DIR="${CHECKPOINT_BASE_DIR:-${REPO_DIR}/checkpoints}" ASSETS_BASE_DIR="${ASSETS_BASE_DIR:-${REPO_DIR}/assets}" ASSET_CONFIG_NAME="${CONFIG_NAME}" -if [[ "${CONFIG_NAME}" == "cotrain_real_only_legacy32" || "${CONFIG_NAME}" == "cotrain_piper30_legacy32_aliyun_replay" ]]; then - # Legacy32 projects the audited unified Piper stats back into native 14D order. +if [[ "${CONFIG_NAME}" == "cotrain_real_only_legacy32" || + "${CONFIG_NAME}" == "cotrain_piper30_legacy32_aliyun_replay" || + "${CONFIG_NAME}" == "cotrain_real_only_legacy32_aliyun_recipe" || + "${CONFIG_NAME}" == "cotrain_real_only_unified80_aliyun_recipe" ]]; then + # Comparison configs all reuse the audited production-1 Piper norm assets. + # Legacy32 variants additionally project those stats back into native 14D order. ASSET_CONFIG_NAME="cotrain_real_only" fi RANK_ID="${RANK:-0}" diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 61fddf2..037d177 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -994,17 +994,51 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): norm_stats_source_config="cotrain_real_only", include_action_prompt_prefix=False, ) +_ALIYUN_20K_LR_SCHEDULE = _optimizer.CosineDecaySchedule( + warmup_steps=1_000, + peak_lr=2.5e-5, + decay_steps=30_000, + decay_lr=2.5e-6, +) _PIPER30_LEGACY32_ALIYUN_REPLAY = dataclasses.replace( _REAL_ONLY_LEGACY32_PI05, name="cotrain_piper30_legacy32_aliyun_replay", model=_LEGACY32_ALIYUN_REPLAY_MODEL, data=_PIPER30_LEGACY32_ALIYUN_REPLAY_DATA, - lr_schedule=_optimizer.CosineDecaySchedule( - warmup_steps=1_000, - peak_lr=2.5e-5, - decay_steps=30_000, - decay_lr=2.5e-6, - ), + lr_schedule=_ALIYUN_20K_LR_SCHEDULE, + num_train_steps=20_000, + save_interval=5_000, +) + +# Dataset-only comparison against the successful Piper30 replay above. Keep the +# legacy model, old prompt contract, initialization, and complete Aliyun 20k +# optimizer recipe fixed; only replace the one-dataset input with the production +# Piper30+Piper2 mixture. +_REAL_ONLY_LEGACY32_ALIYUN_RECIPE_DATA = dataclasses.replace( + _REAL_ONLY_DATA, + unified_action_space=False, + norm_stats_source_config="cotrain_real_only", + include_action_prompt_prefix=False, +) +_REAL_ONLY_LEGACY32_ALIYUN_RECIPE = dataclasses.replace( + _PIPER30_LEGACY32_ALIYUN_REPLAY, + name="cotrain_real_only_legacy32_aliyun_recipe", + data=_REAL_ONLY_LEGACY32_ALIYUN_RECIPE_DATA, +) + +# Action-space comparison against the dataset-only experiment. Keep the exact +# production-training-1 data/input contract (Piper30+Piper2, unified 80D, action +# prompt prefix, max_token_len=384, shape-safe pi05 initialization), but run it +# with the same Aliyun 20k optimizer recipe and launch topology. +_REAL_ONLY_UNIFIED80_ALIYUN_RECIPE_DATA = dataclasses.replace( + _REAL_ONLY_DATA, + norm_stats_source_config="cotrain_real_only", +) +_REAL_ONLY_UNIFIED80_ALIYUN_RECIPE = dataclasses.replace( + _REAL_ONLY_PI05, + name="cotrain_real_only_unified80_aliyun_recipe", + data=_REAL_ONLY_UNIFIED80_ALIYUN_RECIPE_DATA, + lr_schedule=_ALIYUN_20K_LR_SCHEDULE, num_train_steps=20_000, save_interval=5_000, ) @@ -1031,6 +1065,8 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): _REAL_ONLY_PI05, _REAL_ONLY_LEGACY32_PI05, _PIPER30_LEGACY32_ALIYUN_REPLAY, + _REAL_ONLY_LEGACY32_ALIYUN_RECIPE, + _REAL_ONLY_UNIFIED80_ALIYUN_RECIPE, _REAL_ROBOT_PI05, _REAL_ROBOT_FIX_PI05, _FULL_ALL_PI05_FULL_NORM, diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index 2538b63..5afc61d 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -14,12 +14,18 @@ def test_registered_cotrain_configs_include_controlled_legacy32_ablation() -> No "cotrain_real_only", "cotrain_real_only_legacy32", "cotrain_piper30_legacy32_aliyun_replay", + "cotrain_real_only_legacy32_aliyun_recipe", + "cotrain_real_only_unified80_aliyun_recipe", "cotrain_real_robot", "cotrain_real_robot_fix", "cotrain_full_all_full_norm", } for train_config in config._COTRAIN_CONFIGS: - if train_config.name in {"cotrain_real_only_legacy32", "cotrain_piper30_legacy32_aliyun_replay"}: + if train_config.name in { + "cotrain_real_only_legacy32", + "cotrain_piper30_legacy32_aliyun_replay", + "cotrain_real_only_legacy32_aliyun_recipe", + }: continue assert train_config.model.action_dim == action_space.UNIFIED_ACTION_DIM datasets = config._resolve_unified_datasets(train_config.data.datasets, train_config.model) @@ -126,6 +132,45 @@ def test_aliyun_replay_restores_confirmed_historical_training_contract() -> None assert resolved[0].unified_action_spec is None +def test_aliyun_recipe_dataset_comparison_only_adds_piper2() -> None: + baseline = config.get_config("cotrain_piper30_legacy32_aliyun_replay") + add_piper2 = config.get_config("cotrain_real_only_legacy32_aliyun_recipe") + + assert [dataset.uid for dataset in baseline.data.datasets] == ["piper30"] + assert {dataset.uid for dataset in add_piper2.data.datasets} == {"piper30", "piper2"} + for field in dataclasses.fields(baseline): + if field.name not in {"name", "data"}: + assert getattr(add_piper2, field.name) == getattr(baseline, field.name), field.name + for field in dataclasses.fields(baseline.data): + if field.name not in {"rlds_data_dir", "datasets"}: + assert getattr(add_piper2.data, field.name) == getattr(baseline.data, field.name), field.name + assert add_piper2.data.unified_action_space is False + assert add_piper2.data.include_action_prompt_prefix is False + assert add_piper2.data.norm_stats_source_config == "cotrain_real_only" + + +def test_unified80_aliyun_recipe_only_changes_formal_training_1_recipe() -> None: + formal = config.get_config("cotrain_real_only") + comparison = config.get_config("cotrain_real_only_unified80_aliyun_recipe") + legacy_comparison = config.get_config("cotrain_real_only_legacy32_aliyun_recipe") + + for field in dataclasses.fields(formal): + if field.name not in {"name", "data", "lr_schedule", "num_train_steps", "save_interval"}: + assert getattr(comparison, field.name) == getattr(formal, field.name), field.name + for field in dataclasses.fields(formal.data): + if field.name != "norm_stats_source_config": + assert getattr(comparison.data, field.name) == getattr(formal.data, field.name), field.name + assert comparison.data.norm_stats_source_config == formal.name + + assert comparison.lr_schedule == legacy_comparison.lr_schedule + assert comparison.num_train_steps == legacy_comparison.num_train_steps == 20_000 + assert comparison.save_interval == legacy_comparison.save_interval == 5_000 + assert comparison.lr_schedule.warmup_steps == 1_000 + assert comparison.lr_schedule.peak_lr == pytest.approx(2.5e-5) + assert comparison.lr_schedule.decay_steps == 30_000 + assert comparison.lr_schedule.decay_lr == pytest.approx(2.5e-6) + + def test_real_robot_contains_public_robot_data_but_no_egoverse() -> None: dataset_ids = {dataset.uid for dataset in config._REAL_ROBOT_DATA.datasets} assert {"piper30", "piper2", "agibot", "droid"} <= dataset_ids From 829d57b6343233bb4696a2c755fefb782dcb1bb7 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Fri, 24 Jul 2026 14:19:02 +0800 Subject: [PATCH 34/64] Support configurable training parameter initialization --- ...55\347\273\203\346\214\207\345\215\227.md" | 98 +++++++------------ scripts/preflight_cotrain_baige.py | 23 ++++- scripts/train_cotrain_baige.sh | 29 +++++- 3 files changed, 84 insertions(+), 66 deletions(-) diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index 406bfef..df55a0e 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -9,8 +9,6 @@ vim .env # 本地环境、checkpoint、两套配置与 norm 验收 cd /data/wudi/Atom-0 source scripts/atom0_env.sh -test -f "${PARAMS_PATH}/_CHECKPOINT_METADATA" -test -f "${PARAMS_PATH}/manifest.ocdbt" .venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_only .venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_robot_fix ``` @@ -22,22 +20,25 @@ INSTANCES=3 GPU_PER_NODE=8 .venv/bin/python nccl_test_job.py ``` ```bash -# 按各自正式拓扑跑 20 step;日志必须保持 loss/grad finite +# 全指南只保留这一条 20-step smoke;需要验证其他 config 时替换 CONFIG_NAME/EXP_NAME 即可 cd /data/wudi/baige-cluster export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu +export PARAMS_PATH=/data/models/openpi MODE=smoke CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_1x8_smoke \ INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ .venv/bin/python atom0_train_job.py - -MODE=smoke CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_3x8_smoke \ -INSTANCES=3 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1536 VAL_BATCH_SIZE=96 \ -SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ -.venv/bin/python atom0_train_job.py ``` +`PARAMS_PATH` 指定新实验的模型参数初始化来源: + +- 默认值为 `/data/models/openpi`,即 pi05; +- 也可以传训练 checkpoint 的 step 目录(例如 `.../97727`)或其 `params/` 子目录,启动脚本会自动解析; +- 对一个全新的 `EXP_NAME`,这里只加载模型参数;optimizer、训练 step 和学习率调度都会重新初始化; +- 如果 `EXP_NAME` 已经存在 checkpoint,训练框架会优先恢复该实验自身状态。因此,需要新训练时必须使用未使用过的 `EXP_NAME`。 + ```bash # 查询任务结构与日志 cd /data/wudi/baige-cluster @@ -67,6 +68,7 @@ cd /data/wudi/baige-cluster cd /data/wudi/baige-cluster export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu +export PARAMS_PATH=/data/models/openpi MODE=train CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_v1 \ INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ @@ -108,7 +110,7 @@ git log -1 --oneline | validation batches | 10 | | action MSE | 开启 | -该4卡实验保持与原8卡实验相同的 global batch、optimizer update 次数和总训练样本量:`512 × 10,000 = 5,120,000`。每张 B200 处理128个样本;先通过 smoke 确认显存充足,再提交正式任务。相比降低 global batch 并增加 steps,这种设置不会额外改变梯度方差、AdamW 动量轨迹或学习率随 optimizer step 的变化。 +该4卡实验保持与原8卡实验相同的 global batch、optimizer update 次数和总训练样本量:`512 × 10,000 = 5,120,000`。每张 B200 处理128个样本。相比降低 global batch 并增加 steps,这种设置不会额外改变梯度方差、AdamW 动量轨迹或学习率随 optimizer step 的变化。 先做静态验收: @@ -118,27 +120,13 @@ source scripts/atom0_env.sh .venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_only_legacy32 ``` -建议先提交20步 smoke: - -```bash -cd /data/wudi/baige-cluster -export BOS_SOURCE=atom0-data/ -export BOS_MOUNT_PATH=/mnt/bos/bo23lu - -MODE=smoke CONFIG_NAME=cotrain_real_only_legacy32 \ -EXP_NAME=cotrain_real_only_legacy32_b200_4gpu_b512_smoke \ -INSTANCES=1 GPU_PER_NODE=4 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ -SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ -DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=0 \ -.venv/bin/python atom0_train_job.py -``` - 正式训练: ```bash cd /data/wudi/baige-cluster export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu +export PARAMS_PATH=/data/models/openpi MODE=train CONFIG_NAME=cotrain_real_only_legacy32 \ EXP_NAME=cotrain_real_only_legacy32_b200_4gpu_b512_v1 \ @@ -205,27 +193,13 @@ source scripts/atom0_env.sh .venv/bin/python scripts/preflight_cotrain_baige.py cotrain_piper30_legacy32_aliyun_replay ``` -建议先提交20步smoke: - -```bash -cd /data/wudi/baige-cluster -export BOS_SOURCE=atom0-data/ -export BOS_MOUNT_PATH=/mnt/bos/bo23lu - -MODE=smoke CONFIG_NAME=cotrain_piper30_legacy32_aliyun_replay \ -EXP_NAME=cotrain_piper30_legacy32_aliyun_replay_b200_8gpu_b512_smoke \ -INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ -SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ -DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=0 \ -.venv/bin/python atom0_train_job.py -``` - 正式训练: ```bash cd /data/wudi/baige-cluster export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu +export PARAMS_PATH=/data/models/openpi MODE=train CONFIG_NAME=cotrain_piper30_legacy32_aliyun_replay \ EXP_NAME=cotrain_piper30_legacy32_aliyun_replay_b200_8gpu_b512_v1 \ @@ -249,7 +223,7 @@ global batch、optimizer update 数、学习率曲线、验证设置和初始化 | 动作空间 | Legacy32 | Legacy32 | Unified80 | | prompt prefix | 无 | 无 | `Action Mode: joint.` | | max token length | 200 | 200 | 384 | -| pi05 32D head | 完整加载 | 完整加载 | 80D shape mismatch 部分随机初始化 | +| 默认初始化 | pi05,32D head 完整加载 | pi05,32D head 完整加载 | pi05,80D shape mismatch 部分随机初始化 | | global batch | 512 | 512 | 512 | | train steps | 20,000 | 20,000 | 20,000 | | warmup / decay | 1,000 / 30,000 | 1,000 / 30,000 | 1,000 / 30,000 | @@ -286,27 +260,13 @@ source scripts/atom0_env.sh ### 实验 1:Legacy32,只加入 Piper2 -先跑 20 steps smoke: - -```bash -cd /data/wudi/baige-cluster -export BOS_SOURCE=atom0-data/ -export BOS_MOUNT_PATH=/mnt/bos/bo23lu - -MODE=smoke CONFIG_NAME=cotrain_real_only_legacy32_aliyun_recipe \ -EXP_NAME=cotrain_real_only_legacy32_aliyun_recipe_b200_8gpu_b512_smoke \ -INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ -SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ -DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=0 \ -.venv/bin/python atom0_train_job.py -``` - 正式训练: ```bash cd /data/wudi/baige-cluster export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu +export PARAMS_PATH=/data/models/openpi MODE=train CONFIG_NAME=cotrain_real_only_legacy32_aliyun_recipe \ EXP_NAME=cotrain_real_only_legacy32_aliyun_recipe_b200_8gpu_b512_v1 \ @@ -319,30 +279,33 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ ### 实验 2:正式训练 1 的 Unified80,改用 Aliyun 20000 配方 -先跑 20 steps smoke: +从默认 pi05 初始化: ```bash cd /data/wudi/baige-cluster export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu +export PARAMS_PATH=/data/models/openpi -MODE=smoke CONFIG_NAME=cotrain_real_only_unified80_aliyun_recipe \ -EXP_NAME=cotrain_real_only_unified80_aliyun_recipe_b200_8gpu_b512_smoke \ +MODE=train CONFIG_NAME=cotrain_real_only_unified80_aliyun_recipe \ +EXP_NAME=cotrain_real_only_unified80_aliyun_recipe_b200_8gpu_b512_v1 \ INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ -SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ -DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=0 \ +NUM_TRAIN_STEPS=20000 WARMUP_STEPS=1000 DECAY_STEPS=30000 \ +EVAL_INTERVAL=1000 SAVE_INTERVAL=5000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ +DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py ``` -正式训练: +从 `cotrain_real_robot_fix_b200_0719/97727` 初始化一个全新的 Unified80 实验: ```bash cd /data/wudi/baige-cluster export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu +export PARAMS_PATH=/data/wudi/Atom-0/checkpoints/cotrain_real_robot_fix/cotrain_real_robot_fix_b200_0719/97727 MODE=train CONFIG_NAME=cotrain_real_only_unified80_aliyun_recipe \ -EXP_NAME=cotrain_real_only_unified80_aliyun_recipe_b200_8gpu_b512_v1 \ +EXP_NAME=cotrain_real_only_unified80_from_rrfix97727_b200_8gpu_b512_v1 \ INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ NUM_TRAIN_STEPS=20000 WARMUP_STEPS=1000 DECAY_STEPS=30000 \ EVAL_INTERVAL=1000 SAVE_INTERVAL=5000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ @@ -350,6 +313,12 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py ``` +这里的“从 97727 训练”是参数初始化,不是断点续训。启动脚本会把 step 目录解析为 +`97727/params`,只加载其中的模型参数,并从 step 0 重新创建 optimizer、EMA 容器和学习率调度。 +该 checkpoint 与本实验的 Unified80 模型参数树已核对为 51/51 个 leaf 形状一致,因此能够完整加载, +不会出现 pi05 32D action head 到 Unified80 head 的 shape mismatch。务必使用上面新的 +`EXP_NAME`;不要复用已有实验名。 + ### 运行后验收 每个正式任务都应在启动日志中打印: @@ -389,6 +358,7 @@ FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 NUM_TRAIN_STEPS=20000 cd /data/wudi/baige-cluster export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu +export PARAMS_PATH=/data/models/openpi MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_0719 \ INSTANCES=3 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1536 VAL_BATCH_SIZE=96 \ @@ -412,6 +382,8 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ ```bash # 仅自采真机数据:16 卡 cd /data/wudi/baige-cluster +export PARAMS_PATH=/data/models/openpi + MODE=train CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_16gpu_v1 \ INSTANCES=2 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1024 VAL_BATCH_SIZE=96 \ NUM_TRAIN_STEPS=5000 WARMUP_STEPS=100 DECAY_STEPS=5000 \ @@ -431,6 +403,8 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ ```bash # 自采真机 + 开源 Robot:16 卡 cd /data/wudi/baige-cluster +export PARAMS_PATH=/data/models/openpi + MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_16gpu_v1 \ INSTANCES=2 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1024 VAL_BATCH_SIZE=96 \ NUM_TRAIN_STEPS=146592 WARMUP_STEPS=7330 DECAY_STEPS=146592 \ diff --git a/scripts/preflight_cotrain_baige.py b/scripts/preflight_cotrain_baige.py index 46ca1d3..1a1aa90 100755 --- a/scripts/preflight_cotrain_baige.py +++ b/scripts/preflight_cotrain_baige.py @@ -19,7 +19,22 @@ } +def resolve_init_params_path(path: Path) -> Path: + """Resolve released params, a training step, or a training step's params child.""" + path = path.resolve() + if (path / "_CHECKPOINT_METADATA").is_file() and (path / "params" / "manifest.ocdbt").is_file(): + return path / "params" + if (path / "manifest.ocdbt").is_file() and ( + (path / "_CHECKPOINT_METADATA").is_file() or (path.parent / "_CHECKPOINT_METADATA").is_file() + ): + return path + raise AssertionError( + f"Invalid PARAMS_PATH={path}: expected released params, a training step, or its params/ child" + ) + + def validate(config_name: str, assets_base: Path, params_path: Path) -> None: + params_path = resolve_init_params_path(params_path) cfg = config.get_config(config_name) datasets = cfg.data.datasets ids = [dataset.uid for dataset in datasets] @@ -45,8 +60,7 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: if config_name in {"cotrain_real_robot_fix", "cotrain_full_all_full_norm"}: assert set(ids).isdisjoint(FIX_EXCLUDED_DATASET_IDS) - for marker in ("_CHECKPOINT_METADATA", "manifest.ocdbt"): - assert (params_path / marker).is_file(), params_path / marker + assert (params_path / "manifest.ocdbt").is_file(), params_path / "manifest.ocdbt" total_frames = 0 degenerate = [] @@ -93,7 +107,10 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: if bad.size: degenerate.append(f"{dataset.uid}:{key}:{bad.tolist()}") - print(f"PASS {config_name}: datasets={len(ids)}, source_frames={total_frames:,}") + print( + f"PASS {config_name}: datasets={len(ids)}, source_frames={total_frames:,}, " + f"init_params={params_path}" + ) for item in degenerate: print(f"WARN degenerate active quantile (smoke test must remain finite): {item}") diff --git a/scripts/train_cotrain_baige.sh b/scripts/train_cotrain_baige.sh index 45bcca4..b88d610 100755 --- a/scripts/train_cotrain_baige.sh +++ b/scripts/train_cotrain_baige.sh @@ -86,6 +86,33 @@ if [[ "${CONFIG_NAME}" == "cotrain_real_only_legacy32" || fi RANK_ID="${RANK:-0}" +# PARAMS_PATH controls model-weight initialization for a fresh EXP_NAME. Accept both +# released/exported parameter directories and a training step directory: +# /data/models/openpi +# checkpoints/// +# checkpoints////params +# Only the params item is loaded; train_state/optimizer/step are deliberately ignored. +REQUESTED_PARAMS_PATH="${PARAMS_PATH}" +if [[ -f "${REQUESTED_PARAMS_PATH}/_CHECKPOINT_METADATA" && + -f "${REQUESTED_PARAMS_PATH}/params/manifest.ocdbt" ]]; then + PARAMS_PATH="${REQUESTED_PARAMS_PATH}/params" + PARAMS_LAYOUT="training-step" +elif [[ -f "${REQUESTED_PARAMS_PATH}/manifest.ocdbt" && + -f "${REQUESTED_PARAMS_PATH}/_CHECKPOINT_METADATA" ]]; then + PARAMS_PATH="${REQUESTED_PARAMS_PATH}" + PARAMS_LAYOUT="released-params" +elif [[ -f "${REQUESTED_PARAMS_PATH}/manifest.ocdbt" && + -f "${REQUESTED_PARAMS_PATH}/../_CHECKPOINT_METADATA" ]]; then + PARAMS_PATH="${REQUESTED_PARAMS_PATH}" + PARAMS_LAYOUT="training-params" +else + echo "Invalid PARAMS_PATH=${REQUESTED_PARAMS_PATH}" >&2 + echo "Expected a released params directory, a training step directory, or its params/ child." >&2 + exit 2 +fi +PARAMS_PATH="$(readlink -f -- "${PARAMS_PATH}")" +export PARAMS_PATH + if [[ "${MODE}" == "smoke" ]]; then NUM_TRAIN_STEPS="${SMOKE_STEPS:-20}" WARMUP_STEPS="${SMOKE_WARMUP_STEPS:-2}" @@ -111,7 +138,6 @@ if (( VAL_BATCH_SIZE <= 0 || VAL_BATCH_SIZE % GLOBAL_DEVICE_COUNT != 0 )); then exit 2 fi -test -f "${PARAMS_PATH}/_CHECKPOINT_METADATA" test -f "${PARAMS_PATH}/manifest.ocdbt" test -d "${RLDS_DATA_DIR}" test -d "${ASSETS_BASE_DIR}/${ASSET_CONFIG_NAME}" @@ -162,6 +188,7 @@ mkdir -p "${LOG_DIR}" exec > >(tee -a "${LOG_DIR}/baige_${CONFIG_NAME}_${EXP_NAME}_rank${RANK_ID}.log") 2>&1 echo "CONFIG_NAME=${CONFIG_NAME} EXP_NAME=${EXP_NAME} MODE=${MODE}" echo "WORLD_SIZE=${WORLD_SIZE:-1} RANK=${RANK_ID} MASTER=${JAX_COORDINATOR_ADDRESS}" +echo "INIT_PARAMS_PATH=${PARAMS_PATH} PARAMS_LAYOUT=${PARAMS_LAYOUT} (model weights only; optimizer/step reset for fresh EXP_NAME)" echo "FSDP_DEVICES=${FSDP_DEVICES} BATCH_SIZE=${BATCH_SIZE} VAL_BATCH_SIZE=${VAL_BATCH_SIZE} NUM_TRAIN_STEPS=${NUM_TRAIN_STEPS}" exec .venv/bin/python -u scripts/train_cotrain.py "${args[@]}" From 9d8f09f76298d6ba2777a9d4fb0f334537165fce Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 27 Jul 2026 10:38:34 +0800 Subject: [PATCH 35/64] Use aligned EgoVerse action chunks for stage one --- .../action_chunk_metadata.json | 21 + .../egoverse_aria/norm_stats.json | 664 ++++++++++++++++++ .../egoverse_aria/unified_action_space.json | 5 + .../egoverse_eva/norm_stats.json | 664 ++++++++++++++++++ .../egoverse_eva/unified_action_space.json | 5 + .../egoverse_human/norm_stats.json | 664 ++++++++++++++++++ .../egoverse_human/unified_action_space.json | 5 + .../egoverse_mecka/norm_stats.json | 664 ++++++++++++++++++ .../egoverse_mecka/unified_action_space.json | 5 + ...00\346\234\257\346\226\207\346\241\243.md" | 7 +- docs/egoscale_staged_training.md | 27 +- ...00\346\234\257\350\247\204\350\214\203.md" | 8 +- scripts/check_egoscale_setup.py | 23 + scripts/compute_cotrain_norm_stats_light.py | 18 +- src/openpi/cotrain/action_space.py | 17 +- src/openpi/cotrain/config.py | 27 +- src/openpi/cotrain/rlds_dataset.py | 54 +- tests/cotrain/test_action_space.py | 14 + tests/cotrain/test_rlds_dataset.py | 37 + tests/cotrain/test_unified_config.py | 15 +- 20 files changed, 2925 insertions(+), 19 deletions(-) create mode 100644 assets/egoscale_stage1_ego_cartesian_clean/action_chunk_metadata.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean/egoverse_aria/norm_stats.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean/egoverse_aria/unified_action_space.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean/egoverse_eva/norm_stats.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean/egoverse_eva/unified_action_space.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean/egoverse_human/norm_stats.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean/egoverse_human/unified_action_space.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean/egoverse_mecka/norm_stats.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean/egoverse_mecka/unified_action_space.json create mode 100644 tests/cotrain/test_rlds_dataset.py diff --git a/assets/egoscale_stage1_ego_cartesian_clean/action_chunk_metadata.json b/assets/egoscale_stage1_ego_cartesian_clean/action_chunk_metadata.json new file mode 100644 index 0000000..c0fc015 --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean/action_chunk_metadata.json @@ -0,0 +1,21 @@ +{ + "version": 1, + "action_source": "actions_cartesian", + "source_action_horizon": 100, + "model_action_horizon": 50, + "resampling": "uniform_full_window", + "dataset_ids": [ + "egoverse_aria", + "egoverse_eva", + "egoverse_human", + "egoverse_mecka" + ], + "excluded_dataset_ids": [ + "egoverse_scale" + ], + "source": { + "branch": "dev/weizhongxing", + "commit": "e597d5a", + "assets_name": "cotrain_real_robot_ego_fix" + } +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean/egoverse_aria/norm_stats.json b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_aria/norm_stats.json new file mode 100644 index 0000000..4ff2258 --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_aria/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.12166035175323486, + 0.23119498789310455, + 0.4111783802509308, + -0.5298404693603516, + 0.44920289516448975, + 0.5565283298492432, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.23643210530281067, + 0.21523436903953552, + 0.4122660756111145, + 0.3888055384159088, + -0.38106709718704224, + 0.6427460312843323, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.08778028935194016, + 0.15163446962833405, + 0.13368120789527893, + 0.6714040040969849, + 0.3866713047027588, + 0.5079607367515564, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.09122937172651291, + 0.12792636454105377, + 0.12599395215511322, + 0.582551121711731, + 0.3378855288028717, + 0.4499942362308502, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.3689167526066303, + -0.054547168362140575, + 0.09931514641642572, + -2.4617583399295806, + -0.5316209133625031, + -0.7567985370635988, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.013067733407020554, + -0.04368885927200317, + 0.10875816532969476, + -1.0028089153289792, + -1.154629192495346, + -0.5534574932098391, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.08753183281421661, + 0.7393663897156717, + 0.6762258793920278, + 0.8783182964801783, + 1.310225102376938, + 1.8091314195632933, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.45415698641538627, + 0.5861799350023269, + 0.6513249461054802, + 1.9897053428649905, + 0.3179172328710558, + 1.8096286849975582, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.12074601650238037, + 0.23127269744873047, + 0.4086158573627472, + -0.5268499851226807, + 0.4486653506755829, + 0.5590476989746094, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.23527181148529053, + 0.2153901606798172, + 0.4092255234718323, + 0.3862147629261017, + -0.3803271949291229, + 0.645171046257019, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.09276538342237473, + 0.15471841394901276, + 0.14132468402385712, + 0.6763492822647095, + 0.3874964416027069, + 0.5263004302978516, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0987233966588974, + 0.13191889226436615, + 0.13414499163627625, + 0.5869997143745422, + 0.3407040536403656, + 0.46784698963165283, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.37511724073886876, + -0.06733995723724373, + 0.07096390113830564, + -2.4730586353302, + -0.5389193408966064, + -0.8180741324424745, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.05074397559165966, + -0.06282284736633303, + 0.08328107010126118, + -1.0480259569168089, + -1.1708042019844056, + -0.6295796968936922, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.11001674745082868, + 0.7423019834518432, + 0.6922297708511351, + 0.8796471023559569, + 1.3180414205551148, + 2.025689142227173, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.4544835112094878, + 0.5950588770866394, + 0.6731816347360611, + 1.975429588699341, + 0.3151969306945801, + 1.977904184818267, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } + } +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean/egoverse_aria/unified_action_space.json b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_aria/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_aria/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean/egoverse_eva/norm_stats.json b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_eva/norm_stats.json new file mode 100644 index 0000000..e6ae406 --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_eva/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2190004289150238, + -0.01304883137345314, + 0.21394658088684082, + -1.9095458984375, + -0.19596563279628754, + -1.419466495513916, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2360052466392517, + 0.02680254355072975, + 0.21276696026325226, + -1.916266679763794, + 0.13471189141273499, + -1.5923057794570923, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.10091721266508102, + 0.10360612720251083, + 0.06888390332460403, + 0.45155060291290283, + 0.36519327759742737, + 0.4060201644897461, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1073782742023468, + 0.11774510145187378, + 0.083305723965168, + 0.46599993109703064, + 0.3570115268230438, + 0.4728350341320038, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07179967370331287, + -0.2740250060558319, + 0.08771113557145, + -2.8700483612060546, + -1.2913335979938507, + -2.317228254318237, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07996378449304029, + -0.26061565375328066, + 0.08465802989006042, + -2.8858336179733275, + -0.6177014261245727, + -2.7656726984024047, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.48311578728854654, + 0.2508078234434127, + 0.3998115311957896, + -1.0920184017658237, + 0.4456321312904361, + -0.09932647967338548, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.534533993572928, + 0.3292458095788955, + 0.4653055617466569, + -1.0375731033325195, + 1.212061049461365, + -0.5427560737609864, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.22019365429878235, + -0.013202173635363579, + 0.21475966274738312, + -1.9115854501724243, + -0.1973499059677124, + -1.4179644584655762, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.23747846484184265, + 0.027177968993782997, + 0.21387891471385956, + -1.9178380966186523, + 0.13657420873641968, + -1.5925509929656982, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.10051397234201431, + 0.10388731211423874, + 0.06895716488361359, + 0.45243099331855774, + 0.36674046516418457, + 0.40779173374176025, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1066482812166214, + 0.11816641688346863, + 0.08349459618330002, + 0.4674621820449829, + 0.35862237215042114, + 0.47751733660697937, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07154435643851756, + -0.27418689156770704, + 0.08781253271102905, + -2.8701535339355466, + -1.294304462981224, + -2.318497973680496, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07960215345956385, + -0.2608030303299427, + 0.08477979813441634, + -2.886489329814911, + -0.6195968866348266, + -2.7708734118938447, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.4832434459209442, + 0.2508078234434127, + 0.4002171197541058, + -1.0895058629512788, + 0.4471175637841225, + -0.09426423907279924, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.534533993572928, + 0.3296205627322196, + 0.4655490982353687, + -1.0342174954414367, + 1.214405522346497, + -0.5290375106334686, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } + } +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean/egoverse_eva/unified_action_space.json b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_eva/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_eva/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean/egoverse_human/norm_stats.json b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_human/norm_stats.json new file mode 100644 index 0000000..6080f77 --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_human/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.1330566257238388, + 0.24941594898700714, + 0.3912067711353302, + -0.5117707848548889, + 0.4540312588214874, + 0.5344458818435669, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.22239437699317932, + 0.23018667101860046, + 0.40321943163871765, + -1.0734251737594604, + 0.40631866455078125, + -0.567889392375946, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.08491669595241547, + 0.14863893389701843, + 0.13072209060192108, + 0.665607213973999, + 0.38427573442459106, + 0.5125419497489929, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.09016702324151993, + 0.12886397540569305, + 0.1315808743238449, + 2.413289785385132, + 0.345689594745636, + 0.45598432421684265, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.37785880255699156, + -0.10297333164215094, + 0.06543110491633417, + -2.2986595950126647, + -0.4615935548305512, + -0.7673034253120425, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.012441163522005028, + -0.06359605151414871, + 0.08504984902143478, + -3.132793189573288, + -0.32782486844062797, + -1.9951087409973145, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.05176050739884375, + 0.7069211017608641, + 0.6560952421188355, + 0.9478633759498596, + 1.2835144963264464, + 2.1235865449905393, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.43256259637475025, + 0.5807454437494279, + 0.6534668659090995, + 3.1277673608303065, + 1.1876426827907562, + 0.5026934100627898, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.13209442794322968, + 0.24938827753067017, + 0.387939989566803, + -0.5071555972099304, + 0.4537590444087982, + 0.5403160452842712, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.22138313949108124, + 0.23027460277080536, + 0.39935484528541565, + -1.0899399518966675, + 0.4049857258796692, + -0.5746946334838867, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.09488733857870102, + 0.15424220263957977, + 0.14098116755485535, + 0.6701377630233765, + 0.38455674052238464, + 0.5300745964050293, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.10320556163787842, + 0.13505098223686218, + 0.14237873256206512, + 2.4028518199920654, + 0.34777238965034485, + 0.47335296869277954, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.4124593452453613, + -0.11575612220764153, + 0.030947245287895164, + -2.3122097148895264, + -0.46367396545410156, + -0.7979378693103794, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.09252005891799975, + -0.0849433012008669, + 0.04245689219236359, + -3.1302830075740813, + -0.32215781345367445, + -2.220473990869522, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.039014852523802546, + 0.7114729148864747, + 0.6777088600516317, + 0.9575540544509895, + 1.2854063110589982, + 2.293356660604477, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.40437775545120225, + 0.5969644649505614, + 0.6737304461598397, + 3.129026132106781, + 1.1957805883407593, + 0.5252715008735653, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } + } +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean/egoverse_human/unified_action_space.json b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_human/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_human/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean/egoverse_mecka/norm_stats.json b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_mecka/norm_stats.json new file mode 100644 index 0000000..662a55a --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_mecka/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.041311681270599365, + 0.02016034536063671, + 0.42764273285865784, + -0.30062398314476013, + 0.8043126463890076, + 0.7058155536651611, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.16585250198841095, + 0.011174505576491356, + 0.4123918116092682, + 0.0937289446592331, + -0.7642404437065125, + 1.0252869129180908, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.06677284091711044, + 0.0860026404261589, + 0.11104816198348999, + 1.4209537506103516, + 0.39864784479141235, + 1.3748582601547241, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07352157682180405, + 0.08598791807889938, + 0.11283272504806519, + 1.1708850860595703, + 0.41116347908973694, + 1.2039682865142822, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.24359868192076684, + -0.17205708267092706, + 0.20571585297584527, + -3.044824007701874, + -0.09930047750473037, + -2.861349939966202, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.008344786661863335, + -0.1877607287824154, + 0.19212565280497074, + -2.8387421497821808, + -1.488239255809784, + -2.794754576873779, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1004951382339001, + 0.23993051539659493, + 0.7305141133069992, + 3.0272344609260555, + 1.494115477538109, + 2.925446102714538, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.38663559036850936, + 0.22775880253314973, + 0.718777276083827, + 2.9580810029029854, + 0.22219988961219794, + 2.926661149692536, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0410047322511673, + 0.019869746640324593, + 0.42761027812957764, + -0.2989015281200409, + 0.8042927980422974, + 0.7061425447463989, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1656421273946762, + 0.011028534732758999, + 0.4124082028865814, + 0.09209282696247101, + -0.7644954919815063, + 1.0257295370101929, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07614587247371674, + 0.08977587521076202, + 0.11321776360273361, + 1.4226646423339844, + 0.3989226520061493, + 1.375699520111084, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0831696018576622, + 0.09024359285831451, + 0.1148906722664833, + 1.171791672706604, + 0.41162174940109253, + 1.2048040628433228, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.27464040846824644, + -0.18900329589843756, + 0.201951139831543, + -3.043574823951721, + -0.10428299293518073, + -2.8563359033584597, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.025380454158782872, + -0.2022279738187791, + 0.18923787055015562, + -2.8437695333480835, + -1.4884562452316283, + -2.797273115158081, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1306754380226136, + 0.25287380361557, + 0.7382136569499971, + 3.0272380673408508, + 1.493233833885193, + 2.9292208494186402, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.41612847385406515, + 0.23796629579067208, + 0.7276956573724747, + 2.9543535894393917, + 0.22295816173553473, + 2.925450050354004, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } + } +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean/egoverse_mecka/unified_action_space.json b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_mecka/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean/egoverse_mecka/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git "a/docs/cotrain_\346\212\200\346\234\257\346\226\207\346\241\243.md" "b/docs/cotrain_\346\212\200\346\234\257\346\226\207\346\241\243.md" index 6689979..3e01ee1 100644 --- "a/docs/cotrain_\346\212\200\346\234\257\346\226\207\346\241\243.md" +++ "b/docs/cotrain_\346\212\200\346\234\257\346\226\207\346\241\243.md" @@ -126,7 +126,12 @@ RLDS/inspect_cotrain_datasets.py # 数据集动作语义实测脚本 - **动作表示 = 绝对笛卡尔双手 EEF 位姿(12 维)**。人手没有统一关节定义,cartesian 是 ego 的自然表示(不是为了对齐机器人)。layout:`左 xyz + 欧拉角(yaw/pitch/roll),右 xyz + 欧拉角`。 - **相机缺失处理**(`_egoverse_mecka_restructure`):mecka 只有 1 路相机,两个 wrist 槽填 blank JPEG 并设 `image_mask=False`,让模型不 attend 不存在的相机。 -- **监督信号**:实测 `action[t] == state[t]`(单步动作 = 当前态),但**管线 chunk 未来 H 步**(`actions[t:t+H]`,chunk size = action_horizon),所以 target 是未来轨迹 = 有效监督。**无需用预存的 `actions_cartesian`**。 +- **监督信号**:实测 `action[t] == actions_cartesian[t,0]`。生产 Stage 1 使用 + RLDS 已对齐的 `actions_cartesian[T,100,12]`,在完整物理时间窗上均匀重采样为 + `[T,50,12]`;不再用相邻 episode 帧 `action[t:t+H]` 拼接,因为 moving head frame + 下相邻帧 pose 可能不在同一坐标系。 +- **Scale 子集**:当前 BOS 版本存在极端 pose tails,已从 `egoscale_stage1_ego` 暂时 + 排除;保留 mapping 和旧混合配置,等待重处理数据后重新审计。 - **prompt 字段**:EgoVerse 用 `prompt`,真机用 `task`(restructure 里分别取)。 **设计定位(关键,尚未实现)**:EgoVerse 的真正杠杆是 **domain anchor**(ego 与真机共享任务 / 场景),不是动作空间对齐。原文显示增益(+30%)只在有锚点时出现。当前是把 ego 当通用数据混入,**anchor 对齐 + 有效性消融(real-only / +ego / +anchor)是下一阶段的核心工作,目前尚未开展**。 diff --git a/docs/egoscale_staged_training.md b/docs/egoscale_staged_training.md index b70625a..4597918 100644 --- a/docs/egoscale_staged_training.md +++ b/docs/egoscale_staged_training.md @@ -4,7 +4,7 @@ | 阶段 | 配置 | 数据 | 初始化 | |---|---|---|---| -| Stage 1 | `egoscale_stage1_ego` | EgoVerse 5 个 builder | 32D `pi05_base` shape-safe 加载到 80D | +| Stage 1 | `egoscale_stage1_ego` | EgoVerse 4 个干净 builder(暂不含 Scale) | 32D `pi05_base` shape-safe 加载到 80D | | Stage 2 baseline | `egoscale_stage2_robot` | full-all 去掉全部 EgoVerse | Stage 1 严格 checkpoint | | Stage 2 aligned | `egoscale_stage2_aligned` | 新采 human/robot EEF+gripper | Stage 1 严格 checkpoint | | Stage 3 | `egoscale_stage3_robot` | robot-only | aligned Stage 2 严格 checkpoint | @@ -63,10 +63,15 @@ EEF 保持项目最新版统一动作空间约定:absolute `xyz + yaw/pitch/ro ## Norm stats -Stage 1 直接复用 wudi 已提交的 `assets/cotrain_full_all_full_norm` 中 5 个 EgoVerse stats; -robot 阶段复用经过数据审计的 `assets/cotrain_real_robot_fix`。它们都已随 Git 仓库提供, -`ASSETS_BASE_DIR` 默认就是仓库内的 `assets`,无需在 DSW 重新计算。未来新增 aligned builder -时,才需要先计算它自己的 smoke stats: +Stage 1 使用专用的 +`assets/egoscale_stage1_ego_cartesian_clean`:aria、eva、human、mecka 的统计量来自官方 +`actions_cartesian`,并带有 `action_chunk_metadata.json`。当前 BOS 中的 Scale 子集具有异常 +pose tails,已从生产 Stage 1 暂时排除,但 mapping 和旧配置仍保留,待数据重处理后重新审计。 +旧的 `assets/cotrain_full_all_full_norm` 是按相邻帧 `action` 计算,不能用于新的 Stage 1。 + +robot 阶段继续复用经过数据审计的 `assets/cotrain_real_robot_fix`。这些统计量都已随 Git +仓库提供,`ASSETS_BASE_DIR` 默认就是仓库内的 `assets`。未来新增 aligned builder 时,才需要 +先计算它自己的 smoke stats: ```bash uv run --group rlds python scripts/compute_cotrain_norm_stats_light.py \ @@ -79,6 +84,18 @@ uv run --group rlds python scripts/compute_cotrain_norm_stats_light.py \ robot/aligned 阶段替换 config name 即可。正式训练前必须运行 `compute_cotrain_full_norm_stats_light.py` 得到全量统计,不能把 probe stats 用于论文实验。 +## Stage 1 动作语义 + +Stage 1 的 state 和 action 仍是 absolute 双手 EEF +`xyz + yaw/pitch/roll`,不做 delta。区别在时间维:RLDS 的 +`actions_cartesian[t]` 已提供与当前帧对齐的 100 步未来轨迹,且第 0 步等于 +`action[t]`。loader 将完整 100 步时间窗均匀重采样为模型的 50 步 horizon,不再从相邻 +episode 帧重新拼接。这样避免移动 head frame 下相邻帧 pose 坐标系不一致。 + +动作表示、数据 mixture 和 norm 均已改变,因此以前使用 5 个 builder 训练得到的 Stage 1 +checkpoint **不能 resume**。新训练必须使用新的 `EXP_NAME`、`RESUME=0`,从 +`pi05_base` 重新初始化。 + ## DSW smoke ```bash diff --git "a/docs/\346\250\241\345\236\213\350\276\223\345\205\245\350\276\223\345\207\272\346\212\200\346\234\257\350\247\204\350\214\203.md" "b/docs/\346\250\241\345\236\213\350\276\223\345\205\245\350\276\223\345\207\272\346\212\200\346\234\257\350\247\204\350\214\203.md" index ab4b6ef..a299529 100644 --- "a/docs/\346\250\241\345\236\213\350\276\223\345\205\245\350\276\223\345\207\272\346\212\200\346\234\257\350\247\204\350\214\203.md" +++ "b/docs/\346\250\241\345\236\213\350\276\223\345\205\245\350\276\223\345\207\272\346\212\200\346\234\257\350\247\204\350\214\203.md" @@ -604,11 +604,14 @@ active action slots 7:13 and 36:42 (0-based, end-exclusive) active dimensions 12 inactive dimensions 68 action semantics absolute left/right EEF position + Euler +action source actions_cartesian[T,100,12] uniformly resampled to 50 prompt prefix Action Mode: eef. EEF Frame: . ``` 仅 Eva 等带真实 wrist camera 的子集对应 wrist masks 为 True;其他 Ego 子集的 wrist images 是 masked -placeholder。loss 只在 12 个 EEF 槽上计算。 +placeholder。loss 只在 12 个 EEF 槽上计算。生产 `egoscale_stage1_ego` 当前使用 +aria/eva/human/mecka 四个 builder;Scale 因异常 pose tails 暂时排除。旧 +`cotrain_full_all_full_norm` 仍保留历史的相邻帧 action 语义。 ### 11.2 Piper 样本 @@ -660,7 +663,8 @@ active dimensions 8 - 缺失 action mask → 全 80 维有效; - 缺失整个 dataset norm 目录 → 跳过该 dataset normalization; - 缺失 image mask → 模型预处理默认该图像有效; -- episode 尾部 future action 不足 → 重复最后动作。 +- 普通机器人数据 episode 尾部 future action 不足 → 重复最后动作;使用预切片 + `actions_cartesian` 的 Stage 1 不走该 fallback。 --- diff --git a/scripts/check_egoscale_setup.py b/scripts/check_egoscale_setup.py index eec2972..f9fdf95 100755 --- a/scripts/check_egoscale_setup.py +++ b/scripts/check_egoscale_setup.py @@ -5,6 +5,7 @@ import argparse import dataclasses +import json import os from pathlib import Path import sys @@ -66,6 +67,28 @@ def main() -> int: except ValueError as exc: failures.append(str(exc)) + precomputed_datasets = [dataset for dataset in datasets if dataset.precomputed_action_chunk] + if precomputed_datasets and not args.allow_missing_norm_stats: + metadata_path = assets_root / "action_chunk_metadata.json" + if not metadata_path.exists(): + failures.append(f"missing precomputed action metadata: {metadata_path}") + else: + metadata = json.loads(metadata_path.read_text()) + expected = { + "version": 1, + "action_source": "actions_cartesian", + "source_action_horizon": 100, + "model_action_horizon": config.model.action_horizon, + "resampling": "uniform_full_window", + "dataset_ids": sorted(dataset.uid for dataset in precomputed_datasets), + } + actual = {key: metadata.get(key) for key in expected} + if actual != expected: + failures.append( + f"precomputed action metadata mismatch at {metadata_path}: " + f"expected {expected}, got {actual}" + ) + params_path = args.params_path if params_path is None and args.config_name == "egoscale_stage1_ego": params_path = os.environ.get("ATOM_PI05_BASE_PARAMS") diff --git a/scripts/compute_cotrain_norm_stats_light.py b/scripts/compute_cotrain_norm_stats_light.py index c43c17f..56d5085 100644 --- a/scripts/compute_cotrain_norm_stats_light.py +++ b/scripts/compute_cotrain_norm_stats_light.py @@ -4,7 +4,7 @@ same state/action semantics while avoiding image and prompt materialization: RLDS -> lightweight state/action restructure -> state/action index selection - -> action chunking -> per-dataset delta actions -> RunningStats + -> action chunk/resample -> per-dataset delta actions -> RunningStats Use --verify-against-old on a small frame count to compare against the original full pipeline before computing production stats. @@ -49,6 +49,14 @@ def _light_restructure(traj, dataset_id: str, restructure_name: str): "dataset_id": tf.fill([n], dataset_id), } + if restructure_name == "egoverse_cartesian_chunk": + n = tf.shape(traj["actions_cartesian"])[0] + return { + "actions": traj["actions_cartesian"], + "state": traj["observation"]["state"], + "dataset_id": tf.fill([n], dataset_id), + } + # All currently registered full-data schemas store proprio/action in this layout. if restructure_name in { "agibot", @@ -158,7 +166,13 @@ def select_state_actions(traj): ) elif dataset_cfg.state_indices is not None or dataset_cfg.action_indices is not None: dataset = dataset.traj_map(select_state_actions, num_parallel_calls) - dataset = dataset.traj_map(chunk_actions, num_parallel_calls) + if dataset_cfg.precomputed_action_chunk: + dataset = dataset.traj_map( + lambda traj: cotrain_rlds_dataset.resample_precomputed_action_chunk(traj, action_horizon), + num_parallel_calls, + ) + else: + dataset = dataset.traj_map(chunk_actions, num_parallel_calls) dataset = dataset.flatten(num_parallel_calls=num_parallel_calls) else: # Legacy DROID path, kept for compatibility with older cotrain configs. diff --git a/src/openpi/cotrain/action_space.py b/src/openpi/cotrain/action_space.py index ab4e19c..4b79d9a 100644 --- a/src/openpi/cotrain/action_space.py +++ b/src/openpi/cotrain/action_space.py @@ -178,25 +178,34 @@ def apply_delta(state: np.ndarray, actions: np.ndarray, mask) -> np.ndarray: def map_trajectory_tensorflow(traj: dict, spec: UnifiedActionSpec) -> dict: - """Map trajectory-level TensorFlow state/actions and attach the action mask.""" + """Map the final axis of trajectory tensors and attach a per-frame action mask. + + State is normally ``[T, D]``. Actions may be either ``[T, D]`` for datasets + chunked by this loader, or ``[T, H, D]`` when the RLDS already contains an + aligned future-action chunk (EgoVerse ``actions_cartesian``). + """ import tensorflow as tf # noqa: PLC0415 def map_tensor(tensor, mapping: DimMapping): + tensor = tf.convert_to_tensor(tensor) if not mapping: - return tf.zeros([tf.shape(tensor)[0], UNIFIED_ACTION_DIM], tensor.dtype) + return tf.zeros( + tf.concat([tf.shape(tensor)[:-1], [UNIFIED_ACTION_DIM]], axis=0), + tensor.dtype, + ) sources, targets = zip(*mapping, strict=True) tf.debugging.assert_less(max(sources), tf.shape(tensor)[-1]) selected = tf.gather(tensor, tf.constant(sources, tf.int32), axis=-1) projection = tf.one_hot(targets, UNIFIED_ACTION_DIM, dtype=tensor.dtype) mapped = tf.linalg.matmul(selected, projection) - mapped.set_shape([None, UNIFIED_ACTION_DIM]) + mapped.set_shape(tensor.shape[:-1].concatenate([UNIFIED_ACTION_DIM])) return mapped traj["state"] = map_tensor(traj["state"], spec.state_mapping) traj["actions"] = map_tensor(traj["actions"], spec.action_mapping) traj["action_mask"] = tf.broadcast_to( tf.constant(spec.action_mask, tf.bool), - [tf.shape(traj["actions"])[0], UNIFIED_ACTION_DIM], + [tf.shape(traj["state"])[0], UNIFIED_ACTION_DIM], ) return traj diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 839c30d..a57901b 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -913,6 +913,26 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): ) _EGOVERSE_DATASET_IDS = {dataset.uid for dataset in _EGOVERSE_FULL_DATA.datasets} +# The current BOS copy of EgoVerse Scale has extreme pose tails and caused repeated +# full-run loss/gradient spikes. Keep it registered for audit/reprocessing, but exclude +# it from the production Stage 1 recipe. The four retained builders use the official +# per-frame 100-step actions_cartesian trajectory instead of reconstructing a horizon +# from adjacent episode frames. +_EGOSCALE_STAGE1_EXCLUDED_DATASET_IDS = frozenset({"egoverse_scale"}) +_EGOSCALE_STAGE1_EGO_DATA = dataclasses.replace( + _EGOVERSE_FULL_DATA, + datasets=tuple( + dataclasses.replace( + dataset, + restructure_name="egoverse_cartesian_chunk", + precomputed_action_chunk=True, + ) + for dataset in _drop_dataset_ids_and_renormalize( + _EGOVERSE_FULL_DATA.datasets, + _EGOSCALE_STAGE1_EXCLUDED_DATASET_IDS, + ) + ), +) # Use wudi's audited production robot mixture for staged robot adaptation. _ROBOT_ALL_DATA = _REAL_ROBOT_FIX_DATA @@ -1000,7 +1020,7 @@ def _strict_stage_checkpoint_loader() -> _weight_loaders.CheckpointWeightLoader: _EGOSCALE_STAGE1_EGO = dataclasses.replace( _REAL_ONLY_PI05, name="egoscale_stage1_ego", - data=_EGOVERSE_FULL_DATA, + data=_EGOSCALE_STAGE1_EGO_DATA, lr_schedule=_optimizer.CosineDecaySchedule( warmup_steps=2_000, peak_lr=2.5e-5, @@ -1010,8 +1030,9 @@ def _strict_stage_checkpoint_loader() -> _weight_loaders.CheckpointWeightLoader: num_train_steps=100_000, save_interval=5_000, keep_period=10_000, - # wudi's completed full-all stats contain all five EgoVerse builders. - norm_stats_assets_name="cotrain_full_all_full_norm", + # Dedicated stats computed from actions_cartesian. The old full-all stats used + # adjacent-frame `action` chunks and must not be reused with this representation. + norm_stats_assets_name="egoscale_stage1_ego_cartesian_clean", ) _EGOSCALE_STAGE2_ROBOT = dataclasses.replace( diff --git a/src/openpi/cotrain/rlds_dataset.py b/src/openpi/cotrain/rlds_dataset.py index f58d069..8778bb2 100644 --- a/src/openpi/cotrain/rlds_dataset.py +++ b/src/openpi/cotrain/rlds_dataset.py @@ -88,6 +88,10 @@ class CotrainRLDSDataset: # for per-dataset normalization / delta dispatch, and used as the norm-stats subdir and the # key for per-dataset val loaders / weights / action dims. Defaults to `name`. dataset_id: str = "" + # True when restructure emits an already time-aligned action chunk [T, source_horizon, D]. + # The loader uniformly resamples that source horizon to the model horizon instead of + # gathering consecutive trajectory frames a second time. + precomputed_action_chunk: bool = False @property def uid(self) -> str: @@ -508,6 +512,19 @@ def _egoverse_full_restructure(traj, dataset_id: str): } +def _egoverse_cartesian_chunk_restructure(traj, dataset_id: str): + """EgoVerse schema using its official aligned future Cartesian trajectory. + + ``actions_cartesian[t]`` is a 100-step future trajectory aligned to frame + ``t``. Its first element equals ``action[t]``. Keeping this as rank three + prevents the generic loader from incorrectly rebuilding the horizon from + adjacent episode frames, whose poses may use different moving head frames. + """ + output = _egoverse_full_restructure(traj, dataset_id) + output["actions"] = traj["actions_cartesian"] + return output + + def _robocoin_restructure(traj, dataset_id: str): """RoboCOIN schema -> common co-training keys. @@ -616,11 +633,40 @@ def image_or_blank(key): "egoverse_eva": _egoverse_eva_restructure, "egoverse_mecka": _egoverse_mecka_restructure, "egoverse_full": _egoverse_full_restructure, + "egoverse_cartesian_chunk": _egoverse_cartesian_chunk_restructure, "robocoin": _robocoin_restructure, "robomind_full": _robomind_full_restructure, } +def resample_precomputed_action_chunk(traj: dict, action_chunk_size: int) -> dict: + """Uniformly resample ``[T, source_horizon, D]`` actions to model horizon. + + EgoVerse stores 100 samples over its complete physical prediction window. + For pi0's 50-step horizon we retain both endpoints and sample across that + entire window, rather than taking only its first half. + """ + if action_chunk_size <= 0: + raise ValueError(f"action_chunk_size must be positive, got {action_chunk_size}") + import tensorflow as tf + + actions = tf.convert_to_tensor(traj["actions"]) + tf.debugging.assert_rank( + actions, + 3, + message="precomputed_action_chunk requires actions shaped [T, source_horizon, D]", + ) + source_horizon = tf.shape(actions)[1] + tf.debugging.assert_positive(source_horizon, message="precomputed action horizon must be non-empty") + indices = tf.cast( + tf.round(tf.linspace(0.0, tf.cast(source_horizon - 1, tf.float32), action_chunk_size)), + tf.int32, + ) + traj["actions"] = tf.gather(actions, indices, axis=1) + traj["actions"].set_shape([actions.shape[0], action_chunk_size, actions.shape[-1]]) + return traj + + class CotrainRldsDataset: def __init__( self, @@ -741,7 +787,13 @@ def _prepare_standardized(dataset, dataset_cfg: CotrainRLDSDataset): # so heterogeneous-dim datasets share one element spec. if pad_action_dim is not None and dataset_cfg.unified_action_spec is None: dataset = dataset.traj_map(_pad_state_actions, num_parallel_calls) - dataset = dataset.traj_map(_chunk_actions, num_parallel_calls) + if dataset_cfg.precomputed_action_chunk: + dataset = dataset.traj_map( + lambda traj: resample_precomputed_action_chunk(traj, action_chunk_size), + num_parallel_calls, + ) + else: + dataset = dataset.traj_map(_chunk_actions, num_parallel_calls) return dataset.flatten(num_parallel_calls=num_parallel_calls) def prepare_single_dataset(dataset_cfg: CotrainRLDSDataset): diff --git a/tests/cotrain/test_action_space.py b/tests/cotrain/test_action_space.py index 6e8177f..1937452 100644 --- a/tests/cotrain/test_action_space.py +++ b/tests/cotrain/test_action_space.py @@ -199,6 +199,20 @@ def test_tensorflow_trajectory_mapping() -> None: np.testing.assert_array_equal(mapped["action_mask"].numpy(), np.broadcast_to(spec.action_mask, (2, 80))) +def test_tensorflow_trajectory_mapping_preserves_precomputed_horizon() -> None: + tf = pytest.importorskip("tensorflow") + spec = action_space.UNIFIED_ACTION_SPECS["egoverse_eva"] + state = np.arange(24, dtype=np.float32).reshape(2, 12) + actions = np.arange(2 * 3 * 12, dtype=np.float32).reshape(2, 3, 12) + mapped = action_space.map_trajectory_tensorflow( + {"state": tf.constant(state), "actions": tf.constant(actions)}, + spec, + ) + assert mapped["actions"].shape == (2, 3, action_space.UNIFIED_ACTION_DIM) + np.testing.assert_array_equal(mapped["actions"].numpy(), action_space.map_array(actions, spec.action_mapping)) + np.testing.assert_array_equal(mapped["action_mask"].numpy(), np.broadcast_to(spec.action_mask, (2, 80))) + + def test_delta_is_applied_once_only_to_declared_slots() -> None: spec = action_space.UNIFIED_ACTION_SPECS["piper30"] state = np.arange(80, dtype=np.float32) diff --git a/tests/cotrain/test_rlds_dataset.py b/tests/cotrain/test_rlds_dataset.py new file mode 100644 index 0000000..49f43ff --- /dev/null +++ b/tests/cotrain/test_rlds_dataset.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +import numpy as np +import pytest + +from openpi.cotrain import rlds_dataset + + +def test_resample_precomputed_action_chunk_uses_full_source_window() -> None: + tf = pytest.importorskip("tensorflow") + actions = np.arange(100, dtype=np.float32).reshape(1, 100, 1) + output = rlds_dataset.resample_precomputed_action_chunk( + {"actions": tf.constant(actions)}, + action_chunk_size=5, + ) + np.testing.assert_array_equal( + output["actions"].numpy().reshape(-1), + np.array([0, 25, 50, 74, 99], dtype=np.float32), + ) + assert output["actions"].shape == (1, 5, 1) + + +def test_resample_precomputed_action_chunk_rejects_rank_two_actions() -> None: + tf = pytest.importorskip("tensorflow") + with pytest.raises(tf.errors.InvalidArgumentError, match="precomputed_action_chunk"): + rlds_dataset.resample_precomputed_action_chunk( + {"actions": tf.zeros([10, 12], tf.float32)}, + action_chunk_size=5, + ) + + +def test_resample_precomputed_action_chunk_rejects_nonpositive_model_horizon() -> None: + with pytest.raises(ValueError, match="must be positive"): + rlds_dataset.resample_precomputed_action_chunk( + {"actions": np.zeros([1, 100, 12], dtype=np.float32)}, + action_chunk_size=0, + ) diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index 92c6d85..bbd82d9 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -120,7 +120,20 @@ def test_robot_stage_excludes_all_egoverse_datasets() -> None: def test_staged_configs_use_expected_data_and_strict_checkpoint_loader() -> None: - assert {dataset.uid for dataset in config._EGOSCALE_STAGE1_EGO.data.datasets} == config._EGOVERSE_DATASET_IDS + stage1_datasets = config._EGOSCALE_STAGE1_EGO.data.datasets + assert {dataset.uid for dataset in stage1_datasets} == { + "egoverse_aria", + "egoverse_eva", + "egoverse_human", + "egoverse_mecka", + } + assert {dataset.uid for dataset in stage1_datasets}.isdisjoint( + config._EGOSCALE_STAGE1_EXCLUDED_DATASET_IDS + ) + assert sum(dataset.weight for dataset in stage1_datasets) == pytest.approx(1.0) + assert all(dataset.restructure_name == "egoverse_cartesian_chunk" for dataset in stage1_datasets) + assert all(dataset.precomputed_action_chunk for dataset in stage1_datasets) + assert config._EGOSCALE_STAGE1_EGO.norm_stats_assets_name == "egoscale_stage1_ego_cartesian_clean" assert config._EGOSCALE_STAGE2_ROBOT.data is config._ROBOT_ALL_DATA assert config._EGOSCALE_STAGE2_ALIGNED.data is config._ALIGNED_PARALLEL_GRIPPER_DATA assert config._EGOSCALE_STAGE3_ROBOT.data is config._ROBOT_ALL_DATA From 529dc62e4660b54a38727e90696c37fba0832502 Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 27 Jul 2026 10:40:16 +0800 Subject: [PATCH 36/64] Fix TensorFlow rank assertion test --- tests/cotrain/test_rlds_dataset.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/cotrain/test_rlds_dataset.py b/tests/cotrain/test_rlds_dataset.py index 49f43ff..ed8f988 100644 --- a/tests/cotrain/test_rlds_dataset.py +++ b/tests/cotrain/test_rlds_dataset.py @@ -22,7 +22,9 @@ def test_resample_precomputed_action_chunk_uses_full_source_window() -> None: def test_resample_precomputed_action_chunk_rejects_rank_two_actions() -> None: tf = pytest.importorskip("tensorflow") - with pytest.raises(tf.errors.InvalidArgumentError, match="precomputed_action_chunk"): + # TensorFlow raises ValueError when the static rank is known, InvalidArgumentError + # when the same assertion is evaluated from a traced/dynamic shape. + with pytest.raises((ValueError, tf.errors.InvalidArgumentError), match="precomputed_action_chunk"): rlds_dataset.resample_precomputed_action_chunk( {"actions": tf.zeros([10, 12], tf.float32)}, action_chunk_size=5, From 10813f99e53918a348a35ae6661b4e22d2c9c4a9 Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 27 Jul 2026 15:23:42 +0800 Subject: [PATCH 37/64] Add EgoMimic stage two adapter --- docs/egomimic_stage2.md | 258 +++++++++++++ scripts/check_egoscale_setup.py | 31 +- scripts/compute_cotrain_norm_stats_light.py | 21 +- scripts/convert_egomimic_hdf5_to_rlds.py | 396 ++++++++++++++++++++ scripts/run_egoscale_stage.sh | 1 + src/openpi/cotrain/action_space.py | 39 ++ src/openpi/cotrain/config.py | 57 +++ src/openpi/cotrain/rlds_dataset.py | 41 ++ tests/cotrain/test_action_space.py | 64 +++- tests/cotrain/test_unified_config.py | 10 + 10 files changed, 908 insertions(+), 10 deletions(-) create mode 100644 docs/egomimic_stage2.md create mode 100644 scripts/convert_egomimic_hdf5_to_rlds.py diff --git a/docs/egomimic_stage2.md b/docs/egomimic_stage2.md new file mode 100644 index 0000000..39ac6e1 --- /dev/null +++ b/docs/egomimic_stage2.md @@ -0,0 +1,258 @@ +# EgoMimic Stage 2 接入与训练 + +## 结论 + +EgoMimic 不能复用项目中预留的双臂 14D +`EEF xyz+ypr+gripper` aligned contract。公开文件的真实监督是: + +| 域 | observation | 100-step future action | +|---|---|---| +| human,单臂任务 | 当前相机坐标系中的手部 XYZ,3D | `actions_xyz_act[100,3]` | +| robot,单臂任务 | 6 arm joints + 1 gripper + EEF XYZ,10D | `actions_joints_act[100,7] + actions_xyz_act[100,3]` | +| human,双臂任务 | 左右手 XYZ,6D | `actions_xyz_act[100,6]` | +| robot,双臂任务 | 双臂 joint/gripper + 左右 EEF XYZ,20D | `actions_joints_act[100,14] + actions_xyz_act[100,6]` | + +因此 Atom 的适配方式是: + +- human 和 robot 的 XYZ 写入相同的 EEF position slots; +- robot 样本额外监督 arm joint 和 gripper slots; +- robot arm absolute joint target 在 normalization 前转成 delta; +- gripper 和 EEF XYZ 保持 absolute; +- Euler、human gripper 等不存在的标签保持 `mask=0`; +- human/robot 使用独立 norm stats; +- 官方 100-point future trajectory 均匀重采样到 Pi0.5 的 50-step horizon。 + +第一轮流程使用最小的 groceries 人机配对数据。配置名为 +`egoscale_stage2_egomimic`,启动 stage 名为 `stage2_egomimic`。 + +> 数据授权注意:截至接入时,Hugging Face 数据集页面没有声明 dataset +> license。EgoMimic 代码仓库的 MIT license 不自动等价于数据授权。公开 +> 数据可先用于内部研究验证,进一步发布模型或再分发数据前应向作者确认。 + +## 一、下载 groceries 人机数据 + +百度环境无法直接访问 Hugging Face 时使用国内镜像: + +```bash +mkdir -p /data/junhe/datasets/EgoMimic + +HF_ENDPOINT=https://hf-mirror.com \ +/data/junhe/Atom-0/.venv/bin/huggingface-cli download \ + gatech/EgoMimic \ + --repo-type dataset \ + --include groceries_human.hdf5 groceries_robot.hdf5 \ + --local-dir /data/junhe/datasets/EgoMimic +``` + +下载中断时重复同一命令即可从 `.incomplete` 文件续传。 + +完整性检查: + +```bash +ls -lh \ + /data/junhe/datasets/EgoMimic/groceries_human.hdf5 \ + /data/junhe/datasets/EgoMimic/groceries_robot.hdf5 +``` + +## 二、转换 smoke RLDS + +先只转换少量 episode,验证 schema、图像、split、mapping 和训练链路: + +```bash +cd /data/junhe/Atom-0 + +.venv/bin/python scripts/convert_egomimic_hdf5_to_rlds.py \ + --source-hdf5 /data/junhe/datasets/EgoMimic/groceries_human.hdf5 \ + --output-data-dir /data/junhe/RLDS/EgoMimic_smoke \ + --max-train-episodes 2 \ + --max-validation-episodes 1 + +.venv/bin/python scripts/convert_egomimic_hdf5_to_rlds.py \ + --source-hdf5 /data/junhe/datasets/EgoMimic/groceries_robot.hdf5 \ + --output-data-dir /data/junhe/RLDS/EgoMimic_smoke \ + --max-train-episodes 2 \ + --max-validation-episodes 1 +``` + +生成目录: + +```text +/data/junhe/RLDS/EgoMimic_smoke/ +└── ego_mimic_rlds/ + ├── groceries_human/1.0.0/ + └── groceries_robot/1.0.0/ +``` + +转换器使用官方 `mask/train` 和 `mask/valid`。EgoMimic 没有语义上的 +unseen split,因此当前 `seen_test` 和 `unseen_test` 都来自官方 valid。 +`unseen` 指标只用于保持训练器接口完整,不能作为 unseen-task 结果汇报。 + +## 三、计算 smoke norm stats + +smoke stats 与正式 stats 分开,避免少量样本统计污染正式训练: + +```bash +cd /data/junhe/Atom-0 + +export ATOM_EGOMIMIC_RLDS_ROOT=/data/junhe/RLDS/EgoMimic_smoke +export ASSETS_BASE_DIR=/data/junhe/smoke-assets + +.venv/bin/python scripts/compute_cotrain_norm_stats_light.py \ + --config-name egoscale_stage2_egomimic \ + --exp-name egomimic_groceries_smoke_norm \ + --assets-base-dir "$ASSETS_BASE_DIR" \ + --max-frames 4096 +``` + +应生成: + +```text +/data/junhe/smoke-assets/egoscale_stage2_egomimic_groceries/ +├── action_chunk_metadata.json +├── egomimic_groceries_human/ +│ ├── norm_stats.json +│ └── unified_action_space.json +└── egomimic_groceries_robot/ + ├── norm_stats.json + └── unified_action_space.json +``` + +## 四、Stage 2 smoke + +从一个已经完成写入的 Stage 1 checkpoint 初始化,例如: + +```text +/data/junhe/checkpoints/egoscale_stage1_ego/ + stage1_ego_cartesian_clean_baidu_v2/5000/params +``` + +不要读取 `.orbax-checkpoint-tmp-*`,也不要读取正在写入的 step。 + +下发器环境: + +```bash +cd /data/junhe/baige-cluster +source /data/junhe/.venvs/baige-py311/bin/activate + +set -a +source .env +set +a + +export PFS_NAME=pfs-AndjNd + +export MODE=smoke +export STAGE=stage2_egomimic +export EXP_NAME=stage2_egomimic_groceries_smoke_v1 + +export INSTANCES=1 +export GPU_PER_NODE=8 +export FSDP_DEVICES=8 +export BATCH_SIZE=16 +export NUM_TRAIN_STEPS=100 + +export PARAMS_PATH=/data/junhe/checkpoints/egoscale_stage1_ego/stage1_ego_cartesian_clean_baidu_v2/5000/params +export ATOM_EGOMIMIC_RLDS_ROOT=/data/junhe/RLDS/EgoMimic_smoke +export ASSETS_BASE_DIR=/data/junhe/smoke-assets +export CHECKPOINT_BASE_DIR=/data/junhe/checkpoints + +export DATA_NUM_PARALLEL_READS=1 +export DATA_NUM_PARALLEL_CALLS=2 +export SHUFFLE_BUFFER_SIZE=128 + +export SAVE_INTERVAL=50 +export EVAL_INTERVAL=50 +export NUM_VAL_BATCHES=1 +export RUN_ACTION_MSE=0 + +export WANDB_ENABLED=0 +export OVERWRITE=1 +export RESUME=0 + +python atom0_jax_job.py +``` + +验收项: + +- strict loader 完整加载 Stage 1 80D params; +- human batch 只激活右 EEF XYZ 三个 action slots; +- robot batch 激活右臂 6 joints、gripper、右 EEF XYZ; +- robot joint 走 absolute-to-delta,gripper/XYZ 保持 absolute; +- 100-step source chunk 被均匀重采样为 50 steps; +- human/robot loss、aggregate validation 均为有限值; +- step 50 和最终完整 checkpoint 成功; +- 使用保存的 checkpoint 恢复 5–10 steps。 + +## 五、正式转换与 Stage 2 训练 + +smoke 通过后使用新的输出根目录转换全部 episode,不覆盖 smoke builder: + +```bash +cd /data/junhe/Atom-0 + +.venv/bin/python scripts/convert_egomimic_hdf5_to_rlds.py \ + --source-hdf5 /data/junhe/datasets/EgoMimic/groceries_human.hdf5 \ + --output-data-dir /data/junhe/RLDS/EgoMimic_full + +.venv/bin/python scripts/convert_egomimic_hdf5_to_rlds.py \ + --source-hdf5 /data/junhe/datasets/EgoMimic/groceries_robot.hdf5 \ + --output-data-dir /data/junhe/RLDS/EgoMimic_full +``` + +正式统计放入独立 assets 根目录: + +```bash +export ATOM_EGOMIMIC_RLDS_ROOT=/data/junhe/RLDS/EgoMimic_full +export ASSETS_BASE_DIR=/data/junhe/assets + +.venv/bin/python scripts/compute_cotrain_norm_stats_light.py \ + --config-name egoscale_stage2_egomimic \ + --exp-name egomimic_groceries_full_norm \ + --assets-base-dir "$ASSETS_BASE_DIR" \ + --max-frames 1000000 +``` + +正式训练建议先使用最新稳定的 Stage 1 checkpoint,而不是固定使用早期 +5000 step。第一轮配置: + +```bash +export MODE=full +export STAGE=stage2_egomimic +export EXP_NAME=stage2_egomimic_groceries_full_v1 + +export INSTANCES=2 +export GPU_PER_NODE=8 +export FSDP_DEVICES=8 +export BATCH_SIZE=512 +export NUM_TRAIN_STEPS=50000 + +export PARAMS_PATH=/data/junhe/checkpoints/egoscale_stage1_ego///params +export ATOM_EGOMIMIC_RLDS_ROOT=/data/junhe/RLDS/EgoMimic_full +export ASSETS_BASE_DIR=/data/junhe/assets +export CHECKPOINT_BASE_DIR=/data/junhe/checkpoints + +export DATA_NUM_PARALLEL_READS=4 +export DATA_NUM_PARALLEL_CALLS=8 +export SHUFFLE_BUFFER_SIZE=50000 + +export SAVE_INTERVAL=5000 +export EVAL_INTERVAL=5000 +export NUM_VAL_BATCHES=10 +export RUN_ACTION_MSE=1 + +export WANDB_ENABLED=1 +export WANDB_API_KEY_FILE=/data/junhe/.secrets/wandb_api_key +export OVERWRITE=0 +export RESUME=0 + +python atom0_jax_job.py +``` + +本 Stage 2 默认冻结 PaliGemma language transformer,继续训练 vision encoder、 +action expert 和动作投影。正式效果对照至少需要: + +1. `pi05_base → robot-only` +2. `pi05_base → Stage 1 EgoVerse → robot-only` +3. `pi05_base → Stage 1 EgoVerse → EgoMimic aligned → robot-only` + +EgoMimic groceries 只覆盖单右臂任务,不能替代项目未来计划采集的双臂 +EEF+平行夹爪 aligned 数据,也不能直接证明对目标机器人任务有效。 diff --git a/scripts/check_egoscale_setup.py b/scripts/check_egoscale_setup.py index f9fdf95..cc0107b 100755 --- a/scripts/check_egoscale_setup.py +++ b/scripts/check_egoscale_setup.py @@ -74,14 +74,29 @@ def main() -> int: failures.append(f"missing precomputed action metadata: {metadata_path}") else: metadata = json.loads(metadata_path.read_text()) - expected = { - "version": 1, - "action_source": "actions_cartesian", - "source_action_horizon": 100, - "model_action_horizon": config.model.action_horizon, - "resampling": "uniform_full_window", - "dataset_ids": sorted(dataset.uid for dataset in precomputed_datasets), - } + if metadata.get("version") == 1: + # Backward compatibility for the committed Stage 1 EgoVerse stats. + expected = { + "version": 1, + "action_source": "actions_cartesian", + "source_action_horizon": 100, + "model_action_horizon": config.model.action_horizon, + "resampling": "uniform_full_window", + "dataset_ids": sorted(dataset.uid for dataset in precomputed_datasets), + } + else: + expected = { + "version": 2, + "model_action_horizon": config.model.action_horizon, + "resampling": "uniform_full_window", + "datasets": { + dataset.uid: { + "action_source": dataset.precomputed_action_source, + "source_action_horizon": dataset.precomputed_action_horizon, + } + for dataset in sorted(precomputed_datasets, key=lambda item: item.uid) + }, + } actual = {key: metadata.get(key) for key in expected} if actual != expected: failures.append( diff --git a/scripts/compute_cotrain_norm_stats_light.py b/scripts/compute_cotrain_norm_stats_light.py index 56d5085..0f76e08 100644 --- a/scripts/compute_cotrain_norm_stats_light.py +++ b/scripts/compute_cotrain_norm_stats_light.py @@ -33,7 +33,7 @@ def _light_restructure(traj, dataset_id: str, restructure_name: str): """Return only state/actions/dataset_id, matching cotrain standardized restructures.""" import tensorflow as tf - if restructure_name == "standardized": + if restructure_name in {"standardized", "egomimic"}: n = tf.shape(traj["actions"])[0] return { "actions": traj["actions"], @@ -427,6 +427,25 @@ def main( cotrain_action_space.write_metadata(out_dir, ds.unified_action_spec) print(f"Saved norm stats for '{ds.uid}' to {out_dir}") + precomputed = [ds for ds in data_config.datasets if ds.precomputed_action_chunk] + if precomputed: + metadata = { + "version": 2, + "model_action_horizon": config.model.action_horizon, + "resampling": "uniform_full_window", + "datasets": { + ds.uid: { + "action_source": ds.precomputed_action_source, + "source_action_horizon": ds.precomputed_action_horizon, + } + for ds in sorted(precomputed, key=lambda item: item.uid) + }, + } + metadata_path = config.assets_dirs / "action_chunk_metadata.json" + metadata_path.parent.mkdir(parents=True, exist_ok=True) + metadata_path.write_text(json.dumps(metadata, indent=2, sort_keys=True) + "\n") + print(f"Saved precomputed-action metadata to {metadata_path}") + if __name__ == "__main__": tyro.cli(main) diff --git a/scripts/convert_egomimic_hdf5_to_rlds.py b/scripts/convert_egomimic_hdf5_to_rlds.py new file mode 100644 index 0000000..d8a0749 --- /dev/null +++ b/scripts/convert_egomimic_hdf5_to_rlds.py @@ -0,0 +1,396 @@ +#!/usr/bin/env python3 +"""Convert a public EgoMimic HDF5 file into Atom's RLDS/TFDS input format. + +EgoMimic publishes robomimic-style files, not RLDS builders. This converter +preserves its official 100-point future trajectories and keeps the human and +robot domains in separate TFDS configs so they receive independent norm stats. + +Examples: + + python scripts/convert_egomimic_hdf5_to_rlds.py \ + --source-hdf5 /data/junhe/datasets/EgoMimic/groceries_human.hdf5 \ + --output-data-dir /data/junhe/RLDS/EgoMimic_smoke \ + --max-train-episodes 2 --max-validation-episodes 1 + + python scripts/convert_egomimic_hdf5_to_rlds.py \ + --source-hdf5 /data/junhe/datasets/EgoMimic/groceries_robot.hdf5 \ + --output-data-dir /data/junhe/RLDS/EgoMimic_smoke \ + --max-train-episodes 2 --max-validation-episodes 1 + +The Hugging Face dataset page currently does not declare a dataset license. +Confirm research-use permission before using these files beyond internal +evaluation; the MIT license in the EgoMimic code repository is not assumed to +license the separately hosted dataset. +""" + +from __future__ import annotations + +import argparse +from collections.abc import Iterator +import dataclasses +from pathlib import Path +from typing import Any + +import h5py +import numpy as np +import tensorflow_datasets as tfds + +_TASK_PROMPTS = { + "bowlplace": "Pick up the toy and place it in the bowl.", + "groceries": "Pick up the grocery item and place it in the shopping bag.", + "smallclothfold": "Fold the small cloth.", +} +_SINGLE_ARM_TASKS = frozenset({"bowlplace", "groceries"}) +_BIMANUAL_TASKS = frozenset({"smallclothfold"}) + + +def _parse_source_name(path: Path) -> tuple[str, str]: + stem = path.stem + for task in _TASK_PROMPTS: + for domain in ("human", "robot"): + if stem == f"{task}_{domain}": + return task, domain + expected = ", ".join(f"{task}_{domain}" for task in _TASK_PROMPTS for domain in ("human", "robot")) + raise ValueError(f"Unsupported EgoMimic filename {path.name!r}; expected one of: {expected}") + + +def _decode_demo_ids(values) -> list[str]: + result = [] + for value in values: + decoded = value.decode("utf-8") if isinstance(value, bytes) else value + result.append(str(decoded)) + return result + + +def _demo_sort_key(name: str) -> tuple[int, str]: + try: + return int(name.rsplit("_", 1)[1]), name + except (IndexError, ValueError): + return 2**31 - 1, name + + +@dataclasses.dataclass(frozen=True) +class _Schema: + state_dim: int + action_dim: int + xyz_dim: int + joint_dim: int + horizon: int + image_shapes: dict[str, tuple[int, int, int]] + image_keys: dict[str, str | None] + + +def _inspect_schema(source: Path, task: str, domain: str) -> _Schema: + with h5py.File(source, "r") as h5: + demo_names = sorted(h5["data"].keys(), key=_demo_sort_key) + if not demo_names: + raise ValueError(f"No demos found under data/ in {source}") + demo = h5[f"data/{demo_names[0]}"] + obs = demo["obs"] + + xyz_shape = demo["actions_xyz_act"].shape + if len(xyz_shape) != 3: + raise ValueError(f"actions_xyz_act must be [T,H,D], got {xyz_shape}") + horizon = int(xyz_shape[1]) + xyz_dim = int(xyz_shape[2]) + expected_xyz_dim = 3 if task in _SINGLE_ARM_TASKS else 6 + if xyz_dim != expected_xyz_dim: + raise ValueError(f"{task} expects XYZ width {expected_xyz_dim}, got {xyz_dim}") + if int(obs["ee_pose"].shape[-1]) != xyz_dim: + raise ValueError("obs/ee_pose and actions_xyz_act have different XYZ widths") + + joint_dim = 0 + if domain == "robot": + joint_shape = demo["actions_joints_act"].shape + if len(joint_shape) != 3 or int(joint_shape[1]) != horizon: + raise ValueError( + f"actions_joints_act must be [T,{horizon},D], got {joint_shape}" + ) + joint_dim = int(joint_shape[2]) + expected_joint_dim = 7 if task in _SINGLE_ARM_TASKS else 14 + if joint_dim != expected_joint_dim: + raise ValueError(f"{task} robot expects joint/gripper width {expected_joint_dim}, got {joint_dim}") + if int(obs["joint_positions"].shape[-1]) != joint_dim: + raise ValueError("obs/joint_positions and actions_joints_act have different widths") + + if "front_img_1_line" not in obs: + raise ValueError(f"{source} is missing required obs/front_img_1_line") + base_shape = tuple(int(v) for v in obs["front_img_1_line"].shape[1:]) + if len(base_shape) != 3 or base_shape[-1] != 3: + raise ValueError(f"front_img_1_line must be RGB, got {base_shape}") + + image_keys: dict[str, str | None] = { + "base": "front_img_1_line", + "left_wrist": "left_wrist_img" if "left_wrist_img" in obs else None, + "right_wrist": "right_wrist_img" if "right_wrist_img" in obs else None, + } + image_shapes = {"base": base_shape} + for slot in ("left_wrist", "right_wrist"): + key = image_keys[slot] + shape = base_shape if key is None else tuple(int(v) for v in obs[key].shape[1:]) + if len(shape) != 3 or shape[-1] != 3: + raise ValueError(f"{key} must be RGB, got {shape}") + image_shapes[slot] = shape + + return _Schema( + state_dim=joint_dim + xyz_dim, + action_dim=joint_dim + xyz_dim, + xyz_dim=xyz_dim, + joint_dim=joint_dim, + horizon=horizon, + image_shapes=image_shapes, + image_keys=image_keys, + ) + + +class _EgoMimicConfig(tfds.core.BuilderConfig): + def __init__( + self, + *, + name: str, + source_path: Path, + task: str, + domain: str, + prompt: str, + max_train_episodes: int | None, + max_validation_episodes: int | None, + ): + super().__init__(name=name, version="1.0.0", description=f"EgoMimic {task} {domain}") + self.source_path = source_path + self.task = task + self.domain = domain + self.prompt = prompt + self.max_train_episodes = max_train_episodes + self.max_validation_episodes = max_validation_episodes + + +class EgoMimicRlds(tfds.core.GeneratorBasedBuilder): + """One task/domain EgoMimic file as an episode-level RLDS builder.""" + + VERSION = tfds.core.Version("1.0.0") + + def _info(self) -> tfds.core.DatasetInfo: + self._schema = _inspect_schema( + self.builder_config.source_path, + self.builder_config.task, + self.builder_config.domain, + ) + image_features = { + slot: tfds.features.Image( + shape=self._schema.image_shapes[slot], + dtype=np.uint8, + encoding_format="jpeg", + ) + for slot in ("base", "left_wrist", "right_wrist") + } + step_features = tfds.features.FeaturesDict( + { + "state": tfds.features.Tensor(shape=(self._schema.state_dim,), dtype=np.float32), + "action": tfds.features.Tensor(shape=(self._schema.action_dim,), dtype=np.float32), + "actions": tfds.features.Tensor( + shape=(self._schema.horizon, self._schema.action_dim), + dtype=np.float32, + ), + "image_base": image_features["base"], + "image_left_wrist": image_features["left_wrist"], + "image_right_wrist": image_features["right_wrist"], + "image_mask_base": np.bool_, + "image_mask_left_wrist": np.bool_, + "image_mask_right_wrist": np.bool_, + "prompt": tfds.features.Text(), + "eef_frame": tfds.features.Text(), + "is_first": np.bool_, + "is_last": np.bool_, + "is_terminal": np.bool_, + "discount": np.float32, + "reward": np.float32, + } + ) + return tfds.core.DatasetInfo( + builder=self, + description=( + "EgoMimic human/robot demonstrations converted from the public " + "robomimic-style HDF5 release." + ), + features=tfds.features.FeaturesDict( + { + "episode_metadata": tfds.features.FeaturesDict( + { + "source_file": tfds.features.Text(), + "source_demo_id": tfds.features.Text(), + "task": tfds.features.Text(), + "domain": tfds.features.Text(), + "eef_frame": tfds.features.Text(), + } + ), + "steps": tfds.features.Dataset(step_features), + } + ), + homepage="https://egomimic.github.io/", + ) + + def _split_generators(self, dl_manager): + del dl_manager + source = self.builder_config.source_path + with h5py.File(source, "r") as h5: + all_demos = set(h5["data"].keys()) + if "mask/train" not in h5 or "mask/valid" not in h5: + raise ValueError(f"{source} must contain official mask/train and mask/valid") + train = _decode_demo_ids(h5["mask/train"][:]) + valid = _decode_demo_ids(h5["mask/valid"][:]) + if not train or not valid: + raise ValueError(f"{source} has an empty official train or valid mask") + unknown = (set(train) | set(valid)) - all_demos + if unknown: + raise ValueError(f"Official masks reference missing demos: {sorted(unknown)[:10]}") + if set(train) & set(valid): + raise ValueError("Official train and valid masks overlap") + + train = sorted(train, key=_demo_sort_key) + valid = sorted(valid, key=_demo_sort_key) + if self.builder_config.max_train_episodes is not None: + train = train[: self.builder_config.max_train_episodes] + if self.builder_config.max_validation_episodes is not None: + valid = valid[: self.builder_config.max_validation_episodes] + return { + "train": self._generate_examples(train), + "seen_test": self._generate_examples(valid), + # EgoMimic has no semantic unseen split. This alias only preserves + # Atom's two-label evaluator contract and must not be reported as + # unseen-task performance. + "unseen_test": self._generate_examples(valid), + } + + def _generate_examples(self, demo_names: list[str]) -> Iterator[tuple[str, dict[str, Any]]]: + source = self.builder_config.source_path + with h5py.File(source, "r") as h5: + for demo_name in demo_names: + demo = h5[f"data/{demo_name}"] + yield demo_name, { + "episode_metadata": { + "source_file": source.name, + "source_demo_id": demo_name, + "task": self.builder_config.task, + "domain": self.builder_config.domain, + "eef_frame": "current_egocentric_camera", + }, + "steps": self._generate_steps(demo), + } + + def _generate_steps(self, demo) -> Iterator[dict[str, Any]]: + obs = demo["obs"] + xyz_actions = demo["actions_xyz_act"] + joint_actions = demo.get("actions_joints_act") + xyz_state = obs["ee_pose"] + joint_state = obs.get("joint_positions") + length = int(xyz_state.shape[0]) + arrays = [xyz_actions] + if joint_actions is not None: + arrays.append(joint_actions) + if joint_state is not None: + arrays.append(joint_state) + if any(int(array.shape[0]) != length for array in arrays): + raise ValueError(f"Inconsistent trajectory lengths in {demo.name}") + + blank_images = { + slot: np.zeros(self._schema.image_shapes[slot], dtype=np.uint8) + for slot in ("left_wrist", "right_wrist") + } + for index in range(length): + xyz_chunk = np.asarray(xyz_actions[index], dtype=np.float32) + xyz_now = np.asarray(xyz_state[index], dtype=np.float32) + if joint_actions is None: + action_chunk = xyz_chunk + state = xyz_now + else: + action_chunk = np.concatenate( + [np.asarray(joint_actions[index], dtype=np.float32), xyz_chunk], + axis=-1, + ) + state = np.concatenate( + [np.asarray(joint_state[index], dtype=np.float32), xyz_now], + axis=-1, + ) + + images = {} + masks = {} + for slot in ("base", "left_wrist", "right_wrist"): + source_key = self._schema.image_keys[slot] + if source_key is None: + images[slot] = blank_images[slot] + masks[slot] = False + else: + images[slot] = np.asarray(obs[source_key][index], dtype=np.uint8) + masks[slot] = True + + yield { + "state": state, + "action": action_chunk[0], + "actions": action_chunk, + "image_base": images["base"], + "image_left_wrist": images["left_wrist"], + "image_right_wrist": images["right_wrist"], + "image_mask_base": masks["base"], + "image_mask_left_wrist": masks["left_wrist"], + "image_mask_right_wrist": masks["right_wrist"], + "prompt": self.builder_config.prompt, + "eef_frame": "current_egocentric_camera", + "is_first": index == 0, + "is_last": index == length - 1, + "is_terminal": index == length - 1, + "discount": np.float32(1.0), + "reward": np.float32(1.0 if index == length - 1 else 0.0), + } + + +def _positive_or_none(value: str) -> int | None: + value = int(value) + if value == 0: + return None + if value < 0: + raise argparse.ArgumentTypeError("must be non-negative; use 0 for all episodes") + return value + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--source-hdf5", type=Path, required=True) + parser.add_argument("--output-data-dir", type=Path, required=True) + parser.add_argument("--max-train-episodes", type=_positive_or_none, default=None) + parser.add_argument("--max-validation-episodes", type=_positive_or_none, default=None) + args = parser.parse_args() + + source = args.source_hdf5.expanduser().resolve() + if not source.is_file(): + raise FileNotFoundError(source) + task, domain = _parse_source_name(source) + config_name = f"{task}_{domain}" + config = _EgoMimicConfig( + name=config_name, + source_path=source, + task=task, + domain=domain, + prompt=_TASK_PROMPTS[task], + max_train_episodes=args.max_train_episodes, + max_validation_episodes=args.max_validation_episodes, + ) + builder = EgoMimicRlds( + data_dir=str(args.output_data_dir.expanduser().resolve()), + config=config, + ) + target = Path(builder.data_dir) + if target.exists() and any(target.iterdir()): + raise FileExistsError( + f"Refusing to overwrite existing TFDS builder {target}. " + "Use a new --output-data-dir, or move the old builder aside after inspection." + ) + print(f"source={source}") + print(f"task={task} domain={domain}") + print(f"schema={_inspect_schema(source, task, domain)}") + print(f"target={target}") + builder.download_and_prepare() + print(f"Prepared EgoMimic RLDS builder: {builder.data_dir}") + + +if __name__ == "__main__": + main() diff --git a/scripts/run_egoscale_stage.sh b/scripts/run_egoscale_stage.sh index d9bc1e6..fe3e34e 100755 --- a/scripts/run_egoscale_stage.sh +++ b/scripts/run_egoscale_stage.sh @@ -25,6 +25,7 @@ case "${STAGE}" in stage1_ego) CONFIG_NAME="egoscale_stage1_ego" ;; stage2_robot) CONFIG_NAME="egoscale_stage2_robot" ;; stage2_aligned) CONFIG_NAME="egoscale_stage2_aligned" ;; + stage2_egomimic) CONFIG_NAME="egoscale_stage2_egomimic" ;; stage3_robot) CONFIG_NAME="egoscale_stage3_robot" ;; *) echo "Unknown STAGE=${STAGE}" >&2; exit 2 ;; esac diff --git a/src/openpi/cotrain/action_space.py b/src/openpi/cotrain/action_space.py index 4b79d9a..080da2d 100644 --- a/src/openpi/cotrain/action_space.py +++ b/src/openpi/cotrain/action_space.py @@ -269,6 +269,30 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct + dims(13, RIGHT_GRIPPER, 1) ) +# EgoMimic does not provide the 14D pose+gripper contract above. Its public +# human files contain camera-frame hand XYZ only, while its robot files contain +# absolute ALOHA joint/gripper targets plus the corresponding camera-frame EEF +# XYZ. Keep those source semantics explicit instead of fabricating Euler angles +# or human gripper labels. +_EGOMIMIC_SINGLE_HUMAN_MAPPING = dims(0, RIGHT_EEF_POSITION, 3) +_EGOMIMIC_SINGLE_ROBOT_MAPPING = ( + dims(0, RIGHT_ARM, 6) + + dims(6, RIGHT_GRIPPER, 1) + + dims(7, RIGHT_EEF_POSITION, 3) +) +_EGOMIMIC_BIMANUAL_HUMAN_MAPPING = ( + dims(0, LEFT_EEF_POSITION, 3) + + dims(3, RIGHT_EEF_POSITION, 3) +) +_EGOMIMIC_BIMANUAL_ROBOT_MAPPING = ( + dims(0, LEFT_ARM, 6) + + dims(6, LEFT_GRIPPER, 1) + + dims(7, RIGHT_ARM, 6) + + dims(13, RIGHT_GRIPPER, 1) + + dims(14, LEFT_EEF_POSITION, 3) + + dims(17, RIGHT_EEF_POSITION, 3) +) + _AGIBOT_MAPPING = ( _dual_arm(7) + dims(14, LEFT_GRIPPER, 1) + dims(15, RIGHT_GRIPPER, 1) + dims(16, HEAD, 2) + dims(18, WAIST, 2) ) @@ -286,6 +310,21 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct "egoverse_scale": _same(_EGO_MAPPING), "aligned_parallel_gripper_human": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), "aligned_parallel_gripper_robot": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), + "egomimic_bowlplace_human": _same(_EGOMIMIC_SINGLE_HUMAN_MAPPING), + "egomimic_bowlplace_robot": _same( + _EGOMIMIC_SINGLE_ROBOT_MAPPING, + delta=slots(RIGHT_ARM, 6), + ), + "egomimic_groceries_human": _same(_EGOMIMIC_SINGLE_HUMAN_MAPPING), + "egomimic_groceries_robot": _same( + _EGOMIMIC_SINGLE_ROBOT_MAPPING, + delta=slots(RIGHT_ARM, 6), + ), + "egomimic_smallclothfold_human": _same(_EGOMIMIC_BIMANUAL_HUMAN_MAPPING), + "egomimic_smallclothfold_robot": _same( + _EGOMIMIC_BIMANUAL_ROBOT_MAPPING, + delta=slots(LEFT_ARM, 6) + slots(RIGHT_ARM, 6), + ), "piper30": _same(_PIPER_MAPPING, delta=slots(LEFT_ARM, 6) + slots(RIGHT_ARM, 6)), "piper2": _same(_PIPER_MAPPING, delta=slots(LEFT_ARM, 6) + slots(RIGHT_ARM, 6)), } diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index a57901b..a7f095c 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -586,6 +586,52 @@ def assets_dirs(self) -> pathlib.Path: ), ) +# Public EgoMimic is a different contract from the future in-house 14D aligned +# collection above. The converted groceries pair contains current-camera-frame +# right-hand XYZ for both domains; robot examples additionally contain six ALOHA +# arm joints and one gripper value. Human and robot remain separate dataset IDs +# so their normalization statistics are never mixed. +_EGOMIMIC_RLDS_ROOT = os.environ.get( + "ATOM_EGOMIMIC_RLDS_ROOT", + f"{_RLDS_ROOT}/EgoMimic", +).rstrip("/") +_EGOMIMIC_GROCERIES_DATA = CotrainDataConfig( + rlds_data_dir=_EGOMIMIC_RLDS_ROOT, + datasets=( + CotrainRLDSDataset( + name="ego_mimic_rlds", + dataset_id="egomimic_groceries_human", + version="1.0.0", + builder_dir=f"{_EGOMIMIC_RLDS_ROOT}/ego_mimic_rlds/groceries_human/1.0.0", + weight=0.5, + train_split="train", + # EgoMimic publishes train/valid masks, but no semantic unseen split. + # Keep the two logical eval labels explicit aliases; do not interpret + # the resulting "unseen" number as an unseen-task benchmark. + val_splits={"seen": "seen_test", "unseen": "unseen_test"}, + restructure_name="egomimic", + action_dim=3, + precomputed_action_chunk=True, + precomputed_action_source="actions_xyz_act", + precomputed_action_horizon=100, + ), + CotrainRLDSDataset( + name="ego_mimic_rlds", + dataset_id="egomimic_groceries_robot", + version="1.0.0", + builder_dir=f"{_EGOMIMIC_RLDS_ROOT}/ego_mimic_rlds/groceries_robot/1.0.0", + weight=0.5, + train_split="train", + val_splits={"seen": "seen_test", "unseen": "unseen_test"}, + restructure_name="egomimic", + action_dim=10, + precomputed_action_chunk=True, + precomputed_action_source="actions_joints_act+actions_xyz_act", + precomputed_action_horizon=100, + ), + ), +) + def _make_robocoin_dataset( dataset_id: str, @@ -926,6 +972,8 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): dataset, restructure_name="egoverse_cartesian_chunk", precomputed_action_chunk=True, + precomputed_action_source="actions_cartesian", + precomputed_action_horizon=100, ) for dataset in _drop_dataset_ids_and_renormalize( _EGOVERSE_FULL_DATA.datasets, @@ -1061,6 +1109,14 @@ def _strict_stage_checkpoint_loader() -> _weight_loaders.CheckpointWeightLoader: norm_stats_assets_name="egoscale_stage2_aligned", ) +_EGOSCALE_STAGE2_EGOMIMIC = dataclasses.replace( + _EGOSCALE_STAGE2_ROBOT, + name="egoscale_stage2_egomimic", + data=_EGOMIMIC_GROCERIES_DATA, + num_train_steps=50_000, + norm_stats_assets_name="egoscale_stage2_egomimic_groceries", +) + _EGOSCALE_STAGE3_ROBOT = dataclasses.replace( _EGOSCALE_STAGE2_ROBOT, name="egoscale_stage3_robot", @@ -1074,6 +1130,7 @@ def _strict_stage_checkpoint_loader() -> _weight_loaders.CheckpointWeightLoader: _EGOSCALE_STAGE1_EGO, _EGOSCALE_STAGE2_ROBOT, _EGOSCALE_STAGE2_ALIGNED, + _EGOSCALE_STAGE2_EGOMIMIC, _EGOSCALE_STAGE3_ROBOT, ] diff --git a/src/openpi/cotrain/rlds_dataset.py b/src/openpi/cotrain/rlds_dataset.py index 8778bb2..6f58942 100644 --- a/src/openpi/cotrain/rlds_dataset.py +++ b/src/openpi/cotrain/rlds_dataset.py @@ -92,6 +92,10 @@ class CotrainRLDSDataset: # The loader uniformly resamples that source horizon to the model horizon instead of # gathering consecutive trajectory frames a second time. precomputed_action_chunk: bool = False + # Auditable description of the precomputed source. These fields are used by + # staged-run preflight checks; they do not alter the runtime tensor path. + precomputed_action_source: str | None = None + precomputed_action_horizon: int | None = None @property def uid(self) -> str: @@ -263,6 +267,42 @@ def _aligned_parallel_gripper_restructure(traj, dataset_name: str): } +def _egomimic_restructure(traj, dataset_name: str): + """EgoMimic RLDS converted from the public robomimic-style HDF5 files. + + The offline converter writes the common image/state fields and a rank-three + ``actions[T,100,D]`` tensor. Human source width is 3 (right-hand XYZ) or 6 + (left/right XYZ). Robot source width is 10 (right 6 joints + gripper + XYZ) + or 20 (bimanual joints/grippers + left/right XYZ). + + EgoMimic XYZ values are already expressed in the current egocentric camera + frame. No Euler orientation or human gripper label exists in the public + data, so the registered 80D mapping leaves those slots masked out. + """ + import tensorflow as tf + + n = tf.shape(traj["actions"])[0] + is_human = dataset_name.endswith("_human") + action_mode = "eef_xyz" if is_human else "joint_gripper_and_eef_xyz" + return { + "actions": traj["actions"], + "state": traj["state"], + "image": { + "base_0_rgb": traj["image_base"], + "left_wrist_0_rgb": traj["image_left_wrist"], + "right_wrist_0_rgb": traj["image_right_wrist"], + }, + "image_mask": { + "base_0_rgb": traj["image_mask_base"], + "left_wrist_0_rgb": traj["image_mask_left_wrist"], + "right_wrist_0_rgb": traj["image_mask_right_wrist"], + }, + "prompt": traj["prompt"], + "prompt_prefix": _fill_action_prompt_prefix(n, action_mode, "current_egocentric_camera"), + "dataset_id": tf.fill([n], dataset_name), + } + + def _robomind_restructure(traj, dataset_name: str): """Map the raw RoboMIND (robomind_infidata) RLDS schema -> common co-training keys. @@ -625,6 +665,7 @@ def image_or_blank(key): # prepare path decodes them. Add new clean datasets here. STD_RESTRUCTURE_FNS = { "aligned_parallel_gripper": _aligned_parallel_gripper_restructure, + "egomimic": _egomimic_restructure, "standardized": _standardized_restructure, "agibot": _agibot_restructure, "robomind": _robomind_restructure, diff --git a/tests/cotrain/test_action_space.py b/tests/cotrain/test_action_space.py index 1937452..c3a2899 100644 --- a/tests/cotrain/test_action_space.py +++ b/tests/cotrain/test_action_space.py @@ -17,6 +17,12 @@ "egoverse_human", "egoverse_mecka", "egoverse_scale", + "egomimic_bowlplace_human", + "egomimic_bowlplace_robot", + "egomimic_groceries_human", + "egomimic_groceries_robot", + "egomimic_smallclothfold_human", + "egomimic_smallclothfold_robot", "piper30", "piper2", "robocoin_agilex_cobot_magic_s26_a26", @@ -59,7 +65,7 @@ def test_registry_covers_all_documented_builders() -> None: assert set(action_space.UNIFIED_ACTION_SPECS) == EXPECTED_DATASET_IDS - assert len(EXPECTED_DATASET_IDS) == 46 + assert len(EXPECTED_DATASET_IDS) == 52 assert action_space.OPTIONAL_ALIGNED_DATASET_IDS == { "aligned_parallel_gripper_human", "aligned_parallel_gripper_robot", @@ -93,6 +99,12 @@ def test_only_ego_and_aligned_play_map_eef_slots() -> None: "egoverse_scale", "aligned_parallel_gripper_human", "aligned_parallel_gripper_robot", + "egomimic_bowlplace_human", + "egomimic_bowlplace_robot", + "egomimic_groceries_human", + "egomimic_groceries_robot", + "egomimic_smallclothfold_human", + "egomimic_smallclothfold_robot", } @@ -113,6 +125,56 @@ def test_aligned_parallel_gripper_layout(dataset_id: str) -> None: assert not any(spec.delta_mask) +def test_egomimic_single_arm_human_maps_only_real_xyz_labels() -> None: + spec = action_space.UNIFIED_ACTION_SPECS["egomimic_groceries_human"] + source = np.array([1.0, 2.0, 3.0], dtype=np.float32) + mapped = action_space.map_array(source, spec.action_mapping) + np.testing.assert_array_equal( + mapped[action_space.RIGHT_EEF_POSITION : action_space.RIGHT_EEF_POSITION + 3], + source, + ) + assert sum(spec.action_mask) == 3 + assert not any(spec.delta_mask) + assert not spec.action_mask[action_space.RIGHT_EEF_EULER] + assert not spec.action_mask[action_space.RIGHT_GRIPPER] + + +def test_egomimic_single_arm_robot_adds_joint_gripper_and_shared_xyz() -> None: + spec = action_space.UNIFIED_ACTION_SPECS["egomimic_groceries_robot"] + source = np.arange(10, dtype=np.float32) + mapped = action_space.map_array(source, spec.action_mapping) + np.testing.assert_array_equal( + mapped[action_space.RIGHT_ARM : action_space.RIGHT_ARM + 6], + source[:6], + ) + assert mapped[action_space.RIGHT_GRIPPER] == source[6] + np.testing.assert_array_equal( + mapped[action_space.RIGHT_EEF_POSITION : action_space.RIGHT_EEF_POSITION + 3], + source[7:10], + ) + assert set(np.flatnonzero(spec.delta_mask)) == set(action_space.slots(action_space.RIGHT_ARM, 6)) + assert not spec.delta_mask[action_space.RIGHT_GRIPPER] + assert not spec.delta_mask[action_space.RIGHT_EEF_POSITION] + + +def test_egomimic_bimanual_robot_layout() -> None: + spec = action_space.UNIFIED_ACTION_SPECS["egomimic_smallclothfold_robot"] + source = np.arange(20, dtype=np.float32) + mapped = action_space.map_array(source, spec.action_mapping) + np.testing.assert_array_equal(mapped[action_space.LEFT_ARM : action_space.LEFT_ARM + 6], source[:6]) + assert mapped[action_space.LEFT_GRIPPER] == source[6] + np.testing.assert_array_equal(mapped[action_space.RIGHT_ARM : action_space.RIGHT_ARM + 6], source[7:13]) + assert mapped[action_space.RIGHT_GRIPPER] == source[13] + np.testing.assert_array_equal( + mapped[action_space.LEFT_EEF_POSITION : action_space.LEFT_EEF_POSITION + 3], + source[14:17], + ) + np.testing.assert_array_equal( + mapped[action_space.RIGHT_EEF_POSITION : action_space.RIGHT_EEF_POSITION + 3], + source[17:20], + ) + + def test_robocoin_mixed_eef_sources_are_dropped() -> None: expected_dropped = { "robocoin_agilex_cobot_magic_s26_a26": set(range(7, 13)) | set(range(20, 26)), diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index bbd82d9..3690909 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -17,6 +17,7 @@ def test_all_registered_cotrain_configs_resolve_to_unified_80d() -> None: "egoscale_stage1_ego", "egoscale_stage2_robot", "egoscale_stage2_aligned", + "egoscale_stage2_egomimic", "egoscale_stage3_robot", } for train_config in config._COTRAIN_CONFIGS: @@ -133,13 +134,22 @@ def test_staged_configs_use_expected_data_and_strict_checkpoint_loader() -> None assert sum(dataset.weight for dataset in stage1_datasets) == pytest.approx(1.0) assert all(dataset.restructure_name == "egoverse_cartesian_chunk" for dataset in stage1_datasets) assert all(dataset.precomputed_action_chunk for dataset in stage1_datasets) + assert all(dataset.precomputed_action_source == "actions_cartesian" for dataset in stage1_datasets) + assert all(dataset.precomputed_action_horizon == 100 for dataset in stage1_datasets) assert config._EGOSCALE_STAGE1_EGO.norm_stats_assets_name == "egoscale_stage1_ego_cartesian_clean" assert config._EGOSCALE_STAGE2_ROBOT.data is config._ROBOT_ALL_DATA assert config._EGOSCALE_STAGE2_ALIGNED.data is config._ALIGNED_PARALLEL_GRIPPER_DATA + assert config._EGOSCALE_STAGE2_EGOMIMIC.data is config._EGOMIMIC_GROCERIES_DATA + assert {dataset.uid for dataset in config._EGOSCALE_STAGE2_EGOMIMIC.data.datasets} == { + "egomimic_groceries_human", + "egomimic_groceries_robot", + } + assert all(dataset.precomputed_action_chunk for dataset in config._EGOSCALE_STAGE2_EGOMIMIC.data.datasets) assert config._EGOSCALE_STAGE3_ROBOT.data is config._ROBOT_ALL_DATA for staged in ( config._EGOSCALE_STAGE2_ROBOT, config._EGOSCALE_STAGE2_ALIGNED, + config._EGOSCALE_STAGE2_EGOMIMIC, config._EGOSCALE_STAGE3_ROBOT, ): assert staged.weight_loader.__class__.__name__ == "CheckpointWeightLoader" From 7aaa4d1828a57c730a610d5d42451d85f5fc1a15 Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 27 Jul 2026 15:34:11 +0800 Subject: [PATCH 38/64] Correct EgoMimic groceries as bimanual --- docs/egomimic_stage2.md | 19 +++++++++++------ scripts/convert_egomimic_hdf5_to_rlds.py | 26 +++++++++++++++-------- src/openpi/cotrain/action_space.py | 6 +++--- src/openpi/cotrain/config.py | 20 +++++++++--------- tests/cotrain/test_action_space.py | 27 ++++++++++++++++++++---- tests/cotrain/test_unified_config.py | 11 ++++++++++ 6 files changed, 76 insertions(+), 33 deletions(-) diff --git a/docs/egomimic_stage2.md b/docs/egomimic_stage2.md index 39ac6e1..a879e4e 100644 --- a/docs/egomimic_stage2.md +++ b/docs/egomimic_stage2.md @@ -24,6 +24,8 @@ EgoMimic 不能复用项目中预留的双臂 14D 第一轮流程使用最小的 groceries 人机配对数据。配置名为 `egoscale_stage2_egomimic`,启动 stage 名为 `stage2_egomimic`。 +真实文件审计显示 groceries 是双臂数据:human source width 为 6, +robot source width 为 20(14D joint/gripper + 6D EEF XYZ)。 > 数据授权注意:截至接入时,Hugging Face 数据集页面没有声明 dataset > license。EgoMimic 代码仓库的 MIT license 不自动等价于数据授权。公开 @@ -83,9 +85,11 @@ cd /data/junhe/Atom-0 └── groceries_robot/1.0.0/ ``` -转换器使用官方 `mask/train` 和 `mask/valid`。EgoMimic 没有语义上的 -unseen split,因此当前 `seen_test` 和 `unseen_test` 都来自官方 valid。 -`unseen` 指标只用于保持训练器接口完整,不能作为 unseen-task 结果汇报。 +转换器使用官方 `mask/train` 和 `mask/valid`。公开 groceries 文件只有一个 +5000-frame demo,两个官方 mask 都指向该 demo,因此 validation 也不是独立 +episode。为避免把同一份大图像数据物理写入三次,groceries builder 只保存 +一次 `train` split,配置中的 `seen/unseen` 都读取该 split。这里的验证指标 +只能作为流程健康检查,不能作为 held-out 或 unseen-task 结果汇报。 ## 三、计算 smoke norm stats @@ -174,8 +178,8 @@ python atom0_jax_job.py 验收项: - strict loader 完整加载 Stage 1 80D params; -- human batch 只激活右 EEF XYZ 三个 action slots; -- robot batch 激活右臂 6 joints、gripper、右 EEF XYZ; +- human batch 只激活左右 EEF XYZ 六个 action slots; +- robot batch 激活左右臂各 6 joints、两个 gripper、左右 EEF XYZ; - robot joint 走 absolute-to-delta,gripper/XYZ 保持 absolute; - 100-step source chunk 被均匀重采样为 50 steps; - human/robot loss、aggregate validation 均为有限值; @@ -254,5 +258,6 @@ action expert 和动作投影。正式效果对照至少需要: 2. `pi05_base → Stage 1 EgoVerse → robot-only` 3. `pi05_base → Stage 1 EgoVerse → EgoMimic aligned → robot-only` -EgoMimic groceries 只覆盖单右臂任务,不能替代项目未来计划采集的双臂 -EEF+平行夹爪 aligned 数据,也不能直接证明对目标机器人任务有效。 +EgoMimic groceries 虽是双臂 ALOHA 数据,但 human 侧仍没有 orientation 或 +gripper 标签,且公开 valid 与 train 共享同一 demo。它不能替代项目未来计划 +采集的双臂 EEF+平行夹爪 aligned 数据,也不能直接证明对目标机器人任务有效。 diff --git a/scripts/convert_egomimic_hdf5_to_rlds.py b/scripts/convert_egomimic_hdf5_to_rlds.py index d8a0749..9cc1817 100644 --- a/scripts/convert_egomimic_hdf5_to_rlds.py +++ b/scripts/convert_egomimic_hdf5_to_rlds.py @@ -40,8 +40,8 @@ "groceries": "Pick up the grocery item and place it in the shopping bag.", "smallclothfold": "Fold the small cloth.", } -_SINGLE_ARM_TASKS = frozenset({"bowlplace", "groceries"}) -_BIMANUAL_TASKS = frozenset({"smallclothfold"}) +_SINGLE_ARM_TASKS = frozenset({"bowlplace"}) +_BIMANUAL_TASKS = frozenset({"groceries", "smallclothfold"}) def _parse_source_name(path: Path) -> tuple[str, str]: @@ -243,8 +243,16 @@ def _split_generators(self, dl_manager): unknown = (set(train) | set(valid)) - all_demos if unknown: raise ValueError(f"Official masks reference missing demos: {sorted(unknown)[:10]}") - if set(train) & set(valid): - raise ValueError("Official train and valid masks overlap") + overlap = set(train) & set(valid) + if overlap: + # The published groceries files contain one long demo referenced by + # both official masks. Preserve the publisher's split contract for + # compatibility, but make the leakage impossible to overlook. + print( + "WARNING: official train/valid masks overlap for " + f"{len(overlap)} demo(s): {sorted(overlap)[:10]}. " + "Validation is an in-trajectory smoke metric, not a held-out result." + ) train = sorted(train, key=_demo_sort_key) valid = sorted(valid, key=_demo_sort_key) @@ -252,14 +260,14 @@ def _split_generators(self, dl_manager): train = train[: self.builder_config.max_train_episodes] if self.builder_config.max_validation_episodes is not None: valid = valid[: self.builder_config.max_validation_episodes] - return { - "train": self._generate_examples(train), - "seen_test": self._generate_examples(valid), + splits = {"train": self._generate_examples(train)} + if set(train) != set(valid): + splits["seen_test"] = self._generate_examples(valid) # EgoMimic has no semantic unseen split. This alias only preserves # Atom's two-label evaluator contract and must not be reported as # unseen-task performance. - "unseen_test": self._generate_examples(valid), - } + splits["unseen_test"] = self._generate_examples(valid) + return splits def _generate_examples(self, demo_names: list[str]) -> Iterator[tuple[str, dict[str, Any]]]: source = self.builder_config.source_path diff --git a/src/openpi/cotrain/action_space.py b/src/openpi/cotrain/action_space.py index 080da2d..ad5ecb5 100644 --- a/src/openpi/cotrain/action_space.py +++ b/src/openpi/cotrain/action_space.py @@ -315,10 +315,10 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct _EGOMIMIC_SINGLE_ROBOT_MAPPING, delta=slots(RIGHT_ARM, 6), ), - "egomimic_groceries_human": _same(_EGOMIMIC_SINGLE_HUMAN_MAPPING), + "egomimic_groceries_human": _same(_EGOMIMIC_BIMANUAL_HUMAN_MAPPING), "egomimic_groceries_robot": _same( - _EGOMIMIC_SINGLE_ROBOT_MAPPING, - delta=slots(RIGHT_ARM, 6), + _EGOMIMIC_BIMANUAL_ROBOT_MAPPING, + delta=slots(LEFT_ARM, 6) + slots(RIGHT_ARM, 6), ), "egomimic_smallclothfold_human": _same(_EGOMIMIC_BIMANUAL_HUMAN_MAPPING), "egomimic_smallclothfold_robot": _same( diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index a7f095c..b7be086 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -588,9 +588,9 @@ def assets_dirs(self) -> pathlib.Path: # Public EgoMimic is a different contract from the future in-house 14D aligned # collection above. The converted groceries pair contains current-camera-frame -# right-hand XYZ for both domains; robot examples additionally contain six ALOHA -# arm joints and one gripper value. Human and robot remain separate dataset IDs -# so their normalization statistics are never mixed. +# left/right hand XYZ for both domains; robot examples additionally contain two +# ALOHA arms with six joints and one gripper each. Human and robot remain +# separate dataset IDs so their normalization statistics are never mixed. _EGOMIMIC_RLDS_ROOT = os.environ.get( "ATOM_EGOMIMIC_RLDS_ROOT", f"{_RLDS_ROOT}/EgoMimic", @@ -605,12 +605,12 @@ def assets_dirs(self) -> pathlib.Path: builder_dir=f"{_EGOMIMIC_RLDS_ROOT}/ego_mimic_rlds/groceries_human/1.0.0", weight=0.5, train_split="train", - # EgoMimic publishes train/valid masks, but no semantic unseen split. - # Keep the two logical eval labels explicit aliases; do not interpret - # the resulting "unseen" number as an unseen-task benchmark. - val_splits={"seen": "seen_test", "unseen": "unseen_test"}, + # Public groceries contains one long demo referenced by both official + # masks. Reuse the physical train split for flow-health evaluation to + # avoid writing the same ~44GB episode three times. + val_splits={"seen": "train", "unseen": "train"}, restructure_name="egomimic", - action_dim=3, + action_dim=6, precomputed_action_chunk=True, precomputed_action_source="actions_xyz_act", precomputed_action_horizon=100, @@ -622,9 +622,9 @@ def assets_dirs(self) -> pathlib.Path: builder_dir=f"{_EGOMIMIC_RLDS_ROOT}/ego_mimic_rlds/groceries_robot/1.0.0", weight=0.5, train_split="train", - val_splits={"seen": "seen_test", "unseen": "unseen_test"}, + val_splits={"seen": "train", "unseen": "train"}, restructure_name="egomimic", - action_dim=10, + action_dim=20, precomputed_action_chunk=True, precomputed_action_source="actions_joints_act+actions_xyz_act", precomputed_action_horizon=100, diff --git a/tests/cotrain/test_action_space.py b/tests/cotrain/test_action_space.py index c3a2899..ddc1ed2 100644 --- a/tests/cotrain/test_action_space.py +++ b/tests/cotrain/test_action_space.py @@ -126,7 +126,7 @@ def test_aligned_parallel_gripper_layout(dataset_id: str) -> None: def test_egomimic_single_arm_human_maps_only_real_xyz_labels() -> None: - spec = action_space.UNIFIED_ACTION_SPECS["egomimic_groceries_human"] + spec = action_space.UNIFIED_ACTION_SPECS["egomimic_bowlplace_human"] source = np.array([1.0, 2.0, 3.0], dtype=np.float32) mapped = action_space.map_array(source, spec.action_mapping) np.testing.assert_array_equal( @@ -140,7 +140,7 @@ def test_egomimic_single_arm_human_maps_only_real_xyz_labels() -> None: def test_egomimic_single_arm_robot_adds_joint_gripper_and_shared_xyz() -> None: - spec = action_space.UNIFIED_ACTION_SPECS["egomimic_groceries_robot"] + spec = action_space.UNIFIED_ACTION_SPECS["egomimic_bowlplace_robot"] source = np.arange(10, dtype=np.float32) mapped = action_space.map_array(source, spec.action_mapping) np.testing.assert_array_equal( @@ -157,8 +157,27 @@ def test_egomimic_single_arm_robot_adds_joint_gripper_and_shared_xyz() -> None: assert not spec.delta_mask[action_space.RIGHT_EEF_POSITION] -def test_egomimic_bimanual_robot_layout() -> None: - spec = action_space.UNIFIED_ACTION_SPECS["egomimic_smallclothfold_robot"] +def test_egomimic_groceries_human_is_bimanual_xyz() -> None: + spec = action_space.UNIFIED_ACTION_SPECS["egomimic_groceries_human"] + source = np.arange(6, dtype=np.float32) + mapped = action_space.map_array(source, spec.action_mapping) + np.testing.assert_array_equal( + mapped[action_space.LEFT_EEF_POSITION : action_space.LEFT_EEF_POSITION + 3], + source[:3], + ) + np.testing.assert_array_equal( + mapped[action_space.RIGHT_EEF_POSITION : action_space.RIGHT_EEF_POSITION + 3], + source[3:], + ) + assert sum(spec.action_mask) == 6 + + +@pytest.mark.parametrize( + "dataset_id", + ["egomimic_groceries_robot", "egomimic_smallclothfold_robot"], +) +def test_egomimic_bimanual_robot_layout(dataset_id: str) -> None: + spec = action_space.UNIFIED_ACTION_SPECS[dataset_id] source = np.arange(20, dtype=np.float32) mapped = action_space.map_array(source, spec.action_mapping) np.testing.assert_array_equal(mapped[action_space.LEFT_ARM : action_space.LEFT_ARM + 6], source[:6]) diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index 3690909..46bd0bf 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -144,6 +144,17 @@ def test_staged_configs_use_expected_data_and_strict_checkpoint_loader() -> None "egomimic_groceries_human", "egomimic_groceries_robot", } + assert { + dataset.uid: dataset.action_dim + for dataset in config._EGOSCALE_STAGE2_EGOMIMIC.data.datasets + } == { + "egomimic_groceries_human": 6, + "egomimic_groceries_robot": 20, + } + assert all( + dataset.val_splits == {"seen": "train", "unseen": "train"} + for dataset in config._EGOSCALE_STAGE2_EGOMIMIC.data.datasets + ) assert all(dataset.precomputed_action_chunk for dataset in config._EGOSCALE_STAGE2_EGOMIMIC.data.datasets) assert config._EGOSCALE_STAGE3_ROBOT.data is config._ROBOT_ALL_DATA for staged in ( From 85f744ab10527446063f8046aa2f0ea467d7b867 Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 27 Jul 2026 15:47:34 +0800 Subject: [PATCH 39/64] Shard long EgoMimic demos for multihost --- docs/egomimic_stage2.md | 21 +++++---- scripts/convert_egomimic_hdf5_to_rlds.py | 54 ++++++++++++++++-------- 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/docs/egomimic_stage2.md b/docs/egomimic_stage2.md index a879e4e..0f1f591 100644 --- a/docs/egomimic_stage2.md +++ b/docs/egomimic_stage2.md @@ -65,13 +65,13 @@ cd /data/junhe/Atom-0 .venv/bin/python scripts/convert_egomimic_hdf5_to_rlds.py \ --source-hdf5 /data/junhe/datasets/EgoMimic/groceries_human.hdf5 \ - --output-data-dir /data/junhe/RLDS/EgoMimic_smoke \ + --output-data-dir /data/junhe/RLDS/EgoMimic_smoke_v2 \ --max-train-episodes 2 \ --max-validation-episodes 1 .venv/bin/python scripts/convert_egomimic_hdf5_to_rlds.py \ --source-hdf5 /data/junhe/datasets/EgoMimic/groceries_robot.hdf5 \ - --output-data-dir /data/junhe/RLDS/EgoMimic_smoke \ + --output-data-dir /data/junhe/RLDS/EgoMimic_smoke_v2 \ --max-train-episodes 2 \ --max-validation-episodes 1 ``` @@ -79,7 +79,7 @@ cd /data/junhe/Atom-0 生成目录: ```text -/data/junhe/RLDS/EgoMimic_smoke/ +/data/junhe/RLDS/EgoMimic_smoke_v2/ └── ego_mimic_rlds/ ├── groceries_human/1.0.0/ └── groceries_robot/1.0.0/ @@ -91,6 +91,11 @@ episode。为避免把同一份大图像数据物理写入三次,groceries bui 一次 `train` split,配置中的 `seen/unseen` 都读取该 split。这里的验证指标 只能作为流程健康检查,不能作为 held-out 或 unseen-task 结果汇报。 +转换器还会把公开文件中的 5000-frame 长 demo 切成最多 256 帧的 RLDS +episodes。每帧的 `actions_*_act[100]` 已经预先对齐,因此切 episode 不会 +截断 future-action 监督;这样也避免单个 TFRecord example 达到 1GB,并让 +两个 JAX host 能按 episode 读取互斥数据。 + ## 三、计算 smoke norm stats smoke stats 与正式 stats 分开,避免少量样本统计污染正式训练: @@ -98,8 +103,8 @@ smoke stats 与正式 stats 分开,避免少量样本统计污染正式训练 ```bash cd /data/junhe/Atom-0 -export ATOM_EGOMIMIC_RLDS_ROOT=/data/junhe/RLDS/EgoMimic_smoke -export ASSETS_BASE_DIR=/data/junhe/smoke-assets +export ATOM_EGOMIMIC_RLDS_ROOT=/data/junhe/RLDS/EgoMimic_smoke_v2 +export ASSETS_BASE_DIR=/data/junhe/smoke-assets-v2 .venv/bin/python scripts/compute_cotrain_norm_stats_light.py \ --config-name egoscale_stage2_egomimic \ @@ -111,7 +116,7 @@ export ASSETS_BASE_DIR=/data/junhe/smoke-assets 应生成: ```text -/data/junhe/smoke-assets/egoscale_stage2_egomimic_groceries/ +/data/junhe/smoke-assets-v2/egoscale_stage2_egomimic_groceries/ ├── action_chunk_metadata.json ├── egomimic_groceries_human/ │ ├── norm_stats.json @@ -155,8 +160,8 @@ export BATCH_SIZE=16 export NUM_TRAIN_STEPS=100 export PARAMS_PATH=/data/junhe/checkpoints/egoscale_stage1_ego/stage1_ego_cartesian_clean_baidu_v2/5000/params -export ATOM_EGOMIMIC_RLDS_ROOT=/data/junhe/RLDS/EgoMimic_smoke -export ASSETS_BASE_DIR=/data/junhe/smoke-assets +export ATOM_EGOMIMIC_RLDS_ROOT=/data/junhe/RLDS/EgoMimic_smoke_v2 +export ASSETS_BASE_DIR=/data/junhe/smoke-assets-v2 export CHECKPOINT_BASE_DIR=/data/junhe/checkpoints export DATA_NUM_PARALLEL_READS=1 diff --git a/scripts/convert_egomimic_hdf5_to_rlds.py b/scripts/convert_egomimic_hdf5_to_rlds.py index 9cc1817..723aad4 100644 --- a/scripts/convert_egomimic_hdf5_to_rlds.py +++ b/scripts/convert_egomimic_hdf5_to_rlds.py @@ -154,6 +154,7 @@ def __init__( prompt: str, max_train_episodes: int | None, max_validation_episodes: int | None, + episode_chunk_size: int, ): super().__init__(name=name, version="1.0.0", description=f"EgoMimic {task} {domain}") self.source_path = source_path @@ -162,6 +163,7 @@ def __init__( self.prompt = prompt self.max_train_episodes = max_train_episodes self.max_validation_episodes = max_validation_episodes + self.episode_chunk_size = episode_chunk_size class EgoMimicRlds(tfds.core.GeneratorBasedBuilder): @@ -218,6 +220,8 @@ def _info(self) -> tfds.core.DatasetInfo: { "source_file": tfds.features.Text(), "source_demo_id": tfds.features.Text(), + "source_start_index": np.int64, + "source_end_index": np.int64, "task": tfds.features.Text(), "domain": tfds.features.Text(), "eef_frame": tfds.features.Text(), @@ -274,18 +278,25 @@ def _generate_examples(self, demo_names: list[str]) -> Iterator[tuple[str, dict[ with h5py.File(source, "r") as h5: for demo_name in demo_names: demo = h5[f"data/{demo_name}"] - yield demo_name, { - "episode_metadata": { - "source_file": source.name, - "source_demo_id": demo_name, - "task": self.builder_config.task, - "domain": self.builder_config.domain, - "eef_frame": "current_egocentric_camera", - }, - "steps": self._generate_steps(demo), - } - - def _generate_steps(self, demo) -> Iterator[dict[str, Any]]: + length = int(demo["obs/ee_pose"].shape[0]) + chunk_size = self.builder_config.episode_chunk_size + for start in range(0, length, chunk_size): + end = min(start + chunk_size, length) + episode_id = f"{demo_name}_frames_{start:06d}_{end:06d}" + yield episode_id, { + "episode_metadata": { + "source_file": source.name, + "source_demo_id": demo_name, + "source_start_index": np.int64(start), + "source_end_index": np.int64(end), + "task": self.builder_config.task, + "domain": self.builder_config.domain, + "eef_frame": "current_egocentric_camera", + }, + "steps": self._generate_steps(demo, start, end), + } + + def _generate_steps(self, demo, start: int, end: int) -> Iterator[dict[str, Any]]: obs = demo["obs"] xyz_actions = demo["actions_xyz_act"] joint_actions = demo.get("actions_joints_act") @@ -304,7 +315,7 @@ def _generate_steps(self, demo) -> Iterator[dict[str, Any]]: slot: np.zeros(self._schema.image_shapes[slot], dtype=np.uint8) for slot in ("left_wrist", "right_wrist") } - for index in range(length): + for index in range(start, end): xyz_chunk = np.asarray(xyz_actions[index], dtype=np.float32) xyz_now = np.asarray(xyz_state[index], dtype=np.float32) if joint_actions is None: @@ -343,11 +354,11 @@ def _generate_steps(self, demo) -> Iterator[dict[str, Any]]: "image_mask_right_wrist": masks["right_wrist"], "prompt": self.builder_config.prompt, "eef_frame": "current_egocentric_camera", - "is_first": index == 0, - "is_last": index == length - 1, - "is_terminal": index == length - 1, + "is_first": index == start, + "is_last": index == end - 1, + "is_terminal": index == end - 1, "discount": np.float32(1.0), - "reward": np.float32(1.0 if index == length - 1 else 0.0), + "reward": np.float32(1.0 if index == end - 1 else 0.0), } @@ -366,12 +377,20 @@ def main() -> None: parser.add_argument("--output-data-dir", type=Path, required=True) parser.add_argument("--max-train-episodes", type=_positive_or_none, default=None) parser.add_argument("--max-validation-episodes", type=_positive_or_none, default=None) + parser.add_argument( + "--episode-chunk-size", + type=int, + default=256, + help="Maximum frames per generated RLDS episode; keeps TFRecord examples multi-host shardable.", + ) args = parser.parse_args() source = args.source_hdf5.expanduser().resolve() if not source.is_file(): raise FileNotFoundError(source) task, domain = _parse_source_name(source) + if args.episode_chunk_size <= 0: + raise ValueError("--episode-chunk-size must be positive") config_name = f"{task}_{domain}" config = _EgoMimicConfig( name=config_name, @@ -381,6 +400,7 @@ def main() -> None: prompt=_TASK_PROMPTS[task], max_train_episodes=args.max_train_episodes, max_validation_episodes=args.max_validation_episodes, + episode_chunk_size=args.episode_chunk_size, ) builder = EgoMimicRlds( data_dir=str(args.output_data_dir.expanduser().resolve()), From cafd2bf107967ac74ebfff7740fcce786bb6b286 Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 27 Jul 2026 15:55:30 +0800 Subject: [PATCH 40/64] Use disjoint EgoMimic human validation --- docs/egomimic_stage2.md | 11 ++++++----- src/openpi/cotrain/config.py | 7 +++---- tests/cotrain/test_unified_config.py | 9 ++++++--- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/docs/egomimic_stage2.md b/docs/egomimic_stage2.md index 0f1f591..1a93cc2 100644 --- a/docs/egomimic_stage2.md +++ b/docs/egomimic_stage2.md @@ -85,11 +85,12 @@ cd /data/junhe/Atom-0 └── groceries_robot/1.0.0/ ``` -转换器使用官方 `mask/train` 和 `mask/valid`。公开 groceries 文件只有一个 -5000-frame demo,两个官方 mask 都指向该 demo,因此 validation 也不是独立 -episode。为避免把同一份大图像数据物理写入三次,groceries builder 只保存 -一次 `train` split,配置中的 `seen/unseen` 都读取该 split。这里的验证指标 -只能作为流程健康检查,不能作为 held-out 或 unseen-task 结果汇报。 +转换器使用官方 `mask/train` 和 `mask/valid`。human 文件有 50 demos, +其中 train 36、valid 14 且不重叠,因此 human `seen/unseen` 都读取 official +valid(没有语义上的 unseen task)。robot 文件只有一个 5000-frame demo, +两个官方 mask 都指向该 demo;为避免把同一份大图像物理写入三次,robot +builder 只保存一次 `train` split,其 `seen/unseen` 都读取 train。robot +验证只能作为流程健康检查,不能作为 held-out 结果汇报。 转换器还会把公开文件中的 5000-frame 长 demo 切成最多 256 帧的 RLDS episodes。每帧的 `actions_*_act[100]` 已经预先对齐,因此切 episode 不会 diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index b7be086..f607b43 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -605,10 +605,9 @@ def assets_dirs(self) -> pathlib.Path: builder_dir=f"{_EGOMIMIC_RLDS_ROOT}/ego_mimic_rlds/groceries_human/1.0.0", weight=0.5, train_split="train", - # Public groceries contains one long demo referenced by both official - # masks. Reuse the physical train split for flow-health evaluation to - # avoid writing the same ~44GB episode three times. - val_splits={"seen": "train", "unseen": "train"}, + # Human groceries has 36 official train and 14 disjoint valid demos. + # There is no semantic unseen split, so both logical labels alias valid. + val_splits={"seen": "seen_test", "unseen": "unseen_test"}, restructure_name="egomimic", action_dim=6, precomputed_action_chunk=True, diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index 46bd0bf..4f3f832 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -151,10 +151,13 @@ def test_staged_configs_use_expected_data_and_strict_checkpoint_loader() -> None "egomimic_groceries_human": 6, "egomimic_groceries_robot": 20, } - assert all( - dataset.val_splits == {"seen": "train", "unseen": "train"} + assert { + dataset.uid: dataset.val_splits for dataset in config._EGOSCALE_STAGE2_EGOMIMIC.data.datasets - ) + } == { + "egomimic_groceries_human": {"seen": "seen_test", "unseen": "unseen_test"}, + "egomimic_groceries_robot": {"seen": "train", "unseen": "train"}, + } assert all(dataset.precomputed_action_chunk for dataset in config._EGOSCALE_STAGE2_EGOMIMIC.data.datasets) assert config._EGOSCALE_STAGE3_ROBOT.data is config._ROBOT_ALL_DATA for staged in ( From aac693c09abe2b2d9fa41c5f52fee463c18a2562 Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 27 Jul 2026 16:08:06 +0800 Subject: [PATCH 41/64] Document EgoMimic stage two smoke --- docs/egomimic_stage2.md | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/docs/egomimic_stage2.md b/docs/egomimic_stage2.md index 1a93cc2..3140947 100644 --- a/docs/egomimic_stage2.md +++ b/docs/egomimic_stage2.md @@ -192,6 +192,23 @@ python atom0_jax_job.py - step 50 和最终完整 checkpoint 成功; - 使用保存的 checkpoint 恢复 5–10 steps。 +### 已完成的 DSW 单卡 smoke + +2026-07-27 已在百度 DSW 的 1×B20Z 183GB 上完成 20-step +`stage2_egomimic` smoke: + +- 从 + `/data/junhe/checkpoints/egoscale_stage1_ego/stage1_ego_cartesian_clean_baidu_v2/10000/params` + 严格恢复 Stage 1 参数; +- human/robot 两个 builder 均成功训练,loss 和 grad norm 有限; +- step 10 fixed-seed flow loss:aggregate `0.7967`、human `0.5081`、 + robot `1.0852`; +- step 19 完整保存 `params + train_state + assets`,checkpoint 约 19GB; +- W&B run ID:`lmnwbktv`。 + +该 smoke 使用精简 human builder,验证值仅用于证明评估链路可运行。human +正式 builder 必须用全部 36 个 train demo 和 14 个 valid demo 重新转换和统计。 + ## 五、正式转换与 Stage 2 训练 smoke 通过后使用新的输出根目录转换全部 episode,不覆盖 smoke builder: @@ -265,5 +282,7 @@ action expert 和动作投影。正式效果对照至少需要: 3. `pi05_base → Stage 1 EgoVerse → EgoMimic aligned → robot-only` EgoMimic groceries 虽是双臂 ALOHA 数据,但 human 侧仍没有 orientation 或 -gripper 标签,且公开 valid 与 train 共享同一 demo。它不能替代项目未来计划 -采集的双臂 EEF+平行夹爪 aligned 数据,也不能直接证明对目标机器人任务有效。 +gripper 标签。human 的官方 train/valid demo 互斥;但 robot 文件的官方 +train/valid mask 都指向唯一的 `demo_0`,因此 robot validation 不是 held-out +评估。它不能替代项目未来计划采集的双臂 EEF+平行夹爪 aligned 数据,也不能 +直接证明对目标机器人任务有效。 From 1083c54e2859c86c49c68fc8305352446d84e54e Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 27 Jul 2026 16:51:58 +0800 Subject: [PATCH 42/64] Support finite full-data norm statistics --- docs/egomimic_stage2.md | 6 ++++- scripts/compute_cotrain_norm_stats_light.py | 30 ++++++++++++++++++--- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/docs/egomimic_stage2.md b/docs/egomimic_stage2.md index 3140947..0cd526a 100644 --- a/docs/egomimic_stage2.md +++ b/docs/egomimic_stage2.md @@ -235,9 +235,13 @@ export ASSETS_BASE_DIR=/data/junhe/assets --config-name egoscale_stage2_egomimic \ --exp-name egomimic_groceries_full_norm \ --assets-base-dir "$ASSETS_BASE_DIR" \ - --max-frames 1000000 + --max-frames 1000000 \ + --finite-train ``` +`--finite-train` 会禁用 train split 的无限 repeat,并保留最后一个不满 batch +的尾批,因此每个 builder 的全部唯一 train frames 恰好统计一次。 + 正式训练建议先使用最新稳定的 Stage 1 checkpoint,而不是固定使用早期 5000 step。第一轮配置: diff --git a/scripts/compute_cotrain_norm_stats_light.py b/scripts/compute_cotrain_norm_stats_light.py index 0f76e08..3c5b140 100644 --- a/scripts/compute_cotrain_norm_stats_light.py +++ b/scripts/compute_cotrain_norm_stats_light.py @@ -273,16 +273,31 @@ def _finalize_stats(stats: dict, dataset_cfg): } -def _compute_light_stats(config, data_config, dataset_cfg, max_frames: int, *, show_progress: bool = True): +def _compute_light_stats( + config, + data_config, + dataset_cfg, + max_frames: int, + *, + show_progress: bool = True, + finite_train: bool = False, +): batch_size = config.batch_size num_batches = max(1, max_frames // batch_size) - dataset = _create_light_dataset(data_config, dataset_cfg, config.model.action_horizon, batch_size) + dataset = _create_light_dataset( + data_config, + dataset_cfg, + config.model.action_horizon, + batch_size, + repeat=not finite_train, + drop_remainder=not finite_train, + ) stats = _empty_stats() n_frames = 0 iterator = islice(iter(dataset.as_numpy_iterator()), num_batches) if show_progress: - iterator = tqdm.tqdm(iterator, total=num_batches, desc=dataset_cfg.name) + iterator = tqdm.tqdm(iterator, total=None if finite_train else num_batches, desc=dataset_cfg.name) for batch in iterator: state, actions = _state_actions_from_light_batch(batch, dataset_cfg) _update_stats(stats, state, actions) @@ -383,6 +398,7 @@ def main( verify_against_old: bool = False, verify_frames: int = 1024, verify_tolerance: float = 1e-5, + finite_train: bool = False, ) -> None: config = cotrain_config.get_config(config_name) config = dataclasses.replace(config, exp_name=exp_name) @@ -418,7 +434,13 @@ def main( pass print(f"\n=== Computing LIGHT norm stats for dataset '{ds.uid}' (split='{ds.train_split}') ===") - norm_stats, n_frames = _compute_light_stats(config, data_config, ds, max_frames) + norm_stats, n_frames = _compute_light_stats( + config, + data_config, + ds, + max_frames, + finite_train=finite_train, + ) if n_frames == 0: raise RuntimeError(f"No frames read for dataset '{ds.uid}' (split '{ds.train_split}').") print(f" accumulated {n_frames} frames") From 56095634b192710550834de9d18fa497ebeaacdc Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 27 Jul 2026 16:52:52 +0800 Subject: [PATCH 43/64] Clean up norm statistics lint --- scripts/compute_cotrain_norm_stats_light.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/scripts/compute_cotrain_norm_stats_light.py b/scripts/compute_cotrain_norm_stats_light.py index 3c5b140..d1ecedf 100644 --- a/scripts/compute_cotrain_norm_stats_light.py +++ b/scripts/compute_cotrain_norm_stats_light.py @@ -213,13 +213,12 @@ def remove_filter(frame): dataset = dataset.map(remove_filter) dataset = dataset.batch(batch_size, drop_remainder=drop_remainder) - dataset = dataset.with_ram_budget(1) - return dataset + return dataset.with_ram_budget(1) def _resolve_light_data_config(config): """Resolve unified mappings without loading tokenizer or any existing norm stats.""" - datasets = cotrain_config._resolve_unified_datasets(config.data.datasets, config.model) + datasets = cotrain_config._resolve_unified_datasets(config.data.datasets, config.model) # noqa: SLF001 return dataclasses.replace(config.data, datasets=datasets) @@ -393,12 +392,12 @@ def main( max_frames: int = 1_000_000, rlds_data_dir: str | None = None, assets_base_dir: str | None = None, - overwrite: bool = False, + overwrite: bool = False, # noqa: FBT001, FBT002 dataset_id: str | None = None, - verify_against_old: bool = False, + verify_against_old: bool = False, # noqa: FBT001, FBT002 verify_frames: int = 1024, verify_tolerance: float = 1e-5, - finite_train: bool = False, + finite_train: bool = False, # noqa: FBT001, FBT002 ) -> None: config = cotrain_config.get_config(config_name) config = dataclasses.replace(config, exp_name=exp_name) From 66498340a798ff7580cc1f8d707c01206dded74a Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 27 Jul 2026 18:29:55 +0800 Subject: [PATCH 44/64] Add all-task EgoMimic stage two recipe --- docs/egomimic_stage2.md | 56 +++++++++++ scripts/run_egoscale_stage.sh | 1 + src/openpi/cotrain/config.py | 133 +++++++++++++++++++++------ tests/cotrain/test_unified_config.py | 33 +++++++ 4 files changed, 195 insertions(+), 28 deletions(-) diff --git a/docs/egomimic_stage2.md b/docs/egomimic_stage2.md index 0cd526a..9c06be4 100644 --- a/docs/egomimic_stage2.md +++ b/docs/egomimic_stage2.md @@ -242,6 +242,48 @@ export ASSETS_BASE_DIR=/data/junhe/assets `--finite-train` 会禁用 train split 的无限 repeat,并保留最后一个不满 batch 的尾批,因此每个 builder 的全部唯一 train frames 恰好统计一次。 +### 三任务正式主配置 + +`egoscale_stage2_egomimic` 保留为 groceries-only 消融。正式主配置使用 +`egoscale_stage2_egomimic_all`(启动 stage 名 +`stage2_egomimic_all`),包含: + +- bowlplace human/robot:单臂 XYZ 3D;robot 额外监督 6 joint + gripper; +- groceries human/robot:双臂 XYZ 6D;robot 额外监督双臂 joint + gripper; +- smallclothfold human/robot:双臂 XYZ 6D;robot 额外监督双臂 joint + gripper。 + +六个 builder 各占 `1/6`,即先等权三个任务,再在每个任务中等权 +human/robot,避免长 robot trajectory 按原始帧数主导训练。 + +其余四个文件转换到同一个正式根目录: + +```bash +for source in \ + bowlplace_human.hdf5 \ + bowlplace_robot.hdf5 \ + smallclothfold_human.hdf5 \ + smallclothfold_robot.hdf5 +do + .venv/bin/python scripts/convert_egomimic_hdf5_to_rlds.py \ + --source-hdf5 "/data/junhe/datasets/EgoMimic/${source}" \ + --output-data-dir /data/junhe/RLDS/EgoMimic_full +done +``` + +三任务全量统计: + +```bash +export ATOM_EGOMIMIC_RLDS_ROOT=/data/junhe/RLDS/EgoMimic_full +export ASSETS_BASE_DIR=/data/junhe/assets + +.venv/bin/python scripts/compute_cotrain_norm_stats_light.py \ + --config-name egoscale_stage2_egomimic_all \ + --exp-name egomimic_all_full_norm \ + --assets-base-dir "$ASSETS_BASE_DIR" \ + --max-frames 1000000 \ + --finite-train +``` + 正式训练建议先使用最新稳定的 Stage 1 checkpoint,而不是固定使用早期 5000 step。第一轮配置: @@ -278,6 +320,20 @@ export RESUME=0 python atom0_jax_job.py ``` +三任务正式主实验将上面的: + +```bash +export STAGE=stage2_egomimic +export EXP_NAME=stage2_egomimic_groceries_full_v1 +``` + +替换为: + +```bash +export STAGE=stage2_egomimic_all +export EXP_NAME=stage2_egomimic_all_full_v1 +``` + 本 Stage 2 默认冻结 PaliGemma language transformer,继续训练 vision encoder、 action expert 和动作投影。正式效果对照至少需要: diff --git a/scripts/run_egoscale_stage.sh b/scripts/run_egoscale_stage.sh index fe3e34e..bd11984 100755 --- a/scripts/run_egoscale_stage.sh +++ b/scripts/run_egoscale_stage.sh @@ -26,6 +26,7 @@ case "${STAGE}" in stage2_robot) CONFIG_NAME="egoscale_stage2_robot" ;; stage2_aligned) CONFIG_NAME="egoscale_stage2_aligned" ;; stage2_egomimic) CONFIG_NAME="egoscale_stage2_egomimic" ;; + stage2_egomimic_all) CONFIG_NAME="egoscale_stage2_egomimic_all" ;; stage3_robot) CONFIG_NAME="egoscale_stage3_robot" ;; *) echo "Unknown STAGE=${STAGE}" >&2; exit 2 ;; esac diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index f607b43..e9d4c46 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -587,46 +587,114 @@ def assets_dirs(self) -> pathlib.Path: ) # Public EgoMimic is a different contract from the future in-house 14D aligned -# collection above. The converted groceries pair contains current-camera-frame -# left/right hand XYZ for both domains; robot examples additionally contain two -# ALOHA arms with six joints and one gripper each. Human and robot remain +# collection above. Human files contain current-camera-frame XYZ; robot files +# additionally contain ALOHA joint/gripper targets. Human and robot remain # separate dataset IDs so their normalization statistics are never mixed. _EGOMIMIC_RLDS_ROOT = os.environ.get( "ATOM_EGOMIMIC_RLDS_ROOT", f"{_RLDS_ROOT}/EgoMimic", ).rstrip("/") + + +def _make_egomimic_dataset( + task: str, + domain: str, + *, + action_dim: int, + weight: float, + robot_validation_is_train: bool = False, +) -> CotrainRLDSDataset: + dataset_id = f"egomimic_{task}_{domain}" + if domain == "human": + action_source = "actions_xyz_act" + val_splits = {"seen": "seen_test", "unseen": "unseen_test"} + elif domain == "robot": + action_source = "actions_joints_act+actions_xyz_act" + val_splits = ( + {"seen": "train", "unseen": "train"} + if robot_validation_is_train + else {"seen": "seen_test", "unseen": "unseen_test"} + ) + else: + raise ValueError(f"Unsupported EgoMimic domain: {domain!r}") + return CotrainRLDSDataset( + name="ego_mimic_rlds", + dataset_id=dataset_id, + version="1.0.0", + builder_dir=f"{_EGOMIMIC_RLDS_ROOT}/ego_mimic_rlds/{task}_{domain}/1.0.0", + weight=weight, + train_split="train", + val_splits=val_splits, + restructure_name="egomimic", + action_dim=action_dim, + precomputed_action_chunk=True, + precomputed_action_source=action_source, + precomputed_action_horizon=100, + ) + + _EGOMIMIC_GROCERIES_DATA = CotrainDataConfig( rlds_data_dir=_EGOMIMIC_RLDS_ROOT, datasets=( - CotrainRLDSDataset( - name="ego_mimic_rlds", - dataset_id="egomimic_groceries_human", - version="1.0.0", - builder_dir=f"{_EGOMIMIC_RLDS_ROOT}/ego_mimic_rlds/groceries_human/1.0.0", - weight=0.5, - train_split="train", - # Human groceries has 36 official train and 14 disjoint valid demos. - # There is no semantic unseen split, so both logical labels alias valid. - val_splits={"seen": "seen_test", "unseen": "unseen_test"}, - restructure_name="egomimic", + _make_egomimic_dataset( + "groceries", + "human", action_dim=6, - precomputed_action_chunk=True, - precomputed_action_source="actions_xyz_act", - precomputed_action_horizon=100, + weight=0.5, ), - CotrainRLDSDataset( - name="ego_mimic_rlds", - dataset_id="egomimic_groceries_robot", - version="1.0.0", - builder_dir=f"{_EGOMIMIC_RLDS_ROOT}/ego_mimic_rlds/groceries_robot/1.0.0", + _make_egomimic_dataset( + "groceries", + "robot", + action_dim=20, weight=0.5, - train_split="train", - val_splits={"seen": "train", "unseen": "train"}, - restructure_name="egomimic", + robot_validation_is_train=True, + ), + ), +) + +# Main public aligned-data recipe: balance tasks equally, then balance the human +# and robot domains inside each task. This intentionally does not weight by raw +# frame count, which would let a few long robot trajectories dominate. +_EGOMIMIC_ALL_DATA = CotrainDataConfig( + rlds_data_dir=_EGOMIMIC_RLDS_ROOT, + datasets=( + _make_egomimic_dataset( + "bowlplace", + "human", + action_dim=3, + weight=1 / 6, + ), + _make_egomimic_dataset( + "bowlplace", + "robot", + action_dim=10, + weight=1 / 6, + robot_validation_is_train=True, + ), + _make_egomimic_dataset( + "groceries", + "human", + action_dim=6, + weight=1 / 6, + ), + _make_egomimic_dataset( + "groceries", + "robot", action_dim=20, - precomputed_action_chunk=True, - precomputed_action_source="actions_joints_act+actions_xyz_act", - precomputed_action_horizon=100, + weight=1 / 6, + robot_validation_is_train=True, + ), + _make_egomimic_dataset( + "smallclothfold", + "human", + action_dim=6, + weight=1 / 6, + ), + _make_egomimic_dataset( + "smallclothfold", + "robot", + action_dim=20, + weight=1 / 6, ), ), ) @@ -1116,6 +1184,14 @@ def _strict_stage_checkpoint_loader() -> _weight_loaders.CheckpointWeightLoader: norm_stats_assets_name="egoscale_stage2_egomimic_groceries", ) +_EGOSCALE_STAGE2_EGOMIMIC_ALL = dataclasses.replace( + _EGOSCALE_STAGE2_ROBOT, + name="egoscale_stage2_egomimic_all", + data=_EGOMIMIC_ALL_DATA, + num_train_steps=50_000, + norm_stats_assets_name="egoscale_stage2_egomimic_all", +) + _EGOSCALE_STAGE3_ROBOT = dataclasses.replace( _EGOSCALE_STAGE2_ROBOT, name="egoscale_stage3_robot", @@ -1130,6 +1206,7 @@ def _strict_stage_checkpoint_loader() -> _weight_loaders.CheckpointWeightLoader: _EGOSCALE_STAGE2_ROBOT, _EGOSCALE_STAGE2_ALIGNED, _EGOSCALE_STAGE2_EGOMIMIC, + _EGOSCALE_STAGE2_EGOMIMIC_ALL, _EGOSCALE_STAGE3_ROBOT, ] diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index 4f3f832..c46b17e 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -18,6 +18,7 @@ def test_all_registered_cotrain_configs_resolve_to_unified_80d() -> None: "egoscale_stage2_robot", "egoscale_stage2_aligned", "egoscale_stage2_egomimic", + "egoscale_stage2_egomimic_all", "egoscale_stage3_robot", } for train_config in config._COTRAIN_CONFIGS: @@ -159,11 +160,43 @@ def test_staged_configs_use_expected_data_and_strict_checkpoint_loader() -> None "egomimic_groceries_robot": {"seen": "train", "unseen": "train"}, } assert all(dataset.precomputed_action_chunk for dataset in config._EGOSCALE_STAGE2_EGOMIMIC.data.datasets) + assert config._EGOSCALE_STAGE2_EGOMIMIC_ALL.data is config._EGOMIMIC_ALL_DATA + assert { + dataset.uid: dataset.action_dim + for dataset in config._EGOSCALE_STAGE2_EGOMIMIC_ALL.data.datasets + } == { + "egomimic_bowlplace_human": 3, + "egomimic_bowlplace_robot": 10, + "egomimic_groceries_human": 6, + "egomimic_groceries_robot": 20, + "egomimic_smallclothfold_human": 6, + "egomimic_smallclothfold_robot": 20, + } + assert all( + dataset.weight == pytest.approx(1 / 6) + for dataset in config._EGOSCALE_STAGE2_EGOMIMIC_ALL.data.datasets + ) + assert { + dataset.uid: dataset.val_splits + for dataset in config._EGOSCALE_STAGE2_EGOMIMIC_ALL.data.datasets + } == { + "egomimic_bowlplace_human": {"seen": "seen_test", "unseen": "unseen_test"}, + "egomimic_bowlplace_robot": {"seen": "train", "unseen": "train"}, + "egomimic_groceries_human": {"seen": "seen_test", "unseen": "unseen_test"}, + "egomimic_groceries_robot": {"seen": "train", "unseen": "train"}, + "egomimic_smallclothfold_human": {"seen": "seen_test", "unseen": "unseen_test"}, + "egomimic_smallclothfold_robot": {"seen": "seen_test", "unseen": "unseen_test"}, + } + assert all( + dataset.precomputed_action_chunk + for dataset in config._EGOSCALE_STAGE2_EGOMIMIC_ALL.data.datasets + ) assert config._EGOSCALE_STAGE3_ROBOT.data is config._ROBOT_ALL_DATA for staged in ( config._EGOSCALE_STAGE2_ROBOT, config._EGOSCALE_STAGE2_ALIGNED, config._EGOSCALE_STAGE2_EGOMIMIC, + config._EGOSCALE_STAGE2_EGOMIMIC_ALL, config._EGOSCALE_STAGE3_ROBOT, ): assert staged.weight_loader.__class__.__name__ == "CheckpointWeightLoader" From 4f36266ebacf9420bd1d8ab8aa3d083e91bd79bd Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 27 Jul 2026 18:36:31 +0800 Subject: [PATCH 45/64] Document all-task EgoMimic smoke --- docs/egomimic_stage2.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/egomimic_stage2.md b/docs/egomimic_stage2.md index 9c06be4..e93e42a 100644 --- a/docs/egomimic_stage2.md +++ b/docs/egomimic_stage2.md @@ -284,6 +284,19 @@ export ASSETS_BASE_DIR=/data/junhe/assets --finite-train ``` +2026-07-27 已使用正式六-builder RLDS 和全量 stats 在 1×B20Z 上完成 +20-step `stage2_egomimic_all` smoke: + +- 严格恢复 Stage 1 clean checkpoint `10000/params`; +- step 10 aggregate fixed-seed flow loss:seen `0.6844`、unseen `0.6967`; +- 六个 builder 的 loss、训练 grad norm 均为有限值; +- step 19 完整保存 `params + train_state + assets`,约 19GB; +- W&B run ID:`b4xgqrb0`。 + +这里的 seen/unseen 是 pipeline 标签,不代表三个任务都有真正的 held-out 泛化 +测试:只有 human train/valid 和 smallclothfold robot train/valid 是物理分离的; +bowlplace/groceries robot 的公开 valid 与 train 重叠。 + 正式训练建议先使用最新稳定的 Stage 1 checkpoint,而不是固定使用早期 5000 step。第一轮配置: From b8ad99be25154ed5ec601f3d2f94a25e09bb0367 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Tue, 28 Jul 2026 20:17:29 +0800 Subject: [PATCH 46/64] add gemma config --- ...55\347\273\203\346\214\207\345\215\227.md" | 23 ++++ scripts/download_paligemma_pt224.sh | 110 ++++++++++++++++++ scripts/preflight_cotrain_baige.py | 15 ++- scripts/train_cotrain_baige.sh | 26 ++++- ...otrain_full_all_full_norm_local_weights.sh | 11 +- src/openpi/cotrain/config.py | 8 +- src/openpi/cotrain/weight_loaders.py | 56 ++++++++- tests/cotrain/test_unified_config.py | 8 ++ tests/cotrain/test_weight_loaders.py | 78 +++++++++++++ 9 files changed, 315 insertions(+), 20 deletions(-) create mode 100755 scripts/download_paligemma_pt224.sh create mode 100644 tests/cotrain/test_weight_loaders.py diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index df55a0e..0bd2c81 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -35,10 +35,33 @@ SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ `PARAMS_PATH` 指定新实验的模型参数初始化来源: - 默认值为 `/data/models/openpi`,即 pi05; +- 设置为 `/data/models/paligemma/pt_224.npz` 时,只加载未经 π VLA 预训练的 PaliGemma + vision/language backbone;action expert、timestep MLP 和 action input/output projection + 从目标模型的随机初始化开始; - 也可以传训练 checkpoint 的 step 目录(例如 `.../97727`)或其 `params/` 子目录,启动脚本会自动解析; - 对一个全新的 `EXP_NAME`,这里只加载模型参数;optimizer、训练 step 和学习率调度都会重新初始化; - 如果 `EXP_NAME` 已经存在 checkpoint,训练框架会优先恢复该实验自身状态。因此,需要新训练时必须使用未使用过的 `EXP_NAME`。 +三种初始化方式不需要修改 `CONFIG_NAME` 或其他训练参数,只修改 `PARAMS_PATH`: + +```bash +# pi05 VLA 预训练权重 +export PARAMS_PATH=/data/models/openpi + +# 基础 PaliGemma VLM 权重 +export PARAMS_PATH=/data/models/paligemma/pt_224.npz + +# 已训练模型的纯模型参数(不恢复 optimizer/step) +export PARAMS_PATH=/data/wudi/Atom-0/checkpoints/// +``` + +使用 VLM NPZ 时,任务日志必须出现: + +```text +PARAMS_LAYOUT=paligemma-vlm-npz +INIT_POLICY=PaliGemma vision+language loaded; action expert, timestep MLP, and action projections random +``` + ```bash # 查询任务结构与日志 cd /data/wudi/baige-cluster diff --git a/scripts/download_paligemma_pt224.sh b/scripts/download_paligemma_pt224.sh new file mode 100755 index 0000000..52332ac --- /dev/null +++ b/scripts/download_paligemma_pt224.sh @@ -0,0 +1,110 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Download the exact big_vision JAX checkpoint expected by +# LocalPaliGemmaWeightLoader. This is not the PyTorch safetensors checkpoint. +# +# Usage: +# export HF_TOKEN=hf_... +# bash scripts/download_paligemma_pt224.sh [destination_directory] +# +# Default destination: +# /data/models/paligemma +# +# The Hugging Face account behind HF_TOKEN must already have access to: +# google/paligemma-3b-pt-224-jax + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" +DEST_DIR="${1:-/data/models/paligemma}" + +MODEL_REPO="google/paligemma-3b-pt-224-jax" +REMOTE_FILENAME="paligemma-3b-pt-224.npz" +LOCAL_FILENAME="pt_224.npz" +HF_MIRROR_ENDPOINT="https://hf-mirror.com" + +# Do not use a VPN or HTTP(S) proxy for either the mirror request or redirected +# object-storage downloads. +unset HTTP_PROXY HTTPS_PROXY ALL_PROXY +unset http_proxy https_proxy all_proxy + +export HF_ENDPOINT="${HF_MIRROR_ENDPOINT}" +export HF_HUB_DISABLE_TELEMETRY=1 +export HF_HUB_ETAG_TIMEOUT="${HF_HUB_ETAG_TIMEOUT:-60}" +export HF_HUB_DOWNLOAD_TIMEOUT="${HF_HUB_DOWNLOAD_TIMEOUT:-600}" +export HF_HOME="${HF_HOME:-${DEST_DIR}/.hf_cache}" + +if [[ -z "${HF_TOKEN:-}" ]]; then + echo "HF_TOKEN is not set." >&2 + echo "Accept access to ${MODEL_REPO}, then export a read token:" >&2 + echo " export HF_TOKEN=hf_..." >&2 + exit 2 +fi + +HF_CLI="${REPO_DIR}/.venv/bin/huggingface-cli" +if [[ ! -x "${HF_CLI}" ]]; then + HF_CLI="$(command -v huggingface-cli || true)" +fi +if [[ -z "${HF_CLI}" || ! -x "${HF_CLI}" ]]; then + echo "huggingface-cli was not found. Install the Atom-0 environment first." >&2 + exit 2 +fi + +mkdir -p "${DEST_DIR}" "${HF_HOME}" + +echo "Downloading ${MODEL_REPO}/${REMOTE_FILENAME}" +echo "Mirror: ${HF_ENDPOINT}" +echo "Proxy variables: cleared" +echo "Destination: ${DEST_DIR}" + +# huggingface_hub resumes an interrupted download from its local metadata/cache. +"${HF_CLI}" download \ + "${MODEL_REPO}" \ + "${REMOTE_FILENAME}" \ + --repo-type model \ + --local-dir "${DEST_DIR}" + +DOWNLOADED_PATH="${DEST_DIR}/${REMOTE_FILENAME}" +LOADER_PATH="${DEST_DIR}/${LOCAL_FILENAME}" + +if [[ ! -s "${DOWNLOADED_PATH}" ]]; then + echo "Download did not produce a non-empty file: ${DOWNLOADED_PATH}" >&2 + exit 1 +fi + +if [[ -e "${LOADER_PATH}" && ! -L "${LOADER_PATH}" ]]; then + echo "Refusing to replace existing regular file: ${LOADER_PATH}" >&2 + echo "The downloaded checkpoint is available at: ${DOWNLOADED_PATH}" >&2 + exit 2 +fi +ln -sfn "${REMOTE_FILENAME}" "${LOADER_PATH}" + +# Read only the NPZ directory and parameter names; arrays are not loaded into RAM. +"${REPO_DIR}/.venv/bin/python" - "${LOADER_PATH}" <<'PY' +import pathlib +import sys + +import numpy as np + +path = pathlib.Path(sys.argv[1]) +with np.load(path, allow_pickle=False) as checkpoint: + keys = checkpoint.files + has_image = any(key.startswith("params/img/") for key in keys) + has_llm = any(key.startswith("params/llm/") for key in keys) + if not has_image or not has_llm: + raise SystemExit( + f"Unexpected PaliGemma NPZ layout: image={has_image}, llm={has_llm}, " + f"num_keys={len(keys)}" + ) + print(f"NPZ layout OK: {len(keys)} arrays; image=True; llm=True") +PY + +du -h "${DOWNLOADED_PATH}" + +if [[ "${VERIFY_SHA256:-0}" == "1" ]]; then + sha256sum "${DOWNLOADED_PATH}" | tee "${DOWNLOADED_PATH}.sha256" +fi + +echo "Download complete." +echo "Use this path for VLM initialization:" +echo " ${LOADER_PATH}" diff --git a/scripts/preflight_cotrain_baige.py b/scripts/preflight_cotrain_baige.py index 1a1aa90..e5faa0d 100755 --- a/scripts/preflight_cotrain_baige.py +++ b/scripts/preflight_cotrain_baige.py @@ -20,8 +20,14 @@ def resolve_init_params_path(path: Path) -> Path: - """Resolve released params, a training step, or a training step's params child.""" + """Resolve a PaliGemma NPZ, released params, or training checkpoint path.""" path = path.resolve() + if path.is_file() and path.suffix == ".npz": + with np.load(path, allow_pickle=False) as checkpoint: + keys = checkpoint.files + assert any(key.startswith("params/img/") for key in keys), f"{path}: missing params/img" + assert any(key.startswith("params/llm/") for key in keys), f"{path}: missing params/llm" + return path if (path / "_CHECKPOINT_METADATA").is_file() and (path / "params" / "manifest.ocdbt").is_file(): return path / "params" if (path / "manifest.ocdbt").is_file() and ( @@ -29,7 +35,7 @@ def resolve_init_params_path(path: Path) -> Path: ): return path raise AssertionError( - f"Invalid PARAMS_PATH={path}: expected released params, a training step, or its params/ child" + f"Invalid PARAMS_PATH={path}: expected a PaliGemma .npz, released params, a training step, or its params/ child" ) @@ -60,7 +66,8 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: if config_name in {"cotrain_real_robot_fix", "cotrain_full_all_full_norm"}: assert set(ids).isdisjoint(FIX_EXCLUDED_DATASET_IDS) - assert (params_path / "manifest.ocdbt").is_file(), params_path / "manifest.ocdbt" + if params_path.is_dir(): + assert (params_path / "manifest.ocdbt").is_file(), params_path / "manifest.ocdbt" total_frames = 0 degenerate = [] @@ -109,7 +116,7 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: print( f"PASS {config_name}: datasets={len(ids)}, source_frames={total_frames:,}, " - f"init_params={params_path}" + f"init_params={params_path}, init_kind={'paligemma-vlm' if params_path.is_file() else 'orbax-checkpoint'}" ) for item in degenerate: print(f"WARN degenerate active quantile (smoke test must remain finite): {item}") diff --git a/scripts/train_cotrain_baige.sh b/scripts/train_cotrain_baige.sh index b88d610..d6080cb 100755 --- a/scripts/train_cotrain_baige.sh +++ b/scripts/train_cotrain_baige.sh @@ -86,14 +86,19 @@ if [[ "${CONFIG_NAME}" == "cotrain_real_only_legacy32" || fi RANK_ID="${RANK:-0}" -# PARAMS_PATH controls model-weight initialization for a fresh EXP_NAME. Accept both -# released/exported parameter directories and a training step directory: +# PARAMS_PATH controls model-weight initialization for a fresh EXP_NAME. Accept: +# /data/models/paligemma/pt_224.npz # /data/models/openpi # checkpoints/// # checkpoints////params -# Only the params item is loaded; train_state/optimizer/step are deliberately ignored. +# A PaliGemma NPZ initializes only the vision/language backbone; the action stack +# remains random. An Orbax path initializes all shape-compatible model weights. +# train_state/optimizer/step are deliberately ignored in both cases. REQUESTED_PARAMS_PATH="${PARAMS_PATH}" -if [[ -f "${REQUESTED_PARAMS_PATH}/_CHECKPOINT_METADATA" && +if [[ -f "${REQUESTED_PARAMS_PATH}" && "${REQUESTED_PARAMS_PATH}" == *.npz ]]; then + PARAMS_PATH="${REQUESTED_PARAMS_PATH}" + PARAMS_LAYOUT="paligemma-vlm-npz" +elif [[ -f "${REQUESTED_PARAMS_PATH}/_CHECKPOINT_METADATA" && -f "${REQUESTED_PARAMS_PATH}/params/manifest.ocdbt" ]]; then PARAMS_PATH="${REQUESTED_PARAMS_PATH}/params" PARAMS_LAYOUT="training-step" @@ -107,7 +112,7 @@ elif [[ -f "${REQUESTED_PARAMS_PATH}/manifest.ocdbt" && PARAMS_LAYOUT="training-params" else echo "Invalid PARAMS_PATH=${REQUESTED_PARAMS_PATH}" >&2 - echo "Expected a released params directory, a training step directory, or its params/ child." >&2 + echo "Expected a PaliGemma .npz, released params directory, training step, or its params/ child." >&2 exit 2 fi PARAMS_PATH="$(readlink -f -- "${PARAMS_PATH}")" @@ -138,7 +143,11 @@ if (( VAL_BATCH_SIZE <= 0 || VAL_BATCH_SIZE % GLOBAL_DEVICE_COUNT != 0 )); then exit 2 fi -test -f "${PARAMS_PATH}/manifest.ocdbt" +if [[ "${PARAMS_LAYOUT}" == "paligemma-vlm-npz" ]]; then + test -f "${PARAMS_PATH}" +else + test -f "${PARAMS_PATH}/manifest.ocdbt" +fi test -d "${RLDS_DATA_DIR}" test -d "${ASSETS_BASE_DIR}/${ASSET_CONFIG_NAME}" @@ -189,6 +198,11 @@ exec > >(tee -a "${LOG_DIR}/baige_${CONFIG_NAME}_${EXP_NAME}_rank${RANK_ID}.log" echo "CONFIG_NAME=${CONFIG_NAME} EXP_NAME=${EXP_NAME} MODE=${MODE}" echo "WORLD_SIZE=${WORLD_SIZE:-1} RANK=${RANK_ID} MASTER=${JAX_COORDINATOR_ADDRESS}" echo "INIT_PARAMS_PATH=${PARAMS_PATH} PARAMS_LAYOUT=${PARAMS_LAYOUT} (model weights only; optimizer/step reset for fresh EXP_NAME)" +if [[ "${PARAMS_LAYOUT}" == "paligemma-vlm-npz" ]]; then + echo "INIT_POLICY=PaliGemma vision+language loaded; action expert, timestep MLP, and action projections random" +else + echo "INIT_POLICY=all shape-compatible checkpoint model weights loaded" +fi echo "FSDP_DEVICES=${FSDP_DEVICES} BATCH_SIZE=${BATCH_SIZE} VAL_BATCH_SIZE=${VAL_BATCH_SIZE} NUM_TRAIN_STEPS=${NUM_TRAIN_STEPS}" exec .venv/bin/python -u scripts/train_cotrain.py "${args[@]}" diff --git a/scripts/train_cotrain_full_all_full_norm_local_weights.sh b/scripts/train_cotrain_full_all_full_norm_local_weights.sh index 59a1e0b..9394000 100755 --- a/scripts/train_cotrain_full_all_full_norm_local_weights.sh +++ b/scripts/train_cotrain_full_all_full_norm_local_weights.sh @@ -15,10 +15,15 @@ RLDS_DATA_DIR="${RLDS_DATA_DIR:-/mnt/bos/bo23lu}" LOG_DIR="${LOG_DIR:-${REPO_DIR}}" RANK_ID="${RANK:-0}" -if [[ ! -f "${PARAMS_PATH}/_CHECKPOINT_METADATA" || ! -f "${PARAMS_PATH}/manifest.ocdbt" ]]; then - echo "Missing local pi05 params checkpoint at: ${PARAMS_PATH}" >&2 +if [[ -f "${PARAMS_PATH}" && "${PARAMS_PATH}" == *.npz ]]; then + PARAMS_LAYOUT="paligemma-vlm-npz" +elif [[ -f "${PARAMS_PATH}/_CHECKPOINT_METADATA" && -f "${PARAMS_PATH}/manifest.ocdbt" ]]; then + PARAMS_LAYOUT="released-params" +else + echo "Invalid PARAMS_PATH=${PARAMS_PATH}: expected PaliGemma .npz or local params checkpoint" >&2 exit 1 fi +PARAMS_PATH="$(readlink -f -- "${PARAMS_PATH}")" : "${WANDB_API_KEY:?Please export WANDB_API_KEY before running this script.}" @@ -33,6 +38,8 @@ if [[ -z "${JAX_COORDINATOR_ADDRESS:-}" && -n "${MASTER_ADDR:-}" ]]; then export JAX_COORDINATOR_ADDRESS="${MASTER_ADDR}:29500" fi +echo "INIT_PARAMS_PATH=${PARAMS_PATH} PARAMS_LAYOUT=${PARAMS_LAYOUT}" + .venv/bin/python -u scripts/train_cotrain.py cotrain_full_all_full_norm \ --exp_name="${EXP_NAME:-cotrain_full_all_full_norm_16gpus_local_weights}" \ --fsdp_devices "${FSDP_DEVICES:-8}" \ diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 037d177..d98db03 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -27,7 +27,6 @@ import openpi.training.config as _config import openpi.training.droid_rlds_dataset as droid_rlds_dataset import openpi.training.optimizer as _optimizer -import openpi.training.weight_loaders as weight_loaders import openpi.transforms as _transforms logger = logging.getLogger(__name__) @@ -970,7 +969,10 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): # Controlled action-space ablation: same Piper30+Piper2 mixture and optimizer recipe as # cotrain_real_only, but retain the pre-unified pi0.5 layout (native Piper14 in slots 0:14, # padded to the checkpoint-compatible 32D model width). Since the shapes match pi05_base, -# load the complete pretrained 32D action head instead of shape-skipping it. +# load the complete pretrained 32D action head instead of shape-skipping it. The +# shape-safe loader is also the common PARAMS_PATH entry point: when given a +# PaliGemma NPZ it initializes only the VLM backbone and leaves the action stack +# random. _REAL_ONLY_LEGACY32_DATA = dataclasses.replace( _REAL_ONLY_DATA, unified_action_space=False, @@ -981,7 +983,7 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): name="cotrain_real_only_legacy32", model=_LEGACY32_PI05_MODEL, data=_REAL_ONLY_LEGACY32_DATA, - weight_loader=weight_loaders.CheckpointWeightLoader("gs://openpi-assets/checkpoints/pi05_base/params"), + weight_loader=_PI05_BASE_SHAPE_SAFE_LOADER, ) # Historical replay of the successful June-29 Aliyun Piper-only run. Unlike the controlled diff --git a/src/openpi/cotrain/weight_loaders.py b/src/openpi/cotrain/weight_loaders.py index 1870753..394a441 100644 --- a/src/openpi/cotrain/weight_loaders.py +++ b/src/openpi/cotrain/weight_loaders.py @@ -5,6 +5,8 @@ """ import dataclasses +import logging +from pathlib import Path import flax.traverse_util import numpy as np @@ -14,6 +16,8 @@ import openpi.shared.download as download from openpi.training.weight_loaders import _merge_params +logger = logging.getLogger(__name__) + @dataclasses.dataclass(frozen=True) class LocalPaliGemmaWeightLoader: @@ -35,18 +39,30 @@ def load(self, params: at.Params) -> at.Params: @dataclasses.dataclass(frozen=True) class ShapeSafeCheckpointWeightLoader: - """Load a checkpoint, skipping keys whose shapes no longer match the target model. + """Load either an Orbax checkpoint or a local PaliGemma big_vision NPZ. + + PARAMS_PATH is intentionally the only initialization switch used by the co-training + launchers: - This is used when widening the co-training action/state width (e.g. pi05_base has a - 32-wide head while full-all uses 80). Matching pi05_base weights are loaded; widened - projection/head parameters stay at the target model's random initialization. + * An Orbax params directory loads every shape-compatible VLA parameter. + * A ``.npz`` file loads only the PaliGemma image and language backbone. + + In both cases, missing or shape-incompatible target parameters retain their random + initialization. For PaliGemma NPZ initialization this includes the entire action + expert, timestep MLP, and action input/output projections. """ params_path: str missing_regex: str = ".*" def load(self, params: at.Params) -> at.Params: - loaded_params = _model.restore_params(download.maybe_download(self.params_path), restore_type=np.ndarray) + resolved_path = download.maybe_download(self.params_path) + if resolved_path.is_file(): + loaded_params, source_kind = self._load_paligemma_npz(resolved_path) + else: + loaded_params = _model.restore_params(resolved_path, restore_type=np.ndarray) + source_kind = "orbax-checkpoint" + flat_ref = flax.traverse_util.flatten_dict(params, sep="/") flat_loaded = flax.traverse_util.flatten_dict(loaded_params, sep="/") compatible = { @@ -54,8 +70,38 @@ def load(self, params: at.Params) -> at.Params: for key, value in flat_loaded.items() if key in flat_ref and getattr(value, "shape", None) == getattr(flat_ref[key], "shape", None) } + mismatched = { + key + for key, value in flat_loaded.items() + if key in flat_ref and getattr(value, "shape", None) != getattr(flat_ref[key], "shape", None) + } + logger.info( + "Initialization source=%s path=%s: loaded=%d random_or_missing=%d shape_mismatch=%d", + source_kind, + resolved_path, + len(compatible), + len(flat_ref) - len(compatible), + len(mismatched), + ) return _merge_params( flax.traverse_util.unflatten_dict(compatible, sep="/"), params, missing_regex=self.missing_regex, ) + + @staticmethod + def _load_paligemma_npz(path: Path) -> tuple[at.Params, str]: + if path.suffix != ".npz": + raise ValueError( + f"Unsupported PARAMS_PATH file: {path}. Expected a PaliGemma big_vision .npz " + "or an Orbax params directory." + ) + with path.open("rb") as file: + flat_params = dict(np.load(file, allow_pickle=False)) + try: + paligemma_params = flax.traverse_util.unflatten_dict(flat_params, sep="/")["params"] + except KeyError as error: + raise ValueError(f"Invalid PaliGemma NPZ {path}: missing params/ root") from error + if not {"img", "llm"}.issubset(paligemma_params): + raise ValueError(f"Invalid PaliGemma NPZ {path}: expected params/img and params/llm") + return {"PaliGemma": paligemma_params}, "paligemma-vlm-npz" diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index 5afc61d..e78746a 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -6,6 +6,7 @@ from openpi.cotrain import config from openpi.cotrain import data_loader from openpi.cotrain import transforms as cotrain_transforms +from openpi.cotrain import weight_loaders from openpi.cotrain.rlds_dataset import CotrainRLDSDataset @@ -35,6 +36,13 @@ def test_registered_cotrain_configs_include_controlled_legacy32_ablation() -> No ) +def test_all_cotrain_configs_support_params_path_auto_detection() -> None: + assert all( + isinstance(train_config.weight_loader, weight_loaders.ShapeSafeCheckpointWeightLoader) + for train_config in config._COTRAIN_CONFIGS + ) + + def test_validation_batch_size_is_independent_with_legacy_fallback() -> None: train_config = config.get_config("cotrain_real_robot_fix") assert train_config.batch_size == 32 diff --git a/tests/cotrain/test_weight_loaders.py b/tests/cotrain/test_weight_loaders.py new file mode 100644 index 0000000..487d9aa --- /dev/null +++ b/tests/cotrain/test_weight_loaders.py @@ -0,0 +1,78 @@ +from pathlib import Path + +import numpy as np +import pytest + +from openpi.cotrain import weight_loaders +from openpi.models import model + + +def _target_params() -> dict: + return { + "PaliGemma": { + "img": {"kernel": np.zeros((2, 2), dtype=np.float32)}, + "llm": {"kernel": np.zeros((2, 3), dtype=np.float32)}, + }, + "action_out_proj": {"kernel": np.full((3, 4), 7.0, dtype=np.float32)}, + } + + +def _write_paligemma_npz(path: Path, *, include_llm: bool = True) -> None: + arrays = { + "params/img/kernel": np.full((2, 2), 1.0, dtype=np.float32), + } + if include_llm: + arrays["params/llm/kernel"] = np.full((2, 3), 2.0, dtype=np.float32) + np.savez(path, **arrays) + + +def test_shape_safe_loader_auto_detects_paligemma_npz(tmp_path: Path) -> None: + path = tmp_path / "pt_224.npz" + _write_paligemma_npz(path) + + loaded = weight_loaders.ShapeSafeCheckpointWeightLoader(str(path)).load(_target_params()) + + np.testing.assert_array_equal(loaded["PaliGemma"]["img"]["kernel"], np.full((2, 2), 1.0)) + np.testing.assert_array_equal(loaded["PaliGemma"]["llm"]["kernel"], np.full((2, 3), 2.0)) + # Parameters absent from the VLM checkpoint retain the target model's random initialization. + np.testing.assert_array_equal(loaded["action_out_proj"]["kernel"], np.full((3, 4), 7.0)) + + +def test_shape_safe_loader_retains_random_target_on_npz_shape_mismatch(tmp_path: Path) -> None: + path = tmp_path / "pt_224.npz" + np.savez( + path, + **{ + "params/img/kernel": np.full((2, 2), 1.0, dtype=np.float32), + "params/llm/kernel": np.full((9, 9), 2.0, dtype=np.float32), + }, + ) + + loaded = weight_loaders.ShapeSafeCheckpointWeightLoader(str(path)).load(_target_params()) + + np.testing.assert_array_equal(loaded["PaliGemma"]["img"]["kernel"], np.full((2, 2), 1.0)) + np.testing.assert_array_equal(loaded["PaliGemma"]["llm"]["kernel"], np.zeros((2, 3))) + + +def test_shape_safe_loader_rejects_non_paligemma_npz(tmp_path: Path) -> None: + path = tmp_path / "invalid.npz" + _write_paligemma_npz(path, include_llm=False) + + with pytest.raises(ValueError, match="expected params/img and params/llm"): + weight_loaders.ShapeSafeCheckpointWeightLoader(str(path)).load(_target_params()) + + +def test_shape_safe_loader_preserves_orbax_checkpoint_behavior(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + checkpoint_dir = tmp_path / "params" + checkpoint_dir.mkdir() + checkpoint_params = _target_params() + checkpoint_params["action_out_proj"]["kernel"] = np.full((3, 4), 5.0, dtype=np.float32) + monkeypatch.setattr( + model, + "restore_params", + lambda path, restore_type: checkpoint_params, + ) + + loaded = weight_loaders.ShapeSafeCheckpointWeightLoader(str(checkpoint_dir)).load(_target_params()) + + np.testing.assert_array_equal(loaded["action_out_proj"]["kernel"], np.full((3, 4), 5.0)) From 38677c26124652fa267aae5a7ebfe771a2d77476 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Thu, 30 Jul 2026 15:45:21 +0800 Subject: [PATCH 47/64] doc update --- ...55\347\273\203\346\214\207\345\215\227.md" | 421 +++--------------- 1 file changed, 59 insertions(+), 362 deletions(-) diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index 0bd2c81..c05d0b7 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -1,334 +1,77 @@ +# 百度云正式训练指南 + +## 运行前准备 + +配置百舸凭证: + ```bash -# 配置百舸凭证、资源池、PFS、BOS、W&B cd /data/wudi/baige-cluster cp -n .env.example .env vim .env ``` +检查代码环境、数据配置、norm 和 VLM 权重: + ```bash -# 本地环境、checkpoint、两套配置与 norm 验收 cd /data/wudi/Atom-0 source scripts/atom0_env.sh -.venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_only -.venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_robot_fix -``` -```bash -# 按最大正式拓扑做 3 节点 × 8 卡 RDMA/NCCL 验收 -cd /data/wudi/baige-cluster -INSTANCES=3 GPU_PER_NODE=8 .venv/bin/python nccl_test_job.py -``` +PARAMS_PATH=/data/models/paligemma/pt_224.npz \ +.venv/bin/python scripts/preflight_cotrain_baige.py \ + cotrain_real_only_unified80_aliyun_recipe -```bash -# 全指南只保留这一条 20-step smoke;需要验证其他 config 时替换 CONFIG_NAME/EXP_NAME 即可 -cd /data/wudi/baige-cluster -export BOS_SOURCE=atom0-data/ -export BOS_MOUNT_PATH=/mnt/bos/bo23lu -export PARAMS_PATH=/data/models/openpi - -MODE=smoke CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_1x8_smoke \ -INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ -SMOKE_STEPS=20 SMOKE_WARMUP_STEPS=2 \ -.venv/bin/python atom0_train_job.py +PARAMS_PATH=/data/models/paligemma/pt_224.npz \ +.venv/bin/python scripts/preflight_cotrain_baige.py \ + cotrain_real_robot_fix ``` -`PARAMS_PATH` 指定新实验的模型参数初始化来源: +正式提交前确认: -- 默认值为 `/data/models/openpi`,即 pi05; -- 设置为 `/data/models/paligemma/pt_224.npz` 时,只加载未经 π VLA 预训练的 PaliGemma - vision/language backbone;action expert、timestep MLP 和 action input/output projection - 从目标模型的随机初始化开始; -- 也可以传训练 checkpoint 的 step 目录(例如 `.../97727`)或其 `params/` 子目录,启动脚本会自动解析; -- 对一个全新的 `EXP_NAME`,这里只加载模型参数;optimizer、训练 step 和学习率调度都会重新初始化; -- 如果 `EXP_NAME` 已经存在 checkpoint,训练框架会优先恢复该实验自身状态。因此,需要新训练时必须使用未使用过的 `EXP_NAME`。 +- `/data/models/paligemma/pt_224.npz` 存在; +- `git status --short` 中没有未确认的代码改动; +- 每次新训练使用一个从未产生过 checkpoint 的 `EXP_NAME`。 -三种初始化方式不需要修改 `CONFIG_NAME` 或其他训练参数,只修改 `PARAMS_PATH`: +如果复用已经存在 checkpoint 的 `EXP_NAME`,训练框架会恢复该实验自身的模型、 +optimizer 和 step,而不会重新从 `PARAMS_PATH` 初始化。下面两条命令已经使用新的 +VLM 实验名;再次重跑时,需要继续更换 `EXP_NAME`。 -```bash -# pi05 VLA 预训练权重 -export PARAMS_PATH=/data/models/openpi - -# 基础 PaliGemma VLM 权重 -export PARAMS_PATH=/data/models/paligemma/pt_224.npz - -# 已训练模型的纯模型参数(不恢复 optimizer/step) -export PARAMS_PATH=/data/wudi/Atom-0/checkpoints/// -``` - -使用 VLM NPZ 时,任务日志必须出现: +使用 VLM NPZ 时,任务启动日志应包含: ```text PARAMS_LAYOUT=paligemma-vlm-npz INIT_POLICY=PaliGemma vision+language loaded; action expert, timestep MLP, and action projections random ``` -```bash -# 查询任务结构与日志 -cd /data/wudi/baige-cluster -.venv/bin/python logs.py -.venv/bin/python logs.py -``` +## 正式训练 1:Piper30 + Piper2,Unified80 -## 正式训练 1:仅自采真机数据 +该实验使用 `cotrain_real_only_unified80_aliyun_recipe`: | 超参数 | 值 | | --- | ---: | -| 配置 | `cotrain_real_only` | | 数据集 | `piper30 + piper2` | -| source frames | 2,913,191 | +| 动作空间 | Unified80 | +| prompt prefix | `Action Mode: joint.` | +| max token length | 384 | | 节点 × GPU | 1 × 8 B200 | | FSDP devices | 4 | | train global batch size | 512 | | validation global batch size | 96 | -| samples / GPU | 64 | -| train steps | 10000 | -| warmup / decay steps | 200 / 10000 | -| eval / save interval | 1,000 / 2,000 | -| validation batches | 10 | -| action MSE | 开启 | - -```bash -cd /data/wudi/baige-cluster -export BOS_SOURCE=atom0-data/ -export BOS_MOUNT_PATH=/mnt/bos/bo23lu -export PARAMS_PATH=/data/models/openpi - -MODE=train CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_v1 \ -INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ -NUM_TRAIN_STEPS=10000 WARMUP_STEPS=200 DECAY_STEPS=10000 \ -EVAL_INTERVAL=1000 SAVE_INTERVAL=2000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ -DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ -.venv/bin/python atom0_train_job.py -``` - -## 已完成对比实验:相同真机数据,Legacy 32D 动作空间(4 卡) - -该配置只回退动作空间,其他训练条件与上面的 `cotrain_real_only_b200_v1` 保持一致: - -百舸任务会直接进入共享目录 `/data/wudi/Atom-0` 并使用该目录当前检出的代码。提交 smoke 或正式训练前,必须先切换到实验分支并核对 commit: - -```bash -cd /data/wudi/Atom-0 -git switch exp/legacy32-real-only-b200 -git status --short -git log -1 --oneline -``` - -`git status --short` 应当没有输出;`git log -1` 应显示 Legacy32 实验的最新 commit。切换分支只需要在共享仓库执行一次,随后从 `/data/wudi/baige-cluster` 提交的任务会使用这个分支,无需在任务命令中再次切换。 - -| 超参数 | 值 | -| --- | ---: | -| 配置 | `cotrain_real_only_legacy32` | -| 数据集及权重 | 与 `cotrain_real_only` 相同:`piper30 + piper2` | -| 动作空间 | Piper native 14D 位于 32D `[0:14]`,其余维补零 | -| 学习率 | peak `1e-6`,decay `1e-7` | -| 节点 × GPU | 1 × 4 B200 | -| FSDP devices | 4 | -| train global batch size | 512 | -| validation global batch size | 96 | -| samples / GPU | 128 | -| train steps | 10,000 | -| warmup / decay steps | 200 / 10,000 | -| eval / save interval | 1,000 / 2,000 | -| validation batches | 10 | -| action MSE | 开启 | - -该4卡实验保持与原8卡实验相同的 global batch、optimizer update 次数和总训练样本量:`512 × 10,000 = 5,120,000`。每张 B200 处理128个样本。相比降低 global batch 并增加 steps,这种设置不会额外改变梯度方差、AdamW 动量轨迹或学习率随 optimizer step 的变化。 - -先做静态验收: - -```bash -cd /data/wudi/Atom-0 -source scripts/atom0_env.sh -.venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_only_legacy32 -``` - -正式训练: - -```bash -cd /data/wudi/baige-cluster -export BOS_SOURCE=atom0-data/ -export BOS_MOUNT_PATH=/mnt/bos/bo23lu -export PARAMS_PATH=/data/models/openpi - -MODE=train CONFIG_NAME=cotrain_real_only_legacy32 \ -EXP_NAME=cotrain_real_only_legacy32_b200_4gpu_b512_v1 \ -INSTANCES=1 GPU_PER_NODE=4 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ -NUM_TRAIN_STEPS=10000 WARMUP_STEPS=200 DECAY_STEPS=10000 \ -EVAL_INTERVAL=1000 SAVE_INTERVAL=2000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ -DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ -.venv/bin/python atom0_train_job.py -``` - -## Aliyun 20000 复现实验:Piper30-only Legacy 32D(8 卡) - -该实验使用独立配置 `cotrain_piper30_legacy32_aliyun_replay`,不覆盖上一个 -`cotrain_real_only_legacy32` 动作空间消融。它恢复目前能够从 6 月代码确认的历史训练条件: - -- 只使用 `piper30`,不采样 `piper2`; -- Piper native 14D 位于 legacy 32D `[0:14]`,完整加载 `pi05_base` 的 32D head; -- 使用旧 prompt 合约,不添加 `Action Mode: joint.`; -- `max_token_len=200`; -- 训练 20,000 steps,warmup 1,000,30,000-step cosine decay; -- peak LR `2.5e-5`,decay LR `2.5e-6`; -- checkpoint间隔5,000 steps。 - -旧 Aliyun launch metadata 尚未找到,因此其实际 global batch 和命令行 LR 覆盖无法从 checkpoint -名称单独证明。本复现实验采用 **global batch 512**:假设旧16卡任务也是global batch 512,8张B200 -通过每卡64样本保持相同global batch、梯度尺度和optimizer update语义。不要把batch改成1024;那会改变 -梯度方差和每20,000步看到的总样本数,而不是“补偿少8张卡”。 - -当前机器也没有旧 `cotrain_all_2ep/piper30/norm_stats.json`。配置暂时使用当前全量Piper30 stats并投影 -回native 14D;取得旧stats后,应在正式提交前替换并逐维核对。这是本次仍未完全历史对齐的一项。 - -提交前切换并核对实验分支: - -```bash -cd /data/wudi/Atom-0 -git switch exp/legacy32-real-only-b200 -git status --short -git log -1 --oneline -``` - -| 超参数 | 值 | -| --- | ---: | -| 配置 | `cotrain_piper30_legacy32_aliyun_replay` | -| 数据集 | `piper30` only | -| 动作空间 | native 14D位于32D `[0:14]`,其余补零 | -| prompt prefix | 无(恢复0629格式) | -| max token length | 200 | -| 学习率 | peak `2.5e-5`,decay `2.5e-6` | -| 节点 × GPU | 1 × 8 B200 | -| FSDP devices | 4 | -| train global batch size | 512 | -| samples / GPU | 64 | | train steps | 20,000 | -| 总训练样本 | 10,240,000 | | warmup / decay steps | 1,000 / 30,000 | +| peak / decay LR | `2.5e-5` / `2.5e-6` | | eval / save interval | 1,000 / 5,000 | -| validation global batch size | 96 | - -先做静态验收: - -```bash -cd /data/wudi/Atom-0 -source scripts/atom0_env.sh -.venv/bin/python scripts/preflight_cotrain_baige.py cotrain_piper30_legacy32_aliyun_replay -``` - -正式训练: - -```bash -cd /data/wudi/baige-cluster -export BOS_SOURCE=atom0-data/ -export BOS_MOUNT_PATH=/mnt/bos/bo23lu -export PARAMS_PATH=/data/models/openpi - -MODE=train CONFIG_NAME=cotrain_piper30_legacy32_aliyun_replay \ -EXP_NAME=cotrain_piper30_legacy32_aliyun_replay_b200_8gpu_b512_v1 \ -INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ -NUM_TRAIN_STEPS=20000 WARMUP_STEPS=1000 DECAY_STEPS=30000 \ -EVAL_INTERVAL=1000 SAVE_INTERVAL=5000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ -DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ -.venv/bin/python atom0_train_job.py -``` - -## 对比实验组:固定 Aliyun 20000 配方,依次比较 Piper2 和 Unified80 - -Aliyun 20000 Piper30-only Legacy32 复现实验已经成功,后续两个实验统一以它为基线。三个实验的 -global batch、optimizer update 数、学习率曲线、验证设置和初始化策略均由独立配置与测试固定,避免 -命令行遗漏造成对比漂移。 - -| 对比项 | A:已成功基线 | B:实验 1,加 Piper2 | C:实验 2,正式训练 1 + Aliyun 配方 | -| --- | --- | --- | --- | -| config | `cotrain_piper30_legacy32_aliyun_replay` | `cotrain_real_only_legacy32_aliyun_recipe` | `cotrain_real_only_unified80_aliyun_recipe` | -| 数据集 | Piper30 | Piper30 + Piper2 | Piper30 + Piper2 | -| 动作空间 | Legacy32 | Legacy32 | Unified80 | -| prompt prefix | 无 | 无 | `Action Mode: joint.` | -| max token length | 200 | 200 | 384 | -| 默认初始化 | pi05,32D head 完整加载 | pi05,32D head 完整加载 | pi05,80D shape mismatch 部分随机初始化 | -| global batch | 512 | 512 | 512 | -| train steps | 20,000 | 20,000 | 20,000 | -| warmup / decay | 1,000 / 30,000 | 1,000 / 30,000 | 1,000 / 30,000 | -| peak / decay LR | `2.5e-5` / `2.5e-6` | `2.5e-5` / `2.5e-6` | `2.5e-5` / `2.5e-6` | -| eval / save | 1,000 / 5,000 | 1,000 / 5,000 | 1,000 / 5,000 | -| 节点 × GPU | 1 × 8 B200 | 1 × 8 B200 | 1 × 8 B200 | -| FSDP devices | 4 | 4 | 4 | - -因此: - -- A → B 只用于观察加入 Piper2 的影响; -- B → C 用于观察 Unified80 及其配套输入合约、80D head 初始化的整体影响; -- 正式训练 1 → C 保留数据、Unified80、prompt、token 长度、norm 和初始化不变,只替换成 Aliyun - 20000 的学习率/训练步数/save interval 配方。 - -注意:B 与 C 都使用 `assets/cotrain_real_only/{piper30,piper2}`。B 在运行时把统一统计投影回 -native 14D;C 直接使用 Unified80 统计,无需重新计算 norm。 - -### 提交前代码和静态验收 - -```bash -cd /data/wudi/Atom-0 -git switch exp/legacy32-real-only-b200 -git status --short -git log -1 --oneline - -source scripts/atom0_env.sh -.venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_only_legacy32_aliyun_recipe -.venv/bin/python scripts/preflight_cotrain_baige.py cotrain_real_only_unified80_aliyun_recipe -``` - -两次 preflight 都应输出 `datasets=2, source_frames=2,913,191`。提交脚本 -`/data/wudi/baige-cluster/atom0_train_job.py` 也必须是包含这两个 config allowlist 的当前版本。 - -### 实验 1:Legacy32,只加入 Piper2 - -正式训练: - -```bash -cd /data/wudi/baige-cluster -export BOS_SOURCE=atom0-data/ -export BOS_MOUNT_PATH=/mnt/bos/bo23lu -export PARAMS_PATH=/data/models/openpi - -MODE=train CONFIG_NAME=cotrain_real_only_legacy32_aliyun_recipe \ -EXP_NAME=cotrain_real_only_legacy32_aliyun_recipe_b200_8gpu_b512_v1 \ -INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ -NUM_TRAIN_STEPS=20000 WARMUP_STEPS=1000 DECAY_STEPS=30000 \ -EVAL_INTERVAL=1000 SAVE_INTERVAL=5000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ -DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ -.venv/bin/python atom0_train_job.py -``` - -### 实验 2:正式训练 1 的 Unified80,改用 Aliyun 20000 配方 - -从默认 pi05 初始化: - -```bash -cd /data/wudi/baige-cluster -export BOS_SOURCE=atom0-data/ -export BOS_MOUNT_PATH=/mnt/bos/bo23lu -export PARAMS_PATH=/data/models/openpi - -MODE=train CONFIG_NAME=cotrain_real_only_unified80_aliyun_recipe \ -EXP_NAME=cotrain_real_only_unified80_aliyun_recipe_b200_8gpu_b512_v1 \ -INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ -NUM_TRAIN_STEPS=20000 WARMUP_STEPS=1000 DECAY_STEPS=30000 \ -EVAL_INTERVAL=1000 SAVE_INTERVAL=5000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ -DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ -.venv/bin/python atom0_train_job.py -``` - -从 `cotrain_real_robot_fix_b200_0719/97727` 初始化一个全新的 Unified80 实验: +| validation batches | 10 | +| action MSE | 开启 | +| 初始化权重 | 基础 PaliGemma VLM | ```bash cd /data/wudi/baige-cluster export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu -export PARAMS_PATH=/data/wudi/Atom-0/checkpoints/cotrain_real_robot_fix/cotrain_real_robot_fix_b200_0719/97727 +export PARAMS_PATH=/data/models/paligemma/pt_224.npz MODE=train CONFIG_NAME=cotrain_real_only_unified80_aliyun_recipe \ -EXP_NAME=cotrain_real_only_unified80_from_rrfix97727_b200_8gpu_b512_v1 \ +EXP_NAME=cotrain_real_only_unified80_from_paligemma_vlm_b200_8gpu_b512_v1 \ INSTANCES=1 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 \ NUM_TRAIN_STEPS=20000 WARMUP_STEPS=1000 DECAY_STEPS=30000 \ EVAL_INTERVAL=1000 SAVE_INTERVAL=5000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ @@ -336,54 +79,42 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py ``` -这里的“从 97727 训练”是参数初始化,不是断点续训。启动脚本会把 step 目录解析为 -`97727/params`,只加载其中的模型参数,并从 step 0 重新创建 optimizer、EMA 容器和学习率调度。 -该 checkpoint 与本实验的 Unified80 模型参数树已核对为 51/51 个 leaf 形状一致,因此能够完整加载, -不会出现 pi05 32D action head 到 Unified80 head 的 shape mismatch。务必使用上面新的 -`EXP_NAME`;不要复用已有实验名。 - -### 运行后验收 - -每个正式任务都应在启动日志中打印: - -```text -FSDP_DEVICES=4 BATCH_SIZE=512 VAL_BATCH_SIZE=96 NUM_TRAIN_STEPS=20000 -``` +## 正式训练 2:自采真机 + 开源 Robot 混训 -同时核对: - -1. 训练 step 0 的 prompt-check:B 不应出现 `Action Mode: joint.`,C 应出现; -2. W&B config 中 action dim:B 为 32,C 为 80; -3. B/C 都应构建 `piper30` 和 `piper2` 的 seen/unseen validation loader; -4. step 5,000、10,000、15,000、20,000 均生成 checkpoint; -5. 比较效果时优先使用相同步数 checkpoint,并保持同一版真机 Server/eval 代码。 - -## 正式训练 2:自采真机 + 开源 Robot(不含 EgoVerse) +该实验使用 `cotrain_real_robot_fix`,不包含 EgoVerse,并排除经过审计后停用的 +三个 Robot 数据集。 | 超参数 | 值 | | --- | ---: | -| 配置 | `cotrain_real_robot_fix` | | active datasets | 34 | -| 排除数据集 | `robocoin_leju_robot_s54_a54`
`robocoin_agilex_decoupled_magic_s14_a14_fps50`
`robocoin_agilex_decoupled_magic_s26_a26` | | source frames | 150,109,749 | +| 动作空间 | Unified80 | | 节点 × GPU | 3 × 8 B200 | | FSDP devices | 4 | | train global batch size | 1,536 | | validation global batch size | 96 | -| samples / GPU | 64 | | train steps | 97,728 | | warmup / decay steps | 5,000 / 97,728 | +| peak / decay LR | `1e-6` / `1e-7` | | eval / save interval | 1,000 / 10,000 | | validation batches | 5 | | action MSE | 关闭 | +| 初始化权重 | 基础 PaliGemma VLM | + +排除的数据集: + +- `robocoin_leju_robot_s54_a54` +- `robocoin_agilex_decoupled_magic_s14_a14_fps50` +- `robocoin_agilex_decoupled_magic_s26_a26` ```bash cd /data/wudi/baige-cluster export BOS_SOURCE=atom0-data/ export BOS_MOUNT_PATH=/mnt/bos/bo23lu -export PARAMS_PATH=/data/models/openpi +export PARAMS_PATH=/data/models/paligemma/pt_224.npz -MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_0719 \ +MODE=train CONFIG_NAME=cotrain_real_robot_fix \ +EXP_NAME=cotrain_real_robot_fix_from_paligemma_vlm_b200_v1 \ INSTANCES=3 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1536 VAL_BATCH_SIZE=96 \ NUM_TRAIN_STEPS=97728 WARMUP_STEPS=5000 DECAY_STEPS=97728 \ EVAL_INTERVAL=1000 SAVE_INTERVAL=10000 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ @@ -391,55 +122,21 @@ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py ``` -## 可选:16 卡 / 32 卡训练 - -下表保持与上述推荐命令相同的总样本训练量(每卡 batch 均为 64)。 +## 任务检查 -| 配置 | GPU 拓扑 | train global batch | validation global batch | train steps | -| --- | ---: | ---: | ---: | ---: | -| `cotrain_real_only` | 2 × 8 | 1,024 | 96 | 5,000 | -| `cotrain_real_only` | 4 × 8 | 2,048 | 96 | 2,500 | -| `cotrain_real_robot_fix` | 2 × 8 | 1,024 | 96 | 146,592 | -| `cotrain_real_robot_fix` | 4 × 8 | 2,048 | 96 | 73,296 | +查询任务结构与日志: ```bash -# 仅自采真机数据:16 卡 cd /data/wudi/baige-cluster -export PARAMS_PATH=/data/models/openpi - -MODE=train CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_16gpu_v1 \ -INSTANCES=2 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1024 VAL_BATCH_SIZE=96 \ -NUM_TRAIN_STEPS=5000 WARMUP_STEPS=100 DECAY_STEPS=5000 \ -EVAL_INTERVAL=500 SAVE_INTERVAL=1000 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ -DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ -.venv/bin/python atom0_train_job.py - -# 仅自采真机数据:32 卡 -MODE=train CONFIG_NAME=cotrain_real_only EXP_NAME=cotrain_real_only_b200_32gpu_v1 \ -INSTANCES=4 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=2048 VAL_BATCH_SIZE=96 \ -NUM_TRAIN_STEPS=2500 WARMUP_STEPS=50 DECAY_STEPS=2500 \ -EVAL_INTERVAL=250 SAVE_INTERVAL=500 NUM_VAL_BATCHES=10 RUN_ACTION_MSE=1 \ -DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ -.venv/bin/python atom0_train_job.py +.venv/bin/python logs.py +.venv/bin/python logs.py ``` -```bash -# 自采真机 + 开源 Robot:16 卡 -cd /data/wudi/baige-cluster -export PARAMS_PATH=/data/models/openpi +启动后至少核对: -MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_16gpu_v1 \ -INSTANCES=2 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1024 VAL_BATCH_SIZE=96 \ -NUM_TRAIN_STEPS=146592 WARMUP_STEPS=7330 DECAY_STEPS=146592 \ -EVAL_INTERVAL=7500 SAVE_INTERVAL=15000 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ -DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ -.venv/bin/python atom0_train_job.py - -# 自采真机 + 开源 Robot:32 卡 -MODE=train CONFIG_NAME=cotrain_real_robot_fix EXP_NAME=cotrain_real_robot_fix_b200_32gpu_v1 \ -INSTANCES=4 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=2048 VAL_BATCH_SIZE=96 \ -NUM_TRAIN_STEPS=73296 WARMUP_STEPS=3665 DECAY_STEPS=73296 \ -EVAL_INTERVAL=3750 SAVE_INTERVAL=7500 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ -DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ -.venv/bin/python atom0_train_job.py -``` +1. 日志中的 `PARAMS_LAYOUT` 为 `paligemma-vlm-npz`; +2. `EXP_NAME` 对应的 checkpoint 目录在提交前不存在; +3. W&B config 中 action dim 为 80; +4. 正式训练 1 构建了 `piper30` 和 `piper2` 的训练及验证 loader; +5. 正式训练 2 构建了 34 个 active datasets; +6. global batch、训练步数、warmup、decay、eval/save interval 与上表一致。 From 1dd59dfb8fe1e225e3ff91186133e5067b14f129 Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Sat, 1 Aug 2026 01:43:29 +0800 Subject: [PATCH 48/64] fix doc --- ...55\347\273\203\346\214\207\345\215\227.md" | 4 +- ...351\227\264\350\256\276\350\256\241_v1.md" | 192 +++++++++--------- 2 files changed, 96 insertions(+), 100 deletions(-) rename "docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241.md" => "docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241_v1.md" (72%) diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index c05d0b7..970b994 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -114,10 +114,10 @@ export BOS_MOUNT_PATH=/mnt/bos/bo23lu export PARAMS_PATH=/data/models/paligemma/pt_224.npz MODE=train CONFIG_NAME=cotrain_real_robot_fix \ -EXP_NAME=cotrain_real_robot_fix_from_paligemma_vlm_b200_v1 \ +EXP_NAME=cotrain_real_robot_fix_from_paligemma_vlm_b200_v2 \ INSTANCES=3 GPU_PER_NODE=8 FSDP_DEVICES=4 BATCH_SIZE=1536 VAL_BATCH_SIZE=96 \ NUM_TRAIN_STEPS=97728 WARMUP_STEPS=5000 DECAY_STEPS=97728 \ -EVAL_INTERVAL=1000 SAVE_INTERVAL=10000 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ +EVAL_INTERVAL=1000 SAVE_INTERVAL=25000 NUM_VAL_BATCHES=5 RUN_ACTION_MSE=0 \ DATA_NUM_PARALLEL_READS=1 DATA_NUM_PARALLEL_CALLS=2 WANDB_ENABLED=1 \ .venv/bin/python atom0_train_job.py ``` diff --git "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241.md" "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241_v1.md" similarity index 72% rename from "docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241.md" rename to "docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241_v1.md" index 78be7c2..4aa657b 100644 --- "a/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241.md" +++ "b/docs/\347\273\237\344\270\200\345\212\250\344\275\234\347\251\272\351\227\264\350\256\276\350\256\241_v1.md" @@ -7,89 +7,93 @@ 我们只复用这一统一槽位思路,不要求 EEF 旋转表示和时序表示与 Qwen-Manip 完全一致。 -| 维度 | 具体内容 | -| --- | ----------------- | -| 1 | 左臂关节位置 1 | -| 2 | 左臂关节位置 2 | -| 3 | 左臂关节位置 3 | -| 4 | 左臂关节位置 4 | -| 5 | 左臂关节位置 5 | -| 6 | 左臂关节位置 6 | -| 7 | 左臂关节位置 7 | -| 8 | 左臂末端位置 (x) | -| 9 | 左臂末端位置 (y) | -| 10 | 左臂末端位置 (z) | -| 11 | 左臂末端旋转 6D 表示第 1 维 | -| 12 | 左臂末端旋转 6D 表示第 2 维 | -| 13 | 左臂末端旋转 6D 表示第 3 维 | -| 14 | 左臂末端旋转 6D 表示第 4 维 | -| 15 | 左臂末端旋转 6D 表示第 5 维 | -| 16 | 左臂末端旋转 6D 表示第 6 维 | -| 17 | 左侧平行夹爪关节位置 | -| 18 | 左侧灵巧手关节位置 1 | -| 19 | 左侧灵巧手关节位置 2 | -| 20 | 左侧灵巧手关节位置 3 | -| 21 | 左侧灵巧手关节位置 4 | -| 22 | 左侧灵巧手关节位置 5 | -| 23 | 左侧灵巧手关节位置 6 | -| 24 | 左侧灵巧手关节位置 7 | -| 25 | 左侧灵巧手关节位置 8 | -| 26 | 左侧灵巧手关节位置 9 | -| 27 | 左侧灵巧手关节位置 10 | -| 28 | 左侧灵巧手关节位置 11 | -| 29 | 左侧灵巧手关节位置 12 | -| 30 | 右臂关节位置 1 | -| 31 | 右臂关节位置 2 | -| 32 | 右臂关节位置 3 | -| 33 | 右臂关节位置 4 | -| 34 | 右臂关节位置 5 | -| 35 | 右臂关节位置 6 | -| 36 | 右臂关节位置 7 | -| 37 | 右臂末端位置 (x) | -| 38 | 右臂末端位置 (y) | -| 39 | 右臂末端位置 (z) | -| 40 | 右臂末端旋转 6D 表示第 1 维 | -| 41 | 右臂末端旋转 6D 表示第 2 维 | -| 42 | 右臂末端旋转 6D 表示第 3 维 | -| 43 | 右臂末端旋转 6D 表示第 4 维 | -| 44 | 右臂末端旋转 6D 表示第 5 维 | -| 45 | 右臂末端旋转 6D 表示第 6 维 | -| 46 | 右侧平行夹爪关节位置 | -| 47 | 右侧灵巧手关节位置 1 | -| 48 | 右侧灵巧手关节位置 2 | -| 49 | 右侧灵巧手关节位置 3 | -| 50 | 右侧灵巧手关节位置 4 | -| 51 | 右侧灵巧手关节位置 5 | -| 52 | 右侧灵巧手关节位置 6 | -| 53 | 右侧灵巧手关节位置 7 | -| 54 | 右侧灵巧手关节位置 8 | -| 55 | 右侧灵巧手关节位置 9 | -| 56 | 右侧灵巧手关节位置 10 | -| 57 | 右侧灵巧手关节位置 11 | -| 58 | 右侧灵巧手关节位置 12 | -| 59 | 共享保留维度 1 | -| 60 | 共享保留维度 2 | -| 61 | 共享保留维度 3 | -| 62 | 共享保留维度 4 | -| 63 | 共享保留维度 5 | -| 64 | 共享保留维度 6 | -| 65 | 共享保留维度 7 | -| 66 | 共享保留维度 8 | -| 67 | 共享保留维度 9 | -| 68 | 共享保留维度 10 | -| 69 | 共享保留维度 11 | -| 70 | 共享保留维度 12 | -| 71 | 共享保留维度 13 | -| 72 | 共享保留维度 14 | -| 73 | 共享保留维度 15 | -| 74 | 共享保留维度 16 | -| 75 | 共享保留维度 17 | -| 76 | 共享保留维度 18 | -| 77 | 共享保留维度 19 | -| 78 | 共享保留维度 20 | -| 79 | 共享保留维度 21 | -| 80 | 共享保留维度 22 | - +| 维度 | 具体内容 | 时序表示 | +| --- | --- | --- | +| 1 | 左臂关节位置 1 | absolute | +| 2 | 左臂关节位置 2 | absolute | +| 3 | 左臂关节位置 3 | absolute | +| 4 | 左臂关节位置 4 | absolute | +| 5 | 左臂关节位置 5 | absolute | +| 6 | 左臂关节位置 6 | absolute | +| 7 | 左臂关节位置 7 | absolute | +| 8 | 左臂末端位置 (x) | relative | +| 9 | 左臂末端位置 (y) | relative | +| 10 | 左臂末端位置 (z) | relative | +| 11 | 左臂末端旋转 6D 表示第 1 维 | relative(action 使用 3D rotation vector) | +| 12 | 左臂末端旋转 6D 表示第 2 维 | relative(action 使用 3D rotation vector) | +| 13 | 左臂末端旋转 6D 表示第 3 维 | relative(action 使用 3D rotation vector) | +| 14 | 左臂末端旋转 6D 表示第 4 维 | relative(action 使用 3D rotation vector) | +| 15 | 左臂末端旋转 6D 表示第 5 维 | relative(action 使用 3D rotation vector) | +| 16 | 左臂末端旋转 6D 表示第 6 维 | relative(action 使用 3D rotation vector) | +| 17 | 左侧平行夹爪关节位置 | absolute | +| 18 | 左侧灵巧手关节位置 1 | absolute | +| 19 | 左侧灵巧手关节位置 2 | absolute | +| 20 | 左侧灵巧手关节位置 3 | absolute | +| 21 | 左侧灵巧手关节位置 4 | absolute | +| 22 | 左侧灵巧手关节位置 5 | absolute | +| 23 | 左侧灵巧手关节位置 6 | absolute | +| 24 | 左侧灵巧手关节位置 7 | absolute | +| 25 | 左侧灵巧手关节位置 8 | absolute | +| 26 | 左侧灵巧手关节位置 9 | absolute | +| 27 | 左侧灵巧手关节位置 10 | absolute | +| 28 | 左侧灵巧手关节位置 11 | absolute | +| 29 | 左侧灵巧手关节位置 12 | absolute | +| 30 | 右臂关节位置 1 | absolute | +| 31 | 右臂关节位置 2 | absolute | +| 32 | 右臂关节位置 3 | absolute | +| 33 | 右臂关节位置 4 | absolute | +| 34 | 右臂关节位置 5 | absolute | +| 35 | 右臂关节位置 6 | absolute | +| 36 | 右臂关节位置 7 | absolute | +| 37 | 右臂末端位置 (x) | relative | +| 38 | 右臂末端位置 (y) | relative | +| 39 | 右臂末端位置 (z) | relative | +| 40 | 右臂末端旋转 6D 表示第 1 维 | relative(action 使用 3D rotation vector) | +| 41 | 右臂末端旋转 6D 表示第 2 维 | relative(action 使用 3D rotation vector) | +| 42 | 右臂末端旋转 6D 表示第 3 维 | relative(action 使用 3D rotation vector) | +| 43 | 右臂末端旋转 6D 表示第 4 维 | relative(action 使用 3D rotation vector) | +| 44 | 右臂末端旋转 6D 表示第 5 维 | relative(action 使用 3D rotation vector) | +| 45 | 右臂末端旋转 6D 表示第 6 维 | relative(action 使用 3D rotation vector) | +| 46 | 右侧平行夹爪关节位置 | absolute | +| 47 | 右侧灵巧手关节位置 1 | absolute | +| 48 | 右侧灵巧手关节位置 2 | absolute | +| 49 | 右侧灵巧手关节位置 3 | absolute | +| 50 | 右侧灵巧手关节位置 4 | absolute | +| 51 | 右侧灵巧手关节位置 5 | absolute | +| 52 | 右侧灵巧手关节位置 6 | absolute | +| 53 | 右侧灵巧手关节位置 7 | absolute | +| 54 | 右侧灵巧手关节位置 8 | absolute | +| 55 | 右侧灵巧手关节位置 9 | absolute | +| 56 | 右侧灵巧手关节位置 10 | absolute | +| 57 | 右侧灵巧手关节位置 11 | absolute | +| 58 | 右侧灵巧手关节位置 12 | absolute | +| 59 | 共享保留维度 1 | 保留 / mask=0 | +| 60 | 共享保留维度 2 | 保留 / mask=0 | +| 61 | 共享保留维度 3 | 保留 / mask=0 | +| 62 | 共享保留维度 4 | 保留 / mask=0 | +| 63 | 共享保留维度 5 | 保留 / mask=0 | +| 64 | 共享保留维度 6 | 保留 / mask=0 | +| 65 | 共享保留维度 7 | 保留 / mask=0 | +| 66 | 共享保留维度 8 | 保留 / mask=0 | +| 67 | 共享保留维度 9 | 保留 / mask=0 | +| 68 | 共享保留维度 10 | 保留 / mask=0 | +| 69 | 共享保留维度 11 | 保留 / mask=0 | +| 70 | 共享保留维度 12 | 保留 / mask=0 | +| 71 | 共享保留维度 13 | 保留 / mask=0 | +| 72 | 共享保留维度 14 | 保留 / mask=0 | +| 73 | 共享保留维度 15 | 保留 / mask=0 | +| 74 | 共享保留维度 16 | 保留 / mask=0 | +| 75 | 共享保留维度 17 | 保留 / mask=0 | +| 76 | 共享保留维度 18 | 保留 / mask=0 | +| 77 | 共享保留维度 19 | 保留 / mask=0 | +| 78 | 共享保留维度 20 | 保留 / mask=0 | +| 79 | 共享保留维度 21 | 保留 / mask=0 | +| 80 | 共享保留维度 22 | 保留 / mask=0 | + +note:对于EEF的旋转,Qwen的state和action表征不同: + ++ state用6D旋转矩阵表示 ++ action用旋转向量表示,并做相对差 @@ -166,11 +170,8 @@ #### 4. 各数据集映射 -本节覆盖已注册的全部 44 个 builder(原 `cotrain_full_all` 的 43 个来源,加上第二批真机 -Piper 数据 `piper2`)。当前 `cotrain_full_all` 配置仍排除 +本节覆盖 `cotrain_full_all` 来源中的全部 43 个 builder。当前配置排除 `robocoin_unitree_g1_dex3_s28_a28` 和 `robomind_tienkung_sim_s38_a38`,仍保留其映射以便恢复使用。 -`piper2` 只加入新的 `cotrain_real_only` 和 `cotrain_real_robot` 配置,不改变既有 -`cotrain_full_all` 实验的数据组成。 ##### AgiBot、DROID、EgoVerse、Piper @@ -185,15 +186,10 @@ Piper 数据 `piper2`)。当前 `cotrain_full_all` 配置仍排除 | `egoverse_mecka` | `a1-3` LE xyz,`a4-6` LE yaw/pitch/roll,`a7-9` RE xyz,`a10-12` RE yaw/pitch/roll | `a1-3 -> U8-10`; `a4-6 -> U11-13`; `a7-9 -> U37-39`; `a10-12 -> U40-42` | | `egoverse_scale` | `a1-3` LE xyz,`a4-6` LE yaw/pitch/roll,`a7-9` RE xyz,`a10-12` RE yaw/pitch/roll | `a1-3 -> U8-10`; `a4-6 -> U11-13`; `a7-9 -> U37-39`; `a10-12 -> U40-42` | | `piper30` | `a1-6` LJ,`a7` LG,`a8-13` RJ,`a14` RG | `a1-6 -> U1-6`; `a7 -> U17`; `a8-13 -> U30-35`; `a14 -> U46` | -| `piper2` | `a1-6` LJ,`a7` LG,`a8-13` RJ,`a14` RG | `a1-6 -> U1-6`; `a7 -> U17`; `a8-13 -> U30-35`; `a14 -> U46` | Piper 的 `action[t]` 是 next-step absolute target,joint 转换后为 -`state[t+1]-state[t]`;其他 absolute joint target 同样统一减当前 `state[t]`。其中 `piper2` -已在实际 builder -`/mnt/bos/bo23lu/realworld_piper_2/realworld_piper_infidata/1.0.0` 上核验:一个 949 帧 train -episode 的全部 948 个相邻 transition、全部 14 维均精确满足 -`action[t] == state[t+1]`,并且 train/seen/unseen 的跨 shard metadata 抽查具有相同字段顺序。 +`state[t+1]-state[t]`;其他 absolute joint target 同样统一减当前 `state[t]`。 ##### RoboCOIN @@ -253,11 +249,11 @@ RoboCOIN 按当前 pipeline 的 absolute source target 处理:arm joint 转 re -#### 5. 已确认的特殊处理 +#### 5. 值得记录的特殊处理 -- 只有 EgoVerse 使用 EEF 训练槽位;state/action 均直接使用 absolute `xyz + yaw/pitch/roll`。 -- RoboCOIN 按当前 absolute source target 流程处理,其中所有 EEF 维度均丢弃,不参与归一化和 loss。 +- 目前实际上只有 EgoVerse 使用 EEF 训练槽位——state/action 均直接使用 absolute `xyz + 欧拉角yaw/pitch/roll`。 +- RoboCOIN 按当前 absolute source target 流程处理,其中的所有 EEF 维度均丢弃,不参与归一化和 loss。(因为EEF数据质量不高) - Leju 保留 position targets,丢弃 14D arm velocity;被丢弃维度不产生统一槽位。 -- TienKung Xsens 仅使用现有 RLDS 的 14D 双臂 action,不补原始数据中的手部字段。 - `galaxea_s16_a18` 的 `a17-18` 和 `unknown_s30_a30` 的 `a29-30` 缺少物理名称,固定丢弃。 -- TienKung Gello closure 和 TienKung 38D dex hand 已统一保持 absolute;仅 arm joint 做 relative 转换。 +- 关于灵巧手,目前的容量是单侧12D,不会出现容量不够的情况: + image-20260716125947672 From 5eea8d501a83332c68bff1cd2629190ba25467cd Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Mon, 3 Aug 2026 14:41:24 +0800 Subject: [PATCH 49/64] add new piper30 val --- .../piper30/norm_stats.json | 206 +++--- .../piper30/norm_stats_meta.json | 16 +- .../cotrain_real_only/piper30/norm_stats.json | 206 +++--- .../piper30/norm_stats_meta.json | 16 +- .../full_norm_run_meta.json | 18 +- .../piper30/norm_stats.json | 206 +++--- .../piper30/norm_stats_meta.json | 16 +- .../full_norm_run_meta.json | 18 +- .../piper30/norm_stats.json | 206 +++--- .../piper30/norm_stats_meta.json | 16 +- .../full_norm_run_meta.json | 23 + .../piper30/norm_stats.json | 664 ++++++++++++++++++ .../piper30/norm_stats_meta.json | 14 + .../piper30/unified_action_space.json | 5 + docs/cotrain_real_data_configs.md | 28 +- pi07_validation_eva/README_CN.md | 15 +- pi07_validation_eva/config/eval_defaults.env | 8 +- .../scripts/evaluate_validation.py | 39 +- pi07_validation_eva/scripts/run_validation.sh | 10 +- scripts/train_cotrain_baige.sh | 12 +- src/openpi/cotrain/config.py | 12 +- tests/cotrain/test_unified_config.py | 11 + 22 files changed, 1258 insertions(+), 507 deletions(-) create mode 100644 assets/piper30_task_split_norm/full_norm_run_meta.json create mode 100644 assets/piper30_task_split_norm/piper30/norm_stats.json create mode 100644 assets/piper30_task_split_norm/piper30/norm_stats_meta.json create mode 100644 assets/piper30_task_split_norm/piper30/unified_action_space.json diff --git a/assets/cotrain_full_all_full_norm/piper30/norm_stats.json b/assets/cotrain_full_all_full_norm/piper30/norm_stats.json index 6130c4e..7e4b702 100644 --- a/assets/cotrain_full_all_full_norm/piper30/norm_stats.json +++ b/assets/cotrain_full_all_full_norm/piper30/norm_stats.json @@ -2,12 +2,12 @@ "norm_stats": { "state": { "mean": [ - 0.0760473981499672, - 1.0517759323120117, - -0.7747761011123657, - 0.15242573618888855, - 0.4494738280773163, - -0.09137012809515, + 0.08737307041883469, + 1.0953994989395142, + -0.821331262588501, + 0.15251709520816803, + 0.4993223249912262, + -0.08671002835035324, 0.0, 0.0, 0.0, @@ -18,7 +18,7 @@ 0.0, 0.0, 0.0, - 0.016618814319372177, + 0.016357315704226494, 0.0, 0.0, 0.0, @@ -31,12 +31,12 @@ 0.0, 0.0, 0.0, - 0.07727460563182831, - 0.7200653553009033, - -0.4604390561580658, - -0.2260405272245407, - 0.24460497498512268, - 0.16355007886886597, + 0.051994405686855316, + 0.6898560523986816, + -0.4541918933391571, + -0.24467997252941132, + 0.26987171173095703, + 0.18143217265605927, 0.0, 0.0, 0.0, @@ -47,7 +47,7 @@ 0.0, 0.0, 0.0, - 0.01185830868780613, + 0.007753136567771435, 0.0, 0.0, 0.0, @@ -84,12 +84,12 @@ 0.0 ], "std": [ - 0.28079867362976074, - 0.8831034302711487, - 0.7211003303527832, - 0.7177441716194153, - 0.5327411890029907, - 0.6071151494979858, + 0.2868099808692932, + 0.8798884749412537, + 0.7222753167152405, + 0.7446919679641724, + 0.5128063559532166, + 0.629437267780304, 1.0, 1.0, 1.0, @@ -100,7 +100,7 @@ 1.0, 1.0, 1.0, - 0.03437401354312897, + 0.03423196077346802, 1.0, 1.0, 1.0, @@ -113,12 +113,12 @@ 1.0, 1.0, 1.0, - 0.2081252783536911, - 0.8027406930923462, - 0.5713866949081421, - 0.6549085378646851, - 0.4776606559753418, - 0.4999569356441498, + 0.18338783085346222, + 0.8041480183601379, + 0.5695235729217529, + 0.677094042301178, + 0.45993149280548096, + 0.5101659893989563, 1.0, 1.0, 1.0, @@ -129,7 +129,7 @@ 1.0, 1.0, 1.0, - 0.031229877844452858, + 0.025858882814645767, 1.0, 1.0, 1.0, @@ -166,12 +166,12 @@ 1.0 ], "q01": [ - -0.4875116139650345, + -0.48970193145275115, -0.00043919531644787645, - -2.2551212312346323, - -1.5829997071027755, - -0.6845841318130493, - -1.615586260795593, + -2.29064900592342, + -1.597105912566185, + -0.2944919108390809, + -1.6354926676750183, -1.0, -1.0, -1.0, @@ -195,12 +195,12 @@ -1.0, -1.0, -1.0, - -0.4486167727947235, + -0.45787846466302873, -0.005599666852504015, - -1.8685801381547935, + -1.818879740881827, -1.7327060890197754, - -0.762030679988861, - -0.9720964525461196, + -0.7119369508743285, + -0.9796926288843155, -1.0, -1.0, -1.0, @@ -248,12 +248,12 @@ -1.0 ], "q99": [ - 0.8876427154064179, - 2.4845687208327694, - 0.0026788388188001555, - 1.7340745076179505, - 1.2515803995132444, - 1.6471686191558836, + 0.890928191637993, + 2.508617184537439, + 0.0021993396155535194, + 1.7347798178911207, + 1.2541333590745922, + 1.6585437088012696, 1.0, 1.0, 1.0, @@ -277,12 +277,12 @@ 1.0, 1.0, 1.0, - 0.6083275032162665, - 2.198549814021401, - 0.005637001402210462, - 1.3888049545288084, - 1.2151789251804352, - 1.545086481523514, + 0.5623895115494728, + 2.186986375693791, + 0.00564035423500453, + 1.408437099456787, + 1.2125430245399476, + 1.5564807460308074, 1.0, 1.0, 1.0, @@ -293,7 +293,7 @@ 1.0, 1.0, 1.0, - 0.09957936216918752, + 0.0994968021675013, 1.0, 1.0, 1.0, @@ -332,12 +332,12 @@ }, "actions": { "mean": [ - -0.0020336343441158533, - -0.0003478959552012384, - 0.0036158752627670765, - -0.0018518087454140186, - -0.002676568226888776, - 0.0017340786289423704, + -0.001188037102110684, + -0.0033542870078235865, + 0.004400196485221386, + -0.0028323382139205933, + -0.0015195368323475122, + 0.002721932251006365, 0.0, 0.0, 0.0, @@ -348,7 +348,7 @@ 0.0, 0.0, 0.0, - 0.01780613325536251, + 0.017288101837038994, 0.0, 0.0, 0.0, @@ -361,12 +361,12 @@ 0.0, 0.0, 0.0, - 0.002196062356233597, - 0.0025906015653163195, - -0.0007922314689494669, - -0.0006751723121851683, - -0.0008008037693798542, - -0.000598791753873229, + 0.00031630470766685903, + 0.00013673616922460496, + -0.0002151419030269608, + -0.0006771574262529612, + 0.0002553860249463469, + -0.00034903758205473423, 0.0, 0.0, 0.0, @@ -377,7 +377,7 @@ 0.0, 0.0, 0.0, - 0.012778770178556442, + 0.008260202594101429, 0.0, 0.0, 0.0, @@ -414,12 +414,12 @@ 0.0 ], "std": [ - 0.13291876018047333, - 0.4570249021053314, - 0.3580925762653351, - 0.3361109495162964, - 0.2754795253276825, - 0.30054646730422974, + 0.13685013353824615, + 0.4660901427268982, + 0.3690923750400543, + 0.3494621515274048, + 0.28257957100868225, + 0.31252312660217285, 1.0, 1.0, 1.0, @@ -430,7 +430,7 @@ 1.0, 1.0, 1.0, - 0.03545059636235237, + 0.03510034456849098, 1.0, 1.0, 1.0, @@ -443,12 +443,12 @@ 1.0, 1.0, 1.0, - 0.09071528911590576, - 0.31943845748901367, - 0.23047679662704468, - 0.20181375741958618, - 0.183805450797081, - 0.1964036524295807, + 0.08642010390758514, + 0.30906790494918823, + 0.224879652261734, + 0.20891116559505463, + 0.18015824258327484, + 0.202719584107399, 1.0, 1.0, 1.0, @@ -459,7 +459,7 @@ 1.0, 1.0, 1.0, - 0.03226304054260254, + 0.026628535240888596, 1.0, 1.0, 1.0, @@ -496,12 +496,12 @@ 1.0 ], "q01": [ - -0.5487480565547943, - -1.598214064502716, - -1.1666529998779296, - -1.2725653482437136, - -1.0261658200979231, - -1.0280169901371001, + -0.5632874671697616, + -1.625787436580658, + -1.1869233741760252, + -1.3135088970661164, + -1.0423710818052292, + -1.049885765504837, -1.0, -1.0, -1.0, @@ -525,12 +525,12 @@ -1.0, -1.0, -1.0, - -0.3517950798034668, - -1.1833345177173613, - -0.9023950806617738, - -0.7187113502502438, - -0.6822588787078857, - -0.7689471103668215, + -0.3428865031480789, + -1.169913307905197, + -0.913574746274948, + -0.7581958461761471, + -0.6523888399124145, + -0.7960410856246949, -1.0, -1.0, -1.0, @@ -578,12 +578,12 @@ -1.0 ], "q99": [ - 0.40653051655292516, - 1.6554438406944278, - 1.3955223114013675, - 1.2879812050342556, - 1.0254203120470047, - 1.127150822353363, + 0.41478261446952813, + 1.6800629229068758, + 1.425927872848511, + 1.3184264080047603, + 1.0416255737543105, + 1.189476832151413, 1.0, 1.0, 1.0, @@ -607,12 +607,12 @@ 1.0, 1.0, 1.0, - 0.3331105176448823, - 1.3341810100555422, - 0.9261858076095582, - 0.7806027033805849, - 0.7630852434158326, - 0.6658555793762204, + 0.32284709212780016, + 1.305864639520645, + 0.9142873680591586, + 0.8233775739669804, + 0.7752770959854125, + 0.6917715557098387, 1.0, 1.0, 1.0, @@ -623,7 +623,7 @@ 1.0, 1.0, 1.0, - 0.09957936216918752, + 0.0994968021675013, 1.0, 1.0, 1.0, diff --git a/assets/cotrain_full_all_full_norm/piper30/norm_stats_meta.json b/assets/cotrain_full_all_full_norm/piper30/norm_stats_meta.json index cc22714..7fcf00e 100644 --- a/assets/cotrain_full_all_full_norm/piper30/norm_stats_meta.json +++ b/assets/cotrain_full_all_full_norm/piper30/norm_stats_meta.json @@ -1,14 +1,14 @@ { - "config_name": "cotrain_real_robot", + "config_name": "cotrain_real_only", "dataset_id": "piper30", - "builder_dir": "/mnt/bos/bo23lu/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_task_split/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.1.0", "split": "train", "batch_size": 32, - "num_batches": 69490, - "num_frames": 2223663, + "num_batches": 64615, + "num_frames": 2067680, "estimated_total_batches": null, - "train_episodes": 5307, - "train_bytes": 350058169358, - "elapsed_sec": 558.5227379798889, - "frames_per_sec": 3981.3294048559737 + "train_episodes": 4927, + "train_bytes": 322604666560, + "elapsed_sec": 560.7578251361847, + "frames_per_sec": 3687.295847361286 } \ No newline at end of file diff --git a/assets/cotrain_real_only/piper30/norm_stats.json b/assets/cotrain_real_only/piper30/norm_stats.json index 6130c4e..7e4b702 100644 --- a/assets/cotrain_real_only/piper30/norm_stats.json +++ b/assets/cotrain_real_only/piper30/norm_stats.json @@ -2,12 +2,12 @@ "norm_stats": { "state": { "mean": [ - 0.0760473981499672, - 1.0517759323120117, - -0.7747761011123657, - 0.15242573618888855, - 0.4494738280773163, - -0.09137012809515, + 0.08737307041883469, + 1.0953994989395142, + -0.821331262588501, + 0.15251709520816803, + 0.4993223249912262, + -0.08671002835035324, 0.0, 0.0, 0.0, @@ -18,7 +18,7 @@ 0.0, 0.0, 0.0, - 0.016618814319372177, + 0.016357315704226494, 0.0, 0.0, 0.0, @@ -31,12 +31,12 @@ 0.0, 0.0, 0.0, - 0.07727460563182831, - 0.7200653553009033, - -0.4604390561580658, - -0.2260405272245407, - 0.24460497498512268, - 0.16355007886886597, + 0.051994405686855316, + 0.6898560523986816, + -0.4541918933391571, + -0.24467997252941132, + 0.26987171173095703, + 0.18143217265605927, 0.0, 0.0, 0.0, @@ -47,7 +47,7 @@ 0.0, 0.0, 0.0, - 0.01185830868780613, + 0.007753136567771435, 0.0, 0.0, 0.0, @@ -84,12 +84,12 @@ 0.0 ], "std": [ - 0.28079867362976074, - 0.8831034302711487, - 0.7211003303527832, - 0.7177441716194153, - 0.5327411890029907, - 0.6071151494979858, + 0.2868099808692932, + 0.8798884749412537, + 0.7222753167152405, + 0.7446919679641724, + 0.5128063559532166, + 0.629437267780304, 1.0, 1.0, 1.0, @@ -100,7 +100,7 @@ 1.0, 1.0, 1.0, - 0.03437401354312897, + 0.03423196077346802, 1.0, 1.0, 1.0, @@ -113,12 +113,12 @@ 1.0, 1.0, 1.0, - 0.2081252783536911, - 0.8027406930923462, - 0.5713866949081421, - 0.6549085378646851, - 0.4776606559753418, - 0.4999569356441498, + 0.18338783085346222, + 0.8041480183601379, + 0.5695235729217529, + 0.677094042301178, + 0.45993149280548096, + 0.5101659893989563, 1.0, 1.0, 1.0, @@ -129,7 +129,7 @@ 1.0, 1.0, 1.0, - 0.031229877844452858, + 0.025858882814645767, 1.0, 1.0, 1.0, @@ -166,12 +166,12 @@ 1.0 ], "q01": [ - -0.4875116139650345, + -0.48970193145275115, -0.00043919531644787645, - -2.2551212312346323, - -1.5829997071027755, - -0.6845841318130493, - -1.615586260795593, + -2.29064900592342, + -1.597105912566185, + -0.2944919108390809, + -1.6354926676750183, -1.0, -1.0, -1.0, @@ -195,12 +195,12 @@ -1.0, -1.0, -1.0, - -0.4486167727947235, + -0.45787846466302873, -0.005599666852504015, - -1.8685801381547935, + -1.818879740881827, -1.7327060890197754, - -0.762030679988861, - -0.9720964525461196, + -0.7119369508743285, + -0.9796926288843155, -1.0, -1.0, -1.0, @@ -248,12 +248,12 @@ -1.0 ], "q99": [ - 0.8876427154064179, - 2.4845687208327694, - 0.0026788388188001555, - 1.7340745076179505, - 1.2515803995132444, - 1.6471686191558836, + 0.890928191637993, + 2.508617184537439, + 0.0021993396155535194, + 1.7347798178911207, + 1.2541333590745922, + 1.6585437088012696, 1.0, 1.0, 1.0, @@ -277,12 +277,12 @@ 1.0, 1.0, 1.0, - 0.6083275032162665, - 2.198549814021401, - 0.005637001402210462, - 1.3888049545288084, - 1.2151789251804352, - 1.545086481523514, + 0.5623895115494728, + 2.186986375693791, + 0.00564035423500453, + 1.408437099456787, + 1.2125430245399476, + 1.5564807460308074, 1.0, 1.0, 1.0, @@ -293,7 +293,7 @@ 1.0, 1.0, 1.0, - 0.09957936216918752, + 0.0994968021675013, 1.0, 1.0, 1.0, @@ -332,12 +332,12 @@ }, "actions": { "mean": [ - -0.0020336343441158533, - -0.0003478959552012384, - 0.0036158752627670765, - -0.0018518087454140186, - -0.002676568226888776, - 0.0017340786289423704, + -0.001188037102110684, + -0.0033542870078235865, + 0.004400196485221386, + -0.0028323382139205933, + -0.0015195368323475122, + 0.002721932251006365, 0.0, 0.0, 0.0, @@ -348,7 +348,7 @@ 0.0, 0.0, 0.0, - 0.01780613325536251, + 0.017288101837038994, 0.0, 0.0, 0.0, @@ -361,12 +361,12 @@ 0.0, 0.0, 0.0, - 0.002196062356233597, - 0.0025906015653163195, - -0.0007922314689494669, - -0.0006751723121851683, - -0.0008008037693798542, - -0.000598791753873229, + 0.00031630470766685903, + 0.00013673616922460496, + -0.0002151419030269608, + -0.0006771574262529612, + 0.0002553860249463469, + -0.00034903758205473423, 0.0, 0.0, 0.0, @@ -377,7 +377,7 @@ 0.0, 0.0, 0.0, - 0.012778770178556442, + 0.008260202594101429, 0.0, 0.0, 0.0, @@ -414,12 +414,12 @@ 0.0 ], "std": [ - 0.13291876018047333, - 0.4570249021053314, - 0.3580925762653351, - 0.3361109495162964, - 0.2754795253276825, - 0.30054646730422974, + 0.13685013353824615, + 0.4660901427268982, + 0.3690923750400543, + 0.3494621515274048, + 0.28257957100868225, + 0.31252312660217285, 1.0, 1.0, 1.0, @@ -430,7 +430,7 @@ 1.0, 1.0, 1.0, - 0.03545059636235237, + 0.03510034456849098, 1.0, 1.0, 1.0, @@ -443,12 +443,12 @@ 1.0, 1.0, 1.0, - 0.09071528911590576, - 0.31943845748901367, - 0.23047679662704468, - 0.20181375741958618, - 0.183805450797081, - 0.1964036524295807, + 0.08642010390758514, + 0.30906790494918823, + 0.224879652261734, + 0.20891116559505463, + 0.18015824258327484, + 0.202719584107399, 1.0, 1.0, 1.0, @@ -459,7 +459,7 @@ 1.0, 1.0, 1.0, - 0.03226304054260254, + 0.026628535240888596, 1.0, 1.0, 1.0, @@ -496,12 +496,12 @@ 1.0 ], "q01": [ - -0.5487480565547943, - -1.598214064502716, - -1.1666529998779296, - -1.2725653482437136, - -1.0261658200979231, - -1.0280169901371001, + -0.5632874671697616, + -1.625787436580658, + -1.1869233741760252, + -1.3135088970661164, + -1.0423710818052292, + -1.049885765504837, -1.0, -1.0, -1.0, @@ -525,12 +525,12 @@ -1.0, -1.0, -1.0, - -0.3517950798034668, - -1.1833345177173613, - -0.9023950806617738, - -0.7187113502502438, - -0.6822588787078857, - -0.7689471103668215, + -0.3428865031480789, + -1.169913307905197, + -0.913574746274948, + -0.7581958461761471, + -0.6523888399124145, + -0.7960410856246949, -1.0, -1.0, -1.0, @@ -578,12 +578,12 @@ -1.0 ], "q99": [ - 0.40653051655292516, - 1.6554438406944278, - 1.3955223114013675, - 1.2879812050342556, - 1.0254203120470047, - 1.127150822353363, + 0.41478261446952813, + 1.6800629229068758, + 1.425927872848511, + 1.3184264080047603, + 1.0416255737543105, + 1.189476832151413, 1.0, 1.0, 1.0, @@ -607,12 +607,12 @@ 1.0, 1.0, 1.0, - 0.3331105176448823, - 1.3341810100555422, - 0.9261858076095582, - 0.7806027033805849, - 0.7630852434158326, - 0.6658555793762204, + 0.32284709212780016, + 1.305864639520645, + 0.9142873680591586, + 0.8233775739669804, + 0.7752770959854125, + 0.6917715557098387, 1.0, 1.0, 1.0, @@ -623,7 +623,7 @@ 1.0, 1.0, 1.0, - 0.09957936216918752, + 0.0994968021675013, 1.0, 1.0, 1.0, diff --git a/assets/cotrain_real_only/piper30/norm_stats_meta.json b/assets/cotrain_real_only/piper30/norm_stats_meta.json index cc22714..7fcf00e 100644 --- a/assets/cotrain_real_only/piper30/norm_stats_meta.json +++ b/assets/cotrain_real_only/piper30/norm_stats_meta.json @@ -1,14 +1,14 @@ { - "config_name": "cotrain_real_robot", + "config_name": "cotrain_real_only", "dataset_id": "piper30", - "builder_dir": "/mnt/bos/bo23lu/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_task_split/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.1.0", "split": "train", "batch_size": 32, - "num_batches": 69490, - "num_frames": 2223663, + "num_batches": 64615, + "num_frames": 2067680, "estimated_total_batches": null, - "train_episodes": 5307, - "train_bytes": 350058169358, - "elapsed_sec": 558.5227379798889, - "frames_per_sec": 3981.3294048559737 + "train_episodes": 4927, + "train_bytes": 322604666560, + "elapsed_sec": 560.7578251361847, + "frames_per_sec": 3687.295847361286 } \ No newline at end of file diff --git a/assets/cotrain_real_robot/full_norm_run_meta.json b/assets/cotrain_real_robot/full_norm_run_meta.json index 7e242c9..ebae671 100644 --- a/assets/cotrain_real_robot/full_norm_run_meta.json +++ b/assets/cotrain_real_robot/full_norm_run_meta.json @@ -6,18 +6,18 @@ "copy_from_assets_name": null, "datasets": [ { - "config_name": "cotrain_real_robot", + "config_name": "cotrain_real_only", "dataset_id": "piper30", - "builder_dir": "/mnt/bos/bo23lu/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_task_split/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.1.0", "split": "train", "batch_size": 32, - "num_batches": 69490, - "num_frames": 2223663, + "num_batches": 64615, + "num_frames": 2067680, "estimated_total_batches": null, - "train_episodes": 5307, - "train_bytes": 350058169358, - "elapsed_sec": 558.5227379798889, - "frames_per_sec": 3981.3294048559737 + "train_episodes": 4927, + "train_bytes": 322604666560, + "elapsed_sec": 560.7578251361847, + "frames_per_sec": 3687.295847361286 }, { "config_name": "cotrain_real_robot", @@ -524,4 +524,4 @@ "frames_per_sec": 3952.3688000892153 } ] -} \ No newline at end of file +} diff --git a/assets/cotrain_real_robot/piper30/norm_stats.json b/assets/cotrain_real_robot/piper30/norm_stats.json index 6130c4e..7e4b702 100644 --- a/assets/cotrain_real_robot/piper30/norm_stats.json +++ b/assets/cotrain_real_robot/piper30/norm_stats.json @@ -2,12 +2,12 @@ "norm_stats": { "state": { "mean": [ - 0.0760473981499672, - 1.0517759323120117, - -0.7747761011123657, - 0.15242573618888855, - 0.4494738280773163, - -0.09137012809515, + 0.08737307041883469, + 1.0953994989395142, + -0.821331262588501, + 0.15251709520816803, + 0.4993223249912262, + -0.08671002835035324, 0.0, 0.0, 0.0, @@ -18,7 +18,7 @@ 0.0, 0.0, 0.0, - 0.016618814319372177, + 0.016357315704226494, 0.0, 0.0, 0.0, @@ -31,12 +31,12 @@ 0.0, 0.0, 0.0, - 0.07727460563182831, - 0.7200653553009033, - -0.4604390561580658, - -0.2260405272245407, - 0.24460497498512268, - 0.16355007886886597, + 0.051994405686855316, + 0.6898560523986816, + -0.4541918933391571, + -0.24467997252941132, + 0.26987171173095703, + 0.18143217265605927, 0.0, 0.0, 0.0, @@ -47,7 +47,7 @@ 0.0, 0.0, 0.0, - 0.01185830868780613, + 0.007753136567771435, 0.0, 0.0, 0.0, @@ -84,12 +84,12 @@ 0.0 ], "std": [ - 0.28079867362976074, - 0.8831034302711487, - 0.7211003303527832, - 0.7177441716194153, - 0.5327411890029907, - 0.6071151494979858, + 0.2868099808692932, + 0.8798884749412537, + 0.7222753167152405, + 0.7446919679641724, + 0.5128063559532166, + 0.629437267780304, 1.0, 1.0, 1.0, @@ -100,7 +100,7 @@ 1.0, 1.0, 1.0, - 0.03437401354312897, + 0.03423196077346802, 1.0, 1.0, 1.0, @@ -113,12 +113,12 @@ 1.0, 1.0, 1.0, - 0.2081252783536911, - 0.8027406930923462, - 0.5713866949081421, - 0.6549085378646851, - 0.4776606559753418, - 0.4999569356441498, + 0.18338783085346222, + 0.8041480183601379, + 0.5695235729217529, + 0.677094042301178, + 0.45993149280548096, + 0.5101659893989563, 1.0, 1.0, 1.0, @@ -129,7 +129,7 @@ 1.0, 1.0, 1.0, - 0.031229877844452858, + 0.025858882814645767, 1.0, 1.0, 1.0, @@ -166,12 +166,12 @@ 1.0 ], "q01": [ - -0.4875116139650345, + -0.48970193145275115, -0.00043919531644787645, - -2.2551212312346323, - -1.5829997071027755, - -0.6845841318130493, - -1.615586260795593, + -2.29064900592342, + -1.597105912566185, + -0.2944919108390809, + -1.6354926676750183, -1.0, -1.0, -1.0, @@ -195,12 +195,12 @@ -1.0, -1.0, -1.0, - -0.4486167727947235, + -0.45787846466302873, -0.005599666852504015, - -1.8685801381547935, + -1.818879740881827, -1.7327060890197754, - -0.762030679988861, - -0.9720964525461196, + -0.7119369508743285, + -0.9796926288843155, -1.0, -1.0, -1.0, @@ -248,12 +248,12 @@ -1.0 ], "q99": [ - 0.8876427154064179, - 2.4845687208327694, - 0.0026788388188001555, - 1.7340745076179505, - 1.2515803995132444, - 1.6471686191558836, + 0.890928191637993, + 2.508617184537439, + 0.0021993396155535194, + 1.7347798178911207, + 1.2541333590745922, + 1.6585437088012696, 1.0, 1.0, 1.0, @@ -277,12 +277,12 @@ 1.0, 1.0, 1.0, - 0.6083275032162665, - 2.198549814021401, - 0.005637001402210462, - 1.3888049545288084, - 1.2151789251804352, - 1.545086481523514, + 0.5623895115494728, + 2.186986375693791, + 0.00564035423500453, + 1.408437099456787, + 1.2125430245399476, + 1.5564807460308074, 1.0, 1.0, 1.0, @@ -293,7 +293,7 @@ 1.0, 1.0, 1.0, - 0.09957936216918752, + 0.0994968021675013, 1.0, 1.0, 1.0, @@ -332,12 +332,12 @@ }, "actions": { "mean": [ - -0.0020336343441158533, - -0.0003478959552012384, - 0.0036158752627670765, - -0.0018518087454140186, - -0.002676568226888776, - 0.0017340786289423704, + -0.001188037102110684, + -0.0033542870078235865, + 0.004400196485221386, + -0.0028323382139205933, + -0.0015195368323475122, + 0.002721932251006365, 0.0, 0.0, 0.0, @@ -348,7 +348,7 @@ 0.0, 0.0, 0.0, - 0.01780613325536251, + 0.017288101837038994, 0.0, 0.0, 0.0, @@ -361,12 +361,12 @@ 0.0, 0.0, 0.0, - 0.002196062356233597, - 0.0025906015653163195, - -0.0007922314689494669, - -0.0006751723121851683, - -0.0008008037693798542, - -0.000598791753873229, + 0.00031630470766685903, + 0.00013673616922460496, + -0.0002151419030269608, + -0.0006771574262529612, + 0.0002553860249463469, + -0.00034903758205473423, 0.0, 0.0, 0.0, @@ -377,7 +377,7 @@ 0.0, 0.0, 0.0, - 0.012778770178556442, + 0.008260202594101429, 0.0, 0.0, 0.0, @@ -414,12 +414,12 @@ 0.0 ], "std": [ - 0.13291876018047333, - 0.4570249021053314, - 0.3580925762653351, - 0.3361109495162964, - 0.2754795253276825, - 0.30054646730422974, + 0.13685013353824615, + 0.4660901427268982, + 0.3690923750400543, + 0.3494621515274048, + 0.28257957100868225, + 0.31252312660217285, 1.0, 1.0, 1.0, @@ -430,7 +430,7 @@ 1.0, 1.0, 1.0, - 0.03545059636235237, + 0.03510034456849098, 1.0, 1.0, 1.0, @@ -443,12 +443,12 @@ 1.0, 1.0, 1.0, - 0.09071528911590576, - 0.31943845748901367, - 0.23047679662704468, - 0.20181375741958618, - 0.183805450797081, - 0.1964036524295807, + 0.08642010390758514, + 0.30906790494918823, + 0.224879652261734, + 0.20891116559505463, + 0.18015824258327484, + 0.202719584107399, 1.0, 1.0, 1.0, @@ -459,7 +459,7 @@ 1.0, 1.0, 1.0, - 0.03226304054260254, + 0.026628535240888596, 1.0, 1.0, 1.0, @@ -496,12 +496,12 @@ 1.0 ], "q01": [ - -0.5487480565547943, - -1.598214064502716, - -1.1666529998779296, - -1.2725653482437136, - -1.0261658200979231, - -1.0280169901371001, + -0.5632874671697616, + -1.625787436580658, + -1.1869233741760252, + -1.3135088970661164, + -1.0423710818052292, + -1.049885765504837, -1.0, -1.0, -1.0, @@ -525,12 +525,12 @@ -1.0, -1.0, -1.0, - -0.3517950798034668, - -1.1833345177173613, - -0.9023950806617738, - -0.7187113502502438, - -0.6822588787078857, - -0.7689471103668215, + -0.3428865031480789, + -1.169913307905197, + -0.913574746274948, + -0.7581958461761471, + -0.6523888399124145, + -0.7960410856246949, -1.0, -1.0, -1.0, @@ -578,12 +578,12 @@ -1.0 ], "q99": [ - 0.40653051655292516, - 1.6554438406944278, - 1.3955223114013675, - 1.2879812050342556, - 1.0254203120470047, - 1.127150822353363, + 0.41478261446952813, + 1.6800629229068758, + 1.425927872848511, + 1.3184264080047603, + 1.0416255737543105, + 1.189476832151413, 1.0, 1.0, 1.0, @@ -607,12 +607,12 @@ 1.0, 1.0, 1.0, - 0.3331105176448823, - 1.3341810100555422, - 0.9261858076095582, - 0.7806027033805849, - 0.7630852434158326, - 0.6658555793762204, + 0.32284709212780016, + 1.305864639520645, + 0.9142873680591586, + 0.8233775739669804, + 0.7752770959854125, + 0.6917715557098387, 1.0, 1.0, 1.0, @@ -623,7 +623,7 @@ 1.0, 1.0, 1.0, - 0.09957936216918752, + 0.0994968021675013, 1.0, 1.0, 1.0, diff --git a/assets/cotrain_real_robot/piper30/norm_stats_meta.json b/assets/cotrain_real_robot/piper30/norm_stats_meta.json index cc22714..7fcf00e 100644 --- a/assets/cotrain_real_robot/piper30/norm_stats_meta.json +++ b/assets/cotrain_real_robot/piper30/norm_stats_meta.json @@ -1,14 +1,14 @@ { - "config_name": "cotrain_real_robot", + "config_name": "cotrain_real_only", "dataset_id": "piper30", - "builder_dir": "/mnt/bos/bo23lu/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_task_split/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.1.0", "split": "train", "batch_size": 32, - "num_batches": 69490, - "num_frames": 2223663, + "num_batches": 64615, + "num_frames": 2067680, "estimated_total_batches": null, - "train_episodes": 5307, - "train_bytes": 350058169358, - "elapsed_sec": 558.5227379798889, - "frames_per_sec": 3981.3294048559737 + "train_episodes": 4927, + "train_bytes": 322604666560, + "elapsed_sec": 560.7578251361847, + "frames_per_sec": 3687.295847361286 } \ No newline at end of file diff --git a/assets/cotrain_real_robot_fix/full_norm_run_meta.json b/assets/cotrain_real_robot_fix/full_norm_run_meta.json index 7e242c9..ebae671 100644 --- a/assets/cotrain_real_robot_fix/full_norm_run_meta.json +++ b/assets/cotrain_real_robot_fix/full_norm_run_meta.json @@ -6,18 +6,18 @@ "copy_from_assets_name": null, "datasets": [ { - "config_name": "cotrain_real_robot", + "config_name": "cotrain_real_only", "dataset_id": "piper30", - "builder_dir": "/mnt/bos/bo23lu/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_task_split/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.1.0", "split": "train", "batch_size": 32, - "num_batches": 69490, - "num_frames": 2223663, + "num_batches": 64615, + "num_frames": 2067680, "estimated_total_batches": null, - "train_episodes": 5307, - "train_bytes": 350058169358, - "elapsed_sec": 558.5227379798889, - "frames_per_sec": 3981.3294048559737 + "train_episodes": 4927, + "train_bytes": 322604666560, + "elapsed_sec": 560.7578251361847, + "frames_per_sec": 3687.295847361286 }, { "config_name": "cotrain_real_robot", @@ -524,4 +524,4 @@ "frames_per_sec": 3952.3688000892153 } ] -} \ No newline at end of file +} diff --git a/assets/cotrain_real_robot_fix/piper30/norm_stats.json b/assets/cotrain_real_robot_fix/piper30/norm_stats.json index 6130c4e..7e4b702 100644 --- a/assets/cotrain_real_robot_fix/piper30/norm_stats.json +++ b/assets/cotrain_real_robot_fix/piper30/norm_stats.json @@ -2,12 +2,12 @@ "norm_stats": { "state": { "mean": [ - 0.0760473981499672, - 1.0517759323120117, - -0.7747761011123657, - 0.15242573618888855, - 0.4494738280773163, - -0.09137012809515, + 0.08737307041883469, + 1.0953994989395142, + -0.821331262588501, + 0.15251709520816803, + 0.4993223249912262, + -0.08671002835035324, 0.0, 0.0, 0.0, @@ -18,7 +18,7 @@ 0.0, 0.0, 0.0, - 0.016618814319372177, + 0.016357315704226494, 0.0, 0.0, 0.0, @@ -31,12 +31,12 @@ 0.0, 0.0, 0.0, - 0.07727460563182831, - 0.7200653553009033, - -0.4604390561580658, - -0.2260405272245407, - 0.24460497498512268, - 0.16355007886886597, + 0.051994405686855316, + 0.6898560523986816, + -0.4541918933391571, + -0.24467997252941132, + 0.26987171173095703, + 0.18143217265605927, 0.0, 0.0, 0.0, @@ -47,7 +47,7 @@ 0.0, 0.0, 0.0, - 0.01185830868780613, + 0.007753136567771435, 0.0, 0.0, 0.0, @@ -84,12 +84,12 @@ 0.0 ], "std": [ - 0.28079867362976074, - 0.8831034302711487, - 0.7211003303527832, - 0.7177441716194153, - 0.5327411890029907, - 0.6071151494979858, + 0.2868099808692932, + 0.8798884749412537, + 0.7222753167152405, + 0.7446919679641724, + 0.5128063559532166, + 0.629437267780304, 1.0, 1.0, 1.0, @@ -100,7 +100,7 @@ 1.0, 1.0, 1.0, - 0.03437401354312897, + 0.03423196077346802, 1.0, 1.0, 1.0, @@ -113,12 +113,12 @@ 1.0, 1.0, 1.0, - 0.2081252783536911, - 0.8027406930923462, - 0.5713866949081421, - 0.6549085378646851, - 0.4776606559753418, - 0.4999569356441498, + 0.18338783085346222, + 0.8041480183601379, + 0.5695235729217529, + 0.677094042301178, + 0.45993149280548096, + 0.5101659893989563, 1.0, 1.0, 1.0, @@ -129,7 +129,7 @@ 1.0, 1.0, 1.0, - 0.031229877844452858, + 0.025858882814645767, 1.0, 1.0, 1.0, @@ -166,12 +166,12 @@ 1.0 ], "q01": [ - -0.4875116139650345, + -0.48970193145275115, -0.00043919531644787645, - -2.2551212312346323, - -1.5829997071027755, - -0.6845841318130493, - -1.615586260795593, + -2.29064900592342, + -1.597105912566185, + -0.2944919108390809, + -1.6354926676750183, -1.0, -1.0, -1.0, @@ -195,12 +195,12 @@ -1.0, -1.0, -1.0, - -0.4486167727947235, + -0.45787846466302873, -0.005599666852504015, - -1.8685801381547935, + -1.818879740881827, -1.7327060890197754, - -0.762030679988861, - -0.9720964525461196, + -0.7119369508743285, + -0.9796926288843155, -1.0, -1.0, -1.0, @@ -248,12 +248,12 @@ -1.0 ], "q99": [ - 0.8876427154064179, - 2.4845687208327694, - 0.0026788388188001555, - 1.7340745076179505, - 1.2515803995132444, - 1.6471686191558836, + 0.890928191637993, + 2.508617184537439, + 0.0021993396155535194, + 1.7347798178911207, + 1.2541333590745922, + 1.6585437088012696, 1.0, 1.0, 1.0, @@ -277,12 +277,12 @@ 1.0, 1.0, 1.0, - 0.6083275032162665, - 2.198549814021401, - 0.005637001402210462, - 1.3888049545288084, - 1.2151789251804352, - 1.545086481523514, + 0.5623895115494728, + 2.186986375693791, + 0.00564035423500453, + 1.408437099456787, + 1.2125430245399476, + 1.5564807460308074, 1.0, 1.0, 1.0, @@ -293,7 +293,7 @@ 1.0, 1.0, 1.0, - 0.09957936216918752, + 0.0994968021675013, 1.0, 1.0, 1.0, @@ -332,12 +332,12 @@ }, "actions": { "mean": [ - -0.0020336343441158533, - -0.0003478959552012384, - 0.0036158752627670765, - -0.0018518087454140186, - -0.002676568226888776, - 0.0017340786289423704, + -0.001188037102110684, + -0.0033542870078235865, + 0.004400196485221386, + -0.0028323382139205933, + -0.0015195368323475122, + 0.002721932251006365, 0.0, 0.0, 0.0, @@ -348,7 +348,7 @@ 0.0, 0.0, 0.0, - 0.01780613325536251, + 0.017288101837038994, 0.0, 0.0, 0.0, @@ -361,12 +361,12 @@ 0.0, 0.0, 0.0, - 0.002196062356233597, - 0.0025906015653163195, - -0.0007922314689494669, - -0.0006751723121851683, - -0.0008008037693798542, - -0.000598791753873229, + 0.00031630470766685903, + 0.00013673616922460496, + -0.0002151419030269608, + -0.0006771574262529612, + 0.0002553860249463469, + -0.00034903758205473423, 0.0, 0.0, 0.0, @@ -377,7 +377,7 @@ 0.0, 0.0, 0.0, - 0.012778770178556442, + 0.008260202594101429, 0.0, 0.0, 0.0, @@ -414,12 +414,12 @@ 0.0 ], "std": [ - 0.13291876018047333, - 0.4570249021053314, - 0.3580925762653351, - 0.3361109495162964, - 0.2754795253276825, - 0.30054646730422974, + 0.13685013353824615, + 0.4660901427268982, + 0.3690923750400543, + 0.3494621515274048, + 0.28257957100868225, + 0.31252312660217285, 1.0, 1.0, 1.0, @@ -430,7 +430,7 @@ 1.0, 1.0, 1.0, - 0.03545059636235237, + 0.03510034456849098, 1.0, 1.0, 1.0, @@ -443,12 +443,12 @@ 1.0, 1.0, 1.0, - 0.09071528911590576, - 0.31943845748901367, - 0.23047679662704468, - 0.20181375741958618, - 0.183805450797081, - 0.1964036524295807, + 0.08642010390758514, + 0.30906790494918823, + 0.224879652261734, + 0.20891116559505463, + 0.18015824258327484, + 0.202719584107399, 1.0, 1.0, 1.0, @@ -459,7 +459,7 @@ 1.0, 1.0, 1.0, - 0.03226304054260254, + 0.026628535240888596, 1.0, 1.0, 1.0, @@ -496,12 +496,12 @@ 1.0 ], "q01": [ - -0.5487480565547943, - -1.598214064502716, - -1.1666529998779296, - -1.2725653482437136, - -1.0261658200979231, - -1.0280169901371001, + -0.5632874671697616, + -1.625787436580658, + -1.1869233741760252, + -1.3135088970661164, + -1.0423710818052292, + -1.049885765504837, -1.0, -1.0, -1.0, @@ -525,12 +525,12 @@ -1.0, -1.0, -1.0, - -0.3517950798034668, - -1.1833345177173613, - -0.9023950806617738, - -0.7187113502502438, - -0.6822588787078857, - -0.7689471103668215, + -0.3428865031480789, + -1.169913307905197, + -0.913574746274948, + -0.7581958461761471, + -0.6523888399124145, + -0.7960410856246949, -1.0, -1.0, -1.0, @@ -578,12 +578,12 @@ -1.0 ], "q99": [ - 0.40653051655292516, - 1.6554438406944278, - 1.3955223114013675, - 1.2879812050342556, - 1.0254203120470047, - 1.127150822353363, + 0.41478261446952813, + 1.6800629229068758, + 1.425927872848511, + 1.3184264080047603, + 1.0416255737543105, + 1.189476832151413, 1.0, 1.0, 1.0, @@ -607,12 +607,12 @@ 1.0, 1.0, 1.0, - 0.3331105176448823, - 1.3341810100555422, - 0.9261858076095582, - 0.7806027033805849, - 0.7630852434158326, - 0.6658555793762204, + 0.32284709212780016, + 1.305864639520645, + 0.9142873680591586, + 0.8233775739669804, + 0.7752770959854125, + 0.6917715557098387, 1.0, 1.0, 1.0, @@ -623,7 +623,7 @@ 1.0, 1.0, 1.0, - 0.09957936216918752, + 0.0994968021675013, 1.0, 1.0, 1.0, diff --git a/assets/cotrain_real_robot_fix/piper30/norm_stats_meta.json b/assets/cotrain_real_robot_fix/piper30/norm_stats_meta.json index cc22714..7fcf00e 100644 --- a/assets/cotrain_real_robot_fix/piper30/norm_stats_meta.json +++ b/assets/cotrain_real_robot_fix/piper30/norm_stats_meta.json @@ -1,14 +1,14 @@ { - "config_name": "cotrain_real_robot", + "config_name": "cotrain_real_only", "dataset_id": "piper30", - "builder_dir": "/mnt/bos/bo23lu/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_task_split/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.1.0", "split": "train", "batch_size": 32, - "num_batches": 69490, - "num_frames": 2223663, + "num_batches": 64615, + "num_frames": 2067680, "estimated_total_batches": null, - "train_episodes": 5307, - "train_bytes": 350058169358, - "elapsed_sec": 558.5227379798889, - "frames_per_sec": 3981.3294048559737 + "train_episodes": 4927, + "train_bytes": 322604666560, + "elapsed_sec": 560.7578251361847, + "frames_per_sec": 3687.295847361286 } \ No newline at end of file diff --git a/assets/piper30_task_split_norm/full_norm_run_meta.json b/assets/piper30_task_split_norm/full_norm_run_meta.json new file mode 100644 index 0000000..fa5ff53 --- /dev/null +++ b/assets/piper30_task_split_norm/full_norm_run_meta.json @@ -0,0 +1,23 @@ +{ + "config_name": "cotrain_real_only", + "output_assets_dir": "/data/wudi/Atom-0/assets/piper30_task_split_norm", + "dataset_id": "piper30", + "skip_dataset_ids": [], + "copy_from_assets_name": null, + "datasets": [ + { + "config_name": "cotrain_real_only", + "dataset_id": "piper30", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_task_split/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.1.0", + "split": "train", + "batch_size": 32, + "num_batches": 64615, + "num_frames": 2067680, + "estimated_total_batches": null, + "train_episodes": 4927, + "train_bytes": 322604666560, + "elapsed_sec": 560.7578251361847, + "frames_per_sec": 3687.295847361286 + } + ] +} \ No newline at end of file diff --git a/assets/piper30_task_split_norm/piper30/norm_stats.json b/assets/piper30_task_split_norm/piper30/norm_stats.json new file mode 100644 index 0000000..7e4b702 --- /dev/null +++ b/assets/piper30_task_split_norm/piper30/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.08737307041883469, + 1.0953994989395142, + -0.821331262588501, + 0.15251709520816803, + 0.4993223249912262, + -0.08671002835035324, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.016357315704226494, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.051994405686855316, + 0.6898560523986816, + -0.4541918933391571, + -0.24467997252941132, + 0.26987171173095703, + 0.18143217265605927, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.007753136567771435, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.2868099808692932, + 0.8798884749412537, + 0.7222753167152405, + 0.7446919679641724, + 0.5128063559532166, + 0.629437267780304, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03423196077346802, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.18338783085346222, + 0.8041480183601379, + 0.5695235729217529, + 0.677094042301178, + 0.45993149280548096, + 0.5101659893989563, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.025858882814645767, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.48970193145275115, + -0.00043919531644787645, + -2.29064900592342, + -1.597105912566185, + -0.2944919108390809, + -1.6354926676750183, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0029380800276063383, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.45787846466302873, + -0.005599666852504015, + -1.818879740881827, + -1.7327060890197754, + -0.7119369508743285, + -0.9796926288843155, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0035174399364739655, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.890928191637993, + 2.508617184537439, + 0.0021993396155535194, + 1.7347798178911207, + 1.2541333590745922, + 1.6585437088012696, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09956015744088217, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5623895115494728, + 2.186986375693791, + 0.00564035423500453, + 1.408437099456787, + 1.2125430245399476, + 1.5564807460308074, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0994968021675013, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + -0.001188037102110684, + -0.0033542870078235865, + 0.004400196485221386, + -0.0028323382139205933, + -0.0015195368323475122, + 0.002721932251006365, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.017288101837038994, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.00031630470766685903, + 0.00013673616922460496, + -0.0002151419030269608, + -0.0006771574262529612, + 0.0002553860249463469, + -0.00034903758205473423, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.008260202594101429, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.13685013353824615, + 0.4660901427268982, + 0.3690923750400543, + 0.3494621515274048, + 0.28257957100868225, + 0.31252312660217285, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.03510034456849098, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08642010390758514, + 0.30906790494918823, + 0.224879652261734, + 0.20891116559505463, + 0.18015824258327484, + 0.202719584107399, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.026628535240888596, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -0.5632874671697616, + -1.625787436580658, + -1.1869233741760252, + -1.3135088970661164, + -1.0423710818052292, + -1.049885765504837, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0029380800276063383, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.3428865031480789, + -1.169913307905197, + -0.913574746274948, + -0.7581958461761471, + -0.6523888399124145, + -0.7960410856246949, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0035174399364739655, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 0.41478261446952813, + 1.6800629229068758, + 1.425927872848511, + 1.3184264080047603, + 1.0416255737543105, + 1.189476832151413, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09956015744088217, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.32284709212780016, + 1.305864639520645, + 0.9142873680591586, + 0.8233775739669804, + 0.7752770959854125, + 0.6917715557098387, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0994968021675013, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/piper30_task_split_norm/piper30/norm_stats_meta.json b/assets/piper30_task_split_norm/piper30/norm_stats_meta.json new file mode 100644 index 0000000..7fcf00e --- /dev/null +++ b/assets/piper30_task_split_norm/piper30/norm_stats_meta.json @@ -0,0 +1,14 @@ +{ + "config_name": "cotrain_real_only", + "dataset_id": "piper30", + "builder_dir": "/mnt/bos/bo23lu/realworld_piper_task_split/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.1.0", + "split": "train", + "batch_size": 32, + "num_batches": 64615, + "num_frames": 2067680, + "estimated_total_batches": null, + "train_episodes": 4927, + "train_bytes": 322604666560, + "elapsed_sec": 560.7578251361847, + "frames_per_sec": 3687.295847361286 +} \ No newline at end of file diff --git a/assets/piper30_task_split_norm/piper30/unified_action_space.json b/assets/piper30_task_split_norm/piper30/unified_action_space.json new file mode 100644 index 0000000..1c34b2e --- /dev/null +++ b/assets/piper30_task_split_norm/piper30/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "61fa4a0bc418db15b056513e14b933f6d99508a965467b49e5823f65b5902d34" +} diff --git a/docs/cotrain_real_data_configs.md b/docs/cotrain_real_data_configs.md index 06f827b..1994bb6 100644 --- a/docs/cotrain_real_data_configs.md +++ b/docs/cotrain_real_data_configs.md @@ -4,32 +4,42 @@ | 配置名 | 数据组成 | | --- | --- | -| `cotrain_real_only` | 原真机 `piper30` + 新真机 `piper2` | +| `cotrain_real_only` | 任务隔离重划分后的真机 `piper30` + 新真机 `piper2` | | `cotrain_real_robot` | 上述两份真机数据 + AgiBot + DROID + RoboCOIN + RoboMIND_full;不包含 EgoVerse | `cotrain_real_robot` 延续现有 `cotrain_full_all` 的数据质量选择,仍排除 `robocoin_unitree_g1_dex3_s28_a28` 和 `robomind_tienkung_sim_s38_a38`。两套配置均按 train -episode 数量设置采样权重。`piper2` 默认按 902 个 train episode 计算;若训练机上的 builder -数量不同,必须通过环境变量覆盖。 +episode 数量设置采样权重。`piper30` 默认按新 builder 的 4,927 个 train episode 计算, +`piper2` 默认按 902 个 train episode 计算;若训练机上的 builder 数量不同,必须通过环境变量覆盖。 ## 1. 数据路径 -训练进程启动前设置以下环境变量。`REALWORLD_PIPER_2_BUILDER_DIR` 必须指向直接包含 -`dataset_info.json` 和 `features.json` 的 TFDS version 目录。 +训练进程启动前设置以下环境变量。两个 `*_BUILDER_DIR` 都必须指向直接包含 +`dataset_info.json` 和 `features.json` 的 TFDS version 目录。`piper30` 的默认值已经是新的 +task-disjoint 1.1.0 builder;显式设置可避免不同机器上的挂载根目录歧义。 ```bash cd /data/wudi/Atom-0 export RLDS_DATA_DIR=/mnt/bos/bo23lu +export REALWORLD_PIPER30_BUILDER_DIR=/mnt/bos/bo23lu/realworld_piper_task_split/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.1.0 +export REALWORLD_PIPER30_TRAIN_EPISODES=4927 export REALWORLD_PIPER_2_BUILDER_DIR=/mnt/bos/bo23lu/realworld_piper_2/realworld_piper_infidata/1.0.0 export REALWORLD_PIPER_2_TRAIN_EPISODES=902 +test -f "${REALWORLD_PIPER30_BUILDER_DIR}/dataset_info.json" +test -f "${REALWORLD_PIPER30_BUILDER_DIR}/features.json" test -f "${REALWORLD_PIPER_2_BUILDER_DIR}/dataset_info.json" test -f "${REALWORLD_PIPER_2_BUILDER_DIR}/features.json" ``` -当前训练机已经按上述结构整理数据。若其他训练机的 RLDS 根目录不同,只需让 -`REALWORLD_PIPER_2_BUILDER_DIR` 指向实际的 `...//` 目录,不需要修改代码。 +当前训练机已经按上述结构整理数据。若其他训练机的 RLDS 根目录不同,只需让两个 builder +环境变量指向实际的 `...//` 目录,不需要修改代码。 + +`piper30` 保持原 dataset id、重构函数和 14D→80D 动作映射不变,直接替换旧 builder。 +其 split 语义为:`train` 包含 10 个 seen task 的训练轨迹,`seen_test` 是同一批 task 的 +held-out trajectories,`unseen_test` 只包含两个未在 `train` 出现的任务。因此训练和评估仍使用 +逻辑 split 名 `train`、`seen`、`unseen`,但 unseen 已具备严格的 task-disjoint 语义。 新数据使用独立 id `piper2`,其 14D state/action 布局为: @@ -55,6 +65,8 @@ stats。下面的命令会跳过目标目录中已有且带 full-run metadata ```bash RLDS_DATA_DIR="${RLDS_DATA_DIR}" \ +REALWORLD_PIPER30_BUILDER_DIR="${REALWORLD_PIPER30_BUILDER_DIR}" \ +REALWORLD_PIPER30_TRAIN_EPISODES="${REALWORLD_PIPER30_TRAIN_EPISODES}" \ REALWORLD_PIPER_2_BUILDER_DIR="${REALWORLD_PIPER_2_BUILDER_DIR}" \ REALWORLD_PIPER_2_TRAIN_EPISODES="${REALWORLD_PIPER_2_TRAIN_EPISODES}" \ UV_CACHE_DIR=/data/wudi/.cache/uv \ @@ -70,6 +82,8 @@ uv run --group rlds python scripts/compute_cotrain_full_norm_stats_light.py \ ```bash RLDS_DATA_DIR="${RLDS_DATA_DIR}" \ +REALWORLD_PIPER30_BUILDER_DIR="${REALWORLD_PIPER30_BUILDER_DIR}" \ +REALWORLD_PIPER30_TRAIN_EPISODES="${REALWORLD_PIPER30_TRAIN_EPISODES}" \ REALWORLD_PIPER_2_BUILDER_DIR="${REALWORLD_PIPER_2_BUILDER_DIR}" \ REALWORLD_PIPER_2_TRAIN_EPISODES="${REALWORLD_PIPER_2_TRAIN_EPISODES}" \ UV_CACHE_DIR=/data/wudi/.cache/uv \ diff --git a/pi07_validation_eva/README_CN.md b/pi07_validation_eva/README_CN.md index e911fbd..5c788aa 100644 --- a/pi07_validation_eva/README_CN.md +++ b/pi07_validation_eva/README_CN.md @@ -5,23 +5,26 @@ ## 默认运行 ```bash +CHECKPOINT_ROOT=/path/to/checkpoints/cotrain_real_only/ \ bash /mnt/workspace/zhengdongchen/Atom-0/pi07_validation_eva/scripts/run_validation.sh ``` 默认评测 `CHECKPOINT_STEP=20000`、`SPLIT=seen_test`、`ANCHORS_PER_EPISODE=20`、`ACTIONS_PER_INFERENCE=8`、`FLOW_LOSS_SAMPLES=4`、`DEVICE=cuda`。 +`CHECKPOINT_ROOT` 必须指向使用 task-disjoint Piper30 重新训练的实验目录;旧 checkpoint 的训练集 +包含现在的两个 unseen task,不能用于新的 unseen 指标。 ## 后续 checkpoint ```bash -CHECKPOINT_STEP=25000 bash /mnt/workspace/zhengdongchen/Atom-0/pi07_validation_eva/scripts/run_validation.sh -CHECKPOINT_STEP=30000 bash /mnt/workspace/zhengdongchen/Atom-0/pi07_validation_eva/scripts/run_validation.sh +CHECKPOINT_ROOT=/path/to/new-exp CHECKPOINT_STEP=25000 bash /mnt/workspace/zhengdongchen/Atom-0/pi07_validation_eva/scripts/run_validation.sh +CHECKPOINT_ROOT=/path/to/new-exp CHECKPOINT_STEP=30000 bash /mnt/workspace/zhengdongchen/Atom-0/pi07_validation_eva/scripts/run_validation.sh ``` ## 只做元数据或校验 ```bash -bash /mnt/workspace/zhengdongchen/Atom-0/pi07_validation_eva/scripts/run_validation.sh --metadata-only -bash /mnt/workspace/zhengdongchen/Atom-0/pi07_validation_eva/scripts/run_validation.sh --validate-only +CHECKPOINT_ROOT=/path/to/new-exp bash /mnt/workspace/zhengdongchen/Atom-0/pi07_validation_eva/scripts/run_validation.sh --metadata-only +CHECKPOINT_ROOT=/path/to/new-exp bash /mnt/workspace/zhengdongchen/Atom-0/pi07_validation_eva/scripts/run_validation.sh --validate-only ``` 当前 SSH 环境如果 JAX 看不到 CUDA GPU,`--validate-only` 会失败并记录原因;脚本不会在无 GPU 情况下假装完成 H800 评测。 @@ -30,6 +33,6 @@ bash /mnt/workspace/zhengdongchen/Atom-0/pi07_validation_eva/scripts/run_validat - `config/eval_defaults.env`: 默认路径和参数。 - `config/training_metadata_0629.json`: 可选的本地训练元数据;如存在,报告生成器会自动读取。 -- `manifests/seen_open_loop_h8_seed42.jsonl`: open-loop 8-step manifest。 -- `manifests/seen_flow_loss_MODEL_HORIZON_seed42.jsonl`: full model horizon flow-loss manifest。 +- `manifests/_open_loop_h8_seed42.jsonl`: open-loop 8-step manifest。 +- `manifests/_flow_loss_MODEL_HORIZON_seed42.jsonl`: full model horizon flow-loss manifest。 - `results/step_020000/report.md` / `report.html`: 中文报告。 diff --git a/pi07_validation_eva/config/eval_defaults.env b/pi07_validation_eva/config/eval_defaults.env index f0cbc47..6b53da2 100644 --- a/pi07_validation_eva/config/eval_defaults.env +++ b/pi07_validation_eva/config/eval_defaults.env @@ -1,14 +1,14 @@ # 默认路径集中配置;人工改路径优先改这里,不需要改 Python 代码。 -: "${CHECKPOINT_ROOT:=/mnt/workspace/xule/pi07_reproduction/checkpoints/cotrain_all_2ep/cotrain_all_2ep_16gpus_real_data_only_0629}" +# 必须显式传入新划分数据重训产生的 checkpoint;旧 checkpoint 训练时见过现在的 unseen tasks。 : "${OPENPI_ROOT:=/mnt/workspace/xule/pi07_reproduction}" -: "${NORM_STATS_PATH:=/mnt/data/xule/pi07_reproduction/assets/cotrain_all_2ep/piper30}" -: "${DATASET_DIR:=/mnt/data/RLDS/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0}" +: "${NORM_STATS_PATH:=${OPENPI_ROOT}/assets/cotrain_real_only/piper30}" +: "${DATASET_DIR:=/mnt/data/RLDS/realworld_piper_task_split/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.1.0}" : "${OUTPUT_ROOT:=/mnt/workspace/zhengdongchen/Atom-0/pi07_validation_eva/results}" : "${PYTHON_BIN:=/mnt/data/xule/pi07_reproduction/.venv/bin/python}" # 可复用评测默认值;外部同名环境变量优先。 : "${CHECKPOINT_STEP:=20000}" -: "${CONFIG_NAME:=cotrain_all_2ep}" +: "${CONFIG_NAME:=cotrain_real_only}" : "${SPLIT:=seen_test}" : "${EPISODES:=0}" : "${ANCHORS_PER_EPISODE:=20}" diff --git a/pi07_validation_eva/scripts/evaluate_validation.py b/pi07_validation_eva/scripts/evaluate_validation.py index 0613135..daaf6c6 100755 --- a/pi07_validation_eva/scripts/evaluate_validation.py +++ b/pi07_validation_eva/scripts/evaluate_validation.py @@ -36,17 +36,13 @@ PIPER_DATASET_ID = "piper30" PROMPT_PREFIX = "Action Mode: joint. " DEFAULT_TARGET_ROOT = Path(__file__).resolve().parents[1] -DEFAULT_CHECKPOINT_ROOT = Path( - "/mnt/workspace/xule/pi07_reproduction/checkpoints/cotrain_all_2ep/" - "cotrain_all_2ep_16gpus_real_data_only_0629" -) DEFAULT_OPENPI_ROOT = Path("/mnt/workspace/xule/pi07_reproduction") DEFAULT_PYTHON = "/mnt/data/xule/pi07_reproduction/.venv/bin/python" -DEFAULT_NORM_STATS = Path("/mnt/data/xule/pi07_reproduction/assets/cotrain_all_2ep/piper30") +DEFAULT_NORM_STATS = DEFAULT_OPENPI_ROOT / "assets/cotrain_real_only/piper30" DEFAULT_DATASET_DIR = Path( - "/mnt/data/RLDS/realworld_piper/" + "/mnt/data/RLDS/realworld_piper_task_split/" "piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/" - "realworld_piper_infidata/1.0.0" + "realworld_piper_infidata/1.1.0" ) @@ -885,9 +881,13 @@ def empty_plot(name: str, title: str): def manifest_report_summary(args: argparse.Namespace) -> dict[str, Any]: + split_tag = args.split.replace("/", "_") files = { - "open_loop": DEFAULT_TARGET_ROOT / "manifests" / f"seen_open_loop_h{args.actions_per_inference}_seed{args.seed}.jsonl", - "flow_loss": DEFAULT_TARGET_ROOT / "manifests" / f"seen_flow_loss_MODEL_HORIZON_seed{args.seed}.jsonl", + "open_loop": args.anchor_manifest + or DEFAULT_TARGET_ROOT / "manifests" / f"{split_tag}_open_loop_h{args.actions_per_inference}_seed{args.seed}.jsonl", + "flow_loss": DEFAULT_TARGET_ROOT + / "manifests" + / f"{split_tag}_flow_loss_MODEL_HORIZON_seed{args.seed}.jsonl", } out: dict[str, Any] = {} for name, path in files.items(): @@ -995,10 +995,15 @@ def validate_runtime(args: argparse.Namespace, metadata: dict[str, Any]) -> dict def parse_args(argv: list[str] | None = None) -> argparse.Namespace: p = argparse.ArgumentParser(description=__doc__) p.add_argument("--openpi-root", type=Path, default=DEFAULT_OPENPI_ROOT) - p.add_argument("--checkpoint-dir", type=Path, default=DEFAULT_CHECKPOINT_ROOT / "20000") + p.add_argument( + "--checkpoint-dir", + type=Path, + required=True, + help="Checkpoint trained with the task-disjoint Piper30 builder; historical Piper checkpoints are invalid.", + ) p.add_argument("--norm-stats-path", type=Path, default=DEFAULT_NORM_STATS) p.add_argument("--dataset-dir", type=Path, default=DEFAULT_DATASET_DIR) - p.add_argument("--config-name", default="cotrain_all_2ep") + p.add_argument("--config-name", default="cotrain_real_only") p.add_argument("--split", default="seen_test") p.add_argument("--episodes", type=int, default=0, help="0 means all episodes") p.add_argument("--anchors-per-episode", type=int, default=20) @@ -1048,8 +1053,16 @@ def main(argv: list[str] | None = None) -> int: train_config = load_train_config(args.openpi_root, args.config_name, assets_base_from_norm_stats(args.norm_stats_path)) model_horizon = int(train_config.model.action_horizon) max_eps = args.episodes if args.episodes and args.episodes > 0 else None - open_manifest = args.anchor_manifest or DEFAULT_TARGET_ROOT / "manifests" / f"seen_open_loop_h{args.actions_per_inference}_seed{args.seed}.jsonl" - flow_manifest = DEFAULT_TARGET_ROOT / "manifests" / f"seen_flow_loss_MODEL_HORIZON_seed{args.seed}.jsonl" + split_tag = args.split.replace("/", "_") + open_manifest = ( + args.anchor_manifest + or DEFAULT_TARGET_ROOT + / "manifests" + / f"{split_tag}_open_loop_h{args.actions_per_inference}_seed{args.seed}.jsonl" + ) + flow_manifest = ( + DEFAULT_TARGET_ROOT / "manifests" / f"{split_tag}_flow_loss_MODEL_HORIZON_seed{args.seed}.jsonl" + ) open_records = ensure_anchor_manifest(open_manifest, args.dataset_dir, args.split, args.actions_per_inference, args.anchors_per_episode, max_eps) flow_records = ensure_anchor_manifest(flow_manifest, args.dataset_dir, args.split, model_horizon, args.anchors_per_episode, max_eps) if max_eps is not None: diff --git a/pi07_validation_eva/scripts/run_validation.sh b/pi07_validation_eva/scripts/run_validation.sh index c2d70d7..da996e3 100755 --- a/pi07_validation_eva/scripts/run_validation.sh +++ b/pi07_validation_eva/scripts/run_validation.sh @@ -9,12 +9,12 @@ if [[ -f "${DEFAULTS}" ]]; then set +a fi -CHECKPOINT_ROOT=${CHECKPOINT_ROOT:-/mnt/workspace/xule/pi07_reproduction/checkpoints/cotrain_all_2ep/cotrain_all_2ep_16gpus_real_data_only_0629} +: "${CHECKPOINT_ROOT:?Set CHECKPOINT_ROOT to a checkpoint trained with the task-disjoint Piper30 builder}" CHECKPOINT_STEP=${CHECKPOINT_STEP:-20000} OPENPI_ROOT=${OPENPI_ROOT:-/mnt/workspace/xule/pi07_reproduction} -NORM_STATS_PATH=${NORM_STATS_PATH:-/mnt/data/xule/pi07_reproduction/assets/cotrain_all_2ep/piper30} -DATASET_DIR=${DATASET_DIR:-/mnt/data/RLDS/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.0.0} -CONFIG_NAME=${CONFIG_NAME:-cotrain_all_2ep} +NORM_STATS_PATH=${NORM_STATS_PATH:-${OPENPI_ROOT}/assets/cotrain_real_only/piper30} +DATASET_DIR=${DATASET_DIR:-/mnt/data/RLDS/realworld_piper_task_split/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist/realworld_piper_infidata/1.1.0} +CONFIG_NAME=${CONFIG_NAME:-cotrain_real_only} SPLIT=${SPLIT:-seen_test} EPISODES=${EPISODES:-0} ANCHORS_PER_EPISODE=${ANCHORS_PER_EPISODE:-20} @@ -28,7 +28,7 @@ PYTHON_BIN=${PYTHON_BIN:-/mnt/data/xule/pi07_reproduction/.venv/bin/python} STEP_PADDED=$(printf "%06d" "${CHECKPOINT_STEP}") CHECKPOINT_DIR=${CHECKPOINT_ROOT}/${CHECKPOINT_STEP} OUTPUT_DIR=${OUTPUT_ROOT}/step_${STEP_PADDED} -ANCHOR_MANIFEST=${ROOT_DIR}/manifests/seen_open_loop_h${ACTIONS_PER_INFERENCE}_seed${SEED}.jsonl +ANCHOR_MANIFEST=${ROOT_DIR}/manifests/${SPLIT}_open_loop_h${ACTIONS_PER_INFERENCE}_seed${SEED}.jsonl mkdir -p "${OUTPUT_DIR}" exec "${PYTHON_BIN}" "${ROOT_DIR}/scripts/evaluate_validation.py" \ diff --git a/scripts/train_cotrain_baige.sh b/scripts/train_cotrain_baige.sh index d6080cb..926858a 100755 --- a/scripts/train_cotrain_baige.sh +++ b/scripts/train_cotrain_baige.sh @@ -15,7 +15,7 @@ BATCH_SIZE="${BATCH_SIZE:-$((64 * ${WORLD_SIZE:-1} * ${NPROC_PER_NODE:-8}))}" case "${CONFIG_NAME}" in cotrain_real_only|cotrain_real_only_legacy32) # One aggregate pass over the current piper30+piper2 norm metadata frames. - TRAIN_SAMPLES="${TRAIN_SAMPLES:-2913191}" + TRAIN_SAMPLES="${TRAIN_SAMPLES:-2757208}" DEFAULT_STEPS=$(((TRAIN_SAMPLES + BATCH_SIZE - 1) / BATCH_SIZE)) DEFAULT_WARMUP=200 DEFAULT_EVAL_INTERVAL=1000 @@ -29,9 +29,9 @@ case "${CONFIG_NAME}" in # Sample counts are informative only; all three variants intentionally use # the same optimizer-step horizon and global batch. if [[ "${CONFIG_NAME}" == "cotrain_piper30_legacy32_aliyun_replay" ]]; then - TRAIN_SAMPLES="${TRAIN_SAMPLES:-2223663}" + TRAIN_SAMPLES="${TRAIN_SAMPLES:-2067680}" else - TRAIN_SAMPLES="${TRAIN_SAMPLES:-2913191}" + TRAIN_SAMPLES="${TRAIN_SAMPLES:-2757208}" fi DEFAULT_STEPS=20000 DEFAULT_WARMUP=1000 @@ -43,11 +43,11 @@ case "${CONFIG_NAME}" in ;; cotrain_real_robot|cotrain_real_robot_fix) # One aggregate pass over norm metadata frames. The audited fix mixture removes - # Leju s54, Agilex fps50 and Agilex s26 (34 datasets, 150,109,749 frames). + # Leju s54, Agilex fps50 and Agilex s26 (34 datasets, 149,953,766 frames). if [[ "${CONFIG_NAME}" == "cotrain_real_robot_fix" ]]; then - TRAIN_SAMPLES="${TRAIN_SAMPLES:-150109749}" + TRAIN_SAMPLES="${TRAIN_SAMPLES:-149953766}" else - TRAIN_SAMPLES="${TRAIN_SAMPLES:-165126741}" + TRAIN_SAMPLES="${TRAIN_SAMPLES:-164970758}" fi DEFAULT_STEPS=$(((TRAIN_SAMPLES + BATCH_SIZE - 1) / BATCH_SIZE)) DEFAULT_WARMUP=5000 diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index d98db03..ea85da3 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -272,10 +272,14 @@ class CotrainTrainConfig(_config.TrainConfig): _RLDS_ROOT = os.environ.get("RLDS_DATA_DIR", "/mnt/bos/bo23lu") _PIPER30_ROOT = ( - f"{_RLDS_ROOT}/realworld_piper/piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist" + f"{_RLDS_ROOT}/realworld_piper_task_split/" + "piper_s14_a14_fps30_c4_ee_pose_cam_front_cam_high_cam_left_wrist_cam_right_wrist" ) -_PIPER30_BUILDER_DIR = f"{_PIPER30_ROOT}/realworld_piper_infidata/1.0.0" -_PIPER30_TRAIN_EPISODES = 5_307 +_PIPER30_BUILDER_DIR = os.environ.get( + "REALWORLD_PIPER30_BUILDER_DIR", + f"{_PIPER30_ROOT}/realworld_piper_infidata/1.1.0", +) +_PIPER30_TRAIN_EPISODES = int(os.environ.get("REALWORLD_PIPER30_TRAIN_EPISODES", "4927")) # Second in-house Piper RLDS drop. Its on-host builder was audited at # /mnt/bos/bo23lu/realworld_piper_2/realworld_piper_infidata/1.0.0. Keep an override for @@ -787,7 +791,7 @@ def _make_robomind_full_dataset( CotrainRLDSDataset( name="realworld_piper_infidata", dataset_id="piper30", - version="1.0.0", + version="1.1.0", builder_dir=_PIPER30_BUILDER_DIR, weight=1.0, train_split="train", diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index e78746a..42f44cb 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -73,6 +73,17 @@ def test_real_only_contains_both_in_house_piper_datasets() -> None: assert sum(dataset.weight for dataset in config._REAL_ONLY_DATA.datasets) == pytest.approx(1.0) +def test_piper30_uses_task_disjoint_validation_builder_as_direct_replacement() -> None: + dataset = config._PIPER30_DATA.datasets[0] + assert dataset.uid == "piper30" + assert dataset.version == "1.1.0" + assert dataset.builder_dir.endswith("/realworld_piper_infidata/1.1.0") + assert "/realworld_piper_task_split/" in dataset.builder_dir + assert dataset.train_split == "train" + assert dataset.val_splits == {"seen": "seen_test", "unseen": "unseen_test"} + assert config._PIPER30_TRAIN_EPISODES == 4_927 + + def test_legacy32_is_a_single_variable_action_space_ablation() -> None: unified = config.get_config("cotrain_real_only") legacy = config.get_config("cotrain_real_only_legacy32") From 7cbee66b1743d797fea65c0e97813136d0a9924b Mon Sep 17 00:00:00 2001 From: wudi7012 <835297796@qq.com> Date: Mon, 3 Aug 2026 15:09:34 +0800 Subject: [PATCH 50/64] update doc --- ...256\255\347\273\203\346\214\207\345\215\227.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" index 970b994..443bb6c 100644 --- "a/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" +++ "b/docs/\347\231\276\345\272\246\344\272\221\350\256\255\347\273\203\346\214\207\345\215\227.md" @@ -42,6 +42,20 @@ PARAMS_LAYOUT=paligemma-vlm-npz INIT_POLICY=PaliGemma vision+language loaded; action expert, timestep MLP, and action projections random ``` +## 实验逻辑 + ++ 正式训练1代表的是,只用真机数据,从paligemma开始训练。 +同时,此实验配置也可以用来后训练微调。 +即,如果是预训练后的模型想做真机微调,则修改正式训练1中的PARAMS_PATH,改成你的预训练ckpt,然后修改EXP_NAME,其他不变,进行训练即可。 +这即完成了“直接训练” vs “预训练+微调”的对比 + ++ 正式训练2代表的是,如何用所有真机数据,从paligemma开始预训练 + ++ 进行新的实验时,需要修改EXP_NAME + ++ 目前wudi分支的最新代码,已经修改了数据配置的代码,对于piper30数据集,已经自动切换至最新的validation set划分版本。 + + ## 正式训练 1:Piper30 + Piper2,Unified80 该实验使用 `cotrain_real_only_unified80_aliyun_recipe`: From 79ac2fcc71e8d0847272c8aaa7c1b8c307fd469a Mon Sep 17 00:00:00 2001 From: junhe Date: Tue, 4 Aug 2026 14:08:51 +0800 Subject: [PATCH 51/64] Add EgoVerse RL2 and Gemma stage initialization --- docs/egoscale_staged_training.md | 8 ++-- scripts/check_egoscale_setup.py | 12 ++++- scripts/run_egoscale_stage.sh | 13 +++--- src/openpi/cotrain/action_space.py | 2 + src/openpi/cotrain/config.py | 66 ++++++++++++++++++++++++---- tests/cotrain/test_action_space.py | 6 ++- tests/cotrain/test_unified_config.py | 4 +- 7 files changed, 89 insertions(+), 22 deletions(-) diff --git a/docs/egoscale_staged_training.md b/docs/egoscale_staged_training.md index 4597918..90cb093 100644 --- a/docs/egoscale_staged_training.md +++ b/docs/egoscale_staged_training.md @@ -4,7 +4,7 @@ | 阶段 | 配置 | 数据 | 初始化 | |---|---|---|---| -| Stage 1 | `egoscale_stage1_ego` | EgoVerse 4 个干净 builder(暂不含 Scale) | 32D `pi05_base` shape-safe 加载到 80D | +| Stage 1 | `egoscale_stage1_ego` | EgoVerse 4 个干净 builder + EgoVerse-RL2 2 个 builder(暂不含 Scale) | 服务器 PaliGemma/Gemma NPZ 初始化视觉语言骨干,80D action stack 随机初始化 | | Stage 2 baseline | `egoscale_stage2_robot` | full-all 去掉全部 EgoVerse | Stage 1 严格 checkpoint | | Stage 2 aligned | `egoscale_stage2_aligned` | 新采 human/robot EEF+gripper | Stage 1 严格 checkpoint | | Stage 3 | `egoscale_stage3_robot` | robot-only | aligned Stage 2 严格 checkpoint | @@ -64,10 +64,12 @@ EEF 保持项目最新版统一动作空间约定:absolute `xyz + yaw/pitch/ro ## Norm stats Stage 1 使用专用的 -`assets/egoscale_stage1_ego_cartesian_clean`:aria、eva、human、mecka 的统计量来自官方 +`assets/egoscale_stage1_ego_cartesian_clean_rl2`:aria、eva、human、mecka 以及 +EgoVerse-RL2 的 EVA/human 两个 builder 的统计量来自官方 `actions_cartesian`,并带有 `action_chunk_metadata.json`。当前 BOS 中的 Scale 子集具有异常 pose tails,已从生产 Stage 1 暂时排除,但 mapping 和旧配置仍保留,待数据重处理后重新审计。 -旧的 `assets/cotrain_full_all_full_norm` 是按相邻帧 `action` 计算,不能用于新的 Stage 1。 +旧的 `assets/egoscale_stage1_ego_cartesian_clean` 不含 RL2, +`assets/cotrain_full_all_full_norm` 则按相邻帧 `action` 计算;二者都不能用于新的 Stage 1。 robot 阶段继续复用经过数据审计的 `assets/cotrain_real_robot_fix`。这些统计量都已随 Git 仓库提供,`ASSETS_BASE_DIR` 默认就是仓库内的 `assets`。未来新增 aligned builder 时,才需要 diff --git a/scripts/check_egoscale_setup.py b/scripts/check_egoscale_setup.py index cc0107b..1eb6934 100755 --- a/scripts/check_egoscale_setup.py +++ b/scripts/check_egoscale_setup.py @@ -12,6 +12,16 @@ def _params_look_valid(path: Path) -> bool: + if path.is_file(): + if path.suffix != ".npz": + return False + import numpy as np + + with np.load(path, allow_pickle=False) as checkpoint: + keys = checkpoint.files + return any(key.startswith("params/img/") for key in keys) and any( + key.startswith("params/llm/") for key in keys + ) if not path.is_dir(): return False markers = ("_CHECKPOINT_METADATA", "manifest.ocdbt", "_METADATA") @@ -111,7 +121,7 @@ def main() -> int: resolved_params = Path(params_path).expanduser().resolve() print(f"params={resolved_params}") if not _params_look_valid(resolved_params): - failures.append(f"missing/invalid params directory: {resolved_params}") + failures.append(f"missing/invalid params source: {resolved_params}") elif args.config_name != "egoscale_stage1_ego" and not params_path: failures.append("later stages require --params-path pointing to the previous stage's ...//params") diff --git a/scripts/run_egoscale_stage.sh b/scripts/run_egoscale_stage.sh index bd11984..bc1dcd3 100755 --- a/scripts/run_egoscale_stage.sh +++ b/scripts/run_egoscale_stage.sh @@ -36,9 +36,12 @@ if [[ ! -x "${PYTHON_BIN}" ]]; then exit 1 fi if [[ "${STAGE}" == "stage1_ego" ]]; then - : "${ATOM_PI05_BASE_PARAMS:?Set ATOM_PI05_BASE_PARAMS to the local pi05_base/params directory}" + INIT_PARAMS_PATH="${PARAMS_PATH:-${ATOM_PI05_BASE_PARAMS:-}}" + : "${INIT_PARAMS_PATH:?Set PARAMS_PATH to the local PaliGemma .npz (preferred) or released params directory}" + ATOM_PI05_BASE_PARAMS="${INIT_PARAMS_PATH}" else : "${PARAMS_PATH:?Set PARAMS_PATH to the previous-stage /params directory}" + INIT_PARAMS_PATH="${PARAMS_PATH}" fi export ATOM_RLDS_ROOT @@ -51,9 +54,7 @@ PREFLIGHT_ARGS=( --config-name "${CONFIG_NAME}" --assets-base-dir "${ASSETS_BASE_DIR}" ) -if [[ "${STAGE}" != "stage1_ego" ]]; then - PREFLIGHT_ARGS+=(--params-path "${PARAMS_PATH}") -fi +PREFLIGHT_ARGS+=(--params-path "${INIT_PARAMS_PATH}") "${PYTHON_BIN}" "${REPO_DIR}/scripts/check_egoscale_setup.py" "${PREFLIGHT_ARGS[@]}" TRAIN_ARGS=( @@ -78,9 +79,7 @@ if [[ "${RESUME}" == "1" ]]; then elif [[ "${OVERWRITE}" == "1" ]]; then TRAIN_ARGS+=(--overwrite) fi -if [[ "${STAGE}" != "stage1_ego" ]]; then - TRAIN_ARGS+=(--weight-loader.params-path "${PARAMS_PATH}") -fi +TRAIN_ARGS+=(--weight-loader.params-path "${INIT_PARAMS_PATH}") if [[ "${WANDB_ENABLED:-0}" == "0" ]]; then TRAIN_ARGS+=(--no-wandb-enabled) else diff --git a/src/openpi/cotrain/action_space.py b/src/openpi/cotrain/action_space.py index ad5ecb5..54f8892 100644 --- a/src/openpi/cotrain/action_space.py +++ b/src/openpi/cotrain/action_space.py @@ -308,6 +308,8 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct "egoverse_human": _same(_EGO_MAPPING), "egoverse_mecka": _same(_EGO_MAPPING), "egoverse_scale": _same(_EGO_MAPPING), + "egoverse_rl2_eva": _same(_EGO_MAPPING), + "egoverse_rl2_human": _same(_EGO_MAPPING), "aligned_parallel_gripper_human": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), "aligned_parallel_gripper_robot": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), "egomimic_bowlplace_human": _same(_EGOMIMIC_SINGLE_HUMAN_MAPPING), diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index dfa6725..8d4321d 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -325,6 +325,8 @@ def assets_dirs(self) -> pathlib.Path: _EGOVERSE_FULL_ROOT = f"{_RLDS_ROOT}/EgoVerse_full" _EGOVERSE_FULL_TRAIN_EPISODES = 910 + 2_813 + 770 + 39_530 + 16_223 +_EGOVERSE_RL2_ROOT = os.environ.get("ATOM_EGOVERSE_RL2_ROOT", f"{_RLDS_ROOT}/EgoVerse_rl2") +_EGOVERSE_RL2_TRAIN_EPISODES = 2_831 + 1_387 _ROBOCOIN_ROOT = f"{_RLDS_ROOT}/RoboCOIN" # RoboCOIN tuple format: @@ -632,6 +634,42 @@ def assets_dirs(self) -> pathlib.Path: ), ) +_EGOVERSE_RL2_DATA = CotrainDataConfig( + rlds_data_dir=_EGOVERSE_RL2_ROOT, + datasets=( + CotrainRLDSDataset( + name="ego_verse_infidata", + dataset_id="egoverse_rl2_eva", + version="1.0.0", + builder_dir=( + f"{_EGOVERSE_RL2_ROOT}/eva_bimanual_front_1_left_wrist_right_wrist/" + "ego_verse_infidata/1.0.0" + ), + weight=2_831 / _EGOVERSE_RL2_TRAIN_EPISODES, + train_split="train", + val_splits={"seen": "seen_test", "unseen": "unseen_test"}, + restructure_name="egoverse_full", + action_dim=12, + delta_action_mask_dims=None, + ), + CotrainRLDSDataset( + name="ego_verse_infidata", + dataset_id="egoverse_rl2_human", + version="1.0.0", + builder_dir=( + f"{_EGOVERSE_RL2_ROOT}/human_bimanual_front_1/" + "ego_verse_infidata/1.0.0" + ), + weight=1_387 / _EGOVERSE_RL2_TRAIN_EPISODES, + train_split="train", + val_splits={"seen": "seen_test", "unseen": "unseen_test"}, + restructure_name="egoverse_full", + action_dim=12, + delta_action_mask_dims=None, + ), + ), +) + # Optional aligned human/robot play data. These paths are intentionally stable # placeholders under ATOM_RLDS_ROOT; they do not need to exist for the existing # configs. See docs/egoscale_staged_training.md for the exact 14D RLDS contract. @@ -1110,27 +1148,37 @@ def _drop_excluded_and_renormalize(datasets: tuple[CotrainRLDSDataset, ...]): ), ) -_EGOVERSE_DATASET_IDS = {dataset.uid for dataset in _EGOVERSE_FULL_DATA.datasets} +_EGOVERSE_DATASET_IDS = { + dataset.uid for dataset in (*_EGOVERSE_FULL_DATA.datasets, *_EGOVERSE_RL2_DATA.datasets) +} # The current BOS copy of EgoVerse Scale has extreme pose tails and caused repeated # full-run loss/gradient spikes. Keep it registered for audit/reprocessing, but exclude -# it from the production Stage 1 recipe. The four retained builders use the official +# it from the production Stage 1 recipe. The six retained builders use the official # per-frame 100-step actions_cartesian trajectory instead of reconstructing a horizon # from adjacent episode frames. _EGOSCALE_STAGE1_EXCLUDED_DATASET_IDS = frozenset({"egoverse_scale"}) -_EGOSCALE_STAGE1_EGO_DATA = dataclasses.replace( - _EGOVERSE_FULL_DATA, +_EGOSCALE_STAGE1_TRAIN_EPISODES = { + "egoverse_aria": 910, + "egoverse_eva": 2_813, + "egoverse_human": 770, + "egoverse_mecka": 39_530, + "egoverse_rl2_eva": 2_831, + "egoverse_rl2_human": 1_387, +} +_EGOSCALE_STAGE1_TOTAL_EPISODES = sum(_EGOSCALE_STAGE1_TRAIN_EPISODES.values()) +_EGOSCALE_STAGE1_EGO_DATA = CotrainDataConfig( + rlds_data_dir=_RLDS_ROOT, datasets=tuple( dataclasses.replace( dataset, + weight=_EGOSCALE_STAGE1_TRAIN_EPISODES[dataset.uid] / _EGOSCALE_STAGE1_TOTAL_EPISODES, restructure_name="egoverse_cartesian_chunk", precomputed_action_chunk=True, precomputed_action_source="actions_cartesian", precomputed_action_horizon=100, ) - for dataset in _drop_dataset_ids_and_renormalize( - _EGOVERSE_FULL_DATA.datasets, - _EGOSCALE_STAGE1_EXCLUDED_DATASET_IDS, - ) + for dataset in (*_EGOVERSE_FULL_DATA.datasets, *_EGOVERSE_RL2_DATA.datasets) + if dataset.uid not in _EGOSCALE_STAGE1_EXCLUDED_DATASET_IDS ), ) # Use wudi's audited production robot mixture for staged robot adaptation. @@ -1321,7 +1369,7 @@ def _strict_stage_checkpoint_loader() -> _weight_loaders.CheckpointWeightLoader: keep_period=10_000, # Dedicated stats computed from actions_cartesian. The old full-all stats used # adjacent-frame `action` chunks and must not be reused with this representation. - norm_stats_assets_name="egoscale_stage1_ego_cartesian_clean", + norm_stats_assets_name="egoscale_stage1_ego_cartesian_clean_rl2", ) _EGOSCALE_STAGE2_ROBOT = dataclasses.replace( diff --git a/tests/cotrain/test_action_space.py b/tests/cotrain/test_action_space.py index ddc1ed2..f38ecd6 100644 --- a/tests/cotrain/test_action_space.py +++ b/tests/cotrain/test_action_space.py @@ -17,6 +17,8 @@ "egoverse_human", "egoverse_mecka", "egoverse_scale", + "egoverse_rl2_eva", + "egoverse_rl2_human", "egomimic_bowlplace_human", "egomimic_bowlplace_robot", "egomimic_groceries_human", @@ -65,7 +67,7 @@ def test_registry_covers_all_documented_builders() -> None: assert set(action_space.UNIFIED_ACTION_SPECS) == EXPECTED_DATASET_IDS - assert len(EXPECTED_DATASET_IDS) == 52 + assert len(EXPECTED_DATASET_IDS) == 54 assert action_space.OPTIONAL_ALIGNED_DATASET_IDS == { "aligned_parallel_gripper_human", "aligned_parallel_gripper_robot", @@ -97,6 +99,8 @@ def test_only_ego_and_aligned_play_map_eef_slots() -> None: "egoverse_human", "egoverse_mecka", "egoverse_scale", + "egoverse_rl2_eva", + "egoverse_rl2_human", "aligned_parallel_gripper_human", "aligned_parallel_gripper_robot", "egomimic_bowlplace_human", diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index 3d420f5..9726d98 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -264,6 +264,8 @@ def test_staged_configs_use_expected_data_and_strict_checkpoint_loader() -> None "egoverse_eva", "egoverse_human", "egoverse_mecka", + "egoverse_rl2_eva", + "egoverse_rl2_human", } assert {dataset.uid for dataset in stage1_datasets}.isdisjoint( config._EGOSCALE_STAGE1_EXCLUDED_DATASET_IDS @@ -273,7 +275,7 @@ def test_staged_configs_use_expected_data_and_strict_checkpoint_loader() -> None assert all(dataset.precomputed_action_chunk for dataset in stage1_datasets) assert all(dataset.precomputed_action_source == "actions_cartesian" for dataset in stage1_datasets) assert all(dataset.precomputed_action_horizon == 100 for dataset in stage1_datasets) - assert config._EGOSCALE_STAGE1_EGO.norm_stats_assets_name == "egoscale_stage1_ego_cartesian_clean" + assert config._EGOSCALE_STAGE1_EGO.norm_stats_assets_name == "egoscale_stage1_ego_cartesian_clean_rl2" assert config._EGOSCALE_STAGE2_ROBOT.data is config._ROBOT_ALL_DATA assert config._EGOSCALE_STAGE2_ALIGNED.data is config._ALIGNED_PARALLEL_GRIPPER_DATA assert config._EGOSCALE_STAGE2_EGOMIMIC.data is config._EGOMIMIC_GROCERIES_DATA From 72d1bc34695c392095adec9e240a01e374003c4f Mon Sep 17 00:00:00 2001 From: junhe Date: Tue, 4 Aug 2026 14:17:31 +0800 Subject: [PATCH 52/64] Preserve strict staged checkpoint inheritance --- tests/cotrain/test_unified_config.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index 9726d98..3f108fe 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -42,10 +42,18 @@ def test_registered_cotrain_configs_include_controlled_legacy32_ablation() -> No ) -def test_all_cotrain_configs_support_params_path_auto_detection() -> None: +def test_fresh_start_configs_support_shape_safe_gemma_or_checkpoint_initialization() -> None: + strict_stage_names = { + "egoscale_stage2_robot", + "egoscale_stage2_aligned", + "egoscale_stage2_egomimic", + "egoscale_stage2_egomimic_all", + "egoscale_stage3_robot", + } assert all( isinstance(train_config.weight_loader, weight_loaders.ShapeSafeCheckpointWeightLoader) for train_config in config._COTRAIN_CONFIGS + if train_config.name not in strict_stage_names ) From d23d3a21e1c9a3c0d1e6e64fe4b908dac3b6193f Mon Sep 17 00:00:00 2001 From: junhe Date: Tue, 4 Aug 2026 14:36:09 +0800 Subject: [PATCH 53/64] Add self-collected aligned Stage 2 data contract --- .../convert_self_collected_aligned_to_rlds.py | 367 ++++++++++++++++++ src/openpi/cotrain/action_space.py | 15 + src/openpi/cotrain/config.py | 49 ++- src/openpi/cotrain/rlds_dataset.py | 10 +- tests/cotrain/test_action_space.py | 33 +- tests/cotrain/test_unified_config.py | 13 +- 6 files changed, 477 insertions(+), 10 deletions(-) create mode 100644 scripts/convert_self_collected_aligned_to_rlds.py diff --git a/scripts/convert_self_collected_aligned_to_rlds.py b/scripts/convert_self_collected_aligned_to_rlds.py new file mode 100644 index 0000000..095f72a --- /dev/null +++ b/scripts/convert_self_collected_aligned_to_rlds.py @@ -0,0 +1,367 @@ +#!/usr/bin/env python3 +"""Convert audited Hangzhou/Shenzhen visual labels into aligned Stage-2 RLDS. + +The action frame is the fixed head/front color optical camera. Human chunks +cover one physical second; Piper robot chunks cover four seconds to compensate +for the slower embodiment. Both are sampled to 100 points over the full window +and are later uniformly resampled to pi0's 50-point horizon. +""" + +from __future__ import annotations + +import argparse +from collections.abc import Iterator +import dataclasses +import json +from pathlib import Path +from typing import Any + +import cv2 +import numpy as np +from scipy.spatial.transform import Rotation +import tensorflow_datasets as tfds + + +CONFIG_DIMS = { + "aligned_hangzhou_human_right": 7, + "aligned_hangzhou_robot_right": 7, + "aligned_shenzhen_human_bimanual": 14, +} +IMAGE_SHAPE = (480, 640, 3) +SOURCE_HORIZON = 100 + + +def _decode_jpeg(payload: bytes) -> np.ndarray: + image = cv2.imdecode(np.frombuffer(payload, dtype=np.uint8), cv2.IMREAD_COLOR) + if image is None: + raise ValueError("Failed to decode JPEG frame") + return cv2.cvtColor(image, cv2.COLOR_BGR2RGB) + + +def _nearest_index(timestamps: np.ndarray, timestamp: float) -> int: + position = int(np.searchsorted(timestamps, timestamp)) + if position <= 0: + return 0 + if position >= len(timestamps): + return len(timestamps) - 1 + return position if abs(timestamps[position] - timestamp) < abs(timestamps[position - 1] - timestamp) else position - 1 + + +def _runs(indices: np.ndarray) -> list[np.ndarray]: + if len(indices) == 0: + return [] + boundaries = np.flatnonzero(np.diff(indices) != 1) + 1 + return [part for part in np.split(indices, boundaries) if len(part)] + + +def _pose_vectors(poses: np.ndarray) -> np.ndarray: + euler_ypr = Rotation.from_matrix(poses[:, :3, :3]).as_euler("ZYX") + euler_ypr = np.unwrap(euler_ypr, axis=0) + return np.concatenate((poses[:, :3, 3], euler_ypr), axis=-1).astype(np.float32) + + +def _quality_valid(poses: np.ndarray, valid: np.ndarray) -> np.ndarray: + result = valid.copy() + if len(poses) < 2: + return result + translation_step = np.linalg.norm(np.diff(poses[:, :3, 3], axis=0), axis=-1) + rotation_step = Rotation.from_matrix( + np.einsum("tji,tjk->tik", poses[:-1, :3, :3], poses[1:, :3, :3]) + ).magnitude() + bad = np.flatnonzero((translation_step > 0.05) | (rotation_step > np.deg2rad(30.0))) + result[bad] = False + result[np.minimum(bad + 1, len(result) - 1)] = False + return result + + +@dataclasses.dataclass +class _EpisodeArrays: + timestamps: np.ndarray + state: np.ndarray + poses: tuple[np.ndarray, ...] + valid: np.ndarray + horizon_seconds: float + + def candidate_runs(self) -> list[np.ndarray]: + candidates = [] + for run in _runs(np.flatnonzero(self.valid)): + if len(run) < 2: + continue + last_time = self.timestamps[run[-1]] + keep = run[self.timestamps[run] + self.horizon_seconds <= last_time + 1e-9] + if len(keep): + candidates.extend(keep.tolist()) + return _runs(np.asarray(candidates, dtype=np.int64)) + + def action_chunk(self, index: int) -> np.ndarray: + end_time = self.timestamps[index] + self.horizon_seconds + end = int(np.searchsorted(self.timestamps, end_time, side="left")) + segment = np.arange(index, min(end + 1, len(self.timestamps))) + if len(segment) < 2 or not np.all(self.valid[segment]): + raise ValueError(f"Action horizon crosses an invalid region at frame {index}") + target_times = np.linspace(self.timestamps[index], end_time, SOURCE_HORIZON) + values = self.state[segment] + return np.stack( + [np.interp(target_times, self.timestamps[segment], values[:, dim]) for dim in range(values.shape[-1])], + axis=-1, + ).astype(np.float32) + + +def _load_hangzhou_arrays(source: Path, domain: str) -> _EpisodeArrays: + labels_path = source / ("labels_calibrated.npz" if domain == "human" else "labels.npz") + with np.load(labels_path) as labels: + timestamps = np.asarray(labels["timestamps"], dtype=np.float64) + poses = np.asarray(labels["pose_cam_smooth"], dtype=np.float64) + valid = np.asarray(labels["valid_filled"], dtype=bool) + closure_key = "closure_calibrated" if domain == "human" else "closure_smooth" + closure = np.asarray(labels[closure_key], dtype=np.float32) + valid &= np.isfinite(closure) + valid = _quality_valid(poses, valid) + state = np.concatenate((_pose_vectors(poses), closure[:, None]), axis=-1) + return _EpisodeArrays(timestamps, state, (poses,), valid, 1.0 if domain == "human" else 4.0) + + +def _load_shenzhen_arrays(source: Path) -> _EpisodeArrays: + with np.load(source / "left_hand" / "labels.npz") as left: + timestamps = np.asarray(left["timestamps"], dtype=np.float64) + left_pose = np.asarray(left["pose_cam_smooth"], dtype=np.float64) + left_valid = np.asarray(left["valid_filled"], dtype=bool) + # This value is retained in native 14D for provenance, but the action + # mapping masks it until a left-hand gauge calibration is recorded. + left_closure = np.asarray(left["closure_smooth"], dtype=np.float32) + with np.load(source / "right_hand" / "labels_calibrated.npz") as right: + right_timestamps = np.asarray(right["timestamps"], dtype=np.float64) + right_pose = np.asarray(right["pose_cam_smooth"], dtype=np.float64) + right_valid = np.asarray(right["valid_filled"], dtype=bool) + right_closure = np.asarray(right["closure_calibrated"], dtype=np.float32) + if len(timestamps) != len(right_timestamps) or not np.allclose(timestamps, right_timestamps, atol=1e-4): + raise ValueError(f"Left/right label timelines do not match: {source}") + left_valid = _quality_valid(left_pose, left_valid & np.isfinite(left_closure)) + right_valid = _quality_valid(right_pose, right_valid & np.isfinite(right_closure)) + valid = left_valid & right_valid + state = np.concatenate( + ( + _pose_vectors(left_pose), + left_closure[:, None], + _pose_vectors(right_pose), + right_closure[:, None], + ), + axis=-1, + ) + return _EpisodeArrays(timestamps, state, (left_pose, right_pose), valid, 1.0) + + +def _read_mcap_images(source: Path, domain: str) -> dict[str, tuple[np.ndarray, list[bytes]]]: + from rosbags.highlevel import AnyReader + from rosbags.typesys import Stores, get_typestore + + metadata = json.loads((source / "episode_metadata.json").read_text(encoding="utf-8")) + bag = Path(metadata["source_bag"]) + topics = { + "base": "/piper/camera_front/color/image_raw/compressed", + "right_wrist": ( + "/piper/camera_left/color/image_raw/compressed" + if domain == "human" + else "/piper/camera_right/color/image_raw/compressed" + ), + } + streams: dict[str, list[tuple[float, bytes]]] = {slot: [] for slot in topics} + with AnyReader([bag], default_typestore=get_typestore(Stores.ROS2_JAZZY)) as reader: + by_topic = {connection.topic: connection for connection in reader.connections} + missing = set(topics.values()) - by_topic.keys() + if missing: + raise ValueError(f"{bag} is missing image topics {sorted(missing)}") + wanted = [by_topic[topic] for topic in topics.values()] + topic_to_slot = {topic: slot for slot, topic in topics.items()} + for connection, bag_timestamp, raw in reader.messages(connections=wanted): + message = reader.deserialize(raw, connection.msgtype) + streams[topic_to_slot[connection.topic]].append((bag_timestamp * 1e-9, bytes(message.data))) + return { + slot: (np.asarray([item[0] for item in rows], dtype=np.float64), [item[1] for item in rows]) + for slot, rows in streams.items() + } + + +def _video_frames(path: Path, indices: list[int]) -> dict[int, np.ndarray]: + wanted = set(indices) + result = {} + capture = cv2.VideoCapture(str(path)) + if not capture.isOpened(): + raise ValueError(f"Cannot open video {path}") + frame_index = 0 + while wanted: + ok, frame = capture.read() + if not ok: + break + if frame_index in wanted: + result[frame_index] = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + wanted.remove(frame_index) + frame_index += 1 + capture.release() + if wanted: + raise ValueError(f"Missing video frames {sorted(wanted)[:10]} in {path}") + return result + + +class _AlignedConfig(tfds.core.BuilderConfig): + def __init__(self, *, name: str, manifest: Path, rows: list[dict]): + super().__init__(name=name, version="1.0.0", description=f"Atom aligned {name}") + self.manifest = manifest + self.rows = rows + + +class AtomAlignedRlds(tfds.core.GeneratorBasedBuilder): + VERSION = tfds.core.Version("1.0.0") + + def _info(self) -> tfds.core.DatasetInfo: + action_dim = CONFIG_DIMS[self.builder_config.name] + step = tfds.features.FeaturesDict( + { + "state": tfds.features.Tensor(shape=(action_dim,), dtype=np.float32), + "action": tfds.features.Tensor(shape=(action_dim,), dtype=np.float32), + "actions": tfds.features.Tensor(shape=(SOURCE_HORIZON, action_dim), dtype=np.float32), + "image_base": tfds.features.Image(shape=IMAGE_SHAPE, dtype=np.uint8, encoding_format="jpeg"), + "image_left_wrist": tfds.features.Image(shape=IMAGE_SHAPE, dtype=np.uint8, encoding_format="jpeg"), + "image_right_wrist": tfds.features.Image(shape=IMAGE_SHAPE, dtype=np.uint8, encoding_format="jpeg"), + "image_mask_base": np.bool_, + "image_mask_left_wrist": np.bool_, + "image_mask_right_wrist": np.bool_, + "prompt": tfds.features.Text(), + "eef_frame": tfds.features.Text(), + "is_first": np.bool_, + "is_last": np.bool_, + "is_terminal": np.bool_, + "discount": np.float32, + "reward": np.float32, + } + ) + return tfds.core.DatasetInfo( + builder=self, + description="Self-collected human/robot aligned demonstrations with visual RGB-D 6-DoF labels.", + features=tfds.features.FeaturesDict( + { + "episode_metadata": tfds.features.FeaturesDict( + { + "source_episode": tfds.features.Text(), + "source_episode_id": tfds.features.Text(), + "source_start_index": np.int64, + "source_end_index": np.int64, + "split_policy": tfds.features.Text(), + "eef_frame": tfds.features.Text(), + } + ), + "steps": tfds.features.Dataset(step), + } + ), + ) + + def _split_generators(self, dl_manager): + del dl_manager + split_rows = { + name: [row for row in self.builder_config.rows if row["split"] == name] + for name in ("train", "seen_test", "unseen_test") + } + if any(not rows for rows in split_rows.values()): + raise ValueError({name: len(rows) for name, rows in split_rows.items()}) + return {name: self._generate_examples(rows) for name, rows in split_rows.items()} + + def _generate_examples(self, rows: list[dict]) -> Iterator[tuple[str, dict[str, Any]]]: + blank = np.zeros(IMAGE_SHAPE, dtype=np.uint8) + config_name = self.builder_config.name + for row in rows: + source = Path(row["source"]) + if config_name.startswith("aligned_hangzhou"): + domain = "human" if "human" in config_name else "robot" + arrays = _load_hangzhou_arrays(source, domain) + streams = _read_mcap_images(source, domain) + + def images_for(index: int) -> tuple[np.ndarray, np.ndarray, np.ndarray, bool, bool, bool]: + base_idx = _nearest_index(streams["base"][0], arrays.timestamps[index]) + wrist_idx = _nearest_index(streams["right_wrist"][0], arrays.timestamps[index]) + base_ok = abs(streams["base"][0][base_idx] - arrays.timestamps[index]) <= 0.050 + wrist_ok = abs(streams["right_wrist"][0][wrist_idx] - arrays.timestamps[index]) <= 0.050 + return ( + _decode_jpeg(streams["base"][1][base_idx]) if base_ok else blank, + blank, + _decode_jpeg(streams["right_wrist"][1][wrist_idx]) if wrist_ok else blank, + base_ok, + False, + wrist_ok, + ) + else: + arrays = _load_shenzhen_arrays(source) + episode_metadata = json.loads((source / "episode_metadata.json").read_text(encoding="utf-8")) + original = Path(episode_metadata["source_episode"]) + all_indices = [int(index) for run in arrays.candidate_runs() for index in run] + video_frames = { + "base": _video_frames(original / "head" / "rgb.mp4", all_indices), + "left": _video_frames(original / "left_hand" / "rgb.mp4", all_indices), + "right": _video_frames(original / "right_hand" / "rgb.mp4", all_indices), + } + + def images_for(index: int) -> tuple[np.ndarray, np.ndarray, np.ndarray, bool, bool, bool]: + return video_frames["base"][index], video_frames["left"][index], video_frames["right"][index], True, True, True + + for run_index, run in enumerate(arrays.candidate_runs()): + for chunk_index, start in enumerate(range(0, len(run), 256)): + chunk = run[start : start + 256] + episode_key = f"{row['episode_id'].replace('/', '__')}__run_{run_index:03d}__chunk_{chunk_index:03d}" + yield episode_key, { + "episode_metadata": { + "source_episode": str(source), + "source_episode_id": row["episode_id"], + "source_start_index": np.int64(chunk[0]), + "source_end_index": np.int64(chunk[-1] + 1), + "split_policy": "task-disjoint unseen; deterministic trajectory-disjoint seen", + "eef_frame": "fixed_head_color_optical_camera", + }, + "steps": self._steps(row, arrays, chunk, images_for), + } + + @staticmethod + def _steps(row: dict, arrays: _EpisodeArrays, indices: np.ndarray, images_for) -> Iterator[dict[str, Any]]: + for offset, index in enumerate(indices): + base, left, right, base_mask, left_mask, right_mask = images_for(int(index)) + actions = arrays.action_chunk(int(index)) + yield { + "state": arrays.state[index], + "action": actions[0], + "actions": actions, + "image_base": base, + "image_left_wrist": left, + "image_right_wrist": right, + "image_mask_base": base_mask, + "image_mask_left_wrist": left_mask, + "image_mask_right_wrist": right_mask, + "prompt": row["prompt"], + "eef_frame": "fixed_head_color_optical_camera", + "is_first": offset == 0, + "is_last": offset == len(indices) - 1, + "is_terminal": False, + "discount": np.float32(1.0), + "reward": np.float32(0.0), + } + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--config-name", choices=tuple(CONFIG_DIMS), required=True) + parser.add_argument("--split-manifest", required=True, type=Path) + parser.add_argument("--output-data-dir", required=True, type=Path) + args = parser.parse_args() + manifest = json.loads(args.split_manifest.read_text(encoding="utf-8")) + rows = [row for row in manifest["episodes"] if row["dataset_id"] == args.config_name and row["split"] != "quality_excluded"] + if not rows: + raise ValueError(f"No eligible rows for {args.config_name}") + config = _AlignedConfig(name=args.config_name, manifest=args.split_manifest.resolve(), rows=rows) + builder = AtomAlignedRlds(data_dir=str(args.output_data_dir.resolve()), config=config) + target = Path(builder.data_dir) + if target.exists() and any(target.iterdir()): + raise FileExistsError(f"Refusing to overwrite existing builder {target}") + print(f"config={args.config_name} rows={len(rows)} target={target}") + builder.download_and_prepare() + print(f"Prepared self-collected RLDS builder: {builder.data_dir}") + + +if __name__ == "__main__": + main() diff --git a/src/openpi/cotrain/action_space.py b/src/openpi/cotrain/action_space.py index 54f8892..d73a592 100644 --- a/src/openpi/cotrain/action_space.py +++ b/src/openpi/cotrain/action_space.py @@ -268,6 +268,15 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct + dims(10, RIGHT_EEF_EULER, 3) + dims(13, RIGHT_GRIPPER, 1) ) +_ALIGNED_SINGLE_RIGHT_MAPPING = dims(0, RIGHT_EEF_POSITION, 6) + dims(6, RIGHT_GRIPPER, 1) +# Shenzhen's uploaded gauge recording calibrates the right hand only. Keep the +# left 6-DoF pose supervision, but deliberately drop source slot 6 (left +# gripper) until a left-hand gauge calibration is available. +_ALIGNED_BIMANUAL_HUMAN_RIGHT_GRIPPER_MAPPING = ( + dims(0, LEFT_EEF_POSITION, 6) + + dims(7, RIGHT_EEF_POSITION, 6) + + dims(13, RIGHT_GRIPPER, 1) +) # EgoMimic does not provide the 14D pose+gripper contract above. Its public # human files contain camera-frame hand XYZ only, while its robot files contain @@ -312,6 +321,9 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct "egoverse_rl2_human": _same(_EGO_MAPPING), "aligned_parallel_gripper_human": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), "aligned_parallel_gripper_robot": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), + "aligned_hangzhou_human_right": _same(_ALIGNED_SINGLE_RIGHT_MAPPING), + "aligned_hangzhou_robot_right": _same(_ALIGNED_SINGLE_RIGHT_MAPPING), + "aligned_shenzhen_human_bimanual": _same(_ALIGNED_BIMANUAL_HUMAN_RIGHT_GRIPPER_MAPPING), "egomimic_bowlplace_human": _same(_EGOMIMIC_SINGLE_HUMAN_MAPPING), "egomimic_bowlplace_robot": _same( _EGOMIMIC_SINGLE_ROBOT_MAPPING, @@ -337,6 +349,9 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct OPTIONAL_ALIGNED_DATASET_IDS = { "aligned_parallel_gripper_human", "aligned_parallel_gripper_robot", + "aligned_hangzhou_human_right", + "aligned_hangzhou_robot_right", + "aligned_shenzhen_human_bimanual", } diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 8d4321d..7153c4c 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -711,6 +711,51 @@ def assets_dirs(self) -> pathlib.Path: ), ) +_SELF_COLLECTED_ALIGNED_ROOT = os.environ.get( + "ATOM_SELF_COLLECTED_ALIGNED_RLDS_ROOT", + f"{_RLDS_ROOT}/AtomAligned_full", +).rstrip("/") + + +def _make_self_collected_aligned_dataset( + dataset_id: str, + *, + action_dim: int, + weight: float, +) -> CotrainRLDSDataset: + return CotrainRLDSDataset( + name="atom_aligned_rlds", + dataset_id=dataset_id, + version="1.0.0", + builder_dir=f"{_SELF_COLLECTED_ALIGNED_ROOT}/atom_aligned_rlds/{dataset_id}/1.0.0", + weight=weight, + train_split="train", + val_splits={"seen": "seen_test", "unseen": "unseen_test"}, + restructure_name="aligned_parallel_gripper", + action_dim=action_dim, + precomputed_action_chunk=True, + precomputed_action_source="fixed_head_rgbd_absolute_eef_plus_gripper", + precomputed_action_horizon=100, + ) + + +_SELF_COLLECTED_ALIGNED_DATA = CotrainDataConfig( + rlds_data_dir=_SELF_COLLECTED_ALIGNED_ROOT, + datasets=( + # Match the collection design: 80% human / 20% robot. Split the + # human share by task coverage (Hangzhou 15 tasks, Shenzhen 12). + _make_self_collected_aligned_dataset( + "aligned_hangzhou_human_right", action_dim=7, weight=4 / 9 + ), + _make_self_collected_aligned_dataset( + "aligned_shenzhen_human_bimanual", action_dim=14, weight=16 / 45 + ), + _make_self_collected_aligned_dataset( + "aligned_hangzhou_robot_right", action_dim=7, weight=1 / 5 + ), + ), +) + # Public EgoMimic is a different contract from the future in-house 14D aligned # collection above. Human files contain current-camera-frame XYZ; robot files # additionally contain ALOHA joint/gripper targets. Human and robot remain @@ -1393,9 +1438,9 @@ def _strict_stage_checkpoint_loader() -> _weight_loaders.CheckpointWeightLoader: _EGOSCALE_STAGE2_ALIGNED = dataclasses.replace( _EGOSCALE_STAGE2_ROBOT, name="egoscale_stage2_aligned", - data=_ALIGNED_PARALLEL_GRIPPER_DATA, + data=_SELF_COLLECTED_ALIGNED_DATA, num_train_steps=50_000, - norm_stats_assets_name="egoscale_stage2_aligned", + norm_stats_assets_name="egoscale_stage2_self_collected_aligned", ) _EGOSCALE_STAGE2_EGOMIMIC = dataclasses.replace( diff --git a/src/openpi/cotrain/rlds_dataset.py b/src/openpi/cotrain/rlds_dataset.py index 6f58942..6d15320 100644 --- a/src/openpi/cotrain/rlds_dataset.py +++ b/src/openpi/cotrain/rlds_dataset.py @@ -229,13 +229,12 @@ def _standardized_restructure(traj, dataset_name: str): def _aligned_parallel_gripper_restructure(traj, dataset_name: str): - """Aligned human/robot play data with a shared 14D EEF+gripper interface. + """Aligned human/robot play data with single- or dual-arm EEF+gripper targets. This uses the same image/prompt fields as ``standardized`` and requires: - state[T,14] = [L xyz, L ypr, L grip, R xyz, R ypr, R grip] - actions[T,14] = [L absolute xyz, L absolute ypr, L grip, - R absolute xyz, R absolute ypr, R grip] + single right: [R xyz, R ypr, R grip] (7D) + bimanual: [L xyz, L ypr, L grip, R xyz, R ypr, R grip] (14D) EEF poses are kept in the source dataset's documented frame and are not differenced, matching the project's final unified-action-space design. @@ -245,8 +244,7 @@ def _aligned_parallel_gripper_restructure(traj, dataset_name: str): import tensorflow as tf n = tf.shape(traj["actions"])[0] - tf.debugging.assert_equal(tf.shape(traj["state"])[-1], 14) - tf.debugging.assert_equal(tf.shape(traj["actions"])[-1], 14) + tf.debugging.assert_equal(tf.shape(traj["state"])[-1], tf.shape(traj["actions"])[-1]) eef_frame = traj.get("eef_frame", tf.constant("chunk_start_local")) return { "actions": traj["actions"], diff --git a/tests/cotrain/test_action_space.py b/tests/cotrain/test_action_space.py index f38ecd6..12f0f18 100644 --- a/tests/cotrain/test_action_space.py +++ b/tests/cotrain/test_action_space.py @@ -11,6 +11,9 @@ "agibot", "aligned_parallel_gripper_human", "aligned_parallel_gripper_robot", + "aligned_hangzhou_human_right", + "aligned_hangzhou_robot_right", + "aligned_shenzhen_human_bimanual", "droid", "egoverse_aria", "egoverse_eva", @@ -67,10 +70,13 @@ def test_registry_covers_all_documented_builders() -> None: assert set(action_space.UNIFIED_ACTION_SPECS) == EXPECTED_DATASET_IDS - assert len(EXPECTED_DATASET_IDS) == 54 + assert len(EXPECTED_DATASET_IDS) == 57 assert action_space.OPTIONAL_ALIGNED_DATASET_IDS == { "aligned_parallel_gripper_human", "aligned_parallel_gripper_robot", + "aligned_hangzhou_human_right", + "aligned_hangzhou_robot_right", + "aligned_shenzhen_human_bimanual", } @@ -103,6 +109,9 @@ def test_only_ego_and_aligned_play_map_eef_slots() -> None: "egoverse_rl2_human", "aligned_parallel_gripper_human", "aligned_parallel_gripper_robot", + "aligned_hangzhou_human_right", + "aligned_hangzhou_robot_right", + "aligned_shenzhen_human_bimanual", "egomimic_bowlplace_human", "egomimic_bowlplace_robot", "egomimic_groceries_human", @@ -129,6 +138,28 @@ def test_aligned_parallel_gripper_layout(dataset_id: str) -> None: assert not any(spec.delta_mask) +@pytest.mark.parametrize( + "dataset_id", + ["aligned_hangzhou_human_right", "aligned_hangzhou_robot_right"], +) +def test_aligned_hangzhou_single_right_layout(dataset_id: str) -> None: + spec = action_space.UNIFIED_ACTION_SPECS[dataset_id] + source = np.arange(7, dtype=np.float32) + mapped = action_space.map_array(source, spec.action_mapping) + np.testing.assert_array_equal( + mapped[action_space.RIGHT_EEF_POSITION : action_space.RIGHT_EEF_EULER + 3], source[:6] + ) + assert mapped[action_space.RIGHT_GRIPPER] == source[6] + assert sum(spec.action_mask) == 7 + + +def test_aligned_shenzhen_masks_uncalibrated_left_gripper() -> None: + spec = action_space.UNIFIED_ACTION_SPECS["aligned_shenzhen_human_bimanual"] + assert sum(spec.action_mask) == 13 + assert not spec.action_mask[action_space.LEFT_GRIPPER] + assert spec.action_mask[action_space.RIGHT_GRIPPER] + + def test_egomimic_single_arm_human_maps_only_real_xyz_labels() -> None: spec = action_space.UNIFIED_ACTION_SPECS["egomimic_bowlplace_human"] source = np.array([1.0, 2.0, 3.0], dtype=np.float32) diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index 3f108fe..da9cf7b 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -285,7 +285,18 @@ def test_staged_configs_use_expected_data_and_strict_checkpoint_loader() -> None assert all(dataset.precomputed_action_horizon == 100 for dataset in stage1_datasets) assert config._EGOSCALE_STAGE1_EGO.norm_stats_assets_name == "egoscale_stage1_ego_cartesian_clean_rl2" assert config._EGOSCALE_STAGE2_ROBOT.data is config._ROBOT_ALL_DATA - assert config._EGOSCALE_STAGE2_ALIGNED.data is config._ALIGNED_PARALLEL_GRIPPER_DATA + assert config._EGOSCALE_STAGE2_ALIGNED.data is config._SELF_COLLECTED_ALIGNED_DATA + assert { + dataset.uid: dataset.action_dim for dataset in config._EGOSCALE_STAGE2_ALIGNED.data.datasets + } == { + "aligned_hangzhou_human_right": 7, + "aligned_shenzhen_human_bimanual": 14, + "aligned_hangzhou_robot_right": 7, + } + assert [dataset.weight for dataset in config._EGOSCALE_STAGE2_ALIGNED.data.datasets] == pytest.approx( + [4 / 9, 16 / 45, 1 / 5] + ) + assert all(dataset.precomputed_action_chunk for dataset in config._EGOSCALE_STAGE2_ALIGNED.data.datasets) assert config._EGOSCALE_STAGE2_EGOMIMIC.data is config._EGOMIMIC_GROCERIES_DATA assert {dataset.uid for dataset in config._EGOSCALE_STAGE2_EGOMIMIC.data.datasets} == { "egomimic_groceries_human", From 63b11f0d5dfcd16d9d9f2f8f0529f5285e322aa1 Mon Sep 17 00:00:00 2001 From: junhe Date: Wed, 5 Aug 2026 15:49:27 +0800 Subject: [PATCH 54/64] Finalize self-collected Stage 2 data loading --- .../convert_self_collected_aligned_to_rlds.py | 18 +++++---- src/openpi/cotrain/action_space.py | 11 +++--- src/openpi/cotrain/rlds_dataset.py | 18 ++++++++- tests/cotrain/test_action_space.py | 6 +-- tests/cotrain/test_rlds_dataset.py | 37 +++++++++++++++++++ 5 files changed, 73 insertions(+), 17 deletions(-) diff --git a/scripts/convert_self_collected_aligned_to_rlds.py b/scripts/convert_self_collected_aligned_to_rlds.py index 095f72a..c148813 100644 --- a/scripts/convert_self_collected_aligned_to_rlds.py +++ b/scripts/convert_self_collected_aligned_to_rlds.py @@ -126,18 +126,22 @@ def _load_shenzhen_arrays(source: Path) -> _EpisodeArrays: timestamps = np.asarray(left["timestamps"], dtype=np.float64) left_pose = np.asarray(left["pose_cam_smooth"], dtype=np.float64) left_valid = np.asarray(left["valid_filled"], dtype=bool) - # This value is retained in native 14D for provenance, but the action - # mapping masks it until a left-hand gauge calibration is recorded. - left_closure = np.asarray(left["closure_smooth"], dtype=np.float32) - with np.load(source / "right_hand" / "labels_calibrated.npz") as right: + # Both closure estimates remain in native 14D for provenance only; the + # Shenzhen action mapping masks both gripper slots from training. + left_closure = np.nan_to_num( + np.asarray(left["closure_smooth"], dtype=np.float32), nan=0.0 + ) + with np.load(source / "right_hand" / "labels.npz") as right: right_timestamps = np.asarray(right["timestamps"], dtype=np.float64) right_pose = np.asarray(right["pose_cam_smooth"], dtype=np.float64) right_valid = np.asarray(right["valid_filled"], dtype=bool) - right_closure = np.asarray(right["closure_calibrated"], dtype=np.float32) + right_closure = np.nan_to_num( + np.asarray(right["closure_smooth"], dtype=np.float32), nan=0.0 + ) if len(timestamps) != len(right_timestamps) or not np.allclose(timestamps, right_timestamps, atol=1e-4): raise ValueError(f"Left/right label timelines do not match: {source}") - left_valid = _quality_valid(left_pose, left_valid & np.isfinite(left_closure)) - right_valid = _quality_valid(right_pose, right_valid & np.isfinite(right_closure)) + left_valid = _quality_valid(left_pose, left_valid) + right_valid = _quality_valid(right_pose, right_valid) valid = left_valid & right_valid state = np.concatenate( ( diff --git a/src/openpi/cotrain/action_space.py b/src/openpi/cotrain/action_space.py index d73a592..d9a3b08 100644 --- a/src/openpi/cotrain/action_space.py +++ b/src/openpi/cotrain/action_space.py @@ -269,13 +269,12 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct + dims(13, RIGHT_GRIPPER, 1) ) _ALIGNED_SINGLE_RIGHT_MAPPING = dims(0, RIGHT_EEF_POSITION, 6) + dims(6, RIGHT_GRIPPER, 1) -# Shenzhen's uploaded gauge recording calibrates the right hand only. Keep the -# left 6-DoF pose supervision, but deliberately drop source slot 6 (left -# gripper) until a left-hand gauge calibration is available. -_ALIGNED_BIMANUAL_HUMAN_RIGHT_GRIPPER_MAPPING = ( +# Shenzhen human gripper estimates did not pass the independent <=10 mm gate +# for a continuous action horizon. Preserve the native 14D source layout, but +# deliberately drop source slots 6 and 13; only bimanual 6-DoF pose is trained. +_ALIGNED_BIMANUAL_HUMAN_POSE_ONLY_MAPPING = ( dims(0, LEFT_EEF_POSITION, 6) + dims(7, RIGHT_EEF_POSITION, 6) - + dims(13, RIGHT_GRIPPER, 1) ) # EgoMimic does not provide the 14D pose+gripper contract above. Its public @@ -323,7 +322,7 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct "aligned_parallel_gripper_robot": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), "aligned_hangzhou_human_right": _same(_ALIGNED_SINGLE_RIGHT_MAPPING), "aligned_hangzhou_robot_right": _same(_ALIGNED_SINGLE_RIGHT_MAPPING), - "aligned_shenzhen_human_bimanual": _same(_ALIGNED_BIMANUAL_HUMAN_RIGHT_GRIPPER_MAPPING), + "aligned_shenzhen_human_bimanual": _same(_ALIGNED_BIMANUAL_HUMAN_POSE_ONLY_MAPPING), "egomimic_bowlplace_human": _same(_EGOMIMIC_SINGLE_HUMAN_MAPPING), "egomimic_bowlplace_robot": _same( _EGOMIMIC_SINGLE_ROBOT_MAPPING, diff --git a/src/openpi/cotrain/rlds_dataset.py b/src/openpi/cotrain/rlds_dataset.py index 6d15320..1f36e88 100644 --- a/src/openpi/cotrain/rlds_dataset.py +++ b/src/openpi/cotrain/rlds_dataset.py @@ -192,6 +192,19 @@ def _fill_action_prompt_prefix(n, action_mode: str, eef_frame=None): return tf.fill([n], _action_prompt_prefix(action_mode, eef_frame)) +def _episode_scalar_string(value, *, field_name: str): + """Collapse a scalar or per-step constant string field to one episode scalar.""" + import tensorflow as tf + + values = tf.reshape(tf.convert_to_tensor(value, tf.string), [-1]) + tf.debugging.assert_positive(tf.size(values), message=f"{field_name} must not be empty") + first = values[0] + with tf.control_dependencies( + [tf.debugging.assert_equal(values, tf.fill(tf.shape(values), first), message=f"{field_name} must be constant")] + ): + return tf.identity(first) + + def _standardized_restructure(traj, dataset_name: str): """Restructure for the common (offline-standardized) co-training schema. @@ -245,7 +258,10 @@ def _aligned_parallel_gripper_restructure(traj, dataset_name: str): n = tf.shape(traj["actions"])[0] tf.debugging.assert_equal(tf.shape(traj["state"])[-1], tf.shape(traj["actions"])[-1]) - eef_frame = traj.get("eef_frame", tf.constant("chunk_start_local")) + eef_frame = _episode_scalar_string( + traj.get("eef_frame", tf.constant("chunk_start_local")), + field_name="eef_frame", + ) return { "actions": traj["actions"], "state": traj["state"], diff --git a/tests/cotrain/test_action_space.py b/tests/cotrain/test_action_space.py index 12f0f18..940fc59 100644 --- a/tests/cotrain/test_action_space.py +++ b/tests/cotrain/test_action_space.py @@ -153,11 +153,11 @@ def test_aligned_hangzhou_single_right_layout(dataset_id: str) -> None: assert sum(spec.action_mask) == 7 -def test_aligned_shenzhen_masks_uncalibrated_left_gripper() -> None: +def test_aligned_shenzhen_masks_both_unvalidated_human_grippers() -> None: spec = action_space.UNIFIED_ACTION_SPECS["aligned_shenzhen_human_bimanual"] - assert sum(spec.action_mask) == 13 + assert sum(spec.action_mask) == 12 assert not spec.action_mask[action_space.LEFT_GRIPPER] - assert spec.action_mask[action_space.RIGHT_GRIPPER] + assert not spec.action_mask[action_space.RIGHT_GRIPPER] def test_egomimic_single_arm_human_maps_only_real_xyz_labels() -> None: diff --git a/tests/cotrain/test_rlds_dataset.py b/tests/cotrain/test_rlds_dataset.py index ed8f988..cc136f9 100644 --- a/tests/cotrain/test_rlds_dataset.py +++ b/tests/cotrain/test_rlds_dataset.py @@ -37,3 +37,40 @@ def test_resample_precomputed_action_chunk_rejects_nonpositive_model_horizon() - {"actions": np.zeros([1, 100, 12], dtype=np.float32)}, action_chunk_size=0, ) + + +def test_aligned_restructure_accepts_per_step_constant_eef_frame() -> None: + tf = pytest.importorskip("tensorflow") + steps = 2 + trajectory = { + "actions": tf.zeros([steps, 100, 7], tf.float32), + "state": tf.zeros([steps, 7], tf.float32), + "image_base": tf.zeros([steps, 2, 2, 3], tf.uint8), + "image_left_wrist": tf.zeros([steps, 2, 2, 3], tf.uint8), + "image_right_wrist": tf.zeros([steps, 2, 2, 3], tf.uint8), + "image_mask_base": tf.ones([steps], tf.bool), + "image_mask_left_wrist": tf.zeros([steps], tf.bool), + "image_mask_right_wrist": tf.ones([steps], tf.bool), + "prompt": tf.constant(["task", "task"]), + "eef_frame": tf.constant( + ["fixed_head_color_optical_camera", "fixed_head_color_optical_camera"] + ), + } + + output = rlds_dataset._aligned_parallel_gripper_restructure( # noqa: SLF001 + trajectory, "aligned_hangzhou_human_right" + ) + + assert output["prompt_prefix"].shape == (steps,) + assert output["prompt_prefix"].numpy().tolist() == [ + b"Action Mode: eef. EEF Frame: fixed_head_color_optical_camera. ", + b"Action Mode: eef. EEF Frame: fixed_head_color_optical_camera. ", + ] + + +def test_aligned_restructure_rejects_inconsistent_eef_frame() -> None: + tf = pytest.importorskip("tensorflow") + with pytest.raises(tf.errors.InvalidArgumentError, match="eef_frame must be constant"): + rlds_dataset._episode_scalar_string( # noqa: SLF001 + tf.constant(["camera_a", "camera_b"]), field_name="eef_frame" + ) From 26a13587a3a055183f6ce71883492513e2f68e2a Mon Sep 17 00:00:00 2001 From: junhe Date: Thu, 6 Aug 2026 14:25:02 +0800 Subject: [PATCH 55/64] Prepare Stage 1 DLC full training --- .../action_chunk_metadata.json | 31 + .../egoverse_aria/norm_stats.json | 664 ++++++++++++++++++ .../egoverse_aria/unified_action_space.json | 5 + .../egoverse_eva/norm_stats.json | 664 ++++++++++++++++++ .../egoverse_eva/unified_action_space.json | 5 + .../egoverse_human/norm_stats.json | 664 ++++++++++++++++++ .../egoverse_human/unified_action_space.json | 5 + .../egoverse_mecka/norm_stats.json | 664 ++++++++++++++++++ .../egoverse_mecka/unified_action_space.json | 5 + .../egoverse_rl2_eva/norm_stats.json | 664 ++++++++++++++++++ .../unified_action_space.json | 5 + .../egoverse_rl2_human/norm_stats.json | 664 ++++++++++++++++++ .../unified_action_space.json | 5 + docs/egoscale_staged_training.md | 46 +- scripts/run_egoscale_stage.sh | 5 + scripts/run_egoscale_stage1_dlc_full.sh | 54 ++ 16 files changed, 4138 insertions(+), 12 deletions(-) create mode 100644 assets/egoscale_stage1_ego_cartesian_clean_rl2/action_chunk_metadata.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_aria/norm_stats.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_aria/unified_action_space.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_eva/norm_stats.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_eva/unified_action_space.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_human/norm_stats.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_human/unified_action_space.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_mecka/norm_stats.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_mecka/unified_action_space.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_eva/norm_stats.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_eva/unified_action_space.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_human/norm_stats.json create mode 100644 assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_human/unified_action_space.json create mode 100755 scripts/run_egoscale_stage1_dlc_full.sh diff --git a/assets/egoscale_stage1_ego_cartesian_clean_rl2/action_chunk_metadata.json b/assets/egoscale_stage1_ego_cartesian_clean_rl2/action_chunk_metadata.json new file mode 100644 index 0000000..94487ec --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean_rl2/action_chunk_metadata.json @@ -0,0 +1,31 @@ +{ + "datasets": { + "egoverse_aria": { + "action_source": "actions_cartesian", + "source_action_horizon": 100 + }, + "egoverse_eva": { + "action_source": "actions_cartesian", + "source_action_horizon": 100 + }, + "egoverse_human": { + "action_source": "actions_cartesian", + "source_action_horizon": 100 + }, + "egoverse_mecka": { + "action_source": "actions_cartesian", + "source_action_horizon": 100 + }, + "egoverse_rl2_eva": { + "action_source": "actions_cartesian", + "source_action_horizon": 100 + }, + "egoverse_rl2_human": { + "action_source": "actions_cartesian", + "source_action_horizon": 100 + } + }, + "model_action_horizon": 50, + "resampling": "uniform_full_window", + "version": 2 +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_aria/norm_stats.json b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_aria/norm_stats.json new file mode 100644 index 0000000..4ff2258 --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_aria/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.12166035175323486, + 0.23119498789310455, + 0.4111783802509308, + -0.5298404693603516, + 0.44920289516448975, + 0.5565283298492432, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.23643210530281067, + 0.21523436903953552, + 0.4122660756111145, + 0.3888055384159088, + -0.38106709718704224, + 0.6427460312843323, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.08778028935194016, + 0.15163446962833405, + 0.13368120789527893, + 0.6714040040969849, + 0.3866713047027588, + 0.5079607367515564, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.09122937172651291, + 0.12792636454105377, + 0.12599395215511322, + 0.582551121711731, + 0.3378855288028717, + 0.4499942362308502, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.3689167526066303, + -0.054547168362140575, + 0.09931514641642572, + -2.4617583399295806, + -0.5316209133625031, + -0.7567985370635988, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.013067733407020554, + -0.04368885927200317, + 0.10875816532969476, + -1.0028089153289792, + -1.154629192495346, + -0.5534574932098391, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.08753183281421661, + 0.7393663897156717, + 0.6762258793920278, + 0.8783182964801783, + 1.310225102376938, + 1.8091314195632933, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.45415698641538627, + 0.5861799350023269, + 0.6513249461054802, + 1.9897053428649905, + 0.3179172328710558, + 1.8096286849975582, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.12074601650238037, + 0.23127269744873047, + 0.4086158573627472, + -0.5268499851226807, + 0.4486653506755829, + 0.5590476989746094, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.23527181148529053, + 0.2153901606798172, + 0.4092255234718323, + 0.3862147629261017, + -0.3803271949291229, + 0.645171046257019, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.09276538342237473, + 0.15471841394901276, + 0.14132468402385712, + 0.6763492822647095, + 0.3874964416027069, + 0.5263004302978516, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0987233966588974, + 0.13191889226436615, + 0.13414499163627625, + 0.5869997143745422, + 0.3407040536403656, + 0.46784698963165283, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.37511724073886876, + -0.06733995723724373, + 0.07096390113830564, + -2.4730586353302, + -0.5389193408966064, + -0.8180741324424745, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.05074397559165966, + -0.06282284736633303, + 0.08328107010126118, + -1.0480259569168089, + -1.1708042019844056, + -0.6295796968936922, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.11001674745082868, + 0.7423019834518432, + 0.6922297708511351, + 0.8796471023559569, + 1.3180414205551148, + 2.025689142227173, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.4544835112094878, + 0.5950588770866394, + 0.6731816347360611, + 1.975429588699341, + 0.3151969306945801, + 1.977904184818267, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } + } +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_aria/unified_action_space.json b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_aria/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_aria/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_eva/norm_stats.json b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_eva/norm_stats.json new file mode 100644 index 0000000..e6ae406 --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_eva/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2190004289150238, + -0.01304883137345314, + 0.21394658088684082, + -1.9095458984375, + -0.19596563279628754, + -1.419466495513916, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2360052466392517, + 0.02680254355072975, + 0.21276696026325226, + -1.916266679763794, + 0.13471189141273499, + -1.5923057794570923, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.10091721266508102, + 0.10360612720251083, + 0.06888390332460403, + 0.45155060291290283, + 0.36519327759742737, + 0.4060201644897461, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1073782742023468, + 0.11774510145187378, + 0.083305723965168, + 0.46599993109703064, + 0.3570115268230438, + 0.4728350341320038, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07179967370331287, + -0.2740250060558319, + 0.08771113557145, + -2.8700483612060546, + -1.2913335979938507, + -2.317228254318237, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07996378449304029, + -0.26061565375328066, + 0.08465802989006042, + -2.8858336179733275, + -0.6177014261245727, + -2.7656726984024047, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.48311578728854654, + 0.2508078234434127, + 0.3998115311957896, + -1.0920184017658237, + 0.4456321312904361, + -0.09932647967338548, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.534533993572928, + 0.3292458095788955, + 0.4653055617466569, + -1.0375731033325195, + 1.212061049461365, + -0.5427560737609864, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.22019365429878235, + -0.013202173635363579, + 0.21475966274738312, + -1.9115854501724243, + -0.1973499059677124, + -1.4179644584655762, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.23747846484184265, + 0.027177968993782997, + 0.21387891471385956, + -1.9178380966186523, + 0.13657420873641968, + -1.5925509929656982, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.10051397234201431, + 0.10388731211423874, + 0.06895716488361359, + 0.45243099331855774, + 0.36674046516418457, + 0.40779173374176025, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1066482812166214, + 0.11816641688346863, + 0.08349459618330002, + 0.4674621820449829, + 0.35862237215042114, + 0.47751733660697937, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07154435643851756, + -0.27418689156770704, + 0.08781253271102905, + -2.8701535339355466, + -1.294304462981224, + -2.318497973680496, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07960215345956385, + -0.2608030303299427, + 0.08477979813441634, + -2.886489329814911, + -0.6195968866348266, + -2.7708734118938447, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.4832434459209442, + 0.2508078234434127, + 0.4002171197541058, + -1.0895058629512788, + 0.4471175637841225, + -0.09426423907279924, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.534533993572928, + 0.3296205627322196, + 0.4655490982353687, + -1.0342174954414367, + 1.214405522346497, + -0.5290375106334686, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } + } +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_eva/unified_action_space.json b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_eva/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_eva/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_human/norm_stats.json b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_human/norm_stats.json new file mode 100644 index 0000000..6080f77 --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_human/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.1330566257238388, + 0.24941594898700714, + 0.3912067711353302, + -0.5117707848548889, + 0.4540312588214874, + 0.5344458818435669, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.22239437699317932, + 0.23018667101860046, + 0.40321943163871765, + -1.0734251737594604, + 0.40631866455078125, + -0.567889392375946, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.08491669595241547, + 0.14863893389701843, + 0.13072209060192108, + 0.665607213973999, + 0.38427573442459106, + 0.5125419497489929, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.09016702324151993, + 0.12886397540569305, + 0.1315808743238449, + 2.413289785385132, + 0.345689594745636, + 0.45598432421684265, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.37785880255699156, + -0.10297333164215094, + 0.06543110491633417, + -2.2986595950126647, + -0.4615935548305512, + -0.7673034253120425, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.012441163522005028, + -0.06359605151414871, + 0.08504984902143478, + -3.132793189573288, + -0.32782486844062797, + -1.9951087409973145, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.05176050739884375, + 0.7069211017608641, + 0.6560952421188355, + 0.9478633759498596, + 1.2835144963264464, + 2.1235865449905393, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.43256259637475025, + 0.5807454437494279, + 0.6534668659090995, + 3.1277673608303065, + 1.1876426827907562, + 0.5026934100627898, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.13209442794322968, + 0.24938827753067017, + 0.387939989566803, + -0.5071555972099304, + 0.4537590444087982, + 0.5403160452842712, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.22138313949108124, + 0.23027460277080536, + 0.39935484528541565, + -1.0899399518966675, + 0.4049857258796692, + -0.5746946334838867, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.09488733857870102, + 0.15424220263957977, + 0.14098116755485535, + 0.6701377630233765, + 0.38455674052238464, + 0.5300745964050293, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.10320556163787842, + 0.13505098223686218, + 0.14237873256206512, + 2.4028518199920654, + 0.34777238965034485, + 0.47335296869277954, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.4124593452453613, + -0.11575612220764153, + 0.030947245287895164, + -2.3122097148895264, + -0.46367396545410156, + -0.7979378693103794, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.09252005891799975, + -0.0849433012008669, + 0.04245689219236359, + -3.1302830075740813, + -0.32215781345367445, + -2.220473990869522, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.039014852523802546, + 0.7114729148864747, + 0.6777088600516317, + 0.9575540544509895, + 1.2854063110589982, + 2.293356660604477, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.40437775545120225, + 0.5969644649505614, + 0.6737304461598397, + 3.129026132106781, + 1.1957805883407593, + 0.5252715008735653, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } + } +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_human/unified_action_space.json b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_human/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_human/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_mecka/norm_stats.json b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_mecka/norm_stats.json new file mode 100644 index 0000000..662a55a --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_mecka/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.041311681270599365, + 0.02016034536063671, + 0.42764273285865784, + -0.30062398314476013, + 0.8043126463890076, + 0.7058155536651611, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.16585250198841095, + 0.011174505576491356, + 0.4123918116092682, + 0.0937289446592331, + -0.7642404437065125, + 1.0252869129180908, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.06677284091711044, + 0.0860026404261589, + 0.11104816198348999, + 1.4209537506103516, + 0.39864784479141235, + 1.3748582601547241, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07352157682180405, + 0.08598791807889938, + 0.11283272504806519, + 1.1708850860595703, + 0.41116347908973694, + 1.2039682865142822, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.24359868192076684, + -0.17205708267092706, + 0.20571585297584527, + -3.044824007701874, + -0.09930047750473037, + -2.861349939966202, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.008344786661863335, + -0.1877607287824154, + 0.19212565280497074, + -2.8387421497821808, + -1.488239255809784, + -2.794754576873779, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1004951382339001, + 0.23993051539659493, + 0.7305141133069992, + 3.0272344609260555, + 1.494115477538109, + 2.925446102714538, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.38663559036850936, + 0.22775880253314973, + 0.718777276083827, + 2.9580810029029854, + 0.22219988961219794, + 2.926661149692536, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0410047322511673, + 0.019869746640324593, + 0.42761027812957764, + -0.2989015281200409, + 0.8042927980422974, + 0.7061425447463989, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1656421273946762, + 0.011028534732758999, + 0.4124082028865814, + 0.09209282696247101, + -0.7644954919815063, + 1.0257295370101929, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.07614587247371674, + 0.08977587521076202, + 0.11321776360273361, + 1.4226646423339844, + 0.3989226520061493, + 1.375699520111084, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0831696018576622, + 0.09024359285831451, + 0.1148906722664833, + 1.171791672706604, + 0.41162174940109253, + 1.2048040628433228, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q01": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.27464040846824644, + -0.18900329589843756, + 0.201951139831543, + -3.043574823951721, + -0.10428299293518073, + -2.8563359033584597, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.025380454158782872, + -0.2022279738187791, + 0.18923787055015562, + -2.8437695333480835, + -1.4884562452316283, + -2.797273115158081, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "q99": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1306754380226136, + 0.25287380361557, + 0.7382136569499971, + 3.0272380673408508, + 1.493233833885193, + 2.9292208494186402, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.41612847385406515, + 0.23796629579067208, + 0.7276956573724747, + 2.9543535894393917, + 0.22295816173553473, + 2.925450050354004, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } + } +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_mecka/unified_action_space.json b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_mecka/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_mecka/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_eva/norm_stats.json b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_eva/norm_stats.json new file mode 100644 index 0000000..1375600 --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_eva/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2164417803287506, + -0.0104580819606781, + 0.21470171213150024, + -1.9113050699234009, + -0.1933761090040207, + -1.4234869480133057, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.23465768992900848, + 0.027926092967391014, + 0.21325136721134186, + -1.9062485694885254, + 0.1409778594970703, + -1.5935752391815186, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.10017848014831543, + 0.10553289204835892, + 0.06925559788942337, + 0.4389428496360779, + 0.3652651607990265, + 0.400618314743042, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1057286411523819, + 0.11862988770008087, + 0.0838322713971138, + 0.4714084267616272, + 0.36273449659347534, + 0.46921059489250183, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.07111438088715077, + -0.2764020213007927, + 0.08954840897098183, + -2.873914425897598, + -1.2687851601600646, + -2.2832934657096864, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.07890571261048318, + -0.2747246411561966, + 0.08502333462312817, + -2.8750053367614745, + -0.6304698666334152, + -2.7695189712524413, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4792568555921316, + 0.2491615037560463, + 0.40273056274577973, + -1.1473007554531096, + 0.47531614527702315, + -0.10432972040176391, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5254945877596736, + 0.3248962529063225, + 0.46128720968291165, + -1.0906822261810305, + 1.2141797671318053, + -0.590554977893829, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.21758773922920227, + -0.010592794977128506, + 0.21552473306655884, + -1.9134125709533691, + -0.19465908408164978, + -1.421970009803772, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.23606525361537933, + 0.028307797387242317, + 0.2143336683511734, + -1.9075227975845337, + 0.142909437417984, + -1.593762755393982, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09978611767292023, + 0.10580997169017792, + 0.06933467835187912, + 0.4390905499458313, + 0.3667401373386383, + 0.4025161564350128, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.10500019788742065, + 0.11898990720510483, + 0.08402133733034134, + 0.4730278551578522, + 0.36428719758987427, + 0.47377777099609375, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.07066055307984354, + -0.27658275153636935, + 0.08954840897098183, + -2.8739228715896608, + -1.2699071294784545, + -2.2858256137371065, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.07865712431371213, + -0.2747246411561966, + 0.08502333462312817, + -2.875186069107056, + -0.6317541275024413, + -2.7746516216278074, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4792568555921316, + 0.2491615037560463, + 0.4029797132261097, + -1.1460501422882081, + 0.47699909925460826, + -0.10180401444435105, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5254945877596736, + 0.32510805823802946, + 0.46140897792726754, + -1.0844840503692628, + 1.2160476791381836, + -0.5818213861465455, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_eva/unified_action_space.json b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_eva/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_eva/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git a/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_human/norm_stats.json b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_human/norm_stats.json new file mode 100644 index 0000000..3968451 --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_human/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.12933999300003052, + 0.24063190817832947, + 0.4416622519493103, + -0.6944487690925598, + 0.45836564898490906, + 0.5358689427375793, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2502874433994293, + 0.23516084253787994, + 0.44360414147377014, + 0.6077548861503601, + -0.3730250298976898, + 0.5937881469726562, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08935471624135971, + 0.12952828407287598, + 0.12448161840438843, + 0.692352831363678, + 0.3486703932285309, + 0.47871237993240356, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09328444302082062, + 0.12007708102464676, + 0.11179827898740768, + 0.5902003049850464, + 0.3326391279697418, + 0.4485953748226166, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.40781200494766234, + -0.04547922207117083, + 0.07553541901111602, + -2.5019622619628907, + -0.2722730859756468, + -0.6120399420261382, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.00043503417968754343, + -0.020089824151992786, + 0.11202512446939944, + -0.9034745678424834, + -1.253897266817093, + -0.4536574764251706, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08629501163959497, + 0.5917687045812607, + 0.6719588408708572, + 1.1007870376586908, + 1.3654368005752566, + 1.868492502450943, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.46086201287508, + 0.5766027160167695, + 0.6505929843217135, + 1.9616211562633517, + 0.33306661038398744, + 1.7265954761505125, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.12846162915229797, + 0.24065281450748444, + 0.4385462999343872, + -0.6843387484550476, + 0.45870089530944824, + 0.5427051186561584, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.24914047122001648, + 0.2354695051908493, + 0.4400724470615387, + 0.5994752049446106, + -0.3723706305027008, + 0.6013513803482056, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.09751614928245544, + 0.13535769283771515, + 0.1366906315088272, + 0.7017932534217834, + 0.3501686751842499, + 0.5054476857185364, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.1045742928981781, + 0.12611989676952362, + 0.12571245431900024, + 0.5984635353088379, + 0.33506423234939575, + 0.4695108234882355, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.41811091079711815, + -0.07327920675277699, + 0.011085566711425798, + -2.519557163476944, + -0.27655053532123564, + -0.6710433414459227, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0602045078277591, + -0.040453712654113794, + 0.038514400863647325, + -1.017873287677765, + -1.2669479208946228, + -0.49134299960136385, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0946989654541035, + 0.5982611298561089, + 0.6756373184204101, + 1.2000885007381443, + 1.3711365784168246, + 2.3222655406951906, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4471913352966297, + 0.5886022707939151, + 0.6626308078765888, + 1.9515580302715305, + 0.3337616587638854, + 2.161416199684143, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_human/unified_action_space.json b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_human/unified_action_space.json new file mode 100644 index 0000000..79be3ed --- /dev/null +++ b/assets/egoscale_stage1_ego_cartesian_clean_rl2/egoverse_rl2_human/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "0b96a01712acfc71cdae8c5c23dd2b5d5ae7bcc7e9d5cb664ea2191426d691eb" +} diff --git a/docs/egoscale_staged_training.md b/docs/egoscale_staged_training.md index 90cb093..8ba9490 100644 --- a/docs/egoscale_staged_training.md +++ b/docs/egoscale_staged_training.md @@ -157,24 +157,46 @@ GPU、至少 512GB 主机内存,并保持默认的完整 checkpoint。当前 N `/mnt/workspace`;DLC 若使用不同挂载点,只需同步修改 `ATOM_RLDS_ROOT` 和 checkpoint 环境变量。 DLC 使用与 DSW 相同的镜像或把验证后的 DSW 环境制作成同地域 ACR 自定义镜像。DLC 的 -`WORLD_SIZE/RANK` 是节点级变量,当前 JAX 入口每个节点只启动一个 Python 进程: +`WORLD_SIZE/RANK` 是节点级变量,当前 JAX 入口每个节点只启动一个 Python 进程。 + +Stage 1 所需的六组全量 norm stats 已随仓库保存在 +`assets/egoscale_stage1_ego_cartesian_clean_rl2`。DLC 挂载 RLDS 与 base params 后,可先运行 +只读 preflight;它会检查六个 builder、对应 norm/mapping metadata 和初始化 checkpoint, +不会启动训练: + +```bash +cd /mnt/workspace/junhe/Atom-0 +PREFLIGHT_ONLY=1 WANDB_ENABLED=0 \ +bash scripts/run_egoscale_stage1_dlc_full.sh +``` + +正式 2 节点 × 8 卡训练使用 production wrapper。`WANDB_API_KEY` 必须通过 DLC Secret +注入环境,不要写进 JobSpec 或脚本: ```bash cd /mnt/workspace/junhe/Atom-0 -ATOM_RLDS_ROOT=/mnt/workspace/RLDS \ -ATOM_PI05_BASE_PARAMS=/mnt/workspace/cache/openpi/openpi-assets/checkpoints/pi05_base/params \ -ASSETS_BASE_DIR=$PWD/assets \ -CHECKPOINT_BASE_DIR=/mnt/workspace/Atom-0-checkpoints \ -STAGE=stage1_ego FSDP_DEVICES=8 BATCH_SIZE=512 NUM_TRAIN_STEPS=100000 \ -WANDB_ENABLED=1 RUN_ACTION_MSE=1 bash scripts/run_egoscale_stage.sh +EXP_NAME=stage1_ego_full_dlc_20260806_v1 \ +bash scripts/run_egoscale_stage1_dlc_full.sh ``` +该 wrapper 显式使用 100,000 steps、全局 batch 512、每 100 steps 记录、每 1,000 steps +验证、每 5,000 steps 保存完整训练状态,以及 50,000 条 encoded-image shuffle buffer。 +不要把通用 `run_egoscale_stage.sh` 的 smoke 默认值直接用于全量训练。 + 不要用 `torchrun --nproc_per_node=8` 包裹该命令;否则会在每个节点启动 8 个 JAX 进程, 与当前 node-level JAX distributed 和 `fsdp_devices=8` 冲突。 -大规模训练前先在 DLC 做 2 节点 × 8 卡、100 steps 测试,确认:两个节点均加入、各节点读取 -不同 split、只有 rank 0 创建 W&B run、checkpoint 能保存并恢复。 +大规模训练前先用独立实验名在 DLC 做 2 节点 × 8 卡、100 steps 测试: + +```bash +EXP_NAME=stage1_ego_dlc_2n8g_100step_preflight \ +NUM_TRAIN_STEPS=100 SAVE_INTERVAL=99 EVAL_INTERVAL=50 \ +bash scripts/run_egoscale_stage1_dlc_full.sh +``` + +确认两个节点均加入、各节点读取不同 split、只有 rank 0 创建 W&B run,并且 step 99 的完整 +checkpoint 能保存和恢复。全量任务必须使用新的 `EXP_NAME`;不得从 100-step 预检任务 resume。 -首次启动默认使用 `OVERWRITE=1`。中断后从同一个实验目录恢复时设置 `RESUME=1`(脚本会自动 -关闭 overwrite);不要同时设置 `RESUME=1 OVERWRITE=1`。后续阶段的 `PARAMS_PATH` 必须填写 -checkpoint 目录中真实存在的 `/params`,不要按总步数猜目录名。 +production wrapper 默认 `OVERWRITE=0`,不会删除同名目录。中断后从同一实验目录恢复时,保持 +所有训练参数和 `EXP_NAME` 不变并设置 `RESUME=1`。后续阶段的 `PARAMS_PATH` 必须填写 checkpoint +目录中真实存在的 `/params`,不要按总步数猜目录名。 diff --git a/scripts/run_egoscale_stage.sh b/scripts/run_egoscale_stage.sh index bc1dcd3..1796059 100755 --- a/scripts/run_egoscale_stage.sh +++ b/scripts/run_egoscale_stage.sh @@ -57,6 +57,11 @@ PREFLIGHT_ARGS=( PREFLIGHT_ARGS+=(--params-path "${INIT_PARAMS_PATH}") "${PYTHON_BIN}" "${REPO_DIR}/scripts/check_egoscale_setup.py" "${PREFLIGHT_ARGS[@]}" +if [[ "${PREFLIGHT_ONLY:-0}" == "1" ]]; then + echo "Preflight-only mode complete; training was not started." + exit 0 +fi + TRAIN_ARGS=( "${CONFIG_NAME}" --exp-name "${EXP_NAME:-${CONFIG_NAME}_smoke}" diff --git a/scripts/run_egoscale_stage1_dlc_full.sh b/scripts/run_egoscale_stage1_dlc_full.sh new file mode 100755 index 0000000..fdcfd7d --- /dev/null +++ b/scripts/run_egoscale_stage1_dlc_full.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Production Stage 1 profile for Alibaba PAI DLC. +# DLC must start exactly one process per node and provide WORLD_SIZE/RANK and +# MASTER_ADDR/MASTER_PORT for multi-node jobs. Do not wrap this script in torchrun. + +REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +export PYTHON_BIN="${PYTHON_BIN:-${REPO_DIR}/.venv/bin/python}" +export STAGE=stage1_ego +export ATOM_RLDS_ROOT="${ATOM_RLDS_ROOT:-/mnt/workspace/RLDS}" +export ATOM_PI05_BASE_PARAMS="${ATOM_PI05_BASE_PARAMS:-/mnt/workspace/cache/openpi/openpi-assets/checkpoints/pi05_base/params}" +export ASSETS_BASE_DIR="${ASSETS_BASE_DIR:-${REPO_DIR}/assets}" +export CHECKPOINT_BASE_DIR="${CHECKPOINT_BASE_DIR:-/mnt/workspace/junhe/checkpoints}" +export JAX_COMPILATION_CACHE_DIR="${JAX_COMPILATION_CACHE_DIR:-/mnt/workspace/junhe/cache/jax}" + +# The production recipe is a global batch of 512 on 2 nodes x 8 GPUs. The +# training entrypoint verifies divisibility against the actual global device count. +export FSDP_DEVICES="${FSDP_DEVICES:-8}" +export BATCH_SIZE="${BATCH_SIZE:-512}" +export NUM_TRAIN_STEPS="${NUM_TRAIN_STEPS:-100000}" +export LOG_INTERVAL="${LOG_INTERVAL:-100}" +export SAVE_INTERVAL="${SAVE_INTERVAL:-5000}" +export EVAL_INTERVAL="${EVAL_INTERVAL:-1000}" +export NUM_VAL_BATCHES="${NUM_VAL_BATCHES:-10}" +export NUM_ACTION_MSE_BATCHES="${NUM_ACTION_MSE_BATCHES:-2}" +export SHUFFLE_BUFFER_SIZE="${SHUFFLE_BUFFER_SIZE:-50000}" +export DATA_NUM_PARALLEL_READS="${DATA_NUM_PARALLEL_READS:--1}" +export DATA_NUM_PARALLEL_CALLS="${DATA_NUM_PARALLEL_CALLS:--1}" +export WANDB_ENABLED="${WANDB_ENABLED:-1}" +export RUN_ACTION_MSE="${RUN_ACTION_MSE:-1}" +export RESUME="${RESUME:-0}" +# Default to non-destructive initialization. A new experiment directory does not +# need --overwrite; resuming requires RESUME=1 and the same EXP_NAME. +export OVERWRITE="${OVERWRITE:-0}" + +if [[ "${CHECKPOINT_PARAMS_ONLY:-0}" == "1" ]]; then + echo "DLC full training requires complete optimizer checkpoints; CHECKPOINT_PARAMS_ONLY must be 0." >&2 + exit 2 +fi +export CHECKPOINT_PARAMS_ONLY=0 + +if [[ "${PREFLIGHT_ONLY:-0}" != "1" ]]; then + : "${EXP_NAME:?Set a unique EXP_NAME for a new run, or the existing name with RESUME=1}" +fi + +if (( ${WORLD_SIZE:-1} > 1 )); then + : "${RANK:?DLC must provide node-level RANK for multi-node training}" + : "${MASTER_ADDR:?DLC must provide MASTER_ADDR for multi-node training}" +fi + +echo "DLC Stage 1 profile: world_size=${WORLD_SIZE:-1} fsdp=${FSDP_DEVICES} global_batch=${BATCH_SIZE} steps=${NUM_TRAIN_STEPS}" +exec bash "${REPO_DIR}/scripts/run_egoscale_stage.sh" "$@" From 805aa5d0fdd6ddd8ba9dd24aa85b7a710ede634f Mon Sep 17 00:00:00 2001 From: junhe Date: Thu, 6 Aug 2026 15:36:00 +0800 Subject: [PATCH 56/64] Keep rerun stub link directory --- .gitignore | 6 ++++-- third_party/rerun-stub/dist/.gitkeep | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 third_party/rerun-stub/dist/.gitkeep diff --git a/.gitignore b/.gitignore index c422c18..fddaa47 100644 --- a/.gitignore +++ b/.gitignore @@ -169,5 +169,7 @@ cython_debug/ # new uv.lock Miniforge3-Linux-x86_64.sh -third_party/rerun-stub/ - +third_party/rerun-stub/* +!third_party/rerun-stub/dist/ +third_party/rerun-stub/dist/* +!third_party/rerun-stub/dist/.gitkeep diff --git a/third_party/rerun-stub/dist/.gitkeep b/third_party/rerun-stub/dist/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/third_party/rerun-stub/dist/.gitkeep @@ -0,0 +1 @@ + From d6e3ce018b2a3f2c87eb653e816ea198709a9096 Mon Sep 17 00:00:00 2001 From: junhe Date: Fri, 7 Aug 2026 15:07:32 +0800 Subject: [PATCH 57/64] feat: rebuild aligned stage2 dataset pipeline --- scripts/check_egoscale_setup.py | 27 +++- .../convert_self_collected_aligned_to_rlds.py | 128 +++++++++++++++--- src/openpi/cotrain/action_space.py | 12 +- src/openpi/cotrain/config.py | 11 +- tests/cotrain/test_action_space.py | 19 +-- tests/cotrain/test_unified_config.py | 3 +- 6 files changed, 155 insertions(+), 45 deletions(-) diff --git a/scripts/check_egoscale_setup.py b/scripts/check_egoscale_setup.py index 1eb6934..f9cd879 100755 --- a/scripts/check_egoscale_setup.py +++ b/scripts/check_egoscale_setup.py @@ -94,9 +94,8 @@ def main() -> int: "resampling": "uniform_full_window", "dataset_ids": sorted(dataset.uid for dataset in precomputed_datasets), } - else: + elif metadata.get("version") in (2, 3): expected = { - "version": 2, "model_action_horizon": config.model.action_horizon, "resampling": "uniform_full_window", "datasets": { @@ -107,8 +106,28 @@ def main() -> int: for dataset in sorted(precomputed_datasets, key=lambda item: item.uid) }, } - actual = {key: metadata.get(key) for key in expected} - if actual != expected: + else: + failures.append( + f"unsupported precomputed action metadata version at {metadata_path}: " + f"{metadata.get('version')!r}" + ) + expected = None + + actual = None + if expected is not None: + actual = {key: metadata.get(key) for key in expected} + if metadata.get("version") == 3 and isinstance(actual.get("datasets"), dict): + # Version 3 records additional physical-time, frame, and gripper + # semantics. Validate the training-critical v2 subset while + # preserving those provenance fields. + actual["datasets"] = { + uid: { + key: values.get(key) + for key in ("action_source", "source_action_horizon") + } + for uid, values in actual["datasets"].items() + } + if expected is not None and actual != expected: failures.append( f"precomputed action metadata mismatch at {metadata_path}: " f"expected {expected}, got {actual}" diff --git a/scripts/convert_self_collected_aligned_to_rlds.py b/scripts/convert_self_collected_aligned_to_rlds.py index c148813..c377d58 100644 --- a/scripts/convert_self_collected_aligned_to_rlds.py +++ b/scripts/convert_self_collected_aligned_to_rlds.py @@ -26,6 +26,7 @@ "aligned_hangzhou_human_right": 7, "aligned_hangzhou_robot_right": 7, "aligned_shenzhen_human_bimanual": 14, + "aligned_shenzhen_robot_bimanual": 14, } IMAGE_SHAPE = (480, 640, 3) SOURCE_HORIZON = 100 @@ -81,28 +82,42 @@ class _EpisodeArrays: poses: tuple[np.ndarray, ...] valid: np.ndarray horizon_seconds: float + action_timestamps: np.ndarray | None = None + action_state: np.ndarray | None = None + eef_frame: str = "fixed_head_color_optical_camera" + + def __post_init__(self) -> None: + if self.action_timestamps is None: + self.action_timestamps = self.timestamps + if self.action_state is None: + self.action_state = self.state def candidate_runs(self) -> list[np.ndarray]: candidates = [] for run in _runs(np.flatnonzero(self.valid)): if len(run) < 2: continue - last_time = self.timestamps[run[-1]] - keep = run[self.timestamps[run] + self.horizon_seconds <= last_time + 1e-9] + last_time = self.action_timestamps[run[-1]] + keep = run[ + self.action_timestamps[run] + self.horizon_seconds <= last_time + 1e-9 + ] if len(keep): candidates.extend(keep.tolist()) return _runs(np.asarray(candidates, dtype=np.int64)) def action_chunk(self, index: int) -> np.ndarray: - end_time = self.timestamps[index] + self.horizon_seconds - end = int(np.searchsorted(self.timestamps, end_time, side="left")) + end_time = self.action_timestamps[index] + self.horizon_seconds + end = int(np.searchsorted(self.action_timestamps, end_time, side="left")) segment = np.arange(index, min(end + 1, len(self.timestamps))) if len(segment) < 2 or not np.all(self.valid[segment]): raise ValueError(f"Action horizon crosses an invalid region at frame {index}") - target_times = np.linspace(self.timestamps[index], end_time, SOURCE_HORIZON) - values = self.state[segment] + target_times = np.linspace(self.action_timestamps[index], end_time, SOURCE_HORIZON) + values = self.action_state[segment] return np.stack( - [np.interp(target_times, self.timestamps[segment], values[:, dim]) for dim in range(values.shape[-1])], + [ + np.interp(target_times, self.action_timestamps[segment], values[:, dim]) + for dim in range(values.shape[-1]) + ], axis=-1, ).astype(np.float32) @@ -126,18 +141,16 @@ def _load_shenzhen_arrays(source: Path) -> _EpisodeArrays: timestamps = np.asarray(left["timestamps"], dtype=np.float64) left_pose = np.asarray(left["pose_cam_smooth"], dtype=np.float64) left_valid = np.asarray(left["valid_filled"], dtype=bool) - # Both closure estimates remain in native 14D for provenance only; the - # Shenzhen action mapping masks both gripper slots from training. - left_closure = np.nan_to_num( - np.asarray(left["closure_smooth"], dtype=np.float32), nan=0.0 - ) + left_closure = np.asarray(left["closure_calibrated"], dtype=np.float32) + left_valid &= np.asarray(left["aperture_calibration_valid"], dtype=bool) + left_valid &= np.isfinite(left_closure) with np.load(source / "right_hand" / "labels.npz") as right: right_timestamps = np.asarray(right["timestamps"], dtype=np.float64) right_pose = np.asarray(right["pose_cam_smooth"], dtype=np.float64) right_valid = np.asarray(right["valid_filled"], dtype=bool) - right_closure = np.nan_to_num( - np.asarray(right["closure_smooth"], dtype=np.float32), nan=0.0 - ) + right_closure = np.asarray(right["closure_calibrated"], dtype=np.float32) + right_valid &= np.asarray(right["aperture_calibration_valid"], dtype=bool) + right_valid &= np.isfinite(right_closure) if len(timestamps) != len(right_timestamps) or not np.allclose(timestamps, right_timestamps, atol=1e-4): raise ValueError(f"Left/right label timelines do not match: {source}") left_valid = _quality_valid(left_pose, left_valid) @@ -155,6 +168,61 @@ def _load_shenzhen_arrays(source: Path) -> _EpisodeArrays: return _EpisodeArrays(timestamps, state, (left_pose, right_pose), valid, 1.0) +def _piper_pose_vectors(poses: np.ndarray) -> np.ndarray: + """Convert Piper [xyz, rx, ry, rz] to canonical [xyz, yaw, pitch, roll].""" + euler_ypr = np.unwrap(poses[:, [5, 4, 3]], axis=0) + return np.concatenate((poses[:, :3], euler_ypr), axis=-1).astype(np.float32) + + +def _piper_closure(gripper_aperture_m: np.ndarray) -> np.ndarray: + return np.clip(1.0 - gripper_aperture_m / 0.1, 0.0, 1.0).astype(np.float32) + + +def _load_shenzhen_robot_arrays(source: Path) -> _EpisodeArrays: + import pyarrow.parquet as pq + + table = pq.read_table(source) + timestamps = np.asarray(table["real_observation_timestamp_s"].to_numpy(), dtype=np.float64) + action_timestamps = np.asarray(table["real_action_timestamp_s"].to_numpy(), dtype=np.float64) + observation_pose = np.asarray(table["observation.ee_pose"].to_pylist(), dtype=np.float64) + action_pose = np.asarray(table["action.ee_pose"].to_pylist(), dtype=np.float64) + observation_joints = np.asarray(table["observation.state"].to_pylist(), dtype=np.float64) + action_joints = np.asarray(table["action"].to_pylist(), dtype=np.float64) + frame_indices = np.asarray(table["frame_index"].to_numpy(), dtype=np.int64) + if not np.array_equal(frame_indices, np.arange(len(frame_indices))): + raise ValueError(f"Non-contiguous frame_index in {source}") + state = np.concatenate( + ( + _piper_pose_vectors(observation_pose[:, :6]), + _piper_closure(observation_joints[:, 6])[:, None], + _piper_pose_vectors(observation_pose[:, 6:]), + _piper_closure(observation_joints[:, 13])[:, None], + ), + axis=-1, + ) + action_state = np.concatenate( + ( + _piper_pose_vectors(action_pose[:, :6]), + _piper_closure(action_joints[:, 6])[:, None], + _piper_pose_vectors(action_pose[:, 6:]), + _piper_closure(action_joints[:, 13])[:, None], + ), + axis=-1, + ) + valid = np.all(np.isfinite(state), axis=-1) & np.all(np.isfinite(action_state), axis=-1) + valid &= np.isfinite(timestamps) & np.isfinite(action_timestamps) + return _EpisodeArrays( + timestamps, + state, + (), + valid, + 4.0, + action_timestamps=action_timestamps, + action_state=action_state, + eef_frame="piper_base", + ) + + def _read_mcap_images(source: Path, domain: str) -> dict[str, tuple[np.ndarray, list[bytes]]]: from rosbags.highlevel import AnyReader from rosbags.typesys import Stores, get_typestore @@ -292,7 +360,7 @@ def images_for(index: int) -> tuple[np.ndarray, np.ndarray, np.ndarray, bool, bo False, wrist_ok, ) - else: + elif config_name == "aligned_shenzhen_human_bimanual": arrays = _load_shenzhen_arrays(source) episode_metadata = json.loads((source / "episode_metadata.json").read_text(encoding="utf-8")) original = Path(episode_metadata["source_episode"]) @@ -306,6 +374,30 @@ def images_for(index: int) -> tuple[np.ndarray, np.ndarray, np.ndarray, bool, bo def images_for(index: int) -> tuple[np.ndarray, np.ndarray, np.ndarray, bool, bool, bool]: return video_frames["base"][index], video_frames["left"][index], video_frames["right"][index], True, True, True + else: + arrays = _load_shenzhen_robot_arrays(source) + task_root = source.parents[2] + chunk = source.parent.name + episode_name = source.stem + all_indices = [int(index) for run in arrays.candidate_runs() for index in run] + video_frames = { + "base": _video_frames( + task_root / "videos" / chunk / "observation.images.head" / f"{episode_name}.mp4", + all_indices, + ), + "left": _video_frames( + task_root / "videos" / chunk / "observation.images.left_wrist" / f"{episode_name}.mp4", + all_indices, + ), + "right": _video_frames( + task_root / "videos" / chunk / "observation.images.right_wrist" / f"{episode_name}.mp4", + all_indices, + ), + } + + def images_for(index: int) -> tuple[np.ndarray, np.ndarray, np.ndarray, bool, bool, bool]: + return video_frames["base"][index], video_frames["left"][index], video_frames["right"][index], True, True, True + for run_index, run in enumerate(arrays.candidate_runs()): for chunk_index, start in enumerate(range(0, len(run), 256)): chunk = run[start : start + 256] @@ -317,7 +409,7 @@ def images_for(index: int) -> tuple[np.ndarray, np.ndarray, np.ndarray, bool, bo "source_start_index": np.int64(chunk[0]), "source_end_index": np.int64(chunk[-1] + 1), "split_policy": "task-disjoint unseen; deterministic trajectory-disjoint seen", - "eef_frame": "fixed_head_color_optical_camera", + "eef_frame": arrays.eef_frame, }, "steps": self._steps(row, arrays, chunk, images_for), } @@ -338,7 +430,7 @@ def _steps(row: dict, arrays: _EpisodeArrays, indices: np.ndarray, images_for) - "image_mask_left_wrist": left_mask, "image_mask_right_wrist": right_mask, "prompt": row["prompt"], - "eef_frame": "fixed_head_color_optical_camera", + "eef_frame": arrays.eef_frame, "is_first": offset == 0, "is_last": offset == len(indices) - 1, "is_terminal": False, diff --git a/src/openpi/cotrain/action_space.py b/src/openpi/cotrain/action_space.py index d9a3b08..225a6d4 100644 --- a/src/openpi/cotrain/action_space.py +++ b/src/openpi/cotrain/action_space.py @@ -269,14 +269,6 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct + dims(13, RIGHT_GRIPPER, 1) ) _ALIGNED_SINGLE_RIGHT_MAPPING = dims(0, RIGHT_EEF_POSITION, 6) + dims(6, RIGHT_GRIPPER, 1) -# Shenzhen human gripper estimates did not pass the independent <=10 mm gate -# for a continuous action horizon. Preserve the native 14D source layout, but -# deliberately drop source slots 6 and 13; only bimanual 6-DoF pose is trained. -_ALIGNED_BIMANUAL_HUMAN_POSE_ONLY_MAPPING = ( - dims(0, LEFT_EEF_POSITION, 6) - + dims(7, RIGHT_EEF_POSITION, 6) -) - # EgoMimic does not provide the 14D pose+gripper contract above. Its public # human files contain camera-frame hand XYZ only, while its robot files contain # absolute ALOHA joint/gripper targets plus the corresponding camera-frame EEF @@ -322,7 +314,8 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct "aligned_parallel_gripper_robot": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), "aligned_hangzhou_human_right": _same(_ALIGNED_SINGLE_RIGHT_MAPPING), "aligned_hangzhou_robot_right": _same(_ALIGNED_SINGLE_RIGHT_MAPPING), - "aligned_shenzhen_human_bimanual": _same(_ALIGNED_BIMANUAL_HUMAN_POSE_ONLY_MAPPING), + "aligned_shenzhen_human_bimanual": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), + "aligned_shenzhen_robot_bimanual": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), "egomimic_bowlplace_human": _same(_EGOMIMIC_SINGLE_HUMAN_MAPPING), "egomimic_bowlplace_robot": _same( _EGOMIMIC_SINGLE_ROBOT_MAPPING, @@ -351,6 +344,7 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct "aligned_hangzhou_human_right", "aligned_hangzhou_robot_right", "aligned_shenzhen_human_bimanual", + "aligned_shenzhen_robot_bimanual", } diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 7153c4c..ee38751 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -734,7 +734,7 @@ def _make_self_collected_aligned_dataset( restructure_name="aligned_parallel_gripper", action_dim=action_dim, precomputed_action_chunk=True, - precomputed_action_source="fixed_head_rgbd_absolute_eef_plus_gripper", + precomputed_action_source="absolute_eef_ypr_plus_normalized_gripper", precomputed_action_horizon=100, ) @@ -742,8 +742,8 @@ def _make_self_collected_aligned_dataset( _SELF_COLLECTED_ALIGNED_DATA = CotrainDataConfig( rlds_data_dir=_SELF_COLLECTED_ALIGNED_ROOT, datasets=( - # Match the collection design: 80% human / 20% robot. Split the - # human share by task coverage (Hangzhou 15 tasks, Shenzhen 12). + # Match the collection design: 80% human / 20% robot. Within each + # domain, split by task coverage (Hangzhou 15 tasks, Shenzhen 12). _make_self_collected_aligned_dataset( "aligned_hangzhou_human_right", action_dim=7, weight=4 / 9 ), @@ -751,7 +751,10 @@ def _make_self_collected_aligned_dataset( "aligned_shenzhen_human_bimanual", action_dim=14, weight=16 / 45 ), _make_self_collected_aligned_dataset( - "aligned_hangzhou_robot_right", action_dim=7, weight=1 / 5 + "aligned_hangzhou_robot_right", action_dim=7, weight=1 / 9 + ), + _make_self_collected_aligned_dataset( + "aligned_shenzhen_robot_bimanual", action_dim=14, weight=4 / 45 ), ), ) diff --git a/tests/cotrain/test_action_space.py b/tests/cotrain/test_action_space.py index 940fc59..3cd5ef5 100644 --- a/tests/cotrain/test_action_space.py +++ b/tests/cotrain/test_action_space.py @@ -14,6 +14,7 @@ "aligned_hangzhou_human_right", "aligned_hangzhou_robot_right", "aligned_shenzhen_human_bimanual", + "aligned_shenzhen_robot_bimanual", "droid", "egoverse_aria", "egoverse_eva", @@ -70,13 +71,14 @@ def test_registry_covers_all_documented_builders() -> None: assert set(action_space.UNIFIED_ACTION_SPECS) == EXPECTED_DATASET_IDS - assert len(EXPECTED_DATASET_IDS) == 57 + assert len(EXPECTED_DATASET_IDS) == 58 assert action_space.OPTIONAL_ALIGNED_DATASET_IDS == { "aligned_parallel_gripper_human", "aligned_parallel_gripper_robot", "aligned_hangzhou_human_right", "aligned_hangzhou_robot_right", "aligned_shenzhen_human_bimanual", + "aligned_shenzhen_robot_bimanual", } @@ -112,6 +114,7 @@ def test_only_ego_and_aligned_play_map_eef_slots() -> None: "aligned_hangzhou_human_right", "aligned_hangzhou_robot_right", "aligned_shenzhen_human_bimanual", + "aligned_shenzhen_robot_bimanual", "egomimic_bowlplace_human", "egomimic_bowlplace_robot", "egomimic_groceries_human", @@ -123,7 +126,12 @@ def test_only_ego_and_aligned_play_map_eef_slots() -> None: @pytest.mark.parametrize( "dataset_id", - ["aligned_parallel_gripper_human", "aligned_parallel_gripper_robot"], + [ + "aligned_parallel_gripper_human", + "aligned_parallel_gripper_robot", + "aligned_shenzhen_human_bimanual", + "aligned_shenzhen_robot_bimanual", + ], ) def test_aligned_parallel_gripper_layout(dataset_id: str) -> None: spec = action_space.UNIFIED_ACTION_SPECS[dataset_id] @@ -153,13 +161,6 @@ def test_aligned_hangzhou_single_right_layout(dataset_id: str) -> None: assert sum(spec.action_mask) == 7 -def test_aligned_shenzhen_masks_both_unvalidated_human_grippers() -> None: - spec = action_space.UNIFIED_ACTION_SPECS["aligned_shenzhen_human_bimanual"] - assert sum(spec.action_mask) == 12 - assert not spec.action_mask[action_space.LEFT_GRIPPER] - assert not spec.action_mask[action_space.RIGHT_GRIPPER] - - def test_egomimic_single_arm_human_maps_only_real_xyz_labels() -> None: spec = action_space.UNIFIED_ACTION_SPECS["egomimic_bowlplace_human"] source = np.array([1.0, 2.0, 3.0], dtype=np.float32) diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index da9cf7b..a59b68d 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -292,9 +292,10 @@ def test_staged_configs_use_expected_data_and_strict_checkpoint_loader() -> None "aligned_hangzhou_human_right": 7, "aligned_shenzhen_human_bimanual": 14, "aligned_hangzhou_robot_right": 7, + "aligned_shenzhen_robot_bimanual": 14, } assert [dataset.weight for dataset in config._EGOSCALE_STAGE2_ALIGNED.data.datasets] == pytest.approx( - [4 / 9, 16 / 45, 1 / 5] + [4 / 9, 16 / 45, 1 / 9, 4 / 45] ) assert all(dataset.precomputed_action_chunk for dataset in config._EGOSCALE_STAGE2_ALIGNED.data.datasets) assert config._EGOSCALE_STAGE2_EGOMIMIC.data is config._EGOMIMIC_GROCERIES_DATA From 68bda99f26c4541118af4264b4d73b882749475b Mon Sep 17 00:00:00 2001 From: junhe Date: Mon, 10 Aug 2026 11:50:31 +0800 Subject: [PATCH 58/64] feat: unify stage2 aligned actions as relative SE3 --- scripts/check_egoscale_setup.py | 6 +- scripts/compute_cotrain_norm_stats_light.py | 99 +++++++- .../convert_self_collected_aligned_to_rlds.py | 221 +++++++++++++----- src/openpi/cotrain/action_space.py | 46 +++- src/openpi/cotrain/config.py | 8 +- src/openpi/cotrain/rlds_dataset.py | 21 +- tests/cotrain/test_action_space.py | 10 +- tests/cotrain/test_rlds_dataset.py | 8 +- .../test_self_collected_aligned_conversion.py | 92 ++++++++ tests/cotrain/test_unified_config.py | 10 + 10 files changed, 429 insertions(+), 92 deletions(-) create mode 100644 tests/cotrain/test_self_collected_aligned_conversion.py diff --git a/scripts/check_egoscale_setup.py b/scripts/check_egoscale_setup.py index f9cd879..10795eb 100755 --- a/scripts/check_egoscale_setup.py +++ b/scripts/check_egoscale_setup.py @@ -94,7 +94,7 @@ def main() -> int: "resampling": "uniform_full_window", "dataset_ids": sorted(dataset.uid for dataset in precomputed_datasets), } - elif metadata.get("version") in (2, 3): + elif metadata.get("version") in (2, 3, 4): expected = { "model_action_horizon": config.model.action_horizon, "resampling": "uniform_full_window", @@ -116,8 +116,8 @@ def main() -> int: actual = None if expected is not None: actual = {key: metadata.get(key) for key in expected} - if metadata.get("version") == 3 and isinstance(actual.get("datasets"), dict): - # Version 3 records additional physical-time, frame, and gripper + if metadata.get("version") in (3, 4) and isinstance(actual.get("datasets"), dict): + # Later versions record additional physical-time, frame, and gripper # semantics. Validate the training-critical v2 subset while # preserving those provenance fields. actual["datasets"] = { diff --git a/scripts/compute_cotrain_norm_stats_light.py b/scripts/compute_cotrain_norm_stats_light.py index d1ecedf..f69083b 100644 --- a/scripts/compute_cotrain_norm_stats_light.py +++ b/scripts/compute_cotrain_norm_stats_light.py @@ -244,6 +244,35 @@ def _update_stats(stats: dict, state: np.ndarray, actions: np.ndarray): stats["actions"].update(actions.reshape(-1, actions.shape[-1])) +def _update_shared_action_stats( + shared_stats: dict[int, normalize.RunningStats], + actions: np.ndarray, + action_mask: tuple[bool, ...], +) -> None: + flattened = actions.reshape(-1, actions.shape[-1]) + for slot in np.flatnonzero(np.asarray(action_mask, dtype=bool)): + shared_stats.setdefault(int(slot), normalize.RunningStats()).update( + flattened[:, slot : slot + 1] + ) + + +def _finalize_shared_action_stats( + shared_stats: dict[int, normalize.RunningStats], +) -> normalize.NormStats: + width = cotrain_action_space.UNIFIED_ACTION_DIM + mean = np.zeros(width, dtype=np.float64) + std = np.ones(width, dtype=np.float64) + q01 = -np.ones(width, dtype=np.float64) + q99 = np.ones(width, dtype=np.float64) + for slot, running in shared_stats.items(): + stats = running.get_statistics() + mean[slot] = np.asarray(stats.mean).item() + std[slot] = np.asarray(stats.std).item() + q01[slot] = np.asarray(stats.q01).item() + q99[slot] = np.asarray(stats.q99).item() + return normalize.NormStats(mean=mean, std=std, q01=q01, q99=q99) + + def _neutralize_inactive_stats(stats, mask: tuple[bool, ...]): mask = np.asarray(mask, dtype=bool) mean = np.asarray(stats.mean).copy() @@ -280,6 +309,7 @@ def _compute_light_stats( *, show_progress: bool = True, finite_train: bool = False, + shared_action_stats: dict[int, normalize.RunningStats] | None = None, ): batch_size = config.batch_size num_batches = max(1, max_frames // batch_size) @@ -300,6 +330,12 @@ def _compute_light_stats( for batch in iterator: state, actions = _state_actions_from_light_batch(batch, dataset_cfg) _update_stats(stats, state, actions) + if shared_action_stats is not None: + if dataset_cfg.unified_action_spec is None: + raise ValueError("Shared action stats require a unified action specification") + _update_shared_action_stats( + shared_action_stats, actions, dataset_cfg.unified_action_spec.action_mask + ) n_frames += int(state.shape[0]) return _finalize_stats(stats, dataset_cfg), n_frames @@ -398,6 +434,7 @@ def main( verify_frames: int = 1024, verify_tolerance: float = 1e-5, finite_train: bool = False, # noqa: FBT001, FBT002 + shared_action_stats: bool = False, # noqa: FBT001, FBT002 ) -> None: config = cotrain_config.get_config(config_name) config = dataclasses.replace(config, exp_name=exp_name) @@ -416,15 +453,21 @@ def main( selected = [ds for ds in data_config.datasets if dataset_id is None or ds.uid == dataset_id] if not selected: raise ValueError(f"No dataset matched dataset_id={dataset_id!r}") + if shared_action_stats and dataset_id is not None: + raise ValueError("Shared action stats must include every configured dataset; omit --dataset-id") + if shared_action_stats and any(ds.unified_action_spec is None for ds in selected): + raise ValueError("Shared action stats require unified action specs for every selected dataset") if verify_against_old: for ds in selected: _verify_against_old(config, data_config, ds, verify_frames, verify_tolerance) return + shared_running: dict[int, normalize.RunningStats] | None = {} if shared_action_stats else None + pending_shared: list[tuple[object, dict, int]] = [] for ds in selected: out_dir = config.assets_dirs / ds.uid - if not overwrite: + if not overwrite and not shared_action_stats: try: normalize.load(out_dir) print(f"\n=== Skipping '{ds.uid}': norm stats already exist at {out_dir} (use --overwrite to redo) ===") @@ -439,19 +482,54 @@ def main( ds, max_frames, finite_train=finite_train, + shared_action_stats=shared_running, ) if n_frames == 0: raise RuntimeError(f"No frames read for dataset '{ds.uid}' (split '{ds.train_split}').") print(f" accumulated {n_frames} frames") - normalize.save(out_dir, norm_stats) - if ds.unified_action_spec is not None: + if shared_action_stats: + pending_shared.append((ds, norm_stats, n_frames)) + else: + normalize.save(out_dir, norm_stats) + if ds.unified_action_spec is not None: + cotrain_action_space.write_metadata(out_dir, ds.unified_action_spec) + print(f"Saved norm stats for '{ds.uid}' to {out_dir}") + + if shared_action_stats: + assert shared_running is not None + shared_actions = _finalize_shared_action_stats(shared_running) + shared_ids = [ds.uid for ds, _, _ in pending_shared] + frame_counts = {ds.uid: n_frames for ds, _, n_frames in pending_shared} + for ds, norm_stats, n_frames in pending_shared: + out_dir = config.assets_dirs / ds.uid + norm_stats = dict(norm_stats) + norm_stats["actions"] = _neutralize_inactive_stats( + shared_actions, ds.unified_action_spec.action_mask + ) + normalize.save(out_dir, norm_stats) cotrain_action_space.write_metadata(out_dir, ds.unified_action_spec) - print(f"Saved norm stats for '{ds.uid}' to {out_dir}") + (out_dir / "norm_stats_meta.json").write_text( + json.dumps( + { + "version": 2, + "dataset_id": ds.uid, + "train_frames": n_frames, + "state_norm": "per_dataset", + "action_norm": "shared_by_unified_active_slot", + "shared_action_dataset_ids": shared_ids, + "shared_action_train_frames_by_dataset": frame_counts, + }, + indent=2, + sort_keys=True, + ) + + "\n" + ) + print(f"Saved per-dataset state/shared-action norm stats for '{ds.uid}' to {out_dir}") precomputed = [ds for ds in data_config.datasets if ds.precomputed_action_chunk] if precomputed: metadata = { - "version": 2, + "version": 4 if shared_action_stats else 2, "model_action_horizon": config.model.action_horizon, "resampling": "uniform_full_window", "datasets": { @@ -462,6 +540,17 @@ def main( for ds in sorted(precomputed, key=lambda item: item.uid) }, } + if shared_action_stats: + metadata.update( + { + "physical_horizon_seconds": 1.0, + "target_time_offsets_seconds": "0.02..1.00 inclusive at 0.02 intervals", + "action_frame": "current_canonical_eef", + "pose_encoding": "relative_se3_translation_xyz_plus_rotation_vector_xyz", + "gripper_encoding": "absolute_closure_0_open_1_closed", + "normalization": "per_dataset_state_shared_action_by_unified_active_slot", + } + ) metadata_path = config.assets_dirs / "action_chunk_metadata.json" metadata_path.parent.mkdir(parents=True, exist_ok=True) metadata_path.write_text(json.dumps(metadata, indent=2, sort_keys=True) + "\n") diff --git a/scripts/convert_self_collected_aligned_to_rlds.py b/scripts/convert_self_collected_aligned_to_rlds.py index c377d58..2e69ac7 100644 --- a/scripts/convert_self_collected_aligned_to_rlds.py +++ b/scripts/convert_self_collected_aligned_to_rlds.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 -"""Convert audited Hangzhou/Shenzhen visual labels into aligned Stage-2 RLDS. +"""Convert audited Hangzhou/Shenzhen labels into aligned Stage-2 RLDS. -The action frame is the fixed head/front color optical camera. Human chunks -cover one physical second; Piper robot chunks cover four seconds to compensate -for the slower embodiment. Both are sampled to 100 points over the full window -and are later uniformly resampled to pi0's 50-point horizon. +Every action uses the same physical contract: 50 targets spanning the next +one second, expressed as current-canonical-EEF relative SE(3). Each arm is +encoded as ``[translation_xyz, rotation_vector_xyz, absolute_closure]``. +Observation state remains an absolute pose in the station's native base/camera +frame and is only used as conditioning input. """ from __future__ import annotations @@ -18,7 +19,7 @@ import cv2 import numpy as np -from scipy.spatial.transform import Rotation +from scipy.spatial.transform import Rotation, Slerp import tensorflow_datasets as tfds @@ -29,7 +30,24 @@ "aligned_shenzhen_robot_bimanual": 14, } IMAGE_SHAPE = (480, 640, 3) -SOURCE_HORIZON = 100 +SOURCE_HORIZON = 50 +HORIZON_SECONDS = 1.0 +ACTION_EEF_FRAME = "current_canonical_eef" + +# Piper records ``link6`` poses. Match the Hangzhou robot-label convention by +# moving to the virtual gripper centre and applying the shared tool-axis basis. +PIPER_T_GRIPPER_CENTER_IN_EE = np.eye(4, dtype=np.float64) +PIPER_T_GRIPPER_CENTER_IN_EE[0, 3] = 0.07503 +PIPER_T_ALIGN = np.array( + [ + [0.0, 0.0, 1.0, 0.0], + [1.0, 0.0, 0.0, 0.0], + [0.0, 1.0, 0.0, 0.0], + [0.0, 0.0, 0.0, 1.0], + ], + dtype=np.float64, +) +PIPER_T_NATIVE_TO_CANONICAL = PIPER_T_GRIPPER_CENTER_IN_EE @ PIPER_T_ALIGN def _decode_jpeg(payload: bytes) -> np.ndarray: @@ -61,6 +79,38 @@ def _pose_vectors(poses: np.ndarray) -> np.ndarray: return np.concatenate((poses[:, :3, 3], euler_ypr), axis=-1).astype(np.float32) +def _piper_pose_matrices(poses: np.ndarray) -> np.ndarray: + """Decode Piper ``[xyz, rx, ry, rz]`` using its intrinsic XYZ RPY contract.""" + matrices = np.repeat(np.eye(4, dtype=np.float64)[None], len(poses), axis=0) + matrices[:, :3, :3] = Rotation.from_euler("xyz", poses[:, 3:6]).as_matrix() + matrices[:, :3, 3] = poses[:, :3] + return matrices + + +def _right_multiply_poses(poses: np.ndarray, transform: np.ndarray) -> np.ndarray: + return np.einsum("tij,jk->tik", poses, transform) + + +def _interpolate_poses(timestamps: np.ndarray, poses: np.ndarray, target_times: np.ndarray) -> np.ndarray: + if len(timestamps) < 2 or np.any(np.diff(timestamps) <= 0): + raise ValueError("Pose interpolation requires at least two strictly increasing timestamps") + if target_times[0] < timestamps[0] - 1e-9 or target_times[-1] > timestamps[-1] + 1e-9: + raise ValueError("Pose interpolation target is outside the source time range") + result = np.repeat(np.eye(4, dtype=np.float64)[None], len(target_times), axis=0) + result[:, :3, 3] = np.stack( + [np.interp(target_times, timestamps, poses[:, axis, 3]) for axis in range(3)], axis=-1 + ) + result[:, :3, :3] = Slerp(timestamps, Rotation.from_matrix(poses[:, :3, :3]))(target_times).as_matrix() + return result + + +def _relative_pose_vectors(current_pose: np.ndarray, target_poses: np.ndarray) -> np.ndarray: + relative = np.einsum("ij,tjk->tik", np.linalg.inv(current_pose), target_poses) + return np.concatenate( + (relative[:, :3, 3], Rotation.from_matrix(relative[:, :3, :3]).as_rotvec()), axis=-1 + ).astype(np.float32) + + def _quality_valid(poses: np.ndarray, valid: np.ndarray) -> np.ndarray: result = valid.copy() if len(poses) < 2: @@ -80,17 +130,34 @@ class _EpisodeArrays: timestamps: np.ndarray state: np.ndarray poses: tuple[np.ndarray, ...] + closures: tuple[np.ndarray, ...] valid: np.ndarray - horizon_seconds: float action_timestamps: np.ndarray | None = None - action_state: np.ndarray | None = None - eef_frame: str = "fixed_head_color_optical_camera" + action_poses: tuple[np.ndarray, ...] | None = None + action_closures: tuple[np.ndarray, ...] | None = None + state_eef_frame: str = "fixed_head_color_optical_camera" + action_eef_frame: str = ACTION_EEF_FRAME + horizon_seconds: float = HORIZON_SECONDS def __post_init__(self) -> None: if self.action_timestamps is None: self.action_timestamps = self.timestamps - if self.action_state is None: - self.action_state = self.state + if self.action_poses is None: + self.action_poses = self.poses + if self.action_closures is None: + self.action_closures = self.closures + if not (len(self.poses) == len(self.closures) == len(self.action_poses) == len(self.action_closures)): + raise ValueError("Observation/action arm counts do not match") + if len(self.timestamps) != len(self.state) or len(self.timestamps) != len(self.valid): + raise ValueError("Observation timeline/state/valid lengths do not match") + if np.any(np.diff(self.timestamps) <= 0) or np.any(np.diff(self.action_timestamps) <= 0): + raise ValueError("Observation and action timestamps must be strictly increasing") + for values in (*self.poses, *self.closures): + if len(values) != len(self.timestamps): + raise ValueError("Observation pose/closure length does not match timestamps") + for values in (*self.action_poses, *self.action_closures): + if len(values) != len(self.action_timestamps): + raise ValueError("Action pose/closure length does not match action timestamps") def candidate_runs(self) -> list[np.ndarray]: candidates = [] @@ -98,28 +165,54 @@ def candidate_runs(self) -> list[np.ndarray]: if len(run) < 2: continue last_time = self.action_timestamps[run[-1]] - keep = run[ - self.action_timestamps[run] + self.horizon_seconds <= last_time + 1e-9 - ] + keep = run[self.timestamps[run] + self.horizon_seconds <= last_time + 1e-9] if len(keep): candidates.extend(keep.tolist()) return _runs(np.asarray(candidates, dtype=np.int64)) def action_chunk(self, index: int) -> np.ndarray: - end_time = self.action_timestamps[index] + self.horizon_seconds + current_time = self.timestamps[index] + end_time = current_time + self.horizon_seconds + start = max(0, int(np.searchsorted(self.action_timestamps, current_time, side="right")) - 1) end = int(np.searchsorted(self.action_timestamps, end_time, side="left")) - segment = np.arange(index, min(end + 1, len(self.timestamps))) + segment = np.arange(start, min(end + 1, len(self.action_timestamps))) if len(segment) < 2 or not np.all(self.valid[segment]): raise ValueError(f"Action horizon crosses an invalid region at frame {index}") - target_times = np.linspace(self.action_timestamps[index], end_time, SOURCE_HORIZON) - values = self.action_state[segment] - return np.stack( - [ - np.interp(target_times, self.action_timestamps[segment], values[:, dim]) - for dim in range(values.shape[-1]) - ], - axis=-1, - ).astype(np.float32) + target_times = current_time + np.linspace( + self.horizon_seconds / SOURCE_HORIZON, self.horizon_seconds, SOURCE_HORIZON + ) + chunks = [] + for current_pose_series, current_closure, action_poses, action_closure in zip( + self.poses, + self.closures, + self.action_poses, + self.action_closures, + strict=True, + ): + interpolation_times = self.action_timestamps[segment] + interpolation_poses = action_poses[segment] + interpolation_closure = action_closure[segment] + # Robot action timestamps can start more than one 20 ms target step + # after the first observation. The observed current EEF is the + # physically correct left interpolation anchor; do not extrapolate + # backward from future commands. + if target_times[0] < interpolation_times[0]: + interpolation_times = np.concatenate(([current_time], interpolation_times)) + interpolation_poses = np.concatenate( + (current_pose_series[index][None], interpolation_poses), axis=0 + ) + interpolation_closure = np.concatenate( + ([current_closure[index]], interpolation_closure) + ) + targets = _interpolate_poses( + interpolation_times, interpolation_poses, target_times + ) + relative = _relative_pose_vectors(current_pose_series[index], targets) + closure = np.interp( + target_times, interpolation_times, interpolation_closure + ).astype(np.float32) + chunks.append(np.concatenate((relative, closure[:, None]), axis=-1)) + return np.concatenate(chunks, axis=-1).astype(np.float32) def _load_hangzhou_arrays(source: Path, domain: str) -> _EpisodeArrays: @@ -133,7 +226,7 @@ def _load_hangzhou_arrays(source: Path, domain: str) -> _EpisodeArrays: valid &= np.isfinite(closure) valid = _quality_valid(poses, valid) state = np.concatenate((_pose_vectors(poses), closure[:, None]), axis=-1) - return _EpisodeArrays(timestamps, state, (poses,), valid, 1.0 if domain == "human" else 4.0) + return _EpisodeArrays(timestamps, state, (poses,), (closure,), valid) def _load_shenzhen_arrays(source: Path) -> _EpisodeArrays: @@ -165,13 +258,9 @@ def _load_shenzhen_arrays(source: Path) -> _EpisodeArrays: ), axis=-1, ) - return _EpisodeArrays(timestamps, state, (left_pose, right_pose), valid, 1.0) - - -def _piper_pose_vectors(poses: np.ndarray) -> np.ndarray: - """Convert Piper [xyz, rx, ry, rz] to canonical [xyz, yaw, pitch, roll].""" - euler_ypr = np.unwrap(poses[:, [5, 4, 3]], axis=0) - return np.concatenate((poses[:, :3], euler_ypr), axis=-1).astype(np.float32) + return _EpisodeArrays( + timestamps, state, (left_pose, right_pose), (left_closure, right_closure), valid + ) def _piper_closure(gripper_aperture_m: np.ndarray) -> np.ndarray: @@ -191,35 +280,47 @@ def _load_shenzhen_robot_arrays(source: Path) -> _EpisodeArrays: frame_indices = np.asarray(table["frame_index"].to_numpy(), dtype=np.int64) if not np.array_equal(frame_indices, np.arange(len(frame_indices))): raise ValueError(f"Non-contiguous frame_index in {source}") - state = np.concatenate( - ( - _piper_pose_vectors(observation_pose[:, :6]), - _piper_closure(observation_joints[:, 6])[:, None], - _piper_pose_vectors(observation_pose[:, 6:]), - _piper_closure(observation_joints[:, 13])[:, None], - ), - axis=-1, + observation_poses = tuple( + _right_multiply_poses(_piper_pose_matrices(raw), PIPER_T_NATIVE_TO_CANONICAL) + for raw in (observation_pose[:, :6], observation_pose[:, 6:]) + ) + action_poses = tuple( + _right_multiply_poses(_piper_pose_matrices(raw), PIPER_T_NATIVE_TO_CANONICAL) + for raw in (action_pose[:, :6], action_pose[:, 6:]) + ) + observation_closures = ( + _piper_closure(observation_joints[:, 6]), + _piper_closure(observation_joints[:, 13]), ) - action_state = np.concatenate( + action_closures = ( + _piper_closure(action_joints[:, 6]), + _piper_closure(action_joints[:, 13]), + ) + state = np.concatenate( ( - _piper_pose_vectors(action_pose[:, :6]), - _piper_closure(action_joints[:, 6])[:, None], - _piper_pose_vectors(action_pose[:, 6:]), - _piper_closure(action_joints[:, 13])[:, None], + _pose_vectors(observation_poses[0]), + observation_closures[0][:, None], + _pose_vectors(observation_poses[1]), + observation_closures[1][:, None], ), axis=-1, ) - valid = np.all(np.isfinite(state), axis=-1) & np.all(np.isfinite(action_state), axis=-1) + valid = np.all(np.isfinite(state), axis=-1) + for values in action_poses: + valid &= np.all(np.isfinite(values), axis=(1, 2)) + for values in action_closures: + valid &= np.isfinite(values) valid &= np.isfinite(timestamps) & np.isfinite(action_timestamps) return _EpisodeArrays( timestamps, state, - (), + observation_poses, + observation_closures, valid, - 4.0, action_timestamps=action_timestamps, - action_state=action_state, - eef_frame="piper_base", + action_poses=action_poses, + action_closures=action_closures, + state_eef_frame="piper_base", ) @@ -277,13 +378,13 @@ def _video_frames(path: Path, indices: list[int]) -> dict[int, np.ndarray]: class _AlignedConfig(tfds.core.BuilderConfig): def __init__(self, *, name: str, manifest: Path, rows: list[dict]): - super().__init__(name=name, version="1.0.0", description=f"Atom aligned {name}") + super().__init__(name=name, version="2.0.0", description=f"Atom aligned {name}") self.manifest = manifest self.rows = rows class AtomAlignedRlds(tfds.core.GeneratorBasedBuilder): - VERSION = tfds.core.Version("1.0.0") + VERSION = tfds.core.Version("2.0.0") def _info(self) -> tfds.core.DatasetInfo: action_dim = CONFIG_DIMS[self.builder_config.name] @@ -309,7 +410,7 @@ def _info(self) -> tfds.core.DatasetInfo: ) return tfds.core.DatasetInfo( builder=self, - description="Self-collected human/robot aligned demonstrations with visual RGB-D 6-DoF labels.", + description="Self-collected demonstrations with one-second current-EEF relative SE(3) actions.", features=tfds.features.FeaturesDict( { "episode_metadata": tfds.features.FeaturesDict( @@ -320,6 +421,9 @@ def _info(self) -> tfds.core.DatasetInfo: "source_end_index": np.int64, "split_policy": tfds.features.Text(), "eef_frame": tfds.features.Text(), + "state_eef_frame": tfds.features.Text(), + "action_eef_frame": tfds.features.Text(), + "action_contract": tfds.features.Text(), } ), "steps": tfds.features.Dataset(step), @@ -409,7 +513,10 @@ def images_for(index: int) -> tuple[np.ndarray, np.ndarray, np.ndarray, bool, bo "source_start_index": np.int64(chunk[0]), "source_end_index": np.int64(chunk[-1] + 1), "split_policy": "task-disjoint unseen; deterministic trajectory-disjoint seen", - "eef_frame": arrays.eef_frame, + "eef_frame": arrays.action_eef_frame, + "state_eef_frame": arrays.state_eef_frame, + "action_eef_frame": arrays.action_eef_frame, + "action_contract": "relative_se3_translation_rotvec_plus_absolute_closure_1s_50", }, "steps": self._steps(row, arrays, chunk, images_for), } @@ -430,7 +537,7 @@ def _steps(row: dict, arrays: _EpisodeArrays, indices: np.ndarray, images_for) - "image_mask_left_wrist": left_mask, "image_mask_right_wrist": right_mask, "prompt": row["prompt"], - "eef_frame": arrays.eef_frame, + "eef_frame": arrays.action_eef_frame, "is_first": offset == 0, "is_last": offset == len(indices) - 1, "is_terminal": False, diff --git a/src/openpi/cotrain/action_space.py b/src/openpi/cotrain/action_space.py index 225a6d4..397c57d 100644 --- a/src/openpi/cotrain/action_space.py +++ b/src/openpi/cotrain/action_space.py @@ -232,8 +232,18 @@ def validate_metadata(directory: str | Path, spec: UnifiedActionSpec) -> None: raise ValueError(f"Unified norm stats mapping mismatch at {path}: expected {expected}, got {metadata}") -def _same(mapping: DimMapping, *, delta: tuple[int, ...] = ()) -> UnifiedActionSpec: - return UnifiedActionSpec(mapping, mapping, absolute_to_delta_slots=delta) +def _same( + mapping: DimMapping, + *, + delta: tuple[int, ...] = (), + already_delta: tuple[int, ...] = (), +) -> UnifiedActionSpec: + return UnifiedActionSpec( + mapping, + mapping, + absolute_to_delta_slots=delta, + already_delta_slots=already_delta, + ) def _dual_arm(arm_dof: int, *, left_source: int = 0, right_source: int | None = None) -> DimMapping: @@ -256,10 +266,11 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct ) # Canonical source layout for newly collected aligned human/robot play data: -# [left xyz, left yaw/pitch/roll, left gripper, -# right xyz, right yaw/pitch/roll, right gripper] -# EEF state/actions remain absolute xyz + yaw/pitch/roll, matching the project's -# final EgoVerse convention. Grippers are absolute in [0, 1]. +# [left relative xyz, left relative rotation-vector, left absolute gripper, +# right relative xyz, right relative rotation-vector, right absolute gripper] +# Historical EEF_EULER slot names are retained in the unified 80D layout, but +# these aligned action slots carry an SE(3) rotation vector and are already +# relative to the current canonical EEF. Observation state remains absolute. _ALIGNED_PARALLEL_GRIPPER_MAPPING = ( dims(0, LEFT_EEF_POSITION, 3) + dims(3, LEFT_EEF_EULER, 3) @@ -269,6 +280,13 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct + dims(13, RIGHT_GRIPPER, 1) ) _ALIGNED_SINGLE_RIGHT_MAPPING = dims(0, RIGHT_EEF_POSITION, 6) + dims(6, RIGHT_GRIPPER, 1) +_ALIGNED_BIMANUAL_RELATIVE_SLOTS = ( + slots(LEFT_EEF_POSITION, 3) + + slots(LEFT_EEF_EULER, 3) + + slots(RIGHT_EEF_POSITION, 3) + + slots(RIGHT_EEF_EULER, 3) +) +_ALIGNED_SINGLE_RIGHT_RELATIVE_SLOTS = slots(RIGHT_EEF_POSITION, 3) + slots(RIGHT_EEF_EULER, 3) # EgoMimic does not provide the 14D pose+gripper contract above. Its public # human files contain camera-frame hand XYZ only, while its robot files contain # absolute ALOHA joint/gripper targets plus the corresponding camera-frame EEF @@ -312,10 +330,18 @@ def _single_right(arm_dof: int, gripper_source: int | None = None) -> UnifiedAct "egoverse_rl2_human": _same(_EGO_MAPPING), "aligned_parallel_gripper_human": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), "aligned_parallel_gripper_robot": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), - "aligned_hangzhou_human_right": _same(_ALIGNED_SINGLE_RIGHT_MAPPING), - "aligned_hangzhou_robot_right": _same(_ALIGNED_SINGLE_RIGHT_MAPPING), - "aligned_shenzhen_human_bimanual": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), - "aligned_shenzhen_robot_bimanual": _same(_ALIGNED_PARALLEL_GRIPPER_MAPPING), + "aligned_hangzhou_human_right": _same( + _ALIGNED_SINGLE_RIGHT_MAPPING, already_delta=_ALIGNED_SINGLE_RIGHT_RELATIVE_SLOTS + ), + "aligned_hangzhou_robot_right": _same( + _ALIGNED_SINGLE_RIGHT_MAPPING, already_delta=_ALIGNED_SINGLE_RIGHT_RELATIVE_SLOTS + ), + "aligned_shenzhen_human_bimanual": _same( + _ALIGNED_PARALLEL_GRIPPER_MAPPING, already_delta=_ALIGNED_BIMANUAL_RELATIVE_SLOTS + ), + "aligned_shenzhen_robot_bimanual": _same( + _ALIGNED_PARALLEL_GRIPPER_MAPPING, already_delta=_ALIGNED_BIMANUAL_RELATIVE_SLOTS + ), "egomimic_bowlplace_human": _same(_EGOMIMIC_SINGLE_HUMAN_MAPPING), "egomimic_bowlplace_robot": _same( _EGOMIMIC_SINGLE_ROBOT_MAPPING, diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index ee38751..770cb48 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -726,16 +726,16 @@ def _make_self_collected_aligned_dataset( return CotrainRLDSDataset( name="atom_aligned_rlds", dataset_id=dataset_id, - version="1.0.0", - builder_dir=f"{_SELF_COLLECTED_ALIGNED_ROOT}/atom_aligned_rlds/{dataset_id}/1.0.0", + version="2.0.0", + builder_dir=f"{_SELF_COLLECTED_ALIGNED_ROOT}/atom_aligned_rlds/{dataset_id}/2.0.0", weight=weight, train_split="train", val_splits={"seen": "seen_test", "unseen": "unseen_test"}, restructure_name="aligned_parallel_gripper", action_dim=action_dim, precomputed_action_chunk=True, - precomputed_action_source="absolute_eef_ypr_plus_normalized_gripper", - precomputed_action_horizon=100, + precomputed_action_source="relative_eef_se3_translation_rotvec_plus_absolute_gripper", + precomputed_action_horizon=50, ) diff --git a/src/openpi/cotrain/rlds_dataset.py b/src/openpi/cotrain/rlds_dataset.py index 1f36e88..42b66c4 100644 --- a/src/openpi/cotrain/rlds_dataset.py +++ b/src/openpi/cotrain/rlds_dataset.py @@ -244,15 +244,15 @@ def _standardized_restructure(traj, dataset_name: str): def _aligned_parallel_gripper_restructure(traj, dataset_name: str): """Aligned human/robot play data with single- or dual-arm EEF+gripper targets. - This uses the same image/prompt fields as ``standardized`` and requires: + The Stage-2 self-collected builders use: - single right: [R xyz, R ypr, R grip] (7D) - bimanual: [L xyz, L ypr, L grip, R xyz, R ypr, R grip] (14D) + single right: [R relative xyz, R relative rotvec, R absolute grip] (7D) + bimanual: [L relative xyz, L relative rotvec, L absolute grip, + R relative xyz, R relative rotvec, R absolute grip] (14D) - EEF poses are kept in the source dataset's documented frame and are not - differenced, matching the project's final unified-action-space design. - Gripper values are absolute, normalized to 0=open and 1=closed. - ``eef_frame`` is a scalar episode string included in prompt metadata. + The pose delta is ``inv(T_current_canonical_eef) @ T_target_canonical_eef``. + Older ``aligned_parallel_gripper_*`` builders retain their absolute EEF + prompt mode. ``eef_frame`` is a scalar episode string included in metadata. """ import tensorflow as tf @@ -262,6 +262,7 @@ def _aligned_parallel_gripper_restructure(traj, dataset_name: str): traj.get("eef_frame", tf.constant("chunk_start_local")), field_name="eef_frame", ) + relative_eef = dataset_name.startswith(("aligned_hangzhou_", "aligned_shenzhen_")) return { "actions": traj["actions"], "state": traj["state"], @@ -276,7 +277,11 @@ def _aligned_parallel_gripper_restructure(traj, dataset_name: str): "right_wrist_0_rgb": traj["image_mask_right_wrist"], }, "prompt": traj["prompt"], - "prompt_prefix": _fill_action_prompt_prefix(n, "eef", eef_frame), + "prompt_prefix": _fill_action_prompt_prefix( + n, + "relative_eef_se3" if relative_eef else "eef", + eef_frame, + ), "dataset_id": tf.fill([n], dataset_name), } diff --git a/tests/cotrain/test_action_space.py b/tests/cotrain/test_action_space.py index 3cd5ef5..11c1a3c 100644 --- a/tests/cotrain/test_action_space.py +++ b/tests/cotrain/test_action_space.py @@ -90,7 +90,9 @@ def test_masks_are_80d_and_temporal_slots_are_mapped(dataset_id: str) -> None: assert sum(spec.action_mask) == len(spec.action_mapping) assert set(spec.absolute_to_delta_slots) <= set(spec.action_target_slots) assert set(spec.absolute_to_delta_slots) <= set(spec.state_target_slots) - assert not spec.already_delta_slots + assert set(spec.already_delta_slots) <= set(spec.action_target_slots) + relative_aligned = dataset_id.startswith(("aligned_hangzhou_", "aligned_shenzhen_")) + assert bool(spec.already_delta_slots) is relative_aligned def test_only_ego_and_aligned_play_map_eef_slots() -> None: @@ -144,6 +146,10 @@ def test_aligned_parallel_gripper_layout(dataset_id: str) -> None: ) assert mapped[action_space.RIGHT_GRIPPER] == source[13] assert not any(spec.delta_mask) + expected_relative = dataset_id.startswith("aligned_shenzhen_") + assert bool(spec.already_delta_slots) is expected_relative + if expected_relative: + assert len(spec.already_delta_slots) == 12 @pytest.mark.parametrize( @@ -159,6 +165,8 @@ def test_aligned_hangzhou_single_right_layout(dataset_id: str) -> None: ) assert mapped[action_space.RIGHT_GRIPPER] == source[6] assert sum(spec.action_mask) == 7 + assert len(spec.already_delta_slots) == 6 + assert not any(spec.delta_mask) def test_egomimic_single_arm_human_maps_only_real_xyz_labels() -> None: diff --git a/tests/cotrain/test_rlds_dataset.py b/tests/cotrain/test_rlds_dataset.py index cc136f9..56ad064 100644 --- a/tests/cotrain/test_rlds_dataset.py +++ b/tests/cotrain/test_rlds_dataset.py @@ -43,7 +43,7 @@ def test_aligned_restructure_accepts_per_step_constant_eef_frame() -> None: tf = pytest.importorskip("tensorflow") steps = 2 trajectory = { - "actions": tf.zeros([steps, 100, 7], tf.float32), + "actions": tf.zeros([steps, 50, 7], tf.float32), "state": tf.zeros([steps, 7], tf.float32), "image_base": tf.zeros([steps, 2, 2, 3], tf.uint8), "image_left_wrist": tf.zeros([steps, 2, 2, 3], tf.uint8), @@ -53,7 +53,7 @@ def test_aligned_restructure_accepts_per_step_constant_eef_frame() -> None: "image_mask_right_wrist": tf.ones([steps], tf.bool), "prompt": tf.constant(["task", "task"]), "eef_frame": tf.constant( - ["fixed_head_color_optical_camera", "fixed_head_color_optical_camera"] + ["current_canonical_eef", "current_canonical_eef"] ), } @@ -63,8 +63,8 @@ def test_aligned_restructure_accepts_per_step_constant_eef_frame() -> None: assert output["prompt_prefix"].shape == (steps,) assert output["prompt_prefix"].numpy().tolist() == [ - b"Action Mode: eef. EEF Frame: fixed_head_color_optical_camera. ", - b"Action Mode: eef. EEF Frame: fixed_head_color_optical_camera. ", + b"Action Mode: relative_eef_se3. EEF Frame: current_canonical_eef. ", + b"Action Mode: relative_eef_se3. EEF Frame: current_canonical_eef. ", ] diff --git a/tests/cotrain/test_self_collected_aligned_conversion.py b/tests/cotrain/test_self_collected_aligned_conversion.py new file mode 100644 index 0000000..2717e96 --- /dev/null +++ b/tests/cotrain/test_self_collected_aligned_conversion.py @@ -0,0 +1,92 @@ +from __future__ import annotations + +import numpy as np +from scipy.spatial.transform import Rotation + +from scripts import convert_self_collected_aligned_to_rlds as conversion + + +def _pose_trajectory(timestamps: np.ndarray) -> np.ndarray: + poses = np.repeat(np.eye(4, dtype=np.float64)[None], len(timestamps), axis=0) + poses[:, 0, 3] = timestamps + poses[:, :3, :3] = Rotation.from_euler("z", 0.2 * timestamps).as_matrix() + return poses + + +def _episode(poses: np.ndarray, timestamps: np.ndarray) -> conversion._EpisodeArrays: + closure = timestamps.astype(np.float32) / 2.0 + state = np.concatenate((conversion._pose_vectors(poses), closure[:, None]), axis=-1) + return conversion._EpisodeArrays( + timestamps=timestamps, + state=state, + poses=(poses,), + closures=(closure,), + valid=np.ones(len(timestamps), dtype=bool), + ) + + +def test_relative_action_chunk_spans_future_one_second_without_zero_target() -> None: + timestamps = np.linspace(0.0, 2.0, 101) + chunk = _episode(_pose_trajectory(timestamps), timestamps).action_chunk(0) + + assert chunk.shape == (50, 7) + np.testing.assert_allclose(chunk[0, :3], [0.02, 0.0, 0.0], atol=1e-6) + np.testing.assert_allclose(chunk[-1, :3], [1.0, 0.0, 0.0], atol=1e-6) + np.testing.assert_allclose(chunk[[0, -1], 3:6], [[0.0, 0.0, 0.004], [0.0, 0.0, 0.2]], atol=1e-6) + np.testing.assert_allclose(chunk[[0, -1], 6], [0.01, 0.5], atol=1e-6) + + +def test_relative_actions_are_invariant_to_station_extrinsic() -> None: + timestamps = np.linspace(0.0, 2.0, 101) + poses = _pose_trajectory(timestamps) + station_transform = np.eye(4) + station_transform[:3, :3] = Rotation.from_euler("xyz", [0.3, -0.2, 0.4]).as_matrix() + station_transform[:3, 3] = [1.2, -0.7, 0.5] + transformed = np.einsum("ij,tjk->tik", station_transform, poses) + + expected = _episode(poses, timestamps).action_chunk(25) + actual = _episode(transformed, timestamps).action_chunk(25) + np.testing.assert_allclose(actual, expected, atol=2e-6) + + +def test_current_observation_anchors_delayed_robot_action_timeline() -> None: + observation_times = np.linspace(0.0, 2.0, 101) + observation_poses = _pose_trajectory(observation_times) + action_times = observation_times + 0.04 + action_poses = _pose_trajectory(action_times) + observation_closure = observation_times.astype(np.float32) / 2.0 + action_closure = action_times.astype(np.float32) / 2.0 + state = np.concatenate( + (conversion._pose_vectors(observation_poses), observation_closure[:, None]), axis=-1 + ) + episode = conversion._EpisodeArrays( + timestamps=observation_times, + state=state, + poses=(observation_poses,), + closures=(observation_closure,), + valid=np.ones(len(observation_times), dtype=bool), + action_timestamps=action_times, + action_poses=(action_poses,), + action_closures=(action_closure,), + ) + + chunk = episode.action_chunk(0) + assert chunk.shape == (50, 7) + np.testing.assert_allclose(chunk[0, :3], [0.02, 0.0, 0.0], atol=1e-6) + np.testing.assert_allclose(chunk[-1, :3], [1.0, 0.0, 0.0], atol=1e-6) + + +def test_piper_native_tcp_is_moved_to_canonical_gripper_center() -> None: + raw = np.array( + [ + [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], + [1.0, 2.0, 3.0, 0.0, 0.0, np.pi / 2], + ] + ) + canonical = conversion._right_multiply_poses( + conversion._piper_pose_matrices(raw), conversion.PIPER_T_NATIVE_TO_CANONICAL + ) + + np.testing.assert_allclose(canonical[0, :3, 3], [0.07503, 0.0, 0.0], atol=1e-9) + np.testing.assert_allclose(canonical[1, :3, 3], [1.0, 2.07503, 3.0], atol=1e-9) + np.testing.assert_allclose(canonical[0, :3, :3], conversion.PIPER_T_ALIGN[:3, :3], atol=1e-9) diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index a59b68d..1aeb523 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -298,6 +298,16 @@ def test_staged_configs_use_expected_data_and_strict_checkpoint_loader() -> None [4 / 9, 16 / 45, 1 / 9, 4 / 45] ) assert all(dataset.precomputed_action_chunk for dataset in config._EGOSCALE_STAGE2_ALIGNED.data.datasets) + assert all(dataset.version == "2.0.0" for dataset in config._EGOSCALE_STAGE2_ALIGNED.data.datasets) + assert all( + dataset.precomputed_action_source + == "relative_eef_se3_translation_rotvec_plus_absolute_gripper" + for dataset in config._EGOSCALE_STAGE2_ALIGNED.data.datasets + ) + assert all( + dataset.precomputed_action_horizon == 50 + for dataset in config._EGOSCALE_STAGE2_ALIGNED.data.datasets + ) assert config._EGOSCALE_STAGE2_EGOMIMIC.data is config._EGOMIMIC_GROCERIES_DATA assert {dataset.uid for dataset in config._EGOSCALE_STAGE2_EGOMIMIC.data.datasets} == { "egomimic_groceries_human", From 9b0db701d3d87d9b7c6718122455785b92bdddb9 Mon Sep 17 00:00:00 2001 From: junhe Date: Wed, 12 Aug 2026 16:47:05 +0800 Subject: [PATCH 59/64] Fix Stage 3 Piper DLC fine-tuning --- docs/egoscale_staged_training.md | 2 +- scripts/preflight_cotrain_baige.py | 8 ++- scripts/run_egoscale_stage3_piper_dlc_full.sh | 57 +++++++++++++++++++ src/openpi/cotrain/config.py | 4 +- tests/cotrain/test_unified_config.py | 13 ++++- 5 files changed, 80 insertions(+), 4 deletions(-) create mode 100755 scripts/run_egoscale_stage3_piper_dlc_full.sh diff --git a/docs/egoscale_staged_training.md b/docs/egoscale_staged_training.md index 8ba9490..21f9dc3 100644 --- a/docs/egoscale_staged_training.md +++ b/docs/egoscale_staged_training.md @@ -7,7 +7,7 @@ | Stage 1 | `egoscale_stage1_ego` | EgoVerse 4 个干净 builder + EgoVerse-RL2 2 个 builder(暂不含 Scale) | 服务器 PaliGemma/Gemma NPZ 初始化视觉语言骨干,80D action stack 随机初始化 | | Stage 2 baseline | `egoscale_stage2_robot` | full-all 去掉全部 EgoVerse | Stage 1 严格 checkpoint | | Stage 2 aligned | `egoscale_stage2_aligned` | 新采 human/robot EEF+gripper | Stage 1 严格 checkpoint | -| Stage 3 | `egoscale_stage3_robot` | robot-only | aligned Stage 2 严格 checkpoint | +| Stage 3 | `egoscale_stage3_robot` | Piper30 + Piper2 | aligned Stage 2 严格 checkpoint 微调 | 后续阶段必须显式传 `--weight-loader.params-path`。加载器要求 checkpoint 与当前 80D 模型完全同构,任何 shape 或缺失参数都会在训练前失败,避免静默随机初始化。 diff --git a/scripts/preflight_cotrain_baige.py b/scripts/preflight_cotrain_baige.py index e5faa0d..d7f356d 100755 --- a/scripts/preflight_cotrain_baige.py +++ b/scripts/preflight_cotrain_baige.py @@ -54,6 +54,7 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: "cotrain_real_robot": 37, "cotrain_real_robot_fix": 34, "cotrain_full_all_full_norm": 39, + "egoscale_stage3_robot": 2, } expected_count = expected_counts[config_name] assert len(ids) == expected_count, (config_name, len(ids), expected_count) @@ -74,7 +75,11 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: for dataset in datasets: builder_dir = Path(dataset.builder_dir) assert (builder_dir / "dataset_info.json").is_file(), builder_dir - source_config = cfg.data.norm_stats_source_config or config_name + source_config = ( + cfg.data.norm_stats_source_config + or cfg.norm_stats_assets_name + or config_name + ) directory = assets_base / source_config / dataset.uid for filename in ("norm_stats.json", "norm_stats_meta.json", "unified_action_space.json"): assert (directory / filename).is_file(), directory / filename @@ -135,6 +140,7 @@ def main() -> None: "cotrain_real_robot", "cotrain_real_robot_fix", "cotrain_full_all_full_norm", + "egoscale_stage3_robot", ), ) parser.add_argument("--assets-base", type=Path, default=Path("assets")) diff --git a/scripts/run_egoscale_stage3_piper_dlc_full.sh b/scripts/run_egoscale_stage3_piper_dlc_full.sh new file mode 100755 index 0000000..9f69e77 --- /dev/null +++ b/scripts/run_egoscale_stage3_piper_dlc_full.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Alibaba PAI DLC profile for the Stage 3 Piper-only checkpoint fine-tune. +# DLC starts one Python process per node. Do not wrap this JAX command in torchrun. + +REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +export PYTHON_BIN="${PYTHON_BIN:-${REPO_DIR}/.venv/bin/python}" +export STAGE=stage3_robot +export ATOM_RLDS_ROOT="${ATOM_RLDS_ROOT:-/mnt/data/RLDS}" +export ASSETS_BASE_DIR="${ASSETS_BASE_DIR:-${REPO_DIR}/assets}" +export CHECKPOINT_BASE_DIR="${CHECKPOINT_BASE_DIR:-${REPO_DIR}/checkpoints}" +export JAX_COMPILATION_CACHE_DIR="${JAX_COMPILATION_CACHE_DIR:-/mnt/data/junhe/cache/jax}" + +# Stage 3 must initialize parameters from Stage 2 while creating a fresh optimizer +# and step counter. PARAMS_PATH must be the completed Stage 2 /params path. +: "${PARAMS_PATH:?Set PARAMS_PATH to the Stage 2 20000/params directory}" + +# Formal-training-1 recipe: Piper30 + Piper2, Unified80, one 8-GPU node. +export FSDP_DEVICES="${FSDP_DEVICES:-4}" +export BATCH_SIZE="${BATCH_SIZE:-512}" +export VAL_BATCH_SIZE="${VAL_BATCH_SIZE:-96}" +export NUM_TRAIN_STEPS="${NUM_TRAIN_STEPS:-20000}" +export LOG_INTERVAL="${LOG_INTERVAL:-100}" +export SAVE_INTERVAL="${SAVE_INTERVAL:-5000}" +export EVAL_INTERVAL="${EVAL_INTERVAL:-1000}" +export NUM_VAL_BATCHES="${NUM_VAL_BATCHES:-10}" +export NUM_ACTION_MSE_BATCHES="${NUM_ACTION_MSE_BATCHES:-2}" +export SHUFFLE_BUFFER_SIZE="${SHUFFLE_BUFFER_SIZE:-50000}" +export DATA_NUM_PARALLEL_READS="${DATA_NUM_PARALLEL_READS:-1}" +export DATA_NUM_PARALLEL_CALLS="${DATA_NUM_PARALLEL_CALLS:-2}" +export WANDB_ENABLED="${WANDB_ENABLED:-1}" +export RUN_ACTION_MSE="${RUN_ACTION_MSE:-1}" +export RESUME="${RESUME:-0}" +export OVERWRITE="${OVERWRITE:-0}" + +if [[ "${CHECKPOINT_PARAMS_ONLY:-0}" == "1" ]]; then + echo "DLC formal training requires full optimizer checkpoints; CHECKPOINT_PARAMS_ONLY must be 0." >&2 + exit 2 +fi +export CHECKPOINT_PARAMS_ONLY=0 + +if [[ "${PREFLIGHT_ONLY:-0}" != "1" ]]; then + : "${EXP_NAME:?Set a new EXP_NAME; do not reuse the Stage 2 experiment name}" +fi + +if (( ${WORLD_SIZE:-1} > 1 )); then + : "${RANK:?DLC must provide node-level RANK for multi-node training}" + : "${MASTER_ADDR:?DLC must provide MASTER_ADDR for multi-node training}" +fi + +echo "DLC Stage 3 Piper fine-tune: world_size=${WORLD_SIZE:-1} fsdp=${FSDP_DEVICES} global_batch=${BATCH_SIZE} steps=${NUM_TRAIN_STEPS}" +exec bash "${REPO_DIR}/scripts/run_egoscale_stage.sh" \ + --val-batch-size "${VAL_BATCH_SIZE}" \ + --val-flow-loss-mode fixed_seed \ + "$@" diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index 770cb48..bac2d94 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -1463,8 +1463,10 @@ def _strict_stage_checkpoint_loader() -> _weight_loaders.CheckpointWeightLoader: ) _EGOSCALE_STAGE3_ROBOT = dataclasses.replace( - _EGOSCALE_STAGE2_ROBOT, + _REAL_ONLY_UNIFIED80_ALIYUN_RECIPE, name="egoscale_stage3_robot", + weight_loader=_strict_stage_checkpoint_loader(), + norm_stats_assets_name="cotrain_real_only", ) _COTRAIN_CONFIGS = [ diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index 1aeb523..a5fbcd4 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -359,7 +359,18 @@ def test_staged_configs_use_expected_data_and_strict_checkpoint_loader() -> None dataset.precomputed_action_chunk for dataset in config._EGOSCALE_STAGE2_EGOMIMIC_ALL.data.datasets ) - assert config._EGOSCALE_STAGE3_ROBOT.data is config._ROBOT_ALL_DATA + assert config._EGOSCALE_STAGE3_ROBOT.data is config._REAL_ONLY_UNIFIED80_ALIYUN_RECIPE.data + assert {dataset.uid for dataset in config._EGOSCALE_STAGE3_ROBOT.data.datasets} == { + "piper30", + "piper2", + } + assert config._EGOSCALE_STAGE3_ROBOT.num_train_steps == 20_000 + assert config._EGOSCALE_STAGE3_ROBOT.lr_schedule.warmup_steps == 1_000 + assert config._EGOSCALE_STAGE3_ROBOT.lr_schedule.peak_lr == pytest.approx(2.5e-5) + assert config._EGOSCALE_STAGE3_ROBOT.lr_schedule.decay_steps == 30_000 + assert config._EGOSCALE_STAGE3_ROBOT.lr_schedule.decay_lr == pytest.approx(2.5e-6) + assert config._EGOSCALE_STAGE3_ROBOT.save_interval == 5_000 + assert config._EGOSCALE_STAGE3_ROBOT.norm_stats_assets_name == "cotrain_real_only" for staged in ( config._EGOSCALE_STAGE2_ROBOT, config._EGOSCALE_STAGE2_ALIGNED, From 7d22425d90ac829e07b41b0b18affe11db7c1e49 Mon Sep 17 00:00:00 2001 From: junhe Date: Wed, 12 Aug 2026 16:50:14 +0800 Subject: [PATCH 60/64] Allow relocated RLDS roots in preflight --- scripts/preflight_cotrain_baige.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/scripts/preflight_cotrain_baige.py b/scripts/preflight_cotrain_baige.py index d7f356d..c70630c 100755 --- a/scripts/preflight_cotrain_baige.py +++ b/scripts/preflight_cotrain_baige.py @@ -39,6 +39,18 @@ def resolve_init_params_path(path: Path) -> Path: ) +def builder_provenance_matches(recorded: Path, actual: Path) -> bool: + """Accept the same builder mounted below a different cloud RLDS root.""" + if recorded == actual: + return True + rlds_root = Path(os.environ.get("ATOM_RLDS_ROOT", "/mnt/data/RLDS")).resolve() + try: + relative_builder = actual.relative_to(rlds_root) + except ValueError: + return False + return recorded.as_posix().endswith(relative_builder.as_posix()) + + def validate(config_name: str, assets_base: Path, params_path: Path) -> None: params_path = resolve_init_params_path(params_path) cfg = config.get_config(config_name) @@ -90,7 +102,11 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: if not cfg.data.unified_action_space: stats = config.project_unified_norm_stats_to_native(stats, dataset.uid) meta = json.loads((directory / "norm_stats_meta.json").read_text()) - assert Path(meta["builder_dir"]) == builder_dir, (dataset.uid, meta["builder_dir"], builder_dir) + assert builder_provenance_matches(Path(meta["builder_dir"]), builder_dir), ( + dataset.uid, + meta["builder_dir"], + builder_dir, + ) assert meta["num_frames"] > 0, dataset.uid total_frames += int(meta["num_frames"]) From e8fa3a80cab0f7d36ee802871e24cec957c8738f Mon Sep 17 00:00:00 2001 From: junhe Date: Wed, 12 Aug 2026 17:56:29 +0800 Subject: [PATCH 61/64] Add robust DLC Stage 3 smoke entrypoint --- .../run_egoscale_stage3_piper_dlc_smoke.sh | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100755 scripts/run_egoscale_stage3_piper_dlc_smoke.sh diff --git a/scripts/run_egoscale_stage3_piper_dlc_smoke.sh b/scripts/run_egoscale_stage3_piper_dlc_smoke.sh new file mode 100755 index 0000000..c6fd972 --- /dev/null +++ b/scripts/run_egoscale_stage3_piper_dlc_smoke.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +DIAG_LOG="${STAGE3_DLC_LOG:-${REPO_DIR}/stage3_dlc_smoke.log}" +exec >>"${DIAG_LOG}" 2>&1 +trap 'rc=$?; echo "FAILED rc=${rc} line=${LINENO} command=${BASH_COMMAND}"; exit "${rc}"' ERR + +echo "===== Stage 3 DLC smoke $(date --iso-8601=seconds) =====" +cd "${REPO_DIR}" +echo "commit=$(git rev-parse HEAD)" +nvidia-smi -L + +if [[ ! -x .venv/bin/python ]]; then + echo "Venv missing; rebuilding it in the DLC container." + bash scripts/setup_aliyun_dsw_env.sh +fi + +.venv/bin/python - <<'PY' +import jax + +devices = jax.devices() +print("JAX devices:", devices, flush=True) +if len(devices) != 8: + raise RuntimeError(f"Expected 8 GPUs, got {len(devices)}: {devices}") +PY + +export ATOM_RLDS_ROOT="${ATOM_RLDS_ROOT:-/mnt/data/RLDS}" +export PARAMS_PATH="${PARAMS_PATH:-${REPO_DIR}/checkpoints/egoscale_stage2_aligned/stage2_aligned_relative_se3_baige_1x8_20260810_v1/20000/params}" +export CHECKPOINT_BASE_DIR="${CHECKPOINT_BASE_DIR:-${REPO_DIR}/checkpoints}" + +test -f "${PARAMS_PATH}/manifest.ocdbt" +test -f "${PARAMS_PATH}/_METADATA" + +: "${WANDB_API_KEY:?Inject WANDB_API_KEY through a DLC Secret environment variable}" +export WANDB_ENTITY="${WANDB_ENTITY:-junhentu-nanyang-technological-university-singapore}" +export WANDB_MODE="${WANDB_MODE:-online}" +export WANDB_ENABLED=1 + +export EXP_NAME="${EXP_NAME:-stage3_piper_from_stage2_20000_dlc_1x8_b512_smoke100_20260812_v4}" +export FSDP_DEVICES=4 +export BATCH_SIZE=512 +export VAL_BATCH_SIZE=96 +export NUM_TRAIN_STEPS=100 +export SAVE_INTERVAL=99 +export EVAL_INTERVAL=50 +export NUM_VAL_BATCHES=1 +export NUM_ACTION_MSE_BATCHES=1 +export RUN_ACTION_MSE=0 +export SHUFFLE_BUFFER_SIZE=1024 +export DATA_NUM_PARALLEL_READS=1 +export DATA_NUM_PARALLEL_CALLS=2 +export CHECKPOINT_PARAMS_ONLY=0 +export RESUME=0 +export OVERWRITE=0 + +echo "Launching ${EXP_NAME}" +exec bash scripts/run_egoscale_stage3_piper_dlc_full.sh From a70aeb589e2b85892e0b5281ce915e467aebf9c6 Mon Sep 17 00:00:00 2001 From: junhe Date: Wed, 12 Aug 2026 17:59:23 +0800 Subject: [PATCH 62/64] Mirror DLC smoke logs to console --- scripts/run_egoscale_stage3_piper_dlc_smoke.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/run_egoscale_stage3_piper_dlc_smoke.sh b/scripts/run_egoscale_stage3_piper_dlc_smoke.sh index c6fd972..c9ae912 100755 --- a/scripts/run_egoscale_stage3_piper_dlc_smoke.sh +++ b/scripts/run_egoscale_stage3_piper_dlc_smoke.sh @@ -3,7 +3,7 @@ set -Eeuo pipefail REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" DIAG_LOG="${STAGE3_DLC_LOG:-${REPO_DIR}/stage3_dlc_smoke.log}" -exec >>"${DIAG_LOG}" 2>&1 +exec > >(tee -a "${DIAG_LOG}") 2>&1 trap 'rc=$?; echo "FAILED rc=${rc} line=${LINENO} command=${BASH_COMMAND}"; exit "${rc}"' ERR echo "===== Stage 3 DLC smoke $(date --iso-8601=seconds) =====" From ebaf24fdac58171f382c86ae276a8daba8d7e925 Mon Sep 17 00:00:00 2001 From: junhe Date: Wed, 12 Aug 2026 18:29:49 +0800 Subject: [PATCH 63/64] Add robust DLC Stage 3 formal entrypoint --- .../run_egoscale_stage3_piper_dlc_train.sh | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 scripts/run_egoscale_stage3_piper_dlc_train.sh diff --git a/scripts/run_egoscale_stage3_piper_dlc_train.sh b/scripts/run_egoscale_stage3_piper_dlc_train.sh new file mode 100755 index 0000000..1d1f127 --- /dev/null +++ b/scripts/run_egoscale_stage3_piper_dlc_train.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +TRAIN_LOG="${STAGE3_DLC_LOG:-${REPO_DIR}/stage3_dlc_train.log}" +exec > >(tee -a "${TRAIN_LOG}") 2>&1 +trap 'rc=$?; echo "FAILED rc=${rc} line=${LINENO} command=${BASH_COMMAND}"; exit "${rc}"' ERR + +echo "===== Stage 3 DLC formal train $(date --iso-8601=seconds) =====" +cd "${REPO_DIR}" +echo "commit=$(git rev-parse HEAD)" +nvidia-smi -L + +if [[ ! -x .venv/bin/python ]]; then + echo "Venv missing; rebuilding it in the DLC container." + bash scripts/setup_aliyun_dsw_env.sh +fi + +.venv/bin/python - <<'PY' +import jax + +devices = jax.devices() +print("JAX devices:", devices, flush=True) +if len(devices) != 8: + raise RuntimeError(f"Expected 8 GPUs, got {len(devices)}: {devices}") +PY + +export ATOM_RLDS_ROOT="${ATOM_RLDS_ROOT:-/mnt/data/RLDS}" +export PARAMS_PATH="${PARAMS_PATH:-${REPO_DIR}/checkpoints/egoscale_stage2_aligned/stage2_aligned_relative_se3_baige_1x8_20260810_v1/20000/params}" +export CHECKPOINT_BASE_DIR="${CHECKPOINT_BASE_DIR:-${REPO_DIR}/checkpoints}" + +test -f "${PARAMS_PATH}/manifest.ocdbt" +test -f "${PARAMS_PATH}/_METADATA" + +: "${WANDB_API_KEY:?Inject WANDB_API_KEY through a DLC Secret environment variable}" +export WANDB_ENTITY="${WANDB_ENTITY:-junhentu-nanyang-technological-university-singapore}" +export WANDB_MODE="${WANDB_MODE:-online}" +export WANDB_ENABLED=1 + +# A formal run must never reuse the smoke experiment or its optimizer state. +export EXP_NAME="${EXP_NAME:-stage3_piper_from_stage2_20000_dlc_1x8_b512_20260812_v2}" +export FSDP_DEVICES=4 +export BATCH_SIZE=512 +export VAL_BATCH_SIZE=96 +export NUM_TRAIN_STEPS=20000 +export SAVE_INTERVAL=5000 +export EVAL_INTERVAL=1000 +export NUM_VAL_BATCHES=10 +export NUM_ACTION_MSE_BATCHES=2 +export RUN_ACTION_MSE=1 +export SHUFFLE_BUFFER_SIZE=50000 +export DATA_NUM_PARALLEL_READS=1 +export DATA_NUM_PARALLEL_CALLS=2 +export CHECKPOINT_PARAMS_ONLY=0 +export RESUME=0 +export OVERWRITE=0 + +EXPERIMENT_DIR="${CHECKPOINT_BASE_DIR}/egoscale_stage3_robot/${EXP_NAME}" +if [[ -e "${EXPERIMENT_DIR}" ]]; then + echo "Refusing to reuse existing formal experiment directory: ${EXPERIMENT_DIR}" >&2 + exit 2 +fi + +echo "Launching ${EXP_NAME}" +exec bash scripts/run_egoscale_stage3_piper_dlc_full.sh From 65a3ce81e2a9bb9e853d61ca52759789dd7e4ca3 Mon Sep 17 00:00:00 2001 From: junhe Date: Thu, 20 Aug 2026 19:06:00 +0800 Subject: [PATCH 64/64] Add staged Stage 3 and Stage 4 training configs --- .../action_chunk_metadata.json | 29 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 19 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 19 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 19 + .../unified_action_space.json | 5 + .../norm_stats.json | 664 ++++++++++++++++++ .../norm_stats_meta.json | 19 + .../unified_action_space.json | 5 + docs/egoscale_staged_training.md | 15 +- scripts/preflight_cotrain_baige.py | 12 +- scripts/run_egoscale_stage.sh | 2 + src/openpi/cotrain/config.py | 35 + tests/cotrain/test_unified_config.py | 38 + 18 files changed, 2881 insertions(+), 2 deletions(-) create mode 100644 assets/egoscale_stage2_self_collected_aligned/action_chunk_metadata.json create mode 100644 assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_human_right/norm_stats.json create mode 100644 assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_human_right/norm_stats_meta.json create mode 100644 assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_human_right/unified_action_space.json create mode 100644 assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_robot_right/norm_stats.json create mode 100644 assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_robot_right/norm_stats_meta.json create mode 100644 assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_robot_right/unified_action_space.json create mode 100644 assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_human_bimanual/norm_stats.json create mode 100644 assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_human_bimanual/norm_stats_meta.json create mode 100644 assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_human_bimanual/unified_action_space.json create mode 100644 assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_robot_bimanual/norm_stats.json create mode 100644 assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_robot_bimanual/norm_stats_meta.json create mode 100644 assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_robot_bimanual/unified_action_space.json diff --git a/assets/egoscale_stage2_self_collected_aligned/action_chunk_metadata.json b/assets/egoscale_stage2_self_collected_aligned/action_chunk_metadata.json new file mode 100644 index 0000000..513eb89 --- /dev/null +++ b/assets/egoscale_stage2_self_collected_aligned/action_chunk_metadata.json @@ -0,0 +1,29 @@ +{ + "action_frame": "current_canonical_eef", + "datasets": { + "aligned_hangzhou_human_right": { + "action_source": "relative_eef_se3_translation_rotvec_plus_absolute_gripper", + "source_action_horizon": 50 + }, + "aligned_hangzhou_robot_right": { + "action_source": "relative_eef_se3_translation_rotvec_plus_absolute_gripper", + "source_action_horizon": 50 + }, + "aligned_shenzhen_human_bimanual": { + "action_source": "relative_eef_se3_translation_rotvec_plus_absolute_gripper", + "source_action_horizon": 50 + }, + "aligned_shenzhen_robot_bimanual": { + "action_source": "relative_eef_se3_translation_rotvec_plus_absolute_gripper", + "source_action_horizon": 50 + } + }, + "gripper_encoding": "absolute_closure_0_open_1_closed", + "model_action_horizon": 50, + "normalization": "per_dataset_state_shared_action_by_unified_active_slot", + "physical_horizon_seconds": 1.0, + "pose_encoding": "relative_se3_translation_xyz_plus_rotation_vector_xyz", + "resampling": "uniform_full_window", + "target_time_offsets_seconds": "0.02..1.00 inclusive at 0.02 intervals", + "version": 4 +} diff --git a/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_human_right/norm_stats.json b/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_human_right/norm_stats.json new file mode 100644 index 0000000..729642c --- /dev/null +++ b/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_human_right/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.04772701859474182, + -0.027484094724059105, + 0.4073707163333893, + -1.3708199262619019, + -0.5684096217155457, + 2.298532485961914, + 0.0, + 0.0, + 0.0, + 0.4108084440231323, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.08056430518627167, + 0.032921433448791504, + 0.05660773068666458, + 1.478535532951355, + 0.3785008490085602, + 1.394388198852539, + 1.0, + 1.0, + 1.0, + 0.18889550864696503, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.09979915680885315, + -0.1208118818357587, + 0.27710762294530866, + -6.802695386600494, + -0.9454607655525208, + -3.2941735162734984, + -1.0, + -1.0, + -1.0, + 0.024, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.18746914806365966, + 0.04004142888933421, + 0.5225105694174766, + 4.403865003204347, + 0.8232634908676144, + 4.587789735507965, + 1.0, + 1.0, + 1.0, + 0.9880000000000001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0005168745410628617, + 0.0015924478648230433, + 0.002164255129173398, + 0.0014091331977397203, + -0.0030547294300049543, + 0.0029673920944333076, + 0.0, + 0.0, + 0.0, + 0.5390127301216125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.021473892033100128, + 0.02923824079334736, + 0.02860417775809765, + 0.12305063754320145, + 0.09236558526754379, + 0.08396059274673462, + 1.0, + 1.0, + 1.0, + 0.3480131924152374, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0680360094487667, + -0.09853469914197921, + -0.08442509250640869, + -0.35048141593933124, + -0.2836640691757202, + -0.2656443134784694, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.06770443831086159, + 0.0925940738916397, + 0.10119616718292235, + 0.427083967208862, + 0.26864766888618474, + 0.25838116617202767, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_human_right/norm_stats_meta.json b/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_human_right/norm_stats_meta.json new file mode 100644 index 0000000..b5f838e --- /dev/null +++ b/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_human_right/norm_stats_meta.json @@ -0,0 +1,19 @@ +{ + "action_norm": "shared_by_unified_active_slot", + "dataset_id": "aligned_hangzhou_human_right", + "shared_action_dataset_ids": [ + "aligned_hangzhou_human_right", + "aligned_shenzhen_human_bimanual", + "aligned_hangzhou_robot_right", + "aligned_shenzhen_robot_bimanual" + ], + "shared_action_train_frames_by_dataset": { + "aligned_hangzhou_human_right": 46426, + "aligned_hangzhou_robot_right": 17706, + "aligned_shenzhen_human_bimanual": 43471, + "aligned_shenzhen_robot_bimanual": 38380 + }, + "state_norm": "per_dataset", + "train_frames": 46426, + "version": 2 +} diff --git a/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_human_right/unified_action_space.json b/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_human_right/unified_action_space.json new file mode 100644 index 0000000..4c25085 --- /dev/null +++ b/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_human_right/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "6c8784e5ea15ba6ed42f14ed1d5066da3498ba6bb9fd9ddb5bb3531f3096b16e" +} diff --git a/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_robot_right/norm_stats.json b/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_robot_right/norm_stats.json new file mode 100644 index 0000000..115203b --- /dev/null +++ b/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_robot_right/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0763854905962944, + -0.034955210983753204, + 0.44513243436813354, + 2.414245843887329, + 0.47534802556037903, + -0.08713078498840332, + 0.0, + 0.0, + 0.0, + 0.2989233136177063, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.11682433634996414, + 0.05020182579755783, + 0.09741662442684174, + 0.6448267698287964, + 0.29118484258651733, + 0.5615286231040955, + 1.0, + 1.0, + 1.0, + 0.33227288722991943, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.1251919910311699, + -0.18278437212705612, + 0.2302037693977356, + 0.6112992504119873, + -0.3812687681674957, + -1.3662484539628028, + -1.0, + -1.0, + -1.0, + 0.0025944967865943907, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.26317213323712346, + 0.04026901828646662, + 0.573158506655693, + 3.7403096044540405, + 1.0258603947162628, + 0.8858128664731981, + 1.0, + 1.0, + 1.0, + 0.9918960791826248, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0005168745410628617, + 0.0015924478648230433, + 0.002164255129173398, + 0.0014091331977397203, + -0.0030547294300049543, + 0.0029673920944333076, + 0.0, + 0.0, + 0.0, + 0.5390127301216125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.021473892033100128, + 0.02923824079334736, + 0.02860417775809765, + 0.12305063754320145, + 0.09236558526754379, + 0.08396059274673462, + 1.0, + 1.0, + 1.0, + 0.3480131924152374, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0680360094487667, + -0.09853469914197921, + -0.08442509250640869, + -0.35048141593933124, + -0.2836640691757202, + -0.2656443134784694, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.06770443831086159, + 0.0925940738916397, + 0.10119616718292235, + 0.427083967208862, + 0.26864766888618474, + 0.25838116617202767, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_robot_right/norm_stats_meta.json b/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_robot_right/norm_stats_meta.json new file mode 100644 index 0000000..0688355 --- /dev/null +++ b/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_robot_right/norm_stats_meta.json @@ -0,0 +1,19 @@ +{ + "action_norm": "shared_by_unified_active_slot", + "dataset_id": "aligned_hangzhou_robot_right", + "shared_action_dataset_ids": [ + "aligned_hangzhou_human_right", + "aligned_shenzhen_human_bimanual", + "aligned_hangzhou_robot_right", + "aligned_shenzhen_robot_bimanual" + ], + "shared_action_train_frames_by_dataset": { + "aligned_hangzhou_human_right": 46426, + "aligned_hangzhou_robot_right": 17706, + "aligned_shenzhen_human_bimanual": 43471, + "aligned_shenzhen_robot_bimanual": 38380 + }, + "state_norm": "per_dataset", + "train_frames": 17706, + "version": 2 +} diff --git a/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_robot_right/unified_action_space.json b/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_robot_right/unified_action_space.json new file mode 100644 index 0000000..4c25085 --- /dev/null +++ b/assets/egoscale_stage2_self_collected_aligned/aligned_hangzhou_robot_right/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "6c8784e5ea15ba6ed42f14ed1d5066da3498ba6bb9fd9ddb5bb3531f3096b16e" +} diff --git a/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_human_bimanual/norm_stats.json b/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_human_bimanual/norm_stats.json new file mode 100644 index 0000000..a9eb926 --- /dev/null +++ b/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_human_bimanual/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.08149129152297974, + 0.031205302104353905, + 0.5018802881240845, + -2.423288106918335, + -0.4217444360256195, + 0.23025599122047424, + 0.0, + 0.0, + 0.0, + 0.6306188702583313, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1260407567024231, + 0.051268402487039566, + 0.5168296098709106, + -0.6372190117835999, + -0.35566186904907227, + 2.290114402770996, + 0.0, + 0.0, + 0.0, + 0.5068424344062805, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.04409920424222946, + 0.06398195773363113, + 0.06796959787607193, + 0.9641264081001282, + 0.31528440117836, + 0.34878256916999817, + 1.0, + 1.0, + 1.0, + 0.2853068709373474, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.054386332631111145, + 0.06693936884403229, + 0.054346658289432526, + 0.9667418003082275, + 0.2621683180332184, + 1.6607937812805176, + 1.0, + 1.0, + 1.0, + 0.3376900255680084, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.17958860237151386, + -0.10589541621208191, + 0.35756173493862153, + -5.564514849948883, + -1.009931216096878, + -0.28173026733398476, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.061422359228134146, + -0.1107434471398592, + 0.38827431951165203, + -4.319070265007019, + -0.8682094507217407, + -3.4505513811111452, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.027619799971580483, + 0.13712259278297423, + 0.672132810986042, + 2.3540000686645506, + 0.6408968575954437, + 1.4908114804744717, + 1.0, + 1.0, + 1.0, + 0.9882000000000001, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.20732704186439516, + 0.1499485088080168, + 0.6316818821907044, + 2.5721545613288885, + 0.6000244626998903, + 3.663807424545288, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0010765381157398224, + -0.0004962195525877178, + 0.00041657642577774823, + -0.0027519697323441505, + 0.0015751465689390898, + -0.003329648170620203, + 0.0, + 0.0, + 0.0, + 0.7505389451980591, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0005168745410628617, + 0.0015924478648230433, + 0.002164255129173398, + 0.0014091331977397203, + -0.0030547294300049543, + 0.0029673920944333076, + 0.0, + 0.0, + 0.0, + 0.5390127301216125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.025834443047642708, + 0.034900493919849396, + 0.034236982464790344, + 0.14448918402194977, + 0.08971908688545227, + 0.09599316865205765, + 1.0, + 1.0, + 1.0, + 0.2987584173679352, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.021473892033100128, + 0.02923824079334736, + 0.02860417775809765, + 0.12305063754320145, + 0.09236558526754379, + 0.08396059274673462, + 1.0, + 1.0, + 1.0, + 0.3480131924152374, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.08858595550060272, + -0.11524101165533066, + -0.09926413218975066, + -0.4447510935068131, + -0.2813325479507447, + -0.36630915203094494, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0680360094487667, + -0.09853469914197921, + -0.08442509250640869, + -0.35048141593933124, + -0.2836640691757202, + -0.2656443134784694, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0825064355134964, + 0.10687081228494644, + 0.11328908758759498, + 0.5389812388420105, + 0.28062369060516357, + 0.2829389832496645, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.06770443831086159, + 0.0925940738916397, + 0.10119616718292235, + 0.427083967208862, + 0.26864766888618474, + 0.25838116617202767, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_human_bimanual/norm_stats_meta.json b/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_human_bimanual/norm_stats_meta.json new file mode 100644 index 0000000..ebaddb4 --- /dev/null +++ b/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_human_bimanual/norm_stats_meta.json @@ -0,0 +1,19 @@ +{ + "action_norm": "shared_by_unified_active_slot", + "dataset_id": "aligned_shenzhen_human_bimanual", + "shared_action_dataset_ids": [ + "aligned_hangzhou_human_right", + "aligned_shenzhen_human_bimanual", + "aligned_hangzhou_robot_right", + "aligned_shenzhen_robot_bimanual" + ], + "shared_action_train_frames_by_dataset": { + "aligned_hangzhou_human_right": 46426, + "aligned_hangzhou_robot_right": 17706, + "aligned_shenzhen_human_bimanual": 43471, + "aligned_shenzhen_robot_bimanual": 38380 + }, + "state_norm": "per_dataset", + "train_frames": 43471, + "version": 2 +} diff --git a/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_human_bimanual/unified_action_space.json b/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_human_bimanual/unified_action_space.json new file mode 100644 index 0000000..d5ca03d --- /dev/null +++ b/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_human_bimanual/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9921eb689347852210dc792127f5b395146b9e85dc1bcaa10fa1ed55fbb869e5" +} diff --git a/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_robot_bimanual/norm_stats.json b/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_robot_bimanual/norm_stats.json new file mode 100644 index 0000000..8b4abf4 --- /dev/null +++ b/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_robot_bimanual/norm_stats.json @@ -0,0 +1,664 @@ +{ + "norm_stats": { + "state": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.23539705574512482, + -0.05204107239842415, + 0.2321033477783203, + 1.4823812246322632, + 0.1809314787387848, + -2.007082223892212, + 0.0, + 0.0, + 0.0, + 0.8834712505340576, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.22609539330005646, + 0.085231713950634, + 0.21371018886566162, + 1.712662935256958, + -0.17823533713817596, + -2.4008657932281494, + 0.0, + 0.0, + 0.0, + 0.84740149974823, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.12199165672063828, + 0.080263152718544, + 0.0731939822435379, + 0.17581583559513092, + 0.235862597823143, + 1.632733941078186, + 1.0, + 1.0, + 1.0, + 0.25873562693595886, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.12353440374135971, + 0.10102841258049011, + 0.07435078918933868, + 0.18985289335250854, + 0.304569274187088, + 0.5496923923492432, + 1.0, + 1.0, + 1.0, + 0.30603307485580444, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.026630076923407617, + -0.26035510135293005, + 0.1069361055791378, + 0.953197679400444, + -0.10397613348960877, + -3.373305220603943, + -1.0, + -1.0, + -1.0, + 0.008979995250701905, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + 0.04058266267552972, + -0.03627533200979233, + 0.09393872980773449, + 1.3351357639312744, + -1.219997201192379, + -3.266027463269234, + -1.0, + -1.0, + -1.0, + 0.004995978325605392, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.4361712695078924, + 0.08019910069704056, + 0.4031697407186031, + 1.754161243081093, + 0.9476984263658523, + 4.4019090377807615, + 1.0, + 1.0, + 1.0, + 0.9998009999990464, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.43278052514605225, + 0.34909820429831745, + 0.39053035313189033, + 2.2550515100479127, + 0.24955642898082742, + -1.4379324356198309, + 1.0, + 1.0, + 1.0, + 0.9998007999956607, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + }, + "actions": { + "mean": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.0010765381157398224, + -0.0004962195525877178, + 0.00041657642577774823, + -0.0027519697323441505, + 0.0015751465689390898, + -0.003329648170620203, + 0.0, + 0.0, + 0.0, + 0.7505389451980591, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0005168745410628617, + 0.0015924478648230433, + 0.002164255129173398, + 0.0014091331977397203, + -0.0030547294300049543, + 0.0029673920944333076, + 0.0, + 0.0, + 0.0, + 0.5390127301216125, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "std": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.025834443047642708, + 0.034900493919849396, + 0.034236982464790344, + 0.14448918402194977, + 0.08971908688545227, + 0.09599316865205765, + 1.0, + 1.0, + 1.0, + 0.2987584173679352, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.021473892033100128, + 0.02923824079334736, + 0.02860417775809765, + 0.12305063754320145, + 0.09236558526754379, + 0.08396059274673462, + 1.0, + 1.0, + 1.0, + 0.3480131924152374, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "q01": [ + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.08858595550060272, + -0.11524101165533066, + -0.09926413218975066, + -0.4447510935068131, + -0.2813325479507447, + -0.36630915203094494, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -0.0680360094487667, + -0.09853469914197921, + -0.08442509250640869, + -0.35048141593933124, + -0.2836640691757202, + -0.2656443134784694, + -1.0, + -1.0, + -1.0, + 0.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0, + -1.0 + ], + "q99": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0825064355134964, + 0.10687081228494644, + 0.11328908758759498, + 0.5389812388420105, + 0.28062369060516357, + 0.2829389832496645, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.06770443831086159, + 0.0925940738916397, + 0.10119616718292235, + 0.427083967208862, + 0.26864766888618474, + 0.25838116617202767, + 1.0, + 1.0, + 1.0, + 0.9998, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + } + } +} \ No newline at end of file diff --git a/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_robot_bimanual/norm_stats_meta.json b/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_robot_bimanual/norm_stats_meta.json new file mode 100644 index 0000000..dba18e8 --- /dev/null +++ b/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_robot_bimanual/norm_stats_meta.json @@ -0,0 +1,19 @@ +{ + "action_norm": "shared_by_unified_active_slot", + "dataset_id": "aligned_shenzhen_robot_bimanual", + "shared_action_dataset_ids": [ + "aligned_hangzhou_human_right", + "aligned_shenzhen_human_bimanual", + "aligned_hangzhou_robot_right", + "aligned_shenzhen_robot_bimanual" + ], + "shared_action_train_frames_by_dataset": { + "aligned_hangzhou_human_right": 46426, + "aligned_hangzhou_robot_right": 17706, + "aligned_shenzhen_human_bimanual": 43471, + "aligned_shenzhen_robot_bimanual": 38380 + }, + "state_norm": "per_dataset", + "train_frames": 38380, + "version": 2 +} diff --git a/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_robot_bimanual/unified_action_space.json b/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_robot_bimanual/unified_action_space.json new file mode 100644 index 0000000..d5ca03d --- /dev/null +++ b/assets/egoscale_stage2_self_collected_aligned/aligned_shenzhen_robot_bimanual/unified_action_space.json @@ -0,0 +1,5 @@ +{ + "version": 1, + "width": 80, + "fingerprint": "9921eb689347852210dc792127f5b395146b9e85dc1bcaa10fa1ed55fbb869e5" +} diff --git a/docs/egoscale_staged_training.md b/docs/egoscale_staged_training.md index 21f9dc3..b915830 100644 --- a/docs/egoscale_staged_training.md +++ b/docs/egoscale_staged_training.md @@ -7,11 +7,24 @@ | Stage 1 | `egoscale_stage1_ego` | EgoVerse 4 个干净 builder + EgoVerse-RL2 2 个 builder(暂不含 Scale) | 服务器 PaliGemma/Gemma NPZ 初始化视觉语言骨干,80D action stack 随机初始化 | | Stage 2 baseline | `egoscale_stage2_robot` | full-all 去掉全部 EgoVerse | Stage 1 严格 checkpoint | | Stage 2 aligned | `egoscale_stage2_aligned` | 新采 human/robot EEF+gripper | Stage 1 严格 checkpoint | -| Stage 3 | `egoscale_stage3_robot` | Piper30 + Piper2 | aligned Stage 2 严格 checkpoint 微调 | +| Stage 3 基线(训练1) | `egoscale_stage3_robot` | Piper30 + Piper2 | aligned Stage 2 严格 checkpoint 微调 | +| Stage 3 对比(方案二) | `egoscale_stage3_real_robot_fix` | 审计后的 34 个真机 Robot 数据集 | aligned Stage 2 严格 checkpoint | +| Stage 4(训练1微调) | `egoscale_stage4_piper_finetune` | Piper30 + Piper2 | Stage 3 对比实验严格 checkpoint | 后续阶段必须显式传 `--weight-loader.params-path`。加载器要求 checkpoint 与当前 80D 模型完全同构,任何 shape 或缺失参数都会在训练前失败,避免静默随机初始化。 +Stage 3 对比配置严格复现百度云指南“正式训练2”的训练配方:97,728 steps、 +5,000 warmup、`1e-6 -> 1e-7` cosine decay,并进行全参数训练。Stage 4 严格复现 +“正式训练1”的 Piper-only 配方:20,000 steps、1,000 warmup、 +`2.5e-5 -> 2.5e-6` cosine decay。两者只改变初始化来源:Stage 3 从 aligned +Stage 2 的 `/params` 初始化,Stage 4 从完成后的 Stage 3 `/params` +初始化;都必须使用新的 `EXP_NAME`,不能通过同名实验目录 resume 来代替阶段继承。 + +指南的“正式训练2”参数表写 save interval 10,000,但旧正式命令写 25,000;本实现按 +当前实验要求配置为 10,000。训练循环还会无条件保存最终 step 97,727,因此 Stage 4 +应以实际存在的最终 `/params` 路径为准,不要预先猜测为 97,728。 + ## NAS 路径 所有现有 builder 路径由一个环境变量控制: diff --git a/scripts/preflight_cotrain_baige.py b/scripts/preflight_cotrain_baige.py index c70630c..c6021f7 100755 --- a/scripts/preflight_cotrain_baige.py +++ b/scripts/preflight_cotrain_baige.py @@ -67,6 +67,8 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: "cotrain_real_robot_fix": 34, "cotrain_full_all_full_norm": 39, "egoscale_stage3_robot": 2, + "egoscale_stage3_real_robot_fix": 34, + "egoscale_stage4_piper_finetune": 2, } expected_count = expected_counts[config_name] assert len(ids) == expected_count, (config_name, len(ids), expected_count) @@ -76,7 +78,11 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: assert sum(dataset_id.startswith("egoverse_") for dataset_id in ids) == 5 else: assert not any(dataset_id.startswith("egoverse_") for dataset_id in ids) - if config_name in {"cotrain_real_robot_fix", "cotrain_full_all_full_norm"}: + if config_name in { + "cotrain_real_robot_fix", + "cotrain_full_all_full_norm", + "egoscale_stage3_real_robot_fix", + }: assert set(ids).isdisjoint(FIX_EXCLUDED_DATASET_IDS) if params_path.is_dir(): @@ -87,6 +93,8 @@ def validate(config_name: str, assets_base: Path, params_path: Path) -> None: for dataset in datasets: builder_dir = Path(dataset.builder_dir) assert (builder_dir / "dataset_info.json").is_file(), builder_dir + # Match CotrainTrainConfig.assets_dirs and CotrainDataConfig.create: + # a staged config may explicitly reuse a baseline's complete norm assets. source_config = ( cfg.data.norm_stats_source_config or cfg.norm_stats_assets_name @@ -157,6 +165,8 @@ def main() -> None: "cotrain_real_robot_fix", "cotrain_full_all_full_norm", "egoscale_stage3_robot", + "egoscale_stage3_real_robot_fix", + "egoscale_stage4_piper_finetune", ), ) parser.add_argument("--assets-base", type=Path, default=Path("assets")) diff --git a/scripts/run_egoscale_stage.sh b/scripts/run_egoscale_stage.sh index 1796059..f08467e 100755 --- a/scripts/run_egoscale_stage.sh +++ b/scripts/run_egoscale_stage.sh @@ -28,6 +28,8 @@ case "${STAGE}" in stage2_egomimic) CONFIG_NAME="egoscale_stage2_egomimic" ;; stage2_egomimic_all) CONFIG_NAME="egoscale_stage2_egomimic_all" ;; stage3_robot) CONFIG_NAME="egoscale_stage3_robot" ;; + stage3_real_robot_fix) CONFIG_NAME="egoscale_stage3_real_robot_fix" ;; + stage4_piper_finetune) CONFIG_NAME="egoscale_stage4_piper_finetune" ;; *) echo "Unknown STAGE=${STAGE}" >&2; exit 2 ;; esac diff --git a/src/openpi/cotrain/config.py b/src/openpi/cotrain/config.py index bac2d94..9d33788 100644 --- a/src/openpi/cotrain/config.py +++ b/src/openpi/cotrain/config.py @@ -1469,6 +1469,39 @@ def _strict_stage_checkpoint_loader() -> _weight_loaders.CheckpointWeightLoader: norm_stats_assets_name="cotrain_real_only", ) +# Comparison chain requested for the post-aligned stages. Keep these configs +# separate from ``egoscale_stage3_robot`` because that config already has +# checkpoints produced with the earlier 1x8 / 20k recipe. +# +# Stage 3 follows "formal training 2" from the Baidu guide: all 34 audited +# real-robot datasets, full-parameter training, and the guide's 97,728-step LR +# schedule. Use a 10,000-step save interval as requested, matching the guide's +# summary table (the old runnable command used 25,000). +_EGOSCALE_STAGE3_REAL_ROBOT_FIX = dataclasses.replace( + _REAL_ROBOT_FIX_PI05, + name="egoscale_stage3_real_robot_fix", + weight_loader=_strict_stage_checkpoint_loader(), + lr_schedule=_optimizer.CosineDecaySchedule( + warmup_steps=5_000, + peak_lr=1.0e-6, + decay_steps=97_728, + decay_lr=1.0e-7, + ), + num_train_steps=97_728, + save_interval=10_000, + norm_stats_assets_name="cotrain_real_robot_fix", +) + +# Stage 4 is the guide's "formal training 1" used as a downstream fine-tune: +# Piper30 + Piper2, Unified80, initialized strictly from the completed Stage 3 +# params rather than from the base PaliGemma NPZ. +_EGOSCALE_STAGE4_PIPER_FINETUNE = dataclasses.replace( + _REAL_ONLY_UNIFIED80_ALIYUN_RECIPE, + name="egoscale_stage4_piper_finetune", + weight_loader=_strict_stage_checkpoint_loader(), + norm_stats_assets_name="cotrain_real_only", +) + _COTRAIN_CONFIGS = [ _REAL_ONLY_PI05, _REAL_ONLY_LEGACY32_PI05, @@ -1484,6 +1517,8 @@ def _strict_stage_checkpoint_loader() -> _weight_loaders.CheckpointWeightLoader: _EGOSCALE_STAGE2_EGOMIMIC, _EGOSCALE_STAGE2_EGOMIMIC_ALL, _EGOSCALE_STAGE3_ROBOT, + _EGOSCALE_STAGE3_REAL_ROBOT_FIX, + _EGOSCALE_STAGE4_PIPER_FINETUNE, ] if len({c.name for c in _COTRAIN_CONFIGS}) != len(_COTRAIN_CONFIGS): diff --git a/tests/cotrain/test_unified_config.py b/tests/cotrain/test_unified_config.py index a5fbcd4..6af36d3 100644 --- a/tests/cotrain/test_unified_config.py +++ b/tests/cotrain/test_unified_config.py @@ -26,6 +26,8 @@ def test_registered_cotrain_configs_include_controlled_legacy32_ablation() -> No "egoscale_stage2_egomimic", "egoscale_stage2_egomimic_all", "egoscale_stage3_robot", + "egoscale_stage3_real_robot_fix", + "egoscale_stage4_piper_finetune", } for train_config in config._COTRAIN_CONFIGS: if train_config.name in { @@ -49,6 +51,8 @@ def test_fresh_start_configs_support_shape_safe_gemma_or_checkpoint_initializati "egoscale_stage2_egomimic", "egoscale_stage2_egomimic_all", "egoscale_stage3_robot", + "egoscale_stage3_real_robot_fix", + "egoscale_stage4_piper_finetune", } assert all( isinstance(train_config.weight_loader, weight_loaders.ShapeSafeCheckpointWeightLoader) @@ -377,10 +381,44 @@ def test_staged_configs_use_expected_data_and_strict_checkpoint_loader() -> None config._EGOSCALE_STAGE2_EGOMIMIC, config._EGOSCALE_STAGE2_EGOMIMIC_ALL, config._EGOSCALE_STAGE3_ROBOT, + config._EGOSCALE_STAGE3_REAL_ROBOT_FIX, + config._EGOSCALE_STAGE4_PIPER_FINETUNE, ): assert staged.weight_loader.__class__.__name__ == "CheckpointWeightLoader" +def test_stage3_formal_training_2_then_stage4_formal_training_1_contract() -> None: + stage3 = config.get_config("egoscale_stage3_real_robot_fix") + formal_training_2 = config.get_config("cotrain_real_robot_fix") + + assert stage3.data is formal_training_2.data + assert len(stage3.data.datasets) == 34 + assert stage3.model == formal_training_2.model + assert stage3.freeze_filter == formal_training_2.freeze_filter + assert stage3.norm_stats_assets_name == "cotrain_real_robot_fix" + assert stage3.num_train_steps == 97_728 + assert stage3.lr_schedule.warmup_steps == 5_000 + assert stage3.lr_schedule.peak_lr == pytest.approx(1.0e-6) + assert stage3.lr_schedule.decay_steps == 97_728 + assert stage3.lr_schedule.decay_lr == pytest.approx(1.0e-7) + assert stage3.save_interval == 10_000 + + stage4 = config.get_config("egoscale_stage4_piper_finetune") + formal_training_1 = config.get_config("cotrain_real_only_unified80_aliyun_recipe") + + assert stage4.data is formal_training_1.data + assert {dataset.uid for dataset in stage4.data.datasets} == {"piper30", "piper2"} + assert stage4.model == formal_training_1.model + assert stage4.freeze_filter == formal_training_1.freeze_filter + assert stage4.norm_stats_assets_name == "cotrain_real_only" + assert stage4.num_train_steps == 20_000 + assert stage4.lr_schedule.warmup_steps == 1_000 + assert stage4.lr_schedule.peak_lr == pytest.approx(2.5e-5) + assert stage4.lr_schedule.decay_steps == 30_000 + assert stage4.lr_schedule.decay_lr == pytest.approx(2.5e-6) + assert stage4.save_interval == 5_000 + + def test_stage2_freeze_filter_keeps_action_expert_and_vision_trainable() -> None: freeze = config._freeze_vlm_language_filter() assert freeze(("PaliGemma", "llm", "layers", "attn"), object())