[ROS2] (5)-Topic의 개념

Topic 이란?

Topic은 노드가 다른 노드와 주고받는 메시지의 일종이다. 가장 큰 특징은 publisher와 subscriber가 있는 일방적이고, 연속적인 소통이라는 것이다. publisher는 메시지를 주기만 하고, subscriber는 메시지를 받기만 한다. 하나의 노드는 여러 개의 토픽을 publish 할 수도 있고, 동시에 여러 개의 토픽을 subscribe 할 수도 있다.

이번 포스팅에서 사용할 Topic 관련 명령어를 정리하면 다음과 같다.

$ ros2 topic list
$ ros2 topic list -t
$ ros2 topic echo <topic_name>
$ ros2 topic info <topic_name>
$ ros2 interface show <msg_type>
$ ros2 topic pub <topic_name> <msg_type> '<args>'
$ ros2 topic hz <topic_name>

rqt_graph를 통한 시각화

먼저, turtlesim 패키지의 2가지 실행파일을 2개의 다른 터미널에서 실행한다.

$ ros2 run turtlesim turtlesim_node

$ ros2 run turtlesim turtle_teleop_key

새로운 터미널을 열고, rqt_graph를 실행한다. 또는 rqt 실행 후, Plugins > Introspection > Node Graph로 graph를 볼 수도 있다.

image

상기 사진과 같이 2개의 노드(/teleop_turtle, /turtlesim), 1개의 토픽(/turtle1/cmd_vel)과 2개의 action(/turtle/rotate_absolute/_action/...)을 확인할 수 있다. 토픽의 관점에서 보면 /teleop_turtle 노드가 토픽을 퍼블리시하고 있고, /turtlesim 노드가 토픽을 서브스크라이브하고 있다.

rqt_graph는 이처럼 다양한 노드들의 상호작용을 시각적으로 확인할 수 있는 장점이 있다.

터미널 창에서 topic 정보 확인

터미널 창에서 ros2 topic list라고 입력하면 아래와 같이 현재 활성화된 모든 토픽 리스트를 출력한다.

/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

ros2 topic list -t라고 입력하면 토픽 type도 함께 출력한다. 퍼블리셔와 서브스크라이버는 같은 타입의 토픽만 주고받을 수 있다.

/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]

토픽으로 어떤 내용이 전달되는지 확인하기 위해서는 ros2 topic echo <topic_name>을 실행하면 된다. turtlesim 예제의 /turtle1/cmd_vel 토픽을 확인해보자.

$ ros2 topic echo /turtle1/cmd_vel

실행 후, turtle_teleop_key을 실행한 터미널을 활성화하고, 화살표 키보드를 눌러보면 아래와 같이 메시지가 출력된다.

linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: -2.0
---

ros2 topic info /turtle1/cmd_vel을 실행하면 아래와 같이 Type, Publisher count, Subscription count를 출력한다. count는 해당 토픽을 publish, subscribe하고 있는 노드의 수를 나타낸다. Subscription count가 2인 이유는 위에서 토픽을 출력하는 노드(ros2 topic echo /turtle1/cmd_vel)를 실행했기 때문이다.

Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2

각 토픽의 타입에 대한 상세 정보를 얻고 싶으면 ros2 interface show <msg_type>을 실행한다. geometry_msgs/msg/Twist 타입에 대한 정보를 확인해보자.

$ ros2 interface show geometry_msgs/msg/Twist

실행하면 아래와 같이 정보가 나온다.

# This expresses velocity in free space broken into its linear and angular parts.

Vector3  linear
Vector3  angular

geometry_msgs/msg/Twist 타입은 2개의 3차원 벡터로 구성되어 있는 메시지라는 것을 알 수 있다.

터미널 창을 통해 토픽 전달

아래 명령어를 통해 터미널 창에서 직접 토픽을 퍼블리시할 수도 있다.

$ ros2 topic pub <topic_name> <msg_type> '<args>'

'<args>'에 전달하고 싶은 데이터를 입력하면 되는데, 반드시 YAML 문법으로 입력해야 한다. 아래 명령어를 터미널 창에 입력해보자. --once는 메시지를 한 번만 퍼블리시하고 종료하라는 뜻이다.

$ 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}}"

turtlesim의 거북이가 1/4 원을 그리게 된다. --once--rate 1으로 바꾸고 실행하게 되면 거북이가 계속 원을 따라 움직이게 된다. --rate 1은 1 Hz로 토픽을 계속 퍼블리시 하라는 뜻이다.

퍼블리시되고있는 토픽의 퍼블리시 속도를 알고 싶으면 ros2 topic hz <topic_name>을 실행하면 된다.

$ ros2 topic hz /turtle1/cmd_vel

상기 명령을 실행하면 아래와 같이 퍼블리시 속도를 출력한다. 여기서는 일정한 속도로 퍼블리시 중이므로, min, max가 동일하고, std dev가 거의 0에 가깝다.

average rate: 1.000
	min: 1.000s max: 1.000s std dev: 0.00006s window: 3
average rate: 1.000
	min: 1.000s max: 1.000s std dev: 0.00012s window: 4
average rate: 1.000
	min: 1.000s max: 1.000s std dev: 0.00010s window: 6

댓글남기기