rqt 源码详细分析

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
2
3
4
5
6
rqt/
├── rqt/ # meta,聚合依赖
├── rqt_gui/ # ros2 run rqt_gui rqt_gui
├── rqt_gui_py/ # Python 插件 Provider
├── rqt_gui_cpp/ # C++ 插件 Provider
└── rqt_py_common/ # Topic/Node 等 GUI 工具

2. 架构

ros2 run rqt_gui rqt_guirqt_gui.main.Mainqt_gui.main.MainRosPluginProviderRosPyPluginProviderament_index\nplugin.xmlrqt_* 插件包

3. rqt_gui — ROS 入口

3.1 Main 类

1
2
3
4
5
6
7
8
class Main(Base):
def __init__(self, filename=None, settings_filename='rqt_gui'):
qtgui_path = get_package_path('qt_gui')
super(Main, self).__init__(qtgui_path, ...)

def main(self, argv=None, standalone=None, ...):
argv = rclpy.utilities.remove_ros_args(args=argv)
return super(Main, self).main(argv, standalone=standalone, ...)
  • 继承 qt_gui.main.Main
  • 剥离 ROS remapping 参数
  • 设置 rqt 图标与 help 文本
  • _add_plugin_providers() 注册 ROS 专用 Provider

3.2 可执行文件

  • bin/rqt_guirqt_gui.main:main
  • 各插件包 scripts/rqt_graph 等以 standalone='module.Class' 单插件启动

4. rqt_gui_py — Python 插件

4.1 plugin.xml

1
2
3
<class name="RosPyPluginProvider"
type="rqt_gui_py.ros_py_plugin_provider.RosPyPluginProvider"
base_class_type="rqt_gui_py::PluginProvider">

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_topicrqt_plot 等依赖

7. 插件注册约定

每个功能包提供:

  1. plugin.xml — 声明 <class ... base_class_type="rqt_gui_py::Plugin">
  2. setup.pyentry_points + ament index export
  3. resource/ — UI、图标

RecursivePluginProviderament_indexrqt_gui / qt_gui 插件索引中扫描。


8. standalone 模式

1
2
# rqt_graph/scripts/rqt_graph
Main().main(sys.argv, standalone='rqt_graph.ros_graph.RosGraph')

只加载指定插件,不显示空壳主界面。


9. 依赖链

1
2
3
4
5
rqt_gui
├── qt_gui
├── python_qt_binding
├── rclpy
└── rqt_gui_py / rqt_gui_cpp

10. 与 ros2/rviz 区别

工具 用途
rqt qt_gui + 插件 2D GUI、introspection
rviz2 Ogre + rviz_common 3D 可视化

二者独立;interactive_markers 服务 rviz,不服务 rqt。


11. 推荐阅读顺序

  1. rqt_gui/main.py
  2. rqt_gui/ros_plugin_provider.py
  3. rqt_gui_py/ros_py_plugin_provider.py
  4. 任选 rqt_graph/plugin.xml + Plugin 类
  5. rqt_py_common 常用 helper

12. 小结

rqt 目录是 ROS 2 的 qt_gui 启动器 + 插件 Provider:本身不提供业务功能,而是让数十个 rqt_* 插件以统一方式被发现、停靠与持久化布局。

文章互动

阅读 --

留言

0 条留言

正在加载留言…