RuView 主动感知与可编程感知控制面:基于 ADR-280 的 SensingTask、AoI 调度与受治理执行的完整实现解析
【免费下载链接】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-280 为核心骨架,剖析其从「被动感知」转向「可编程感知(programmable perception)」的完整技术方案。你将看到:一个证据感知型传感任务(SensingTask)、带隐私上限的传感动作(SensingAction)、基于信息年龄(age-of-information)的空间刷新调度器、在时间/相位/几何三重校验下 fail-closed 的相干分布式孔径融合门、被当作受治理执行器对待的可编程射频环境(RIS/可动天线),以及经过泄漏校验的任务充分表示(TaskSufficientRepresentation)。读完后,你能掌握这套控制面的每个契约在 v2/crates/ruview-unified/src/control.rs 中的真实字段、校验分支与对应测试,并能解释它为何与 ETSI ISAC 数据面词汇对齐。
一、从被动感知到可编程感知:要解决的问题
ADR-280 所记录的核心转变,不是“再修一个感知算法”,而是把「感知什么、何时感知、用什么模态、以多高保真度感知」本身变成系统的可控决策:系统自主选择感知动作去消解不确定性,必要时通过改变射频环境或移动感知 Agent 来主动获取证据。与之同时,文档点名了新兴系统里最典型的一类失败模式——隐藏的同步与标定依赖:共享时钟、已知天线姿态、稳定相位被静默假设,一旦被打破就自信地给出错误结论。ADR-280 的立场是:这两件事都必须归属控制面,且在捕获开始之前、以 fail-closed 的方式处理。
这条设计线属于 RuView v2「统一射频空间世界模型」决策族:本 ADR 的父级是 ADR-273,它扩展 ADR-277(边缘感知控制面,本 ADR 中的每个契约都与之组合),隐私类 P0–P5 复用 ADR-262 的阶梯定义,而 ADR-148 所描述的ruview-swarm移动 Agent 则是感知动作的消费方。实现集中在 v2 workspace 的ruview-unifiedcrate,类型导出见 lib.rs(pub mod control;)。
二、证据纪律(PROOF discipline):每个断言都是一个具名测试
ADR-280 继承了 ADR-273 §0 的证据分级体系。文档明确把 ESI-Bench 的 act-to-uncover 形式化、LuLIS 的 256 相干射频链分布式孔径、ETSI 的 cooperative-ISAC 与 AI/数据处理工作项、信息年龄数字孪生调度、语义/任务充分通信架构等全部归为 EXTERNAL-UNVERIFIED(外部未验证)——它们只能作为设计动机,不能被当作本项目结果。反过来,文档要求:任何关于“我们自己行为”的断言都必须是一个具名测试。这个纪律直接决定了本文后续每个结论都可以回溯到 control.rs 内嵌测试模块中的具体#[test],以及 e2e_acceptance.rs 与 security_boundaries.rs 两条端到端/边界套件。
三、证据感知型传感任务(SensingTask):在捕获之前就完成准入
3.1 契约字段
SensingTask(control.rs)是一个采用 ETSI ISAC 词汇的证据感知任务契约,覆盖:目的(purpose)、目标区域(target_area: SpatialZone)、可用模态(modalities: Vec<RfModality>)、请求空间分辨率、延迟上限、最低置信度、raw 与 result 保留时间、授权消费者、同意引用(consent reference)。其关键设计是:这些约束在捕获开始前被强制执行,而不是事后作为元数据附加。
从字段可以看出它的“证据感知”含义:minimum_confidence: f64规定了置信度下限,低于该下限的结果将变成“不作决策(no decision)”;raw_retention_seconds与result_retention_seconds分别约束 P0 级原始数据与结果的本地保留窗口;authorized_consumers声明哪些主体可以消费结果;consent_reference则在目的需要时承载同意凭证。
3.2 模态枚举
任务的modalities直接使用 crate 级统一模态枚举RfModality(定义于 tensor.rs),包括WifiCsi(802.11 每子载波频响)、WifiCir(时延域信道冲激响应)、WifiBfReport(802.11 波束成形反馈)、CellularSrs(5G NR 上行探测参考信号,O-RAN ISAC 路径)、FmcwRadar/FmcwRangeAzimuth/FmcwDopplerAzimuth、UwbCir、BleCs(蓝牙信道探测),以及Synthetic(ADR-276 合成世界产物,必须带诚实标签)。这说明SensingTask并不是 WiFi 专用契约,而是多模态感知的统一准入入口。
3.3 admit_task:fail-closed 准入函数
admit_task(control.rs)是任务的唯一准入入口,与 ADR-277 的PolicyEngine组合,所有分支一律拒绝优先。其校验顺序与规则值得逐条记录:
- raw 导出字段存在但永远被拒绝:
raw_export_allowed字段保留在契约中仅为 ISAC 词汇兼容,但一旦为true直接返回PolicyDenied——因为 ADR-277 §2.1 通过类型结构(raw RF 不可表示,只有BoundedEvent可导出)已经封死了 raw 导出的可能,配置文件开关不能重新打开它。 - 输入合理性校验:
minimum_confidence必须有限且在[0,1];requested_resolution_m必须有限且大于 0;maximum_latency_ms必须大于 0;modalities至少声明一个模态。 - 身份目的双重门槛:当
purpose == SensingPurpose::IdentityRecognition且没有consent_reference时,在进入区域检查之前就被拒绝(engine.authorize尚未执行)。 - 最终交给策略引擎:
engine.authorize(&task.target_area.id, task.purpose),即未知区域、未授权目的均在此被拒绝。
测试task_admission_is_fail_closed(control.rs)验证了全部四条路径:合法 Presence 任务通过;任何 raw_export=true 被拒;区域未授予的目的被拒;Identity 无同意被拒。注意测试夹具中给出了一个可复现的合法任务模板(control.rs):分辨率 0.5 m、延迟上限 100 ms、最低置信度 0.8、raw 保留 60 s、result 保留 3600 s、消费者ha-bridge——可作为集成方构造任务时的取值参考。
四、感知动作(SensingAction)与信息目标(InformationGoal)
动作被定义为一类针对明确假设的、刻意的取证行为。文档给出的典型假设表述是:“东侧走廊里有一个人静止站立,或两个人距离很近”。ADR-280 对动作的界定是:它必须受延迟、能量约束,并且被一个**隐私上限(privacy ceiling,即 P0–P5 阶梯)**所限制。
对应实现中,InformationGoal(control.rs)携带:人类可读的hypothesis、当前不确定性current_uncertainty([0,1])、目标不确定性target_uncertainty(必须低于当前值)、以及期望信息增益expected_information_gain(启发式单位)。SensingAction(control.rs)在目标之上补充:目标区域target_region、要用的模态modality、延迟预算maximum_latency_ms、能量预算energy_budget_j(焦耳),以及本动作允许产出的最高隐私类privacy_ceiling。动作正是规划器(下文第五节)、MetaHarness Agent、以及 swarm 无人机共同消费的统一“取证请求”形态。
五、信息年龄调度器(ActiveSensingPlanner):刷新“旧的”,而不是“全部的”
5.1 空间孪生何时知道自己过时了
一个空间孪生只有知道自己哪些部分过期了才真正有用。对每个区域,SpatialStateFreshness(control.rs)维护五类状态:最近观测时间last_observed_ns、期望变化率expected_change_rate、不确定度增长率uncertainty_growth_rate(每秒)、业务关键度权重business_criticality、以及感知该区域的成本sensing_cost。
代码层还提供了两个#[must_use]计算函数:
uncertainty_at(now_ns)(control.rs):按uncertainty_growth_rate × 龄期累积不确定度并封顶在 1.0;priority(now_ns)(control.rs):即 ADR 文档中的核心调度公式:
priority = uncertainty(age) × change_rate × criticality ÷ cost其中uncertainty(age)正是由增长率与龄期累积而来(代码分母对sensing_cost取max(1e-9)防除零)。
5.2 规划器每周期只发射“最高优先且超过阈值”的动作
ActiveSensingPlanner(control.rs)暴露:priority_threshold(低于此优先级不值得在本周期感知)、upsert_region(注册/替换区域)、mark_observed(将某区域置为刚被观测),以及核心的next_action(now_ns, modality)——它遍历所有区域,过滤掉低于阈值的项,选出最高优先级者,产出具体SensingAction;若没有值得感知的区域则返回None(每周期至多一个动作)。生成的SensingAction以aoi-<region>-<now>命名,并自动把privacy_ceiling设为 P2(匿名存在/占用级别),可见规划器产出的动作本身就带有隐私上限的约束。
5.3 两个可复现的测量/排序测试
ADR-280 特意区分“架构估算”与“实测”:
- 排序正确性由
planner_prioritizes_stale_critical_regions(control.rs)单独证明:三个区域(emergency-exit 高变化率高关键度、server-room 中等等、storage 低等),在同样 10 秒陈旧度下,最高优先级是 emergency-exit;观察它之后下一个被选中的是 server-room。 - 流量削减 ≥70% 门禁由
planner_reduces_sensing_traffic_versus_uniform_refresh(control.rs)度量:20 个区域、100 个调度 tick、只有一个 hot 区域(变化率 1.0、关键度 5.0),其余为冷区域。均匀刷新需要 20×100=2000 次观测,而 AoI 规划器只对 hot 区域持续感知,仿真得到100 次观测、约 95% 的感知流量削减(100/2000),同时 hot 区域保持被观测;测试的硬性断言是削减率≥ 70%。文档特别提醒:这一数字来自合成场景测量,对“变化有多集中”敏感,不可简单外推。
这也印证了 ADR-280 状态栏中“含一个已测量的 ≥70% 流量削减门禁”的说法,其完整证据链都在该内嵌测试内。
六、相干分布式孔径:融合之前先证明兼容性,否则降级为不相干处理
这是针对“隐藏同步/标定依赖”失败模式的直接解药。CoherentSensorGroup(control.rs)的立场是:除非一个组能够证明彼此兼容,否则不允许相干融合。组成员必须逐一满足:
- 每个成员都必须上报其同步状态(
MemberSyncState,含member_id、相对组基准的时钟误差time_error_ns、相位误差phase_error_rad、以及标定基线几何的哈希geometry_hash); - 时钟误差与相位误差必须落在组的容差范围内(
maximum_time_error_ns、maximum_phase_error_rad); - 几何哈希必须与组的
baseline_geometry_hash一致; - 未知上报者同样被拒绝(即使合法成员全部通过,混入的非成员也导致整体拒绝)。
can_fuse返回带类型错误的Result,对NaN/±inf也做了防护。测试coherent_fusion_fails_closed(control.rs)精确枚举了文档所称的五条拒绝路径:缺员(少报一个成员)、时钟漂移(400 ns 超过 50 ns 容差)、相位漂移(1.0 rad 超过 0.2 rad)、几何在标定后发生变化(哈希从0xBEEF变为0xDEAD)、非成员注入。文档指出,这正是建筑级 WiFi 孔径(即 LuLIS 方向)的安全网:同步条件不满足时系统退化为不相干处理,而不是输出“自信的胡话”。
七、可编程射频环境 = 受治理的执行器
RIS、可移动天线、流体天线改变的是“哪些房间和人可被观测”,因此其状态变更必须像感知一样受治理。实现分为三块:
ActuatorKind(control.rs):Ris、MovableAntenna、FluidAntenna。FieldActuator(control.rs):记录actuator_id、类型、建筑系下的位姿pose_m、支持的状态集supported_states: Vec<String>、以及被它改变可观测性的affected_zone_id。request_actuation(control.rs)是获得ActuationReceipt的唯一途径(ActuationReceipt没有公开构造器,见 control.rs)。它校验两层:执行器确实支持该状态,且受影响区域在 ADR-277 引擎下授予了该目的。这样,每一笔改变可观测性的执行(比如为一个未获授权的目的去转向波束)都会被策略引擎拒绝并留下审计轨迹。
审计收据ActuationReceipt携带requested_state/applied_state、应用时间applied_ns、控制器身份controller_id、授权目的purpose——这正是 RIS 治理所需的“请求了什么、实际应用了什么、何时、谁、为何”的审计要求。测试actuation_requires_policy_authorization(control.rs)验证:受权目的 + 支持的状态 → 返回收据;不支持的状态(如对只支持beam-east/beam-west的 RIS 请求beam-up)→ 拒绝;目的未在受影响区域授予(用 Vitals 请求 Presence 场景的转向)→ 拒绝。
八、任务充分表示:语义压缩必须通过泄漏校验
“传输占用不确定性,而不是传输 CSI”这类语义压缩要成立,前提是压缩必须保持任务作用域(task-scoped):足以支撑匿名占用的表示,不能偷偷保留身份信息。TaskSufficientRepresentation(control.rs)携带:task_id、源帧的source_receipts(血缘)、压缩后的semantic_state、声明的信息界information_bound_bits、显式排除的信息类别列表excluded_information(如"identity"、"vitals"、"trajectory-history"),以及表示的隐私类privacy_class。
validate_representation(control.rs)按目的实施隐私类上限 + 必须排除项的双重强制,这张表是使用本模块时最需要对照的:
| 目的(SensingPurpose) | 隐私类上限 | 必须显式排除的信息类 |
|---|---|---|
Presence/ChannelDiagnostics | ≤ P2 | identity、vitals |
Activity/Localization | ≤ P3 | identity |
Vitals/PoseTracking | ≤ P4 | identity |
IdentityRecognition | = P5(最高级) | 无强制排除项 |
任何表示只要privacy_class > ceiling、遗漏了必须排除的信息类、或source_receipts为空(无血缘的孤儿表示),都会被返回带类型的策略错误。这里可以看到 P0–P5 阶梯(定义见 control.rs)的完整含义:P0 为 raw 信号(永不离开信任边界)、P1 为高度聚合非个人信息、P2 为匿名存在/占用级、P3 为行为推断级、P4 为派生个人推断级、P5 为身份绑定级。
测试覆盖很完整:task_sufficient_representation_is_leakage_checked(control.rs)验证 Presence 场景下“正确排除→通过 / 忘排除 identity→拒绝 / 超过 P2 上限→拒绝 / 无血缘→拒绝”;而task_sufficient_representation_covers_every_purpose_branch(control.rs)专门补齐了其余目的分支(Activity/Localization 的 P3、Vitals/PoseTracking 的 P4、IdentityRecognition 的 P5),防止某个分支的缺陷在测试盲区中潜伏。
九、与 ADR-277 策略引擎的边界分工
本 ADR 的多数准入/授权最终都落到 policy.rs 的PolicyEngine。理解分工有助于正确组合两个 ADR:SensingPurpose枚举(policy.rs:Presence/Activity/Vitals/Localization/PoseTracking/IdentityRecognition/ChannelDiagnostics)是两者的共享词汇;PrivacyZone声明区域授予的目的集、事件保留时长retention_s、以及身份的显式启用开关identity_explicitly_enabled;engine.authorize(policy.rs)对未知区域、未授权目的、以及“未显式启用”的身份识别一律拒绝。
需要强调的边界规则是:ADR-277 §2.1 已把 raw RF 导出做成类型上不可表示——唯一可导出类型BoundedEvent只承载类型化判定(Presence/ActivityClass/RespirationBpm/Location/AnomalyScore),没有任何变体能携带 RF 样本,TrustBoundary::export是唯一出口,且没有序列化RfTensor的对外 API。因此本 ADR 中raw_export_allowed字段的“永远拒绝”不是靠一张配置表,而是与结构层面的不可表示性共同闭合。身份同时被双重门槛保护:必须在区域allowed_purposes里且必须identity_explicitly_enabled=true。
十、标准对齐与开放性
ADR-280 把“词汇对齐”称为最强的战略接缝:本文出现的 sensing task/service/entity、measurement configuration、sensing data/result/consumer/purpose、retention、result exposure 等,刻意采用新兴 ETSI ISAC 数据面词汇,使本 crate 有望成为 ISAC 数据处理的开放参考实现候选,而非又一套并行方言。因此在使用本模块时,尽量沿用这些标准术语来命名业务对象。文档同时明确:充电/移动性管理(charging/mobility management)在出现蜂窝部署之前明确不在范围之内——这也是无需在契约中预留相关字段的原因。
十一、后果与诚实的未实现范围
实现带来的可验证后果:
- MetaHarness/OaK 风格的 Agent 获得了一个类型化表面:读新鲜度(freshness)、规划动作、接收收据——空间记忆与 Agent 规划在此汇合,而无需触碰 raw RF;
- P4+ 级别的分布式孔径工作直接继承了一道已经 fail-closed 的融合门;
- 端到端验收管线(e2e_acceptance.rs)确认“每个导出的输出都携带不确定度、来源、模型版本与目的,并且只经由策略信任边界离开”;边界加硬套件(security_boundaries.rs)则用 proptest 对任意值(含经
f64::from_bits走私的 NaN/±inf)驱动每个校验构造器与授权门,断言“合法对象或带类型错误,绝不 panic、绝不宽松默认”。
ADR-280 同时诚实记录了三项未实现内容,使用本模块时不应假设它们存在:
- 信息增益(information gain)的估算由调用方提供——规划器当前使用的是陈旧度启发式,而非互信息;
- RIS 驱动、真实的多 AP 相干性测量属于硬件相关路线图项;
- OTFS 波形控制同样属于未来路线图。
如需在仓库内复现上述测试与基准,可进入 v2 workspace 执行cargo test -p ruview-unified(单元与验收测试)与cargo bench -p ruview-unified(criterion 基准,见 unified_bench.rs)。控制面实现与 7 个内嵌测试全部位于 control.rs,与本 ADR 章节一一对应,可作为逐条核对设计的唯一事实来源。
【免费下载链接】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),仅供参考