# OWL: Enabling Orientation-Diverse Wireless Localization Research - Dataset

This dataset contains the processed data associated with the paper "OWL: Enabling Orientation-Diverse Wireless Localization Research".

We present a comprehensive set of orientation-diverse wireless ranging measurements collected across multiple indoor and outdoor environments. The dataset includes phase and amplitude (IQ) samples, tone quality indicators, and RSSI metrics for Bluetooth Channel Sounding (BLE-CS), alongside corresponding distance estimates, diagnostics, and Channel Impulse Response (CIR) data for Ultra-Wideband (UWB) technology. All measurements were acquired under controlled continuous antenna rotation (0 to 360°) to capture orientation diversity, facilitating research in multi-technology wireless localization and orientation-aware algorithms.

If you use this dataset in your research, please cite our paper:

```bibtex
@inproceedings{sedlak2026owl,
  author       = {Sedlak, Michael and Pestana, Jesús and Boano, Carlo Alberto},
  title        = {{OWL: Enabling Orientation-Diverse Wireless Localization Research}},
  booktitle    = {Proceedings of the 22nd International Conference on Wireless and Mobile Computing, Networking and Communications (WiMob)},
  year         = {2026},
  organization = {IEEE}
}
```

## Datasets Overview

The processed data is split into three Parquet files:

- `owl-indoor.parquet`: Contains measurements taken in indoor environments (`lecture-hall`).
- `owl-outdoor.parquet`: Contains measurements taken in outdoor environments (`park`, `street`, `yard`).
- `owl-all.parquet`: A concatenated dataset containing all measurements from both indoor and outdoor environments.

For a detailed description of the available environments, refer to the [Environments](#environments-env) section below.

## Loading the Dataset

The datasets are stored in the Apache Parquet format and can be loaded directly into a Python environment. Both `pandas` and `pyarrow` are required to read the files (and can be installed via `pip install pandas pyarrow`):

```python
import pandas as pd

# Load the complete combined dataset
df_all = pd.read_parquet("owl-all.parquet")

# Or load specific subsets
df_indoor = pd.read_parquet("owl-indoor.parquet")
df_outdoor = pd.read_parquet("owl-outdoor.parquet")
```

## Types of Data

This section outlines the primary dimensions and context of the measurements provided in these datasets.

### Environments (`env`)

The dataset contains measurements performed in multiple environments:

- **Outdoor (`owl-outdoor.parquet`)**:
  - `park`: Park area with trees and open grass.
  - `street`: Flat street area.
  - `yard`: Flat grass area next to greenhouses.
- **Indoor (`owl-indoor.parquet`)**:
  - `lecture-hall`: Indoor 88m² lecture hall at TU Graz.

### Setup and Technology (`setup`, `technology`)

*Note: For detailed information on the antenna positioning, hardware configurations, and firmware setups, please refer to the associated paper.*

- **Antenna Orientation (`setup`)**: Measurements in the outdoor dataset were recorded with both `vertical` and `horizontal` orientations. The indoor dataset contains only `vertical` orientation.
- **Technology (`technology`)**: The measurements were performed for two different ranging technologies: `ble-cs` and `uwb`.
  - **`ble-cs` (Bluetooth Channel Sounding)**: Used in all environments. Recorded using Nordic Semiconductor's nRF54L15-DK boards running a modified version of the `channel_sounding_ras_initiator` and `channel_sounding_ras_reflector` applications.
  - **`uwb` (Ultra-Wideband)**: Used exclusively in the indoor environment for comparison. Recorded using Qorvo's DWM3001CDK boards running a custom firmware performing Double-Sided Two-Way Ranging (DS-TWR).

### Angular Information (`angle`, `measured_angle`, `raw_angle`, `angle_idx`, `sample_idx`)

- `angle`: The recommended column to get the angle. It represents the target angle the OWL controller is trying to maintain and remains exactly the same for all samples at a given angular step.
- `angle_idx`: Incremented sequentially each time the target `angle` changes.
- `measured_angle` & `raw_angle`: The currently measured position after and before digital low-pass filtering, and angle unwrapping.
- `sample_idx`: Incremented for each measurement taken within a specific angular position.

### Repeated Measurements (`run_idx`)

Multiple measurement runs were performed to introduce diversity and mitigate transient environmental effects.

- For outdoor environments, each setup was recorded twice (`run_idx` = 0 or 1).
- For the indoor `lecture-hall` environment, three repeated runs were performed (`run_idx` = 0, 1, or 2).

To minimize transient interference, measurements were recorded in an interleaved manner across different distances/positions (e.g., cycling sequentially through 10m, 20m, and 25m before repeating the sequence for the second run).

### Receiver Positions (`position_idx`)

For the indoor `lecture-hall` environment, measurements were taken across 4 anchor positions arranged in a rectangle. The coordinates of these anchors (in meters) are:

- **Anchor 1**: `[-4.1220, -7.2614]`
- **Anchor 2**: `[-0.0290, -7.6704]`
- **Anchor 3**: `[-4.1949, 0.0008]`
- **Anchor 4**: `[0.0, 0.0]`

The true tag position is located at `[-1.9510, -3.6483]`.

### Tone-Level Data (`iq`, `local_iq`, `remote_iq`, `tone_RSSI`, `remote_tone_RSSI`, `tqi`)

All tone-level telemetry columns (`iq`, `local_iq`, `remote_iq`, `tone_RSSI`, `remote_tone_RSSI`, `tqi`) are represented as arrays of length 75 instead of 79 due to the BLE advertising channel overlap. To map the array index to the corresponding physical channel:

- **Start Index Shift**: Physical channels 0 and 1 are never used. The array index `i` maps to physical channel `channel_idx = i + 2`.
- **Truncated Channels**: The last two theoretical channels (77 and 78) are excluded, reducing the total channels from 79 to 75.
- **Missing Intermediate Channels**: Physical channels 23, 24, and 25 (array indices 21, 22, 23) are also excluded (set to 0 or `NaN` for RSSI) due to advertising channel overlap. Resulting in up to 72 measured channels.

The complex IQ values in the dataset (such as those in `local_iq` and `remote_iq`) are raw integer readings from the hardware's signed 12-bit analog-to-digital converter (ADC). The radio uses Automatic Gain Control (AGC), so the values are relative to the Reference Power Level (RPL).

According to the Bluetooth Core 6.0 spec, the absolute physical RSSI (in dBm) for a given tone can be reconstructed from the raw I and Q values as follows:
$$\text{RSSI}_{\text{tone}} = 20 \log_{10}\left(\frac{\sqrt{I^2 + Q^2}}{2048}\right) + \text{RPL}$$

### Dataset Specific Columns

While most columns are shared across the datasets, the indoor dataset (`owl-indoor.parquet`) contains several additional columns that are not present in the outdoor dataset (`owl-outdoor.parquet`):

- Spatial indices like `position_idx` are unique to indoor measurements where specific receiver spatial positioning indices were used.
- UWB-specific columns (`distance`, `diag`, `cir`, `error`, `status_reg`) are only present in the indoor dataset where UWB technology was employed.

## Schema Summary Table

Below is a complete list of all columns found in the datasets.

| Column Name      | Availability                      | Description                                                                                    |
| :--- | :--- | :--- |
| `angle`          | All                               | The desired target OWL angle set in the OWL controller (in radians). See [Angular Information](#angular-information-angle-measured_angle-raw_angle-angle_idx-sample_idx). |
| `angle_idx`      | All                               | Incremental index of the angular OWL position. See [Angular Information](#angular-information-angle-measured_angle-raw_angle-angle_idx-sample_idx). |
| `cir`            | UWB Only                          | Struct (dictionary) containing UWB Channel Impulse Response (CIR) data. The struct has keys `'start'` (-20), `'end'` (40), and `'data'` (an array of 122 integers representing 61 complex samples with interleaved real and imaginary components). It contains 20 samples before and 40 samples after the first peak. |
| `conn_evt`       | BLE-CS Only                          | Event counter of the BLE-CS procedure.                                                         |
| `crc`            | BLE-CS Only                          | Count of CRC errors encountered during the BLE-CS procedure.                                   |
| `de_quality`     | BLE-CS Only                          | Quality level of the distance estimate reported by the device (`'OK'` or `'DO_NOT_USE'`). |
| `diag`           | UWB Only                          | Struct (dictionary) containing diagnostic metrics reported by the UWB transceiver (such as IPATOV power levels, noise stats, and timestamps). |
| `distance`       | UWB Only                          | Distance estimate in meters recorded by UWB measurements.                                      |
| `env`            | All                               | The environment where the measurement took place. See [Environments](#environments-env) for details on `'park'`, `'street'`, `'yard'`, and `'lecture-hall'`. |
| `error`          | UWB Only                          | Status or error message description for failed UWB measurements. |
| `ifft`           | BLE-CS Only                          | Distance estimate in meters calculated using the Inverse Fast Fourier Transform (iFFT).        |
| `iq`             | BLE-CS Only                        | Array of 75 complex values (real, imag) representing the combined (local * remote) IQ samples. See [Tone-Level Data](#tone-level-data-iq-local_iq-remote_iq-tone_rssi-remote_tone_rssi-tqi). |
| `local_iq`       | BLE-CS Only                        | Array of 75 complex values (real, imag) representing the raw local IQ samples. See [Tone-Level Data](#tone-level-data-iq-local_iq-remote_iq-tone_rssi-remote_tone_rssi-tqi). |
| `local_rpl`      | BLE-CS Only                          | Reference Power Level (RPL) at the local device/initiator (in dBm).                             |
| `local_tx`       | BLE-CS Only                          | Transmission power at the local device (in dBm; typically `0.0`).                              |
| `measured_angle` | All                               | The filtered measured OWL angle (in radians). See [Angular Information](#angular-information-angle-measured_angle-raw_angle-angle_idx-sample_idx). |
| `median_RSSI`    | BLE-CS Only                          | The median of the local tone RSSI array for the current measurement (in dBm). |
| `nak`            | BLE-CS Only                          | Count of Negative Acknowledgments (NAK) during the BLE-CS procedure.                           |
| `phase_slope`    | BLE-CS Only                          | Distance estimate in meters calculated using the Phase Slope method.                           |
| `position_idx`   | Indoor Only                       | Index representing the specific receiver spatial positioning setup. See [Receiver Positions](#receiver-positions-position_idx) for anchor coordinates. |
| `raw_angle`      | All                               | Raw measured OWL angle from the sensor (in radians, before low-pass filtering). See [Angular Information](#angular-information-angle-measured_angle-raw_angle-angle_idx-sample_idx). |
| `raw_response`   | All                               | Raw serialized text response directly from the hardware application.                           |
| `remote_iq`      | BLE-CS Only                        | Array of 75 complex values (real, imag) representing the raw remote IQ samples. See [Tone-Level Data](#tone-level-data-iq-local_iq-remote_iq-tone_rssi-remote_tone_rssi-tqi). |
| `remote_rpl`     | BLE-CS Only                          | Reference Power Level (RPL) at the remote device/reflector (in dBm).                            |
| `remote_tone_RSSI`| BLE-CS Only                      | Array of length 75 containing the per-tone RSSI values (in dBm) measured at the remote device. See [Tone-Level Data](#tone-level-data-iq-local_iq-remote_iq-tone_rssi-remote_tone_rssi-tqi). |
| `remote_tx`      | BLE-CS Only                          | Transmission power at the remote device (in dBm; typically `0.0`).                             |
| `rtt`            | BLE-CS Only                          | Distance estimate in meters calculated using Round-Trip-Time (RTT).                            |
| `run_idx`        | All                               | Numeric index representing the repeated measurement run (e.g., `0`, `1`, `2`). See [Repeated Measurements](#repeated-measurements-run_idx). |
| `rx_to`          | BLE-CS Only                          | Read timeout count of the BLE-CS procedure.                                                    |
| `sample_idx`     | All                               | Index of the sample acquired within a specific OWL angular position. See [Angular Information](#angular-information-angle-measured_angle-raw_angle-angle_idx-sample_idx). |
| `setup`          | All                               | Antenna orientation setup (`'vertical'` or `'horizontal'`). See [Setup and Technology](#setup-and-technology-setup-technology). |
| `status`         | All                               | Indicates success (`'success'`) or specific failure modes during data acquisition.             |
| `status_reg`     | UWB Only                          | Hexadecimal string representation of the raw transceiver status register for UWB measurements. |
| `step_idx`       | All                               | Index representing the step position of the OWL rotation.                                      |
| `technology`     | All                               | Technology used for the measurement (`'ble-cs'` or `'uwb'`). See [Setup and Technology](#setup-and-technology-setup-technology). |
| `timestamp`      | All                               | ISO 8601 formatted timestamp of when the measurement was taken.                                |
| `tone_RSSI`      | BLE-CS Only                       | Array of length 75 containing the per-tone RSSI values (in dBm) measured at the local device. See [Tone-Level Data](#tone-level-data-iq-local_iq-remote_iq-tone_rssi-remote_tone_rssi-tqi). |
| `tqi`            | BLE-CS Only                          | Array of length 75 containing the tone quality indicators for each sub-channel (`'HIGH'`, `'MEDIUM'`, `'LOW'`, or `'UNAVAILABLE'`). See [Tone-Level Data](#tone-level-data-iq-local_iq-remote_iq-tone_rssi-remote_tone_rssi-tqi). |
| `true_dist`      | All                               | The actual physical distance between initiator and reflector (in meters).                      |

## License

This dataset is licensed under a **Creative Commons Attribution 4.0 International License (CC BY 4.0)**. You are free to share, copy, and adapt the material for any purpose, even commercially, provided you give appropriate credit.
