자율주행의 큰 그림인 소프트웨어 아키텍처를 이해했다면, 이제 실제 로봇과 자율주행 시스템의 뼈대를 이루는 핵심 미들웨어인 ROS2(Robot Operating System)를 살펴볼 차례입니다.

많은 입문자가 'ROS'라는 이름을 처음 들으면 리눅스처럼 컴퓨터에 깔리는 거대한 독립 운영체제라고 오해하곤 합니다. 나 역시 처음 ROS를 접했을 때, 컴퓨터를 밀고 새로운 OS를 설치해야 하는 줄 알고 며칠 동안 겁을 먹었던 기억이 있습니다. 하지만 ROS는 리눅스나 윈도우 위에서 작동하는 '미들웨어(Middleware)' 즉, 응용 프로그램들이 서로 원활하게 대화할 수 있도록 돕는 일종의 통신 인프라 소프트웨어입니다. 오늘 자율주행 개발의 표준이 된 ROS2의 기본 개념과 핵심 통신 구조를 짚어보겠습니다.

1. ROS2란 무엇이며, 왜 기존 ROS1에서 진화했을까?

과거 오랜 기간 자율주행 연구의 표준이었던 ROS1은 대학 연구실과 오픈소스 커뮤니티에서 폭발적인 성장을 이끌었습니다. 하지만 로봇을 실제 공장이나 도로 위 상용 제품(Production)으로 가져가려다 보니 치명적인 한계에 부딪혔습니다.

  • 보안 문제: 데이터 암호화나 접근 권한 제어가 부족하여 해킹에 취약했습니다.

  • 실시간성(Real-time)의 한계: 중앙에 통신을 관리하는 마스터(Master) 서버가 존재했기 때문에, 시스템 부하가 커지면 메시지 전달이 지연되는 문제가 발생했습니다.

이러한 문제를 전면적으로 해결하기 위해 바닥부터 완전히 새로 설계된 버전이 바로 ROS2입니다. ROS2는 DDS(Data Distribution Service)라는 강력한 분산 통신 표준을 채택하여 마스터 서버 없이도 노드들이 독립적으로 안전하게 데이터를 주고받을 수 있게 되었습니다.

2. ROS2의 핵심 구성 요소: 노드(Node), 토픽(Topic), 메시지(Message)

ROS2 시스템 내부를 들여다보면 수많은 작은 프로그램들이 각자의 임무를 수행하며 거대한 협업을 이뤄내고 있습니다. 이 구조를 이해하는 세 가지 핵심 용어가 있습니다.

  • 노드 (Node): 최소 단위의 독립된 실행 프로그램입니다. 예를 들어 '카메라 영상을 읽어오는 노드', '차선 인식을 수행하는 노드', '모터를 제어하는 노드' 등이 각각 개별 노드로 실행됩니다.

  • 토픽 (Topic)과 퍼블리셔/서브스크라이버 (Publisher/Subscriber): 노드들끼리 실시간으로 대화를 나누는 '방송 채널'입니다. 데이터를 보내는 쪽을 퍼블리셔, 데이터를 받는 쪽을 서브스크라이버라고 부릅니다. 예를 들어 카메라 노드가 주기적으로 이미지 데이터를 'camera_image'라는 토픽으로 쏘아 올리면, 인지 노드가 그 토픽을 구독(Subscribe)하여 가져다 쓰는 방식입니다.

  • 메시지 (Message): 토픽을 통해 주고받는 데이터의 자료 구조 형태입니다. 정수, 실수, 3차원 좌표, 이미지 배열 등 ROS2가 기본 제공하거나 개발자가 직접 정의한 규격에 맞춰 데이터를 교환합니다.

3. 실무 자율주행 시스템에서의 ROS2 활용 흐름

실제 자율주행 차량 내부의 컴퓨터에서는 수십 개의 ROS2 노드가 동시에 돌아가며 다음과 같은 데이터 파이프라인을 형성합니다.

  1. [센서 노드]: 라이다와 카메라가 하드웨어 드라이버를 통해 초당 수십 번 데이터를 읽어와 각각의 토픽으로 발행(Publish)합니다.

  2. [인지 노드]: 해당 토픽을 구독하여 딥러닝 객체 인식 알고리즘을 돌린 뒤, "앞에 보행자가 5미터 앞에 있다"는 결과를 새로운 토픽으로 발행합니다.

  3. [판단/제어 노드]: 인지 결과 토픽을 받아 차량의 최종 주행 속도와 핸들 각도를 계산한 뒤, 차량 구동부 제어 명령 토픽을 최종적으로 송출합니다.

이 모든 과정이 수 밀리초 단위로 끊김 없이 맞물려 돌아가도록 지휘하는 것이 바로 ROS2의 역할입니다.

4. 입문자가 ROS2를 공부할 때 자주 범하는 실수 2가지

  • 터미널 창(Terminal) 관리 소홀로 인한 환경 변수 설정 에러: ROS2를 사용할 때는 여러 개의 터미널을 열어 각각 다른 노드를 실행해야 합니다. 이때 각 창마다 ROS2 작업 공간(Workspace)의 환경 변수 설정 파일(.bashrc 또는 local_setup.bash)을 source 해주는 것을 깜빡하여 노드 간 통신이 연결되지 않는 에러를 수없이 겪게 됩니다.

  • 지나치게 거대한 하나의 노드 작성: 모든 기능을 하나의 파이썬 파일이나 C++ 파일에 거대하게 짜 넣는 실수를 합니다. 이 경우 에러가 나면 어디서 문제가 생겼는지 찾기 어렵고 ROS2의 분산 통신 장점을 전혀 살리지 못하므로, 기능별로 노드를 작게 쪼개어 설계하는 습관이 필요합니다.

핵심 요약

  • ROS2는 자율주행 및 로봇 소프트웨어가 서로 통신하고 협업할 수 있도록 돕는 분산형 미들웨어 시스템입니다.

  • 개별 기능을 수행하는 노드(Node)들이 토픽(Topic)이라는 방송 채널을 통해 퍼블리시와 서브스크라이브 방식으로 실시간 데이터를 교환합니다.

  • 복잡한 자율주행 시스템을 안정적으로 구축하려면 모듈 단위로 노드를 쪼개고 통신 흐름을 설계하는 감각이 필수적입니다.