ROS 2

ROS 2 Tutorials : Recording and playing back data

정지홍 2025. 1. 12. 16:11

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

 

Recording and playing back data — ROS 2 Documentation: Jazzy 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

 

Goal

  • published된 topic or service의 data를 기록한다. 그리고 이를 아무때나 replay하는 것이 기능하다. 이번에는 이에 대한 내용을 다룰 것이다.

 

 

Background

  • ROS 2에서 bag 명령어는 ROS 2 system에서 topic과 service에 대한 data를 기록하기 위한 것이다.
  • 이는 topics와 services에서 전달되는 data를 수집한 뒤에 database에 저장한다.
    기록된 data를 재성하여 테스트와 실험의 결과를 리플레이 가능하다.
  • topics과 services에 대한 record들은 작업의 내용을 공유하고 다른 사람이 이를 리플레이 할 수 있게 도와주는데 유용하다.

 

 

Managing Topic Data

  • 1. 키보드 입력을 turtlesim system에서 기록하여, 나중에 저장후에 리플레이 할 예정이다.
        그래서 우선 늘 그랬든 터틀심과 터틀심 조작 명령어를 입력하자.
ros2 run turtlesim turtlesim_node

ros2 run turtlesim turtle_teleop_key
  • 2. 또한 data를 기록한 디록토리를 만들고 이동해보자.
mkdir bag_files
cd bag_files
  • 3. ros 2 bag은 topic에 publish된 message data를 기록할수있다.
    • 아래명령어로 우선 topic의 목록들을 확인해보자.
ros2 topic list

  • 4. 우리는 https://jihong.tistory.com/478 에서 /turtle_teleop 노드가 /turtle1/cmd_vel 토픽에 명령을 퍼블리시하여 turtlesim에서 거북이를 움직이게 한다는 것을 배웠다.
    • 처음에는 당연히 아무것도 표시되지 않는다. 왜냐면 teleop이 아무런 data를 publish하지 않고 있기 때문이다.
    • teleop을 실행했던 터미널로 가서 거북이를 움직이자. 그러면 아래의 명령어를 입력한 창에서 데이터들이 퍼블리시 됨을 확인할 수 있다.
ros2 topic echo /turtle1/cmd_vel

  • 5. single topic 기록하기...
    • 특정한 topic에 publish된 data를 기록하려면 아래의 명령어 형식을 사용한다.
      • 우리는 그래서 위에서 터틀심을 움직인 것을 기록할것이다. => 2번째 명령어 입력하자.
        • 그러면 아래의 '그림1'처럼 출력될것이다.
        • 그림1을 보면 ros bag이 turtle1/cmd_vel topic에 publish된 data를 기록하고 있음을 볼수있다.
ros2 bag record <topic_name>
ros2 bag record /turtle1/cmd_vel

그림1

  • 6. 기록을 중지해보자.
    • 기록된 데이터는 아래와 같은 형식으로 저장된다. ( 그림 2 참고 )
      • 이 디렉터리에는 metadata.yaml 파일과 함께 기록된 형식의 bag 파일이 포함되어 있다. ( 그림 3 참고 )

그림2
그림 3

  • 7. multiple topics 기록하기
    • ros2는 여러 topic을 동시에 기록하는 것이 가능하며, 저장하는 파일의 이름도 변경하는 것이 가능한다.
      • 한번 아래의 명령어 형식으로 입력해보자. ( 그림 4 및 첫번째 코드 )
      • -o옵션은 bag file에 고유한 이름을 지정할 수 있게 해준다. 아래의 명령어는 subset의 이름으로 저장하는 것이다.
        • 또한 여러 topic을 저장하기 위해서는 공백으로 구분해서 나열해주면 된다.
      • -a 옵션은 현재 시스템에서 사용 가능한 모든 topic의 data를 기록하는 것이다.
ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose
ros2 bag record -a

그림 4

  • 8. topic data 검사하기.
    • 아래의 형식으로 입력하면 된다.
ros2 bag info <bag_file_name>

  • 9. topic data replay
    • bag파일을 리플레이 하기 전에 teleop이 실행중인 터미널에서 프로세스를 종료시키자. 그 다음에는 turtlesim창이 표시되게 준비해서 bag파일 재생 결과를 확인해보자. 아래 명령어 입력.
      • 그러면 거북이는 record했던 경로를 따라서 움직일것이다. 왜냐하면 subset파일은 /turtle1/pose topic data를 기록했기에, ris2 bag play명령은 turtlesim을 실행한 시간 동안 종료되지 않을 것이다. 이는 움직이지 않아도 동일하다.
ros2 bag play subset
  • 10.  managing service data 설정
    • introspection_clientintrospection_service 간의 service data를 기록하고 나중에 동일한 data를 표시 및 재생한다.
    • service client와 server 간 데이터를 기록하려면 노드에서 Service Introspection을 활성화해야 합니다.
  • 11. introspection_clientintrospection_service 노드를 실행하고 Service Introspection을 활성화해보자.
    • 각각 순서대로 introspection_serviceintrospection_client 를 활성화 하 
ros2 run demo_nodes_cpp introspection_service --ros-args -p service_configure_introspection:=contents
ros2 run demo_nodes_cpp introspection_client --ros-args -p client_configure_introspection:=contents
  • 12. ros 2 bag는 사용이 가능한 서비스에 대해서만 data를 기록하는 것이 가능하다. 아래의 명령어로 실행중인 서비스 목록을 볼수있다.
ros2 service list