世界上有一种智能,它不需要眼睛就能看见你 —— WiFi信号就是它的视网膜
Spatial Intelligence(空间智能),是AI理解和感知物理空间的能力。不是通过摄像头看,而是通过各种传感器——WiFi信号、雷达、激光雷达——来"感受"空间中的物体、人、事件。
2026年5月,RuView项目让空间智能火出圈了——它用普通的WiFi信号,就能实现实时空间感知、生命体征监测和人员检测,一个摄像头都不需要。Spatial Intelligence的应用场景令人惊叹:
WiFi信号在空间中传播时,会被人体和物体反射、折射、吸收。通过分析WiFi信号的信道状态信息(CSI),AI可以反推出空间中发生了什么:
# WiFi CSI 感知原理
WiFi信号发射 → 穿过空间
→ 被人体反射(多普勒效应)
→ 被墙壁折射
→ 被家具吸收
原始CSI信号 → 信号处理 → 特征提取
→ 人体位置(精度~10cm)
→ 呼吸频率(精度~1bpm)
→ 步态识别(准确率~95%)
→ 跌倒检测(准确率~98%)
关键:不需要摄像头!不需要麦克风!
只要你家有WiFi路由器就够了。
用OpenClaw构建一个全屋空间感知系统:
# OpenClaw 空间感知Agent配置
# .openclaw/skills/spatial-sensor.yaml
skill:
name: spatial-sensor
description: "通过WiFi CSI信号感知室内空间状态"
tools: [exec, web_fetch]
prompt: |
你是一个空间感知Agent,负责监控室内空间状态。
数据源:
- WiFi CSI信号(从路由器API获取)
- 温湿度传感器
- 门窗传感器
任务:
1. 实时检测房间内的人员位置和数量
2. 监测生命体征(呼吸频率)
3. 检测异常事件(跌倒、长时间不动)
4. 根据空间状态自动控制智能家居
异常告警规则:
- 检测到跌倒 → 立即通知紧急联系人
- 卧室无人但空调开着 → 自动关闭
- 客厅有人 → 开灯到舒适亮度
- 老人夜间起床 → 走廊灯自动亮起
cron:
# 每30秒检测一次空间状态
- schedule: "*/30 * * * * *"
task: "spatial-sensor detect"
target: "spatial-sensor"
# 办公空间分析Agent
class SpatialAnalyticsAgent:
"""分析办公空间利用率"""
def __init__(self):
self.zones = {
"meeting-room-a": {"capacity": 8, "wifi_id": "zone_01"},
"focus-area": {"capacity": 12, "wifi_id": "zone_02"},
"lounge": {"capacity": 20, "wifi_id": "zone_03"},
}
def detect_occupancy(self, zone_id):
"""检测区域人数"""
# 从WiFi CSI推断人数
csi_data = self.fetch_csi(zone_id)
count = self.model.predict(csi_data)
return count
def generate_report(self):
"""生成空间利用率报告"""
report = {}
for zone, config in self.zones.items():
current = self.detect_occupancy(config["wifi_id"])
report[zone] = {
"current": current,
"capacity": config["capacity"],
"utilization": current / config["capacity"],
"status": "拥挤" if current/config["capacity"] > 0.8
else "适中" if current/config["capacity"] > 0.4
else "空闲"
}
return report
# WiFi CSI 信号处理基础
import numpy as np
from scipy import signal
class CSIPreprocessor:
"""WiFi CSI信号预处理器"""
def __init__(self, num_subcarriers=64):
self.num_subcarriers = num_subcarriers
def denoise(self, csi_raw):
"""CSI信号去噪"""
# Hampel滤波去除异常值
median = np.median(csi_raw, axis=0)
mad = np.median(np.abs(csi_raw - median), axis=0)
threshold = 3 * 1.4826 * mad
csi_clean = np.where(
np.abs(csi_raw - median) > threshold,
median, csi_raw
)
return csi_clean
def extract_features(self, csi_clean):
"""提取空间特征"""
# 子载波幅度
amplitude = np.abs(csi_clean)
# 子载波相位
phase = np.angle(csi_clean)
# 时域特征
features = {
"mean_amp": np.mean(amplitude),
"std_amp": np.std(amplitude),
"max_amp": np.max(amplitude),
"energy": np.sum(amplitude ** 2),
# 多普勒频移(反映运动)
"doppler_shift": self._compute_doppler(amplitude),
}
return features
def _compute_doppler(self, amplitude):
"""计算多普勒频移,用于运动检测"""
f, Pxx = signal.welch(amplitude, fs=100, nperseg=64)
peak_freq = f[np.argmax(Pxx)]
return peak_freq
# 多传感器空间融合Agent
class SpatialFusionAgent:
"""融合WiFi、雷达、温度等多源空间数据"""
def __init__(self):
self.sensors = {
"wifi_csi": WiFiCSISensor(),
"mmwave_radar": RadarSensor(),
"temp_humidity": EnvironmentSensor(),
}
def fuse_spatial_data(self):
"""多源空间数据融合"""
wifi_data = self.sensors["wifi_csi"].read()
radar_data = self.sensors["mmwave_radar"].read()
env_data = self.sensors["temp_humidity"].read()
# 卡尔曼滤波融合位置估计
wifi_position = self.estimate_position(wifi_data)
radar_position = self.estimate_position(radar_data)
fused = self.kalman_filter.update(
wifi_position, radar_position
)
return {
"position": fused, # 融合位置
"confidence": 0.92, # 置信度
"environment": env_data, # 环境信息
"timestamp": time.time()
}