ROS 2는 내부적으로 여러 API들로 구성되어 동작합니다. API는 Application Programming Interface의 줄임말로, 응용프로그램에서 다른 프로그램 또는 기능들을 사용할 수 있도록 돕는 인터페이스입니다. 인터페이스는 서로 다른 두 개의 시스템 또는 장치 사이에서 정보나 신호를 주고받기 위한 매개체를 말합니다.
실생활에서 볼 수 있는 인터페이스의 간단한 예를 들자면, 음식점의 키오스크에서 음식 버튼을 누르면 음식이 장바구니에 추가되고 주문하기 버튼을 누르면 결제창으로 이동하게 됩니다. 이는 키오스크에 사용자와 상호작용하기 위한 인터페이스가 정의되어 있기 때문입니다.

ROS 2는 각 기능과 언어에 맞는 인터페이스가 구현되어 있습니다. 덕분에, 일반적으로는 다른 프로그래밍 언어로 구현된 구조나 데이터 등을 가져와 사용할 수 없지만 ROS 2에서는 가능하게 됩니다.

ROS 2는 위 이미지처럼 다양한 계층으로 구성되어 있습니다. 우리가 작성하게 될 코드는 User Application 계층에 속하게 됩니다. ROS 2에서는 다양한 프로그래밍 언어로 코드를 작성할 수 있는데요. 이는 프로그래밍 언어마다 구현된 Client 라이브러리가 ROS 2의 기능이 정의되어 있는 **rcl(ROS Client Library)**을 해당 언어에 맞게 변환해주기 때문입니다. 예를 들어, 파이썬으로 ROS 2 코드를 작성할 때 사용하는 rclpy 모듈, C++로 코드를 작성할 때 사용되는 rclcpp 라이브러리 등이 있습니다.
<aside> 💡 ROS 2의 구조와 디자인에 대해서 조금 더 자세히 알아보고 싶다면 아래의 링크에서 확인할 수 있습니다.
</aside>
ROS 2에서 **패키지(Package)**는 코드, 문서, 리소스(코드 동작에 필요한 데이터 등) 등을 포함한 하나의 묶음입니다. ROS 2 코드를 작성할 때는 가장 먼저 패키지를 생성해야 합니다. ROS 2는 C++과 파이썬을 공식적으로 지원하기에 각 언어로 구성된 패키지를 생성할 수 있습니다.


ROS 2에서는 패키지 단위로 코드를 작성하고 빌드합니다. 따라서, 코드 작성에 사용된 언어에 맞는 빌드 유형으로 패키지를 생성해야 합니다. ROS 2에서는 빌드 시스템으로 ament를 사용합니다. 빌드 시스템은 단일 패키지에 대해 실행할 수 있는 파일을 생성하는 역할을 합니다.
C++ 패키지는 CMake 기반의 ament_cmake를 사용해 빌드합니다. 패키지 내에 CMakeLists.txt 파일로 빌드와 관련된 자세한 사항을 지정할 수 있습니다. 파이썬 패키지는 setuptools 기반의 ament_python을 사용해 빌드합니다. 패키지 내에 setup.py 파일로 빌드와 관련된 자세한 사항을 지정할 수 있습니다.
최종적으로는 colcon이라는 빌드 도구를 사용해 각 패키지에 맞는 빌드 시스템으로 빌드를 진행하게 됩니다.

패키지에서 소스코드는 기능별로 분리하여 노드(Node) 단위로 작성합니다. 특정 모듈을 사용하기 위한 드라이버 노드, 데이터를 시각화하기 위한 노드, 데이터를 가공하는 노드 등 다양한 노드를 만들 수 있습니다. 노드는 패키지의 구성요소 중 하나로 실질적인 동작은 노드에 구현하게 됩니다. 노드는 반드시 패키지에 속해야 하며, 다르게 표현하면 패키지는 여러 노드의 집합으로 표현할 수 있습니다.