2026-09-01
환경 구축과 첫 실행
rsl-rl 5.0.1속도추종 평지 과제로 스모크 5회 + 1시간 연속. 환경 수와 처리량 한계 측정.
Training Log
작은 이족보행 로봇을 시뮬레이터 안에서 걷고, 앉았다 일어서고, 뛰어오르게 만들려고 9일 동안 한 일의 기록입니다.
성공한 것보다 실패한 것이 많습니다. 그대로 적었습니다. 같은 걸 시도하는 분이 같은 벽에 다시 부딪히지 않도록, 무엇을 했고 무엇이 나왔는지와 어떤 측정이 틀렸는지를 함께 남깁니다. 원자료와 체크포인트는 싣지 않았습니다.
왜 WSL2인가. 취향이 아닙니다. 상위 저장소의 잠금파일이 CUDA 의존성을 리눅스에만 걸어두어, 네이티브 윈도우에 설치하면 CPU 전용 파이토치로 해석되고 GPU 선택 단계에서 죽습니다. 저장소는 WSL 파일시스템 안에 두어야 합니다. /mnt/c에 두면 파일 입출력이 크게 느려집니다.
전 과제가 같은 뼈대를 씁니다. PPO 하나로만 돌렸고, 구현은 rsl-rl 5.0.1, 환경은 mjlab의 매니저 기반 구성입니다. 오프폴리시나 모방학습은 쓰지 않았습니다.
| 항목 | 값 | 항목 | 값 |
|---|---|---|---|
| 알고리즘 | PPO (비대칭 액터-크리틱) | 할인율 | 0.99 |
| 액터 관측 | 61차원 | GAE λ | 0.95 |
| 크리틱 관측 | 76차원 (특권 상태 포함) | 클립 | 0.2 |
| 액터망 | 61→512→256→128→14, ELU | 엔트로피 계수 | 0.01 |
| 크리틱망 | 76→512→256→128→1, ELU | 학습률 | 1e-3, 적응형 |
| 행동 분포 | 가우시안, 스칼라 표준편차 (초기 1.0) | 목표 KL | 0.01 |
| 환경당 스텝 | 24 | 에폭 / 미니배치 | 5 / 4 |
관측은 고유수용 감각(각속도·중력투영·관절 위치·관절 속도·직전 행동)과 명령(속도 3, 머리 자세 4, 몸통 자세 6)으로 구성됩니다. 높이 스캔이 없습니다. 험지에서 정책은 지면을 못 보고 몸으로 느낀 외란만으로 추론합니다.
도메인 무작위화는 세 시점에 겁니다. 시작 시점에 마찰·엔코더 편향·질량중심·관성, 초기화 시점에 질량중심·관절 마찰·아마추어·자세, 주기적으로 외부 밀기입니다. 커리큘럼 항은 일곱 개이고 전부 2,000회차에서 끝납니다. 그 뒤로는 과제가 고정됩니다.
보상은 보행 과제 기준 15개 항입니다. 낙상 벌점도 종료 벌점도 없습니다. 점프 과제에만 낙상 벌점 −500을 따로 넣었습니다. 이 차이가 뒤에 나오는 두 실패를 갈랐습니다.
2026-09-01
rsl-rl 5.0.12026-09-02
Mjlab-Velocity-Flat / -Rough2026-09-03
Mjlab-Stairs-Rough-MicroDuck · Mjlab-SitStand-Flat-MicroDuckevaluate_squat.py(128환경 스크립트 프로토콜).2026-09-04
Mjlab-Jump-Stand-MicroDuck v1·v2 · Mjlab-Jump-Run-MicroDuck v2jump_stand_run.sh(환경변수 TASK/TAG/LOAD_RUN/LOAD_CK/ITERS). 점프 신호는 JumpTriggerCommand.2026-09-05
Jump-Stand-v3·v4 · Jump-Run-v3·v4 · Mjlab-Land-Flat-MicroDuck(준비)2026-09-06
lab_vision/에 단안 RGB 학생 관측군 추가(누출 감사 포함).2026-09-08
수정 전 · 09-06
수정 후 · 09-08학생 정책이 실제로 받던 64×48 RGB 관측입니다. 왼쪽은 껍데기 안쪽을 보고 있던 상태입니다.
StandUp-Flat 착수2026-09-09
StandUp-Flat 5,000회차 결과recov_eval.sh 체인. 넘어진 자세를 고정 조건으로 지정하고 일어서서 버티는 것까지 성공으로 셈. 채점기 수정 후 원자료는 그대로 두고 재채점 도구를 따로 만듦.1 · 한 번의 학습 실행 — 스크립트 하나가 학습부터 평가·영상·기록까지 이어서 돌립니다. 빨간 지점이 실제로 끊겼던 곳입니다.
flowchart TD A["jump_stand_run.sh<br/>TASK · TAG · LOAD_RUN · LOAD_CK · ITERS"] --> B["mjlab 환경 조립<br/>관측·보상·이벤트·커리큘럼 매니저"] B --> C["rsl-rl PPO 학습<br/>2048 환경 × 24 스텝"] C --> D["체크포인트 250회마다<br/>model_N.pt"] C --> E["TensorBoard 이벤트"] D --> F["ONNX 내보내기<br/>정규화기 포함"] D --> G["평가기<br/>신호 1536회 · 고정 조건"] G --> H["결과 CSV · 매니페스트"] D --> I["재생 영상 녹화"] H --> J["보고서 · 일지 항목"] I --> J C -. "세션 종료 시 사망" .-> X1["학습 중단<br/>13205 · 6512 회차"] C -. "실행 중 스크립트 덮어씀" .-> X2["후처리 전체 유실"] style X1 fill:#f6e5e5,stroke:#a33f3f style X2 fill:#f6e5e5,stroke:#a33f3f
2 · 비대칭 액터-크리틱 — 크리틱만 특권 정보를 봅니다. 실기에 올라가는 것은 액터뿐이라, 액터 관측에 시뮬레이터 전용 값이 섞이면 배포가 불가능해집니다.
flowchart LR
subgraph OBS["관측"]
direction TB
P["고유수용 48<br/>각속도 3 · 중력투영 3<br/>관절위치 14 · 관절속도 14<br/>직전행동 14"]
C2["명령 13<br/>속도 3 · 머리자세 4 · 몸통자세 6"]
PR["특권 15<br/>시뮬레이터 전용"]
end
P --> AC["액터 61<br/>512-256-128 ELU"]
C2 --> AC
P --> CR["크리틱 76<br/>512-256-128 ELU"]
C2 --> CR
PR --> CR
AC --> ACT["행동 14<br/>가우시안 · 스칼라 표준편차"]
CR --> V["가치 1"]
ACT --> ONNX["ONNX 내보내기<br/>실기 배포"]
V -. "학습에만 사용" .-> PPO["PPO 업데이트"]
ACT --> PPO
style PR fill:#f8f1e8,stroke:#a8642a
style ONNX fill:#eaf0ea,stroke:#2f7d5a
3 · 커리큘럼이 끝나는 시점 — 일곱 개 커리큘럼 항이 전부 2,000회차에서 최종 단계에 도달합니다. 그 뒤로 과제는 고정입니다. 후반 퇴행을 해석할 때 이 경계가 중요합니다.
flowchart LR S["0 회차<br/>학습 시작"] --> R["램프 구간<br/>0 to 2000<br/>머리자세 5단계 · 질량중심 ±15mm<br/>행동변화율 · 정지환경 비율"] R --> F["2000 회차<br/>모든 커리큘럼 종료"] F --> ST["고정 과제 구간<br/>2000 이후"] ST --> REG["6000 회차 퇴행<br/>낙상률 34 to 38 퍼센트"] REG --> Q["과제는 안 변했는데 왜 나빠지나<br/>낙상 벌점이 없어서 넘어져도 손해가 없다"] style REG fill:#f6e5e5,stroke:#a33f3f style Q fill:#f8f1e8,stroke:#a8642a
4 · 점프를 배웠다가 버린 구조 — 이 프로젝트에서 가장 중요한 인과입니다. 보상 설계가 만든 국소 최적입니다.
flowchart TD T["점프 과제<br/>낙상 벌점 -500 고정"] --> E1["탐색 초기<br/>뛰면 거의 항상 넘어진다"] E1 --> R1["기대 보상<br/>뛴다 = 큰 음수"] E1 --> R2["기대 보상<br/>안 뛴다 = 0 근처"] R1 --> D["정책 선택<br/>안 뛰는 쪽이 이득"] R2 --> D D --> EN["엔트로피 붕괴<br/>14차원에서 -10.2<br/>탐색이 죽는다"] EN --> N["오래 돌려도 새 동작이 안 나온다"] T --> O["관측된 실제 궤적"] O --> O1["17798 회차 뛰기 시작"] O1 --> O2["18551 회차 다시 안 뛰기로 후퇴"] N --> FIX["처방"] O2 --> FIX FIX --> F1["착지를 먼저 가르친다"] FIX --> F2["벌점을 0에서 단계적으로 올린다"] FIX --> F3["초기에 위로 당기는 보조력을 주고 줄인다"] style D fill:#f6e5e5,stroke:#a33f3f style EN fill:#f6e5e5,stroke:#a33f3f style FIX fill:#eaf0ea,stroke:#2f7d5a
| 정책 | 깨끗한 점프 | 신호당 낙상 | 평균 상승 | 최대 |
|---|---|---|---|---|
| 대조군 (평지 보행) | 약 6% | 0.3% | 0.5 cm | 1.2 cm |
| 달리기 점프 2판 | 11% | 0.9% | 0.63 cm | 3.6 cm |
| 달리기 점프 3판 | 17% | 0.3% | 1.00 cm | 4.1 cm |
| 제자리 점프 1~4판 | 대조군 수준. 유의미한 도약 없음 | |||
신호 1,536회 기준. 달리기 점프 3판은 주행 조건에서 22%, 최대 4.7cm까지 올라갔습니다.
평지 보행, 6,000회차. 기준선이 되는 정책입니다.
앉았다 일어서기, 8,000회차. 내려갈 때 넘어지는 경향이 보입니다.
달리기 점프 3판, 16,000회차. 가장 높이 뛴 정책입니다.
아래는 전부 한동안 사실이라고 믿었던 틀린 숫자들입니다. 논문의 방법론은 무엇이 잘못됐는지 적은 만큼만 믿을 수 있습니다.
except가 오류를 먹고 있었습니다. 예외는 치명적으로 처리하십시오.2026-09-05에 사용자 요청으로 학습을 일시 중지했고, 이후 평가와 시각 경로 정비, 기립 과제를 진행했습니다. 달리기 점프 4판은 17,250회차에서 멈춰 있습니다. 다음 단계는 착지 과제를 먼저 학습한 뒤 낙상 벌점을 단계적으로 올리는 커리큘럼입니다. 기준 궤적이 물리적으로 뜬다는 것은 확인했으므로, 남은 문제는 뛰는 법이 아니라 내려앉는 법입니다.