본문 바로가기
ROS2

[ROS2] ROS2 Topic 알아보기, 근데 이제 turtlesim을 곁들인

by ykr0919 2024. 10. 16.

 

 

 

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을  초기화해주고 재생해야 함.

 

 

 

아까 기록된 움직임으로 잘 재생되는 것을 볼 수 있었음! 

 

 

 

 

 

참고자료 

 

https://intuitive-robotics.tistory.com/179