로보틱스 · 창고 로봇 플릿(Goods-to-Person)
로봇은 적게, 처리량은 많이
수백 대의 창고 로봇을 브라우저에서 실시간으로 계획합니다. 로봇을 더할수록 오히려 처리량이 줄기 시작하는 플릿 규모를 찾아보세요.
개요
Goods-to-Person 방식 창고 로봇을 위한 트래픽 플래너로, 브라우저에서 실행됩니다. 시뮬레이션된 그리드 로봇 최대 400대가 끊임없이 새 작업을 받습니다. 보관 포드를 가져와 피킹 스테이션 16곳 중 한 곳으로 옮기고, 피킹이 끝날 때까지 기다린 뒤 다음 포드를 가지러 갑니다. 설계상 충돌이 일어나지 않으며, 시드를 고정한 4,775회 실행에서 교착 상태는 한 번도 없었습니다. 처리량이 더 이상 오르지 않을 때까지 로봇을 추가한 다음, 통로에 일방통행 방향을 칠해 보세요. 플래너는 이 방향을 강제하지 않고 가중치로 반영합니다. 곡선의 정점이 움직이는 모습을 확인할 수 있습니다.
저희 플로어에서 이 플래너와 평균 피킹 시간 6초 조건으로 실행하면, 처리량은 시간당 약 5,134회의 포드 제시에서 정점에 이릅니다. 정점은 평평합니다. 로봇 196대에서 235대까지는 어느 규모든 최고치와의 차이가 0.5% 이내이며, 평활화한 곡선은 214대에서 정점을 찍습니다. 그 이후로는 로봇이 한 대 늘 때마다 처리량이 줄고, 감소 폭도 점점 커집니다. 정점 직후에는 로봇 한 대당 시간당 약 1회, 250대 부근에서는 대당 약 4회, 400대 근처에서는 대당 약 7회씩 줄어듭니다. 로봇 400대에서는 처리량이 최고치보다 20.5% 낮고, 이동 중인 로봇의 48%가 8초 전보다 목표에 조금도 가까워지지 않습니다.
통로에 일방통행 방향을 규칙이 아닌 선호로 칠하면, 같은 플로어가 로봇 191대로 시간당 6,439회의 포드 제시에서 정점에 이릅니다. 로봇은 23대 적은데 처리량은 25.4% 많습니다. 기준선은 단일 차로 통로의 양방향 통행으로, 실제 레이아웃에서는 피하는 구성이므로 개선은 예상된 결과입니다. 흥미로운 부분은 개선이 멈추는 지점입니다. 피킹이 포드당 24초로 느려지면 스테이션이 한계를 결정하고, 방향 표시는 처리량을 어느 쪽으로든 최대 2.5%밖에 움직이지 못합니다.
이 수치는 이 플래너를 적용한 그리드 모델에서의 결과입니다. 로봇은 동기식 스텝(lockstep)으로 초당 1 m 셀 하나씩 이동하고, 앞 로봇에 바짝 붙어 따라갈 수 있으며, 가속이나 회전에 걸리는 시간이 없습니다. 보관 블록은 통과할 수 없고(로봇이 그 아래로 지나가지 않음), 포드 반납은 다음 포드 가져오기에 포함되어 있으며, 스테이션에는 대기 차로가 없습니다. 최적 플릿 규모에서 플로어는 약 40%가 로봇으로 차 있어, 실제 플릿이 운영되는 밀도보다 훨씬 조밀합니다. 이 수치는 그렇게 바짝 붙어 따라가는 동작에 기대고 있습니다. 간격을 유지하는 플래너 변형(다른 로봇이 셀을 떠나는 바로 그 초에는 그 셀로 들어갈 수 없음)에서는, 실행해 본 최적 플릿 규모가 로봇 80대, 시간당 약 1,880회였고, 로봇 160대에 이르면 완전한 정체(그리드락)에 빠졌습니다(점당 시드 고정 실행 10회). 실제 플릿은 더 일찍 정체되며, 다른 플래너라면 정점의 위치가 달라집니다.
구현 내용
- PIBT(백트래킹을 동반한 우선순위 상속, Okumura 외)에 기반한 lifelong 다중 로봇 플래너로, 논문을 바탕으로 직접 구현했습니다. 브라우저의 Web Worker에서 실행되며, 이 페이지의 주요 수치를 낸 모든 시뮬레이션도 같은 플래너 코드로 실행했습니다.
- 소프트 일방통행 통로: 칠한 방향은 무방향 그리드 위의 가중치가 됩니다. 역방향 이동에는 1스텝 대신 3스텝의 비용이 들기 때문에, 우회로가 더 길거나 다른 로봇에게 공간이 필요할 때는 로봇이 여전히 역방향으로 이동합니다. 맵 편집기는 셀을 막거나 여는 편집 가운데, 어떤 루프에도 속하지 않는 통로를 남기는 편집을 거부합니다. 이는 PIBT의 도달 가능성 증명에 필요한 조건이며, 브리지 탐색 단계로 검사합니다.
- 무작위 보류를 포함한 동기식 스텝(lockstep) 실행. 매초 모든 로봇이 움직이기 전에 계획된 이동의 1%를 무작위로 보류하고, 보류된 로봇 뒤에 줄 선 로봇도 함께 보류합니다. 따라서 어떤 로봇도 점유된 셀로 이동하지 않습니다. 독립 검사기가 모든 스텝을 검증합니다.
- 포드마다 피킹 시간을 무작위로 추출하는 피킹 스테이션(감마 분포). 라이브 뷰에서는 평균을 3, 6, 12, 24초 중에서 고를 수 있습니다.
- 시드를 고정한 한 시간 실행 4,740회의 스윕: 메인 플로어에서 로봇 20~400대, 그리고 검증용으로 더 큰 플로어. 모든 점에 95% 신뢰 대역이 있고, 정점에는 부트스트랩 구간이 있습니다.
기술 스택
Web Worker에서 실행되는 JavaScript(ES modules) · three.js · 스윕용 Node.js worker threads · 통계용 Python과 NumPy
주요 수치
| 수치 | 측정 방법 |
|---|---|
| 시간당 5,134회 | 처리량 곡선의 정점입니다(양방향 통로, 평균 피킹 시간 6 s). 피킹 스테이션에 포드 하나가 제시되면 한 번의 제시로 세고, 그리드 한 스텝은 1초로 계산합니다. 로봇 20~400대로 시드를 고정한 한 시간 실행 1,400회에 적합한 평활 곡선(LOESS)의 최댓값입니다(95% 구간 5,130~5,139). |
| 로봇 196~235대 | 평평한 정점 구간입니다. 이 범위의 모든 플릿 규모가 최고치의 0.5% 이내입니다. 평활 곡선은 로봇 214대에서 정점을 찍으며(부트스트랩 구간 213~216), 평활화 폭을 달리하면 이 점이 212~216 사이에서 움직입니다. |
| 로봇당 −1 → −7 | 로봇을 한 대 추가할 때마다 줄어드는 처리량으로, 적합 곡선에서 구했으며 95% 부트스트랩 구간을 함께 표시했습니다.
|
| −20.5% | 같은 적합 곡선에서, 정점 대비 로봇 400대일 때의 처리량(시간당 4,080회)입니다. |
| +25.4% | 일방통행 방향을 칠한 통로가 정점에서 낸 개선으로, 로봇 191대에서 시간당 6,439회입니다. 같은 플로어와 설정으로 별도의 시드 고정 실행 1,400회에서 측정했으며, 95% 부트스트랩 구간은 25.3~25.5%입니다. |
| 2.5% 이내 | 피킹 시간이 24 s이면, 모든 플릿 규모에서 방향을 칠한 플로어와 칠하지 않은 플로어의 차이가 2.5% 이내입니다(점당 시드 고정 실행 10회). 스테이션 16곳이 처리량 상한을 시간당 2,400회로 제한합니다. |
| 35% → 48% | 로봇 214대와 400대에서, 이동 중인 로봇 가운데 8 s 전보다 목표에 가까워지지 않은 비율입니다(양방향 통로, 각각 시드 고정 한 시간 실행 10회). 영상과 라이브 뷰에서 회색 타일로 표시됩니다. |
| 충돌 0건 | 시드 고정 실행 4,775회(시뮬레이션 스텝 2,120만 회, 계획된 이동의 0~5%를 무작위 보류)에서, 독립 검사기는 어느 스텝에서도 로봇이 셀을 공유하거나, 자리를 맞바꾸거나, 건너뛰는 경우를 발견하지 못했습니다. 플래너와 실행 규칙이 설계상 이를 배제합니다. |
| 4,775회 실행에서 교착 상태 0건 | 관측 결과이며, 증명된 것은 아닙니다. 10분 워밍업 이후, 피킹 완료 없이 5분이 지나간 실행은 하나도 없었습니다. 피킹 시간 6 s에서는 이동 중인 로봇이 111 s를 넘게 멈춰 있던 적이 없습니다. 피킹 시간 24 s에서 최악의 경우는 316 s로, 바쁜 스테이션 앞에서 대기하던 로봇이었습니다. 4,775회 실행에는 로봇 400대로 시뮬레이션 시간 10시간씩 돌린 실행 35회가 포함됩니다. |
| 0.11 ms | 로봇 400대 기준 스텝당 평균 계획 시간입니다(스윕 중, Apple M1 Pro 노트북의 Node.js). 같은 코드는 같은 노트북의 데스크톱 Chrome에서 스텝당 0.13~0.4 ms가 걸렸습니다. |
스틸 이미지
직접 실행해 보기
브라우저에서 실행되는 인터랙티브 뷰입니다. 열기 전에는 아무것도 불러오지 않습니다.