[Dashing][CLI Tools] 10. Recording and playing back data
이 글은 아래의 자료를 참고로 만들어졌습니다.
https://docs.ros.org/en/dashing/Tutorials/Ros2bag/Recording-And-Playing-Back-Data.html
Recording and playing back data
Goal: Record data published on a topic so you can replay and examine it any time.
Tutorial level: Beginner
Background
ros2 bag 명령은 시스템의 topics가 published한 데이터를 기록하기 위한 도구입니다.
이 도구는 여러 topics에 걸쳐 전달된 데이터를 축적하고, 데이터베이스에 저장합니다.
그런 다음, 데이터를 재생하여 테스트 및 실험 결과를 재현할 수 있습니다.
topics를 기록하는 것은 현재 작업을 공유하거나 다른 사람들에게 더욱 개선할 수 있도록 할 수 있는 좋은 방법입니다.
Prerequisites
ros2 bag을 설치해야합니다.
$ sudo apt-get install ros-dashing-ros2bag \
ros-dashing-rosbag2-converter-default-plugins \
ros-dashing-rosbag2-storage-default-plugins
이 튜토리얼은 이전에 다루었던 nodes와 topics에 대한 개념에 대하여 언급합니다.
또한, 이 튜토리얼은 turtlesim package를 사용합니다.
매번 그랬듯이, 새로운 터미널을 열 때마다 ROS 2를 source하는 것을 잊지마세요.
Tasks
1 Setup
turtlesim 시스템의 키보드 입력을 저장하고 나중에 다시 repaly하기 위해 record할 것입니다.
이를 위해 /turtlesim과 /teleop_turtle nodes를 실행합니다.
새로운 터미널을 열어 아래의 명령을 실행합니다.
$ ros2 run turtlesim turtlesim_node
또 다른 새 터미널을 열어 아래 명령을 실행합니다.
$ ros2 run turtlesim turtle_teleop_key
새로운 터미널을 열어
녹음한 것을 저장하기 위한 디렉토리를 만듭니다.
$ mkdir bag_files
$ cd bag_files
2 Choose a topic
ros2 bag 명령은 topics으로 published한 데이터를 record할 수 있습니다.
현재 시스템의 topics을 보기위해 새로운 터미널을 열어 아래의 명령을 실행합니다.
$ ros2 topic list
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
topics에 관한 튜토리얼에서,
/turtle_teleop node가 turtlesim에서 turtle이 움직이게 하기 위해
/turtle1/cmd_vel topic을 publish하였습니다.
/turtle1/cmd_vel이 publish한 데이터를 보기위해
아래의 명령을 실행합니다.
$ ros2 topic echo /turtle1/cmd_vel
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 2.0
---
...(생략)
처음에는 아무 결과도 보여주지 않습니다.
teleop로부터 데이터를 publish하지 않았기 때문입니다.
teleop를 실행한 터미널을 클릭하여 활성화한 후,
키보드 화살표를 이용하여 turtle을 움직이면,
ros2 topic echo를 실행한 터미널에서 /turtle1/cmd_vel이 publish한 데이터를 볼 수 있습니다.
3 ros2 bag record
publish된 데이터를 record하기 위한 명령 문법은 다음과 같습니다.
$ ros2 bag record <topic_name>
아래의 명령을 실행하기 전에,
새로운 터미널을 열고
이전에 만들었던 bag_files 디렉토리로 이동합니다.
왜냐하면, rosbag 파일은 현재 위치에 저장될 것이기 때문입니다.
그 후, 아래의 명령을 실행합니다.
$ ros2 bag record /turtle1/cmd_vel
[INFO] [rosbag2_storage]: Opened database 'rosbag2_2021_05_21-10_44_23'.
[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...
위의 메세지를 확인할 수 있습니다(날짜와 시간은 다를 수 있습니다).
이제 /turtle1/cmd_vel topic으로 publish된 데이터가 recording하고 있습니다.
teleop를 실행한 터미널로 돌아가 turtle을 움직입니다.
어떻게 움직이든 상관이 없지만,
나중에 데이터를 replay하였을 때 알아보기 쉬운 패턴으로 만드는 것이 좋습니다.
Ctrl+C를 눌러 recording을 멈출 수 있습니다.
데이터가 bag 파일에 모이게 되고,
파일 이름은 rosbag2_year_month_day-hour_minute_second의 형식을 가지고 있습니다.
3.1 Record multiple topics
여러 topics를 record할 수 있을 뿐만 아니라,
bag 파일의 이름을 바꿀 수 있습니다.
아래의 명령을 실행합니다.
$ ros2 bag record -o subset /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...
-o 옵션으로 bag 파일의 이름을 바꿀 수 있습니다.
여기서, bag 파일의 이름은 subset입니다.
한 번에 여러 topic을 record하기 위해서는,
공백을 이용하여 각 topic을 구분하여 나열하면 됩니다.
아래의 메세지를 통해 2개의 topics이 record되는 것을 확인할 수 있습니다.
그리고 turtle을 teleop를 이용하여 움직인 후, Ctrl+C를 눌러 종료합니다.
<Note> 다른 옵션으로 -a가 있으며, 현재 시스템의 모든 topics을 record합니다. |
4 ros2 bag info
bag 파일에 대한 정보는 아래의 명령을 통해 알 수 있습니다.
$ ros2 bag info <bag_file_name>
아래의 명령을 실행하여 subset bag 파일에 대한 정보를 알 수 있습니다.
$ ros2 bag info subset
Files: subset.db3
Bag size: 72.5 KiB
Storage id: sqlite3
Duration: 13.375s
Start: May 21 2021 10:46:10.292 (1621561570.292)
End May 21 2021 10:46:23.667 (1621561583.667)
Messages: 851
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 14 | Serialization Format: cdr
Topic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 837 | Serialization Format: cdr
5 ros2 bag play
bag 파일을 replay하기 전에, teleop가 실행되고 있는 터미널에 Ctrl+C를 입력합니다.
그리고 bag file에 의한 결과를 볼 수 있도록 turlesim window을 볼 수 있게 합니다.
아래의 명령을 실행합니다.
$ ros2 bag play subset
[INFO] [rosbag2_storage]: Opened database 'subset'.
그 결과, turtle이 record한 경로와 동일하게 움직이는 것을 확인할 수 있습니다.
(turtlesim이 작은 변화에 민감하여, 완전히 100% 같은 것은 아닙니다)
subset 파일이 /turtle1/pose topic을 record하였기 때문에,
turtle이 움직이지 못하더라도 turtlesim이 실행되는 동안 ros2 bag play 명령을 종료하지 않습니다.
/turtlesim node가 활성화되어 있는 동안,
/turtle1/pose topic이 일정한 간격으로 데이터를 publish하였습니다.
이는 위의 ros2 bag info 명령으로 알 수 있습니다.
/turtle1/cmd_vel topic의 Count가 14임(record할 때 키보드 입력을 한 횟수)에 반해,
/turtle1/pose topic의 Count가 837임을 알 수 있습니다.
$ ros2 bag info subset
Files: subset.db3
Bag size: 72.5 KiB
Storage id: sqlite3
Duration: 13.375s
Start: May 21 2021 10:46:10.292 (1621561570.292)
End May 21 2021 10:46:23.667 (1621561583.667)
Messages: 851
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 14 | Serialization Format: cdr
Topic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 837 | Serialization Format: cdr
/turtle1/pose가 얼마나 데이터를 publish한 것은
아래의 명령으로 확인할 수 있습니다.
$ ros2 topic hz /turtle1/pose
average rate: 62.698
min: 0.013s max: 0.016s std dev: 0.00051s window: 64
average rate: 62.604
min: 0.013s max: 0.016s std dev: 0.00043s window: 127
average rate: 62.573
min: 0.013s max: 0.016s std dev: 0.00040s window: 190
average rate: 62.557
min: 0.013s max: 0.016s std dev: 0.00038s window: 253
...(생략)