add motion detector example
This demonstrates a simple example of how to use the framework
This commit is contained in:
parent
a7a0071486
commit
6be12beb49
64
examples/motion_detector.py
Normal file
64
examples/motion_detector.py
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
"""Motion Detection example
|
||||||
|
This example shows how to use the CSI framework to connect to a FeitCSI host and
|
||||||
|
detect changes in the environment
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from queue import Queue
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import numpy.typing as npt
|
||||||
|
|
||||||
|
from where_fi.application import CSIApplication
|
||||||
|
from where_fi.collection.ingest import RealtimeCSIProducer
|
||||||
|
|
||||||
|
# Connect to a FeitCSI host
|
||||||
|
producer = RealtimeCSIProducer()
|
||||||
|
app = CSIApplication(producer)
|
||||||
|
|
||||||
|
# Store historical CSI data to compare with the current data
|
||||||
|
# This allows us to detect sudden changes in the environment,
|
||||||
|
# most likely to be cause by motion
|
||||||
|
|
||||||
|
# This is stored individually for each receiving antenna, for each subcarrier
|
||||||
|
historical: dict[tuple[int, int], Queue[np.complex64]] = {}
|
||||||
|
|
||||||
|
MAGN_THRESHOLD = 20
|
||||||
|
PHASE_THRESHOLD = 0.5
|
||||||
|
|
||||||
|
|
||||||
|
@app.on_process
|
||||||
|
def _(antenna_data: npt.NDArray[np.complex64]) -> None:
|
||||||
|
for antenna in range(antenna_data.shape[1]):
|
||||||
|
for subcarrier in range(antenna_data.shape[0]):
|
||||||
|
# Get the current subcarrier data
|
||||||
|
current = antenna_data[subcarrier, antenna, 0]
|
||||||
|
|
||||||
|
# Get the historical data for this antenna and subcarrier
|
||||||
|
if (antenna, subcarrier) not in historical:
|
||||||
|
historical[(antenna, subcarrier)] = Queue(maxsize=100)
|
||||||
|
historical_data = historical[(antenna, subcarrier)]
|
||||||
|
|
||||||
|
# Calculate the average of the historical data
|
||||||
|
mean: np.complex64 = np.mean(historical_data.queue)
|
||||||
|
|
||||||
|
# If we have enough historical data, compare it with the current data
|
||||||
|
if historical_data.full():
|
||||||
|
historical_data.get()
|
||||||
|
|
||||||
|
# Add the current data to the historical data
|
||||||
|
historical_data.put(current)
|
||||||
|
|
||||||
|
# Compare the current data with the historical data
|
||||||
|
if (
|
||||||
|
np.abs(mean - current) > MAGN_THRESHOLD
|
||||||
|
or np.abs(np.angle(mean) - np.angle(current)) > PHASE_THRESHOLD
|
||||||
|
):
|
||||||
|
logging.info(
|
||||||
|
f"Change detected on antenna {antenna}, subcarrier {subcarrier} "
|
||||||
|
f"|{np.abs(mean - current)}| <{np.angle(mean) - np.angle(current)}>"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Start the application
|
||||||
|
app.start()
|
||||||
Loading…
Reference in New Issue
Block a user