rqt_bag 源码详细分析
工作区路径:/home/cp/work2/ros2Learn/ros2_humble/src/ros-visualization/rqt_bag
版本:1.1.6(rqt_bag + rqt_bag_plugins)。
rqt_bag 提供 ROS bag 文件 GUI:浏览、回放、录制;rqt_bag_plugins 提供消息视图插件(图像、曲线)。ROS 2 端口使用 rosbag2 API。
1. 子包结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| rqt_bag/ ├── rqt_bag/ # 主 GUI 插件 │ ├── src/rqt_bag/ │ │ ├── bag.py # rqt 插件入口 │ │ ├── bag_widget.py # 主界面 │ │ ├── player.py # 回放控制 │ │ ├── recorder.py # 录制 │ │ ├── rosbag2.py # rosbag2 封装 │ │ ├── bag_timeline.py # 时间轴 │ │ ├── timeline_cache.py │ │ ├── message_loader_thread.py │ │ └── plugins/ # 内置消息视图插件框架 │ └── plugin.xml └── rqt_bag_plugins/ # 扩展视图 ├── image_plugin.py / image_view.py └── plot_plugin.py / plot_view.py
|
2. 架构
flowchart TB
subgraph ui [UI 层]
BAG["bag.Bag Plugin"]
BW["BagWidget"]
TL["BagTimeline"]
end
subgraph engine [引擎]
PLAYER["Player"]
REC["Recorder"]
RB2["rosbag2.py"]
end
subgraph views [视图插件]
RAW["RawView"]
IMG["ImagePlugin"]
PLOT["PlotPlugin"]
end
BAG --> BW --> TL
BW --> PLAYER & REC --> RB2
TL --> views
3. 主插件 bag.py
- 继承
rqt_gui_py.plugin.Plugin
plugin.xml:rqt_bag.bag.Bag
- 创建
BagWidget,嵌入 dock
4. 回放 player.py
- 按时间轴读取 rosbag2 消息
- 通过
rclpy 重发布到对应 topic
- 与
Player 时钟、/clock(sim time)协调
5. 录制 recorder.py
- 选择 topic 写入 bag
- QoS 映射见
qos.py
6. rosbag2 封装 rosbag2.py
对 rosbag2_py / storage 的 Python 封装:打开 bag、迭代消息、查 metadata。
7. 时间轴与缓存
| 模块 |
作用 |
bag_timeline.py |
时间刻度、播放头 |
timeline_cache.py |
消息索引缓存 |
index_cache_thread.py |
后台建索引 |
message_loader_thread.py |
异步加载消息体 |
8. 视图插件体系
8.1 内置框架 plugins/plugin.py
1 2 3
| class Plugin: def get_timeline_renderer(self): ... def get_message_view(self): ...
|
8.2 rqt_bag_plugins
| 插件 |
功能 |
ImagePlugin |
显示 sensor_msgs/Image |
PlotPlugin |
数值字段绘图 |
各自 plugin.xml 注册为 base_class_type="rqt_bag::Plugin"。
9. 依赖
1 2 3 4 5
| rqt_bag ├── rqt_gui_py, qt_gui ├── rclpy ├── rosbag2_py / rosbag2 └── python_qt_binding
|
10. 启动
1 2
| ros2 run rqt_bag rqt_bag
|
11. 小结
rqt_bag 是 ROS 2 bag 可视化的主工具:时间轴 + 多线程 IO + 可扩展消息视图;与 CLI ros2 bag play 互补,适合调试与 inspection。
正在加载留言…