ROS 2에서는 복잡한 시스템을 많은 모듈화 노드로 분할하였다. 토픽은 노드들이 서로 메시지를 교환하는 과정에서 버스의 역할을 수행하는 ROS 그래프의 중요한 요소이다.
노드는 여러 개의 토픽을 이용해 통신할 수 있고, 동시에 여러 개의 토픽에 대한 Subscriber를 가질 수 있다.
두 개의 터미널을 열자.
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
rqt_graph
노드와 토픽, 서로 간의 연결을 rqt_graph
통해 시각화할 수 있다.
rqt_graph
rqt
를 연 후, Plugins > Introspection > Node Graph를 통해서도 rqt_graph
를 열 수 있다.
해당 그래프는 /turtlesim
노드와 /teleop_turtle
노드가 토픽을 통해 서로 통신하고 있는 방식을 묘사하고 있다. /teleop_turtle
노드는 키보드 입력을 /turtle1/cmd_vel
을 통해 송신(publish
)하며, turtlesim
노드는 해당 토픽을 통해 수신(subscribe
)한다.
ros2 topic list
ros2 topic list
명령어를 통해 현재 실행 중인 토픽들을 볼 수 있다.
ros2 topic list
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
ros2 topic list -t
은 토픽의 타입까지 알 수 있다.
ros2 topic list -t
/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]
rqt_graph
내에서 모든 토픽을 보고 싶다면, Hide 오른쪽에 있는 모든 체크 박스를 해제하면 된다.
ros2 topic echo
퍼블리시 된 데이터를 보고 싶을 때는 다음 명령어를 사용한다.
ros2 topic echo <topic_name>
/teleop_turtle
노드는 /turtle1/cmd_vel
을 통해 /turtlesim
으로 송신하기 때문에, 위 명령어를 이용해 데이터를 볼 수 있다.
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
---
... 후략
화살표 키를 이용하여 거북이를 제어할 때 마다 위와 같은 데이터를 볼 수 있다.
rqt_graph
에서 Debug
만 체크 해제하자.
/_ros2cli_6294
는 방금 전 명령어의 echo
에 의해 생성된 노드이다. /turtle1/cmd_vel
토픽을 통해 /_ros2cli_6294
, /turtlesim
두 개의 노드가 수신하고 있음을 볼 수 있다.
ros2 topic info
토픽은 점대점 방식뿐만 아니라 일대다, 다대일, 다대다 방식까지 가질 수 있다.
ros2 topic info
명령어를 통해 이를 볼 수 있다.
ros2 topic info <topic_name>
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2
ros2 interface show
노드들은 토픽을 통해 메시지를 전달한다. 퍼블리셔와 서브스크라이버가 서로 통신하기 위해서는 동일한 타입의 메시지를 주고받아야 한다.
토픽의 타입은 ros2 topic list -t
로 볼 수 있었다. 이를 통해 각 토픽에 사용되는 메시지 타입을 알 수 있다. cmd_vel
의 타입은 geometry_msgs/msg/Twist
이었다.
즉, 패키지 geomery_msgs
안에 Twist
라 부르는 msg
가 있는 것이다.
ros2 interface show <msg_type>
명령어는 해당 메시지를 자세히 보여 준다.
ros2 interface show geometry_msgs/msg/Twist
# This expresses velocity in free space broken into its linear and angular parts.
Vector3 linear
Vector3 angular
/turtlesim
노드는 세 개의 요소를 가진 Vector3
linear
와 angular
를 가진 메시지를 받음을 알 수 있다.
ros2 topic pub
메시지의 구성 요소를 알았다면, 토픽을 통해 데이터를 바로 직접 송신할 수도 있다.
ros2 topic pub <topic_name> <msg_type> '<args>'
인자 '<args>'
는 토픽을 통해 송신되는 데이터이다. '<args>'
는 YAML 문법을 따른다.
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}}"
옵션 --once
는 메시지 하나를 송신하고 종료하라는 의미이다.
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))
위 명령어를 여러 번 수행하면 원을 그릴 수 있다.
거북이를 비롯한 로봇들을 에뮬레이터 하는 과정에서는 지속적인 명령이 필요한데, 다음의 명령어를 이용해 이를 수행할 수 있다.
ros2 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}}"
옵션 --rate 1
은 해당 명령을 1 Hz
단위로 수행하라는 의미이다.
rqt_graph
를 새로고침해보자. ros2 topic pub
명령으로 생성된 노드 /_ros2cli_14639
가 토픽 /turtle1/cmd_vel
을 통해 송신하고 있으며, ros2 topic echo
명령어를 통해 생성된 노드 /_ros2cli_6294
와 노드 /turtlesim
이 이를 수신하고 있다. 이번엔 /turtle1/pose
토픽을 상대로 ros2 topic echo
명령어를 한 번 더 수행해 보자.
ros2 topic echo /turtle1/pose
이번엔 /turtlesim
노드가 퍼블리셔 역할이 되어 pose
토픽을 통해 새롭게 생성된 노드 _ros2cli_15828
에게 송신하고 있다.
ros2 topic hz
다음의 명령어를 통해 데이터가 송신되는 속도를 볼 수 있다.
ros2 topic hz /turtle1/pose
average rate: 62.500
min: 0.015s max: 0.017s std dev: 0.00045s window: 1198
노드 turtlesim
이 토픽 pose
를 통한 송신 속도를 보여 준다.
ros2 topic hz /turtle1/cmd_vel
average rate: 1.000
min: 1.000s max: 1.000s std dev: 0.00009s window: 9
이전에 --rate 1
옵션을 통해 속도를 1 Hz
설정했으므로 토픽 /turtle1/cmd_vel
에서의 송신 속도는 위와 같을 것이다.
여러 개의 터미널을 열어 노드가 많을 것이다. 터미널마다 Ctrl + C
로 종료해 주자.