basic - nodes

Nodes (노드)

노드는 ROS 2 그래프의 참여자로, 클라이언트 라이브러리를 통해 다른 노드와 통신한다.

  • 위치: 같은 프로세스, 다른 프로세스, 다른 기기에서 실행되는 노드와 모두 통신할 수 있다.
  • 역할: ROS 그래프에서 계산의 단위이며, 각 노드는 하나의 논리적 일을 담당하는 것이 좋다.
  • 통신 방식
    • 토픽: 명명된 토픽에 발행(publish) 하거나 구독(subscribe) 해서 데이터를 주고받는다.
    • 서비스: 서비스 클라이언트로 다른 노드에 연산을 요청하거나, 서비스 서버로 다른 노드에 기능을 제공한다.
    • 액션: 장시간 작업은 액션 클라이언트로 다른 노드에 맡기거나, 액션 서버로 다른 노드에 기능을 제공한다.
  • 파라미터: 실행 중 동작을 바꾸기 위해 구성 가능한 파라미터를 노출할 수 있다.
  • 조합: 한 노드가 발행자·구독자·서비스 서버/클라이언트·액션 서버/클라이언트를 동시에 가지는 경우가 많다.

노드 간 연결분산 디스커버리(distributed discovery) 과정을 통해 이루어진다.

Discovery (디스커버리)

노드 간 디스커버리는 ROS 2 미들웨어에 의해 자동으로 이루어진다.

  1. 시작 시: 노드가 시작되면, 같은 ROS 도메인에 있는 다른 노드들에게 자신의 존재를 광고한다. (ROS 도메인은 환경 변수 ROS_DOMAIN_ID로 설정한다.) 다른 노드들은 이 광고에 자신에 대한 정보를 담아 응답하고, 그에 따라 연결이 맺어져 통신이 가능해진다.
  2. 주기 광고: 노드는 주기적으로 자신의 존재를 광고한다. 그래서 초기 디스커버리 이후에 나중에 켜진 노드와도 연결할 수 있다.
  3. 종료 시: 노드가 오프라인이 될 때도 다른 노드들에게 알린다.

연결 조건: 노드끼리 Quality of Service(QoS) 설정이 호환될 때만 실제 연결이 수립된다.

예: C++ talker를 한 터미널에서, Python listener를 다른 터미널에서 실행하면, 같은 토픽 이름으로 자동으로 서로를 찾아 메시지를 주고받기 시작한다.

Node 명령어

# 실행 중인 노드 목록 확인
ros2 node list

# 특정 노드의 퍼블리셔/서브스크라이버/서비스/액션 정보 확인
ros2 node info /turtlesim
# /turtlesim
#   Subscribers: ...
#   Publishers: ...
#   Service Servers: ...
#   Action Servers: ...

참고: Nodes — ROS 2 Jazzy · Discovery — ROS 2 Jazzy