Embedded/3. ROS

ROS2 - (3) Topic, Service 이론 및 실습

잇(IT) 2024. 9. 23. 15:26

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 데이터를 서비스 클라이언트에 전송한다.

728x90