Inter-Process Communication : 서로 다른 프로세스 간 데이터를 주고받는 방식
-> 일반적인 노드 개발 방식
-> 너무 많은 노드 생성으로 인한 많은 프로세스가 생성 시 성능이 안 좋아짐
- ROS2는 복수 개의 node를 사용하여 개발이 이루어지고, 단일 컴퓨팅 시스템에서 복수 개의 node 실행 시 노드 하나당 하나의 프로세스가 할당되게 된다. 그때 각각의 프로세스들끼리 데이터를 원활하게 주고 받을 수 있도록하는 것이 IPC이다.
- shared memory, pipes, sockets, ROS 2 노드 간 일반 통신

- 기본적인 데이터 복사 방식 -> 일반적으로 ROS2에서 노드 간에 데이터를 전달할 때의 방식
- 퍼블리셔가 메세지를 생성
- 사용자가 메세지를 생성하면 해당 데이터가 메모리에서 특정 주소에 저장됨
- DDS 미들웨어를 통한 데이터 전달
- ROS2는 DDS(Data Distribution Service)를 사용하여 메세지를 전달함
- 일반적인 DDS 구현에서는 데이터를 네트워크 버퍼 또는 공유 메모리로 복사하여 송신
- 구독자가 데이터를 수신
- 수신된 데이터는 다시 사용자 프로그램의 메모리로 복사됨
- 여러개의 구독자가 존재할 경우 각 구독자에게 별도로 복사됨
- 퍼블리셔가 메세지를 생성
- 이 과정에서 여러 번의 메모리 복사가 발생한다.(구독 노드가 3개라면 3개의 메모리 복사) 특히 대용량 데이터(이미지, 라이다 데이터 등)을 전송시 메모리 사용량 증가와 성능 저하로 이어질 수 있다.

IPC가 프로세스들끼리의 통신을 원활하게 해줘서 효과적이기는 하지만 노드들이 많아지는 경우 그만큼 프로세스가 많아져서 전체적인 성능 저하 및 메모리 사용량이 증가한다는 단점이 있다.
그래서 ROS2에서는 하나의 프로세스에서 노드끼리 메모리를 공유하며 통신을 하게 해주는 "Intra-process communication"이 나오게 되었다.
Intra-process communication : 같은 프로세스 내에서 노드끼리 메모리를 공유하며 통신하는 방식 -> ROS2에서는 IPC라 부름
- ROS2에서 노드들이 증가함에 따라 프로세스의 수의 증가로 인한 전체적인 성능 저하 및 메모리 사용량이 증가하는 단점을 해결하기 위해 나온 통신 방식
- Zero-Copy 방식 : 데이터 복사를 최소화하여 성능을 최적화하는 기술
-> ROS2는 메시지를 복사하지 않고 공유 포인터만 전달한다.
- Fast DDS SHM(Shared Memory) 및 Cyclone DDS lceoryx 등의 DDS 미들웨어에서 지원함
- Zero-Copy 방식의 데이터 흐름
- 퍼블리셔가 메세지를 생성하면, 데이터가 공유 메모리(SHM, Shared Memory)에 저장됨
- DDS는 데이터를 네트워크로 전송하지 않고, 같은 프로세스 또는 동일한 머신 내의 구독자들에게 참조 방식으로 전달
- 구독자는 데이터를 복사 없이 직접 참조하여 사용
- 즉, 데이터가 한 번만 생성되고, 여러 구독자가 이를 직접 읽을 수 있어 메모리 복사가 필요 없다.

Intra-process communication 을 만드는 방법
-> python은 지원을 안해서 C++로 만들어줘야한다.
ROS 2에서 여러 노드를 하나의 프로세스에서 실행시키기 위한 주요 방법인 Intra-process communication 을 만들기 위해서는 "컴포서블 노드(Composable Nodes)"와 "Component Container"를 사용하는 것이다.


- 아래의 그림을 통해 component container에 컴포서블 노드의 형태로 만들어 할당 했을때 하나의 프로세스만 생성되는 것을 볼 수 있다.

하지만 모든 노드를 Intra-process communication을 사용하기 위해 Component로 만드는 것도 바람직한 방법이 아니다 모든 노드를 하나의 프로세스에서 처리하게 될 경우 해당 메모리에 값을 할당하는 노드들이 많을 경우 메모리 관리에 복잡성이 높아질 수 있고, 디버깅이 어렵다는 단점이 있고, Python은 지원이 안되서 C++로 코딩해줘야한다.
그래서 Intra-process communication 방식과 IPC 방식을 적절히 섞어서 사용해줘야한다.
ex) 대량의 이미지 값을 계속해서 받아 처리해야하는 노드들은 묶어서 zero-copy 방식을 사용하고, 이미지 처리 결과만 받는 나머지 노드가 있다면 IPC 방식을 따르도록 그대로 놓는다면 Intra-process communication를 통해 하나의 프로세스 내부에서 처리된 이미지 처리 결과 데이터가 IPC를 통해서 다른 노드들에게 결과를 뿌려줄 수 있게 되어 효과적으로 운영될 수 있다.
- 아래 예시 그림과 같이 IPC와 Intra-process communication을 구현한 Component끼리의 데이터 전달이 문제 없이 잘되는 것을 볼 수 있다.

결론 : Intra-process communication 방식과 IPC 방식을 적절히 섞어서 사용해줘야한다.
composable Node 만드는 방법 참고 자료 : https://velog.io/@i_robo_u/%EC%9D%98%EC%82%AC%EC%86%8C%ED%86%B5%EC%9D%84-%EB%8D%94-%EB%B9%A0%EB%A5%B4%EA%B2%8C-composable-node%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0C
의사소통을 더 빠르게! composable node작성하기(C++)
이번시간에는 느려터진 node간 통신에 날개를 달아줄 composition에 대해 마스터해보도록 하자!
velog.io
'ROS2 이론 정리' 카테고리의 다른 글
| QoS(Quilty of service) (0) | 2025.05.05 |
|---|---|
| Lifecycle (0) | 2025.05.05 |
| ROS2 CLI (0) | 2025.05.05 |
| Hangman을 통한 통신 노드들 구현(Action, Topic, Service) (0) | 2025.04.30 |
| launch 파일 생성 (1) | 2025.04.28 |