首页/目录/全部文章

全部文章

八个专题的源码、算法与协议笔记都在这里。

笔记列表

rqt_bag 源码详细分析

rqt_bag 源码详细分析

工作区路径:/home/cp/work2/ros2Learn/ros2_humble/src/ros-visualization/rqt_bag
版本:1.1.6rqt_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.xmlrqt_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
# 或在 rqt 菜单 Plugins → Logging → Bag

11. 小结

rqt_bag 是 ROS 2 bag 可视化的主工具:时间轴 + 多线程 IO + 可扩展消息视图;与 CLI ros2 bag play 互补,适合调试与 inspection。

rqt_console 源码详细分析

rqt_console 源码详细分析

工作区路径:/home/cp/work2/ros2Learn/ros2_humble/src/ros-visualization/rqt_console
版本:2.0.3

rqt_console 订阅 /rosoutrcl_interfaces/msg/Log),提供可过滤、可高亮的 ROS 日志 GUI


1. 结构

1
2
3
4
5
6
7
rqt_console/
├── plugin.xml # Console → rqt_console.console.Console
└── src/rqt_console/
├── main.py
├── console.py # Plugin 主类
├── console_widget.py
└── log_model.py # Qt 模型 + 过滤

2. 功能

  • 按 severity(DEBUG/INFO/WARN/ERROR/FATAL)过滤
  • 按节点名、文本 keyword 过滤
  • 高亮规则(regex)
  • 暂停/继续滚动

3. 数据流

/rosoutrclpy SubscriptionLogModelQTableView

4. 插件

1
2
<class name="Console" type="rqt_console.console.Console"
base_class_type="rqt_gui_py::Plugin">

5. 依赖

rclpy, rcl_interfaces, rqt_gui_py, python_qt_binding


6. 小结

替代终端刷屏的 集中日志查看器;与 rqt_logger_level(若安装)配合可动态改 log level。

rqt_graph 源码详细分析

rqt_graph 源码详细分析

工作区路径:/home/cp/work2/ros2Learn/ros2_humble/src/ros-visualization/rqt_graph
版本:1.3.2

rqt_graph图形化方式展示 ROS 2 计算图(节点、话题、连接关系),是调试系统结构最常用的 rqt 插件之一。


1. 仓库结构

1
2
3
4
5
6
7
8
9
10
rqt_graph/
├── plugin.xml # RosGraph 插件声明
├── scripts/rqt_graph # standalone 入口
├── src/rqt_graph/
│ ├── main.py
│ ├── ros_graph.py # Plugin 主类 RosGraph
│ ├── rosgraph2_impl.py # ROS 2 图数据获取
│ ├── dotcode.py # 生成 DOT
│ └── interactive_graphics_view.py
└── resource/RosGraph.ui

2. 插件注册

1
2
<class name="RosGraph" type="rqt_graph.ros_graph.RosGraph"
base_class_type="rqt_gui_py::Plugin">

3. 数据流

RosGraph Widgetrosgraph2_implrclpy graph API\nget_topic_names_and_types等dotcode.pyqt_dotgraph 渲染
  1. 定时或按需查询 ROS 2 graph
  2. 转为 DOT 描述
  3. qt_dotgraph 绘制为 Qt 场景
  4. interactive_graphics_view 支持缩放、拖拽

4. 核心类 RosGraph

  • 继承 rqt_gui_py.plugin.Plugin
  • 加载 RosGraph.ui
  • 刷新按钮触发 rosgraph2_impl 更新
  • 可过滤 namespace、隐藏 leaf topic 等(见 UI 选项)

5. rosgraph2_impl

封装 ROS 2 特有 API(对比 ROS 1 的 rosgraph):

  • 节点列表
  • 话题 pub/sub 关系
  • 服务(视实现版本)

6. 依赖

1
2
3
4
rqt_graph
├── rqt_gui_py, rclpy
├── qt_dotgraph (qt_gui_core)
└── python_qt_binding

7. 启动

1
ros2 run rqt_graph rqt_graph

8. 小结

rqt_graph = ROS 2 graph introspection + DOT 可视化;核心在 rosgraph2_impldotcode,UI 层薄。

rqt_msg 源码详细分析

rqt_msg 源码详细分析

工作区路径:/home/cp/work2/ros2Learn/ros2_humble/src/ros-visualization/rqt_msg
版本:1.2.0

rqt_msg 用于 浏览 ROS 消息类型定义(.msg 结构树),不依赖运行时 topic。


1. 结构

1
2
3
4
5
rqt_msg/
├── plugin.xml # Messages → rqt_msg.messages.Messages
└── src/rqt_msg/
├── main.py
└── messages.py

2. 功能

  • 列出 packages 中所有 message
  • 树形展示字段与嵌套类型
  • 通过 rosidl_runtime_py / interface 路径加载定义

3. 插件

1
2
<class name="Messages" type="rqt_msg.messages.Messages"
base_class_type="rqt_gui_py::Plugin">

菜单:Plugins → Introspection → Messages


4. 依赖

rosidl_runtime_py, ament_index_python, rqt_gui_py


5. 小结

写 publisher 或解析 unknown 消息前的 类型手册浏览器

rqt_plot 源码详细分析

rqt_plot 源码详细分析

工作区路径:/home/cp/work2/ros2Learn/ros2_humble/src/ros-visualization/rqt_plot
版本:1.1.5

rqt_plot 订阅话题字段并 实时 2D 绘图(时间序列),支持多种 plotting backend。


1. 结构

1
2
3
4
5
6
rqt_plot/
├── plugin.xml # Plot → rqt_plot.plot.Plot
└── src/rqt_plot/
├── main.py
├── plot.py # 主 Plugin
└── plot_widget.py # 绘图控件

2. 工作流程

  1. 用户输入 topic + field path(如 /joint_states.position[0]
  2. 创建 rclpy subscription
  3. 解析消息字段(动态类型 introspection)
  4. 追加 (time, value) 到曲线
  5. 使用 matplotlibpyqtgraph 渲染(可配置 backend)

3. 插件

1
2
<class name="Plot" type="rqt_plot.plot.Plot"
base_class_type="rqt_gui_py::Plugin">

菜单:Plugins → Visualization → Plot


4. 依赖

rclpy, rqt_py_common, python_qt_binding, matplotlib / pyqtgraph


5. 与 rqt_bag_plugins PlotPlugin 区别

场景
rqt_plot 在线 live 订阅
rqt_bag_plugins PlotPlugin 离线 bag 回放曲线

6. 小结

轻量 oscilloscope 式 调试工具,适合调 PID、传感器噪声等。

rqt_publisher 源码详细分析

rqt_publisher 源码详细分析

工作区路径:/home/cp/work2/ros2Learn/ros2_humble/src/ros-visualization/rqt_publisher
版本:1.5.0

rqt_publisher 提供 GUI 手动发布任意 ROS 消息:选类型、填字段、定频率发送。


1. 结构

1
2
3
4
5
6
rqt_publisher/
├── plugin.xml # Publisher → rqt_publisher.publisher.Publisher
└── src/rqt_publisher/
├── main.py
├── publisher.py
└── publisher_widget.py

2. 功能

  • 选择 message 类型(与 rqt_msg 类似 introspection)
  • 动态表单编辑字段(固定值或表达式)
  • 创建 rclpy.Publisher 并按 Hz 发布
  • 支持添加/删除多个 publisher 行

3. 插件

1
2
<class name="Publisher" type="rqt_publisher.publisher.Publisher"
base_class_type="rqt_gui_py::Plugin">

菜单:Plugins → Topics → Message Publisher


4. 依赖

rclpy, rosidl_runtime_py, rqt_py_common, rqt_gui_py


5. 小结

快速 注入测试消息 而不写临时节点;注意 QoS 与真实 subscriber 匹配。

rqt_py_console 源码详细分析

rqt_py_console 源码详细分析

工作区路径:/home/cp/work2/ros2Learn/ros2_humble/src/ros-visualization/rqt_py_console
版本:1.0.2

rqt_py_console 提供 交互式 Python 控制台 插件,通常在已初始化 rclpy 的进程上下文中执行代码(取决于插件实现是否注入 node)。


1. 结构

1
2
3
4
5
rqt_py_console/
├── plugin.xml # PyConsole → rqt_py_console.py_console.PyConsole
└── src/rqt_py_console/
├── main.py
└── py_console.py

2. 功能

  • 基于 code.InteractiveConsole 或类似 REPL
  • Qt 文本框输入/输出
  • 可访问插件 context 中的 ROS 对象(视 startup 注入而定)

3. 插件

1
2
<class name="PyConsole" type="rqt_py_console.py_console.PyConsole"
base_class_type="qt_gui_py::Plugin">

菜单:Plugins → System Tool → Python Console


4. 依赖

python_qt_binding, qt_gui_py, rqt_gui_py


5. 小结

快速 Python 试探 环境;复杂调试仍推荐独立终端 + ipython。

rqt_reconfigure 源码详细分析

rqt_reconfigure 源码详细分析

工作区路径:/home/cp/work2/ros2Learn/ros2_humble/src/ros-visualization/rqt_reconfigure
版本:1.1.4

rqt_reconfigure 提供 动态参数 GUI:连接带 on_set_parameters / declare_parameter 的节点,滑动条/文本框修改参数(类似 ROS 1 dynamic_reconfigure 体验,基于 ROS 2 parameters)。


1. 结构

1
2
3
4
5
6
7
rqt_reconfigure/
├── plugin.xml # Param → rqt_reconfigure.param_plugin.ParamPlugin
└── src/rqt_reconfigure/
├── main.py
├── param_plugin.py
├── param_client_widget.py
└── treenode_model.py

2. 功能

  • 输入目标节点名
  • 通过 rclpy AsyncParametersClient 列出参数
  • 按类型渲染控件(bool/int/double/string/数组)
  • 修改后 set_parameters 回写

3. 插件

1
2
<class name="Param" type="rqt_reconfigure.param_plugin.ParamPlugin"
base_class_type="rqt_gui_py::Plugin">

菜单:Plugins → Configuration → Dynamic Reconfigure


4. 与 ROS 2 parameters 关系

ROS 2 无 central dynamic_reconfigure server;本插件直接调 parameter service API,要求目标节点 expose 可写参数。


5. 依赖

rclpy, rqt_gui_py, python_qt_binding


6. 测试

test/ 含参数客户端 widget 测试。


7. 小结

调参 不用改 launch YAML 重启 的 GUI 工具;Nav2、控制器 tuning 常用。

rqt_service_caller 源码详细分析

rqt_service_caller 源码详细分析

工作区路径:/home/cp/work2/ros2Learn/ros2_humble/src/ros-visualization/rqt_service_caller
版本:1.0.5

rqt_service_caller 提供 GUI 调用任意 ROS service:选服务名、填 request、显示 response。


1. 结构

1
2
3
4
5
rqt_service_caller/
├── plugin.xml # ServiceCaller → rqt_service_caller.service_caller.ServiceCaller
└── src/rqt_service_caller/
├── main.py
└── service_caller.py

2. 功能

  • 列出当前 graph 中 services
  • 根据类型生成 request 表单
  • 同步 call_async + spin 等待 response
  • 显示结果或错误

3. 插件

1
2
<class name="ServiceCaller" type="rqt_service_caller.service_caller.ServiceCaller"
base_class_type="rqt_gui_py::Plugin">

4. 依赖

rclpy, rosidl_runtime_py, rqt_gui_py


5. 小结

CLI ros2 service call 的 GUI 版,适合复杂嵌套字段编辑。

rqt_shell 源码详细分析

rqt_shell 源码详细分析

工作区路径:/home/cp/work2/ros2Learn/ros2_humble/src/ros-visualization/rqt_shell
版本:1.0.2

rqt_shell 在 rqt 窗口内嵌入 系统 shell(bash 等),便于在同一 GUI 中执行命令。


1. 结构

1
2
3
4
5
rqt_shell/
├── plugin.xml # Shell → rqt_shell.shell.Shell
└── src/rqt_shell/
├── main.py
└── shell.py

2. 实现要点

  • 使用 QProcess 启动用户默认 shell
  • 将 stdout/stderr 接到 QTextEdit
  • 键盘输入转发至 shell stdin
  • 不自动 source ROS(需用户自行 source setup.bash)

3. 插件

1
2
<class name="Shell" type="rqt_shell.shell.Shell"
base_class_type="qt_gui_py::Plugin">

菜单:Plugins → System Tool → Shell


4. 与 rqt_py_console 区别

插件 内容
rqt_shell 系统 bash/zsh
rqt_py_console 嵌入式 Python 解释器

5. 小结

轻量 终端模拟器 插件,依赖少,适合快速 ros2 topic list 等。