ROS2 이론 정리

노드로 구성된 프로세스의 관리 방식(IPC와 Intra-process communication)

dawon-project 2025. 5. 5. 00:12

Inter-Process Communication : 서로 다른 프로세스 간 데이터를 주고받는 방식
-> 일반적인 노드 개발 방식
-> 너무 많은 노드 생성으로 인한 많은 프로세스가 생성 시 성능이 안 좋아짐

  • ROS2는 복수 개의 node를 사용하여 개발이 이루어지고, 단일 컴퓨팅 시스템에서 복수 개의 node 실행 시 노드 하나당 하나의 프로세스가 할당되게 된다. 그때 각각의 프로세스들끼리 데이터를 원활하게 주고 받을 수 있도록하는 것이 IPC이다.
  • shared memory, pipes, sockets, ROS 2 노드 간 일반 통신

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

  • 이 과정에서 여러 번의 메모리 복사가 발생한다.(구독 노드가 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 방식의 데이터 흐름
    1. 퍼블리셔가 메세지를 생성하면, 데이터가 공유 메모리(SHM, Shared Memory)에 저장됨
    2. DDS는 데이터를 네트워크로 전송하지 않고, 같은 프로세스 또는 동일한 머신 내의 구독자들에게 참조 방식으로 전달
    3. 구독자는 데이터를 복사 없이 직접 참조하여 사용
    4. 즉, 데이터가 한 번만 생성되고, 여러 구독자가 이를 직접 읽을 수 있어 메모리 복사가 필요 없다.

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