Duckbert 걸음 시뮬레이션
서보 6개짜리 작은 2족 로봇은 숫자 열여덟 개로 걷습니다. 숫자를 바꿔 걸려 보고, "걸음 찾기"로 컴퓨터가 수십 번 걸어 보며 더 멀리 가는 숫자를 찾게 해 보세요. 설치도 로봇도 필요 없습니다.
▲를 누르고 있으면 걷습니다(키보드 W·A·S·D 또는 화살표). 끌면 시점이 돌고, 휠로 확대합니다. 주황 선은 몸통이 지나온 길, 바닥 칸은 10 cm입니다.
걸음 숫자 원작 제어기의 숫자 18개 · 바꾸면 바로 걸음이 달라집니다
걸음 찾기 컴퓨터가 시행착오로 찾기
더 좋아서 남긴 시도 버린 시도 넘어진 시도 지금까지 가장 좋은 점수
서보 6개 점 = 지금 각도, 막대 = 제어기가 보낸 목표
안에서 일어나는 일
- 물리: MuJoCo 물리 엔진이 웹어셈블리로 브라우저에서 1초에 500번 계산합니다. 중력, 발바닥과 바닥의 마찰, 서보의 힘 한계(약 0.2 N·m)를 셈합니다.
- 제어기: 1초에 50번, 사인 곡선 몇 개로 서보 6개의 목표 각도를 냅니다. 몸을 옆으로 흔들어 한 발에 무게를 싣고, 반대 발을 들어 앞으로 옮깁니다.
- 서보의 한계: SG90은 60°를 도는 데 약 0.1초가 걸립니다. 제어기가 더 빨리 돌라고 해도 그만큼만 따라갑니다.
- 걸음 찾기: 지금 숫자 한두 개를 조금 바꿔 화면 없이 8초를 걸려 보고, 더 멀리 가면 남기고 아니면 버립니다(언덕 오르기). 사람이 짐작한 "처음 걸음"은 넘어지지만, 찾기를 하면 걷는 숫자가 나옵니다.
- 발목이 없어서 생기는 일: 엉덩이와 무릎만 있으니 다리를 흔들면 발바닥도 기웁니다. "발바닥 수평 맞추기"는 무릎을 반대로 돌려 이것을 메웁니다. 이 걸음은 뒤로는 잘 못 갑니다. 뒤로 가는 걸음을 찾는 것이 도전 과제입니다.
이 시뮬레이션을 쓰는 차시 엔스크린 제안
| 차시 | 활동 |
|---|---|
| 1 | "원작 걸음"으로 조종해 보기 · 서보 막대로 다리마다 무엇이 움직이는지 관찰 |
| 2 | "흔들기 없음"에서 시작해 숫자 하나씩 살려 보며 무엇이 걸음을 만드는지 찾기 (주기·흔들기·균형 되먹임) |
| 3 | 걸음 찾기 40번 → 점수 그래프 읽기 (언덕 오르기, 버린 시도와 남긴 시도) |
| 4 | 점수 규칙 토론: 멀리 가기만 보면 생기는 일(옆으로 새기, 비틀거림) |
| 5 | 도전: 뒤로 가는 걸음 · 제자리 돌기 걸음 찾기, 조별 숫자 비교 |
| 6 | (실물이 있으면) 같은 숫자로 실제 로봇 걸려 보고 시뮬레이션과 다른 점 기록 (sim2real) |
지금 보이는 것은 원작입니다. 로봇 모델(robot.xml)·CAD 메시·걸음 숫자(gaits.json의 v11_walk)·걸음 제어기(simulation.js)는 Thinking Things의 duckbert 저장소(커밋 b266ca6, 2026-09-24)를 고치지 않고 그대로 씁니다. 원작 저장소에 CAD·제어기 라이선스 표기가 없어 원작자 허락 전 내부 검토용이며, 배포할 때는 엔스크린 개념 모델로 바꿉니다. 엔스크린이 더한 것은 화면, 한국어 숫자판, 걸음 찾기(언덕 오르기), 서보 막대입니다. 숫자 18개의 이름은 엔스크린이 제어기 코드를 읽고 붙였습니다.
배포용 엔스크린 개념 모델: 이 시뮬레이터의 로봇은 엔스크린이 만든 개념 모델입니다. 원작 Duckbert(Thinking Things, GitHub 저장소)가 공개한 치수(관절 위치, 발바닥 54×41 mm, 무게중심 높이 약 99 mm, 몸통 약 250 g)와 관절 구성(SG90 6개)만 참고했고, 모양·물리 모델·걸음 제어기·걸음 찾기 코드는 모두 새로 작성했습니다. 원작 저장소에는 CAD와 제어기에 대한 라이선스 표기가 없어 원작 메시와 코드는 쓰지 않았습니다. 물리 엔진 MuJoCo(Apache-2.0)와 three.js(MIT)를 우리 서버에서 불러오며, 외부 서버와 연결하지 않습니다.
그래서 걸음 숫자와 속도는 실물·원작 시뮬레이션과 다릅니다(이 모델에서 찾은 걸음은 약 12 cm/s). 원작자의 공식 브라우저 시뮬레이션은 여기에서 볼 수 있습니다.