ROS2 Topic에 대해서 알아보자!!
토픽은 비동기식 단방향 메시지 송수신 방식으로, msg 인터페이스 형태의 메시지를 보내는 Publisher와 메시지를 받는 Subscriber 간의 통신임.

토픽은 1:1 통신을 기본으로 하지만 N:N 통신도 가능하며, ROS 메시지 통신에서 가장 많이 사용함.
아래 이미지와 같이 1:N도 가능하고 구성 방식에 따라 N:1 N:N 통신도 가능함.

노드는 이래 그림의 Node A처럼 하나 이상의 토픽을 퍼블리시할 수 있을 뿐만 아니라 Publisher 기능과 동시에 토픽(ex:토픽 D)를 서브스크라이브하는 Subscriber 역활도 동시에 수행할 수 있음.
원한다면 자신이 퍼블리시한 토픽을 셀프 서브스크라이브할 수 있게 구성할 수도 있음. 이처럼 토픽의 기능은 목적에 따라 다양한 방법으로 사용할 수 있음.

또한 비동기성과 연속성을 가지기 때문에 센서 값 전송이나 항시 정보를 주고받아야 하는 부분에서 주로 사용함!!
ROS 사용자라면 누구나 사용해 봤을 정도로 유명한 패키지인 turtlesim을 가지고 토픽을 알아보자!
turtlesim 패키지의 turtlesim_node(노드명: turtlesim)을 이용

실행시키면 아래와 같음 🔽

토픽 목록 확인(ros2 topic list)
ros2 node info 명령어를 이용하여 turtlesim 노드의 토픽 정보를 확인해 보자!

우선 서비스, 액션, 파라미터를 생각하지 말아 보자!
여기서 알 수 있는 것은 turtlesim 노드는 geometry_msgs.msg/Twist 형태의 메시지인 cmd_vel을 서브스크라이브하고 있다는 것과 turtlesim/msg/Color 형태의 color_sensor 메시지 형태인 color_sensor 그리고 turtlesim/msg/Pose 형태의 pose 메시지를 퍼블리시하고 있다는 것임.
방금 명령어가 turtlesim의 노드만의 정보를 확인하였다면 ros2 topic list -t 명령어는 현재 개발환경에서 동작 중인 모든 노드들의 토픽 정보를 볼 수 있음.

지금은 turtlesim 노드만이 실행된 상태이기에 turtlesim 노드가 퍼블리시, 서브스크라이브하는 메시지만 표시되고 있음.
참고로 -t 옵션은 각 메시지의 형태도 함께 표시해 줌.
rqt_graph를 실행시키면 turtlesim 노드만 실행되었기에 토픽을 주고받는 어떠한 상황도 아님 🔽
rqt_graph는 노드와 토픽 간의 연결 구조를 시각적으로 보여주는 그래프 플러그인을 실행하는 명령어임.
이를 통해 노드들이 서로 어떻게 연결되어 있는지, 어떤 토픽을 통해 통신하고 있는지를 그래픽 인터페이스로 확인할 수 있음.

여기에 추가로 ros2 run turtlesim turtle_teleop_key를 실행해 보자!
다시 보려면 refresh ROS graph 버튼을 클릭하면 최신 상태로 갱신됨.

graph를 보면 teleop_turtle 노드에서 퍼블리시한 cmd_vel 토픽을 turtlesim에서 서브스크라이브하고 있음을 알 수 있음.
여기서 cmd_vel은 뭐지??🤔 뭐길래 서브스크라이브하고 있는 거지?? 🤷♂️ 라는 의문을 잡고 가자!
cmd_vel은 ROS에서 주로 사용하는 topic 중 하나로, 로봇의 속도 명령을 전달하는 데 사용된다고 함.
cmd_vel은 "command velocity"의 줄임말로, 로봇에게 어떤 방법으로 얼마나 빠르게 움직여야 하는지 지정하는 메시지임.
더 알아보자면, cmd_vel 토픽을 통해서 보통 기하학 메시지(geometry_msg/Twist) 타입의 메시지를 발행하게 됨.
이 메시지는 선속도(Linear Velocity)와 가속도(Angular Velocity)를 포함하며, 이를 통해서 로봇의 움직임을 제어할 수 있음.
즉, teleop_turtle이 키보드 입력을 받아 cmd_vel에 geometry_msgs/Twist 메시지를 발행하고, 그 메시지를 turtlesim이 받아서 거북이를 움직이는 방식임!
토픽 정보 확인(ros2 topic info)
rqt_graph를 이용해 토픽의 퍼블리시, 서브스크라이브 상태를 확인하는 방법 이외에도 ROS 2 CLI를 이용하면 됨.

토픽 내용 확인(ros2 topic echo)
특정 토픽의 메시지 내용을 실시간으로 표시할 수 도 있음!
아래 명령어와 같이 /turtle1/cmd_vel 토픽을 지정하게 되면 해당 토픽의 값을 확인할 수 있음.

거북이를 움직일 때마다 실시간으로 값이 바뀌는 걸 볼 수 있음!
토픽 대역폭 확인(ros2 topic bw)
메시지의 대역폭, 즉 송수신받는 토픽 메시지의 크기를 확인해 볼 수 있음.

토픽 메시지가 송수신되는 토픽의 초당 대역폭을 알 수 있음.
토픽 주기 확인(ros2 topic hz)
토픽의 전송 주기도 확인해 볼 수 있음.

토픽 지연 시간 확인(ros2 topic delay)
토픽은 RMW 및 네트워크 장비를 거치기 때문에 지연 시간이 반드시 존재함.
ros2 topic delay /TOPIC_NAME 명령어를 이용하여 메시지 발행 시간과 구독 시간의 차를 계산하여 지연 시간을 확인할 수 있음.

하지만 난 확인할 수 었었음! 이유를 알아보니
`ros2 topic delay` 명령어는 ROS 2에서 토픽의 전달 지연 시간을 측정할 때 사용되며, 이 명령은 토픽에 포함된 메시지에서 헤더(header) 정보를 이용해 타임스탬프를 확인하고 지연 시간을 계산함.
하지만, `geometry_msgs/Twist` 메시지 타입은 기본적으로 헤더를 포함하지 않는다고 함, 그래서 오류 메시지 "msg does not have header"가 발생한 것이라고 함.
`Twist` 메시지는 단순히 선속도와 각속도 정보를 담고 있으며, 타임스탬프와 같은 메타데이터를 포함하지 않습니다. 그래서 `ros2 topic delay`는 이를 사용할 수 없다고 함.
토픽 퍼블리시(ros2 topic pub)
ros2 topic pub 명령어에 토픽 이름, 토픽 메시지 타입, 메시지 내용을 기술해서 간단히 토픽을 발행할 수 있음.
ros2 topic pub <topic_name> <msg_type> "<args>"

--once 옵션을 사용하여 단 한 번의 publish만을 수행하도록 하였으며, 토픽의 이름으로는 /turtle1/cmd_vel을 사용하였고, 토픽 메시지 타입은 geometry_msgs/msg/Twist을 사용.
메시지 내용에는 병진 속도 linear.x 값으로 2.0m/s를 넣었고, 회전 속도 augular.z 값으로 1.8 rad/s를 입력하였음
결과는 아래 🔽

지속적인 publish를 원한다면 --once 옵션을 제거하고 대신 --rate 1 옵션을 추가하여 주기 1Hz를 만들 수 있음.


bag 기록(ros2 bag record)
ROS2에는 퍼블리시되는 토픽을 파일 형태로 저장하고 필요할 때 저장된 토픽을 다시 불러와 동일한 주기로 재생할 수 있는 기능이 있음. 이는 매우 유용한 ROS2 기능 중 하나로 디버깅에 큰 도움을 줌.
rosbag은 아래와 같이 bag 기록 명령어에 내가 기록하고자 하는 토픽 이름을 기재하면 됨.
ros2 bag record <topic_name1> <topic_name2> <topic_name3>
/turtle1/cmd_vel 토픽을 기록해 보자!
기록을 종료하려면 프로그램을 종료하면 됨.

기록이 종료되면 rosbag2_2024_10_14-13_41_02 폴더가 생성됨!
참고로 원하는 이름으로 하고 싶으면
ros2 bag record -o 파일이름 /turtle1/cmd_vel
bag 정보(ros2 bag info)
저장된 rosbag 파일의 정보를 확인해 보자.

파일의 크기, 얼마 동안 기록이 되었고, 기록이 언제 시작되고 언제 끝났는지에 대한 타임스탬프와 취득한 토픽의 이름, 메시지 형태, 메시지 별 개수와 총 개수 등이 있음.
bag 재생(ros2 bag play)
파일을 한번 재생해 보자 turtlesim을 초기화해주고 재생해야 함.


아까 기록된 움직임으로 잘 재생되는 것을 볼 수 있었음!
참고자료
'ROS2' 카테고리의 다른 글
| [ROS2] 아이폰 LiDAR Scanner를 활용해 gazebo Map 만들기 (0) | 2025.06.29 |
|---|---|
| [ROS2] ros2 usb_cam 설치 및 사용 (0) | 2024.12.05 |
| [ROS2] ROS2 Action 알아보기, 근데 이제 turtlesim을 곁들인 (2) | 2024.10.22 |
| [ROS2] ROS2 Service 알아보기, 근데 이제 turtlesim을 곁들인 (1) | 2024.10.18 |
| [ROS2] ROS2 설치하기 (3) | 2024.10.07 |