이전 글에서 DDS RTPS의 message, structure, behavior, discovery protocol 등에 대해서 알아보았다.
2022.02.04 - [Robotics/ROS] - DDS와 RTPS 개념정리
2022.02.05 - [Robotics/ROS] - DDS RTPS의 구조(structure)와 메세지(message)
2022.02.11 - [Robotics/ROS] - DDS RTPS의 동작(behavior)
2022.02.12 - [Robotics/ROS] - DDS RTPS의 Discovery Protocol
이번에는 publisher와 subscriber를 실행시켜 보고 discovery 하고, user data를 주고받는 과정에서 RTPS protocol이 어떻게 동작하는지 간단하게 살펴보자.
publisher/subscriber 실행
아래 명령어를 통해 publisher와 subscriber를 실행한다.
$ ros2 run examples_rclcpp_minimal_publisher publisher_member_function
$ ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function
Wireshark Packet List
다음은 examples_rclcpp_minimal_publisher/subscriber를 실행시켰을 때의 packet list이다.
검은색 배경의 패킷이 publisher가 보내는 RTPS 패킷이고, 파란색 배경의 패킷이 subscriber가 보내는 RTPS 패킷이다.
정확하게 구분되는 것은 아니지만, 대략적으로 Participant Discovery 구간, Endpoint Discovery 구간, User Data 구간으로 나눠볼 수 있다.
Participant Discovery 구간
Participant Discovery 구간에서는 participant가 네트워크상에 자신의 존재를 알리기 위해 주기적으로 multicast로 address, port 정보를 송신하고, remote participant로부터 remote participant의 address, port 정보를 수신한다.
- 패킷 1~8번 : publisher node가 약 8초마다 multicast(239.255.0.1)로 DATA(p)를 송신하는 것이 확인된다.
DATA(p)에는 DEFAULT_UNITCAST_LOCATOR, DEFAULT_MULTICAST_LOCATOR, METATRAFFIC_UNICAST_LOCATER, METATRAFFIC_MUTICAST_LOCATOR정보 등, particiapnt에 대한 정보가 담겨 있다. - 패킷 9번 : subscriber node가 생성되면서 multicast(239.255.0.1)로 DATA(p)를 송신하고 있다. DATA(p)에는 subscriber node의 pariticipant에 관한 정보가 담겨 있다.
- 패킷 10번 : publisher paricipant가 subscriber participant가 보낸 DATA(p)를 수신하고, unicast(172.21.133.154)로 DATA(p)를 송신하고 있다.
위의 과정을 통해 publisher node와 subscriber node는 서로의 address, port 정보 등 participant에 관한 정보를 주고받았다.
Endpoint Discovery 구간
Endpoint Discovery구간에서는 Endpoint(publisher, subsriber)들끼리 topic, message type, QoS 설정 등에 대한 정보를 주고받고, 매칭 되는 Endpoint를 찾는다.
- 패킷 11 ~ 65번 : publisher node와 subscriber node가 서로 unicast(172.21.133.154)로 DATA(w), DATA(r) 등을 주고받고 있다. DATA(w)는 publisher에 대한 정보를 DATA(r)은 subscriber에 대한 정보를 담고 있다.
위의 과정을 통해 서로 매칭 되는 endpoint를 찾게 되면, stateful reader는 proxyWriter를 생성하고, stateful writer는 porxyReader를 stateless writer는 ReaderLocater를 생성한다. proxyWriter/ReaderLocater/proxyReader는 user data를 주고받을 때 참조하게 된다.
User Data 구간
Particiapant Discovery와 Endpoint Discovery가 끝나면, publisher는 ReaderLocator 또는 proxyReader를 참조하여 자신과 매칭 된 Subscriber에게 Topic을 송신하게 된다.
- 패킷 66번 : publisher가 DATA와 HEARTBEAT를 송신하고 있다. (reliable)
- 패킷 67번 : subscriber가 HEARTBEAT를 수신하고 ACKNACK를 송신하고 있다. (reliable)
위의 과정을 통해 publisher와 subscriber는 user data를 송/수신한다.
Summary
wireshark를 통해 ros2의 publisher와 subscriber가 DATA(p)를 통해 Participant를 찾고, DATA(w), DATA(r) 등을 통해 Endpoint를 찾는 것을 확인하였다. 그리고 Discovery 이후에는 DATA를 통해 user data를 주고받으며, reliable한 통신을 위해서는 HEARBEAT와 ACKNACK가 사용되는 것을 확인할 수 있었다.
'Robotics > ROS' 카테고리의 다른 글
DDS RTPS의 Discovery Protocol (0) | 2022.02.12 |
---|---|
DDS RTPS의 동작(behavior) (1) | 2022.02.11 |
DDS RTPS의 구조(structure)와 메세지(message) (0) | 2022.02.05 |
DDS와 RTPS 개념정리 (0) | 2022.02.04 |
ROS 2 설치 (Windows WSL 이용) (0) | 2022.02.03 |