Project · 03 / 04
轻量通信层与多 topic 调度优化
在 Cyclone DDS 上自研轻量发布订阅封装,把关键链路的同机尾延迟从约 3ms 降到 24–29µs。
- 时间
- 2026.07
- 单位
- 重庆机器人企业 · 算法实习
- 阶段
- 工程原型 · 同机与跨机验证
- 我的角色
- 负责 Cyclone DDS 之上的通信封装、调度优化、性能诊断与跨平台部署
3ms→24–29µs多 topic 下关键链路的同机尾延迟测试条件同机 x86;1 个 1kHz 关键 topic 加 1–31 个 300Hz 背景 topic;关键 topic 独占线程、背景共享,对照全共享执行器;6 轮 p99 中位数
146 / 167µs跨机 RTT 中位数:封装执行器 / ROS2测试条件x86 与 arm64 千兆网络、GamepadState、RELIABLE、同步单在途,5 轮中位数;ROS2 的抖动更低(5.8µs 对 9.3µs)
A
结构一览
- .msg 定义统一生成 IDL 与 C++ 类型适配
- 发布订阅封装兼容 ROS2,不依赖其运行栈
- 订阅调度关键 topic 独占 · 背景共享
- Cyclone DDSRELIABLE
- 同机 / 跨机x86 ↔ arm64 · ROS2 互通
单向与往返结果不自洽 → 发现测量口径错误;跨机改用同端时钟测 RTT
B
我做了什么
- 中间件封装:在 Cyclone DDS 上自研发布订阅与消息适配接口,用 .msg 统一生成 IDL 和 C++ 类型适配;订阅调度支持共享与独占线程,兼容 ROS2 通信而不依赖其运行栈。
- 调度优化:定位多 topic 时的尾延迟来自共享执行器排队,把关键 topic 改为独占线程、背景 topic 保持共享,不必给每个 topic 都开线程。
- 性能诊断:从单向与往返结果不自洽发现测量口径错误,修正测法后重测;跨机用同端时钟测 RTT,避免两机对时误差。
- 跨平台部署:在 x86 无 ROS 容器中编译运行,在 arm64 屏蔽 ROS 目录后验证收发,实现双架构互通并明确最小依赖。
C
结果
同机多 topic 测试中,全共享执行器一旦出现背景 topic,关键链路 p99 就从约 27µs 升到约 3ms;关键 topic 独占、背景共享后,1 到 32 个 topic 全程稳定在 24–29µs,与每个 topic 都独占线程几乎相同。
跨机千兆网络下,封装执行器的 RTT 中位数约 146µs,ROS2 执行器约 167µs;ROS2 的抖动更低。
同机回环中,绑核后产品执行路径的 RTT p99 为 4.665µs。测量审计时,旧测法约 116µs 与对照探针约 8.7µs 相差约 13 倍,这是测法修正暴露的差异,不是性能提升。
D
测量数据
- 封装 · 全共享
- 封装 · 关键独占 / 背景共享
- 封装 · 全独占
- ROS2 · 全共享
同机 x86、performance governor;1 个 1kHz 关键 topic,其余为 300Hz 背景 topic。每个点是 6 轮 p99 的中位数,不是逐消息分布。
- p50
- p99
x86 ↔ arm64 千兆网络,GamepadState、RELIABLE,5 轮中位数;全程 RTT,没有除以 2 当作单向延迟。
!
已知局限
- 约 3ms 主要来自早期共享执行器的串行轮询实现;ROS2 的单线程执行器用合并等待集,并没有这种退化。
- 同机回环、跨机 RTT 和单向延迟是不同的量,分开报告,不合成一组通用指标。
- 当时 SCHED_FIFO 受权限限制未实测,不具备已验收的硬实时保证。
- 目前是工程原型与技术验证,尚未在整机生产场景中长期使用。