상세 컨텐츠

본문 제목

ros2 토픽에 대해

Coding/Robot Operating System

by 세미531 2021. 12. 19. 15:51

본문

728x90

픽(topic)은 그림 1의 `Node A - Node B`처럼 비동기식 단방향 메시지 송수신 방식으로 msg 메시지 형태의 메시지를 발행하는 `Publisher`와 메시지를 구독하는 `Subscriber` 간의 통신이라고 볼 수 있다. 이는 1:1 통신을 기본으로 하지만 그림 2의 `Node A - Node B`, `Node A - Node C`와 같이 하나의 토픽(예: Topic C)을 송수신하는 1:N도 가능하고 그 구성 방식에 따라 N:1, N:N 통신

도 가능하며 ROS 메시지 통신에서 가장 널리 사용되는 통신 방법이다.

 
 

 

 

$ ros2 run turtlesim turtlesim_node
 

을 실행하면 거북이 튜토리얼이 실행된다. `ros2 node info` 명령어를 이용하여 turtlesim_node (노드명: turtlesim, 이하 turtlesim이라 표기함) 노드의 토픽 정보를 확인해보자. 참고로 turtlesim_node 노드는 turtlesim이라는 노드 이름으로 실행된다. 서비스, 액션, 파라미터를 제거하여 본다면 아래와 같을 것이다. 여기서 알 수 있는 것은 turtlesim 노드는 geometry_msgs/msg/Twist 형태의 메시지인 cmd_vel을 구독하고 있다는 것과 turtlesim/msg/Color 형태의 color_sensor 메시지 형태인 color_sensor, 그리고 turtlesim/msg/Pose 형태의 pose 메시지를 발행하고 있다는 것이다.

 

$ ros2 node info /turtlesim
/turtlesim
  Subscribers:
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
    (생략)
  Publishers:
    /turtle1/color_sensor: turtlesim/msg/Color
    /turtle1/pose: turtlesim/msg/Pose
    (생략)
  Services:
    /clear: std_srvs/srv/Empty
    /kill: turtlesim/srv/Kill
    (생략)

 

좀 더 간단하게 메시지들을 확인하고 싶다면 아래 명령어처럼 `ros2 topic list -t`를 이용하면 된다. 이전의 명령어가 turtlesim 노드만의 정보를 확인하였다면 `ros2 topic list -t` 명령어는 현재 개발 환경에서 동작 중인 모든 노드들의 토픽 정보를 볼 수 있는 것으로 지금은 turtlesim 노드만이 실행된 상태이기에 turtlesim 노드가 발행, 구독하는 메시지만 표시되고 있다. 참고로 `-t` 옵션은 부가적인 것으로 각 메시지의 형태(type)를 함께 표시해준다.

 
 
$ 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]​
 
  • 토픽 정보 확인
$ ros2 topic info /turtle1/cmd_vel
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscriber count: 1

 

  • 토픽 내용 확인 (ros2 topic echo)

이번에는 특정 토픽의 메시지 내용을 실시간으로 표시하는 `ros2 topic echo`를 사용해보자. 다음 명령어와 같이 `/turtle1/cmd_vel`라고 토픽을 지정하게 되면 해당 토픽의 값을 확인해볼 수 있다. 참고로 `/turtle1/cmd_vel` 토픽을 발행하는 teleop_turtle 노드를 실행한 터미널 창에서 방향 키보드 키(←↑ ↓→)를 눌러 명령을 내려야지만 토픽 값을 확인할 수 있다. 아래의 결과를 보자면 `/turtle1/cmd_vel` 토픽의 linear에 x, y, z 값이 있으며, angular에 x, y, z 값이 존재한다는 것을 알 수 있다. 총 6개의 값으로 구성되어 있으며 현재 linear.x 값으로 1.0 m/s 임을 확인할 수 있다.

참고로 모든 메시지는 meter, second, degree, kg 등 SI 단위를 기본으로 사용하는데 이는 다른 강좌에서 더 자세히 다루기로 하겠다.

$ ros2 topic echo /turtle1/cmd_vel
linear:
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
 
  • 토픽 대역폭 확인 (ros2 topic bw)
위에서 토픽의 내용을 확인해보았다. 이번에는 메시지의 대역폭, 즉 송수신받는 토픽 메시지의 크기를 확인해보자. 크기 확인은 아래 명령어와 같이 `ros2 topic bw`으로 지정된 토픽 메시지의 송수신되는 토픽의 초당 대역폭을 알 수 있다. teleop_turtle 노드에서 지속적으로 메시지를 보내는 상황이라면 평균 1.74KB/s의 대역폭으로 /turtle1/cmd_vel 토픽이 사용되는 것을 확인할 수 있다. 이는 사용하는 메시지 형태 및 주기에 따라 달라질 수 있다.
 
 
$ ros2 topic bw /turtle1/cmd_vel
Subscribed to [/turtle1/cmd_vel]
average: 1.74KB/s
mean: 0.05KB min: 0.05KB max: 0.05KB window: 100
(생략)
 
 
  • 토픽  주기 확인 (ros2 topic hz)

토픽의 전송 주기를 확인하려면 `ros2 topic hz` 명령어를 이용하면 된다. teleop_turtle 노드에서 지속적으로 /turtle1/cmd_vel 토픽을 발행한다면 아래와 같이 평균 33.2 Hz 정도가 나올 것이다. 즉 0.03 초에 한번씩 토픽을 발행하고 있다는 것이다. 이는 teleop_turtle 노드에서 얼마나 자주 /turtle1/cmd_vel 토픽을 발행하는지에 따라 달라질 수 있다. 

$ ros2 topic hz /turtle1/cmd_vel
average rate: 33.212
min: 0.029s max: 0.089s std dev: 0.00126s window: 2483
(생략)
 
 
  • 토픽 지연시간 확인 (ros2 topic delay)

토픽은 RMW 및 네트워크 장비를 거치기 때문에 latency 즉 지연 시간이 반드시 존재하게 된다. 이 지연 시간을 체크하는 방식으로 유저가 직접 코드로 구현하는 방법도 있겠지만 메시지내에 header[6]라는 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​
 
 
  • 토픽 퍼블리시 (ros2 topic pub)

토픽의 발행(publish)은 ROS 프로그램에 내장하는게 기본이다. 이는 ROS 프로그래밍 시간에 다루도록 하고 여기서는 `ros2 topic pub` 명령어를 통해 간단히 토픽을 발행하는 테스트를 해보자. 이 명령어의 사용은 다음과 같다. `ros2 topic pub` 명령어에 토픽 이름, 토픽 메시지 타입, 메시지 내용을 기술하면 된다.

 
 ros2 topic pub <topic_name> <msg_type> "<args>"
 
 
즉, 아래와 같이 기술하면 되는데 아래 명령어를 풀어 해석하자면 `--once` 옵션을 사용하여 단 한번의 발행만을 수행하도록 하였으며, 토픽 이름으로는 /turtle1/cmd_vel 을 사용하였고, 토픽 메시지 타입은 geometry_msgs/msg/Twist 을 사용하였다. 메시지 내용으로는 병진 속도 linear.x 값으로 2.0 m/s를 넣었고, 회전 속도 angular.z 값으로 1.8 rad/s를 입력하였다.
 
 
$ 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` 옵션 제거하고 대신 `--rate 1` 옵션처럼 주기 1Hz의 발행도 할 수 있다. 이를 사용하면 그림 9와 같이 동작할 것이다.
 
$ 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}}"​
 
 
  • bag 기록 (ros2 bag record)

ROS에는 발행하는 토픽을 파일 형태로 저장하고 필요할 때 저장된 토픽을 다시 불러와 동일 타이밍으로 재생할 수 있는 기능이 있다. 이를 rosbag이라고 한다. 이는 매우 유용한 ROS의 기능으로 디버깅에 큰 도움을 준다.

예를 들어 내가 SLAM 알고리즘을 개발한다면 알고리즘 개발에 집중하기 위해서는 SLAM에 필요한 라이다와 같은 센서 정보와 로봇의 위치 정보인 오도메트리와 같은 상태 정보가 필요한데 매번 로봇을 구동시켜 데이터를 취득하기도 힘들고 데이터 취득을 매번하여 테스트를 하더라도 센서 정보 및 로봇 상태 값에 따라 결괏값이 상이해져 알고리즘이 좋아진 것인지 테스트할 때 운이 좋게 센서 및 로봇 상태 값이 좋았는지 구분하기 어렵다. 이럴 때에는 알고리즘의 입력 값을 고정하고 반복하여 테스트할 수 있다면 알고리즘만의 개선 작업 및 성능 검증 테스트를 할 수 있게 된다. rosbag은 이러한 상황에서 원하는 토픽을 기록하고 재생하는 도구이다.

rosbag은 다음과 같이 bag 기록 (ros2 bag record) 명령어에 내가 기록하고자 하는 토픽 이름을 기재하면 된다. 예를 들어 /turtle1/cmd_vel 토픽을 기록하려면 다음 명령어와 같이 실행해주면 된다. 기록 종료는 프로그램을 종료하면 되는데 일반적인 노드 종료와 마찬가지로 해당 터미널 창에서 `Ctrl + c`를 눌러주면 된다. 기록이 종료되면 `rosbag2_2020_09_04-08_31_06` 이라는 이름으로 폴더가 생성된다. 참고로 원하는 이름이 별도로 있다면 `ros2 bag record -o 이름 /turtle1/cmd_vel` 과 같이 `-o` (output) 옵션을 이용하여 특정 이름을 지정해도 된다.

 

ros2 bag record <topic_name1> <topic_name2> <topic_name3>
 

 

$ ros2 bag record /turtle1/cmd_vel
[INFO]: Opened database 'rosbag2_2020_09_04-08_31_06'.
[INFO]: Listening for topics...
[INFO]: Subscribed to topic '/turtle1/cmd_vel'
 
 
  • bag 정보 (ros2 bag info)

저장된 rosbag 파일의 정보를 확인하려면 아래 예제와 같이 bag 정보 (ros2 bag info) 명령어를 이용하면 된다. 내용을 살펴보면 방금 전 우리가 기록한 이 rosbag 파일은 84.4 KiB 크기에 31.602s 시간 동안 기록되었고, 기록이 언제 시작되고 언제 끝났는지 타임스태프와 취득한 토픽의 이름 메시지 형태 메시지 별 갯수와 총 갯수 등이 기록되어 있다.

$ ros2 bag info rosbag2_2020_09_04-08_31_06/

Files:             rosbag2_2020_09_04-08_31_06.db3
Bag size:          84.4 KiB
Storage id:        sqlite3
Duration:          31.602s
Start:             Sep  4 2020 08:31:09.952 (1599175869.952)
End                Sep  4 2020 08:31:41.554 (1599175901.554)
Messages:          355
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 355 | Serialization Format: cdr
 
 
 
  • bag 재생 (ros2 bag play)

rosbag 파일을 기록하고 정보를 확인해봤으니 이제는 재생을 해보자. 일단 turtlesim 노드를 종료한 후 다시 시작하여 초기화를 해준 후 아래의 예제처럼 rosbag를 재생하면 기록 시간 타이밍에 따라 토픽이 재생됨을 확인할 수 있다. 이는 위에서 설명한 `ros2 topic echo /turtle1/cmd_vel` 명령어를 이용하여 터미널 창에서 학인해도 되고, 그림 11와 같이 turtlesim 노드위의 거북이의 움직임을 비교해도 된다.

$ ros2 bag play rosbag2_2020_09_04-08_31_06/
[INFO]: Opened database 'rosbag2_2020_09_04-08_31_06/'.
 
728x90

관련글 더보기

댓글 영역