ros2 bag record와 play

로봇이 본 것을 녹화했다가 그대로 다시 틀 수 있을까?

bag

토픽을 통째로 녹화합니다

rosbag2는 토픽에 흐르는 메시지를 시각과 함께 파일로 저장하고, 나중에 같은 순서와 간격으로 다시 발행합니다. 로봇 없이도 그때 본 것을 몇 번이고 다시 볼 수 있습니다.

Jazzy는 기본으로 MCAP 형식(.mcap)에 저장합니다.

녹화

--use-sim-time을 붙여 녹화합니다

Gazebo와 teleop을 켠 채 ros2 bag record --use-sim-time -o run1 --topics /scan /odom /tf /tf_static을 치고 로봇을 몰아 봅니다. 기록 시각을 벽시계 대신 /clock으로 찍습니다. Ctrl+C로 녹화를 끝내면 run1 폴더가 남습니다.

첫 /clock 메시지가 오기 전에는 아무것도 기록하지 않습니다.

재생

Gazebo를 끄고 재생합니다

Gazebo가 켜져 있으면 /scan, /tf, /clock을 Gazebo와 bag이 함께 내서 뒤섞입니다. Gazebo 런치를 Ctrl+C로 끈 뒤 ros2 bag play run1 --clock을 칩니다. --clock은 bag에 적힌 시각으로 /clock을 내 줍니다.

--clock은 bag 이름 뒤에 둡니다. 앞에 두면 bag 이름을 --clock의 값(Hz)으로 읽으려 합니다.

보는 쪽

재생을 보는 노드도 use_sim_time

bag 속 메시지에는 녹화할 때의 시뮬레이션 시각이 찍혀 있습니다. 그래서 재생을 받아 보는 RViz 같은 노드도 7편처럼 use_sim_time을 켜야 --clock이 내는 시간과 맞습니다.

RViz는 8편과 같이 ros2 run rviz2 rviz2 --ros-args -p use_sim_time:=true로 띄웁니다.

-a 주의

-a로 녹화하면 /clock도 들어갑니다

-a(모든 토픽)로 녹화하면 /clock도 bag에 들어갑니다. 재생할 때 시계를 내는 쪽이 둘이 되면 시각이 앞뒤로 튑니다. 녹화 때 --exclude-topics /clock으로 빼거나, 재생할 때 --clock을 빼서 녹화된 /clock을 그대로 씁니다.

최근 Jazzy의 --clock은 bag 속 /clock을 알아서 빼고 재생합니다. 판과 상관없이 둘 중 하나를 지키면 안전합니다.

정리

녹화에서 재생까지 다섯 걸음

녹화는 시뮬레이션 시계로, 재생은 bag의 시계로 맞춥니다. 무엇이 녹화됐는지는 ros2 bag info run1로 토픽과 메시지 수를 보면 됩니다. 실제 로봇에서 녹화한 bag도 같은 방법으로 다시 봅니다.

다음 강

바퀴로 센 위치는 얼마나 믿을 수 있을까요?

15강 1편바퀴만 믿으면 왜 길을 잃을까? 14강 목록