1261.33 토픽과 서비스의 조합 패턴

1. 토픽-서비스 조합의 필요성

실제 로봇 시스템에서는 토픽 통신과 서비스 통신 중 하나만으로는 모든 통신 요구사항을 충족시킬 수 없는 경우가 빈번하다. 토픽은 연속적 데이터 스트리밍에 최적화되어 있으나 요청-응답 관계를 제공하지 않으며, 서비스는 명시적 응답을 제공하나 연속적 데이터 전달에는 부적합하다. 두 통신 패러다임의 상호 보완적 조합을 통해 단일 패러다임의 한계를 극복하고, 복합적인 통신 구조를 구현할 수 있다.

2. 주요 조합 패턴

2.1 패턴 1: 서비스 호출에 의한 토픽 발행 개시

이 패턴에서는 서비스 호출을 통해 특정 토픽의 데이터 발행을 개시하거나 중단하는 제어 구조를 구현한다.

  • 서비스 역할: 센서 데이터 스트리밍의 시작·중지를 제어하는 명령 인터페이스로 사용된다.
  • 토픽 역할: 서비스 호출에 의해 활성화된 데이터 스트림을 연속적으로 전달한다.

예를 들어, 카메라 노드가 start_streaming 서비스를 수신하면 이미지 데이터의 토픽 발행을 개시하고, stop_streaming 서비스를 수신하면 발행을 중단한다. 이 패턴은 자원 사용을 최적화하기 위해 필요 시에만 데이터 스트리밍을 활성화하는 경우에 유용하다.

[클라이언트] --서비스 요청: start_streaming--> [카메라 노드]
[카메라 노드] --토픽 발행: /camera/image_raw--> [영상 처리 노드]
[클라이언트] --서비스 요청: stop_streaming--> [카메라 노드]

2.2 패턴 2: 토픽 데이터에 기반한 서비스 호출 트리거

이 패턴에서는 토픽을 통해 수신된 데이터가 특정 조건을 충족할 때 서비스 호출을 트리거한다.

  • 토픽 역할: 센서 데이터, 상태 정보 등을 주기적으로 수신한다.
  • 서비스 역할: 특정 조건이 감지되었을 때 시스템 구성 변경이나 일회성 작업을 요청한다.

예를 들어, 배터리 상태 토픽의 데이터를 모니터링하다가 배터리 잔량이 임계값 이하로 하락하면, 충전 스테이션으로의 귀환 경로를 계획하는 서비스를 호출한다.

[배터리 노드] --토픽 발행: /battery_state--> [미션 관리자]
[미션 관리자] --배터리 < 20% 감지--> [서비스 호출: /compute_path_to_dock]

2.3 패턴 3: 서비스 응답 결과의 토픽 발행

서비스 호출의 결과를 토픽을 통해 다수의 소비자에게 배포하는 패턴이다.

  • 서비스 역할: 특정 연산(예: 경로 계획)의 결과를 요청자에게 직접 반환한다.
  • 토픽 역할: 동일한 연산 결과를 시스템 내의 다른 관심 모듈에 비동기적으로 배포한다.

경로 계획 서비스의 결과를 서비스 응답으로 요청자에게 반환하는 동시에, 계획된 경로를 /planned_path 토픽을 통해 시각화 도구, 안전 감시 모듈, 로그 기록 모듈 등에 배포하는 구조가 이에 해당한다.

2.4 패턴 4: 서비스를 통한 토픽 구성 변경

이 패턴에서는 서비스 호출을 통해 토픽의 발행 주기, 메시지 필터링 조건, 데이터 해상도 등 토픽 스트림의 동작 특성을 런타임에 변경한다.

  • 서비스 역할: 토픽 스트림의 구성 매개변수를 변경하는 인터페이스를 제공한다.
  • 토픽 역할: 변경된 구성에 따라 데이터 발행 동작이 갱신된다.

LiDAR 노드에서 set_scan_rate 서비스를 통해 스캔 주파수를 10Hz에서 20Hz로 변경하면, /scan 토픽의 발행 주기가 자동으로 갱신되는 구조가 대표적이다.

2.5 패턴 5: 토픽과 서비스의 상태 머신 연동

유한 상태 머신(FSM)이나 행동 트리(Behavior Tree)와 연동하여, 토픽 데이터를 상태 전이의 입력으로 사용하고 서비스 호출을 상태 전이의 출력으로 사용하는 패턴이다.

  • 토픽 입력: 센서 데이터, 장애물 정보, 위치 정보 등을 상태 머신에 공급한다.
  • 서비스 출력: 상태 전이 시 모드 변경, 구성 업데이트, 일회성 작업 실행 등을 서비스 호출로 수행한다.

2.6 패턴 6: 헬스 체크와 데이터 스트림의 병행

토픽을 통해 데이터 스트림을 전달하면서, 동시에 서비스를 통해 해당 스트림의 발행자 상태를 진단하는 패턴이다.

  • 토픽 역할: 센서 데이터를 주기적으로 전달한다.
  • 서비스 역할: 센서 노드의 건강 상태, 자원 사용량, 오류 카운터 등을 요청 시 반환한다.

이 패턴은 시스템 모니터링과 장애 진단에 활용되며, 토픽 데이터의 수신이 중단되었을 때 서비스 호출을 통해 발행자 노드의 상태를 정밀하게 진단할 수 있다.

3. 조합 패턴의 구현 시 고려사항

3.1 통신 패러다임 간 의존성 관리

토픽과 서비스를 조합할 때 두 통신 경로 간의 의존성을 명확히 관리하여야 한다. 서비스 호출의 실패가 토픽 스트림에 미치는 영향, 토픽 데이터의 부재가 서비스 호출 로직에 미치는 영향 등을 설계 시 사전에 분석하고, 적절한 대체 경로(Fallback)를 마련하여야 한다.

3.2 실행자 구성과 스레딩 전략

토픽 콜백 내에서 서비스 호출을 수행하는 경우, 실행자의 스레딩 구성에 따라 교착 상태(Deadlock)가 발생할 수 있다. 단일 스레드 실행자 환경에서는 비동기 서비스 호출만을 사용하거나, 서비스 클라이언트를 재진입 가능 콜백 그룹에 할당하고 멀티 스레드 실행자를 사용하여야 한다.

3.3 데이터 일관성 보장

서비스 호출에 의해 토픽의 동작이 변경되는 패턴에서는 서비스 응답 시점과 토픽 동작 변경 시점 간의 시간차로 인한 데이터 불일치가 발생할 수 있다. 예를 들어, 센서 발행 주기 변경 서비스가 성공을 응답한 직후에도 변경된 주기가 즉시 적용되지 않을 수 있으며, 이 과도 기간(Transient Period)에 대한 처리를 고려하여야 한다.

3.4 오류 전파와 예외 처리

조합 패턴에서 하나의 통신 경로에서 발생한 오류가 다른 경로로 전파되는 방식을 설계하여야 한다. 서비스 호출이 실패한 경우 관련 토픽 스트림의 동작을 어떻게 처리할 것인지, 토픽 데이터 수신 실패가 서비스 호출 로직에 어떤 영향을 미치는지를 명확히 정의하여야 한다.

4. 조합 패턴의 한계와 액션 통신으로의 전환

토픽과 서비스의 조합을 통해 서비스 통신의 단방향성 한계와 토픽 통신의 비응답성 한계를 상당 부분 극복할 수 있으나, 장시간 작업의 체계적 관리에는 여전히 한계가 존재한다. 목표 설정, 진행 상황 보고, 결과 반환, 작업 취소를 하나의 통합된 프로토콜로 제공하는 액션(Action) 통신은 토픽과 서비스의 조합만으로는 구현하기 복잡한 이러한 요구사항을 표준화된 인터페이스로 해결한다.

5. 참고 문헌

  • Open Robotics, “ROS 2 Documentation: Humble Hawksbill,” https://docs.ros.org/en/humble/, 2022.
  • Quigley, M., Gerkey, B., Smart, W. D., Programming Robots with ROS: A Practical Introduction to the Robot Operating System, O’Reilly Media, 2015.
  • Gamma, E., Helm, R., Johnson, R., Vlissides, J., Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley, 1994.
  • Maruyama, Y., Kato, S., Azumi, T., “Exploring the Performance of ROS2,” Proceedings of the 13th International Conference on Embedded Software (EMSOFT), 2016.