Booil Jung

ROS 2 Humble 메시징 시스템 완벽 가이드

ROS2(Robot Operating System 2)의 심장은 메시징 시스템이다. 이 시스템은 로봇 애플리케이션을 구성하는 분산된 노드(소프트웨어 모듈)들이 서로 통신하는 방식을 정의한다. 이는 단순히 데이터를 한 곳에서 다른 곳으로 보내는 것을 넘어, 전체 시스템의 강건함, 유연성, 그리고 확장성을 결정하는 핵심적인 아키텍처다.1

ROS2의 메시징 시스템은 ROS1의 한계를 극복하기 위해 근본부터 재설계되었다. 가장 큰 변화는 산업 표준 미들웨어인 DDS(Data Distribution Service)를 통신 계층의 기반으로 채택한 것이다.2 이 결정으로 인해 ROS2는 이전 버전과 비교할 수 없는 강력한 기능들을 갖추게 되었다. 본 가이드는 ROS2 Humble의 메시징 시스템을 구성하는 핵심 요소들을 깊이 있게 탐구한다.

이 가이드는 다음과 같은 구조로 진행된다.

  1. 통신 패러다임: 데이터의 흐름과 목적에 따라 토픽(Topics), 서비스(Services), 액션(Actions) 중 무엇을 선택해야 하는지 명확한 기준을 제시한다.
  2. 인터페이스 정의: 통신에 사용될 데이터의 구조를 설계하고, 표준 인터페이스를 활용하며, 필요에 따라 자신만의 커스텀 인터페이스를 만드는 방법을 다룬다.
  3. 구현: 명령줄 도구(CLI)와 Python(rclpy), C++(rclcpp) 코드를 통해 실제로 메시징 시스템을 사용하는 방법을 실습한다.
  4. 서비스 품질(QoS): 통신의 신뢰성, 내구성 등을 제어하여 다양한 네트워크 환경에 대응하는 방법을 알아본다.
  5. 아키텍처: 메시징 시스템의 근간을 이루는 DDS와 RMW(ROS Middleware Interface) 아키텍처를 이해하고, 이것이 시스템 전체에 어떤 영향을 미치는지 분석한다.

이 요소들을 깊이 있게 이해하는 것은 곧 견고하고 효율적인 ROS2 시스템을 설계하는 첫걸음이 될 것이다.4


ROS2는 세 가지 주요 통신 패러다임을 제공한다: 토픽, 서비스, 액션. 이들은 각각 다른 목적을 위해 설계되었으며, 어떤 것을 선택하는가는 시스템 전체의 아키텍처에 큰 영향을 미친다. 따라서 각 방식의 개념적 차이를 명확히 이해하고, 개발 중인 시스템의 요구사항에 가장 적합한 방식을 선택하는 것이 매우 중요하다.

토픽은 지속적으로 데이터가 흐르는 상황에 가장 이상적이다.

서비스는 즉각적인 응답이 필요한 단발성 상호작용에 적합하다.

액션은 시간이 오래 걸리고, 중간 과정에 대한 모니터링이 필요하며, 취소 기능이 요구되는 복잡한 작업에 사용된다.

토픽, 서비스, 액션의 선택은 단순히 데이터 전달 방식을 넘어, 노드 간의 결합도(Coupling)상태 관리(State Management)에 대한 근본적인 아키텍처 설계 결정이다.

[표 1-1]은 세 가지 통신 패러다임의 주요 특징을 비교한다.

특성 토픽 (Topic) 서비스 (Service) 액션 (Action)
통신 모델 발행/구독 요청/응답 목표/피드백/결과
동기성 비동기 동기 (클라이언트 관점) 비동기
실행 시간 제약 없음 짧은 시간 긴 시간
피드백 없음 없음 있음
취소(선점) 불가 불가 불가
연결 관계 다대다 (M:N) 일대일 (1:1) 일대일 (1:1)
결합도 매우 낮음 (Decoupled) 높음 (Tightly Coupled) 중간 (Statefully Coupled)
주요 사용 사례 센서 데이터/상태 방송 빠른 RPC/트리거 내비게이션/조작

이 표에서 ‘결합도’는 특히 중요한 개념이다. ROS2의 통신 방식은 단순한 API가 아니라, 시스템의 모듈성, 견고성, 확장성을 결정하는 아키텍처 패턴이다.

결론적으로, 어떤 통신 방식을 선택하는가는 “데이터를 어떻게 보낼까?”라는 단순한 질문이 아니다. 이는 “노드들이 서로에 대해 얼마나 알아야 하고, 상호작용의 생명주기를 어떻게 관리할 것인가?”라는 아키텍처 수준의 질문에 답하는 과정이다.


ROS2 통신에서 주고받는 모든 데이터는 ‘인터페이스(Interface)’라는 명확한 구조를 통해 정의된다. 인터페이스를 잘 설계하고 관리하는 것은 시스템의 안정성과 재사용성을 높이는 데 매우 중요하다. 이 장에서는 ROS2가 제공하는 표준 인터페이스를 효과적으로 활용하는 방법과, 필요에 따라 애플리케이션에 특화된 커스텀 인터페이스를 설계하고 빌드하는 전 과정을 상세히 다룬다.

ROS2는 재사용성과 표준화를 위해 common_interfaces라는 패키지 그룹을 통해 다양한 분야에서 널리 사용되는 메시지 타입들을 미리 정의하여 제공한다.23 새로운 인터페이스를 만들기 전에, 이미 원하는 목적에 맞는 표준 인터페이스가 있는지 확인하는 것이 좋다. 이는 다른 ROS2 패키지(예: RViz, Navigation2)와의 호환성을 보장하는 가장 좋은 방법이다.

[표 2-1]은 다양한 ROS2 애플리케이션에서 자주 사용되는 주요 표준 인터페이스 메시지 타입들을 요약한 것이다.

패키지 메시지 타입 설명 주요 필드 사용 예시
std_msgs String 간단한 문자열 데이터 string data 디버깅 메시지 출력, 간단한 명령 전달
geometry_msgs PoseStamped 타임스탬프와 좌표계 정보가 포함된 자세 std_msgs/Header header, Pose pose 로봇의 목표 자세 지정, 객체의 위치 및 방향 표현
geometry_msgs Twist 선속도와 각속도 Vector3 linear, Vector3 angular 로봇의 이동 속도 제어 명령 (/cmd_vel 토픽)
sensor_msgs Image 카메라 이미지 데이터 Header header, uint32 height, uint32 width, uint8 data 카메라 드라이버, 이미지 처리 노드
sensor_msgs LaserScan 2D LiDAR 스캔 데이터 Header header, float32 angle_min, float32 angle_max, float32 ranges 장애물 회피, SLAM
sensor_msgs Imu 관성 측정 장치 데이터 Header header, Quaternion orientation, Vector3 angular_velocity, Vector3 linear_acceleration 로봇의 자세 추정
sensor_msgs JointState 로봇 관절들의 상태 Header header, string name, float64 position, float64 velocity 로봇 팔 제어, 로봇 상태 시각화

표준 인터페이스만으로는 애플리케이션에 특화된 모든 데이터를 표현하기 어렵다. 예를 들어, ‘여러 개의 LED 색상과 밝기를 동시에 제어하는 명령’이나 ‘로봇 그리퍼의 현재 상태(열림, 닫힘, 파지력)’와 같은 데이터는 커스텀 인터페이스로 정의해야 한다.

커스텀 인터페이스를 정의하는 것만으로는 충분하지 않다. ROS2 빌드 시스템에 이 인터페이스의 존재를 알리고, C++이나 Python과 같은 프로그래밍 언어에서 사용할 수 있는 코드로 변환하는 과정이 필요하다.

package.xml 파일은 패키지의 메타 정보와 의존성을 정의한다. 인터페이스 패키지에서는 다음 태그들이 특히 중요하다.

ament_cmake 타입의 인터페이스 패키지에서는 CMakeLists.txt 파일이 빌드 과정을 제어한다.

그렇다면 왜 인터페이스 패키지는 반드시 ament_cmake 타입이어야만 할까? 이는 ROS2의 다국어 지원이라는 핵심 철학과 깊은 관련이 있다. ROS2에서 인터페이스 정의와 코드 생성은 특정 프로그래밍 언어에 종속되지 않는 근본적인 빌드 과정이다. rosidl이라는 도구는 .msg와 같은 추상적인 인터페이스 정의를 읽어들여, 이를 먼저 DDS가 사용하는 표준 언어인 IDL(.idl) 파일로 변환한다.35 그 다음, 이 IDL 파일을 기반으로 C++ 헤더 파일, Python 클래스 파일 등 각 언어에 맞는 구체적인 코드를 생성한다.

이 변환 및 생성 과정 전체를 관장하는 rosidl 도구 모음 자체가 C/C++ 기반으로 구축되어 있다. 따라서 이 과정을 실행하고 제어하는 빌드 시스템은 C++ 빌드 도구인 CMake를 사용하는 ament_cmake여야만 한다. 이는 Python만 사용하는 개발자에게는 다소 번거롭게 느껴질 수 있지만, ROS2의 가장 큰 장점 중 하나인 다국어 지원을 가능하게 하는 의도적인 설계 결정이다. 이 아키텍처는 데이터의 ‘명세(specification)’와 ‘구현(implementation)’을 명확히 분리하여, 언어에 구애받지 않는 견고하고 재사용 가능한 시스템을 구축하도록 유도한다.


개념을 이해하고 인터페이스를 정의했다면, 이제 실제로 노드를 만들고 통신을 구현할 차례다. ROS2는 강력한 명령줄 도구(CLI)를 제공하여 시스템을 실시간으로 분석하고 디버깅할 수 있게 해주며, Python과 C++를 위한 직관적인 클라이언트 라이브러리(RCL)를 제공한다.

ros2 CLI는 실행 중인 ROS 시스템을 들여다보고(introspect), 직접 상호작용할 수 있는 가장 기본적이면서도 강력한 도구다. 코드를 한 줄도 작성하지 않고도 시스템의 상태를 확인하고, 데이터를 주입하며, 문제를 진단할 수 있다.36

rclpy는 ROS2의 공식 Python 클라이언트 라이브러리로, Python을 사용하여 ROS2 노드를 쉽게 작성할 수 있게 해준다.

rclcpp는 ROS2의 공식 C++ 클라이언트 라이브러리다. rclpy와 개념적으로는 동일한 기능들을 제공하지만, C++의 특징인 정적 타입, 컴파일 타임 검사, 스마트 포인터(std::shared_ptr) 등을 활용하여 더 높은 성능과 안정성을 제공한다.


ROS2의 가장 강력한 기능 중 하나는 서비스 품질(Quality of Service, QoS)을 세밀하게 제어할 수 있다는 점이다. QoS는 노드 간의 통신이 얼마나 신뢰성 있게, 그리고 어떤 방식으로 이루어질지를 정의하는 규칙들의 집합이다. 이를 통해 개발자는 다양한 네트워크 환경과 애플리케이션의 요구사항에 맞춰 통신을 최적화할 수 있다.

ROS1은 주로 안정적인 유선 LAN 환경을 가정하고 설계되었으며, 기본 통신 프로토콜로 신뢰성 있는 TCP(TCPROS)를 사용했다.9 이 방식은 데이터 유실이 거의 없는 환경에서는 잘 작동했지만, 손실이 잦은 무선 네트워크나, 데이터의 최신성이 신뢰성보다 더 중요한 실시간 시스템에서는 한계가 있었다.

ROS2는 이러한 한계를 극복하기 위해 DDS를 통신 기반으로 채택했다. DDS는 기본적으로 비연결성 프로토콜인 UDP 위에서 동작하므로, 개발자는 통신의 신뢰성 수준을 직접 선택할 수 있다. QoS는 바로 이 유연성을 개발자가 제어할 수 있도록 제공되는 강력한 도구다. QoS를 통해 ROS2 통신은 TCP처럼 신뢰성을 보장할 수도, UDP처럼 최선을 다해 전달할 수도 있으며, 그 사이의 수많은 상태를 구현할 수 있다.9

QoS 프로파일은 여러 QoS ‘정책(Policy)’들의 조합으로 구성된다. 가장 중요하고 자주 사용되는 정책들은 다음과 같다.

매번 모든 QoS 정책을 수동으로 설정하는 것은 복잡하고 오류가 발생하기 쉽다. 이를 위해 ROS2는 일반적인 사용 사례에 맞춰 미리 정의된 QoS 프로파일들을 제공한다.9

[표 4-1]은 주요 사전 정의 QoS 프로파일의 설정과 사용 사례를 보여준다.

프로파일 Reliability Durability History Depth 주요 사용 사례
Default RELIABLE VOLATILE KEEP_LAST 10 일반적인 발행/구독. ROS1과 유사한 동작을 제공하여 마이그레이션을 돕는다.9
Services RELIABLE VOLATILE KEEP_LAST 10 서비스 통신. 재시작된 서버가 오래된 요청을 받지 않도록 VOLATILE 설정이 중요하다.9
Sensor Data BEST_EFFORT VOLATILE KEEP_LAST 5 고주파 센서 데이터. 최신성이 신뢰성보다 중요하며, 약간의 데이터 유실은 허용된다.9
Parameters RELIABLE VOLATILE KEEP_LAST 1000 파라미터 통신. 통신이 잠시 끊겨도 파라미터 설정 요청이 유실되지 않도록 큰 큐 크기를 가진다.9
System Default RMW 구현체 기본값 RMW 구현체 기본값 RMW 구현체 기본값 - RMW 벤더마다 설정이 다를 수 있어 이식성을 위해 명시적인 프로파일 사용이 권장된다.9

발행자와 구독자 간의 통신이 이루어지려면, 양측의 QoS 프로파일이 서로 ‘호환(compatible)’되어야 한다. 만약 호환되지 않는 QoS 설정으로 통신을 시도하면, 아무런 에러 메시지 없이 조용히 연결이 실패하고 데이터가 전달되지 않는다. 이는 ROS2 초보자들이 가장 흔하게 겪는 문제 중 하나다.


ROS2 메시징 시스템의 강력함과 유연성은 그 기반이 되는 아키텍처에서 비롯된다. 왜 ROS2가 DDS를 선택했는지, 그리고 RMW라는 추상화 계층이 어떤 역할을 하는지를 이해하는 것은 ROS2의 동작 방식을 깊이 있게 파악하고, 복잡한 문제를 해결하는 데 필수적이다.

ROS1은 roscore라는 중앙 집중식 마스터 노드와 자체적으로 개발한 TCPROS/UDPROS 통신 프로토콜에 의존했다. 이는 단일 로봇 환경에서는 잘 작동했지만, 여러 로봇으로 구성된 대규모 시스템이나 불안정한 네트워크 환경에서는 확장성과 강건성에 한계를 보였다.

ROS2는 이러한 문제를 해결하기 위해 DDS(Data Distribution Service)를 핵심 미들웨어로 채택했다. DDS는 OMG(Object Management Group)에서 제정한 산업 표준으로, 항공, 국방, 금융 등 높은 신뢰성과 성능이 요구되는 분야에서 수십 년간 검증된 기술이다. ROS2가 DDS를 선택한 이유는 다음과 같다.2

DDS는 매우 강력하지만, 그 자체로 복잡하고 다양한 벤더(e.g., eProsima Fast DDS, RTI Connext DDS, Eclipse Cyclone DDS)들이 존재한다. 만약 ROS2가 특정 벤더의 DDS API에 직접적으로 의존했다면, ROS2 생태계 전체가 해당 벤더에 종속되었을 것이다.

이를 피하기 위해 ROS2는 RMW(ROS Middleware Interface)라는 독창적인 추상화 계층을 도입했다. RMW는 ROS2의 상위 API(rclcpp, rclpy)와 특정 DDS 구현체 사이의 ‘어댑터’ 또는 ‘플러그인 인터페이스’ 역할을 한다.35

이 DDS/RMW 아키텍처는 ROS2 메시징 시스템의 핵심 동작 방식에 직접적인 영향을 미친다.

RMW의 존재는 ROS2에 엄청난 유연성을 주지만, 한편으로는 ‘의도된 불완전함’을 내포한다. ROS2의 설계 목표는 ‘완벽한 DDS 래퍼(wrapper)’가 되는 것이 아니라, ‘일관성 있고 사용하기 쉬운 ROS 생태계’를 우선시하는 것이다. 이 추상화는 DDS의 복잡성을 숨겨 개발자 경험을 향상시키지만, 동시에 DDS의 모든 잠재력을 활용하는 것을 막고 네이티브 시스템과의 통합을 더 복잡하게 만드는 ‘의도된 트레이드오프’이다.

예를 들어, ROS2의 토픽 이름 규칙(예: /my_topic)과 DDS의 토픽 이름 규칙이 다르거나, ROS2가 사용하는 DDS 파티션(Partition) 명명 규칙 때문에, 순수한 DDS로만 작성된 애플리케이션과 ROS2 노드가 직접 통신하는 데 어려움을 겪을 수 있다.48

이는 ROS2 기반 시스템을 다른 산업용 DDS 시스템과 통합하려는 개발자가 반드시 이해해야 할 중요한 아키텍처적 함의다. 문제 해결을 위해서는 RMW 계층을 우회하여 네이티브 DDS 객체에 직접 접근하는 방법을 고려하거나, 양쪽 시스템이 모두 동의하는 특정 토픽 이름과 QoS 규칙을 사용하도록 구성해야 할 수 있다.48 RMW는 단순한 어댑터가 아니라, ROS 생태계의 철학을 강제하는 ‘필터’이자 ‘게이트웨이’이며, 이로 인한 호환성 문제는 버그가 아니라 더 높은 수준의 목표(개발자 경험, 벤더 독립성)를 위한 의도된 설계의 결과물로 해석해야 한다.


지금까지 ROS2 Humble의 메시징 시스템을 구성하는 핵심 요소들을 다각도에서 깊이 있게 살펴보았다. ROS2 메시징 시스템은 토픽, 서비스, 액션이라는 명확한 통신 패러다임, 커스텀 가능한 인터페이스, 강력한 QoS 제어, 그리고 DDS/RMW라는 견고한 아키텍처 기반 위에 구축되어 있다.

이러한 이해를 바탕으로, 더 안정적이고 효율적이며 확장 가능한 로봇 시스템을 설계하기 위한 몇 가지 제언을 하고자 한다.

  1. 인터페이스를 먼저 설계하라: 노드 코드를 작성하기 전에, 시스템의 노드들이 어떤 데이터를 주고받을지 먼저 고민하고, 이를 _interfaces 패키지에 명확히 정의하라. 이는 시스템의 API를 설계하는 것과 같다. 잘 정의된 인터페이스는 시스템의 구조를 명확하게 하고, 팀원 간의 협업을 원활하게 한다.
  2. 통신 방식을 신중히 선택하라: 데이터의 특성(지속성, 요청/응답, 장기 작업)뿐만 아니라, 노드 간의 결합도와 상태 관리 측면에서 토픽, 서비스, 액션을 전략적으로 선택하라. 잘못된 선택은 시스템을 불필요하게 복잡하게 만들거나 성능을 저하시킬 수 있다.
  3. QoS를 적극적으로 활용하되, 명시적으로 하라: 모든 통신에는 의도가 있다. 데이터의 중요도와 네트워크 환경을 고려하여 SensorDataDefault 같은 사전 정의된 프로파일을 코드에 명시적으로 사용하라. RMW 구현체마다 기본값이 다를 수 있는 SystemDefault에 의존하는 것은 이식성을 해칠 수 있다.
  4. CLI는 당신의 가장 친한 친구다: 시스템이 예상대로 동작하지 않을 때, 가장 먼저 ros2 topic/service/action info -v와 같은 CLI 도구를 사용하여 노드 간의 연결 상태와 QoS 설정을 확인하라. 대부분의 통신 문제는 이 단계에서 원인을 찾을 수 있다.
  5. DDS/RMW를 이해하면 디버깅이 쉬워진다: 노드 간 연결이 안 되거나 메시지가 유실될 때, 문제의 원인이 애플리케이션 로직이 아닌 QoS 호환성이나 RMW의 동작 방식에 있을 수 있음을 인지하라. 이 근본적인 아키텍처에 대한 이해는 해결할 수 없는 것처럼 보였던 문제의 실마리를 제공할 것이다.

ROS2 메시징 시스템은 단순한 데이터 파이프라인이 아니다. 그것은 분산 로봇 시스템이라는 복잡한 문제를 해결하기 위한 정교한 철학과 아키텍처의 집약체다. 이 가이드가 그 깊이를 이해하고, 당신의 다음 로봇 프로젝트를 성공으로 이끄는 데 든든한 발판이 되기를 바란다.

  1. ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/index.html
  2. Decentralized Information-Flow Control for ROS2 - Network and Distributed System Security (NDSS) Symposium, accessed July 27, 2025, https://www.ndss-symposium.org/wp-content/uploads/2024-101-paper.pdf
  3. ROS on DDS - ROS2 Design, accessed July 27, 2025, https://design.ros2.org/articles/ros_on_dds.html
  4. Tutorials - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://ftp.udx.icscoe.jp/ros/ros_docs_mirror/en/humble/Tutorials.html
  5. Beginner: CLI tools - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools.html
  6. Tutorials - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/Tutorials.html
  7. Understanding topics - ROS 2 Documentation: Humble …, accessed July 27, 2025, https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Understanding-ROS2-Topics/Understanding-ROS2-Topics.html
  8. Topics - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/Concepts/Basic/About-Topics.html
  9. Quality of Service settings - ROS 2 Documentation: Humble …, accessed July 27, 2025, https://docs.ros.org/en/humble/Concepts/Intermediate/About-Quality-of-Service-Settings.html
  10. Topics vs Services vs Actions - ROS 2 Documentation: Foxy …, accessed July 27, 2025, https://docs.ros.org/en/foxy/How-To-Guides/Topics-Services-Actions.html
  11. Topics vs. Services vs. Actions in ROS2-Based Projects - Automatic Addison, accessed July 27, 2025, https://automaticaddison.com/topics-vs-services-vs-actions-in-ros2-based-projects/
  12. Built-in Message Type Introduction to ROS2 and Robotics, accessed July 27, 2025, https://www.learnros2.com/ros/ros2-building-blocks/built-in-types/built-in-message-type
  13. ROS2 in UR whitepaper - Documentation for Universal Robots, accessed July 27, 2025, https://docs.universal-robots.com/PolyScopeX_SDK_Documentation/build/SDK-v0.13/_downloads/305de110674c8345261f1ca772bb3c6f/ROS2inURwhitepaper.html
  14. Understanding services - ROS 2 Documentation: Humble …, accessed July 27, 2025, https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Understanding-ROS2-Services/Understanding-ROS2-Services.html
  15. Understanding services - ROS 2 Documentation: Foxy documentation, accessed July 27, 2025, https://docs.ros.org/en/foxy/Tutorials/Beginner-CLI-Tools/Understanding-ROS2-Services/Understanding-ROS2-Services.html
  16. Writing a simple service and client (Python) - ROS 2 Documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Py-Service-And-Client.html
  17. Understanding actions - ROS 2 Documentation: Humble …, accessed July 27, 2025, https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Understanding-ROS2-Actions/Understanding-ROS2-Actions.html
  18. Actions - ROS2 Design, accessed July 27, 2025, https://design.ros2.org/articles/actions.html
  19. 5.3.1.7. Understanding actions - Vulcanexus 1.0.0 documentation, accessed July 27, 2025, https://docs.vulcanexus.org/en/iron/ros2_documentation/source/Tutorials/Beginner-CLI-Tools/Understanding-ROS2-Actions/Understanding-ROS2-Actions.html
  20. Writing an action server and client (Python) - ROS 2 …, accessed July 27, 2025, https://docs.ros.org/en/humble/Tutorials/Intermediate/Writing-an-Action-Server-Client/Py.html
  21. ROS2 Basics for Python (Humble) Course - The Construct, accessed July 27, 2025, https://www.theconstruct.ai/robotigniteacademy_learnros/ros-courses-library/ros2-basics-python/
  22. [ROS2 How-to] ROS2 Topics vs Services vs Actions #5 - The Construct, accessed July 27, 2025, https://www.theconstruct.ai/ros2-how-to-ros2-topics-vs-services-vs-actions-5/
  23. common_interfaces/sensor_msgs/msg/Imu.msg at rolling - GitHub, accessed July 27, 2025, https://github.com/ros2/common_interfaces/blob/rolling/sensor_msgs/msg/Imu.msg
  24. ROS Package: std_msgs, accessed July 27, 2025, https://index.ros.org/p/std_msgs/
  25. Tutorial 2: Communications using topics - 240AR060 - Introduction to ROS, accessed July 27, 2025, https://sir.upc.edu/projects/ros2tutorials/2-communications_using_topics/index.html
  26. ROS2 Create Custom Message (Msg/Srv) - The Robotics Back-End, accessed July 27, 2025, https://roboticsbackend.com/ros2-create-custom-message/
  27. Creating custom msg and srv files - ROS 2 Documentation …, accessed July 27, 2025, https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Custom-ROS2-Interfaces.html
  28. Creating a dedicated package for custom interfaces - (Murilo’s) ROS2 Tutorial, accessed July 27, 2025, https://ros2-tutorial.readthedocs.io/en/latest/create_interface_package.html
  29. Creating an action - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/Tutorials/Intermediate/Creating-an-Action.html
  30. Expanding on ROS 2 interfaces - ROS documentation, accessed July 27, 2025, https://docs.ros.org/en/crystal/Tutorials/Single-Package-Define-And-Use-Interface.html
  31. Robotics crash course (Part 13 - Creating a custom interface) - Jeremy Pedersen, accessed July 27, 2025, https://jeremypedersen.com/posts/2024-08-22-pt13-custom-interfaces/
  32. ROS2 Tutorials #7: How to create a ROS2 Custom Message - The Construct, accessed July 27, 2025, https://www.theconstruct.ai/ros2-tutorials-7-how-to-create-a-ros2-custom-message-new/
  33. Creating custom msg and srv. Python - ROS 2 course 0.1 documentation - Read the Docs, accessed July 27, 2025, https://ros2course.readthedocs.io/en/latest/Creating%20custom%20msg%20and%20srv.%20Python.html
  34. ament_cmake user documentation - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/How-To-Guides/Ament-CMake-Documentation.html
  35. About internal ROS 2 interfaces - ROS documentation, accessed July 27, 2025, https://docs.ros.org/en/dashing/Concepts/About-Internal-Interfaces.html
  36. Introspection with command line tools - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/Concepts/Basic/About-Command-Line-Tools.html
  37. ros2/ros2cli: ROS 2 command line interface tools - GitHub, accessed July 27, 2025, https://github.com/ros2/ros2cli
  38. ROS 2 Commands Cheat Sheet - The Robotics Space, accessed July 27, 2025, https://www.theroboticsspace.com/assets/article3/ros2_humble_cheat_sheet2.pdf
  39. Writing a simple publisher and subscriber (Python) - ROS 2 …, accessed July 27, 2025, https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Py-Publisher-And-Subscriber.html
  40. ROS2 Actions [1H Crash Course] - YouTube, accessed July 27, 2025, https://www.youtube.com/watch?v=X7YSnDbKMWo
  41. Writing a simple service and client (C++) - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Cpp-Service-And-Client.html
  42. Writing an action server and client (C++) - ROS 2 Documentation: Humble documentation, accessed July 27, 2025, https://docs.ros.org/en/humble/Tutorials/Intermediate/Writing-an-Action-Server-Client/Cpp.html
  43. ROS 2 Quality of Service policies - ROS2 Design, accessed July 27, 2025, https://design.ros2.org/articles/qos.html
  44. Quality of Service (QoS) - Steven Gong, accessed July 27, 2025, https://stevengong.co/notes/Quality-of-Service
  45. ROS 2 Quality of Service (QoS) - Isaac Sim Documentation - NVIDIA, accessed July 27, 2025, https://docs.isaacsim.omniverse.nvidia.com/4.2.0/ros2_tutorials/tutorial_ros2_qos.html
  46. Quality of Service Introduction to ROS2 and Robotics, accessed July 27, 2025, https://www.learnros2.com/ros/ros2-building-blocks/quality-of-service
  47. ROS 2 middleware interface - ROS2 Design, accessed July 27, 2025, https://design.ros2.org/articles/ros_middleware_interface.html
  48. Ros2 and DDS messaging - ROS General - Open Robotics Discourse, accessed July 27, 2025, https://discourse.ros.org/t/ros2-and-dds-messaging/1556