You're reading the documentation for a development version. For the latest released version, please have a look at Kilted.
Benchmarking
Benchmarks for the Zenbedded transport - Zenoh vs DDS (micro-ROS), Tier 1 vs Tier 2, and max control frequency across data sizes.
Default test setup: ESP32-S3, WiFi, Zenoh client mode, Best Effort QoS, ROS 2 Lyrical. All values TBD until measured.
Data sizes are expressed in float64 values, state to command at a 2:1 ratio. Tier 2 schemas carry exactly the fields they define.
Tier 1 vs micro-ROS (Zenoh vs DDS)
Same CDR messages (JointState, JointCommand), different wire protocol.
Metric |
micro-ROS (DDS) |
zenbedded Tier 1 (Zenoh) |
|---|---|---|
MCU to ROS 2 latency (ms) |
TBD |
TBD |
ROS 2 to MCU latency (ms) |
TBD |
TBD |
Round-trip latency (ms) |
TBD |
TBD |
Jitter p99-p50 (us) |
TBD |
TBD |
Max control frequency (Hz) |
TBD |
TBD |
Tier 1 vs Tier 2 (serialization)
Same user data, different wire cost. Tier 1 sends standard CDR messages;
Tier 2 sends #pragma pack(push, 1) flat structs for the same values.
Grid below matches the max frequency table.
State doubles |
Tier 1 payload (bytes) |
Tier 2 payload (bytes) |
Tier 1 serialize (ns/op) |
Tier 2 serialize (ns/op) |
|---|---|---|---|---|
4 |
TBD |
32 |
TBD |
TBD |
8 |
TBD |
64 |
TBD |
TBD |
16 |
TBD |
128 |
TBD |
TBD |
32 |
TBD |
256 |
TBD |
TBD |
64 |
TBD |
512 |
TBD |
TBD |
Both tiers carry the same Zenoh transport framing on top of the payload, so the framing cancels out of this comparison.
Max frequency vs data size
Publish at 50, 100, 200, 500, 1000 Hz for 10 s each. Max freq = highest rate with ≥ 99.9 % delivery. 1000+ samples per measurement, 100 warmup.
State doubles |
Command doubles |
Tier 1 max freq (Hz) |
Tier 2 max freq (Hz) |
|---|---|---|---|
4 |
2 |
TBD |
TBD |
8 |
4 |
TBD |
TBD |
16 |
8 |
TBD |
TBD |
32 |
16 |
TBD |
TBD |
64 |
32 |
TBD |
TBD |
Notes
Timestamps: k_uptime_get_32() on firmware (ms), rclpy.now() on host.
One-way latencies assume synced clocks (NTP/PTP); round-trip needs no sync.
ESP32-S3 is the primary target; native_sim results are supplementary.