← BlogAMR 내비게이션 입문· 1/12

Occupancy Grid란 무엇인가 — 센서가 본 세계를 격자로 그리는 법

자율주행 로봇이 환경을 '벽/빈공간/미지'의 2D 확률 격자로 표현하는 occupancy grid의 기본 개념과, imSim이 환경을 만들 때 이 격자를 자동 생성하는 방법.

약 3분
Nav2mappingoccupancy-gridAMRrobotics-basics

Occupancy Grid란 무엇인가

자율주행 로봇(AMR)이 복도를 돌아다니려면 가장 먼저 답해야 할 질문이 있습니다. "여기는 벽인가, 빈 공간인가?" 사람은 눈으로 보면 끝이지만, 로봇은 이 세계를 숫자로 가지고 있어야 합니다. 그 가장 기본적인 표현이 occupancy grid(점유 격자) 입니다.

세계를 격자로 쪼갠다

occupancy grid는 환경을 일정한 크기(예: 5cm)의 정사각형 셀로 나눈 2D 지도입니다. 각 셀은 세 가지 상태 중 하나를 가집니다.

  • 점유(occupied) — 벽, 선반, 장애물이 있는 곳
  • 자유(free) — 로봇이 지나갈 수 있는 빈 공간
  • 미지(unknown) — 센서가 아직 관측하지 못한 곳
도식 렌더링 중…

엄밀히는 각 셀이 0~1 사이의 점유 확률을 가집니다. SLAM으로 지도를 만들 때는 센서가 같은 셀을 여러 번 관측하면서 이 확률을 갱신하지만, 핵심 직관은 단순합니다 — 연속된 현실 세계를 "지나갈 수 있는 칸/없는 칸"의 바둑판으로 바꾼 것입니다.

아래는 작은 창고를 격자로 표현한 모습입니다(■=벽/선반, ·=자유공간):

■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ · · · · · · · · ■
■ · ■ ■ · · ■ ■ · ■
■ · ■ ■ · · ■ ■ · ■     ← 선반 두 줄
■ · · · · · · · · ■
■ · · · ▣ · · · · ■     ← ▣ = 로봇 현재 위치
■ ■ ■ ■ ■ ■ ■ ■ ■ ■

확률 갱신은 log-odds로 하면 곱셈이 덧셈이 됩니다 — 관측마다 한 번씩.

# 센서가 같은 셀을 관측할 때마다 점유 확률 갱신 (log-odds)
def update_cell(log_odds, hit):
    l_occ, l_free = 0.85, -0.4          # 관측당 증감
    log_odds += l_occ if hit else l_free
    return clamp(log_odds, -5, 5)       # 발산 방지

def is_occupied(log_odds):
    return 1 / (1 + exp(-log_odds)) > 0.65   # 확률 → 점유 판정

왜 격자여야 하는가

격자(grid) 표현이 로봇 내비게이션의 표준이 된 이유는 계산하기 쉽기 때문입니다.

  • 경로 계획기(A*, Dijkstra)가 "셀 → 인접 셀" 그래프 위에서 최단 경로를 바로 풉니다
  • 장애물 주변에 안전 여유(inflation)를 셀 단위로 깔 수 있습니다
  • 센서 업데이트가 "이 셀의 확률을 올린다/내린다"로 국소화됩니다

이 occupancy grid가 바로 다음 단계인 static map → Nav2 costmap의 원천이 됩니다(다음 글에서 다룹니다).

imSim은 어떻게 만드나 — 환경과 함께 자동 생성

실제 로봇은 LiDAR로 SLAM을 돌려 격자를 만들지만, 시뮬레이션에서는 환경의 정답(ground truth)을 이미 알고 있습니다. imSim은 절차적 환경을 생성하는 단계에서 씬(USD)의 모든 asset 경계(bounding box)를 읽어 occupancy grid를 자동으로 만들어 둡니다 — 환경과 격자가 한 묶음으로 생성됩니다.

도식 렌더링 중…
  • 생성 시점: 환경을 만들 때 asset 경계를 셀 단위로 래스터화해 격자를 함께 산출합니다
  • 실행 시점: 런을 시작하기 전에 격자가 준비돼 있는지 한 번 더 보장하는 단계를 둡니다
  • 격자 데이터: 격자 배열 + resolution(셀 크기) + origin(월드 좌표 기준점)을 담습니다

이렇게 만들어진 격자가 있어야 로봇이 "벽을 아는" 상태로 주행을 시작할 수 있습니다. 만약 이 격자가 비어 있거나 전부 free인 빈 지도(empty map)로 대체되면, 로봇은 벽을 모른 채 길이 아닌 곳으로 직진합니다 — 이건 실제로 우리가 겪었던 회귀 버그이고, 다음 글에서 다룹니다.

한 줄 정리

📌 Occupancy grid = 연속된 현실을 "지나갈 수 있는 칸 / 없는 칸"의 확률 바둑판으로 바꾼 것. 모든 로봇 내비게이션(경로계획·회피·안전여유)이 이 격자 위에서 일어난다. imSim은 시뮬 환경의 ground truth로부터 이 격자를 자동 생성한다.