12참가자 AWS 배포예상 약 30분, 별도 일정
새로운 시연 확장하기
객체 순서와 배치를 확장하고 실패 검사를 유지하는 방법을 실습합니다.
참가자 AWS 배포 트랙, 예상 약 30분입니다. 로컬 MuJoCo와 계약 테스트를 실행할 수 있어야 합니다.
세 물체와 세 파트의 아홉 시연에서 순서·초기 구조·접촉 방식을 비교합니다. 먼저 실제 물리 결과를 확인하고 실패 판정을 유지합니다. 물체나 목적지 종류를 추가하는 작업은 더 넓은 계약 변경이므로 별도 설계로 다룹니다.
| 파트 | 시연 | 비교할 차이 |
|---|---|---|
| Part 1 · 움직임의 발견 | transfer, stack, sort |
옮기기·쌓기·색상 분류 |
| Part 2 · 정밀 배치 | lineup, kit, pyramid |
순서 정렬·키트 배치·두 받침의 지지 |
| Part 3 · 작업대 재정리 | unstack, restock, push |
쌓인 초기 상태·트레이 초기 상태·들지 않고 밀기 |
1. 확장할 계약 위치 확인
set -euo pipefail
cd "$ROBOT_LAB"
test -f infra/workshop-binding.json
rg -n 'OBJECT_IDS|SCENARIO_IDS|TARGET_IDS|validatePlan' shared
rg -n 'validate_candidate|destinations|objectId' agent/planner.py agent/toolkit.json
rg -n 'SCENARIOS|OBJECT|target|actions' simulation/runtime.py simulation/scene.py
| 경로 | 함께 유지할 내용 |
|---|---|
shared/contracts.ts, shared/plans.ts |
허용 ID, action 구조, 중복·목적지 검증 |
shared/scenarios.ts |
화면의 시연 이름과 안내 |
shared/workcells.json, shared/workcell.py, shared/workcells.ts |
두 엔진과 화면의 공통 초기 배치·목표·작업 순서 |
agent/toolkit.json, agent/planner.py |
모델에 주는 환경과 Python 재검증 |
simulation/scene.py, runtime.py |
실제 물체·목표·순서·성공 판정 |
src/replay.ts, scene.ts |
미터·Z-up·XYZW pose 기록 재생 |
tests/, tests/simulation/ |
계약 거부와 실제 물리 성공·실패 근거 |
이 장의 순서 변경은 새 ID나 권한을 추가하지 않습니다.
2. 주황 상자부터 쌓는 새 물리 실행
cd "$ROBOT_LAB"
mkdir -p .local/evidence/extension
.venv/bin/python -m simulation.cli \
--scenario stack --seed 314 \
--actions '[{"objectId":"orange","target":"tower"},{"objectId":"blue","target":"tower"},{"objectId":"red","target":"tower"}]' \
--output .local/evidence/extension/orange-first-314.json
다음은 표시된 성공 문구 외에 최종 높이·정지 상태와 검사 항목을 확인합니다.
.venv/bin/python - <<'PY'
import json, math
from pathlib import Path
r = json.loads(Path(".local/evidence/extension/orange-first-314.json").read_text())
assert r["engine"] == "MuJoCo" and r["seed"] == 314
assert r["status"] == "succeeded" and r["metrics"]["success"]
assert r["metrics"]["placed"] == 3 and all(c["passed"] for c in r["checks"])
assert [step["objectId"] for step in r["steps"]] == ["orange", "blue", "red"]
final = r["frames"][-1]["bodies"]
for name, expected_z in (("orange", 0.025), ("blue", 0.075), ("red", 0.125)):
p = final[name]["position"]
assert abs(p[2] - expected_z) < 0.003, (name, p)
resting = [f["bodies"][name]["position"] for f in r["frames"]
if f["t"] >= r["duration"] - 0.75]
assert max(math.dist(p, q) for q in resting) < 0.003, name
print(json.dumps({"order": ["orange", "blue", "red"], "metrics": r["metrics"]}, indent=2))
PY
새 배치에서 실패하면 grasp·release·support·stability 항목을 읽고 원인을 조사합니다. 성공하는 seed만 골라 일반적인 성능으로 발표하지 않습니다.
3. 잡을 수 없을 때 실패하는지 확인
물리 그리퍼 힘을 0으로 만들어 실패를 재현합니다. CLI의 종료 코드 1은 이 실험에서 기대한 결과이며, 이어서 결과 파일의 실패 내용을 확인합니다.
cd "$ROBOT_LAB"
ROBOT_NEGATIVE_STATUS=0
.venv/bin/python -m simulation.cli \
--scenario transfer --seed 314 --grip-force 0 \
--actions '[{"objectId":"red","target":"tray"}]' \
--output .local/evidence/extension/no-grip-314.json \
|| ROBOT_NEGATIVE_STATUS=$?
test "$ROBOT_NEGATIVE_STATUS" -eq 1
.venv/bin/python - <<'PY'
import json
from pathlib import Path
r = json.loads(Path(".local/evidence/extension/no-grip-314.json").read_text())
assert r["engine"] == "MuJoCo"
assert r["status"] == "failed" and not r["metrics"]["success"]
assert r["metrics"]["placed"] == 0
assert any(not c["passed"] for c in r["checks"])
assert r["steps"] and all(s["status"] == "failed" for s in r["steps"])
print("PASS: 접촉으로 잡지 못한 물체는 실패로 남았습니다.")
PY
단순 프로세스 오류도 종료 코드 1일 수 있습니다. 결과 JSON과 물리 실패 검사를 함께 확인하므로 Python 예외를 올바른 물리 실패로 오인하지 않습니다.
4. 같은 순서를 실제 모델로 요청
공개 웹의 작업 지시창에 아래 문장을 입력합니다. 계획의 objectId 순서와 target을 먼저 확인하고 배치 314로 새 실행합니다.
주황 상자를 맨 아래, 파란 상자를 가운데, 빨간 상자를 맨 위로 쌓아줘
직접 지정한 --actions 실행은 모델 사용 근거가 아닙니다. 웹의 agentcore 계획과 새 실행을 별도로 확인합니다. 모델이 다른 순서를 내면 그대로 실행해 성공으로 발표하지 않습니다.
5. Part 2·3의 다른 물리 작업 비교
다음 명령은 참가자 사본의 CPU에서 실행합니다. 같은 seed로 시연을 바꾸면 초기 구조와 목표, 접촉 방식이 어떻게 달라지는지 비교할 수 있습니다.
cd "$ROBOT_LAB"
for ROBOT_SCENARIO in lineup kit pyramid unstack restock push; do
.venv/bin/python -m simulation.cli \
--scenario "$ROBOT_SCENARIO" --seed 314 \
--output ".local/evidence/extension/$ROBOT_SCENARIO-314.json"
done
피라미드는 아래 두 상자와 위 상자의 지지를, 타워 해체는 위에서 아래 순서를 확인합니다. 밀기는 들어 올리는 동작과 구분하며 손가락 접촉, 수평 이동, 최종 분리와 안정성을 확인합니다.
.venv/bin/python - <<'PY'
import json, math
from pathlib import Path
from shared.workcell import definition, normalize_actions, target_for_action
for scenario in ("lineup", "kit", "pyramid", "unstack", "restock", "push"):
r = json.loads(Path(f".local/evidence/extension/{scenario}-314.json").read_text())
assert r["engine"] == "MuJoCo" and r["scenario"] == scenario and r["seed"] == 314
assert r["status"] == "succeeded" and r["metrics"]["placed"] == r["metrics"]["total"] == 3
assert r["checks"] and all(c["passed"] for c in r["checks"])
actions = normalize_actions(scenario)
assert [s["objectId"] for s in r["steps"]] == [a["objectId"] for a in actions]
first, final = r["frames"][0]["bodies"], r["frames"][-1]["bodies"]
for index, action in enumerate(actions):
name = action["objectId"]
target = target_for_action(scenario, actions, index)
assert math.dist(final[name]["position"], target) < definition(scenario)["positionTolerance"]
if scenario == "push":
start_z = first[name]["position"][2]
assert max(f["bodies"][name]["position"][2] - start_z for f in r["frames"]) < 0.02
assert math.dist(first[name]["position"][:2], final[name]["position"][:2]) > 0.2
print(scenario, r["metrics"])
PY
웹에서는 Part 2·3을 선택해 같은 시연을 재생하고 AI 계획과 새 실행도 비교합니다.
unstack에서 아래 상자를 먼저 집거나 pyramid를 두 상자로 만들라는 계획은
허용하지 않습니다. 명령이 거부되는 이유도 작업 순서와 지지 조건으로 설명합니다.
GPU 결과는 15장의 별도 Isaac 실행 절차로 확인합니다.
6. 회귀 검사와 게시 범위
npm test
npm run build
.venv/bin/python -m unittest discover -s agent/tests -v
.venv/bin/python -m unittest discover -s tests/simulation -v
테스트 코드를 확장한다면 참가자 app의 테스트에 새 순서·배치와 최종 pose 검사를 추가합니다. source의 허용 목록과 물리 성공 판정을 완화하지 않습니다. 생성한 JSON은 .local/evidence/extension/에 두며 기본 공개 기록을 덮어쓰지 않습니다.
애플리케이션 코드를 수정한 경우에만 새 release로 빌드·게시·검사한 뒤 AgentCore/App 변경 세트를 검토합니다. 로컬 테스트 통과가 자동 배포를 뜻하지 않습니다. 실제 배포는 05장, 06장, 07장의 본인 manifest 절차를 사용하고 11장을 다시 검증합니다.
새 물체나 엔진을 추가하려면
새 물체는 mesh·질량·관성·충돌 형상·마찰·도달 범위·목적지와 양쪽 계획 검증기를 함께 바꾸어야 합니다. 새 엔진은 결과의 engine·provenance·단위·성공 판정도 구별해야 합니다. Isaac Sim 확장은 별도 GPU 트랙에서 다루며, 이 장의 MuJoCo 테스트를 그 엔진의 검증으로 대체하지 않습니다.
실패 시 재개
| 증상 | 확인 |
|---|---|
| Node만 새 ID를 수락 | Python toolkit·시뮬레이터와 계약 불일치 |
| 중간 잡기는 성공, 마지막 상태 실패 | 놓은 뒤 위치·지지·직립·정지 판정 |
| 힘 0인데 성공 | 실제 접촉, 물체 위치 직접 대입·부착 여부, 테스트 약화 여부 |
| 기록 재생 방향 오류 | 미터·Z-up·quaternion XYZW와 body 이름 |
| 새 이미지가 이전 manifest와 불일치 | 새 release로 전체 빌드·게시·검사 |
완료 체크리스트
- 새 순서·배치로 실제 물리 실행과 최종 pose를 확인했습니다.
- 그리퍼 힘 0에서 실패 JSON과 종료 코드를 확인했습니다.
- 직접 action 실행과 모델이 생성한 계획을 구분했습니다.
- 회귀 검사와 실제 게시 여부를 따로 기록했습니다.
- 자유 물체의 이동을 attachment·teleport·키프레임으로 대체하지 않았습니다.
AI CLI 카드: 12. 확장 · 다음: 13. 정리
AI CLI 프롬프트 카드
아래 프롬프트를 복사해 실습 EC2에서 선택한 Codex, Kiro CLI, Claude Code의 대화 입력창에 붙여넣습니다. Markdown 카드 다운로드
선택한 AI CLI의 대화 입력창에 붙여넣으세요. 세 도구가 같은 프롬프트를 사용합니다.
Robot Atlas 워크숍 12장을 진행하세요.
ROBOT_REPO/workshop/chapters/12-extend-scenarios.md를 읽고 ROBOT_LAB만 수정하세요.
목표:
- 기존 objectId/target 범위 안에서 주황→파랑→빨강, seed 314의 tower 실행을 검증합니다.
- 실제 MuJoCo 결과의 각 높이, 정지 상태, support/release/accuracy 체크를 확인합니다.
- grip-force 0에서 종료 코드 1뿐 아니라 failed JSON·placed 0·실패 체크도 확인합니다.
- 동일 순서를 요청한 실제 agentcore 계획과 직접 --actions 실험을 구분합니다.
- Part 2의 lineup/kit/pyramid와 Part 3의 unstack/restock/push를 seed 314로 실행하고 초기·최종 pose를 비교합니다.
- 피라미드의 두 받침 지지, 해체의 위에서 아래 순서, 밀기의 수평 접촉과 비들어올림 조건을 확인합니다.
- shared/workcells.json의 초기 배치·목표·정책이 계획 검증기와 물리 엔진·화면에 일치하는지 확인합니다.
- 테스트를 추가한다면 본인 app에서 새 순서/seed와 최종 물리 상태를 검사하세요.
- 변경 후 Node/Agent/MuJoCo 회귀 검사를 실행합니다.
물리 경계:
자유 물체 위치는 초기화 이후 MuJoCo 접촉·힘·중력으로만 진행합니다.
weld/attachment, 위치 순간이동, 성공 키프레임, unconditional success로 대체하지 마세요.
잡기 실패, 마찰 없는 손가락, 놓은 뒤 밀려난 물체의 실패 판정을 유지하세요.
좌표는 미터·Z-up, quaternion은 XYZW입니다.
범위:
새 물체 ID나 엔진 추가는 별도 계약 설계이며 이 요청에서 임의로 확장하지 마세요.
shared, agent toolkit/검증, simulation, replay 사이의 일치를 확인하세요.
실습 JSON은 .local/evidence/extension에 두고 기본 공개 기록을 덮어쓰지 마세요.
물리 또는 계약 오류를 seed 선택이나 허용 목록 완화로 감추지 마세요.
Isaac Sim/EKS 구현은 별도 트랙이며 이 MuJoCo 테스트로 그 성공을 주장하지 마세요.
운영 루트·다른 참가자·기존 AWS 자원은 변경하지 마세요.
배포가 요청된 경우에만 새 release→게시→검사→본인 변경 세트 순서로 진행하세요.
변경 파일, 실험 명령과 종료 상태, 물리 근거, 모델 검증 여부, 미검증 범위를 보고하세요.
읽기 기록
읽음 표시는 이 브라우저에만 저장됩니다.
실제 실습 결과는 터미널에서 확인하세요.