ros2bag录包中断修复yaml配置

文章目录

问题背景简述

当时在ros2录制包的过程中,由于板子内存限制导致录制提前中断,db3的数据包保存下来了,但是metadata.yaml确实空的,我直接把其他包的yaml复制修改db3包名称后进行使用,bag可以播放但是话题需要等待很长一段时间才出现

metadata.yaml 信息

  1. Bag基本信息

    version: 5

    storage_identifier: sqlite3

    说明:

    ROS2 Bag格式版本 = 5

    后端存储采用 SQLite3

    实际数据保存在:

    rosbag2_2026_06_05-03_22_25_0.db3

  2. 总消息数

    message_count: 5619

    整个Bag中共记录:

    5619条消息

  3. Topic统计

    激光点云

    /cx/lslidar_point_cloud

    type: sensor_msgs/msg/PointCloud2

    message_count: 1256

    记录:

    1256帧点云

    LaserScan

    /cx/scan

    type: sensor_msgs/msg/LaserScan

    message_count: 1256

    记录:

    1256帧二维激光

    相机

    / image_raw

    type: sensor_msgs/msg/Image

    message_count: 3107

    记录:

    3107帧图像

从db3获取信息

录制起始结束时间戳和时长

查看命令

bash 复制代码
SELECT
(MAX(timestamp)-MIN(timestamp))/1000000000.0
FROM messages;

终端示例

bash 复制代码
(base) gg@gg:/media/gg/EXTERNAL_USB/ros2bag/rosbag2_2026_06_05-03_22_25$ sqlite3 rosbag2_2026_06_05-03_22_25_0.db3
SQLite version 3.41.2 2023-03-22 11:56:21
Enter ".help" for usage hints.
sqlite> .tables
messages  metadata  schema    topics  
sqlite> SELECT MIN(timestamp),MAX(timestamp)
   ...> FROM messages;
1780600945404366968|1780602252169703608
sqlite> SELECT
(MAX(timestamp)-MIN(timestamp))/1000000000.0
FROM messages;
1306.76533664

录制话题信息数量

查看命令:

bash 复制代码
SELECT t.name,
       MIN(m.timestamp),
       MAX(m.timestamp),
       COUNT(*)
FROM messages m
JOIN topics t
ON m.topic_id=t.id
GROUP BY t.name;

终端示例

bash 复制代码
(base) gg@gg:/media/gg/EXTERNAL_USB/ros2bag/rosbag2_2026_06_05-03_22_25$ sqlite3 rosbag2_2026_06_05-03_22_25_0.db3
SQLite version 3.41.2 2023-03-22 11:56:21
Enter ".help" for usage hints.
sqlite> SELECT t.name,
       MIN(m.timestamp),
       MAX(m.timestamp),
       COUNT(*)
FROM messages m
JOIN topics t
ON m.topic_id=t.id
GROUP BY t.name;

/cx/lslidar_point_cloud|1780600945417126136|1780602252072033272|13068
/cx/scan|1780600945404366968|1780602252072146232|13068
/image_raw|1780600945501671704|1780602252169703608|32350

话题信息数量、时间戳、频率

查看命令:

bash 复制代码
SELECT
t.name,
COUNT(*) AS msg_count,
(MIN(m.timestamp))/1e9 AS start_time,
(MAX(m.timestamp))/1e9 AS end_time,
COUNT(*)*1.0/
((MAX(m.timestamp)-MIN(m.timestamp))/1e9)
AS hz
FROM messages m
JOIN topics t
ON m.topic_id=t.id
GROUP BY t.name;

终端示例

bash 复制代码
sqlite> SELECT
t.name,
COUNT(*) AS msg_count,
(MIN(m.timestamp))/1e9 AS start_time,
(MAX(m.timestamp))/1e9 AS end_time,
COUNT(*)*1.0/
((MAX(m.timestamp)-MIN(m.timestamp))/1e9)
AS hz
FROM messages m
JOIN topics t
ON m.topic_id=t.id
GROUP BY t.name;
/cx/lslidar_point_cloud|13068|1780600945.41713|1780602252.07203|10.0011104145648
/cx/scan|13068|1780600945.40437|1780602252.07215|10.0010118925262
/image_raw|32350|1780600945.50167|1780602252.1697|24.7576271938493