rqt 源码详细分析
工作区路径:/home/cp/work2/ros2Learn/ros2_humble/src/ros-visualization/rqt
版本:1.1.9(子包统一版本)。
rqt 目录含 ROS 2 版 rqt 框架 5 个包:meta 包 rqt、GUI 入口 rqt_gui、Python/C++ 插件桥 rqt_gui_py / rqt_gui_cpp、公共工具 rqt_py_common。
1. 子包结构
1 | rqt/ |
2. 架构
3. rqt_gui — ROS 入口
3.1 Main 类
1 | class Main(Base): |
- 继承
qt_gui.main.Main - 剥离 ROS remapping 参数
- 设置 rqt 图标与 help 文本
_add_plugin_providers()注册 ROS 专用 Provider
3.2 可执行文件
bin/rqt_gui→rqt_gui.main:main- 各插件包
scripts/rqt_graph等以standalone='module.Class'单插件启动
4. rqt_gui_py — Python 插件
4.1 plugin.xml
1 | <class name="RosPyPluginProvider" |
4.2 插件基类
Python 插件继承 rqt_gui_py.plugin.Plugin(或旧名 qt_gui_py.plugin.Plugin),实现:
startup_plugin()/shutdown_plugin()- 可选
_widget返回 Qt 控件
4.3 ros2_plugin_context
ros2_plugin_context.py 提供 rclpy Node、namespace 等 ROS 2 上下文给插件。
5. rqt_gui_cpp — C++ 插件
RosCppPluginProvider加载rqt_gui_cpp::Plugin子类- 适用于高性能 GUI(较少使用)
6. rqt_py_common
共享 Python 模块:
- 话题列表、消息类型工具
- 与
rclpy交互的 helper - 被
rqt_topic、rqt_plot等依赖
7. 插件注册约定
每个功能包提供:
plugin.xml— 声明<class ... base_class_type="rqt_gui_py::Plugin">setup.py—entry_points+ ament index exportresource/— UI、图标
RecursivePluginProvider 在 ament_index 的 rqt_gui / qt_gui 插件索引中扫描。
8. standalone 模式
1 | # rqt_graph/scripts/rqt_graph |
只加载指定插件,不显示空壳主界面。
9. 依赖链
1 | rqt_gui |
10. 与 ros2/rviz 区别
| 工具 | 栈 | 用途 |
|---|---|---|
| rqt | qt_gui + 插件 | 2D GUI、introspection |
| rviz2 | Ogre + rviz_common | 3D 可视化 |
二者独立;interactive_markers 服务 rviz,不服务 rqt。
11. 推荐阅读顺序
rqt_gui/main.pyrqt_gui/ros_plugin_provider.pyrqt_gui_py/ros_py_plugin_provider.py- 任选
rqt_graph/plugin.xml+ Plugin 类 rqt_py_common常用 helper
12. 小结
rqt 目录是 ROS 2 的 qt_gui 启动器 + 插件 Provider:本身不提供业务功能,而是让数十个 rqt_* 插件以统一方式被发现、停靠与持久化布局。
正在加载留言…