Python

대부분의 SLAM 시스템의 실시간 코어는 C++로 실행되지만, Python은 그 코어를 둘러싼 모든 것의 언어다. 일반적인 SLAM 작업 흐름에서 Python은 세 가지 용도로 쓰인다:

많은 핵심 SLAM 라이브러리는 Python 바인딩을 제공하므로, C++를 건드리지 않고도 전체 파이프라인을 프로토타이핑할 수 있다:

라이브러리Python 진입점
OpenCVopencv-python (cv2)
GTSAM공식 Python 래퍼
g2o커뮤니티 바인딩 (예: g2opy)
Open3D네이티브 Python API (포인트 클라우드, ICP, TSDF)

흔하고 생산적인 패턴은 Python으로 프로토타입을 만들고 C++로 포팅하는 것이다: 먼저 cv2와 NumPy로 데이터셋에서 알고리즘을 검증한 다음, 설계가 안정되면 핵심 반복 루프를 C++/Eigen으로 재구현한다. Python에 계속 머물러야 하는 연구용 코드라면, pybind11을 사용해 성능이 중요한 C++ 부분을 감싸고 실험 로직은 Python으로 유지할 수 있다 — 두 세계의 장점을 모두 취하는 방식이다.

일찍 습관으로 만들어 둘 만한 실용적 습관: 프로젝트마다 가상 환경(venv/conda/uv)을 사용하고, 재현성을 위해 의존성 버전을 고정하며, NumPy는 행 우선(row-major) 규약을 사용하고 OpenCV 이미지는 [row, col] = [y, x]로 인덱싱된다는 점을 기억하라 — 좌표가 뒤바뀌는 버그의 전형적인 원인이다.

Python에서의 SLAM 도구 맛보기

여러분의 도구상자에 갖춰둘 가장 유용한 스크립트는 궤적 평가다. Umeyama 방법(SVD를 통한 닫힌 형태의 최소제곱 강체 정합)으로 추정치를 정답 데이터에 정렬하고 ATE RMSE를 계산하는 것은 NumPy로 십여 줄이면 된다:

import numpy as np

def align_and_ate(P_est, P_gt):          # both Nx3
    mu_e, mu_g = P_est.mean(0), P_gt.mean(0)
    U, S, Vt = np.linalg.svd((P_gt - mu_g).T @ (P_est - mu_e))
    D = np.diag([1, 1, np.sign(np.linalg.det(U @ Vt))])
    R = U @ D @ Vt                        # rotation aligning est -> gt
    t = mu_g - R @ mu_e
    err = P_gt - (P_est @ R.T + t)        # residuals after alignment
    return np.sqrt((err ** 2).sum(1).mean())   # ATE RMSE

이는 널리 쓰이는 evo 패키지(pip install evo)가 하는 일과 본질적으로 같다 — 실제로는 TUM/KITTI/EuRoC 형식, 플롯, RPE를 위해 evo를 사용하되, 위의 수식을 알고 있으면 그 출력이 블랙박스가 되지 않는다.

Python을 충분히 빠르게 만들기

Python의 느림은 거의 전부 루프 문제다. 기본 원칙은 다음과 같다:

흔한 함정

SLAM에서의 의미

현대 SLAM 연구는 기하학과 학습의 교차점에 있으며, 학습 쪽은 Python으로 말한다. 고전적인 시스템이라 해도, 평가·시각화·데이터셋 도구 생태계는 Python 기반이다; 이에 익숙하면 실험을 실행하고 C++ 시스템이 실제로 무엇을 하고 있는지 이해하는 속도가 극적으로 빨라진다.

실습

관련 문서