Nodes (노드)
노드는 ROS 2 그래프의 참여자로, 클라이언트 라이브러리를 통해 다른 노드와 통신한다.
- 위치: 같은 프로세스, 다른 프로세스, 다른 기기에서 실행되는 노드와 모두 통신할 수 있다.
- 역할: ROS 그래프에서 계산의 단위이며, 각 노드는 하나의 논리적 일을 담당하는 것이 좋다.
- 통신 방식
- 토픽: 명명된 토픽에 발행(publish) 하거나 구독(subscribe) 해서 데이터를 주고받는다.
- 서비스: 서비스 클라이언트로 다른 노드에 연산을 요청하거나, 서비스 서버로 다른 노드에 기능을 제공한다.
- 액션: 장시간 작업은 액션 클라이언트로 다른 노드에 맡기거나, 액션 서버로 다른 노드에 기능을 제공한다.
- 파라미터: 실행 중 동작을 바꾸기 위해 구성 가능한 파라미터를 노출할 수 있다.
- 조합: 한 노드가 발행자·구독자·서비스 서버/클라이언트·액션 서버/클라이언트를 동시에 가지는 경우가 많다.
노드 간 연결은 분산 디스커버리(distributed discovery) 과정을 통해 이루어진다.
Discovery (디스커버리)
노드 간 디스커버리는 ROS 2 미들웨어에 의해 자동으로 이루어진다.
- 시작 시: 노드가 시작되면, 같은 ROS 도메인에 있는 다른 노드들에게 자신의 존재를 광고한다. (ROS 도메인은 환경 변수
ROS_DOMAIN_ID로 설정한다.) 다른 노드들은 이 광고에 자신에 대한 정보를 담아 응답하고, 그에 따라 연결이 맺어져 통신이 가능해진다. - 주기 광고: 노드는 주기적으로 자신의 존재를 광고한다. 그래서 초기 디스커버리 이후에 나중에 켜진 노드와도 연결할 수 있다.
- 종료 시: 노드가 오프라인이 될 때도 다른 노드들에게 알린다.
연결 조건: 노드끼리 Quality of Service(QoS) 설정이 호환될 때만 실제 연결이 수립된다.
예: C++ talker를 한 터미널에서, Python listener를 다른 터미널에서 실행하면, 같은 토픽 이름으로 자동으로 서로를 찾아 메시지를 주고받기 시작한다.
Node 명령어
# 실행 중인 노드 목록 확인
ros2 node list
# 특정 노드의 퍼블리셔/서브스크라이버/서비스/액션 정보 확인
ros2 node info /turtlesim
# /turtlesim
# Subscribers: ...
# Publishers: ...
# Service Servers: ...
# Action Servers: ...