Knowhow/ROS2

[ROS2 Foxy Tutorial 한글 번역] 10. Recording and playing back data

침닦는수건 2023. 2. 3. 12:29
반응형

Link

https://docs.ros.org/en/foxy/Tutorials/Beginner-CLI-Tools/Recording-And-Playing-Back-Data/Recording-And-Playing-Back-Data.html

 

Recording and playing back data — ROS 2 Documentation: Foxy documentation

Note For users of ROS 2 Foxy who need a more performant version of rosbag2, please see the foxy-future branch of rosbag2. This is an officially-supported branch that is closer to the Galactic version, adding performance improvements and features, but is no

docs.ros.org

 

Background

"ros2 bag" 커맨드는 시스템 내 토픽에서 publish되는 데이터를 기록하는 도구다. 다수의 토픽에서 쏟아지는 데이터를 누적 저장해서 database 형태로 저장한다. 저장된 database를 다시 불러와서 이전과 같은 테스트나 실험을 재현할 수 있다. 협업하거나 개선할 때 큰 도움이 된다.

 

Prerequisites

ros2 bag을 설치해두어야 한다. 

 

만약 Linux에서 Debian 파일을 이용해서 설치한 경우 (권장 방식으로 설치했을 경우), 시스템이 ros2 bag 커맨드를 못 찾을 수 있는데 이 때는 다음과 같이 수동으로 설치해주면 된다.

sudo apt-get install ros-foxy-ros2bag \
                     ros-foxy-rosbag2-converter-default-plugins \
                     ros-foxy-rosbag2-storage-default-plugins

그 외에는 이전 튜토리얼에서 줄곧 다루었던 노드와 토픽에 대한 개념, turtlesim 패키지에 대한 경험이 필요하다.

 

ROS2 sourcing하는 것도 잊지 말자.

 

Tasks

1. Setup

turtlesim 시스템에서 키보드로 입력했던 것들을 저장하고 재실행할 것인데, 일단 /turtlesim, /teleop_turtle 노드를 실행해둔다. 각각 다른 터미널에서 실행한다.

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

그리고 습관들이면 좋은데, bag file을 저장할 폴더를 따로 만들어 둔다.

mkdir bag_files
cd bag_files

 

2. Choose a topic

ros2 bag은 오로지 토픽에서 publish되는 데이터만 저장할 수 있다. 현재 시스템에 있는 topic을 확인한 뒤 대상을 정해보자.

ros2 topic list

출력 결과는 다음과 같을 것이다.

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

토픽에 대해 배운 튜토리얼에서 /turtle_teleop 노드가 /turtle1/cmd_vel 토픽을 통해 데이터를 publish한다는 것을 배웠으니 /turtle1/cmd_vel을 대상으로 사용해본다.

ros2 topic echo /turtle1/cmd_vel

teleop에서 키보드 입력이 없을 땐 아무런 데이터도 publish되지 않기 때문에 아무것도 출력되지 않을 것이다. teleop 터미널에서 키보드 입력을 하는 순간 결과가 출력되는 것을 볼 수 있을 것이다. 키보드 화살표를 이용해 거북이를 이동시켜보자.

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

 

3. ros2 bag record

토픽에서 publish되는 데이터를 저장하는 커맨드는 다음과 같다.

ros2 bag record <topic_name>

커맨드를 실행하기 전에, 터미널 상에서 아까 생성한 저장 폴더 (bag_files)로 이동한 뒤에 실행해야 해당 위치에 rosbag 파일이 생성될 것이다. 

 

예시에서는 다음과 같이 입력하면 된다.

ros2 bag record /turtle1/cmd_vel

시간이 다르기 때문에 정확히 동일하지 않을 것이지만 다음과 같이 출력될 것이다.

[INFO] [rosbag2_storage]: Opened database 'rosbag2_2019_10_11-05_18_45'.
[INFO] [rosbag2_transport]: Listening for topics...
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...

이제 ros2 bag이 /turtle1/cmd_vel 토픽에서 publish되는 데이터를 저장할 것이다. 이제 teleop 터미널로 돌아와 거북이를 맘대로 이동시켜 데이터를 publish 해본다. 이 때 움직이는 모습은 아무거나 상관없고 나중에 재실행할 것인데 그 때 확인 가능할 정도로만 독특한 모양으로 움직이면 된다.

Ctrl+C를 눌러 종료하고 나면, rosbag2_year_month_day-hour_minute_second와 같은 포맷으로 저장된 파일을 볼 수 있을 것이다.

 

3.1 Record multiple topics

다수의 토픽으로부터 나오는 다수의 데이터를 저장하는 것도 간단하다. 

ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose

"-o" 옵션은 bag file의 이름을 지정하는 옵션이고 뒤에 따라붙는 string이 이름이 된다. 위 예시에서는 subet이 bag file 이름이다. 

 

다수의 토픽을 저장하고 싶다면 단순하게 스페이스바 1개 간격을 두고 토픽의 이름을 뒤로 나열하면 된다. 

 

위 커맨드로 /turtle1/cmd_vel 과 /turtle1/pose 저장을 시작하면 다음과 같은 출력 결과를 얻을 수 있다.

[INFO] [rosbag2_storage]: Opened database 'subset'.
[INFO] [rosbag2_transport]: Listening for topics...
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/pose'
[INFO] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...

이제 거북이를 움직인 뒤에 Ctrl+C로 종료하면 2개의 토픽이 파일에 저장될 것이다. 

 

4. ros2 bag info

bag file에 대한 상세 정보는 다음 커맨드로 알 수 있다.

ros2 bag info <bag_file_name>

예시에서는 subset이라는 bag file 이니 다음과 같은 결과를 얻을 수 있다.

ros2 bag info subset
Files:             subset.db3
Bag size:          228.5 KiB
Storage id:        sqlite3
Duration:          48.47s
Start:             Oct 11 2019 06:09:09.12 (1570799349.12)
End                Oct 11 2019 06:09:57.60 (1570799397.60)
Messages:          3013
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 9 | Serialization Format: cdr
                 Topic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 3004 | Serialization Format: cdr

bag file 안에 누적되어 있는 수많은 메세지를 1개씩 따로 보고자 하는 것은 database를 직접 열어야 해서 sqtlie3를 알아야 하므로 여기선 다루지 않는다.

 

5. ros2 bag play

teleop이 활성화 되어있는 터미널을 종료하고 turtlesim 윈도우는 켜둔 채로 다음 커맨드를 입력해보자.

ros2 bag play subset

다음과 같은 출력 결과와 함께 거북이가 저장한 경로를 그대로 불러와 똑같이 이동하는 것을 볼 수 있다. (turtlesim이 시스템 시간에 민감하기 때문에 엄청 약간 다를 순 있다.)

[INFO] [rosbag2_storage]: Opened database 'subset'.

subset bag file이 /turtle1/pose 토픽을 같이 저장한 파일이기 때문에 ros2 bag play 커맨드가 거북이의 이동이 끝났음에도 종료되지 않을 수 있다.

 

이유는 /turtle1/cmd_vel 토픽은 키보드 입력이 주어질 때만 publish가 되기 때문에 몇 개 저장되어 있지 않지만 /turtle1/pose는 /turtlesim 노드가 활성화 되어있는 한 주기적으로 publish하기 때문에 수없이 많이 저장되어 있기 때문이다.예를 들어, /turtle1/cmd_vel은 9개 정도이고, /turtle1/pose는 3000개 정도일 수 있다. 

 

이러한 상황이 불편하다면 다음 커맨드로 상시 publish 되는 토픽의 주기를 조절해서 저장하는 방법이 있겠다. 

ros2 topic hz /turtle1/pose

 

Summary

ros2 bag 커맨드를 이용해 ROS2 시스템의 토픽에서 나오는 데이터를 저장할 수 있다. 협업하거나 분석할 때 알고 있으면 좋은 기능들이다.

반응형