ROS/ROS2

ROS (Robot Operating System) 는 운영체제가 아닙니다 — 발행/구독 미들웨어와 방대한 도구 및 패키지 생태계로, 로보틱스 소프트웨어의 공통 언어가 되었습니다. SLAM에서 ROS는 화려하지는 않지만 필수적인 배관 작업을 해결해 줍니다: 센서 데이터를 드라이버에서 알고리즘으로 전달하고, 좌표 프레임을 일관되게 유지하며, 데이터셋을 기록하고, 결과를 시각화하는 일입니다.

알아야 할 핵심 개념:

ROS 1 대 ROS 2: ROS 1(마지막 릴리스: Noetic)은 수명이 끝났고, 새로운 개발은 ROS 2를 대상으로 합니다. ROS 2는 커스텀 전송 계층을 DDS로 대체하고, 서비스 품질(QoS) 제어를 추가하며(손실이 있는 무선 링크와 고속 센서에 결정적으로 중요합니다), 실시간에 친화적인 실행자(executor)를 지원하고, 여러 플랫폼에서 네이티브로 동작하며, 단일 마스터 아키텍처를 제거합니다. 위의 개념들은 거의 그대로 이어지며, API는 rclcpp(C++)와 rclpy(Python)입니다.

SLAM에 특화된 실용적인 작업 흐름은 다음과 같습니다: ROS를 전혀 모르는 라이브러리로 알고리즘을 작성한 다음, 센서 토픽을 구독하고 라이브러리에 데이터를 공급하며 오도메트리, TF 보정, 시각화 마커를 발행하는 얇은 ROS 래퍼 노드를 추가합니다. 이렇게 하면 알고리즘을 테스트 가능하고 이동 가능하게 유지할 수 있습니다 — ORB-SLAM3, VINS-Fusion, RTAB-Map 등 ROS 지원을 제공하는 대부분의 오픈소스 시스템이 사용하는 패턴입니다.

Python으로 작성된 최소한의 ROS 2 래퍼는 모든 SLAM 노드의 형태를 보여줍니다:

import rclpy
from rclpy.node import Node
from rclpy.qos import qos_profile_sensor_data
from sensor_msgs.msg import Image, Imu
from nav_msgs.msg import Odometry

class SlamNode(Node):
    def __init__(self):
        super().__init__('my_slam')
        self.create_subscription(Image, '/camera/image_raw',
                                 self.on_image, qos_profile_sensor_data)
        self.create_subscription(Imu, '/imu/data',
                                 self.on_imu, qos_profile_sensor_data)
        self.odom_pub = self.create_publisher(Odometry, '/odom', 10)

    def on_imu(self, msg):   self.slam.feed_imu(msg)      # buffer at high rate
    def on_image(self, msg): self.odom_pub.publish(
                                 to_odom_msg(self.slam.track(msg)))

rclpy.init(); rclpy.spin(SlamNode())

외워둘 만한 일상적인 명령어: ros2 bag record -a / ros2 bag play <bag>, ros2 topic hz <topic>(데이터가 실제로 들어오고 있는지, 어떤 속도로?), ros2 topic echo, ros2 run tf2_tools view_frames(TF 트리를 덤프), 그리고 배선 확인을 위한 ros2 node info <node>. 다중 센서 입력의 경우, message_filters가 이미지와 깊이 또는 IMU 배치를 짝지어주는 근사 시간 동기화기를 제공합니다.

흔한 함정

SLAM에서의 의미

여러분이 배치하게 될 거의 모든 로봇이 ROS를 사용합니다: 센서 데이터는 ROS 토픽으로 도착하고, 외부 파라미터는 TF에 존재하며, 다운스트림 소비자(내비게이션, 계획)는 nav_msgs/Odometrymap 프레임을 기대합니다. SLAM 시스템을 ROS 2 노드로 래핑하고, 백을 재생하며, RViz로 디버깅할 수 있는 능력은 연구와 산업 로보틱스 작업 모두에서 기본이 되는 역량입니다.

실습

관련 문서