@大昊 请看下面文章
@小鱼 在 【方法分享】如何修复ROS2录制的Bag文件 中说:
大家好,我是爱吃鱼香ROS的小鱼,今天有位小伙伴再社区提问关于ROS2包如何修复的问题。
72a14de5-ed49-4319-8a39-8e4cf17ffa42-image.png
当我们录制一个ros2的bag时可以得到一个文件夹,文件夹里包含ROS2的功能包的sqlite3数据库文件,和一个配置文件``
小鱼特地跑去测试了下,在最新的humble版本ROS2上,ros2 bag是支持一个叫做reindex的指令的,通过这个指令可以重建ROS2录制的功能包的metadata.yaml。
内容大概是下面这样
rosbag2_bagfile_information:
version: 5
storage_identifier: sqlite3
duration:
nanoseconds: 6546711316
starting_time:
nanoseconds_since_epoch: 1667814329449907668
message_count: 29
topics_with_message_count:
- topic_metadata:
name: /chatter
type: std_msgs/msg/String
serialization_format: cdr
offered_qos_profiles: "- history: 3\n depth: 0\n reliability: 1\n durability: 2\n deadline:\n sec: 9223372036\n nsec: 854775807\n lifespan:\n sec: 9223372036\n nsec: 854775807\n liveliness: 1\n liveliness_lease_duration:\n sec: 9223372036\n nsec: 854775807\n avoid_ros_namespace_conventions: false"
message_count: 7
- topic_metadata:
name: /rosout
type: rcl_interfaces/msg/Log
serialization_format: cdr
offered_qos_profiles: "- history: 3\n depth: 0\n reliability: 1\n durability: 1\n deadline:\n sec: 9223372036\n nsec: 854775807\n lifespan:\n sec: 10\n nsec: 0\n liveliness: 1\n liveliness_lease_duration:\n sec: 9223372036\n nsec: 854775807\n avoid_ros_namespace_conventions: false"
message_count: 22
compression_format: ""
compression_mode: ""
relative_file_paths:
- rosbag2_2022_11_07-17_45_29_0.db3
files:
[]
这个文件其实是对sqlite文件内容的描述,因为我们如果只看sqlite文件是没办法直观得到看到话题的信息的。
所以我们可以通过读取sqlite文件之后再生成这个描述文件,代价就是需要读取一次。
ROS2提供了这一个指令,你可以试一下,先随便录制一个包,然后把原有的metadata.yaml删掉,接着再文件夹的上一级进行重建metadata.yaml文件。
发布话题
ros2 run demo_nodes_py talke
录制包,打断并删除重建
ros2 bag record --all
Ctrl+C
# 删除文件
rm -rf rosbag2_2022_11_07-17_45_29/metadata.yaml
# 重建索引
ros2 bag reindex rosbag2_2022_11_07-17_45_29/ sqlite3
这样你打开文件夹之后就会得到一个新的metadata.yaml文件了。