**클라이언트 라이브러리(Client library)**는 사용자가 ROS 2 코드를 작성할 때 쓰는 API다. 이를 통해 노드, 토픽, 서비스 등 ROS 2 개념에 접근한다. 여러 언어로 제공되므로, 프로토타입은 Python, 성능이 중요한 부분은 C++처럼 목적에 맞는 언어를 선택할 수 있다.
서로 다른 클라이언트 라이브러리로 만든 노드도 메시지를 주고받을 수 있다. 모든 클라이언트 라이브러리가 인터페이스 파일용 코드 생성기를 제공해, 각 언어에서 동일한 ROS 2 인터페이스를 사용하기 때문이다.
클라이언트 라이브러리를 통해 접근하는 공통 기능 예: 이름·네임스페이스, 시간(실시간/시뮬), 파라미터, 콘솔 로깅, 스레딩 모델, 프로세스 내 통신 등.
공식 지원: rclcpp / rclpy
C++용 rclcpp와 Python용 rclpy는 둘 다 공통 코어 rcl을 사용하는 공식 클라이언트 라이브러리다.
- rclcpp: C++ 관용 인터페이스. 노드·퍼블리셔·서브스크라이버 등 ROS 클라이언트 기능 제공.
rcl과rosidlAPI 위에 구축되며,rosidl_generator_cpp로 생성된 C++ 메시지와 함께 사용. C++17 활용. API 문서. - rclpy: Python용.
rclC API 위에 구축, Python 관용 타입·패턴(list, context 등) 제공. 실행 모델은threading.Thread등으로rclAPI를 실행. 메시지는 Python 객체로 다루다가rcl계층으로 넘길 때 C 메시지로 변환(같은 프로세스 내 통신 시 변환 최소화). API 문서.
공통 코어: rcl
언어에 종속되지 않는 동작(파라미터, 네임스페이스 등)은 rcl(ROS Client Library)이라는 공통 C API에 구현되어 있다. 각 언어용 클라이언트 라이브러리는 이 rcl을 FFI로 래핑하는 형태라서, 라이브러리는 얇게 유지되고 동작이 언어 간에 일관된다. rcl 쪽 로직을 바꾸면 rcl을 쓰는 모든 클라이언트에 반영되며, 버그 수정도 한 곳에서 하면 된다.
언어별로만 구현되는 부분(예: “spin” 함수의 스레딩 모델)은 각 클라이언트 라이브러리에서 따로 구현한다.
**FFI(Foreign Function Interface)**란?
한 언어에서 다른 언어로 작성된 함수를 호출할 수 있게 하는 인터페이스다. 여기서는 C로 구현된 rcl을 Python·C++ 등에서 호출하는 데 쓰인다.
커뮤니티 유지 라이브러리
C++·Python 외에 커뮤니티에서 유지하는 클라이언트 라이브러리 예: Ada, C(rclc, micro-ROS), JVM/Android(Java, Android), .NET/C#, Node.js(rclnodejs), Rust(rclrs), Flutter/Dart 등. C#, Objective C/iOS, Zig 등은 구버전·미유지 상태로 문서에 명시되어 있다.
ROS 1과의 차이
ROS 1에서는 각 클라이언트 라이브러리가 처음부터 따로 만들어져, 예를 들어 Python은 순수 Python으로만 구현되는 장점이 있지만, 이름 규칙·동작이 라이브러리마다 다르고, 버그 수정을 여러 곳에 해야 하며, UDPROS처럼 한 라이브러리에만 있는 기능도 많다. ROS 2는 공통 코어(rcl) 를 두어 여러 언어용 클라이언트를 더 쉽게 만들고 동작을 맞추었다.