[ROS2] 토픽(Topic)
토픽(Topic) 이란?
토픽은 Node A - Node B 처럼 비동기식 단방향 메시지 송수신 방식으로 msg 인터페이스 형태의 메시지를 퍼블리시하는 Publiser와 메시지를 서브스크라이브하는 Subscriber 간의 통신이다.
토픽은 기본적으로 1:1 통신을 하지만 아래와 같이 하나의 토픽을 송수신하는 1:N도 가능하고 그 구성 방식에 따라 N:1, N:N 통신도 가능하다. 이는 ROS 메시지 통신에서 가장 널리 사용되는 방법이다.
turtlesim 을 통해 토픽(Topic)에 대해서 이해해보자.
$ ros2 run turtlesim turtlesim_node
screen | rqt_graph |
---|---|
아래의 명령어를 다른 터미널을 통해 실행하게 되면 turtle_teleop_key 노드가 새로 생성된다. 이때 이 두 노드는 토픽을 통해 통신한다.
$ ros2 run turtlesim turtle_teleop_key
screen | rqt_graph |
---|---|
이때 각각의 토픽은 다음과 같다.
- cmd_vel(Command Velocity): 주로 로봇 제어에 사용되는 토픽으로, 로봇에게 움직임 명령을 전달한다.
- _action/status(Action Status): 액션 서버의 상태를 나타내는 토픽이다. 액션 서버가 수행 중인 액션의 상태를 알려준다.
- _action/feedback(Action Feedback): 액션 서버가 실행 중인 액션의 진행 상태를 알려준다.
[INFO] [1706784423.874868340] [turtlesim]: Starting turtlesim with node name /turtlesim
[INFO] [1706784423.876840347] [turtlesim]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]
1. 토픽 목록 확인(ros2 topic list)
ROS2 CLI 를 이용해 다음과 같이 토픽 형태, 토픽의 퍼블리셔 및 서브스크라이버 정보를 확인할 수 있다.
$ ros2 topic info /turtle1/cmd_vel
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 1
2. 토픽 내용 확인(ros2 topic echo)
특정 토픽(‘/turtle1/cmd_vel’)의 메시지 내용을 실시간으로 표시하는 명령어는 다음과 같다.
$ ros2 topic echo /turtle1/cmd_vel
linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 2.0
---
이때 출력되는 메시지는 ‘geometry_msgs/Twist’ 메시지로 ROS의 표준 메시지 타입 중 하나이다. 이 메시지는 로봇의 운동을 표현하는 데 사용된다.
‘geometry_msgs/Twist’ 메시지의 구조는 다음과 같다.
float64 linear.x # x축 방향의 선속도
float64 linear.y # y축 방향의 선속도
float64 linear.z # z축 방향의 선속도
float64 angular.x # x축 방향의 각속도
float64 angular.y # y축 방향의 각속도
float64 angular.z # z축 방향의 각속도
‘turtle_teleop_key’ 노드에서는 키보드 입력에 따라 ‘geometry_msgs/Twist’ 메시지를 생성하여 ‘/turtle1/cmd_vel’ 토픽에 게시하여 터틀 시뮬레이션의 움직임을 제어한다.
3. 토픽 대역폭 확인(ros2 topic bw)
해당 명령어는 메시지의 대역폭, 즉 송수신 받는 토픽 메시지의 대역폭 사용량 및 전송률 등의 정보를 확인할 수 있다. 대역폭 정보는 특히 실시간 통신 환경에서 시스템 성능을 모니터링하고 최적화하기 위해 유용하다.
$ ros2 topic bw /turtle1/cmd_vel
Subscribed to [/turtle1/cmd_vel]
70 B/s from 3 messages
Message size mean: 52 B min: 52 B max: 52 B
4. 토픽 주기 확인(ros2 topic delay)
토픽의 전속 주기를 확인하기 위한 명령어는 아래와 같다. 이는 teleop_turtle 노드에서 얼마나 자주 /turtle1/cmd_vel 토픽을 퍼블리시하는지에 따라 달라진다.
$ ros2 topic hz /turtle1/cmd_vel
average rate: 0.631
min: 0.952s max: 2.456s std dev: 0.63692s window: 3
5. 토픽 지연 시간 확인(ros2 topic delay)
토픽은 RMW 및 네트워크 장비를 거치기 때문에 latency, 즉 지연시간이 반드시 존재한다. 지연 시간을 체크하는 코드를 사용자가 직접 구현하는 방법도 있겠지만 메시지 내에 header stamp 메시지를 사용하고 있다면 ros2 topic delay 명령어를 이용해 지연 시간을 쉽게 확인할 수 있다.
$ ros2 topic delay /TOPIC_NAME
average delay: xxx.xxx
min: xxx.xxxs max: xxx.xxxs std dev: xxx.xxxs window: 10
6. 토픽 퍼블리시(ros2 topic pub)
토픽의 퍼블리시(publish)는 ROS 프로그램에 내장하는 게 기본이다. 이 명령어의 사용은 다음과 같다. ros2 topic pub 명령어에 토픽 이름, 토픽 메시지 타입, 메시지 내용을 기술하면 된다.
ros2 topic pub <topic_name> <msg_type> "<args>"
ros2 topic pub --once /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}}"
publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))
만약 지속적인 퍼블리시를 원하면 –once 옵션을 –rate 1 옵션으로 변경해주면 주기 1Hz를 만들 수 있다.
“turtlesim_node”를 실행하고 나서 해당 토픽 퍼블리시 명령어를 실행하면 ‘geometry_msgs/Twist’ 메시지를 ‘/turtle1/cmd_vel’ 토픽에 퍼블리시합니다. 이로 인해 ‘turtlesim_node’에서는 거북이가 주어진 속도와 각속도로 이동한다. 이때 노드는 1개이다.
7. bag 기록(ros2 bag record)
ROS 2에서 퍼블리시되는 토픽을 파일 형태로 저장하고 필요할 때 저장된 토픽을 다시 불러와 동일한 주기로 재생할 수 있는 기능이 있다. 이를 rosbag이라고 한다. 이는 매우 유용한 ROS 2 가능 중의 하나로 디버깅에 큰 도움을 준다.
rosbag은 다음과 같이 bag 기록 명령어(ros2 bag record)에 내가 기록하고자 하는 토픽의 이름을 기재하면 된다. 예를 들어 /turtle1/cmd_vel 토픽을 기록하려면 다음 명령어를 사용하면 된다.
ros2 bag record <topic_name1> <topic_name2> <topic_name3>
$ ros2 bag record /turtle1/cmd_vel -o turtle1_record
[INFO] [1706851734.109858959] [rosbag2_storage]: Opened database 'turtle1_record/turtle1_record_0.db3' for READ_WRITE.
[INFO] [1706851734.118329943] [rosbag2_transport]: Listening for topics...
[INFO] [1706851734.118954340] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [1706851734.119085012] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...
8. bag 정보(ros2 bag info)
저장된 rosbag 파일의 정보를 확인하려면 다음과 같이 bag 정보 명령어(ros2 bag info)를 이용하면 된다.
$ ros2 bag info turtle1_record
Files: turtle1_record_0.db3
Bag size: 16.5 KiB
Storage id: sqlite3
Duration: 0.0s
Start: Feb 2 2024 14:30:36.298 (1706851836.298)
End: Feb 2 2024 14:30:36.298 (1706851836.298)
Messages: 1
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 1 | Serialization Format: cdr
9. bag 재생(ros2 bag play)
기록된 파일을 재생하는 방법은 다음과 같다.
ros2 bag play turtle1_record/
[INFO] [1706852255.752117524] [rosbag2_storage]: Opened database 'turtle1_record//turtle1_record_0.db3' for READ_ONLY.