Topic
노드 간 Publish & Subscribe
Publisher가 Message를 BroadCasting 방식으로 전달하면 Subscriber는 자기가 필요한 Message면 받아들인다. (Topic을 확인해서 가져온다.)
비동기 단방향 메시지 송수신 방식으로 msg 메시지 형태의 메시지를 발간하는 Publisher와 메시지를 구독하는 Subscriber 간의 통신이다.
1:N, N:1, N:N 통신도 가능하며 ROS 메시지 통신에서 가장 널리 사용된다.
Node A처럼 하나 이상의 Topic을 발행할 수 있을 뿐만이 아니라 Publisher, Subscriber 역할을 동시에 수행 가능하며, 자신 Topic을 셀프 구독할 수도 있다.
통상적으로 70% 이상이 Topic 방식을 사용한다.
(기본 특징으로 비동기성과 연속성을 가져서 센서 값 전송 등 항시 정보를 주고 받는 노드 부분에 주로 사용된다.)
ros2 topic list
아무것도 실행하지 않았을 때
turtlesim을 실행했을 때 topic list가 다른것을 확인할 수 있다.
ros2 node info /turtlesim
/parameter_events, /turtle1/cmd_vel은 실행시킨 turtlesim이 구독할 수 있는 Topic이고,
/parameter_events, /rosout, /turtle1/color_sensor, /turtle1/pose는 turtlesim이 제공하는 Topic에 해당하는 것들이다.
그 외 Serive, Action에 대한 Servers, Clients를 확인할 수 있다.
Topic List & Type
ros2 topic type /turtle1/pose
Topic Data
ros2 interface show turtlesim/msg/Pose
위 Topic은 float32(4byte) x, y, theta, linear_velocity, angular_velocity 값을 가지는 것을 확인할 수 있다.
위 사진은 color_sensor의 Type을 확인하여 interface를 확인하는 과정이다.
color_sensor는 turtlesim/msg/Color Type을 가지고 uint8 r,g,b를 가지는 것을 확인할 수 있다.
rqt
rqt 간단한 명령어를 통해 Topic list 및 Topic type을 확인 가능하다.
GUI를 통해 CLI에서 확인한 Topic의 Type들과 동일한 것을 확인할 수 있다.
Topic 실습
1. turtlesim 실행
2. turtle_teleop_key라는 노드 실행
ros2 node info /teleop_turtle
3. rqt_graph 확인
위와 같이 Publisher, Subscriber에 대한 세부 내용을 확인할 수 있다.
Dead sinks
구독자가 없는 Topic
Leaf topics
구독자만 있는 Topic
Topic 상태 조회 명령
topic info
topic echo
topic bw
topic hz
topic info
특정 Topic에 대한 정보를 보여준다.
topic echo
특정 토픽에서 발행된 메시지를 실시간으로 출력
topic bw
특정 토픽에서 발행된 메시지의 BandWidth를 측정
659 B/s from 3 messages : 초당 전송된 데이터 양
Message size mean: 52 B min: 52 B max: 52 B : 각 메시지의 크기를 나타낸다.
topic hz
특정 토픽에서 발행된 메시지의 주기(Hz)를 측정
average rate : 토픽의 메시지가 발행되는 평균 주기(Hz)를 나타낸다.
min : 메시지 발행 사이의 최소 시간 간격
max : 메시지 발행 사이의 최대 시간 간격
std dev : 메시지 발행 간격의 표준 편차
window : 분석에 사용된 샘플 메시지의 개수
Topic 발행
os2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
Message Interface
Topic은 고유의 인터페이스를 가지고 있다.
- message 인터페이스라 부르며, msg file이다.
* /turtle1/cmd_vel Topic은 geometry_msgs/msgs/Twist 형태를 가진다.
ros2 interface show geometry_msgs/msg/Twist
ros2 interface list
Topic은 타이핑해서 보내거나 rqt를 이용해서 GUI로 전달할 수 있다. (rqt GUI 버그가 좀 있다...)
Service
두개의 Node가 데이터를 주고 받는 방식
클라이언트가 서버에 요청하면 응답을 하는 방식
입력 또는 출력 데이터가 존재할 수 있고 1:1로 데이터를 주고 받는 방식이다.
동기식 양방향 메시지 송수신 방식으로 서비스의 요청(Request)을 하는 쪽을 Service Client, 서비스 응답(Response)을 하는 쪽을 Service Server라고 한다.
Serivce는 작업을 요청하는 클라리언트, 요청 작업을 수행 후 결과를 전달하는 서버 간의 통신을 뜻한다.
요청 및 응답(Request/Response) 또한 Message의 변형으로 srv Message라 한다.
동일 서비스에 대해 복수의 클라이언트를 가질 수 있도록 설계되어 있다.
하나의 Server에 여러 Client와 데이터를 주고 받을 수 있으며, 각 Client 입장에서는 전부 1:1 통신을 하는 것이다.
(turtlesim 실행 후)
Service 목록 확인
ros2 service list
Service 형태 확인
ros2 service type /clear
ros2 service list -t
Service 찾기
ros2 service find std_srvs/srv/Empty
Service 요청 실습
위와 같이 원을 그리는 turtlesim을 실행 중일 때 아래 /clear Service를 전달한다.
ros2 service call /clear std_srvs/srv/Empty
/clear : 데이터와 관련된 작업에서 "데이터를 초기화"하는 데 사용하는 Service다.
std_srvs/srv/Empty : ROS에서 빈 요청과 응답을 의미하는 메시지 타입이다. 요청과 응답이 필요하지 않은 간단한 서비스 호출에 사용된다.
-> 위 명령어는 /clear를 통해 화면을 초기화 하는 Service를 전달하는 명령어에 해당한다.
위와 같이 기존에 그렸던 원이 사라지는 것을 확인할 수 있다.
ros2 service call /kill turtlesim/srv/Kill "name: 'turtle1'"
turtle1이라는 이름을 가진 객체를 제거한다.
ros2 service call /reset std_srvs/srv/Empty
/reset을 통해 kill했던 turtle1 객체를 다시 불러냈다.
ros2 service call /turtle1/set_pen turtlesim/srv/SetPen "{r: 255, g: 255, b: 255, width: 5}"
/turtle1/set_pen을 통해 선의 rgb 및 굵기를 변경시켰다.
ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.5, y: 9, theta: 1.57, name: 'leonardo'}"
ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.5, y: 7, theta: 1.57, name: 'raffaello'}"
ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.5, y: 5, theta: 1.57, name: 'michelangelo'}"
ros2 service call /spawn turtlesim/srv/Spawn "{x: 5.5, y: 3, theta: 1.57, name: 'donatello'}"
ros2 topic pub /donatello/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
ros2 topic pub /leonardo/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
ros2 topic pub /michelangelo/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
ros2 topic pub /raffaello/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
각 Topic에 대해 명령을 내리면 위와 같이 각 객체들의 동작하는 것을 확인할 수 있다.
Service Interface
- Service 또한 Topic과 마찬가지로 별도의 interface를 가지고 있다.
- Service interface라 부르며, 파일로는 srv 파일로 표현한다.
- Service interface는 Message interface의 확장형이라고 볼 수 있다.
* Service는 Topic과 다르게 동기적 통신이기 때문에 즉각적으로 응답을 받을 수 있다.
ros2 interface show turtlesim/srv/Spawn
float32 형태의 x, y, theta 그리고 string 형태로 name 두개의 데이터가 존재한다.
'---'는 구분자, 서비스 인터페이스는 메시지 인터페이스와는 달리 서비스 요청 및 응답(Request/Response) 형태로 구분한다.
x, y, theta, name은 서비스 요청(클라이언트 -> 서버)
서비스 서버는 지정된 서비스를 수행하고 name 데이터를 서비스 클라이언트에 전송한다.
'Embedded > 3. ROS' 카테고리의 다른 글
ROS2 (6) - Class, 상속을 이용한 그래프 그리기 (pyplot, numpy) (0) | 2024.09.30 |
---|---|
ROS2 - (5) Python을 이용한 Topic, Service 구현 (0) | 2024.09.24 |
ROS2 - (4) Action, Parameter 이론 및 실습 (0) | 2024.09.23 |
ROS2 - (2) Message, DDS 이론 및 실습 (0) | 2024.09.23 |
ROS2 - (1) 설치 및 기본 동작 (Topic, Service, Action) (0) | 2024.09.09 |