Skip to content
Published on

로봇의 눈 — 3D 인식과 SLAM

Authors

들어가며

사람은 눈을 뜨는 순간 별다른 노력 없이 방의 구조를 파악합니다. 책상이 어디에 있고, 문까지 몇 걸음이며, 컵이 손 닿는 거리에 있는지 즉각적으로 압니다. 그런데 로봇에게 이 일은 결코 당연하지 않습니다. 카메라가 주는 것은 픽셀의 격자, 즉 색깔 숫자의 배열일 뿐입니다. 여기서 "3차원 공간에서 나는 지금 어디에 있고, 주변에는 무엇이 있는가"라는 질문에 답하는 것이 바로 로봇 인식(perception)의 핵심입니다.

이 글에서는 로봇이 세상을 보는 방법을 단계별로 풀어냅니다. 먼저 어떤 센서로 깊이 정보를 얻는지 살펴보고, 그 데이터를 지도로 엮는 SLAM을 설명합니다. 이어서 포인트클라우드와 복셀 같은 3D 표현, 물체의 위치와 방향을 추정하는 6D 자세 추정, 딥러닝 기반 검출과 분할, 그리고 최근 각광받는 NeRF와 3D 가우시안 스플래팅이 로봇 인식에 어떤 의미가 있는지까지 다룹니다.

정확성을 우선하되, 개념을 직관적으로 잡을 수 있도록 다이어그램과 간단한 코드를 곁들이겠습니다.

왜 3D 인식이 어려운가

2D 이미지는 3D 세계를 평면에 투영한 결과입니다. 투영 과정에서 깊이 정보가 소실되기 때문에, 하나의 픽셀만 보고는 그 점이 카메라에서 얼마나 떨어져 있는지 알 수 없습니다. 이것을 원근의 모호성(depth ambiguity)이라고 부릅니다.

     세계(3D)                     이미지(2D)
   ┌───────────┐               ┌───────────┐
   │    ●  물체 A(가까움)  │  투영     │    ●      │
   │       ●  물체 B(멈) ──┼────────▶ │    ●      │  같은 픽셀 위치라도
   │                       │           │           │  깊이는 알 수 없음
   └───────────┘               └───────────┘
        카메라 광선 위의 모든 점이 하나의 픽셀로 겹침

깊이를 복원하려면 추가 정보가 필요합니다. 두 눈(스테레오)의 시차, 능동적으로 쏘는 빛의 왕복 시간, 혹은 학습된 사전 지식(단안 깊이 추정) 등이 그 수단입니다. 로봇 인식은 결국 "잃어버린 차원을 되찾는" 작업이라고 요약할 수 있습니다.

깊이를 얻는 센서들

스테레오 카메라

사람의 두 눈처럼 일정 간격(baseline) 떨어진 두 카메라를 사용합니다. 같은 물체가 두 이미지에서 서로 다른 위치에 찍히는데, 이 차이를 시차(disparity)라고 하며 깊이에 반비례합니다.

깊이 Z = (초점거리 f x 기준선 B) / 시차 d

  좌카메라        우카메라
    │  \           /  │
    │   \         /   │
    │    \       /    │
    │     \  ●  /     │   ● 이 좌우 이미지에서
    │      \   /      │     찍히는 픽셀 위치 차이 = 시차 d
    └───B(기준선)───┘

시차가 클수록 물체가 가깝습니다. 계산량이 있고 텍스처 없는 벽 같은 곳에서는 대응점 찾기가 어렵다는 한계가 있지만, 수동(passive) 센서라 실외에서도 잘 동작합니다.

RGB-D 카메라

색(RGB)과 깊이(Depth)를 함께 제공하는 센서입니다. 대표적으로 구조광(structured light) 방식과 ToF(Time of Flight) 방식이 있습니다. 구조광은 알려진 무늬를 물체에 투사하고 그 왜곡을 읽어 깊이를 계산하고, ToF는 빛을 쏘아 되돌아오는 시간을 측정합니다.

RGB-D 출력 = 컬러 프레임 + 정렬된 깊이 프레임

  픽셀 (u, v) ──▶ 색 (R, G, B)
              └─▶ 깊이 Z (미터)

  카메라 내부 파라미터(intrinsics)로 3D 점 복원:
    X = (u - cx) * Z / fx
    Y = (v - cy) * Z / fy
    Z = Z

RGB-D는 실내에서 저렴하고 편리하지만, 강한 햇빛(적외선 간섭)이나 유리·거울 같은 표면에서 취약합니다.

LiDAR

레이저를 회전시키며 사방으로 쏘아, 각 방향에서 되돌아오는 시간으로 거리를 측정합니다. 결과는 매우 정밀한 3D 포인트클라우드입니다. 자율주행에서 널리 쓰이며, 조명 조건에 강하고 장거리 정확도가 높습니다. 대신 색 정보가 없고 상대적으로 비쌉니다.

센서깊이 원리장점한계
스테레오두 시점의 시차저렴, 실외 가능, 색 포함텍스처 없는 면 취약
RGB-D(구조광/ToF)능동광 투사/왕복시간실내 정밀, 색 포함햇빛·유리에 취약
LiDAR레이저 왕복시간장거리·고정밀, 조명 무관고가, 색 없음

실제 로봇은 이들을 조합해 서로의 약점을 보완합니다. 이를 센서 퓨전(sensor fusion)이라고 합니다.

SLAM — 동시적 위치추정과 지도작성

SLAM(Simultaneous Localization and Mapping)은 로봇이 미지의 환경을 돌아다니면서 동시에 두 가지를 푸는 문제입니다. 하나는 "지금 내가 어디 있는가"(위치추정, localization)이고, 다른 하나는 "주변이 어떻게 생겼는가"(지도작성, mapping)입니다.

문제는 이 둘이 닭과 달걀 관계라는 점입니다. 정확한 지도가 있으면 내 위치를 알 수 있고, 정확한 위치를 알면 지도를 그릴 수 있는데, 처음엔 둘 다 없습니다. SLAM은 이 두 추정을 동시에 최적화합니다.

SLAM 파이프라인

 센서 입력            프런트엔드                  백엔드
 ┌────────┐    ┌──────────────────┐    ┌──────────────────┐
 │ 카메라  │──▶ │ 특징 추출/매칭     │──▶ │ 자세 그래프 최적화  │
 │ LiDAR  │    │ 오도메트리 추정    │    │ 번들 조정(BA)      │
 │ IMU    │──▶ │ (프레임 간 이동)   │    │ 루프 클로저 반영    │
 └────────┘    └────────┬─────────┘    └────────┬─────────┘
                        │                        │
                        ▼                        ▼
                 ┌──────────────┐        ┌──────────────┐
                 │ 지역 지도 갱신 │◀──────│ 전역 지도 정합 │
                 └──────────────┘        └──────────────┘
                 루프 클로저 검출 ──▶ "여기 전에 왔던 곳" 인식 → 누적 오차 보정
  • 프런트엔드(front-end)는 연속된 프레임 사이의 상대 이동을 빠르게 추정합니다. 이를 시각 오도메트리(visual odometry)라고 하며, 매 프레임 조금씩 오차가 쌓입니다(drift).
  • 루프 클로저(loop closure)는 로봇이 예전에 방문한 장소로 돌아왔음을 인식하는 단계입니다. "이곳은 아까 그 복도다"라고 알아채면, 그동안 누적된 오차를 한꺼번에 보정할 단서가 생깁니다.
  • 백엔드(back-end)는 여러 시점의 자세를 하나의 큰 최적화 문제로 묶어 전역적으로 일관된 지도를 만듭니다. 번들 조정(bundle adjustment)과 자세 그래프 최적화(pose graph optimization)가 핵심 도구입니다.

오차 누적과 루프 클로저

시각 오도메트리만 쓰면 시간이 지날수록 위치 추정이 조금씩 어긋납니다. 100미터를 돌아 출발점에 왔는데 지도상으로는 몇 미터 떨어진 곳에 있는 식입니다. 루프 클로저는 이 불일치를 감지하고, 자세 그래프 전체를 다시 조정해 오차를 분산시킵니다.

루프 클로저 전                    루프 클로저 후
   시작 ●                          시작 ●
        \                              \
         \  (드리프트로               │  (오차가 경로 전체에
          \   벌어짐)                 │   고르게 분산됨)
           ● ← 실제로는 같은 곳       ● ← 정합됨

3D 표현 — 포인트클라우드, 복셀, occupancy

센서가 준 깊이를 로봇이 다루려면 적절한 자료구조로 표현해야 합니다.

포인트클라우드

3D 공간에 흩뿌려진 점들의 집합입니다. 각 점은 좌표 (x, y, z)와 때때로 색이나 반사강도를 가집니다. 가장 직접적인 표현이지만, 점의 개수가 방대하고 순서가 없으며(unordered) 밀도가 불균일하다는 특성이 있습니다.

import numpy as np

# 깊이 이미지를 포인트클라우드로 역투영
def depth_to_pointcloud(depth, fx, fy, cx, cy):
    h, w = depth.shape
    u, v = np.meshgrid(np.arange(w), np.arange(h))
    z = depth
    x = (u - cx) * z / fx
    y = (v - cy) * z / fy
    points = np.stack([x, y, z], axis=-1).reshape(-1, 3)
    # 깊이가 0인(무효) 점 제거
    valid = points[:, 2] > 0
    return points[valid]

복셀

3D 공간을 균일한 정육면체 격자로 나눈 표현입니다. 2D 픽셀의 3D 버전이라고 보면 됩니다. 규칙적이라 다루기 쉽지만, 해상도를 높이면 메모리가 세제곱으로 늘어납니다. 이 문제를 완화하기 위해 옥트리(octree) 기반의 옥토맵(OctoMap) 같은 계층적 구조가 쓰입니다.

Occupancy grid

각 격자 칸이 "점유됨/비어있음/미지"의 확률을 담는 지도입니다. 로봇 내비게이션에서 특히 유용한데, 어디로 지나갈 수 있는지를 직접 표현하기 때문입니다.

Occupancy grid (2D 슬라이스 예)
   . = 자유공간   # = 장애물   ? = 미탐색

   ? ? ? ? ? ? ?
   ? . . . # # ?
   ? . R . # . ?      R = 로봇 현재 위치
   ? . . . . . ?
   ? # # . . . ?
   ? ? ? ? ? ? ?
표현장점한계주 용도
포인트클라우드원본 충실, 정밀무질서·대용량정합, 재구성
복셀규칙적, 처리 쉬움메모리 세제곱 증가3D 딥러닝, 충돌검사
Occupancy주행가능성 직접 표현세밀한 형상 손실경로계획, 내비게이션

6D 자세 추정

물체를 집는 로봇(매니퓰레이션)에게는 물체가 화면 어디에 있는지(2D)만으로 부족합니다. 3차원 위치(x, y, z)와 3축 방향(roll, pitch, yaw)까지 알아야 손을 정확히 뻗을 수 있습니다. 이 6개의 자유도를 합쳐 6D 자세(6-DoF pose)라고 합니다.

6D 자세 = 위치 3 + 회전 3

        z
        │   ↺ yaw
        │  /
        │ /
        └──────── y
       /│
      / │  ↺ pitch
     x  │
        ↺ roll

  물체를 잡으려면: 어디에(위치) + 어느 방향으로(회전) 손을 놓을지 결정

접근 방식은 크게 두 갈래입니다. 알려진 3D 모델과 관측을 정합하는 방법(예: ICP, Iterative Closest Point)과, 딥러닝으로 이미지에서 자세를 직접 회귀하는 방법입니다. 실무에서는 딥러닝으로 초기 추정을 얻고 ICP로 정밀 보정하는 조합이 흔합니다.

딥러닝 기반 인식 — 검출과 분할

깊이와 형상을 알았다면, 다음은 "그게 무엇인지"를 아는 의미론적 인식입니다.

  • 객체 검출(detection): 이미지에서 물체를 찾아 경계 상자와 클래스를 예측합니다.
  • 의미론적 분할(semantic segmentation): 픽셀마다 클래스를 부여합니다(이 픽셀은 바닥, 저 픽셀은 사람).
  • 인스턴스 분할(instance segmentation): 같은 클래스라도 개별 객체를 구분합니다(사람 1, 사람 2).
   입력 이미지                검출              의미론적 분할
  ┌──────────┐          ┌──────────┐        ┌──────────┐
  │  사람 컵  │   ──▶   │ [사람] 상자│  ──▶  │ 픽셀별 색칠 │
  │   책상    │          │ [컵] 상자 │        │ 사람/컵/책상│
  └──────────┘          └──────────┘        └──────────┘

로봇에서는 여기에 3D 정보를 결합합니다. 예를 들어 "컵"으로 분할된 픽셀 영역을 깊이 프레임과 겹치면, 컵의 3D 위치를 얻어 곧바로 집기 계획으로 넘길 수 있습니다. 최근에는 프롬프트 기반 분할(예: Segment Anything 계열)처럼 사전 학습된 범용 모델을 로봇 인식의 앞단으로 쓰는 흐름도 있습니다. 다만 실환경 배치에서는 조명·가림·도메인 차이로 인한 성능 저하를 항상 검증해야 합니다.

NeRF와 3D 가우시안 스플래팅

최근 3D 재구성 분야를 뒤흔든 두 기법이 있습니다.

  • NeRF(Neural Radiance Fields): 여러 시점의 이미지로 장면을 하나의 신경망 함수로 학습합니다. 공간의 임의 점과 시선 방향을 넣으면 그 지점의 색과 밀도를 출력하고, 이를 광선을 따라 적분해 새로운 시점의 이미지를 렌더링합니다. 매우 사실적인 재구성이 가능하지만, 학습과 렌더링이 무겁다는 한계가 있었습니다.
  • 3D 가우시안 스플래팅(3D Gaussian Splatting): 장면을 수많은 3차원 가우시안(위치, 크기, 방향, 색, 불투명도를 가진 부드러운 얼룩)의 집합으로 표현합니다. 이를 화면에 투영해(splatting) 렌더링하는데, NeRF보다 훨씬 빠르고 실시간 렌더링이 가능해 큰 주목을 받았습니다.
전통적 표현        NeRF                3D 가우시안 스플래팅
 포인트/복셀    연속 함수(MLP)          3D 가우시안 집합
 ┌─┬─┬─┐       f(x, y, z, θ, φ)        ○ ◦ ● ◦ ○  (각 얼룩이
 ├─┼─┼─┤    ──▶ = (색, 밀도)     ──▶    ● ◦ ○ ● ◦   위치·색·불투명도)
 └─┴─┴─┘       광선 적분으로 렌더        투영·합성으로 렌더(빠름)

로봇 관점에서 이들은 매력적입니다. 고품질 3D 지도를 만들거나, 시뮬레이션용 사실적 장면을 재구성하거나, 로봇이 아직 보지 못한 시점을 예측하는 데 쓸 수 있습니다. 실제로 SLAM에 가우시안 표현을 접목하려는 연구가 활발합니다. 다만 이런 표현은 대개 정적 장면을 가정하며, 움직이는 물체나 실시간 대규모 환경에는 아직 실용적 제약이 있습니다. 정확히 어떤 시스템에 언제 도입할지는 신중히 판단해야 합니다.

좌표계와 변환 — 인식의 숨은 척추

3D 인식에서 가장 많은 버그가 숨어 있는 곳은 의외로 좌표계(coordinate frame)입니다. 로봇 시스템에는 여러 좌표계가 공존합니다. 카메라가 보는 세계는 카메라 좌표계, 로봇 손끝은 엔드이펙터 좌표계, 로봇 몸통은 베이스 좌표계, 그리고 방 전체를 아우르는 월드 좌표계가 있습니다. 어떤 물체를 "집으려면", 카메라 좌표계에서 인식한 물체 위치를 로봇이 팔을 움직일 베이스 좌표계로 변환해야 합니다.

좌표계 변환 체인 (물체를 카메라에서 로봇 베이스로 옮기기)

  월드 좌표계 (방)
     │  T_world_base (로봇이 방 어디에)
  베이스 좌표계 (로봇 몸통) ◀──── 여기서 팔 계획을 세움
     │  T_base_cam (카메라가 로봇 어디에 붙었나)
  카메라 좌표계 ────▶ 물체 위치 (여기서 인식됨)

  물체_베이스 = T_base_cam x 물체_카메라

이런 변환은 4x4 동차 변환 행렬(homogeneous transformation)로 표현됩니다. 회전과 평행이동을 하나의 행렬에 담아, 행렬 곱셈만으로 좌표계를 넘나들 수 있게 한 것입니다. 로봇 미들웨어에서는 이 변환들의 관계를 트리 구조로 관리하는 도구(예: ROS의 tf)를 제공합니다.

변환 트리 (tf tree)
   world
     └── base_link
           ├── camera_link
           │     └── camera_optical_frame
           └── arm_base
                 └── ... ── end_effector

  각 간선(edge)이 하나의 변환. 임의의 두 프레임 사이 변환은
  트리 경로를 따라 행렬을 곱해서 얻는다.

변환에서 흔한 실수는 방향(어느 프레임에서 어느 프레임으로)을 헷갈리는 것과, 회전 표현(오일러 각, 쿼터니언, 회전 행렬) 사이 변환에서 축 순서를 틀리는 것입니다. 쿼터니언은 짐벌락(gimbal lock)이 없어 로봇에서 널리 쓰이지만, 사람이 직관적으로 읽기는 어렵습니다.

센서 퓨전 심화

앞서 여러 센서가 서로의 약점을 보완한다고 했습니다. 이 퓨전에는 크게 두 층위가 있습니다.

  • 저수준 퓨전: 원시 측정값을 직접 결합합니다. 예를 들어 카메라 이미지와 LiDAR 포인트를 같은 좌표계로 정렬해, 각 픽셀에 깊이를 부여하거나 각 3D 점에 색을 입힙니다.
  • 고수준 퓨전: 각 센서가 독립적으로 추정한 결과(예: 물체 위치)를 확률적으로 결합합니다.

시간축 퓨전에서 핵심 도구는 상태 추정 필터입니다. 대표적으로 칼만 필터(Kalman filter)와 그 확장이 로봇 위치·속도 추정에 널리 쓰입니다.

칼만 필터의 두 단계 (반복)

  예측(predict)                갱신(update)
  ┌──────────────┐            ┌──────────────┐
  │ 운동 모델로    │            │ 새 관측으로    │
  │ 상태를 앞으로   │──────────▶│ 예측을 보정    │
  │ 굴린다(불확실↑)│            │ (불확실 ↓)    │
  └──────────────┘            └──────────────┘
        ▲                            │
        └──────── 다음 주기 ◀────────┘

  핵심: 예측의 불확실성과 관측의 불확실성을 가중 평균 →
        더 믿을 만한 쪽에 무게를 둔다

IMU(관성 측정 장치)는 가속도와 각속도를 매우 빠르게 주지만 시간이 지나면 표류합니다. 반면 카메라·LiDAR는 느리지만 절대적 기준을 줍니다. 이 둘을 필터로 엮으면(예: 시각-관성 오도메트리, VIO), 빠르고 안정적인 자세 추정을 얻습니다. 이는 SLAM 프런트엔드의 강력한 토대가 됩니다.

실전 파이프라인 스케치

지금까지의 조각을 하나의 흐름으로 이으면, 이동형 로봇의 전형적인 인식-행동 루프는 다음과 같습니다.

인식 → 계획 → 제어 루프

 [센서] ──▶ [전처리] ──▶ [SLAM/상태추정] ──▶ [의미 인식]
 카메라      노이즈 제거    위치+지도            검출/분할
 LiDAR      정합/보정                          어포던스
 IMU                                             │
 [제어] ◀── [모션 계획] ◀── [작업 계획] ◀── [장면 이해]
 관절 명령    충돌 없는 경로   무엇을 할지        어디에 무엇이
 로봇 동작 ──▶ 세계 변화 ──▶ (루프 반복)

각 블록은 앞선 절에서 다룬 기법으로 채워집니다. 중요한 점은 이 루프가 실시간 예산 안에서 돌아야 한다는 것입니다. 인식이 200밀리초 걸리는데 로봇이 초당 1미터로 움직이면, 판단할 때쯤 세계는 이미 20센티미터 이동한 뒤입니다. 그래서 실무에서는 인식을 여러 주기로 나누어(빠른 안전 반응 루프 + 느린 의미 이해 루프) 돌리는 설계가 흔합니다.

# 개념적 인식-행동 루프 (의사코드에 가까운 예시)
def perception_action_loop(robot):
    while robot.is_active():
        frame = robot.sensors.grab_synced()      # 시간 동기화된 센서 취득
        cloud = preprocess(frame)                 # 노이즈 제거, 좌표 정렬
        pose, local_map = slam.update(cloud)      # 위치추정 + 지도갱신
        objects = detector.detect(frame.rgb)      # 딥러닝 검출
        objects = lift_to_3d(objects, frame.depth)  # 2D 검출을 3D로
        goal = task_planner.decide(objects, pose) # 무엇을 할지
        path = motion_planner.plan(goal, local_map)  # 충돌 없는 경로
        robot.controller.follow(path)             # 힘/속도 제한 준수

이 코드는 실제 시스템의 골격을 단순화한 것입니다. 실전에서는 각 단계가 별도 프로세스로 분리되어 메시지로 통신하고, 실패 시 안전 정지 같은 예외 처리가 촘촘히 들어갑니다.

인식 성능을 어떻게 평가하나

"인식이 잘 된다"는 말은 측정 가능해야 합니다. 과제별로 다른 지표가 쓰입니다.

과제대표 지표의미
객체 검출mAP(평균 정밀도)여러 임계값에서 정밀도-재현율 균형
의미론적 분할mIoU(평균 교집합/합집합)예측 영역과 정답 영역의 겹침
깊이 추정RMSE, 절대상대오차추정 깊이와 실제 깊이의 차이
SLAMATE(절대궤적오차)추정 경로와 실제 경로의 어긋남
6D 자세ADD 계열추정 자세로 놓은 모델 점과 정답 점의 거리

지표를 볼 때 유의할 점이 있습니다. 벤치마크에서 높은 점수가 현장 성능을 보장하지 않습니다. 데이터셋이 편향되어 있을 수 있고, 로봇이 실제로 마주치는 조명·물체 분포가 벤치마크와 다를 수 있습니다. 그래서 성숙한 팀은 벤치마크 점수와 함께, 자기 로봇의 실제 임무에서의 성공률을 최종 지표로 삼습니다.

단안 깊이 추정 — 한 눈으로 깊이 보기

스테레오나 LiDAR 없이 카메라 한 대로 깊이를 추정하는 방법도 있습니다. 단안 깊이 추정(monocular depth estimation)은 딥러닝으로 이미지에서 깊이를 직접 예측합니다. 물리적 원리 대신, 방대한 데이터에서 학습한 사전 지식을 씁니다. 예를 들어 "멀리 있는 물체는 작게 보이고, 지평선 쪽은 멀며, 익숙한 물체(문·의자)의 크기는 대략 정해져 있다"는 단서를 신경망이 내재화합니다.

단안 깊이 추정의 원리(직관)

  하나의 이미지 ──▶ 신경망 ──▶ 픽셀별 깊이 지도
                    ├─ 단서 1: 물체 크기(익숙한 물체 참조)
                    ├─ 단서 2: 원근·소실점
                    ├─ 단서 3: 흐림·가림 관계
                    └─ 단서 4: 질감의 밀도 변화

  주의: 절대 스케일이 모호할 수 있음(상대 깊이만 확실한 경우 많음)

단안 방식의 한계는 스케일 모호성입니다. 사진만 보고는 "작은 물체가 가까이" 있는지 "큰 물체가 멀리" 있는지 원리적으로 구분하기 어렵습니다. 그래서 로봇에서는 단안 추정을 다른 센서와 결합하거나, 로봇 이동으로 생기는 시점 변화(motion parallax)를 함께 쓰는 경우가 많습니다.

동적 환경 SLAM 개요

앞서 대부분의 고전 SLAM이 정적 세계를 가정한다고 했습니다. 하지만 현실에는 걷는 사람, 굴러가는 카트, 열리는 문이 있습니다. 이런 동적 요소는 SLAM을 두 가지로 어지럽힙니다. 첫째, 움직이는 물체의 특징점을 지도에 잘못 넣어 지도가 오염됩니다. 둘째, 움직이는 배경을 기준으로 자기 위치를 잘못 추정합니다.

동적 SLAM의 접근

  1) 탐지: 무엇이 움직이는가?
     - 의미 분할로 "사람·차량" 같은 동적 후보 식별
     - 기하학적 일관성 위반으로 이상치 검출
  2) 분리: 정적 배경 vs 동적 물체
     - 정적 특징만 SLAM에 사용 (안정적 지도)
     - 동적 물체는 따로 추적하거나 무시
  3) (선택) 추적: 동적 물체를 별도로 예측
     - 사람이 어디로 갈지 예측해 회피에 활용

핵심 아이디어는 동적 요소를 이상치로 걸러 정적 지도를 지키되, 안전을 위해 그 동적 요소를 아예 무시하지는 않는 균형입니다. 정적 배경으로 지도를 만들고, 사람 같은 움직이는 대상은 회피 계획에 넘기는 식입니다.

실무에서 마주치는 함정

  • 캘리브레이션: 센서 내부·외부 파라미터가 조금만 틀려도 3D 복원이 크게 어긋납니다. 카메라-LiDAR 간 외부 캘리브레이션은 특히 까다롭습니다.
  • 시간 동기화: 여러 센서의 타임스탬프가 어긋나면, 로봇이 빠르게 움직일 때 데이터가 서로 다른 순간을 가리켜 정합이 무너집니다.
  • 동적 환경: 대부분의 고전 SLAM은 정적 세계를 가정합니다. 사람이나 차량이 움직이면 이를 이상치로 걸러내야 합니다.
  • 실시간 제약: 인식은 로봇의 제어 주기 안에 끝나야 합니다. 정확도와 지연시간 사이의 균형이 늘 관건입니다.
  • 도메인 차이: 실험실에서 잘 되던 인식 모델이 조명·재질·배경이 다른 현장에서 무너지는 일이 흔합니다. 배치 전 현장 데이터로 검증하는 습관이 중요합니다.

마치며

로봇 인식은 "잃어버린 3차원을 되찾는" 일에서 시작해, 그 공간을 지도로 엮고(SLAM), 적절히 표현하며(포인트클라우드·복셀·occupancy), 물체의 자세를 추정하고(6D pose), 의미를 부여하는(검출·분할) 여러 층위로 이루어집니다. NeRF와 3D 가우시안 같은 새로운 표현은 이 그림을 계속 넓히고 있습니다.

핵심은 어느 한 기법이 만능이 아니라는 점입니다. 센서마다 강점과 약점이 다르고, 표현마다 용도가 다릅니다. 좋은 로봇 인식 시스템은 이들을 문제에 맞게 조합하고, 실환경의 함정을 꾸준히 검증하며 다듬어 갑니다. 다음 글에서는 이렇게 세상을 본 로봇이 어떻게 안전하게 행동할 수 있는지를 다루겠습니다.

참고 자료