RuView 持久身份跟踪设计:ADR-307 隐私优先的跨域概率轨迹方案
【免费下载链接】RuViewπ RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.项目地址: https://gitcode.com/GitHub_Trending/wi/RuView
导读
本文基于 RuView 感知子层(ADR-300)体系中的 ADR-307《Persistent identity & tracking》,剖析"持久身份与跟踪"原语(primitive #7)的设计骨架:如何在无摄像头、无姓名/账号/手机号等公民身份的前提下,跨无线信号(radios)、跨传感模态、跨房间表达"person_7 从厨房走到走廊再走进卧室"这种持久伪匿名轨迹。你将理解现有多目标跟踪器(MAT 的SurvivorTracker)的复用边界、概率关联与衰减失效设计、基于本体图的空间拓扑约束,以及"低关联是隐私安全失败模式"这一关键取舍在代码结构中的落点。
说明:本文属架构决策记录的工程解读,重点是还原 ADR-307 的决策逻辑并对照仓库中已存在的跟踪代码与本体类型验证其可行性;文中不声称任何跟踪准确率数字(ADR-307 亦明确不主张任何精度指标)。
一、背景:为什么需要"持久身份",而不是"临时目标"
1.1 产品需求与硬约束
RuView 面向的是把普通 WiFi 信号变成实时空间智能的感知系统(ADR-282 确立了无摄像头定位)。但在家庭自动化、跌倒告警、存在检测等场景中,仅仅回答"现在有人"是不够的,还需要回答**"这一个人"随时间去了哪里**:
"person_7 进了厨房,然后到走廊,最后进了卧室。"
这要求系统跨无线电、跨模态、跨房间、跨时间地对持久实体进行推理。与此同时存在一条硬约束:绝不能建立公民身份。持久伪匿名轨迹永远不能变成——也不能被联接成——真实世界的具名个体。ADR-307 明确写道,这是一条"通过构造来强制(by construction)"的隐私属性,而不是写在脚注里的策略。
1.2 在 ADR-300 DAG 中的位置
ADR-307 是 ADR-300 感知子层程序(phase-2 21 原语规划)的子决策,属于phase 2原语,坐落在 phase 1 脊柱之上:
- 消费 ADR-306 本体:产出并更新该本体定义的
Track与Person节点类型; - 依赖 ADR-305 认证身份:它关联的观测必须具有可验证的起源(RF 溯源链);
- 输出受治理的
Event:这些事件由 ADR-318(能力证书)认证、ADR-319(见证链)见证。
值得注意的仓库现状:ADR-306 描述的世界图本体在当前工作树中由 v2/crates/ruview-ontology 承载。该 crate 已定义Person、Track、Sensor、Observation、Event、Zone等节点类型与Located边,其中:
- entity.rs 定义
Person { id: PersonId, ... }与Track { id: TrackId, person: Option<PersonId>, ... },Track的注释直接写明它是"ADR-307 持久轨迹,可选地解析为Person"; - id.rs 定义
PersonId(前缀person)与TrackId(前缀track),后者注释同样指向 ADR-307; - graph.rs 提供以
PersonId/TrackId为键的有序映射与add_person/add_track等图写入口。
也就是说,ADR-307 所约定的"Person作为持久实体、Track作为其时间片段"这一契约,在本体 crate 中已有类型化占位,是后续 phase-2 跟踪层的落点。
二、已存在的基座:wifi-densepose-mat跟踪子系统
ADR-307 反复强调一句原则:复用并扩展已有脚手架,而不是推倒重建。现成的基座位于 v2/crates/wifi-densepose-mat/src/tracking,该模块由四个协作部件构成(见 mod.rs 的模块文档):
| 部件 | 职责 | 关键 API |
|---|---|---|
SurvivorTracker | 聚合根,协调预测/关联/再识别/生命周期 | update(observations, dt_secs) -> AssociationResult |
TrackedSurvivor | 一条被跟踪实体及其全部状态 | id / survivor / kalman / fingerprint / lifecycle |
TrackId | 稳定轨迹标识,UUID 支撑 | new()、as_uuid() |
TrackLifecycle/TrackState | 生命周期状态机 | hit / miss / rescue / check_lost_expiry / can_reidentify |
KalmanState | 恒速 3D 位置滤波器 | predict / update / mahalanobis_distance_sq / position_uncertainty |
CsiFingerprint | 体征+位置指纹,用于信号丢失后再识别 | from_vitals / update_from_vitals / distance / matches |
TrackerConfig | 跟踪器行为参数 | 见下表默认值 |
DetectionObservation | 单个感知 tick 的一条检测 | position / vital_signs / confidence / zone_id |
AssociationResult | 一次 tick 的结果摘要 | matched / born / lost / reidentified / terminated / rescued |
模块文档给出了最小调用示例:
use wifi_densepose_mat::tracking::{SurvivorTracker, TrackerConfig, DetectionObservation}; let mut tracker = SurvivorTracker::with_defaults(); let observations = vec![]; // DetectionObservation instances from sensing pipeline let result = tracker.update(observations, 0.5); // dt = 0.5s (2 Hz) println!("Active survivors: {}", tracker.active_count());2.1 生命周期状态机与配置参数
lifecycle.rs 定义了五态生命周期:Tentative → Active → Lost → Terminated(另有操作员确认的终态Rescued)。其行为完全由TrackerConfig驱动,各字段默认值如下:
| 参数 | 类型 | 默认值 | 语义 |
|---|---|---|---|
birth_hits_required | u32 | 2 | 连续命中达到该次数,Tentative才晋升Active |
max_active_misses | u32 | 3 | Active连续丢帧达到该次数转入Lost |
max_lost_age_secs | f64 | 30.0 | Lost可被再识别的窗口(秒) |
reid_threshold | f32 | 0.35 | 指纹再识别距离阈值(≈典型室内匹配经验值) |
gate_mahalanobis_sq | f64 | 9.0 | 数据关联的马氏距离²门限,9.0 ≈ 3D 中的 3σ |
obs_noise_var | f64 | 2.25 | 卡尔曼量测噪声方差 σ²_obs(m²,即 1.5 m)² |
process_noise_var | f64 | 0.01 | 卡尔曼过程噪声方差 σ²_a((m/s²)²) |
测试用例完整覆盖了各转移路径:test_tentative_confirmation(2 次命中晋升)、test_tentative_miss_terminates(Tentative 一次 miss 即终止)、test_active_to_lost(3 次 miss 转 Lost)、test_lost_to_active_via_hit、test_lost_expiry与test_rescue。
2.2 核心更新算法:一个 tick 的八步流水
tracker.rs 把update组织为清晰的八步流水:
- Kalman 预测:对所有非终态轨道执行
kalman.predict(dt_secs); - 门限代价矩阵:轨道 × 观测构造代价矩阵,仅当观测带位置且马氏距离²小于
gate_mahalanobis_sq才记入代价,否则记f64::MAX; - 指派:目标数 ≤ 10 时用匈牙利(Kuhn–Munkres)最优指派,否则退化为贪心最近邻,见同文件
hungarian_assign/greedy_assign; 3b.纯体征匹配:无位置观测且该 zone 恰好只有一个活跃轨道时,用指纹距离做二次关联; - 再识别(Re-ID):未匹配观测与
Lost轨道按指纹距离匹配,命中则Lost → Active并回填位置/体征; - 新生(Birth):仍未匹配的观测生成新的
Tentative轨道; - 更新:对匹配对做 Kalman 位置更新、体征与指纹 EMA 更新;
- 生命周期转移:未匹配的活跃轨道
miss(),统计lost_track_ids/terminated_track_ids; - 清理:终止超过 60 s 的轨道被移除。
其中第 4 步正是 ADR-307 要"带衰减弱化复用"的再识别表面——当前实现通过lifecycle.can_reidentify(now, max_lost_age_secs)判定 Lost 轨道是否仍在再识别窗口内。
2.3 运动模型:恒速卡尔曼与马氏门限
kalman.rs 实现 3D 恒速模型:状态向量x = [px, py, pz, vx, vy, vz],量测只观测位置(H = [I₃ | 0₃])。两个值得留意的实现细节:
- 过程噪声矩阵 Q按分段恒加速度离散化构造:
Q = σ²·[[dt⁴/4·I₃, dt³/2·I₃],[dt³/2·I₃, dt²·I₃]]; - 马氏距离²门限
mahalanobis_distance_sq即(z−Hx)ᵀ·S⁻¹·(z−Hx),S = H·P·Hᵀ + R;当 S 奇异(退化几何)时返回f64::INFINITY,让关联天然拒绝该观测。
position_uncertainty()返回位置协方差前 3×3 块的迹(σ²px+σ²py+σ²pz),作为"位置已知程度"的标量度量——ADR-307 决策中"每次切换都携带置信度"正是建立在这类不确定性量之上。单元测试test_kalman_update_converges、test_mahalanobis_far_observation等验证了收敛性与门限行为。
2.4 外观/指纹通道:CsiFingerprint
fingerprint.rs 把CsiFingerprint定义为"体征+最近位置"的加权组合,用于轨迹连续性判断。距离度量是归一化加权欧氏距离,权重与归一化范围如下:
| 特征 | 权重 | 归一化范围 |
|---|---|---|
| 呼吸频率 | 0.40 | 30 bpm(典型 0–30 区间) |
| 呼吸幅度 | 0.25 | 1.0(已归一化到 [0,1]) |
| 心跳频率 | 0.20 | 80 bpm(40–120 跨度);缺失时权重按比例摊给其余特征 |
| 位置提示 | 0.15 | 20 m(典型房间尺度) |
指纹通过 EMA(alpha = 0.3)随观测滚动更新(update_from_vitals),并记录sample_count。distance < threshold(默认 0.35)即认为"同一个人"。这段代码就是 ADR-307 说"绝不变成长期生物特征模板"的那条指纹通道——它仅携带呼吸/心跳/近距位置这类短时程弱特征。
三、缺口分析:单节点跟踪器做不了什么
ADR-307 指出,已有跟踪器"今天只在节点/房间上下文内推理",缺三样东西:
- 跨无线电、跨模态、跨房间的连续性——
SurvivorTracker的 zone 概念是单节点/单房间粒度的; - 能扛过轨迹丢失与空间交接的"持久"实体——Lost 轨道 30 s 后即 Terminated(
max_lost_age_secs默认值),实体随之消亡; - 显式隐私边界——现有指纹与再识别逻辑没有在 schema 层面杜绝公民身份绑定。
四、候选方案与取舍
| 方案 | 结论 | 原因 |
|---|---|---|
| 逐房间独立跟踪器,不做跨房身份 | ❌ 拒绝 | 无法表达 "kitchen → hallway → bedroom",实体在每个房间边界丢失 |
| 基于强生物特征指纹的全局身份键 | ❌ 拒绝 | 足以跨长间隙再识别的强指纹趋向于公民级生物特征——正是隐私约束所禁止的 |
| 概率持久轨迹 + 有界、衰减的伪匿名关联,构建于现有 MAT 跟踪器之上 | ✅ 采纳 | 复用基座、隐私可控、可给出逐交接置信度 |
五、决策内容:三层设计
ADR-307 的决策是:把wifi-densepose-mat/tracking扩展为跨域持久轨迹层,产出 ADR-306 的Track/Person节点。
5.1 第一层:持久概率实体(Persistent probabilistic entity)
- 一个持久实体 = 一个伪匿名
Person节点,携带稳定合成 ID(如person_7),底层是现有 UUID 支撑的TrackId; - 该
Person在时间与空间上聚合一条或多条SurvivorTracker轨迹,持有的是概率性连续性信念——关联从不被断言为确定,每次交接都带置信度; - 跨越轨迹丢失间隙的连续性复用现有再识别表面(
can_reidentify、CsiFingerprint、AssociationResult),但新增时间与距离双重衰减的关联先验:"同一实体"的置信度随间隙增大而下降; - 有界视界:超过有界视界后放弃关联,铸造新伪名而不是强行合并——低关联(under-linking)是隐私安全的失败模式。
这与本体 crate 的类型结构一一对应:Track.person: Option<PersonId>允许一条轨迹"尚未解析到 Person",而多条Track可指向同一个PersonId,正是"聚合多条轨道为一个持久伪名"的图表达。
5.2 第二层:跨无线电 / 跨模态 / 跨房间连续性
- 关联在 ADR-306 本体图上进行:来自多个
Sensor的Observes边与AdjacentTo/Doorway拓扑约束限定合理的交接(一个人只能移动到相邻空间); - 现有
mahalanobis_distance_sq门限从"单节点检测"扩展到"跨模态融合观测"; - 此处融合是轨迹级关联:底层多模态融合(ADR-063 雷达/mmWave、ADR-029 多基地、ADR-311 真实传感器融合)负责供给观测;本 ADR 依赖它们提供原始跨模态证据,不重新实现传感器融合。
5.3 第三层:隐私边界(by construction)
三条构造性保证构成隐私边界:
- 无公民身份绑定:持久 ID 是合成伪名,类型上不存在任何字段、边或连接键指向姓名、账号、电话、MAC 或其他公民标识符——绑定在 schema 层面不可能发生,而不只是"不被鼓励";
- 有界且衰减的
CsiFingerprint:指纹仅用于短时程连续性,不作为长期生物模板持久化,且会过期。这让再识别对"同一个人穿过走廊"有用,而在结构上无法回答"这就是上个月来过的同一个人"; - 全程证据纪律:每个
Track/Person/Event都携带SemanticProvenance与EvidenceLevel(ADR-282 的 L0–L5),遵守 ADR-277/ADR-280 的边缘治理与 ADR-141 证明。伪匿名轨迹仍然是受治理的 P 类数据;跟踪精度是逐领域声明,必须打上 MEASURED/CLAIMED/SYNTHETIC 标签并附复现者——本 ADR 自身不主张任何精度数字。
六、后果与权衡
- RuView 可在保持无摄像头、无公民身份的前提下,为自动化与分析表达持久的跨房间轨迹;
- 隐私安全失败模式是低关联(不确定就铸造新伪名),这会使轨迹在长间隙或稀疏覆盖下碎片化——碎片化伪名是安全的,错误的公民身份合并则不是,这是一个刻意的取舍;
- 扩展而非分叉现有跟踪器:单房间单无线电部署保持现有行为(一个实体 = 一条轨迹);
- 跨模态质量依赖 ADR-311/ADR-063/ADR-029 落地;在那之前,连续性以 WiFi 为主,其局限被明说而不隐藏;
- 作为 phase-2 设计意图,本 ADR 会随 ADR-306 本体与 ADR-305 身份脊柱定型而修订。
七、验证与验收路径
ADR-307 的 Validation 章节规划了三类验收:
| 验证层 | 手段 | 目标 |
|---|---|---|
单元测试(cargo test -p wifi-densepose-mat) | 衰减关联先验;拓扑约束交接;schema 检查 | 置信度随间隙下降、超视界丢弃并铸造新伪名;非相邻空间无法关联;Person/Track无公民标识字段 |
| 集成测试 | 合成多房间多无线电场景 | 脚本化行走 kitchen → hallway → bedroom 得到一个持久伪名且带逐交接置信度;刻意制造的歧义交汇得到两个伪名而非错误合并 |
| 证据纪律 + 隐私评审 | ADR-291 无泄漏协议与证据标签;显式检查清单 | 任何跟踪连续性精度只能按协议与标签报告;pilot 前确认无长期生物特征模板、无公民身份连接路径 |
可以与之对应的实现侧依据是:当前 tracking crate 的测试已覆盖生命周期转移、Kalman 收敛/门限、指纹自距离/阈值/EMA 更新等原子行为(tracker.rs 的#[cfg(test)]模块、lifecycle.rs、kalman.rs、fingerprint.rs),而"无公民标识字段"的 schema 约束已由 entity.rs 中Person/Track的字段集体现(目前仅含id、located_in、person、位置与不确定度等空间字段,无任何公民字段)。
结语:给后续实现者的三个抓手
- 复用点:不要重写跟踪器。
SurvivorTracker.update的八步流水、KalmanState的马氏门限、CsiFingerprint的 EMA 指纹就是 phase-2 概率关联的原料; - 落点:持久实体写入
ruview-ontology的Person/Track图节点(add_person/add_track),而不是再造 schema; - 红线:任何新字段不得引入公民标识连接键;指纹必须保持有界、衰减、可过期;连续性的精度数字只能带 ADR-291 协议与证据标签出现——这条红线是 ADR-307 的全部意义所在。
【免费下载链接】RuViewπ RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.项目地址: https://gitcode.com/GitHub_Trending/wi/RuView
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考