로봇이 창고를 스스로 도는 법: ROS 2, SLAM, 자율 주행 스택

ROS 2 미들웨어, SLAM 파이프라인, Nav2 기반 자율 주행을 하나의 스택으로 엮는 방법 — DDS QoS·실시간 엔지니어링·AI 인지 통합과 코드 예시.

2026-08-12 · 최초 발행 2025-12-12

로봇 팔이나 이동 로봇이 충돌 없이 창고를 돌아다니려면, 센서에서 들어온 데이터가 위치 추정과 지도 작성, 경로 계획, 제어 명령까지 끊김없이 이어져야 한다. 이 흐름을 표준화한 스택이 ROS(Robot Operating System), SLAM(Simultaneous Localization and Mapping), 자율 주행(Autonomous Navigation)이다.

ROS, SLAM, 자율 주행이 각각 맡는 일

ROS는 로봇 애플리케이션을 위한 메시지 기반 미들웨어·도구·라이브러리 집합이다. ROS 2는 DDS 기반 QoS, 실시간성, 멀티로봇·보안을 지원하며 노드, 토픽, 서비스, 액션, TF, bag 기록/재생으로 구성되고 시뮬레이션(Gazebo/Ignition), 네비게이션(Nav2)과 자연스럽게 통합된다.

SLAM은 센서 데이터로 위치 추정과 지도 작성을 동시에 수행한다. 프런트엔드(특징/추정)와 백엔드(최적화/루프 클로저)로 나뉘고, LiDAR·비주얼(VIO/V-SLAM)·멀티센서 융합(UKF/EKF/Factor Graph)을 적용한다.

자율 주행은 경로 계획(Global/Local), 장애물 회피, 속도·자세 제어, 상태 관리를 포함한다. 지도 기반과 비지도(Teach&Repeat) 방식이 모두 가능하고, AI 기반 인지(객체 검출/세그멘테이션)와 학습 기반 계획·정책(RL/IL)을 결합하는 추세다.

ROS 2 미들웨어가 통신을 책임진다

DDS 기반 QoS(신뢰성/지연/히스토리)로 유선·무선이 섞인 환경에서도 안정적인 통신을 확보하고, rclcpp/rclpy API로 언어 간 상호운용이 가능하다. Nav2, SLAM Toolbox, RTAB-Map, Cartographer 같은 표준 패키지를 쓰고, colcon·rosdep·launch 시스템으로 재현 가능한 빌드·배포를 지원한다.

SLAM은 프런트엔드가 계산량을 좌우한다

프런트엔드는 센서 캘리브레이션·동기화, 특징/키프레임 추출, IMU 보정을 처리하며 계산 복잡도와 지연의 주된 원인이 된다. 백엔드는 포즈 그래프 최적화, 루프 클로저 감지, 드리프트 억제를 담당하고, 지도 표현(Occupancy/ESDF/SDF/메시) 선택이 이후 경로 계획에 영향을 준다.

글로벌 플래너(A*, D*, Hybrid-A*), 로컬 플래너(DWB, TEB), 비용지도(costmap)로 구성되며 동적 장애물 예측과 재계획을 지원한다. 제어기(PID/MPC)와 속도 제한, 회피 규칙, 복구 행동(clear costmap, spin, backup)이 내장돼 있다.

AI는 인지와 계획에 끼어든다

DNN 기반 인지(Detect/Segment/Depth)로 장애물과 가행영역을 판단하고, TensorRT/ONNX 최적화와 INT8 양자화로 지연을 줄인다. 학습 기반 로컬 정책(RL/IL)과 전통적 계획기를 결합한 하이브리드 아키텍처가 쓰인다.

실시간성은 시스템 설계 문제다

RT 리눅스, 스레드 우선순위, 실행기(Executor) 분리로 지연 예산을 관리하고, QoS와 콜백 그룹으로 상호 간섭을 최소화한다. 전원·발열·연산 예산의 균형도 필요하며, GPU/FPGA 가속을 채택하면 전력·열 설계에서 트레이드오프가 생긴다.

센서 입력부터 액추에이터까지

ROS 2 topics 공개피처 추출/관성 보정최적화(BA/Graph)루프 클로저 여부 판단아니오지도 생성/갱신지도 유지Global Planner 호출Local Costmap 업데이트Local Planner 호출목표 경로 전달회피/속도 명령 전달제어 명령 Twist 생성모터/액추에이터 명령 출력센서 드롭/노이즈 감지치료: 관성 보정/예측 사용격하 모드/정지 실행센서 입력(카메라/LiDAR/IMU)전처리(필터/동기화/캘리브레이션)SLAM프런트엔드(비주얼/라이다)SLAM 백엔드(포즈 그래프)루프 클로저 검출 여부지도/포즈 업데이트(오류 보정)현재 추정 유지지도(Occupancy/Grid/ESDF)경로 계획(전역)코스트맵(지역)경로 계획(지역/회피)경로 융합/재계획저수준 제어(PID/MPC)액추에이터예외 처리(센서 상태)안전 정지 페일세이프

활용 사례

창고 AMR(Autonomous Mobile Robot) 운영에서는 오프라인 맵을 구축하고 존을 나눈 뒤 Nav2 태스크 서버와 WMS·메시지 브로커를 연동한다. 이렇게 하면 피킹 경로 최적화로 인당 처리량이 20~35% 향상되고 교차로 병목이 30% 감소한다.

병원 물류 로봇은 엘리베이터·문 제어 인터페이스를 연결하고 시나리오별 행동 트리(Action Server)를 구성하며 안전 구역·속도 맵을 적용한다. 야간 무인 배송율은 90% 이상을 달성하고 간호사 이동 시간은 25% 절감된다.

설비 점검 로봇은 LiDAR와 열화상을 융합해 SLAM으로 라운드 경로를 기록하고 이상치 탐지 모델을 배포한다. 고장 조기경보 리드타임을 1.5~3일 확보하고 비계획 정지가 15% 감소한다.

ROS 1과 ROS 2, 뭐가 달라졌나

지표 ROS 1 ROS 2
성능 TCPROS 중심, 지연/패킷 손실 제어 한계 DDS QoS로 신뢰성/지연 설정, 멀티스레드 실행기 지원
확장성 단일 마스터 의존, 멀티로봇 취약 마스터리스, 멀티로봇/멀티도메인 자연스러운 확장
일관성 메시지 정의/타임싱크 도구 분절 내장 Time/Clock, QoS 히스토리로 재현성 향상
안정성 네트워크 변화에 민감 신뢰성/최소 대역폭 프로파일, 장애 복구 용이
운영 편의 빌드/배포 도구 파편화 colcon/launch/ament, 보안 정책·테스트 체계 강화

배포 버전과 기능은 계속 바뀌므로 최신 정보를 확인해야 한다.

구현은 단계적으로 진행한다

센서·구성 설계 단계에서는 카메라·LiDAR·IMU를 고르고 캘리브레이션 타깃·정합 기준을 정한 뒤, 시간 동기(PTP/Chrony)와 좌표계(TF), QoS 프로파일을 설계한다. 시뮬레이션·맵핑 단계에서는 Gazebo/Ignition 환경을 구축하고 센서 노이즈를 모델링한 뒤 SLAM Toolbox나 RTAB-Map으로 오프라인 맵을 확보하고 하중 시나리오를 테스트한다. 경로 계획·제어 튜닝 단계에서는 Global/Local 플래너를 고르고 비용 함수 가중치·인플레이션 반경을 최적화하며 제어기(PID/MPC) 이득을 식별하고 속도·가속 제한을 설정한다. 안전·예외 처리 단계에서는 장애물 센서를 이중화하고 페일세이프 상태머신을 설계하며, QoS 신뢰성·최소 대역폭 조합과 통신 손실 시 격하 모드를 정의한다. 검증·배포 단계에서는 HIL/SIL 테스트와 rosbag 리그레션, 커버리지를 측정하고 컨테이너화(ROS 2 + CUDA)와 OTA/롤백 파이프라인을 구성한다.

목표까지 선형으로 접근하는 노드

ROS 2 Humble과 Nav2 패키지(nav2_bringup, slam_toolbox)가 설치된 Ubuntu 22.04, 물리 로봇이나 시뮬레이터, odom→base_link 프레임, /scan 또는 /camera·/cmd_vel 토픽이 전제조건이다.

# 환경: Python 3.10, ROS 2 Humble
# 파일: simple_go_to.py
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist
from nav_msgs.msg import Odometry
import math

GOAL_X, GOAL_Y = 2.0, 0.0

class GoTo(Node):
    def __init__(self):
        super().__init__('simple_go_to')
        self.cmd = self.create_publisher(Twist, '/cmd_vel', 10)
        self.create_subscription(Odometry, '/odom', self.on_odom, 10)

    def on_odom(self, msg):
        x = msg.pose.pose.position.x
        y = msg.pose.pose.position.y
        dx, dy = GOAL_X - x, GOAL_Y - y
        dist = math.hypot(dx, dy)
        tw = Twist()
        if dist > 0.05:
            tw.linear.x = max(0.05, min(0.3, 0.8 * dist))
            tw.angular.z = 2.0 * math.atan2(dy, dx)  # 간단 조향
        else:
            tw.linear.x = 0.0
            tw.angular.z = 0.0
        self.cmd.publish(tw)

def main():
    rclpy.init()
    node = GoTo()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

실행 순서는 ros2 launch slam_toolbox online_async_launch.py로 SLAM을 띄우고, ros2 launch nav2_bringup navigation_launch.py use_sim_time:=False로 네비게이션을 실행한 다음, ros2 run <패키지명> simple_go_to로 제어 노드를 돌린다. 실제 환경에서는 프레임 정합, 속도 제한, 장애물 회피를 Nav2 비헤이비어 트리로 관리하는 편이 낫다.

보안과 실시간성은 서로 당긴다

네트워크·신뢰 경계에서는 DDS 보안 플러그인(SROS2)을 적용하고 미사용 포트를 차단하며 VLAN·ROS 도메인을 분리한다. 다만 보안 계층을 켜면 지연이 늘어 QoS를 다시 튜닝해야 한다. 실시간·QoS 측면에서는 제어·센서 토픽은 Reliable + KeepLast, 고주파 노이즈 토픽은 BestEffort + KeepLast를 권장하는데, Reliable을 쓰면 무선 환경에서 지연이 늘 수 있어 타임아웃·워치독 설정이 필요하다. 리소스·전력 관리에서는 DNN 추론에 TensorRT/INT8과 노드 간 zero-copy(shm)를 쓰지만 양자화로 정확도가 떨어질 수 있어 임무 프로파일별로 모델을 선택해야 한다. 관측가능성·운영 측면에서는 rosbag2 순환 기록과 지연/드롭율/CPU/GPU 상태지표 내보내기, 원격 프로파일링을 쓰는데 로깅이 과다하면 I/O 병목이 생겨 압축·샘플링 비율을 조정해야 한다.

기대할 수 있는 효과

생산성·비용 측면에서는 패키지 재사용과 시뮬레이션 기반 검증으로 개발 리드타임이 3050% 단축되고 현장 튜닝 횟수가 2030% 감소한다. 성능·안정성 측면에서는 균일한 조도와 정상 네트워크를 가정할 때 평균 위치 오차 0.050.15m, 전역 성공률 95% 이상을 달성할 수 있고, 복구 행동·격하 모드로 장애 대응 복구 시간이 40% 단축된다. 확장성 측면에서는 멀티로봇 1050대를 동시 운영할 때 네임스페이스·QoS 분리로 충돌율을 0.5% 이하로 유지할 수 있다. 안전 측면에서는 안전 정지·감속 규칙을 적용하면 근접 사고가 60% 감소하고 규제 인증 준비 기간이 단축된다.

ROS 2·SLAM·자율 주행 스택을 표준으로 채택하면 개발 속도와 운영 안정성, 확장성을 함께 확보할 수 있다. 시뮬레이션 주도 개발, QoS·실시간성 설계, AI 추론 최적화, 안전·보안 체계를 처음부터 내재화하고, 파일럿에서 확장 단계로 넘어가며 관측가능성을 확보하는 편이 리스크를 줄인다.

ROS2SLAM자율주행로보틱스실시간시스템