C++ · 多后端 · 轻量级 · 跨平台 · Apache 2.0

一套 API
10 种传输后端,
按部署选择

VLink 用 Publisher / Subscriber、Client / Server、Setter / Getter 六类节点覆盖 Event、Method、Field 三种通信模型。业务处理代码可在后端间复用;地址、依赖、QoS 与运行时配置仍须满足所选后端的约束。

10 传输后端
14 序列化格式
6 节点类型
10 CLI 工具
5 支持平台
多平台支持
Linux macOS Windows QNX Android x86_64 · ARM64
VLink core radiates to 10 transports including intra, shm, dds, zenoh, and someip
VLink 是什么

面向多种部署环境的 C++ 通信框架

VLink 将通信节点 API、编译期序列化选择、录制回放、CLI 与可视化工具放在同一源码树中;实际可用能力取决于构建选项、平台和所启用的后端。

全栈工具链

Viewer · Player · Analyzer 桌面 GUI · CLI 十件套 · Foxglove / Rerun Web 桥 · Bag 录制回放 —— 开发、调试、回归一站式。

ROS2: rqt + 外装 bridgeVLink: 原生集成

按路径选择数据传递方式

序列化类型在编译期选择;Bytes 提供小缓冲与多种所有权语义,事件循环可选无锁队列。进程内直接路径和共享内存 loan 路径可减少拷贝,实际延迟与吞吐须在目标平台按消息大小和 QoS 实测。

普通发布路径可能包含复制或序列化显式选择适合的数据路径

序列化自动推导

Protobuf / FlatBuffers / CDR / POD / 自定义 —— 编译期根据类型签名自动选择,不用手写编解码。

Msg/IDL/CDR 分裂14 种统一

多平台支持

源码包含 Linux · macOS · Windows · QNX · Android 的平台适配,并支持 x86_64 与 ARM64;具体后端与工具是否可用由平台依赖和构建配置决定。

平台支持不等于所有可选模块均可用按构建文档核对依赖
10
传输后端
14
序列化格式
10
CLI 工具
4
GUI / Web 可视化
统一 API

一套节点 API · 10 种传输后端

URL scheme 用于选择传输后端。话题式后端通常可复用 path;SOME/IP 等专用后端则要求完整的合法 URL、依赖和运行时配置。

传输后端

10 种传输后端 · 统一节点 API

Stable
intra
进程内消息队列
同进程模块间通信;直接与共享指针路径可避免载荷复制
Conditional Zero-CopyNo-Deps
Stable
shm
Iceoryx RouDi
同机跨进程;显式 loan 路径可避免额外载荷复制
Conditional Zero-CopyReal-Time
Stable
dds
eProsima Fast-DDS
跨机器主力 RTPS 实现,QoS 完整
QoSDiscovery
Stable
ddsc
Eclipse CycloneDDS
开源 DDS,ROS2 同生态
QoSROS2
Beta
shm2
Iceoryx2
下一代共享内存,无需 RouDi 守护
Conditional Zero-CopyDaemon-less
Beta
ddsr
RTI Connext DDS
RTI Connext 商用 DDS 传输后端
Commercial
Beta
zenoh
Eclipse Zenoh
云-边-端统一数据,pub/sub + query
Cloud-Edge
Beta
someip
SOME/IP · vsomeip
AUTOSAR 车载以太网标准
AUTOSARSOA
Beta
fdbus
FDBus
Android/Linux 轻量级 D-Bus 替代
IPC
Beta
mqtt
Paho MQTT
物联网 · 带宽受限
IoTPub/Sub

intradds(CDR) 不支持消息级加密 · someip 需 vsomeip 配置 · 详见 开发者文档

快速上手

示例代码

几行代码完成端到端 Pub / Sub。

C++ Publisher

发布者 · 每 500 ms 发一条 IMU

构造 Protobuf 消息后通过 pub.publish() 送入 dds://sensor/imu。业务代码只关心数据本身,传输层由 URL 决定。

publisher.cc
// Run alongside subscriber.cc — wait until the DDS endpoints match. #include <vlink/vlink.h> #include "proto/sensor.pb.h" int main() { vlink::Publisher<pb::Sensor::Imu> pub("dds://sensor/imu"); pub.wait_for_subscribers(); for (int seq = 0; ; ++seq) { pb::Sensor::Imu msg; msg.set_sequence(seq); msg.set_acc_x(0.01 * seq); pub.publish(msg); MLOG_I("[Publisher] published seq=#{}", seq); std::this_thread::sleep_for(std::chrono::milliseconds(500)); } }
C++ Subscriber

订阅者 · 回调里直接拿到消息

注册 sub.listen(...) 回调即可;回调执行上下文由所选后端及其运行模式决定,示例主线程只负责保持进程存活。

subscriber.cc
// Run alongside publisher.cc — receives samples after matching/QoS delivery. #include <vlink/vlink.h> #include "proto/sensor.pb.h" int main() { vlink::Subscriber<pb::Sensor::Imu> sub("dds://sensor/imu"); sub.listen([](const pb::Sensor::Imu& m) { MLOG_I("[Subscriber] seq=#{} ax={}", m.sequence(), m.acc_x()); }); ... }
实时运行

运行日志动画 · 展示匹配后的收发

同时启动 publishersubscriber,等待 DDS 完成匹配后开始收发。以下动画仅说明日志顺序,不代表固定延迟或吞吐。

$ ./publisher & ./subscriber — live run
三种模型

三种通信模型 · 一致的心智模型

Event / Method / Field 分别表达异步事件、请求响应与状态字段,并使用一致的节点生命周期与错误处理能力。

Event · Pub/Sub

事件模型

多对多异步分发。传感器数据、状态广播、日志流的首选。

// Publisher
vlink::Publisher<Imu> pub("dds://sensor/imu");
pub.publish(imu);

// Subscriber
vlink::Subscriber<Imu> sub("dds://sensor/imu");
sub.listen([](const Imu& m){ ... });
Method · Client/Server

方法模型

N:1 请求/响应。同步 / optional / 异步回调 / future 四种调用模式。

// Server
vlink::Server<Req, Resp> srv("dds://math/add");
srv.listen([](const Req& q, Resp& r){
  r.set_sum(q.left() + q.right());
});

// Client
vlink::Client<Req, Resp> cli("dds://math/add");

// sync by-ref
Resp r;
cli.invoke(req, r, 1s);

// sync optional
auto maybe = cli.invoke(req, 1s);

// async callback
cli.invoke(req, [](const Resp& r){ ... });

// future
auto f = cli.async_invoke(req);
Field · Setter/Getter

字段模型

状态值的 set / get / listen 模型。晚加入 Getter 能否取得历史最新值取决于后端及其历史、持久性 QoS。

// Setter
vlink::Setter<Gear> setter("shm://vehicle/gear");
setter.set({1, true});

// shm Field defaults to history depth 1; wait for delivery
vlink::Getter<Gear> getter("shm://vehicle/gear");
getter.wait_for_value(std::chrono::seconds(1));
auto g = getter.get();

// Callback on every set()
getter.listen([](const Gear& v){ on_gear(v); });

// Only fire on value change
getter.set_change_reporting(true);
命令行工具

多个 CLI 工具窗口

完整工具链覆盖 info、list、monitor、eproto、efbs、parse、check、bag、bench、trigger;以下窗口按 cli/*.cc 的真实接口排布,重点平铺 monitor、list、check、bag,便于同时对照实时观测、拓扑发现、环境诊断与录制回放。

完整 CLI 工具体系包含 vlink-info、vlink-list、vlink-monitor、vlink-eproto、vlink-efbs、vlink-parse、vlink-check、vlink-bag、vlink-bench、vlink-trigger;当前网页重点演示 vlink-monitor -loc、vlink-list、vlink-check diag / env,以及 vlink-bag info / record / play / clone。monitor 在 TUI 内按 Enter 会直接切入对应解析界面。

vlink-info vlink-list vlink-monitor vlink-eproto vlink-efbs vlink-parse vlink-check vlink-bag vlink-bench vlink-trigger
实时 TUI

vlink-monitor

基于终端的交互式实时监控面板,持续显示频率、速率、丢包率、时延;选中 URL 后按 Enter,会直接切入对应消息解析界面,网页示例按 monitor -loc 的真实交互节奏模拟。

vlink-monitor · 实时 TUI 监控
source: cli/monitor/monitor.cc
拓扑发现

vlink-list

通过 DiscoveryViewer 扫描当前网络中的活跃 VLink 进程与 URL,按进程展开 Publisher、Subscriber、Server、Client、Setter、Getter,适合快速确认节点是否上线、URL 是否一致。

vlink-list · 节点与话题发现
source: cli/list/list.cc
环境诊断

vlink-check

覆盖 IP、组播地址、磁盘空间、CPU、内存以及关联进程运行状态;网页展示 diag 与 env 的代表性节选,实际项目会随构建选项增加检查项和环境变量。

vlink-check · 环境诊断
source: cli/check/check.cc
录制 / 回放

vlink-bag

网页仅演示 info、record、play、clone 四个子命令;示例严格保留必填 path 约束,其中 clone 使用 source_path 与 target_path。

vlink-bag · 录制与回放工作流
source: cli/bag/bag.cc
可视化

可视化四件套

桌面 GUI 与 Web 桥接工具,覆盖本地调试、录制分析与远程观测。

Desktop · Qt6 + OpenSceneGraph

vlink-viewer

Qt6 桌面端的 VLink 实时监控与可视化工作台。

  • URL 话题树并列显示 Freq / Rate / Loss / Latency 四列实时指标
  • TrafficWidget 波形,以及进程列表与通信拓扑图
  • Protobuf / FlatBuffers 消息递归展开到字段级,.proto 目录热加载
  • OSG 3D 点云叠加车体模型,相机多路并排,JPEG / H.264 / H.265 / NV12 软硬解
  • 脱离中间件也能打开 .vdb SQLite 库离线浏览
vlink-viewer UI: topic tree, traffic charts, proto viewer
Web Bridge · Foxglove / Rerun

vlink-webviz

常驻 C++ 桥接进程,把 VLink 数据送进 Foxglove Studio 与 Rerun Viewer。

  • vlink-foxglove:WebSocket :8765,遵循 Foxglove WS 协议 v1
  • vlink-rerun:gRPC :9876,支持 spawn / connect / serve / save 四种运行模式
  • 7 组零拷贝容器内置自动映射(CameraFrame / PointCloud / OccupancyGrid / Tensor / ObjectArray / AudioFrame / RawData),另附 vlink_msgs 示例映射文件
  • --foxglove_msgs--rpc_msgs--parameters_url 等对应配置后,可启用 clientPublishService CallParameters
  • 内置 ExprTk 做字段重映射与单位换算,支持话题白 / 黑名单过滤
vlink-webviz bridging to Foxglove studio in browser
Replay · .vdb / .vcap

vlink-player

Bag 帧级回放窗口,也能把录像反向放回 VLink 网络。

  • .vdb / .vdbx(SQLite,可选 LZAV)与 .vcap / .vcapx(MCAP,可选 Zstd)双后端
  • 回放速率最高 100×;设置为 0 时播放会归一为 1×。支持单步、循环、拖动 seek、URL 白名单与 UrlRemap
  • Proxy 模式拉起 vlink-proxy,把 bag 作为 live 源重新发布
  • IPC 通道把当前时间戳推给 Analyzer,用于波形游标联动
  • 完整性检查与修复由 vlink-bag check/fix 命令提供
vlink-player floating window with progress bar
Time-Series · ExprTk

vlink-analyzer

QCustomPlot 波形分析工作台,ExprTk 表达式引擎驱动。

  • 三种分析模式:发布频率、字段数值、用户自定义表达式
  • ExprTk 引擎:四则、三角、sqrt / log / exp / abs + 用户变量代入
  • 7 种线型 + 10 种数字格式(Auto / Float 2,4,6,8 / Scientific 2,4,6,8 / Integer)
  • 双模式:离线 bag 批跑,或与 Player 通过 IPC 同步时间游标
  • 动态 Protobuf 解析、JSON 预设切换、Progress 可中断、PNG 一键导出
vlink-analyzer time-series curves and config panel
基础库

基础设施 · 可独立使用的一整套组件

VLink 的 base 库不仅服务于通信节点 —— 日志、事件循环、定时器、线程池、任务图、对象池、字节缓冲、插件加载 …… 这些组件可单独引入,作为任何 C++ 实时工程的底座。

Logger

支持流式、格式化、printf 风格与 RAII 调用。内置日志实现由构建选项选择;自定义实现可通过 LoggerPluginInterface 在运行时加载。

MessageLoop

单线程事件循环,支持普通或无锁任务队列,可挂载 Timer 与回调。循环内任务串行执行;跨线程共享状态仍需按调用场景同步。

MultiLoop

多线程事件循环:多个 worker 共享同一任务队列,保留 post_task / exec_task 接口,从单线程无缝升级到并发。

Timer

单次 / 周期定时器,需附着到 MessageLoop 执行;与 DeadlineTimer 搭配可做超时控制。

WheelTimer

哈希时间轮:O(1) 插入 / 删除,适合成千上万并发超时(会话管理、心跳、连接池保活)。

ElapsedTimer

高精度秒表:可选 wall clock / CPU-active 时钟源,给 profiling 与任务延迟统计使用。

ThreadPool

固定 worker 数的线程池,可选普通或无锁任务队列,并提供 post / invoke、future 与任务句柄接口。

GraphTask

DAG 任务图:precede / succeed 声明依赖,支持条件分支、环检测、DOT 导出。

Schedule

RAII 任务调度包装:支持 delay_ms / priority / 启动超时 / 执行超时,并用 on_then / on_else / on_catch 流式链接结果回调。

Bytes

通信消息统一载体:固定 128 B 对象 + 96 B 栈内小缓冲优化,五种所有权语义,内置 LZAV 压缩与 PMR 池化分配。

MpmcQueue

多生产者 / 多消费者无锁队列;MessageLoop 与 ThreadPool 选择 kLockfreeType 时使用,普通队列仍是可选实现。

Plugin

运行时多态插件 —— 抽象 C++ 接口由共享库实现,dlopen / LoadLibrary 加载时做 ABI 与主/次版本校验。

ObjectPool

线程安全对象池:预分配 + 自由列表 + 可配置 reset 策略;RAII 自动归还,减少热路径分配抖动。

CpuProfiler

按 CPU active time 与 wall time 的比值统计当前进程 CPU 使用率;CpuProfilerGuard 用于作用域内启停统计。

Process

跨平台进程管理 + 信号处理 + 优雅退出钩子,供 CLI 工具与守护进程使用。

配套工具链

通信核心之外 · 工具与扩展组件

通信核心、可视化、录制回放、CLI、Proxy 监控与插件系统均在源码树中;可用组件取决于构建选项和第三方依赖。

通信核心

Event / Method / Field 三模型 + 10 种传输矩阵 + 14 种序列化。

可视化套件

Viewer 桌面 GUI · Player 回放 · Analyzer 波形 · Foxglove / Rerun Web 桥。

录制回放

.vdb / .vdbx (SQLite + LZAV) 与 .vcap / .vcapx (MCAP + Zstd, Foxglove 兼容),按时间 / 大小分片。

安全加密

消息级 AES-128-GCM,SecurityPublisher<T> 一行启用,支持自定义回调。

命令行工具

monitor · bag · list · check · info · parse · eproto · efbs · bench · trigger —— 10 件套开箱即用。

Proxy 监控层

独立 ProxyServer 守护进程 + ProxyAPI 客户端,Controller / Listener 双角色,跨网段观测流量、注入数据、重放回放。

插件系统

dlopen / LoadLibrary 动态加载,模板化 Plugin::load<T>() 实现运行时多态。兼容规则要求 major 相等,且插件 minor 不低于宿主所需 minor。VLINK_URL_PLUGINS 的完整值为 auto 时按需加载,为 none 或空值时关闭,其他非空值为显式预加载列表;模式值大小写不敏感。

应用场景

四类典型使用场景 · 同一套 API 贯通

从自动驾驶和机器人中的相机 / 点云大带宽链路,到局域网分布式通信、车载以太网集成,以及跨网段监控与 Web 可视化,VLink 都通过统一节点 API 配合不同 URL 后端完成部署切换。

自动驾驶

多传感器感知链路

文档将自动驾驶列为目标场景之一。图像与点云等同机大消息可使用 shm:// 的显式 loan 路径减少复制;跨机器分发可选择 dds:// / ddsc://,同时核对 URL、QoS 与部署配置。

Autonomous driving multi-sensor data pipelines
机器人 / 具身

控制与感知混合链路

机器人与具身系统通常同时包含低时延控制链路和大带宽感知链路。控制环可优先使用 intra://,相机帧与点云等同机跨进程数据则使用 shm://,统一 API 下可组合部署。

Robotics control and perception data flows
车载集成

车载以太网与 AUTOSAR 兼容

文档明确给出 someip:// 作为面向车载以太网与 AUTOSAR 场景的 Beta 后端,并提供 someip_flat 示例。开发阶段可先用 dds:// / intra:// 联调,再按 URL 切换到目标部署形态。

Automotive Ethernet and SOME/IP integration
跨网段 / Web

远程监控与云边接入

跨网段或浏览器可视化场景可使用 zenoh://、Proxy 或 WebViz。Zenoh 跨网段需要可达的 router / peer 端点;NAT 穿透须由网络或外部基础设施另行解决。

Cross-network monitoring and Web visualization
VLink vs ROS2

VLink 与 ROS2 · 定位与能力边界

ROS2 是包含节点、构建、包管理和机器人生态的完整框架;VLink 聚焦通信节点 API,并在同一源码树提供录制、CLI 与可视化工具。选择应以目标生态、平台和后端验证结果为准。

能力维度
ROS2
API 模型
Node、Executor、Context、CallbackGroup 等对象共同描述执行与回调模型
范围与依赖
完整机器人框架与包生态,组件和依赖按发行版及所选功能组合
多语言支持
rclcpp / rclpy 为官方主线;rclnodejs / rcljava 等语言客户端由社区维护,版本滞后
架构与扩展
rclcpp + rmw 分层,但扩展依赖 pluginlib 与 ament 包管理
性能验证
结果受 RMW、QoS、消息大小、拓扑与硬件影响,应在目标配置上测量
传输与零拷贝
传输和 loan 能力由所选 RMW、消息类型及配置决定
序列化
rosidl (ROS Msg IDL) 为主;Type Adaptation 允许回调用 Eigen 等自定义类型
调试与观测
rqt · rosbag2 · Foxglove Bridge / Rerun 为独立社区包
安全机制
可使用 SROS2 / DDS Security;部署模型与证书配置取决于所选中间件
构建与工程
colcon + ament + rosdep + DDS vendor 包;工具链与 Python 深度绑定
跨平台
支持范围随 ROS2 发行版、RMW 与第三方包而变化,需查对应发行版文档

※ 本表只说明项目定位与接口边界,不构成通用性能结论;请对目标版本、平台、消息类型、QoS 与依赖组合进行验证。

供应链与合规

VLink 框架以 Apache 2.0 发布,并可按构建配置选择不同传输后端。每个后端及其第三方依赖都有独立的许可证、支持范围与运行时要求,合规性和供应链风险应针对实际交付组合分别评估。

社区

加入我们

Apache 2.0 开源 · 与开发者一起,让自动驾驶与具身智能的通信栈更轻、更快、更现代。