Repository files navigation

Edge AI-Enabled Smart LiDAR Sensing for C-V2X ISAC

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:

  1. Direct gRPC Pipeline: Heavy-duty perception server streaming both 3D point clouds and AI metadata directly from the sensor.
  2. 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.

👥 Authors

  • Kevin Song, SURF Intern 2026
  • Institution: National Institute of Standards and Technology (NIST) - Communications Technology Laboratory (CTL)

🎯 Purpose, Scope, and Features

Purpose

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.

Features

  • 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.

🚀 Getting Started

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.git

2. 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.py

🔌 Hardware Setup

To 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 the LIDAR_IP variable 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.

💻 Software Setup

Python Environment Setup (Laptop)

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 the venv folder. 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.txt

Windows 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).

Blickfeld Qb2 Setup (Web GUI & Node-RED)

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:

  1. 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
  2. Navigate to the Flows (Node-RED) section in the Web GUI.
  3. Click the Node-RED menu (the three horizontal lines in the top right) > Import.
  4. Select the .json flow files from this repository to upload them.

⚠️ Variables You Must Change After Importing: Once imported, double-click the specific nodes in the flow to update these environment-specific values:

  • 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 Out nodes 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 Topic field blank in Node-RED, the Python mqtt-edgeAI.py script 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 the MQTT_TOPIC variable inside mqtt-edgeAI.py to match it identically. Otherwise, the data will not be received.
  • gRPC Connection (FQDN & API Key): Find the blue Blickfeld Qb2 Method nodes. Ensure the FQDN points to the sensor (use 127.0.0.1, localhost, or qb2.local if 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 isIntruding flags.

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.

📊 Dashboard Overview

Here is a look at the telemetry interfaces included in this suite:

Dashboard NameDescriptionInterface Preview
gRPC Edge AITracks intrusions via raw gRPC and measures exact hardware wire speed.gRPC Edge AI Monitor
gRPC Raw DataVisualizes the live 3D laser stream directly from the sensor in real-time.gRPC Raw Data Monitor
MQTT Edge AITracks intrusions using an ultra-lightweight JSON string pre-filtered by Node-RED.MQTT Edge AI Monitor
MQTT Raw DataRenders an unpacked MQTT 3D matrix stream published via a broker.MQTT Raw Data Monitor

📝 Troubleshooting

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 .json flow 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.

About

This repository is an AI-Enabled Smart LiDAR sensor for V2X ISAC application.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Edge AI-Enabled Smart LiDAR Sensing for C-V2X ISAC

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:

  1. Direct gRPC Pipeline: Heavy-duty perception server streaming both 3D point clouds and AI metadata directly from the sensor.
  2. 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.

👥 Authors

  • Kevin Song, SURF Intern 2026
  • Institution: National Institute of Standards and Technology (NIST) - Communications Technology Laboratory (CTL)

🎯 Purpose, Scope, and Features

Purpose

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.

Features

  • 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.

🚀 Getting Started

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.git

2. 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.py

🔌 Hardware Setup

To 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 the LIDAR_IP variable 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.

💻 Software Setup

Python Environment Setup (Laptop)

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 the venv folder. 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.txt

Windows 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).

Blickfeld Qb2 Setup (Web GUI & Node-RED)

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:

  1. 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
  2. Navigate to the Flows (Node-RED) section in the Web GUI.
  3. Click the Node-RED menu (the three horizontal lines in the top right) > Import.
  4. Select the .json flow files from this repository to upload them.

⚠️ Variables You Must Change After Importing: Once imported, double-click the specific nodes in the flow to update these environment-specific values:

  • 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 Out nodes 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 Topic field blank in Node-RED, the Python mqtt-edgeAI.py script 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 the MQTT_TOPIC variable inside mqtt-edgeAI.py to match it identically. Otherwise, the data will not be received.
  • gRPC Connection (FQDN & API Key): Find the blue Blickfeld Qb2 Method nodes. Ensure the FQDN points to the sensor (use 127.0.0.1, localhost, or qb2.local if 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 isIntruding flags.

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.

📊 Dashboard Overview

Here is a look at the telemetry interfaces included in this suite:

Dashboard NameDescriptionInterface Preview
gRPC Edge AITracks intrusions via raw gRPC and measures exact hardware wire speed.gRPC Edge AI Monitor
gRPC Raw DataVisualizes the live 3D laser stream directly from the sensor in real-time.gRPC Raw Data Monitor
MQTT Edge AITracks intrusions using an ultra-lightweight JSON string pre-filtered by Node-RED.MQTT Edge AI Monitor
MQTT Raw DataRenders an unpacked MQTT 3D matrix stream published via a broker.MQTT Raw Data Monitor

📝 Troubleshooting

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 .json flow 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.

About

This repository is an AI-Enabled Smart LiDAR sensor for V2X ISAC application.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Edge AI-Enabled Smart LiDAR Sensing for C-V2X ISAC

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:

  1. Direct gRPC Pipeline: Heavy-duty perception server streaming both 3D point clouds and AI metadata directly from the sensor.
  2. 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.

👥 Authors

  • Kevin Song, SURF Intern 2026
  • Institution: National Institute of Standards and Technology (NIST) - Communications Technology Laboratory (CTL)

🎯 Purpose, Scope, and Features

Purpose

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.

Features

  • 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.

🚀 Getting Started

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.git

2. 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.py

🔌 Hardware Setup

To 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 the LIDAR_IP variable 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.

💻 Software Setup

Python Environment Setup (Laptop)

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 the venv folder. 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.txt

Windows 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).

Blickfeld Qb2 Setup (Web GUI & Node-RED)

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:

  1. 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
  2. Navigate to the Flows (Node-RED) section in the Web GUI.
  3. Click the Node-RED menu (the three horizontal lines in the top right) > Import.
  4. Select the .json flow files from this repository to upload them.

⚠️ Variables You Must Change After Importing: Once imported, double-click the specific nodes in the flow to update these environment-specific values:

  • 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 Out nodes 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 Topic field blank in Node-RED, the Python mqtt-edgeAI.py script 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 the MQTT_TOPIC variable inside mqtt-edgeAI.py to match it identically. Otherwise, the data will not be received.
  • gRPC Connection (FQDN & API Key): Find the blue Blickfeld Qb2 Method nodes. Ensure the FQDN points to the sensor (use 127.0.0.1, localhost, or qb2.local if 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 isIntruding flags.

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.

📊 Dashboard Overview

Here is a look at the telemetry interfaces included in this suite:

Dashboard NameDescriptionInterface Preview
gRPC Edge AITracks intrusions via raw gRPC and measures exact hardware wire speed.gRPC Edge AI Monitor
gRPC Raw DataVisualizes the live 3D laser stream directly from the sensor in real-time.gRPC Raw Data Monitor
MQTT Edge AITracks intrusions using an ultra-lightweight JSON string pre-filtered by Node-RED.MQTT Edge AI Monitor
MQTT Raw DataRenders an unpacked MQTT 3D matrix stream published via a broker.MQTT Raw Data Monitor

📝 Troubleshooting

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 .json flow 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.

About

This repository is an AI-Enabled Smart LiDAR sensor for V2X ISAC application.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Edge AI-Enabled Smart LiDAR Sensing for C-V2X ISAC

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:

  1. Direct gRPC Pipeline: Heavy-duty perception server streaming both 3D point clouds and AI metadata directly from the sensor.
  2. 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.

👥 Authors

  • Kevin Song, SURF Intern 2026
  • Institution: National Institute of Standards and Technology (NIST) - Communications Technology Laboratory (CTL)

🎯 Purpose, Scope, and Features

Purpose

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.

Features

  • 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.

🚀 Getting Started

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.git

2. 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.py

🔌 Hardware Setup

To 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 the LIDAR_IP variable 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.

💻 Software Setup

Python Environment Setup (Laptop)

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 the venv folder. 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.txt

Windows 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).

Blickfeld Qb2 Setup (Web GUI & Node-RED)

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:

  1. 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
  2. Navigate to the Flows (Node-RED) section in the Web GUI.
  3. Click the Node-RED menu (the three horizontal lines in the top right) > Import.
  4. Select the .json flow files from this repository to upload them.

⚠️ Variables You Must Change After Importing: Once imported, double-click the specific nodes in the flow to update these environment-specific values:

  • 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 Out nodes 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 Topic field blank in Node-RED, the Python mqtt-edgeAI.py script 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 the MQTT_TOPIC variable inside mqtt-edgeAI.py to match it identically. Otherwise, the data will not be received.
  • gRPC Connection (FQDN & API Key): Find the blue Blickfeld Qb2 Method nodes. Ensure the FQDN points to the sensor (use 127.0.0.1, localhost, or qb2.local if 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 isIntruding flags.

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.

📊 Dashboard Overview

Here is a look at the telemetry interfaces included in this suite:

Dashboard NameDescriptionInterface Preview
gRPC Edge AITracks intrusions via raw gRPC and measures exact hardware wire speed.gRPC Edge AI Monitor
gRPC Raw DataVisualizes the live 3D laser stream directly from the sensor in real-time.gRPC Raw Data Monitor
MQTT Edge AITracks intrusions using an ultra-lightweight JSON string pre-filtered by Node-RED.MQTT Edge AI Monitor
MQTT Raw DataRenders an unpacked MQTT 3D matrix stream published via a broker.MQTT Raw Data Monitor

📝 Troubleshooting

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 .json flow 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.

About

This repository is an AI-Enabled Smart LiDAR sensor for V2X ISAC application.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Edge AI-Enabled Smart LiDAR Sensing for C-V2X ISAC

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:

  1. Direct gRPC Pipeline: Heavy-duty perception server streaming both 3D point clouds and AI metadata directly from the sensor.
  2. 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.

👥 Authors

  • Kevin Song, SURF Intern 2026
  • Institution: National Institute of Standards and Technology (NIST) - Communications Technology Laboratory (CTL)

🎯 Purpose, Scope, and Features

Purpose

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.

Features

  • 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.

🚀 Getting Started

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.git

2. 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.py

🔌 Hardware Setup

To 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 the LIDAR_IP variable 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.

💻 Software Setup

Python Environment Setup (Laptop)

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 the venv folder. 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.txt

Windows 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).

Blickfeld Qb2 Setup (Web GUI & Node-RED)

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:

  1. 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
  2. Navigate to the Flows (Node-RED) section in the Web GUI.
  3. Click the Node-RED menu (the three horizontal lines in the top right) > Import.
  4. Select the .json flow files from this repository to upload them.

⚠️ Variables You Must Change After Importing: Once imported, double-click the specific nodes in the flow to update these environment-specific values:

  • 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 Out nodes 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 Topic field blank in Node-RED, the Python mqtt-edgeAI.py script 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 the MQTT_TOPIC variable inside mqtt-edgeAI.py to match it identically. Otherwise, the data will not be received.
  • gRPC Connection (FQDN & API Key): Find the blue Blickfeld Qb2 Method nodes. Ensure the FQDN points to the sensor (use 127.0.0.1, localhost, or qb2.local if 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 isIntruding flags.

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.

📊 Dashboard Overview

Here is a look at the telemetry interfaces included in this suite:

Dashboard NameDescriptionInterface Preview
gRPC Edge AITracks intrusions via raw gRPC and measures exact hardware wire speed.gRPC Edge AI Monitor
gRPC Raw DataVisualizes the live 3D laser stream directly from the sensor in real-time.gRPC Raw Data Monitor
MQTT Edge AITracks intrusions using an ultra-lightweight JSON string pre-filtered by Node-RED.MQTT Edge AI Monitor
MQTT Raw DataRenders an unpacked MQTT 3D matrix stream published via a broker.MQTT Raw Data Monitor

📝 Troubleshooting

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 .json flow 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.

About

This repository is an AI-Enabled Smart LiDAR sensor for V2X ISAC application.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Edge AI-Enabled Smart LiDAR Sensing for C-V2X ISAC

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:

  1. Direct gRPC Pipeline: Heavy-duty perception server streaming both 3D point clouds and AI metadata directly from the sensor.
  2. 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.

👥 Authors

  • Kevin Song, SURF Intern 2026
  • Institution: National Institute of Standards and Technology (NIST) - Communications Technology Laboratory (CTL)

🎯 Purpose, Scope, and Features

Purpose

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.

Features

  • 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.

🚀 Getting Started

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.git

2. 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.py

🔌 Hardware Setup

To 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 the LIDAR_IP variable 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.

💻 Software Setup

Python Environment Setup (Laptop)

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 the venv folder. 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.txt

Windows 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).

Blickfeld Qb2 Setup (Web GUI & Node-RED)

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:

  1. 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
  2. Navigate to the Flows (Node-RED) section in the Web GUI.
  3. Click the Node-RED menu (the three horizontal lines in the top right) > Import.
  4. Select the .json flow files from this repository to upload them.

⚠️ Variables You Must Change After Importing: Once imported, double-click the specific nodes in the flow to update these environment-specific values:

  • 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 Out nodes 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 Topic field blank in Node-RED, the Python mqtt-edgeAI.py script 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 the MQTT_TOPIC variable inside mqtt-edgeAI.py to match it identically. Otherwise, the data will not be received.
  • gRPC Connection (FQDN & API Key): Find the blue Blickfeld Qb2 Method nodes. Ensure the FQDN points to the sensor (use 127.0.0.1, localhost, or qb2.local if 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 isIntruding flags.

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.

📊 Dashboard Overview

Here is a look at the telemetry interfaces included in this suite:

Dashboard NameDescriptionInterface Preview
gRPC Edge AITracks intrusions via raw gRPC and measures exact hardware wire speed.gRPC Edge AI Monitor
gRPC Raw DataVisualizes the live 3D laser stream directly from the sensor in real-time.gRPC Raw Data Monitor
MQTT Edge AITracks intrusions using an ultra-lightweight JSON string pre-filtered by Node-RED.MQTT Edge AI Monitor
MQTT Raw DataRenders an unpacked MQTT 3D matrix stream published via a broker.MQTT Raw Data Monitor

📝 Troubleshooting

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 .json flow 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.

About

This repository is an AI-Enabled Smart LiDAR sensor for V2X ISAC application.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Edge AI-Enabled Smart LiDAR Sensing for C-V2X ISAC

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:

  1. Direct gRPC Pipeline: Heavy-duty perception server streaming both 3D point clouds and AI metadata directly from the sensor.
  2. 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.

👥 Authors

  • Kevin Song, SURF Intern 2026
  • Institution: National Institute of Standards and Technology (NIST) - Communications Technology Laboratory (CTL)

🎯 Purpose, Scope, and Features

Purpose

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.

Features

  • 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.

🚀 Getting Started

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.git

2. 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.py

🔌 Hardware Setup

To 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 the LIDAR_IP variable 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.

💻 Software Setup

Python Environment Setup (Laptop)

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 the venv folder. 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.txt

Windows 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).

Blickfeld Qb2 Setup (Web GUI & Node-RED)

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:

  1. 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
  2. Navigate to the Flows (Node-RED) section in the Web GUI.
  3. Click the Node-RED menu (the three horizontal lines in the top right) > Import.
  4. Select the .json flow files from this repository to upload them.

⚠️ Variables You Must Change After Importing: Once imported, double-click the specific nodes in the flow to update these environment-specific values:

  • 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 Out nodes 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 Topic field blank in Node-RED, the Python mqtt-edgeAI.py script 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 the MQTT_TOPIC variable inside mqtt-edgeAI.py to match it identically. Otherwise, the data will not be received.
  • gRPC Connection (FQDN & API Key): Find the blue Blickfeld Qb2 Method nodes. Ensure the FQDN points to the sensor (use 127.0.0.1, localhost, or qb2.local if 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 isIntruding flags.

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.

📊 Dashboard Overview

Here is a look at the telemetry interfaces included in this suite:

Dashboard NameDescriptionInterface Preview
gRPC Edge AITracks intrusions via raw gRPC and measures exact hardware wire speed.gRPC Edge AI Monitor
gRPC Raw DataVisualizes the live 3D laser stream directly from the sensor in real-time.gRPC Raw Data Monitor
MQTT Edge AITracks intrusions using an ultra-lightweight JSON string pre-filtered by Node-RED.MQTT Edge AI Monitor
MQTT Raw DataRenders an unpacked MQTT 3D matrix stream published via a broker.MQTT Raw Data Monitor

📝 Troubleshooting

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 .json flow 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.

About

This repository is an AI-Enabled Smart LiDAR sensor for V2X ISAC application.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Edge AI-Enabled Smart LiDAR Sensing for C-V2X ISAC

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:

  1. Direct gRPC Pipeline: Heavy-duty perception server streaming both 3D point clouds and AI metadata directly from the sensor.
  2. 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.

👥 Authors

  • Kevin Song, SURF Intern 2026
  • Institution: National Institute of Standards and Technology (NIST) - Communications Technology Laboratory (CTL)

🎯 Purpose, Scope, and Features

Purpose

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.

Features

  • 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.

🚀 Getting Started

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.git

2. 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.py

🔌 Hardware Setup

To 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 the LIDAR_IP variable 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.

💻 Software Setup

Python Environment Setup (Laptop)

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 the venv folder. 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.txt

Windows 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).

Blickfeld Qb2 Setup (Web GUI & Node-RED)

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:

  1. 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
  2. Navigate to the Flows (Node-RED) section in the Web GUI.
  3. Click the Node-RED menu (the three horizontal lines in the top right) > Import.
  4. Select the .json flow files from this repository to upload them.

⚠️ Variables You Must Change After Importing: Once imported, double-click the specific nodes in the flow to update these environment-specific values:

  • 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 Out nodes 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 Topic field blank in Node-RED, the Python mqtt-edgeAI.py script 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 the MQTT_TOPIC variable inside mqtt-edgeAI.py to match it identically. Otherwise, the data will not be received.
  • gRPC Connection (FQDN & API Key): Find the blue Blickfeld Qb2 Method nodes. Ensure the FQDN points to the sensor (use 127.0.0.1, localhost, or qb2.local if 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 isIntruding flags.

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.

📊 Dashboard Overview

Here is a look at the telemetry interfaces included in this suite:

Dashboard NameDescriptionInterface Preview
gRPC Edge AITracks intrusions via raw gRPC and measures exact hardware wire speed.gRPC Edge AI Monitor
gRPC Raw DataVisualizes the live 3D laser stream directly from the sensor in real-time.gRPC Raw Data Monitor
MQTT Edge AITracks intrusions using an ultra-lightweight JSON string pre-filtered by Node-RED.MQTT Edge AI Monitor
MQTT Raw DataRenders an unpacked MQTT 3D matrix stream published via a broker.MQTT Raw Data Monitor

📝 Troubleshooting

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 .json flow 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.

About

This repository is an AI-Enabled Smart LiDAR sensor for V2X ISAC application.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages