|
VLink 2.0.0
A high-performance communication middleware
|
VLink Viewer 套件是一组基于 Qt 的图形界面工具,专为 VLink 中间件的数据可视化、回放与分析场景设计。 套件包含三个独立的可执行程序。
**相关文档**:命令行录制/回放工具参见 13-cli-tools.md;录制/回放 C++ API 参见 12-bag-recording.md;代理通信层参见 16-proxy.md。
| 程序名 | 功能定位 | 源码位置 |
|---|---|---|
| vlink-viewer | 实时通信监控与数据可视化 | viewer/main.cc |
| vlink-player | Bag 文件回放播放器 | viewer/player/player.cc |
| vlink-analyzer | 数据波形分析器 | viewer/analyzer/analyzer.cc |
三个程序均使用 Qt Fusion 风格,支持高 DPI 缩放,在 Linux / macOS / Windows 平台下运行。
| 依赖库 | 版本要求 | 用途 |
|---|---|---|
| Qt5 或 Qt6 | 5.12+ | 界面框架(Widgets、Sql、Network) |
| Qt6::OpenGLWidgets | Qt6 专用 | OpenGL 渲染(仅 Qt6 时需要) |
| protobuf | 3.4.0+ | 动态消息解析(Protobuf 编译器接口) |
| vlink::proxy_api | 同版本 | 代理通信层,用于订阅、控制中间件数据流 |
| Eigen3 | 3.x | 矩阵运算(相机投影等) |
| 依赖库 | CMake 选项 | 默认值 | 用途 |
|---|---|---|---|
| FFmpeg + swscale | ENABLE_VIEWER_FFMPEG | ON | 视频帧解码(H264/H265/MPEG4/YUV 等) |
| OpenSceneGraph | ENABLE_VIEWER_OSG | ON | 3D 点云渲染(OSG 渲染引擎) |
启用 FFmpeg 后,编译时自动加入 VLINK_ENABLE_VIEWER_FFMPEG 宏。 启用 OSG 后,编译时自动加入 VLINK_ENABLE_VIEWER_OSG 宏。
OSG 所需模块:osg、osgManipulator、osgViewer、osgGA、osgDB、osgUtil、osgText、OpenThreads。
可通过环境变量 OSG_DIR 指定 OSG 安装路径。
在 CMake 构建系统中,Viewer 套件通过子目录 viewer/ 独立管理:
ENABLE_VIEWER 依赖 ENABLE_PROXY(顶层 CMakeLists.txt 会在 ENABLE_VIEWER=ON 但 ENABLE_PROXY=OFF 时打印 warning 并关闭 Viewer)。Viewer 通过 vlink::proxy_api 接入中间件,没有 ProxyAPI 就无法编译。
viewer/CMakeLists.txt 自动查找 Qt5 或 Qt6(优先 Qt6),并构建三个子目标:
优先查找 FFmpeg::ffmpeg Config 模式,其次使用 viewer/cmake/ 下的 Module 模式查找。
三个程序均安装到 ${CMAKE_INSTALL_BINDIR}。
直接启动:
启动后首先弹出「连接设置」对话框(SettingsDialog),用户可配置工作模式和连接参数,然后进入主窗口。
直接启动:
或通过拖放 bag 文件到窗口、通过「选择」按钮打开。
也可由 vlink-viewer 菜单(Play - P)自动启动为子进程。
直接启动:
或由 vlink-viewer / vlink-player 自动启动为子进程。支持通过 IpcChannel 接收播放时间轴同步信号。
vlink-viewer 是 VLink 通信监控与实时数据可视化的图形化入口,通过 ProxyAPI(参见 16-proxy.md)接入本地或远端 vlink-proxy 进程, 实时展示所有活跃 URL 的通信状态与数据内容。
启动时弹出连接设置对话框,参数说明如下:
| 参数 | 说明 |
|---|---|
| 工作模式 | Controller(控制器,同一 domain id 只允许一个)或 Listener(监听器) |
| Domain ID | 通信域 ID,与中间件保持一致 |
| DDS 实现 | 选择 DDS 后端(如 FastDDS、CycloneDDS 等) |
| Security Key | 安全密钥,启用加密通信时使用 |
| Native Mode | 仅显示本机节点 |
| Reliable Mode | 使用可靠传输模式 |
| TCP Mode | 强制使用 TCP 传输 |
| Direct Mode | 直连模式 |
| Allow IP | 限制允许接入的 IP 地址 |
| Peer IP | 指定对端 IP |
| Buffer Size | 接收缓冲区大小(字节) |
| MTU Size | 最大传输单元大小 |
| Detect Upgrade | 自动检测新版本 |
| Match Version | 版本严格匹配 |
工作模式决定进程名称格式:
| 菜单项 | 快捷键 | 功能 |
|---|---|---|
| Local | D | 切换离线/本地模式(读取本地 SQLite DB) |
| Analyzer | K | 启动数据分析器子进程 |
| Topology | N | 拓扑视图(进程连接关系图) |
| Record | R | 打开录制对话框 |
| Play | P | 打开回放对话框(启动 vlink-player) |
| Edit | E | 数据编辑对话框(可修改字段值并发布) |
| Raw | J | 原始字节查看器 |
| Camera | S | 相机帧预览窗口 |
| Point3D | Z | 3D 点云可视化窗口 |
| Map | G | 地图视图(TODO) |
| Quit | Q | 退出程序 |
| Status Viewer | X | 切换状态栏显示 |
| Proto Viewer | Y | 切换 Protobuf 解析面板显示 |
| DB Browser | W | 打开数据库浏览器 |
| Protobuf Decoder | F | Protobuf 解码器工具 |
| Communication Matrix | M | 通信矩阵视图 |
| About Qt | T | Qt 版本信息 |
| About this | A | 关于 VLink Viewer |
| How to use | U | 使用说明 |
| Bug Report | B | 提交 Bug 报告 |
| Download | L | 下载更新 |
主窗口左侧为 URL 树状列表(QTreeWidget),展示所有通过 ProxyAPI 发现的 URL。
每个 URL 条目显示:
状态栏显示:总 URL 数、活跃数、选中数、总速率、丢包率。
选中某个 URL 后,右侧属性面板以树状结构展示 Protobuf 消息的字段和值。
支持的显示选项(通过复选框控制):
| 选项 | 说明 |
|---|---|
| Show Freq | 显示频率统计 |
| Show Rate | 显示速率统计 |
| Show Loss | 显示丢包率 |
| Show Latency | 显示延迟 |
| View | 展开显示消息字段详细内容 |
| Perf | 显示性能统计信息 |
| Array | 展开数组字段 |
| Hex | 以十六进制格式显示 bytes 字段 |
| Enum | 显示枚举类型名称 |
| Time | 将 timestamp 字段转为可读时间 |
支持 Protobuf 动态消息解析(DiskSourceTree + Importer + DynamicMessageFactory),可通过「Proto 目录选择」和「重载」按钮加载 .proto 文件。
对于 VLink 零拷贝类型(CameraFrame、PointCloud、RawData),主窗口通过 update_zero_copy_item_property 解析并展示其 header 字段(frame_id、seq、time_meas、time_pub 等)。
按下快捷键 S 或从菜单打开 Camera 窗口(CameraDialog):
**支持的图像格式**(通过 FFmpegDecoder):
| 类型 | InType 枚举 |
|---|---|
| JPEG | kJPG |
| H.264 | kH264 |
| H.265 | kH265 |
| MPEG4 | kMPEG4 |
| YUV 4:2:0 | kYUV420 |
| YUV 4:2:2 | kYUV422 |
| YUV 4:4:4 | kYUV444 |
| NV12 | kNV12 |
| YUYV | kYUYV |
| YVYU | kYVYU |
| UYVY | kUYVY |
| BGR888 | kBGR888 |
| RGB888 | kRGB888 |
功能特性:
按下快捷键 Z 或从菜单打开 Point3D 窗口(Point3DDialog):
OsgWidget 内部使用 osgViewer::Viewer + QOpenGLWidget,定时器驱动帧渲染,支持鼠标旋转/缩放/平移交互。
主窗口展示所有关联进程的状态,通过 process_map_ 维护进程列表,由 update_process_widget() 定期刷新。
按下快捷键 D 可切换到离线模式,直接从本地 SQLite 数据库(<tt>.vdb / .vdbx 文件)读取数据, 使用 QSqlDatabase(local_database_)加载,不依赖实时中间件。
vlink-player 是 VLink bag 文件的图形化回放工具,基于 vlink::BagReader 实现。 支持文件拖放打开、回放速率控制、进度条跳转、URL 过滤和 URL 重映射。
主界面工具栏按钮:
| 按钮 | 功能 |
|---|---|
| Select(选择) | 打开文件选择对话框,选择 bag 文件 |
| Close(关闭) | 关闭当前 bag 文件 |
| Point(锚点) | 打开 PointDialog(设置 URL 过滤和 URL 重映射) |
| Info(信息) | 打开 InfoDialog,查看 bag 文件元信息 |
| Viewer(查看器) | 启动 vlink-viewer 子进程 |
| Cmd(命令行) | 打开命令行工具 |
| Analyzer(分析器) | 启动 vlink-analyzer 子进程(并传递当前文件路径) |
| Play(播放) | 开始/恢复回放 |
| Pause(暂停) | 暂停回放 |
| Time(时间模式) | 切换时间戳显示模式(相对/本地/UTC) |
| Remap(重映射) | 切换 URL 重映射开关 |
| Skip(跳过空白) | 切换跳过空白区间模式 |
| Proxy(代理) | 切换是否启用 proxy 进程辅助回放 |
**进度条(HorizontalSlider)**:
**速率调节(DoubleSpinBox)**:
**其他选项**:
| 复选框 | 功能 |
|---|---|
| Loop(循环) | 循环回放 |
| Native(原生) | 原生传输模式 |
| Black(深色) | 背景色切换 |
| 模式 | 枚举值 | 说明 |
|---|---|---|
| 相对时间 | kTimeRel | 显示从起点开始的相对时间 |
| 本地时间 | kTimeLocal | 系统本地时区时间 |
| UTC 时间 | kTimeUtc | UTC 时区时间 |
实现 dragEnterEvent / dropEvent,支持将 bag 文件(.vdb、.vdbx 等)直接拖入窗口打开。
PlayerWindow 持有三个 QProcess 成员:
| 成员 | 对应进程 |
|---|---|
| proxy_process_ | vlink-proxy |
| viewer_process_ | vlink-viewer |
| analyzer_process_ | vlink-analyzer |
启动 analyzer 时会通过标准输入管道传递时间戳(IpcChannel 机制),实现 player 与 analyzer 之间的时间轴联动。
回放过程中通过 status_ 原子变量跟踪回放状态,has_played_、has_error_、quit_flag_ 等原子标志用于线程安全控制。
vlink-analyzer 是基于 QCustomPlot 的波形数据分析工具,可从 bag 文件中读取任意 Protobuf 字段的历史数据, 绘制时间序列折线图,支持统计分析与数据导出。
| 模式类型 | 枚举值 | 说明 |
|---|---|---|
| 频率类型 | kFrequencyType | 分析消息发布频率随时间的变化 |
| 数值类型 | kValueType | 分析 Protobuf 字段的数值随时间的变化 |
| 自定义类型 | kCustomType | 用户自定义表达式(exprtk 支持) |
**工具栏按钮**:
| 按钮 | 功能 |
|---|---|
| Path(路径) | 选择 bag 文件路径 |
| Config(配置) | 加载分析配置文件(JSON 格式) |
| Proto(原型) | 选择 Protobuf .proto 文件目录 |
| Gen(生成) | 开始解析 bag 文件并绘制图表 |
| Interrupt(中断) | 中断当前解析任务 |
| Export(导出) | 导出图表数据(CSV 等格式) |
| Close(关闭) | 关闭当前配置/文件 |
**图表显示选项**:
| 复选框 | 功能 |
|---|---|
| Time(时间轴) | 以时间格式(QCPAxisTicker)显示 X 轴 |
| Legend(图例) | 显示/隐藏图例 |
| Grid(网格) | 显示/隐藏网格线 |
| Point(数据点) | 显示/隐藏数据点标记 |
| Timeline(时间线) | 显示/隐藏时间线游标 |
| Tracking(跟踪) | 开启时间轴跟踪(随播放器时间轴移动) |
**下拉选框**:
| 控件 | 功能 |
|---|---|
| Zoom(缩放) | 选择 X 轴缩放范围 |
| Line(线型) | 选择折线样式 |
| Count(数量) | 控制显示的图表数量上限 |
每个图表单元(PlotUnit)对应一条折线,包含以下字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| index | int | 图表索引 |
| label | string | 图例标签 |
| url | string | 数据来源 URL |
| url_filter | string | URL 过滤条件 |
| expressions | vector<string> | 字段表达式列表 |
| color | QColor | 折线颜色 |
| ext_operation_pro | bool | 是否启用扩展运算 |
| ext_sample_interval | int | 采样间隔 |
| ext_zero_start_x | bool | X 轴从零开始 |
| ext_zero_start_y | bool | Y 轴从零开始 |
| ext_limit_max/min_x/y | double | 轴范围限制 |
| ext_operation_x/y | string | X/Y 轴自定义运算表达式 |
| x_values / y_values | QVector<double> | 数据点序列 |
| condition_lists | vector<vector<string>> | 条件过滤规则列表 |
| graph | QCPGraph* | QCustomPlot 图形对象 |
| root_msg | protobuf::Message* | 关联的 Protobuf 消息实例 |
timeline_ 是 QCPItemLine 类型的垂直线,表示当前时间位置。
当 enable_timeline_ 为 true 且与 vlink-player 联动时,IpcChannel 接收到时间戳后自动移动游标。
| 按键 | 功能 |
|---|---|
| Space | 暂停/恢复(与 player 联动) |
| Esc | 中断解析任务 |
| 方向键 | 调整 X/Y 轴范围 |
点击「Export」按钮,将当前所有 PlotUnit 中的 x_values 和 y_values 数据导出为文件(支持 CSV 等格式)。
AnalyzerWindow 通过以下成员支持动态 Protobuf 解析:
支持自定义表达式(exprtk_parser.h,exprtk 库),可对字段值做数学运算后再绘图。
IpcChannel 是 vlink-player 和 vlink-analyzer 之间的进程间通信桥梁,基于标准输入(stdin)管道传递时间戳。
当 vlink-player 启动 vlink-analyzer 子进程时,analyzer 进程的 stdin 已与 player 进程的某个管道相连。 analyzer 通过 IpcChannel 异步监听 stdin,接收到时间戳后触发信号,驱动分析器的时间轴游标同步移动。
| 平台 | 实现方式 |
|---|---|
| Linux / macOS | QSocketNotifier 监听 stdin 文件描述符,事件驱动 |
| Windows | 独立线程(thread_)读取 hstdin_dup_,hstop_event_ 用于优雅退出 |
FFmpegDecoder 继承自 vlink::MessageLoop,在独立消息循环中异步解码视频帧。
| 字段 | 类型 | 说明 |
|---|---|---|
| in_type | InType | 输入格式(H264/H265/YUV 等) |
| out_type | OutType | 输出格式(BGR888 / RGB888) |
| width / height | int | 图像尺寸(0 表示自动检测) |
| scale | double | 输出缩放比例(默认 1.0) |
| cache_frame | bool | 是否缓存最后一帧(用于暂停显示) |
| use_hard_codec | bool | 启用硬件解码 |
| max_elapsed_time | int | 单帧最大解码时间(ms,默认 100) |
| max_codec_time | int | 编解码超时限制(ms,0=不限) |
OsgWidget 继承自 QOpenGLWidget,封装 osgViewer::Viewer 与 Qt 的 OpenGL 集成。
特性:
仅在编译时定义 VLINK_ENABLE_VIEWER_OSG 时生效(条件编译保护)。
支持: