RuView CSI Capture Capabilities: ESP32-S3 vs Intel 5300 vs Atheros AR9580
RuView unifies Channel State Information (CSI) capture from ESP32-S3, Intel 5300, and Atheros AR9580 hardware into a canonical 56-subcarrier representation, enabling seamless switching between ultra-low-power embedded nodes and high-throughput desktop NICs for Wi-Fi sensing applications.
The RuView open-source framework abstracts diverse Wi-Fi radio front-ends to provide a single coordinate system for pose estimation and vital-sign monitoring. This article compares the specific CSI capture capabilities of three supported platforms—the ESP32-S3 microcontroller, the legacy Intel 5300 NIC, and the Atheros AR9580 chipset—based on the Rust implementation in the ruvnet/RuView repository.
Hardware Platform Overview
ESP32-S3 (Codename Intel S3OO)
The ESP32-S3 is an ultra-low-power embedded platform referred to in the RuView codebase as "Intel S3OO" within hardware type enumerations. It streams binary CSI frames via UDP and is optimized for battery-operated distributed mesh deployments. Despite the legacy codename in hardware_norm.rs, this platform represents the Espressif ESP32-S3 SoC, distinct from actual Intel wireless hardware.
Atheros AR9580 (Codename AR9S8O)
The Atheros AR9580 represents the desktop-class NIC family referenced as "AR9S8O" in source files. It supports multiple spatial streams and higher sampling rates through the ath9k driver, making it suitable for fixed-location research rigs requiring high-resolution Doppler analysis.
Intel 5300
The Intel WiFi Link 5300 is a legacy PCIe NIC supported by RuView's hardware abstraction layer. While sharing the host-based processing model with Atheros cards, it typically operates with 30 subcarriers and 3×3 MIMO capability, positioning it as a middle ground between the embedded ESP32 and modern Atheros chipsets.
CSI Capture Specifications Comparison
The RuView source code explicitly defines these capabilities in rust-port/wifi-densepose-rs/crates/wifi-densepose-signal/src/hardware_norm.rs and rust-port/wifi-densepose-rs/crates/wifi-densepose-mat/src/integration/hardware_adapter.rs.
| Capability | ESP32-S3 | Intel 5300 | Atheros AR9580 |
|---|---|---|---|
| Sub-carrier count | 64 sub-carriers (LWIP CSI) via HardwareType::Esp32S3::subcarrier_count() |
30 sub-carriers (typical for Intel 5300 CSI tool) | 56 sub-carriers for ath9k via HardwareAdapter::atheros() |
| MIMO streams | 1×1 SISO via HardwareType::Esp32S3::mimo_streams() returning 1 |
3×3 MIMO (3 antennas) | Up to 3×3 MIMO via HardwareType::Atheros::mimo_streams() returning 3 |
| Sampling rate | Fixed 100 Hz (10 ms frames) set in esp32_parser.rs |
1,000 Hz (limited by driver/tool) | 250 Hz (20 MHz) to 500 Hz (40 MHz) |
| CSI format | Binary frame (20-byte header + payload) over UDP | Text-based CSV or custom binary | Text CSV or debugfs binary via csi_receiver.rs |
| Latency budget | < 5 ms inference on ESP32-S3 WASM3 (see sig_flash_attention.rs) |
Host-dependent (sub-millisecond to driver) | Host-dependent, sub-millisecond hand-off |
RuView Implementation and Normalization
RuView abstracts these differences through the HardwareNormalizer struct. Regardless of whether the source provides 64 subcarriers (ESP32-S3), 30 (Intel 5300), or 56–234 (Atheros), the system resamples to a canonical 56-subcarrier grid.
The detection logic resides in rust-port/wifi-densepose-rs/crates/wifi-densepose-signal/src/hardware_norm.rs, where HardwareType::Esp32S3::subcarrier_count() returns 64 and HardwareType::Atheros::mimo_streams() returns 3. The sensing-server/src/main.rs entry point accepts UDP streams from ESP32-S3 nodes while processing Atheros and Intel NIC inputs through the csi_receiver.rs adapter.
Configuration Examples
Configuring ESP32-S3 Sensor Nodes
use wifi_densepose_mat::integration::DeviceConfig;
/// Build a configuration for an ESP32-S3 node that streams binary CSI over UDP.
let cfg = DeviceConfig::esp32()
.with_udp_target("192.168.1.100:5005") // RuView server address
.with_sampling_rate(100); // 100 Hz (default)
The DeviceConfig::esp32() helper selects DeviceType::Esp32 and sets the default 64-subcarrier, 1-stream profile.
Configuring Atheros and Intel NICs
use wifi_densepose_mat::integration::DeviceConfig;
/// Choose the driver variant that matches your hardware.
let cfg = DeviceConfig::atheros("wlan0", AtherosDriver::Ath10k)
.with_channel(36)
.with_bandwidth(Bandwidth::HT40) // 40 MHz → 114 sub-carriers
.with_sampling_rate(500);
For Intel 5300 cards, RuView utilizes a similar host-based configuration path through the generic adapter interface, typically defaulting to 30 subcarriers and 3×3 MIMO streams.
Normalizing to Canonical CSI
use wifi_densepose_signal::HardwareNormalizer;
let normalizer = HardwareNormalizer::new(); // canonical = 56 sub-carriers
let frame = normalizer.normalize(&raw_amp, &raw_phase, hardware_type)?;
Regardless of whether hardware_type is Esp32S3, Intel5300, or Atheros, the normalizer resamples via cubic interpolation (resample_cubic()) and z-scores the amplitude to produce a uniform representation for downstream pose estimation models.
Deployment Considerations
Choose ESP32-S3 for battery-operated distributed mesh networks where nodes must be placed in hard-to-reach locations without power infrastructure. The fixed 100 Hz sampling and single spatial stream are sufficient for vital-sign monitoring when aggregated across multiple nodes in a TDMA mesh, as implemented in the ESP32 TDMA module.
Select Atheros AR9580 or Intel 5300 for fixed-location research deployments requiring high temporal resolution and multi-antenna spatial multiplexing. These desktop-class NICs deliver sub-millisecond latency and support complex MIMO algorithms, though they require host PCs and continuous power. The Atheros platform offers greater flexibility in channel width (up to 80 MHz with ath11k), while the Intel 5300 provides a stable 30-subcarrier baseline for legacy compatibility.
Summary
- RuView abstracts ESP32-S3, Intel 5300, and Atheros AR9580 through the
HardwareNormalizerinhardware_norm.rs, unifying all inputs to a 56-subcarrier canonical grid. - ESP32-S3 provides 64 subcarriers at 100 Hz with 1×1 SISO, optimized for low-power UDP streaming in
esp32_parser.rs. - Atheros AR9580 delivers 56–234 subcarriers and 3×3 MIMO at 250–500 Hz via
HardwareAdapter::atheros()andcsi_receiver.rs. - Intel 5300 offers 30 subcarriers with 3×3 MIMO, serving as a legacy high-resolution alternative supported through the same abstraction layer.
- All platforms converge to the same coordinate system through cubic interpolation (
resample_cubic()) and z-score normalization inHardwareNormalizer::normalize().
Frequently Asked Questions
What is the maximum sampling rate for ESP32-S3 CSI capture in RuView?
The ESP32-S3 implementation in RuView is fixed at 100 Hz (one frame every 10 milliseconds), as defined in the ESP-CSI firmware integration and the esp32_parser.rs module. This rate balances power consumption and UDP streaming overhead for battery-operated sensor nodes, and cannot be increased without firmware modifications outside the RuView stack.
How does RuView handle the different subcarrier counts between Intel 5300, ESP32-S3, and Atheros hardware?
RuView uses the HardwareNormalizer struct defined in hardware_norm.rs to resample all incoming CSI to a canonical 56-subcarrier grid. Whether the source provides 30 subcarriers (Intel 5300), 64 (ESP32-S3), or 56–234 (Atheros), the normalize() function applies cubic interpolation (resample_cubic()) and z-scoring to produce a uniform representation for downstream pose estimation and vital-sign pipelines.
Can I mix ESP32-S3 and Atheros sensors in the same RuView deployment?
Yes. The sensing-server/src/main.rs entry point accepts UDP streams from ESP32-S3 nodes while simultaneously processing CSI from Atheros and Intel NICs through the csi_receiver.rs adapter. The HardwareAdapter factory in hardware_adapter.rs automatically detects the hardware type via subcarrier count and MIMO stream configuration (using HardwareType::Esp32S3::mimo_streams() or HardwareType::Atheros::mimo_streams()), allowing heterogeneous sensor fusion within the same canonical coordinate system.
Why does the RuView source code refer to ESP32-S3 as "Intel S3OO"?
This is a legacy codename used in early hardware type enumerations within hardware_norm.rs. Despite the confusing nomenclature, HardwareType::Esp32S3 represents the Espressif ESP32-S3 SoC, distinct from the Intel WiFi Link 5300 NIC (which is handled under a separate HardwareType variant or through the generic Intel adapter). The naming persists in internal function references for backward compatibility with existing sensor node firmware and early ADR-018 specifications.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →