# 로봇 운영 체제 2 (ROS2)

#### ROS2의 개요

ROS2(Robot Operating System 2)는 ROS1의 한계점을 보완하기 위해 개발된 로봇 운영 체제의 차세대 버전이다. ROS2는 로봇 소프트웨어 개발의 표준으로 자리 잡아가고 있으며, ROS1의 강력한 기능을 유지하면서도, 보다 높은 신뢰성, 확장성, 실시간 성능을 제공한다. 특히, ROS2는 분산 시스템에서의 성능 향상, 멀티 플랫폼 지원, 그리고 실시간 처리를 강조하는 점에서 ROS1과 구별된다.

ROS2는 DDS(Data Distribution Service)를 기반으로 한 미들웨어 계층을 채택하여, 통신의 유연성과 신뢰성을 크게 향상시켰다. 이로 인해 ROS2는 다중 로봇 간의 통신, 다양한 네트워크 환경에서의 안정적인 동작, 그리고 더 나아가 산업용 로봇 분야에서 요구하는 강건한 시스템을 구축하는 데 최적화되어 있다.

#### ROS2의 등장 배경

ROS2(Robot Operating System 2)는 기존 ROS1(Robot Operating System)의 한계를 극복하기 위해 개발된 차세대 로봇 소프트웨어 프레임워크이다. ROS1은 2007년 스탠포드 대학의 연구 프로젝트로 시작되어 전 세계 로봇 개발자들 사이에서 빠르게 확산되었으나, 다양한 한계로 인해 보다 향상된 버전의 필요성이 대두되었다. 특히, ROS1은 실시간 시스템의 한계, 분산 시스템 지원 부족, 다중 로봇 시스템의 비효율성 등의 문제가 지적되었다. 이에 따라 ROS2는 ROS1의 철학을 계승하면서도 이러한 문제를 해결하기 위해 설계되었다.

#### ROS2의 설계 철학 및 아키텍처

ROS2는 ROS1의 한계를 극복하고 더 넓은 응용 분야에서의 사용을 염두에 두고 설계되었다. 이를 위해 주요 설계 철학과 아키텍처가 정립되었으며, 이로 인해 ROS2는 분산 시스템에서의 안정성과 성능을 대폭 개선할 수 있었다.

* **미들웨어 추상화 계층 (Middleware Abstraction Layer, RMW):**\
  ROS2는 Data Distribution Service (DDS) 프로토콜을 기반으로 미들웨어 추상화 계층을 도입하여, 네트워크 상에서의 통신을 보다 유연하고 효율적으로 관리할 수 있도록 한다. 이를 통해 사용자는 다양한 DDS 구현체를 선택할 수 있으며, 특정 네트워크 환경이나 요구 사항에 맞게 시스템을 최적화할 수 있다.
* **Node의 라이프사이클 관리 (Node Lifecycle Management):**\
  ROS2는 Node의 상태를 명확하게 정의하고, 상태 전이 과정을 관리할 수 있도록 설계되었다. Node의 생명주기는 크게 `Unconfigured`, `Inactive`, `Active`, `Finalized`의 네 가지 상태로 나눌 수 있으며, 각 상태 간 전이는 명시적인 명령에 의해 이루어진다. 이를 통해 시스템이 복잡한 상황에서도 안정적으로 동작할 수 있다.
* **보안 (Security):**\
  ROS2는 Secure ROS (SROS2)를 통해 인증, 암호화, 접근 제어 등의 보안 기능을 통합적으로 제공한다. 이로 인해 네트워크 상에서의 통신이나 로봇의 제어에 대한 외부 침입을 방지할 수 있다. DDS의 보안 확장을 활용하여 ROS2는 데이터의 무결성과 기밀성을 유지하면서 통신할 수 있다.

**컴포넌트 기반 구조**

ROS2는 컴포넌트 기반 소프트웨어 설계를 채택하여, 로봇 애플리케이션을 모듈화하고 재사용성을 높였다. 이로 인해 로봇 개발자는 특정 기능을 독립적인 컴포넌트로 구현하고, 필요에 따라 이를 조합하여 복잡한 시스템을 구축할 수 있다.

컴포넌트 기반 구조는 각 기능이 독립적으로 개발, 테스트, 그리고 배포될 수 있게 하여, 시스템의 유지보수성과 확장성을 크게 향상시킨다. 이는 특히 대규모 로봇 시스템에서 다양한 팀이 협력하여 개발을 진행할 때 매우 유용하다.

**DDS 기반의 미들웨어**

ROS2의 가장 중요한 기술적 개선 중 하나는 DDS를 기반으로 한 미들웨어 계층의 도입이다. DDS는 분산 시스템에서 데이터의 송수신을 관리하는 표준 프로토콜로, 고가용성과 저지연성을 보장한다. ROS2는 DDS의 다양한 QoS(Quality of Service) 정책을 활용하여, 통신의 신뢰성, 실시간성, 그리고 네트워크 대역폭 사용을 효율적으로 관리할 수 있다. 이러한 특징은 특히 분산 시스템에서 다수의 노드 간 통신이 빈번하게 발생하는 로봇 시스템에 매우 유용하다.

ROS2에서 DDS의 주요 기능은 다음과 같다:

* **Topic 기반 통신**: 퍼블리셔와 서브스크라이버 패턴을 통해 데이터 전송을 관리하며, DDS는 이러한 통신을 비동기적이고 분산된 방식으로 처리한다.
* **QoS 설정**: ROS2는 다양한 QoS 정책을 제공하여, 메시지의 신뢰성, 우선순위, 전달 보증, 그리고 지연 시간 등에 대해 세부적으로 조정할 수 있다.
* **Discovery 메커니즘**: DDS는 노드 간 자동 탐색 기능을 제공하여, 네트워크에 연결된 장치들을 동적으로 인식하고 통신을 설정할 수 있다.

#### ROS2의 주요 구성 요소

**노드(Node)**

ROS2에서 노드는 기본적인 실행 단위로, 특정 작업을 수행하는 프로세스를 의미한다. 노드는 퍼블리셔, 서브스크라이버, 서비스 클라이언트, 그리고 서비스 서버와 같은 다양한 역할을 가질 수 있다. 노드 간의 통신은 메시지 패싱, 서비스 호출, 액션 서버를 통해 이루어진다.

노드는 로봇 소프트웨어의 모듈화를 지원하며, 각 노드는 독립적으로 개발 및 테스트될 수 있다. 이로 인해 복잡한 로봇 시스템을 구축하는 데 있어 유연성과 재사용성을 높일 수 있다.

**메시지(Message)와 서비스(Service)**

ROS2의 노드 간 통신은 메시지와 서비스를 통해 이루어진다. 메시지는 퍼블리셔와 서브스크라이버 간에 비동기적으로 전송되는 데이터 단위이다. 반면, 서비스는 요청-응답 패턴을 통해 노드 간의 동기적인 통신을 지원한다.

메시지는 특정 주제(topic)를 통해 전송되며, 주제는 네임스페이스를 통해 조직화될 수 있다. 이는 메시지 트래픽의 관리와 필터링을 용이하게 하며, 시스템의 복잡도를 줄이는 데 기여한다.

**액션(Action)**

ROS2의 액션은 복잡한 작업을 비동기적으로 수행할 수 있도록 지원하는 기능이다. 액션은 목표 설정, 진행 상황 모니터링, 그리고 중간 결과의 수신과 같은 기능을 제공한다. 이를 통해 장시간 소요되는 작업이나 복잡한 계산을 수행하는 데 적합한다.

액션 서버는 클라이언트로부터 목표를 수신하고, 작업을 수행하며, 결과를 반환한다. 클라이언트는 작업이 진행되는 동안 중간 상태를 수신하거나, 필요에 따라 작업을 취소할 수 있다. 이는 특히 로봇 팔 제어, 자율 주행 등의 응용에서 유용하게 활용된다.

#### ROS2의 통신 모델

ROS2는 ROS1과 달리 publish/subscribe 모델 외에도 다양한 통신 방식을 지원한다. 이러한 다양한 통신 방식은 시스템의 유연성을 높이고, 다양한 응용 시나리오에 적합한 통신 패턴을 선택할 수 있도록 한다.

* **Publish/Subscribe:**\
  ROS2에서 가장 널리 사용되는 통신 모델로, 특정 주제(topic)를 통해 데이터를 발행하고 이를 구독하는 방식이다. ROS1의 pub/sub 모델과 유사하지만, DDS 기반의 미들웨어 추상화 계층을 통해 QoS 설정이 가능해졌다.
* **Service/Client:**\
  요청-응답(request-response) 패턴을 구현하기 위해 사용되는 통신 방식이다. 이 패턴은 특정 Node가 서비스를 제공하고, 다른 Node가 그 서비스를 호출하여 결과를 받는 방식으로 이루어진다. 이는 ROS1의 서비스와 유사하지만, ROS2에서는 비동기 방식의 호출이 가능하여 더 높은 유연성을 제공한다.
* **Action:**\
  장기 실행 작업을 관리하기 위한 통신 방식으로, 목표(goal)를 설정하고 그 진행 상황을 지속적으로 모니터링하며, 필요 시 작업을 중단하거나 취소할 수 있다. 이는 ROS1의 actionlib과 유사하지만, ROS2에서는 더 나은 상태 관리와 피드백 기능을 제공한다.

#### ROS2의 네임스페이스와 런타임 매니지먼트

**네임스페이스(Namespace)**

ROS2는 네임스페이스를 활용하여, 복잡한 시스템에서의 자원 관리와 조직화를 지원한다. 네임스페이스는 주제(topic), 서비스, 그리고 노드 이름을 그룹화하여, 이름 충돌을 방지하고, 시스템의 구조를 명확하게 유지할 수 있다. 이는 특히 다수의 로봇이 동시 작동하는 멀티 로봇 시스템에서 매우 유용하다.

**런타임 매니지먼트**

ROS2는 런타임 매니지먼트 툴을 제공하여, 시스템의 상태 모니터링, 노드의 런타임 구성, 그리고 실시간 디버깅을 지원한다. ROS2의 런타임 매니지먼트는 `ros2` 명령줄 도구와 rqt 그래픽 인터페이스를 통해 수행되며, 이를 통해 개발자는 시스템의 각 부분을 손쉽게 모니터링하고 제어할 수 있다.

#### ROS2의 품질 관리 (Quality of Service, QoS)

ROS2는 다양한 통신 시나리오에 맞춰 QoS 설정을 세부적으로 조정할 수 있도록 지원한다. 이는 특히 실시간 통신이나 네트워크 조건이 가변적인 상황에서 매우 중요하다.

* **신뢰성 (Reliability):**\
  ROS2의 통신에서 메시지의 신뢰성 수준을 설정할 수 있다. `Reliable` 모드는 메시지의 손실 없이 전송되도록 보장하는 반면, `Best Effort` 모드는 가능한 한 빠르게 메시지를 전송하지만, 손실이 발생할 수 있다.
* **내구성 (Durability):**\
  ROS2는 이전에 발행된 메시지를 새로 연결된 구독자에게 전달할지 여부를 설정할 수 있다. `Transient Local` 모드는 이전 메시지를 유지하여 새 구독자가 받을 수 있게 하는 반면, `Volatile` 모드는 현재의 메시지만 전송한다.
* **우선 순위 (Priority):**\
  메시지 전송의 우선 순위를 설정하여 중요한 메시지가 먼저 처리되도록 할 수 있다. 이는 네트워크의 부하가 높은 상황에서 중요한 데이터를 놓치지 않도록 보장한다.
* **딜레이 (Deadline):**\
  특정 메시지가 수신되기까지의 최대 지연 시간을 설정하여, 일정 시간 내에 메시지가 도착하지 않으면 오류로 간주할 수 있다. 이는 실시간 제어가 중요한 로봇 시스템에서 매우 유용하다.

#### ROS2의 네이티브 크로스 플랫폼 지원

ROS2는 ROS1과 달리 멀티 플랫폼을 지원한다. ROS2는 리눅스(Linux)뿐만 아니라 윈도우(Windows), 맥OS(macOS), 그리고 RTOS(Real-Time Operating System)와 같은 다양한 운영 체제에서 동작할 수 있도록 설계되었다. 이는 ROS2가 로봇 소프트웨어 개발 환경의 제약을 크게 줄이고, 다양한 하드웨어 및 소프트웨어 환경에서의 활용을 가능하게 한다.

이를 위해 ROS2는 추상화 계층을 통해 운영 체제에 대한 의존성을 최소화하고, 플랫폼 간 호환성을 유지하면서도 각 운영 체제의 특성에 맞춘 최적화를 제공한다.

* **운영 체제 지원:**\
  ROS2는 리눅스, 윈도우, macOS 등 다양한 운영 체제를 지원한다. 이를 통해 다양한 개발 환경에서 ROS2를 사용할 수 있으며, 각 운영 체제별로 특화된 기능을 활용할 수 있다.
* **하드웨어 추상화:**\
  ROS2는 하드웨어에 대한 추상화를 제공하여, 다양한 하드웨어 플랫폼에서 동일한 코드를 실행할 수 있도록 한다. 이는 로봇 개발 시 하드웨어 종속성을 줄이고, 코드의 이식성을 높이는 데 기여한다.
* **빌드 시스템 (colcon):**\
  ROS2는 colcon을 기본 빌드 시스템으로 사용하여, 여러 패키지를 독립적으로 빌드하고 관리할 수 있도록 한다. colcon은 ROS1의 catkin을 대체하며, 병렬 빌드와 의존성 관리에서 더 나은 성능을 제공한다.

#### ROS2의 Node 간 통신

ROS2는 ROS1과 달리 네이티브 분산 시스템을 염두에 두고 설계되었다. 이는 ROS2가 복잡한 네트워크 환경에서도 안정적으로 동작할 수 있도록 한다.

* **Node 명명 및 네임스페이스:**\
  ROS2의 Node는 고유한 이름을 가지며, 네임스페이스를 통해 논리적으로 그룹화할 수 있다. 이는 대규모 시스템에서 Node를 효과적으로 관리하는 데 유용하다.
* **멀티캐스트 및 유니캐스트:**\
  ROS2는 멀티캐스트를 기본 통신 방식으로 사용하지만, 네트워크 환경에 따라 유니캐스트 통신도 지원한다. 이를 통해 네트워크 효율성을 극대화할 수 있다.
* **자율 분산 시스템:**\
  ROS2는 각 Node가 독립적으로 실행될 수 있도록 설계되었으며, 네트워크의 장애나 특정 Node의 오류에도 시스템이 안정적으로 동작할 수 있다. 이는 복잡한 로봇 시스템에서의 신뢰성을 높이는 데 중요한 역할을 한다.

#### ROS2의 시간 관리 및 동기화

ROS2는 로봇 시스템의 시간 관리와 동기화에 대한 다양한 기능을 제공한다. 이는 특히 분산 시스템에서 중요한 요소로 작용한다.

* **스테디 클락 (Steady Clock):**\
  ROS2는 시스템의 시간 동기화를 위해 스테디 클락을 도입하였다. 이는 시스템의 시간 기준을 일관되게 유지하고, 타임스탬프를 동기화하는 데 유용하다.
* **타이머 (Timer) 및 시계 (Clock) API:**\
  ROS2는 타이머 및 시계 API를 통해 시간 기반의 작업을 관리할 수 있다. 이는 주기적으로 실행되는 작업이나 특정 시간에 동작해야 하는 작업을 효과적으로 처리하는 데 사용된다.
* **시간 왜곡 (Time Dilation):**\
  ROS2는 시뮬레이션 환경에서 시간 왜곡을 처리할 수 있는 기능을 제공하여, 시뮬레이션 시간과 실제 시간의 차이를 보정할 수 있다. 이를 통해 시뮬레이션 환경에서의 실험이 보다 현실에 가까운 결과를 제공할 수 있다.

**실시간성 보장**

ROS2는 실시간 로봇 애플리케이션 개발을 지원하기 위해, 실시간 성능을 고려한 설계를 포함하고 있다. 이를 위해 ROS2는 실시간 운영 체제와의 호환성을 강화하고, 실시간 스케줄링, 실시간 통신, 그리고 우선순위 기반의 메시지 처리와 같은 기능을 제공한다.

특히, ROS2는 실시간 응용에서 중요한 과제인 "Deterministic Execution"을 달성하기 위해, DDS의 QoS 설정을 통해 메시지 전송의 지연 시간과 전달 성공률을 엄격하게 관리할 수 있다. 이를 통해 ROS2는 산업 자동화, 로봇 제어, 무인 시스템 등에서 요구되는 실시간 성능을 보장할 수 있다.

**보안성 강화**

ROS2는 ROS1의 한계 중 하나였던 보안성을 크게 강화하였다. ROS2는 DDS의 보안 확장인 DDS-Security를 활용하여, 데이터 전송의 기밀성, 무결성, 그리고 인증을 보장한다. 이를 통해 ROS2는 악의적인 공격으로부터 로봇 시스템을 보호하고, 민감한 데이터를 안전하게 처리할 수 있다.

ROS2의 보안성은 다음과 같은 측면에서 강화되었다:

* **Authentication**: 통신 주체 간의 신원 확인을 통해, 인증된 노드 간에만 데이터 전송이 허용된다.
* **Encryption**: 송수신되는 데이터는 암호화되어, 중간에 가로채진다 하더라도 내용을 확인할 수 없다.
* **Access Control**: 노드별로 접근 권한을 설정하여, 특정 주제(topic)에 대한 접근을 제한할 수 있다.

#### ROS2의 빌드 시스템 및 패키지 관리

ROS2는 ament 빌드 시스템을 사용하며, 이는 기존 ROS1에서 사용되었던 catkin 시스템의 후속작이다. ament는 CMake를 기반으로 하며, ROS2 패키지의 빌드와 테스트를 효율적으로 관리할 수 있는 기능을 제공한다. 또한, ROS2는 colcon이라는 빌드 도구를 도입하여, 여러 패키지를 병렬로 빌드할 수 있는 기능을 강화했다. 이러한 도구들은 ROS2 개발 환경의 효율성을 크게 향상시킨다.

#### ROS2의 생태계 및 커뮤니티

ROS2는 ROS1의 강력한 커뮤니티와 생태계를 이어받아 지속적으로 확장되고 있다. 전 세계의 개발자, 연구자, 그리고 산업체가 ROS2의 발전에 기여하고 있으며, 이를 통해 ROS2는 지속적으로 진화하고 있다. 또한, ROS2는 ROS1과의 하위 호환성을 유지하기 위해 ROS1 브리지(ROS1 bridge)와 같은 도구를 제공하여, ROS1에서 ROS2로의 전환을 지원하고 있다.

***

관련 자료:

* Open Robotics. (n.d.). ROS 2 Design. ROS 2 Documentation.
* Macenski, S., et al. (2022). Robot Operating System 2: Design, Architecture, and Uses in the Wild. IEEE Robotics & Automation Magazine.
* ROS 2 Working Group. (n.d.). ROS 2 Overview. ROS 2 Wiki.
