TETHER โ€” SO-100 ์‹ค๋กœ๋ด‡ 4ํƒœ์Šคํฌ Continual Learning (DiT-Flow MT, vs. Experience Replay)

SO-100/SO-101 ํŒ”(so_follower)์˜ 4๊ฐœ ์กฐ์ž‘ ํƒœ์Šคํฌ๋ฅผ ์ˆœ์ฐจ๋กœ ํ•™์Šตํ•œ ์ฒดํฌํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค. ํƒœ์Šคํฌ๊ฐ€ ๋๋‚  ๋•Œ๋งˆ๋‹ค ์ €์žฅํ–ˆ์œผ๋ฏ€๋กœ, ๋ง๊ฐ์ด ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€๋ฅผ ์ฒดํฌํฌ์ธํŠธ ๋‹จ์œ„๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์•ˆ ๋ฐฉ๋ฒ• TETHER ์™€ Experience Replay ๊ธฐ์ค€์„ ์„ ์™„์ „ํžˆ ๊ฐ™์€ ์กฐ๊ฑด์—์„œ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• ๋””๋ ‰ํ„ฐ๋ฆฌ ์†์‹ค ๊ณผ๊ฑฐ ๋ณด์กด ๋ฐฉ์‹
Experience Replay (๊ธฐ์ค€์„ ) er/ L_FM(ํ˜„์žฌ) + L_FM(๋ฆฌํ”Œ๋ ˆ์ด) ๊ณผ๊ฑฐ ํƒœ์Šคํฌ๋‹น 5 ์—ํ”ผ์†Œ๋“œ๋ฅผ ๋ฒ„ํผ์— ์œ ์ง€
TETHER (์ œ์•ˆ) v4/ L_FM(ํ˜„์žฌ) + ฮป_aยทฮป_lvlยทL_anchor ๊ณผ๊ฑฐ ํƒœ์Šคํฌ์˜ (state, ์‹œ๊ฐํŠน์ง•) ์ฝ”๋“œ๋ถ์—์„œ ํ•ฉ์„ฑ ์ƒ˜ํ”Œ์„ ๋งŒ๋“ค์–ด teacher ์†๋„์žฅ์— ๋งž์ถค
TETHER + ๊ทธ๋ฆฌํผ ์ œ์™ธ v4_grip5/ ์œ„์™€ ๊ฐ™์Œ ์œ„์™€ ๊ฐ™์Œ. --pose_dims 5 ๋งŒ ๋‹ค๋ฆ„
TETHER + ์ฐจ๋ถ„ยท๊ทธ๋ฆฌํผ ์ œ์™ธ v4_diff5/ ์œ„์™€ ๊ฐ™์Œ ์œ„์™€ ๊ฐ™์Œ. --pose_dims 5 --speed_mode diff

๋’ค์˜ ๋‘ ๋Ÿฐ์€ ์•„๋ž˜ "์•Œ๋ ค์ง„ ํ•œ๊ณ„ 1" ์—์„œ ์ง€์ ํ•œ ๋ฒ„๊ทธ๋ฅผ ์‹ค์ œ๋กœ ๊ณ ์ณ ๋‹ค์‹œ ๋Œ๋ฆฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ตœ์ข… ํ‰๊ท ๊ณผ ๋ง๊ฐ ๋ชจ๋‘์—์„œ ๊ฐ€์žฅ ์ข‹์€ ๊ฒƒ์€ v4_diff5/ ์ž…๋‹ˆ๋‹ค โ€” "ablation" ์ ˆ์„ ๋ณด์„ธ์š”.

์ด๋ฆ„์— ๋Œ€ํ•˜์—ฌ: TETHER ๋Š” ์ด ๋ฐฉ๋ฒ•๋ก ์˜ ์ด๋ฆ„์ด๊ณ , ์ฝ”๋“œยทํŒŒ์ผ๋ช…์—๋Š” ๊ฐœ๋ฐœ ๋‹น์‹œ์˜ ๋‚ด๋ถ€ ์ด๋ฆ„์ธ v4(= L2_codebook ๊ณ„์—ด 4์ฐจ ๋ฒ„์ „)๊ฐ€ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ์†Œ์˜ v4/ ๋””๋ ‰ํ„ฐ๋ฆฌ, task_info.json ์˜ "method": "v4", policy_code/L2_V4.py, --sampler_mode/ --anchor_weight ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ชจ๋‘ TETHER ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ์ฒดํฌํฌ์ธํŠธ์™€์˜ ๋Œ€์กฐ๋ฅผ ์œ„ํ•ด ๊ทธ๋Œ€๋กœ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

ฮป_a = 1.0, ฮป_lvl = 3.0 โ†’ ์•ต์ปค์˜ ์‹คํšจ ๊ณ„์ˆ˜๋Š” 3.0์ž…๋‹ˆ๋‹ค. ์•ต์ปค๋Š” ๊ณผ๊ฑฐ ํƒœ์Šคํฌ๋งˆ๋‹ค ์ฆ‰์‹œ backward ํ•˜๋ฏ€๋กœ ๊ทธ๋ž˜๋””์–ธํŠธ๋Š” ๊ณผ๊ฑฐ์— ๋Œ€ํ•œ ํ•ฉ์ž…๋‹ˆ๋‹ค(ํ‰๊ท ์ด ์•„๋‹™๋‹ˆ๋‹ค).

๋จผ์ € ์ฝ์–ด์•ผ ํ•  ๊ฒƒ: ์ด ์‹คํ—˜์€ ์›๋ž˜ LIBERO ์„ค์ •์—์„œ ๊ฐœ๋ฐœ๋œ ๋ฐฉ๋ฒ•์„ ์‹ค๋กœ๋ด‡์œผ๋กœ ์˜ฎ๊ธด ๊ฒƒ์ด๊ณ , ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์—์„œ ์˜๋„์น˜ ์•Š๊ฒŒ ์˜๋ฏธ๊ฐ€ ๋ฐ”๋€ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ "clare ๋ณธ ์‹คํ—˜(LIBERO / LOTUS)์—์„œ ๋ฐ”๊พผ ๊ฒƒ" ์ ˆ๊ณผ "์•Œ๋ ค์ง„ ํ•œ๊ณ„ 1" ์„ ๊ฒฐ๊ณผ ํ‘œ๋ณด๋‹ค ๋จผ์ € ์ฝ์–ด ์ฃผ์„ธ์š”.


โš ๏ธ ์ด๋Œ€๋กœ๋Š” stock lerobot ์œผ๋กœ ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

config.json ์˜ "type": "ditflow_mt" ๋Š” ์—…์ŠคํŠธ๋ฆผ lerobot ์— ์—†๋Š” ์ปค์Šคํ…€ ์ •์ฑ…์ž…๋‹ˆ๋‹ค. ์ด ์ฒดํฌํฌ์ธํŠธ๋Š” lerobot ํฌํฌ(lerobot_lsy)์˜ DiTFlowMTPolicy ๋ฅผ ์ „์ œํ•ฉ๋‹ˆ๋‹ค.

from lerobot.policies.factory import make_policy   # stock lerobot
# ValueError: Policy type 'ditflow_mt' is not available.

ํ•ด๊ฒฐ: ํฌํฌ๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”. ์ฐธ๊ณ ์šฉ์œผ๋กœ policy_code/ ์— ์†Œ์Šค๋ฅผ ํ•จ๊ป˜ ๋„ฃ์–ด ๋‘์—ˆ์ง€๋งŒ, PreTrainedPolicy, Normalize/Unnormalize, AdamConfig ๋“ฑ lerobot ์ฝ”์–ด์— ์˜์กดํ•˜๋ฏ€๋กœ ๋‹จ๋…์œผ๋กœ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

git clone <ํฌํฌ ์ €์žฅ์†Œ>
pip install -e <ํฌํฌ ๊ฒฝ๋กœ>

policy_code/ ์— ๋“ค์–ด ์žˆ๋Š” ๊ฒƒ

ํŒŒ์ผ ์—ญํ• 
modeling_dit_flow_mt.py ์ •์ฑ… ๋ณธ์ฒด (DiTFlowMTPolicy, DiTFlowModel)
configuration_dit_flow_mt.py ditflow_mt ์„ค์ • ํด๋ž˜์Šค
asdl_data.py v3.0 ๋ฐ์ดํ„ฐ ๋กœ๋” + AsdlMeta โ€” ์•„๋ž˜ ๋กœ๋“œ ์ ˆ์—์„œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค
cl_train.py ์ด ์ฒดํฌํฌ์ธํŠธ๋“ค์„ ๋งŒ๋“  ํ•™์Šต ๋“œ๋ผ์ด๋ฒ„
L2_V4.py TETHER ์•Œ๊ณ ๋ฆฌ์ฆ˜ (์ฝ”๋“œ๋ถยท์•ต์ปคยท์†๋„ ๊ฐ€์ค‘). cl_train.py ๊ฐ€ import ํ•ฉ๋‹ˆ๋‹ค

policy_code/ ์˜ L2_V4.py ยท cl_train.py ๋Š” ablation ๋Ÿฐ๊นŒ์ง€ ๋ฐ˜์˜ํ•œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. --pose_dims ์™€ --speed_mode ์˜ ๊ธฐ๋ณธ๊ฐ’์ด ์›๋ž˜ ์ƒ์ˆ˜(6, abs)๋ผ, ์ด ์ฝ”๋“œ ํ•˜๋‚˜๋กœ ๋„ค ๋Ÿฐ์„ ๋ชจ๋‘ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” v4/ ๋Š” ํ”Œ๋ž˜๊ทธ ์—†์ด, v4_grip5/ ๋Š” --pose_dims 5, v4_diff5/ ๋Š” --pose_dims 5 --speed_mode diff ์ž…๋‹ˆ๋‹ค. ๊ฐ ํด๋”์˜ train_config.json ์— ์‹ค์ œ๋กœ ์“ด ์ธ์ž๊ฐ€ ์ „๋ถ€ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

โš ๏ธ modeling_dit_flow_mt.py ์˜ ์ฃผ์„์€ LIBERO ๊ธฐ์ค€์œผ๋กœ ์“ฐ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค(์ƒํƒœ 8์ฐจ์›, ์•ก์…˜ 7์ฐจ์›, 1์Šคํ… 0.05์ดˆ). ์ด ์ฒดํฌํฌ์ธํŠธ๋Š” ์ƒํƒœ 6 / ์•ก์…˜ 6 / 1์Šคํ… 1/30์ดˆ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์„ค์ •์—์„œ ์ฐจ์›์„ ์ฝ์œผ๋ฏ€๋กœ ๋™์ž‘์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, ์ฃผ์„์˜ ์ˆซ์ž๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฏฟ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.


๋กœ๋“œ

import sys; sys.path.insert(0, "<์ด ์ €์žฅ์†Œ๋ฅผ ๋ฐ›์€ ๊ฒฝ๋กœ>/policy_code")
from asdl_data import AsdlMeta                      # policy_code/asdl_data.py
from lerobot.configs.policies import PreTrainedConfig
from lerobot.policies.factory import make_policy

path = "<์ด ์ €์žฅ์†Œ๋ฅผ ๋ฐ›์€ ๊ฒฝ๋กœ>/v4_diff5/task_3"   # 4๊ฐœ ํƒœ์Šคํฌ๋ฅผ ๋ชจ๋‘ ๋ฐฐ์šด TETHER (๊ฐ€์ค‘ ์ˆ˜์ •๋ณธ)
# ์›๋ณธ ๋Ÿฐ์„ ์“ฐ๋ ค๋ฉด ".../v4/task_3" โ€” ๋‘ ํด๋”๋Š” ๊ตฌ์กฐ๊ฐ€ ๊ฐ™๋‹ค

cfg = PreTrainedConfig.from_pretrained(path)
cfg.pretrained_path = path
cfg.device = "cuda"                                 # config.json ์— "cuda" ๊ฐ€ ๋ฐ•ํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค
policy = make_policy(cfg=cfg, ds_meta=AsdlMeta("<ASDL ๋ฐ์ดํ„ฐ์…‹ ํ•˜๋‚˜์˜ ๊ฒฝ๋กœ>"))
policy.eval()

ds_meta ๋Š” feature ํ‘œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ •๊ทœํ™” ํ†ต๊ณ„๋Š” ์ฒดํฌํฌ์ธํŠธ ์•ˆ์— ๋“ค์–ด ์žˆ์–ด ๋กœ๋“œ ์‹œ ๋ฎ์–ด์”๋‹ˆ๋‹ค(์ •๊ทœํ™” ๋ฒ„ํผ ํ…์„œ 10๊ฐœ = normalize_inputs 6๊ฐœ [์ด๋ฏธ์ง€ mean/std ร—2 ์นด๋ฉ”๋ผ, ์ƒํƒœ min/max] + normalize_targets 2๊ฐœ + unnormalize_outputs 2๊ฐœ). ๋”ฐ๋ผ์„œ ํ†ต๊ณ„ ๋ชฉ์ ์œผ๋กœ ํ•™์Šต ๋ฐ์ดํ„ฐ์…‹์ด ํ•„์š”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

โš ๏ธ ํฌํฌ์˜ LeRobotDataset ์€ v2.1 ์ „์šฉ์ธ๋ฐ(CODEBASE_VERSION = "v2.1") ์ด ๋ฐ์ดํ„ฐ์…‹๋“ค์€ v3.0 ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ LeRobotDatasetMetadata ๋กœ๋Š” ๋ฉ”ํƒ€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๊ณ , ์œ„์ฒ˜๋Ÿผ policy_code/asdl_data.py ์˜ AsdlMeta ๋ฅผ ์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ v2.1 ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ๋Œ€์‹ ํ•˜๋ ค๋ฉด ์ƒํƒœยท์•ก์…˜์ด ๋ชจ๋‘ 6์ฐจ์›์ด์–ด์•ผ feature ํ‘œ๊ฐ€ ๋งž์Šต๋‹ˆ๋‹ค.

๊ฐ€์ค‘์น˜๋Š” ์ž๊ธฐ์™„๊ฒฐ์ ์ž…๋‹ˆ๋‹ค โ€” ๋™๊ฒฐ ๋ฐฑ๋ณธ์ธ DINOv2(86.6M)์™€ CLIP ํ…์ŠคํŠธ(63.2M)๋„ safetensors ์•ˆ์— ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค(ํ…์„œ 593๊ฐœ, 193.6M ํŒŒ๋ผ๋ฏธํ„ฐ). ํŒŒ์ผ์ด 774 MB ์ธ ์ด์œ ์ž…๋‹ˆ๋‹ค.

โš ๏ธ ๋‹ค๋งŒ ๋ชจ๋“ˆ์„ ๋งŒ๋“œ๋Š” ์‹œ์ ์—๋Š” ๋‘ ๋ ˆํฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ •์ฑ… __init__ ์ด CLIPTokenizer.from_pretrained("openai/clip-vit-base-patch32"), CLIPTextModel.from_pretrained(...), AutoModel.from_pretrained("facebook/dinov2-base") ๋ฅผ ํ˜ธ์ถœํ•œ ๋’ค ๊ทธ ์œ„์— ์ฒดํฌํฌ์ธํŠธ ๊ฐ€์ค‘์น˜๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ํ† ํฌ๋‚˜์ด์ €๋Š” ์ฒดํฌํฌ์ธํŠธ์— ์•„์˜ˆ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰ ์ฒซ ๋กœ๋“œ์—๋Š” ๋„คํŠธ์›Œํฌ(๋˜๋Š” ์ฑ„์›Œ์ง„ HF_HUB_CACHE)๊ฐ€ ํ•„์š”ํ•˜๊ณ , ํ•œ ๋ฒˆ ์บ์‹œ๋˜๋ฉด ์ดํ›„์—๋Š” HF_HUB_OFFLINE=1 ๋กœ ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "๊ฐ€์ค‘์น˜๋ฅผ ์•ˆ ๋ฐ›์•„๋„ ๋œ๋‹ค"๋Š” ๋œป์ด์ง€ "๋‘ ๋ ˆํฌ๊ฐ€ ํ•„์š” ์—†๋‹ค"๋Š” ๋œป์ด ์•„๋‹™๋‹ˆ๋‹ค.


โ˜… ์ „์ฒ˜๋ฆฌ ๊ทœ์•ฝ โ€” ์–ด๊ธ‹๋‚˜๋ฉด ์กฐ์šฉํžˆ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค

ํ•™์Šต ๋•Œ์™€ ์ •ํ™•ํžˆ ๊ฐ™์€ ์ „์ฒ˜๋ฆฌ๋ฅผ ์ถ”๋ก ์—์„œ๋„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€

์›๋ณธ 480ร—640 โ†’ 256ร—256. ํ•™์Šต ํŒŒ์ดํ”„๋ผ์ธ์ด ํ•œ ๊ทธ๋Œ€๋กœ๋ฅผ ์˜ฎ๊ธฐ๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค (asdl_data.py:187-190):

t = torch.from_numpy(im).permute(2, 0, 1)[None].float() / 255.0      # uint8 RGB -> [0,1]
t = F.interpolate(t, size=(256, 256), mode="bilinear",
                  align_corners=False).clamp(0, 1)                   # antialias ๊ธฐ๋ณธ๊ฐ’ False
frame = (t[0].permute(1, 2, 0) * 255).round().to(torch.uint8)        # uint8 ๋กœ ์–‘์žํ™”ํ•ด ์บ์‹œ
...
img = frame.permute(0, 3, 1, 2).float() / 255.0                      # ๋กœ๋“œ ์‹œ ๋‹ค์‹œ [0,1]

์—ฌ๊ธฐ์„œ ํ‹€๋ฆฌ๊ธฐ ์‰ฌ์šด ์„ธ ๊ฐ€์ง€:

  1. ์ข…ํšก๋น„๋ฅผ ๋งž์ถ”์ง€ ์•Š์Šต๋‹ˆ๋‹ค. letterbox ๋„ crop ๋„ ์•„๋‹ˆ๊ณ  480ร—640 ์„ ๊ทธ๋ƒฅ ์ •์‚ฌ๊ฐ์œผ๋กœ ์ฐŒ๊ทธ๋Ÿฌ๋œจ๋ฆฝ๋‹ˆ๋‹ค. (LIBERO ํŒŒ์ดํ”„๋ผ์ธ์˜ 256 ์ •์‚ฌ๊ฐ์— DINOv2 ์—ฐ์‚ฐ๋Ÿ‰์„ ๋งž์ถ”๋ ค๊ณ  ์ด๋ ‡๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค)
  2. antialias=False ์ž…๋‹ˆ๋‹ค. F.interpolate ์˜ ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋‹ค์šด์ƒ˜ํ”Œ๋ง์ธ๋ฐ๋„ ์•ˆํ‹ฐ์—์ผ๋ฆฌ์–ด์‹ฑ์„ ๋ˆ ์ƒํƒœ๋ผ, torchvision.transforms.Resize(๊ธฐ๋ณธ antialias=True), PIL, cv2.INTER_LINEAR ๋Š” ๋ชจ๋‘ ๋‹ค๋ฅธ ํ”ฝ์…€์„ ๋ƒ…๋‹ˆ๋‹ค. ์ถ”๋ก  ์ฝ”๋“œ๋ฅผ ์ƒˆ๋กœ ์“ฐ๋ฉด ๊ฑฐ์˜ ํ™•์‹คํžˆ ์—ฌ๊ธฐ์„œ ์–ด๊ธ‹๋‚ฉ๋‹ˆ๋‹ค.
  3. uint8 ๋กœ ํ•œ ๋ฒˆ ์–‘์žํ™”๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ์‚ฌ์ด์ฆˆ๋Š” float ์—์„œ ํ•˜๊ณ  round() ํ›„ uint8 ๋กœ ์บ์‹œํ•œ ๋’ค ๋‹ค์‹œ /255 ํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ์žฌํ˜„ํ•˜๋ ค๋ฉด ์ด ์™•๋ณต๊นŒ์ง€ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ’์€ [0,1] float ๋กœ ๋„ฃ์Šต๋‹ˆ๋‹ค. ImageNet mean/std ์ •๊ทœํ™”๋Š” ์ •์ฑ… ๋‚ด๋ถ€(normalize_inputs)๊ฐ€ ํ•ฉ๋‹ˆ๋‹ค. ์นด๋ฉ”๋ผ ํ‚ค๋Š” ๋‘ ๊ฐœ: observation.images.top, observation.images.wrist.

๊ด€์ธก / ํ–‰๋™

observation.state  (B, 2, 6)   # [t-1, t] ๋‘ ํ”„๋ ˆ์ž„
action             (B, 16, 6)  # ํ•™์Šต ์‹œ. ์ถ”๋ก ์€ generate_actions ๊ฐ€ 8๊ฐœ๋ฅผ ๋Œ๋ ค์คŒ

6์ฐจ์›์€ ๊ด€์ ˆ ์ ˆ๋Œ€ ๋ชฉํ‘œ ์œ„์น˜์ž…๋‹ˆ๋‹ค (delta ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค):

[shoulder_pan.pos, shoulder_lift.pos, elbow_flex.pos, wrist_flex.pos, wrist_roll.pos, gripper.pos]

๊ทธ๋ฆฌํผ๋„ ๊ด€์ ˆ์ž…๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๊ฐœํ ์ฑ„๋„์€ ์—†๊ณ , index 5 ์˜ ์ ˆ๋Œ€ ์œ„์น˜๊ฐ€ ๊ทธ๋Œ€๋กœ ์ง‘๊ฒŒ ๋ฒŒ์–ด์ง์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์—์„œ ๋‹ซํž˜์ด โ‰ˆ0~3, ์—ด๋ฆผ์ด โ‰ˆ41~54(ํƒœ์Šคํฌ๋ณ„ ์ตœ๋Œ€๊ฐ’)์ด๊ณ  ๋ถ„ํฌ๋Š” ์ด๋ด‰ํ˜•์ž…๋‹ˆ๋‹ค (carrot ๊ธฐ์ค€ 68% ๊ฐ€ 10 ๋ฏธ๋งŒ, 5% ๊ฐ€ 40 ์ดˆ๊ณผ, ๋‚˜๋จธ์ง€๊ฐ€ ์ „์ด ๊ตฌ๊ฐ„). ์ฅ๋Š” ํž˜์€ ์œ„์น˜ ๋ช…๋ น์ด ์•„๋‹ˆ๋ผ ์„œ๋ณด์˜ ํ† ํฌ ๋ฆฌ๋ฐ‹์ด ๋งŒ๋“ญ๋‹ˆ๋‹ค โ€” ๋ฌผ์ฒด์— ๋ง‰ํ˜€ ๋ชฉํ‘œ์— ๋ชป ๊ฐ€๋ฉด์„œ ํŒŒ์ง€๋ ฅ์ด ๊ฑธ๋ฆฌ๊ณ , ๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐ์˜ mean |action โˆ’ state| ๊ฐ€ ๊ทธ๋ฆฌํผ์—์„œ 4.09 ๋กœ ํฝ๋‹ˆ๋‹ค.

ํ–‰๋™ ์ฒญํฌ ์Šฌ๋ผ์ด์‹ฑ

predict_action_chunk ๋Š” 16์Šคํ…์„ ๋งŒ๋“  ๋’ค [n_obs_steps-1 : n_obs_steps-1+n_action_steps] = index 1..8 ์„ ๋Œ๋ ค์ค๋‹ˆ๋‹ค. index 0 ์€ t-1(์ด๋ฏธ ์ง€๋‚œ ์‹œ์ )์ด๋ฏ€๋กœ ๋ฒ„๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. [0:8] ์„ ์“ฐ๋ฉด ๋กœ๋ด‡์ด ํ•œ ์Šคํ…(1/30์ดˆ) ๋’ค์ฒ˜์ง‘๋‹ˆ๋‹ค.

30 fps ์—์„œ 8์Šคํ…์€ 0.27์ดˆ ๋ถ„๋Ÿ‰์ž…๋‹ˆ๋‹ค. num_inference_steps = 100 ์ด๋ฏ€๋กœ ์ฒญํฌ ํ•˜๋‚˜๋‹น velocity_net ์„ 100๋ฒˆ ์ ๋ถ„ํ•ฉ๋‹ˆ๋‹ค โ€” ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋Œ๋ฆฌ๋ ค๋ฉด ์ด ๋น„์šฉ์ด 0.27์ดˆ ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š”์ง€ ํ•˜๋“œ์›จ์–ด์—์„œ ๋จผ์ € ํ™•์ธํ•˜์„ธ์š”. (config.json ์„ ๊ณ ์ณ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•™์Šต ์กฐ๊ฑด๊ณผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค)

์–ธ์–ด ์กฐ๊ฑด

batch["task"] ์— ์ง€์‹œ๋ฌธ ๋ฌธ์ž์—ด์ด ๋ฐ˜๋“œ์‹œ ๋“ค์–ด๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ •์ฑ…์ด CLIP ์œผ๋กœ ์ธ์ฝ”๋”ฉํ•ด ์กฐ๊ฑด ๋ฒกํ„ฐ์˜ ์•ž 512์ฐจ์›์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ํƒœ์Šคํฌ ํ‘œ์˜ ๋ฌธ์ž์—ด์„ ๊ทธ๋Œ€๋กœ ์“ฐ์„ธ์š”.


ํƒœ์Šคํฌ ์ˆœ์„œ์™€ ์ง€์‹œ๋ฌธ

ํ•™์Šต ์ˆœ์„œ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค. task_k ์ฒดํฌํฌ์ธํŠธ๋Š” ํƒœ์Šคํฌ 0..k ๋ฅผ ์ˆœ์ฐจ๋กœ ๋ฐฐ์šด ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

k ๋ฐ์ดํ„ฐ์…‹ ์ง€์‹œ๋ฌธ
0 asdl-unist/new_aicp_carrot Pick up the carrot and put it in the basket.
1 asdl-unist/cup_bowl_match Place the blue cup into the blue bowl. / Place the green cup into the green bowl.
2 asdl-unist/stack_cup Pick up the left paper cup and stack it onto the right paper cup.
3 asdl-unist/paprika Pick up the pot, pour the paprika inside into the basket, then place the pot down onto the plate.

task_1 ์€ ๋ฐ์ดํ„ฐ์…‹ ํ•˜๋‚˜์— ์ง€์‹œ๋ฌธ์ด 2๊ฐœ์ž…๋‹ˆ๋‹ค(ํŒŒ๋ž‘/์ดˆ๋ก). ์–ธ์–ด ์กฐ๊ฑด์œผ๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ, TETHER ๋Š” ์ง€์‹œ๋ฌธ๋งˆ๋‹ค ์ฝ”๋“œ๋ถ์„ ๋”ฐ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค(ํ•ฉ์น˜๋ฉด "green ์žฅ๋ฉด + blue ์ง€์‹œ๋ฌธ" ๊ฐ™์€ ์กฐํ•ฉ์ด ์•ต์ปค์—์„œ ์ƒ˜ํ”Œ๋ง๋ฉ๋‹ˆ๋‹ค).

er/task_0 ๊ณผ v4/task_0 ์€ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋™์ผํ•œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค (md5 77ac6add03e33d69bf78e7ee91556351). ํƒœ์Šคํฌ 0 ์—์„œ๋Š” ๊ณผ๊ฑฐ๊ฐ€ ์—†์–ด ๋ฆฌํ”Œ๋ ˆ์ด๋„ ์•ต์ปค๋„ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ , ๊ฐ™์€ ์‹œ๋“œยท๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฒ€์ฆ ์‹œ ํ•œ ๋ฒˆ๋งŒ ์žฌ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


ํ•™์Šต ์„ค์ •

  • from scratch (์‚ฌ์ „ํ•™์Šต ์ฒดํฌํฌ์ธํŠธ ์—†์Œ). DINOv2/CLIP ์€ ๋™๊ฒฐ ์‚ฌ์ „ํ•™์Šต์ด๋ผ ์‹ค์ œ ํ•™์Šต ๋Œ€์ƒ์€ 43.87M ํŒŒ๋ผ๋ฏธํ„ฐ(velocity_net + ํˆฌ์˜)๋ฟ์ž…๋‹ˆ๋‹ค
  • ํƒœ์Šคํฌ๋‹น 10,000 step, batch 32, AdamW lr 1e-4 ์ฝ”์‚ฌ์ธ(ํƒœ์Šคํฌ๋งˆ๋‹ค ๋ฆฌ์…‹), warmup 500
  • ํƒœ์Šคํฌ๋‹น 50 ์—ํ”ผ์†Œ๋“œ ์ค‘ ๋’ค์ชฝ 5 ์—ํ”ผ์†Œ๋“œ(45~49)๋ฅผ ํ•™์Šต์—์„œ ์ œ์™ธ โ†’ 45 ํ•™์Šต / 5 hold-out
  • ER ๋ฒ„ํผ๋Š” ๊ณผ๊ฑฐ ํƒœ์Šคํฌ์˜ ์•ž์ชฝ 5 ์—ํ”ผ์†Œ๋“œ(0~4) โ€” ํ•™์Šต ์Šคํ”Œ๋ฆฟ ์•ˆ์ด๋ผ hold-out ๋ˆ„์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ฆฌํ”Œ๋ ˆ์ด ๋ฐฐ์น˜๋„ 32
  • cond_dim = 2572 = ์–ธ์–ด 512 + (์ƒํƒœ 6 + ์ด๋ฏธ์ง€ 512ร—2) ร— 2ํ”„๋ ˆ์ž„
  • seed 42, ๋‘ ๋ฐฉ๋ฒ• ๋™์ผ
  • TETHER (v4/): sampler_mode=hard_linear, anchor_weight=speedinv, kappa=1.0, w_clip=20.0, lambda_level=3.0, ์ฝ”๋“œ๋ถ K = max(8, 2 ร— demo) (45 demo โ†’ K=90, ์ง€์‹œ๋ฌธ์ด 2๊ฐœ์ธ t1 ์€ ์ง€์‹œ๋ฌธ๋‹น ~22 demo โ†’ Kโ‰ˆ45)
  • hold-out ํ‰๊ฐ€: ํƒœ์Šคํฌ๋‹น ๋ฌด์ž‘์œ„ ์ฐฝ 256๊ฐœ, ์ฐฝ ์ถ”์ถœ ์‹œ๋“œ 42

๊ฒฐ๊ณผ (hold-out action MSE, ๋‚ฎ์„์ˆ˜๋ก ์ข‹์Œ)

๋กœ๋ด‡์ด ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๋Š” 8์Šคํ…์˜ ์ •๊ทœํ™” ๊ณต๊ฐ„ MSE ์ž…๋‹ˆ๋‹ค. ๋กค์•„์›ƒ์ด ์•„๋‹ˆ๋ผ ๋Œ€๋ฆฌ ์ง€ํ‘œ์ด๋ฉฐ, ์„ฑ๊ณต๋ฅ ์„ ๋Œ€์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด ํ–‰๋ ฌ (ํ–‰ = ํƒœ์Šคํฌ k ๊นŒ์ง€ ๋ฐฐ์šด ๋’ค, ์—ด = ํ‰๊ฐ€ ํƒœ์Šคํฌ)

er/holdout_mse.csv, v4/holdout_mse.csv ์™€ ๊ฐ™์€ ๊ฐ’์ž…๋‹ˆ๋‹ค.

ER

after t0 carrot t1 cup_bowl t2 stack_cup t3 paprika
0 0.022227
1 0.023385 0.015514
2 0.024157 0.017834 0.011285
3 0.021806 0.018340 0.015437 0.018610

TETHER

after t0 carrot t1 cup_bowl t2 stack_cup t3 paprika
0 0.022227
1 0.019451 0.016878
2 0.016782 0.014036 0.011839
3 0.016018 0.012713 0.011902 0.017463

์ตœ์ข… (4๊ฐœ ํƒœ์Šคํฌ๋ฅผ ๋ชจ๋‘ ๋ฐฐ์šด ๋’ค)

t0 t1 t2 t3 ํ‰๊ท 
ER 0.02181 0.01834 0.01544 0.01861 0.01855
TETHER 0.01602 0.01271 0.01190 0.01746 0.01452

๋ง๊ฐ (๋ฐฐ์šด ์งํ›„ ๋Œ€๋น„ ์ฆ๊ฐ€๋ถ„, ์Œ์ˆ˜ = ๊ฐœ์„ )

t3 ๋Š” ๋งˆ์ง€๋ง‰ ํƒœ์Šคํฌ๋ผ ์ •์˜์ƒ 0 ์ž…๋‹ˆ๋‹ค. ํ‰๊ท ์€ ์ด 0 ์„ ํฌํ•จํ•œ 4ํƒœ์Šคํฌ ํ‰๊ท ์ด๊ณ , 3ํƒœ์Šคํฌ ํ‰๊ท ๋„ ๊ฐ™์ด ์ ์—ˆ์Šต๋‹ˆ๋‹ค โ€” ์–ด๋А ์ชฝ์œผ๋กœ ์ฝ์–ด๋„ ๋ถ€ํ˜ธ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์ง€๋งŒ ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

t0 t1 t2 t3 ํ‰๊ท  (4๊ฐœ) ํ‰๊ท  (t0~t2)
ER โˆ’0.00042 +0.00283 +0.00415 0 +0.00164 +0.00219
TETHER โˆ’0.00621 โˆ’0.00416 +0.00006 0 โˆ’0.00258 โˆ’0.00343

์Šต๋“ ์„ฑ๋Šฅ (๋Œ€๊ฐ์„ ) โ€” ์—ฌ๊ธฐ์„œ๋Š” ER ์ด ์šฐ์„ธํ•ฉ๋‹ˆ๋‹ค

๋Œ€๊ฐ์„  ER TETHER
t0 0.02223 0.02223 ๋™์ผ ํŒŒ์ผ
t1 0.01551 0.01688 ER 8.8% ์šฐ์„ธ
t2 0.01129 0.01184 ER 4.9% ์šฐ์„ธ
t3 0.01861 0.01746 TETHER 6.2% ์šฐ์„ธ

์ƒˆ ํƒœ์Šคํฌ๋ฅผ ๋ฐฐ์šฐ๋Š” ๋Šฅ๋ ฅ์€ ER ์ด t1ยทt2 ์—์„œ ์•ž์„œ๊ณ  t3 ์—์„œ๋งŒ TETHER ๊ฐ€ ์•ž์„ญ๋‹ˆ๋‹ค. ์ฆ‰ TETHER ์˜ ์ตœ์ข… ์šฐ์œ„๋Š” "์ƒˆ ํƒœ์Šคํฌ๋ฅผ ๋” ์ž˜ ๋ฐฐ์›Œ์„œ"๊ฐ€ ์•„๋‹ˆ๋ผ "๊ณผ๊ฑฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐฐ์›Œ์„œ" ์ƒ๊ธด ๊ฒƒ์ž…๋‹ˆ๋‹ค.


ablation โ€” POSE_DIMS ๋ฅผ ๊ณ ์น˜๋ฉด (2026-09-14 ์ถ”๊ฐ€)

ํ•œ๊ณ„ 1 ์—์„œ ์ง€์ ํ•œ ๋‘ ๋ฌธ์ œ๋ฅผ ๊ฐ๊ฐ ๊ณ ์ณ ๊ฐ™์€ ์กฐ๊ฑด์œผ๋กœ ๋‹ค์‹œ ๋Œ๋ ธ์Šต๋‹ˆ๋‹ค(์‹œ๋“œ 42, ํƒœ์Šคํฌ๋‹น 10,000 step, ๋‚˜๋จธ์ง€ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋ถ€ ๋™์ผ). v4_grip5/ ๋Š” ์ฐจ์›๋งŒ ๊ณ ์ณค๊ณ  (--pose_dims 5), v4_diff5/ ๋Š” ์ฐจ์›๊ณผ ์˜๋ฏธ๋ฅผ ๋ชจ๋‘ ๊ณ ์ณค์Šต๋‹ˆ๋‹ค (--pose_dims 5 --speed_mode diff).

์ตœ์ข… MSE t0 t1 t2 t3 ํ‰๊ท  ๋ง๊ฐ ํ‰๊ท 
ER 0.02181 0.01834 0.01544 0.01861 0.01855 +0.00164
TETHER (v4/) 0.01602 0.01271 0.01190 0.01746 0.01452 โˆ’0.00258
+ ๊ทธ๋ฆฌํผ ์ œ์™ธ (v4_grip5/) 0.01596 0.01261 0.01227 0.01812 0.01474 โˆ’0.00242
+ ์ฐจ๋ถ„ยท๊ทธ๋ฆฌํผ ์ œ์™ธ (v4_diff5/) 0.01519 0.01218 0.01227 0.01767 0.01433 โˆ’0.00285

v4_diff5 ๊ฐ€ ์ตœ์ข… ํ‰๊ท ๊ณผ ๋ง๊ฐ ๋ชจ๋‘์—์„œ ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋“์ด ์ „๋ถ€ ๊ณผ๊ฑฐ ํƒœ์Šคํฌ์— ๋ชฐ๋ ค ์žˆ๊ณ (t0 โˆ’5.2%, t1 โˆ’4.2%) ๋’ค์ชฝ ํƒœ์Šคํฌ๋Š” ์˜คํžˆ๋ ค ์†ํ•ด๋ฅผ ๋ด…๋‹ˆ๋‹ค(t2 +3.1%, t3 +1.2%). ๊ฐ€์ค‘์ด ์ œ๋Œ€๋กœ ๊ฑธ๋ฆฌ๋ฉด์„œ ์•ต์ปค๊ฐ€ ์„ธ์ง€๊ณ  ๊ทธ๋งŒํผ ์ƒˆ ํƒœ์Šคํฌ ํ•™์Šต์ด ๋ˆŒ๋ฆฐ, ์ „ํ˜•์ ์ธ ์•ˆ์ •์„ฑ-๊ฐ€์†Œ์„ฑ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„์ž…๋‹ˆ๋‹ค.

v4_grip5 ๋Š” ์›๋ณธ๋ณด๋‹ค ์˜คํžˆ๋ ค ๋‚˜๋นด์Šต๋‹ˆ๋‹ค(+1.5%). ๊ทธ๋ฆฌํผ๋งŒ ๋นผ์„œ๋Š” rho ๊ฐ€ ์—ฌ์ „ํžˆ ๊ด€์ ˆ ์ ˆ๋Œ€ ์œ„์น˜๋ผ ์†๋„ ์˜๋ฏธ๊ฐ€ ๋Œ์•„์˜ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(ํ•œ๊ณ„ 1 ์˜ ์‹ค์ธกํ‘œ). ์ฐจ์› ์ˆ˜์ •๋งŒ์œผ๋กœ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ํ•™์Šต ๊ฒฐ๊ณผ๋กœ๋„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

โš ๏ธ ์‹œ๋“œ ํ•˜๋‚˜์งœ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์„ธ ๋Ÿฐ์ด ๊ฐ™์€ ์‹œ๋“œ๋ผ ์ฐจ์ด์˜ ์›์ธ์ด ์ฝ”๋“œ ๋ณ€๊ฒฝ์ธ ๊ฒƒ์€ ๋งž์ง€๋งŒ, ์‹œ๋“œ ๊ฐ„ ๋ถ„์‚ฐ์„ ๋ชจ๋ฅด๋ฏ€๋กœ ํ‰๊ท  ์ˆœ์œ„(ํŠนํžˆ v4_grip5 ์˜ +1.5%)๋Š” ๋’ค์ง‘ํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด v4_diff5 ์˜ "๊ณผ๊ฑฐ ๊ฐœ์„  / ํ˜„์žฌ ์•…ํ™”" ํŒจํ„ด์€ t1ยทt2ยทt3 ๋ชจ๋“  ์‹œ์ ์—์„œ ์ผ๊ด€๋๊ณ  ํ•œ๊ณ„ 1 ์˜ ๊ฐ€์ค‘ ๋ถ„ํฌ ์ธก์ •๊ณผ๋„ ๋งž์•„๋–จ์–ด์ง€๋ฏ€๋กœ, ํ‰๊ท ๊ฐ’๋ณด๋‹ค ์‹ ๋ขฐํ•  ๋งŒํ•ฉ๋‹ˆ๋‹ค.

๋„ค ๋Ÿฐ์˜ task_0 ์€ ๋ชจ๋‘ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค (md5 77ac6add03e33d69bf78e7ee91556351). ํƒœ์Šคํฌ 0 ์—์„œ๋Š” ๋ฆฌํ”Œ๋ ˆ์ด๋„ ์•ต์ปค๋„ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฐ ํด๋”์— holdout_mse.csv, holdout_report.txt, train_config.json(์‹ค์ œ๋กœ ์“ด ์ธ์ž ์ „์ฒด)์„ ๊ฐ™์ด ๋„ฃ์–ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

clare ๋ณธ ์‹คํ—˜(LIBERO / LOTUS)์—์„œ ๋ฐ”๊พผ ๊ฒƒ

์ด run ์€ L2_V4.py ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ทธ๋Œ€๋กœ ์“ฐ๋ฉด์„œ ๋ฐ์ดํ„ฐ์™€ ๋“œ๋ผ์ด๋ฒ„๋งŒ ์‹ค๋กœ๋ด‡์œผ๋กœ ๋ฐ”๊พผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ”๊พผ ๊ฒƒ๊ณผ ๋ฐ”๊พธ์ง€ ์•Š์•„์„œ ์˜๋ฏธ๊ฐ€ ๋‹ฌ๋ผ์ง„ ๊ฒƒ์„ ๋‚˜๋ˆ ์„œ ์ ์Šต๋‹ˆ๋‹ค.

์˜๋„์ ์œผ๋กœ ๋ฐ”๊พผ ๊ฒƒ

clare ๋ณธ ์‹คํ—˜ (LIBERO / LOTUS) ์ด ์‹ค๋กœ๋ด‡ run
์•ก์…˜ 7์ฐจ์› EEF delta + ๊ทธ๋ฆฌํผ 6์ฐจ์› ๊ด€์ ˆ ์ ˆ๋Œ€ ์œ„์น˜ (๊ทธ๋ฆฌํผ ํฌํ•จ)
์ƒํƒœ 8์ฐจ์› 6์ฐจ์›
cond_dim 2576 2572
์ œ์–ด ์ฃผ๊ธฐ 20 fps (1์Šคํ… 0.05s) 30 fps (1์Šคํ… 0.033s), ์ฒญํฌ 8์Šคํ… = 0.27s
์‚ฌ์ „ํ•™์Šต LOTUS base phase ์—†์Œ (from scratch)
ํƒœ์Šคํฌ ์ˆ˜ 10 4
๋ฐ์ดํ„ฐ ํฌ๋งท LeRobot v2.1 v3.0 + ์ปค์Šคํ…€ ๋กœ๋” (asdl_data.py)
ํ‰๊ฐ€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๋กค์•„์›ƒ ์„ฑ๊ณต๋ฅ  hold-out action MSE (๋Œ€๋ฆฌ ์ง€ํ‘œ, ๋กค์•„์›ƒ ๋ถˆ๊ฐ€)
seed 1000 42
๋“œ๋ผ์ด๋ฒ„ L2_V4.py (LIBERO) cl_train.py (์‹ค๋กœ๋ด‡)

๋ฐ”๊พธ์ง€ ์•Š์•„์„œ ์˜๋ฏธ๊ฐ€ ๋‹ฌ๋ผ์ง„ ๊ฒƒ โ† ์ค‘์š”

L2_V4.py:482 ์˜ POSE_DIMS = 6 ์„ ๊ทธ๋Œ€๋กœ ๋’€์Šต๋‹ˆ๋‹ค. LIBERO ์•ก์…˜ ๊ทœ์•ฝ ([x,y,z,roll,pitch,yaw,gripper] โ†’ 0..5 pose, 6 gripper)์„ ์ „์ œํ•œ ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋Š” 6์ฐจ์›์ด๊ณ  ๊ทธ๋ฆฌํผ๊ฐ€ index 5 ๋ผ์„œ, [..., :POSE_DIMS] ๊ฐ€ 6์ฐจ์› ์ „์ฒด๋ฅผ ๋ฎ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜ ํ•œ๊ณ„ 1์— ์ž์„ธํžˆ ์ ์—ˆ์Šต๋‹ˆ๋‹ค. ER ์€ ์•ต์ปค๋ฅผ ์“ฐ์ง€ ์•Š์œผ๋ฏ€๋กœ ์˜ํ–ฅ์ด ์—†์Šต๋‹ˆ๋‹ค.


์•Œ๋ ค์ง„ ํ•œ๊ณ„

1. speedinv ๊ฐ€์ค‘์ด ์ด ๋ฐ์ดํ„ฐ์—์„œ ์†๋„ ์˜๋ฏธ๋ฅผ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค (TETHER ๋งŒ ํ•ด๋‹น)

TETHER ์˜ ๋‘ ๋ณ€๊ฒฝ ์ค‘ ํ•˜๋‚˜์ธ ์†๋„ ์—ญ์ œ๊ณฑ ๊ฐ€์ค‘์€ speed_weights(L2_V4.py:508)๊ฐ€ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

rho = (v_ref + eps_noise)[..., :POSE_DIMS].norm(dim=-1)   # "pose ์„ฑ๋ถ„์˜ ์Šคํ… ์†๋„"
w   = 1.0 / (rho.pow(2) + c)                              # c = kappa x speed_med2
w   = torch.minimum(w, w.median() * w_clip)               # ์œ„๋กœ๋งŒ ์ž๋ฅธ๋‹ค
w   = w / w.mean()                                        # ๋ฐฐ์น˜ ํ‰๊ท  1

v_ref + eps_noise ๋Š” de-noised ํ”„๋ ˆ์ž„์ด๋ผ rho โ‰ˆ โ€–รข[..., :POSE_DIMS]โ€– โ€” de-noised ์•ก์…˜ ๋ฒกํ„ฐ์˜ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. LIBERO ์—์„œ๋Š” รข ๊ฐ€ EEF delta ๋ผ ์ด ๊ฐ’์ด ์ •์˜์ƒ ์Šคํ… ๋ณ€์œ„, ์ฆ‰ ์ง„์งœ "์†๋„"์ž…๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ์˜ รข ๋Š” ๊ด€์ ˆ ์ ˆ๋Œ€ ์œ„์น˜๋ผ์„œ rho ๋Š” "๊ด€์ ˆ ๋ฒ”์œ„ ์ค‘์‹ฌ์œผ๋กœ๋ถ€ํ„ฐ์˜ ๊ฑฐ๋ฆฌ"๊ฐ€ ๋˜๊ณ , ์†๋„์™€๋Š” ๋‹ค๋ฅธ ์–‘์ž…๋‹ˆ๋‹ค.

4ํƒœ์Šคํฌ ์ „์ฒด์—์„œ ์ •๊ทœํ™” ๊ณต๊ฐ„์œผ๋กœ ์‹ค์ธกํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค (kappa=1, w_clip=20):

ํƒœ์Šคํฌ rho ์ค‘์•™๊ฐ’ c wฬƒ p10 wฬƒ p90 w_clip ๋ฐœ๋™ corr(rho, ์‹ค์ œ ์Šคํ… ์†๋„) rhoยฒ ์ค‘ ๊ทธ๋ฆฌํผ ๋น„์ค‘
new_aicp_carrot 1.324 1.754 0.73 1.30 0.0% โˆ’0.464 28%
cup_bowl_match 1.305 1.704 0.71 1.44 0.0% โˆ’0.368 28%
stack_cup 1.259 1.585 0.73 1.35 0.0% โˆ’0.425 29%
paprika 1.329 1.766 0.75 1.27 0.0% โˆ’0.401 33%

์ฝ๋Š” ๋ฒ•:

  • ์ƒ๊ด€์ด ์Œ์ˆ˜์ž…๋‹ˆ๋‹ค (โˆ’0.37 ~ โˆ’0.46). rho ๊ฐ€ ์ž‘์„ ๋•Œ๊ฐ€ ์˜คํžˆ๋ ค ๋น ๋ฅธ ๊ตฌ๊ฐ„์ž…๋‹ˆ๋‹ค. w = 1/(rhoยฒ+c) ๋Š” rho ๊ฐ€ ์ž‘์€ ๊ณณ์— ํฐ ๊ฐ€์ค‘์„ ์ฃผ๋ฏ€๋กœ, ์„ค๊ณ„ ์˜๋„("๋А๋ฆฐยท์ •๋ฐ€ ๊ตฌ๊ฐ„์„ ๊ฐ•์กฐ")์™€ ๋ฐ˜๋Œ€๋กœ ๋น ๋ฅธ ๊ตฌ๊ฐ„์„ ๊ฐ•์กฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋งŒ ๊ฐ•๋„๋Š” ์•ฝํ•ฉ๋‹ˆ๋‹ค. wฬƒ ์˜ p10โ€“p90 ์ด 0.73โ€“1.30, ์ฆ‰ ยฑ30% ์ˆ˜์ค€์˜ ์žฌ๊ฐ€์ค‘์ด๊ณ  w_clip ์€ ํ•œ ๋ฒˆ๋„ ๋ฐœ๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(0.0%). mean(wฬƒ)=1 ๋กœ ์ •๊ทœํ™”๋˜๋ฏ€๋กœ ์ „์ฒด ์†์‹ค ์Šค์ผ€์ผ์€ ๋ฌด๊ฐ€์ค‘ MSE ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌํผ๋„ ๊ฐ€์ค‘์— ๋“ค์–ด๊ฐ”์Šต๋‹ˆ๋‹ค. POSE_DIMS=6 ์ด 6์ฐจ์› ์ „์ฒด๋ฅผ ๋ฎ์–ด ๊ทธ๋ฆฌํผ(index 5)๊ฐ€ rhoยฒ ์˜ ์•ฝ 30% ๋ฅผ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ค์œผ๋กœ weighted_sq ์˜ ๋ฌด๊ฐ€์ค‘ ํ•ญ resid[..., POSE_DIMS:] ๋Š” ๋นˆ ์Šฌ๋ผ์ด์Šค๊ฐ€ ๋˜์–ด ์ •ํ™•ํžˆ 0 ์ž…๋‹ˆ๋‹ค โ€” ์›๋ž˜ ์„ค๊ณ„๋Š” ๊ทธ๋ฆฌํผ๋ฅผ ๋ฌด๊ฐ€์ค‘์œผ๋กœ ๋”ฐ๋กœ ๋”ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด์„์ƒ ๋ฌด์—‡์ด ๋‹ฌ๋ผ์ง€๋Š”๊ฐ€: ์œ„ ๊ฒฐ๊ณผ์—์„œ TETHER ๊ฐ€ ER ์„ ์ด๊ธด ๊ฒƒ์„ "์†๋„ ๊ฐ€์ค‘์˜ ํšจ๊ณผ"๋กœ ์ฝ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ€์ค‘์ด ์•ฝํ•˜๊ณ (ยฑ30%) ๋ฐฉํ–ฅ๋„ ์˜๋„์™€ ๋ฐ˜๋Œ€์ด๋ฏ€๋กœ, ๋‚จ๋Š” ์œ ํšจ ์š”์†Œ๋Š” ์ฝ”๋“œ๋ถ ์•ต์ปค ์ž์ฒด์™€ hard_linear ์ƒ˜ํ”Œ๋Ÿฌ์ž…๋‹ˆ๋‹ค.

๊ณ ์ณ์„œ ์‹ค์ธกํ–ˆ์Šต๋‹ˆ๋‹ค (2026-09-14 ์ถ”๊ฐ€. 4ํƒœ์Šคํฌ ํ‰๊ท , ํ•™์Šต ์Šคํ”Œ๋ฆฟ ์ „์ฒด, ์ •๊ทœํ™” ๊ณต๊ฐ„):

rho ์ •์˜ w p10 w p90 ์‹คํšจ ๋ฒ”์œ„ w_clip ๋ฐœ๋™ corr(rho, ์‹ค์ œ ์Šคํ… ์†๋„)
โ€–a[0:6]โ€– โ€” ์ด ์ €์žฅ์†Œ์˜ v4/ 0.73 1.33 1.8๋ฐฐ 0.0% โˆ’0.438
โ€–a[0:5]โ€– โ€” v4_grip5/ 0.69 1.42 2.1๋ฐฐ 0.0% โˆ’0.431
โ€–ฮ”a[0:5]โ€– โ€” v4_diff5/ 0.14 1.84 13๋ฐฐ 0.0% 1.000
  • ๊ทธ๋ฆฌํผ๋ฅผ ๋นผ๋„ ์ƒ๊ด€์€ ์Œ์ˆ˜ ๊ทธ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค (โˆ’0.438 โ†’ โˆ’0.431). POSE_DIMS ๋ฅผ 5 ๋กœ ๊ณ ์น˜๋Š” ๊ฒƒ์€ ์œ„ ๋‘ ๋ฒˆ์งธ ํ•ญ๋ชฉ(์ฐจ์›)๋งŒ ๊ณ ์น  ๋ฟ, rho ๊ฐ€ ์ ˆ๋Œ€ ์œ„์น˜๋ผ๋Š” ์˜๋ฏธ ๋ฌธ์ œ๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ค‘ ํญ๋„ 1.8๋ฐฐ โ†’ 2.1๋ฐฐ๋กœ ์‚ฌ์‹ค์ƒ ๊ทธ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค.
  • ์ฐจ๋ถ„์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๊ฐ€์ค‘์ด ๋น„๋กœ์†Œ ์‹ค์ œ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‹คํšจ ๋ฒ”์œ„๊ฐ€ 1.8๋ฐฐ์—์„œ 13๋ฐฐ๋กœ ๋ฒŒ์–ด์ง‘๋‹ˆ๋‹ค. corr = 1.000 ์€ rho ๋ฅผ ์Šคํ… ์†๋„๋กœ ์ •์˜ํ–ˆ์œผ๋ฏ€๋กœ ๋™์–ด๋ฐ˜๋ณต์ด๋ฉฐ, ์ฆ๊ฑฐ๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ์ƒ๊ด€๊ฐ’์ด ์•„๋‹ˆ๋ผ ๋ถ„ํฌ๊ฐ€ ๋ฒŒ์–ด์กŒ๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.
  • w_clip = 20.0 ์€ ๋„ค ์„ค์ • ์ „๋ถ€์—์„œ ๋ฐœ๋™๋ฅ  0.0% ์ž…๋‹ˆ๋‹ค. ์ฐจ๋ถ„์œผ๋กœ ๋ถ„ํฌ๊ฐ€ 13๋ฐฐ๋กœ ๋ฒŒ์–ด์ง„ ๋’ค์—๋„ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค์ƒ ์ฃฝ์€ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ์ด๋‹ˆ, ํŠœ๋‹ ๋Œ€์ƒ์—์„œ ๋นผ๊ฑฐ๋‚˜ ํ›จ์”ฌ ๋‚ฎ์ถฐ์•ผ ์˜๋ฏธ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

๊ณ ์นœ ๋Ÿฐ์˜ ์„ฑ๋Šฅ์€ ์œ„ "ablation" ์ ˆ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์•ฝํ•˜๋ฉด ์ฐจ๋ถ„๊นŒ์ง€ ๊ณ ์นœ v4_diff5/ ๊ฐ€ ์ตœ์ข… ํ‰๊ท (0.01433)๊ณผ ๋ง๊ฐ(โˆ’0.00285) ๋ชจ๋‘์—์„œ ๊ฐ€์žฅ ์ข‹๊ณ , ๊ทธ๋ฆฌํผ๋งŒ ๋บ€ v4_grip5/ ๋Š” ์›๋ณธ๋ณด๋‹ค ๋‚˜๋นด์Šต๋‹ˆ๋‹ค(0.01474). ๋‹ค๋งŒ --anchor_weight mse ๋Œ€์กฐ๊ตฐ์ด ์—†์–ด ์•ต์ปคยท์ƒ˜ํ”Œ๋Ÿฌยท๊ฐ€์ค‘ ์…‹์„ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜์ง€๋Š” ๋ชปํ•ฉ๋‹ˆ๋‹ค(ํ•œ๊ณ„ 4).

๋’ค์ง‘์–ด ๋ณด๋ฉด, ์„ค๊ณ„ ์˜๋„์™€ ์–ด๊ธ‹๋‚œ ๊ฐ€์ค‘์„ ์•ˆ๊ณ ๋„ TETHER ๊ฐ€ ๋ง๊ฐ์—์„œ ER ์„ ์•ž์„ฐ์Šต๋‹ˆ๋‹ค.

2. ๋Œ€๋ฆฌ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค

hold-out action MSE 22% ๊ฐœ์„ ์ด ์‹ค๋กœ๋ด‡ ์„ฑ๊ณต๋ฅ ์—์„œ ์–ผ๋งˆ๋‚˜ ๋‚˜ํƒ€๋‚ ์ง€๋Š” ๋ณ„๊ฐœ์ด๋ฉฐ, ๋’ค์ง‘ํž ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กค์•„์›ƒ์„ ๋Œ๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

3. ํƒœ์Šคํฌ 4๊ฐœ๋Š” CL ์‹œํ€€์Šค๋กœ ์งง์Šต๋‹ˆ๋‹ค

๋ง๊ฐ์ด ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚˜๊ธฐ ์ „ ๊ตฌ๊ฐ„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ๊ธฐ์ค€์„ ๊ณผ ablation ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค

  • seq-FT ๊ธฐ์ค€์„  ์—†์Œ: ์•„๋ฌด ๋Œ€์ฑ… ์—†๋Š” ์ˆœ์ฐจ ํ•™์Šต๊ณผ ๋น„๊ตํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ, ๋‘ ๋ฐฉ๋ฒ•์ด "์–ผ๋งˆ๋‚˜" ๋„์›€์ด ๋๋Š”์ง€๋Š” ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€์ค‘ ablation ์€ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค โ€” v4_grip5/, v4_diff5/ (์œ„ "ablation" ์ ˆ). ๋‹ค๋งŒ --anchor_weight mse(๊ฐ€์ค‘์„ ์•„์˜ˆ ์ œ๊ฑฐ)์™€ --sampler_mode soft_kernel(v3 ์ƒ˜ํ”Œ๋Ÿฌ) ๋Œ€์กฐ๊ตฐ์€ ์—ฌ์ „ํžˆ ์—†์–ด, TETHER ์˜ ์ด๋“์ด ์•ต์ปคยท์ƒ˜ํ”Œ๋Ÿฌยท๊ฐ€์ค‘ ์ค‘ ๋ฌด์—‡์—์„œ ์™”๋Š”์ง€ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜์ง€๋Š” ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ๋“œ๊ฐ€ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค: ablation ์˜ 1~2% ์ฐจ์ด๋ฅผ ์ˆ˜์น˜๋กœ ์ฃผ์žฅํ•˜๋ ค๋ฉด ์‹œ๋“œ๋ฅผ ๋” ๋Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์ฐจ์ด์˜ ํฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐฉํ–ฅ(ํŒจํ„ด)์ž…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ

asdl-unist/new_aicp_carrot, cup_bowl_match, stack_cup, paprika (LeRobot v3.0 ํฌ๋งท, ๊ฐ 50 ์—ํ”ผ์†Œ๋“œ, 30 fps, 480ร—640 ์นด๋ฉ”๋ผ 2๋Œ€)

ํƒœ์Šคํฌ ์—ํ”ผ์†Œ๋“œ ํ”„๋ ˆ์ž„
new_aicp_carrot 50 14,137
cup_bowl_match 50 11,112
stack_cup 50 12,660
paprika 50 18,825
Downloads last month

-

Downloads are not tracked for this model. How to track
Video Preview
loading

Datasets used to train kimtaegyu/TETHER