Robot Operating System/Tutorial 따라하기

[Dashing][CLI Tools] 10. Recording and playing back data

jstar0525 2021. 5. 20. 20:57
반응형

이 글은 아래의 자료를 참고로 만들어졌습니다.

 

https://docs.ros.org/en/dashing/Tutorials/Ros2bag/Recording-And-Playing-Back-Data.html

 

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

You can also record multiple topics, as well as change the name of the file ros2 bag saves to. The -o option allows you to choose a unique name for your bag file. The following string, in this case subset, is the file name. To record more than one topic at

docs.ros.org


 

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
...(생략)
반응형