Communications Technology Laboratory (CTL) | NIST
This repository contains a comprehensive suite of real-time Python benchmarking dashboards. It is designed to compare the performance, network latency, and bandwidth requirements of two distinct data pipelines for the Blickfeld Qb2 Smart LiDAR sensor:
- Direct gRPC Pipeline: Heavy-duty perception server streaming both 3D point clouds and AI metadata directly from the sensor.
- MQTT Broker Pipeline: A lightweight IoT alerting architecture where data is pre-filtered on the Edge (via Node-RED) and transmitted as minimal JSON payloads.
- Kevin Song, SURF Intern 2026
- Institution: National Institute of Standards and Technology (NIST) - Communications Technology Laboratory (CTL)
To empirically evaluate and benchmark the architectural trade-offs between high-bandwidth gRPC streaming and low-bandwidth MQTT IoT protocols for C-V2X (Cellular Vehicle-to-Everything) Integrated Sensing and Communications (ISAC) applications.
- Centralized Dashboard Hub: A GUI (
launcher.py) to manage and launch multiple telemetry nodes simultaneously. - Live 3D Visualization: Real-time rendering of incoming LiDAR point clouds (both raw gRPC and unpacked MQTT matrices) using
matplotlib. - Intrusion Detection Tracking: Live UI updates tracking objects (VRUs, Vehicles) entering predefined security zones.
- Advanced Network Telemetry: Built-in benchmarking tools that calculate end-to-end latency, hardware compute time, network transit time, jitter, throughput (KB/s and MB/s), and packet loss over defined durations.
To get this project running on your local machine, open your terminal (or command prompt) and follow these steps:
1. Clone the repository: Navigate to your repository of choice in a terminal window and run this command:
git clone https://github.com/eysong/SmartLiDARSensor.git2. Follow the Software Setup instructions below to create your virtual environment.
3. Launch the Hub: Once your environment is active and dependencies are installed, simply run the launcher:
python launcher.pyTo run this architecture, you must establish a clean, hardwired local network:
- The Sensor: Connect the Blickfeld Qb2 LiDAR sensor to a Network/PoE Switch via Ethernet.
- The Compute Node: Connect your Ubuntu Laptop (or Windows PC) to the same Network Switch via Ethernet.
- Local Subnet & IP Configuration: You must create a local subnet with your LAN/network switch so your laptop and the sensor can obtain their IP addresses and communicate. Ensure your compute node is on the same subnet as the LiDAR sensor. (By default, the Python scripts look for the sensor at
192.168.26.26. You must update theLIDAR_IPvariable in the Python scripts if your sensor's IP differs). - Time Synchronization (Imperative): You must synchronize the LiDAR sensor's time with your laptop to ensure accurate latency benchmarks. Configure the sensor's time settings (via its Web GUI) to use your laptop's local LAN IP address as its NTP (Network Time Protocol) server. Without this synchronization, the sensor's timestamps will be entirely off, resulting in completely inaccurate end-to-end latency telemetry.
It is highly recommended to run this inside a Python virtual environment to avoid dependency conflicts.
⚠️ CRITICAL CROSS-OS WARNING: Virtual environments (venv) are bound to the operating system they were created on. If you clone this repo from Ubuntu to Windows (or vice versa), do not copy thevenvfolder. You must create a fresh environment on the new machine.
Ubuntu / Linux Setup:
# Update packages and install a local MQTT broker (Mosquitto)
sudo apt update
sudo apt install mosquitto mosquitto-clients python3-venv python3-tk -y
# Create and activate the virtual environment
python3 -m venv venv
source venv/bin/activate
# Install required Python dependencies from requirements.txt
pip install -r requirements.txtWindows Setup (PowerShell):
# Create and activate the virtual environment
python -m venv venv
.\venv\Scripts\Activate.ps1
# Install required Python dependencies from requirements.txt
pip install -r requirements.txt(Note: Windows users will also need to download and install the Eclipse Mosquitto broker from mosquitto.org to run the MQTT dashboards locally).
For the MQTT dashboards to work, the sensor must be instructed to filter and publish the data. This is handled by Blickfeld Flows (Node-RED) running directly on the sensor's edge compute module.
How to Import into a New Sensor:
- Open a web browser and navigate to the sensor's IP address (e.g.,
http://192.168.26.26). If needed, log into the Qb2 using the default password:elude5285 - Navigate to the Flows (Node-RED) section in the Web GUI.
- Click the Node-RED menu (the three horizontal lines in the top right) > Import.
- Select the
.jsonflow files from this repository to upload them.
- Enable the Flows: The imported flows are disabled by default. Double-click the flow tabs at the top ("MQTT Edge AI" and "MQTT Raw Data") and change their status from "Disabled" to "Enabled".
- MQTT Broker IP: Find the pink
MQTT Outnodes and edit their server settings. Change the hardcoded IP address to match the local IPv4 address of your laptop (the machine running the Mosquitto broker). - MQTT Topic Configuration:
- If you leave the
Topicfield blank in Node-RED, the Pythonmqtt-edgeAI.pyscript will still work perfectly because it subscribes to the#wildcard (which catches all topics). - If you choose to type a specific topic name (e.g.,
lidar/security/alerts), you must also update theMQTT_TOPICvariable insidemqtt-edgeAI.pyto match it identically. Otherwise, the data will not be received.
- If you leave the
- gRPC Connection (FQDN & API Key): Find the blue
Blickfeld Qb2 Methodnodes. Ensure theFQDNpoints to the sensor (use127.0.0.1,localhost, orqb2.localif running internally on the sensor, or the sensor's IP if running externally). Also, ensure the API Key matches your current application key. - Security Zone Configurations: Ensure that you have actively drawn and configured security perception zones in the sensor's main Web GUI to actually trigger the
isIntrudingflags.
Deploy & Enable:
- Once the variables are updated, click the red Deploy button in the top right.
- CRITICAL: Ensure the specific flow you want to test is actively turned ON in the Node-RED interface before running the corresponding MQTT Python script.
Here is a look at the telemetry interfaces included in this suite:
API Keys
The scripts currently use a hardcoded API token (API_KEY = "2ee8... "). If you factory reset your sensor or generate a new application key in the Blickfeld Web GUI, you must update the API_KEY variable at the top of the gRPC- scripts.
MQTT Dashboard Blank?
If mqtt-edgeAI.py or mqtt-rawData.py is running but showing no data:
- Verify that your local Mosquitto broker is running (
sudo systemctl status mosquitto). - Verify that the correct
.jsonflow is deployed and activated in the Qb2 Web GUI. - Ensure the Node-RED MQTT out-node is pointing to your laptop's IP address on port
1883.
NIST Logo Error
The launcher.py script requires the NIST-CTL Logo.png file to be present in the same directory. If it is missing, the hub will exit with an error.



