首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >楼层判定不是一次定位就完就完卡尔曼滤波与多假设跟踪

楼层判定不是一次定位就完就完卡尔曼滤波与多假设跟踪

原创
作者头像
AOVEE
发布于 2026-11-10 12:02:52
发布于 2026-11-10 12:02:52
120
举报

封面图

楼层判定不是一次定位就完事:卡尔曼滤波与多假设跟踪

很多刚做楼层定位的团队,把"判楼层"想得太简单:测到信号,取个最近的楼层,完事。真上线才发现,人在楼层交界处来回走,定位在两层之间反复横跳;进电梯信号一断,出来直接被丢到隔壁层;系统明明知道他在 3 楼,却因为一次抖动报成 4 楼,围栏和考勤跟着全错。楼层判定本质上不是一次定位,而是一个持续的状态估计问题。这篇文章讲两套工程上真正用得上的工具:卡尔曼滤波和多假设跟踪。

问题定义:为什么"取最近层"会翻车

楼层不是连续的平面,它是带边界的离散状态。人大多数时间在某一层内部活动,只在楼梯和电梯里发生层间转移。一个朴素的"最近层"算法,把每一次带噪声的测量直接映射成楼层,等于假设测量永远准、转移永远瞬时。现实里这两点都不成立。

第一,测量有噪声。气压计有量化噪声和温漂,蓝牙信标有多径衰落,任何单次读数都可能在楼层边界附近给出错误的一侧。直接取最近层,等于把这些噪声原封不动变成楼层跳变。第二,转移有过程。人进电梯,信号会衰减甚至丢失,出电梯时第一帧测量往往不可靠,这时硬判层必错。第三,业务要的是"稳定状态"而非"瞬时猜测"。围栏报警、楼层停留统计都依赖一个平滑、可信的楼层状态,而不是每帧都在抖的猜测值。

所以楼层判定真正要输出的,是一个经过估计、抗噪、并且能和转移过程对齐的楼层状态序列,而不是一串孤立的测量值。

技术原理:把楼层当成一条会动的状态

卡尔曼滤波适合这里,因为它干的就是一件事:用带噪声的测量,估计一个随时间演化的状态。我们把楼层状态建模成两个量——当前楼层(离散或量化后的连续高度)和垂直速度(爬楼/乘梯的速率)。预测步用"上一帧状态 + 速度 × 时间"推出这一帧大概在哪;更新步用新的气压或信标测量去修正这个预测。噪声大的测量,滤波给的权重低;噪声小、且和预测一致,权重高。

类比:楼层状态像你脑子里对"同事在几楼"的判断。他上一秒在 3 楼、没动,你不会因为他工牌信号抖了一下就改口说他在 4 楼;只有当连续几帧都指向 4 楼,你才更新判断。卡尔曼滤波就是把这种"相信趋势、怀疑单次异常"的直觉数学化,输出一个既跟测量走、又不被单次噪声带偏的估计。

多假设跟踪解决的是另一种麻烦:当转移过程本身不确定时,不要急着下结论。人在电梯口犹豫、信号时断时续,系统可能同时面对"他在 3 楼"和"他已到 4 楼"两种都成立的可能。多假设跟踪的做法是,在不确定期间同时维护多条候选状态(每条带自己的概率或得分),等后续测量给出足够证据,再合并或剪枝,只留一条。它避免了"过早锁定错误楼层"导致的硬伤。

原理链路见配图:原始测量 → 卡尔曼预测/更新(平滑楼层状态)→ 多假设分支与剪枝 → 稳定楼层状态输出。

图1:楼层定位状态估计链路。带噪测量先经卡尔曼滤波平滑出楼层状态,转移不确定时由多假设跟踪并行维护候选,证据充分后收敛为稳定楼层状态,供围栏与统计消费。

方案对比:三种楼层判定策略

直接取最近层、卡尔曼平滑、多假设跟踪,是三层递进的判定策略,复杂度和抗错能力同步上升。

表1:三种楼层判定策略对比(均为工程量级描述,具体数值以厂商资料为准)

表里"抗转移中断"一栏,卡尔曼标的是"中",因为它仍假设存在一个最优状态,遇到长时间信号黑洞仍可能跟丢;多假设跟踪因为保留了候选,恢复信号后能更快回到正确楼层。具体用哪层,看你的场景里电梯和信号盲区多不多。

技术细节:滤波和跟踪真正难的地方

卡尔曼的状态建模要贴合物理,别套教科书模板。楼层场景下,垂直速度不是恒定的,爬楼、乘梯、静止三种模式速度分布完全不同。一个做法是用一个模式变量区分这三种运动,分别对应不同的过程噪声:静止时过程噪声极小(相信他不动),乘梯时较大(相信他在快速移动)。这套"交互式多模型"的思路,比单一恒定速度模型稳得多。模式切换的判定,可以借助 IMU 的加速度特征,具体阈值以厂商资料为准。

多假设跟踪的剪枝策略决定性能和成本的平衡。候选分支不能无限生,否则算力和内存都爆。经验做法是给每条假设一个得分(比如基于测量似然),得分低于阈值的直接剪掉,只保留前几名。还要设置合并条件:当两条假设收敛到同一楼层,合并成一条,避免冗余。分支数量和剪枝阈值,以厂商资料为准,原则是"在转移不确定窗口内留够候选,证据一来立刻收口"。

电梯黑体效应要专门处理。金属轿厢对蓝牙、UWB 都是天然屏蔽,进电梯后测量质量骤降。正确做法是:检测到进入电梯(信号强度陡降 + IMU 出现持续垂直加速度),主动切换到"盲推"模式——用 IMU 积分估算层间位移,同时挂起信标判层,出电梯第一帧不急着判,先用几帧确认。盲目在电梯里硬判,是楼层错层最常见的来源。

楼层边界的迟滞要做。人在两层交界处来回,测量在边界两侧摆动,朴素算法会疯狂跳层。解决是加迟滞:离开当前楼层必须累积足够的"反向证据"才切换,避免一两次边界抖动就改判。这点和卡尔曼的预测-更新天然契合,把过程噪声调好,迟滞自然出来。

输出要给业务一个"可信度",而不是一个裸楼层。围栏报警、停留统计最好拿到"楼层 + 置信度",低置信时宁可暂不触发关键动作,等状态收敛。很多误报警,根因就是系统把低置信的瞬时猜测当成了确定事实。

交互式多模型与电梯盲推的实现细节

前面提到用模式变量区分静止、爬楼、乘梯,落地时一般走交互式多模型(IMM)。它给每种运动模式各维护一个卡尔曼滤波器,每个滤波器用自己的过程噪声:静止模式的噪声极小,相信人不动;乘梯模式的噪声大,相信人在快速升降。各滤波器并行跑,再按"谁更贴合最新测量"分配权重,融合出最终状态。人从走到乘梯的瞬间,乘梯滤波器的权重迅速涨上来,楼层估计也跟着平滑过渡,不会硬跳。

电梯盲推是 IMM 里最考验细节的环节。进轿厢后,无线电测量质量骤降,这时让"乘梯模式"滤波器接管,用 IMU 的垂向加速度做二次积分,估算这段时间的层间位移。难点在零偏漂移:IMU 静止时也有微小零偏,积分几十秒就能漂出一层。工程上用进入电梯前的静止段先估计零偏并扣除,再用轿厢启停的加减速特征做边界校正。盲推只给"相对上升了几层"这种粗结果,出电梯后立刻交回信标或气压做绝对校核,二者对齐才确认楼层。具体积分窗口与零偏估计方法以厂商资料为准。

置信度怎么定义,直接决定业务敢不敢采信。一个简单可用的做法是看"主假设得分相对次假设的领先幅度":领先够大,置信度高;两者咬得很紧,说明还在模糊区,输出低置信标记。围栏报警这类关键动作,最好设一个置信门槛,低于门槛就暂缓触发,等状态收敛。很多误报警,根因就是把低置信的瞬时猜测当成了确定事实。

落地清单:状态估计该调到什么程度

先判断场景里转移有多频繁。纯办公楼层、少电梯,卡尔曼平滑基本够用;电梯密集、信号盲区多、且错层会触发关键报警,才上多假设跟踪。别为技术完整度强行上全套。

再定运动模式与过程噪声。静止、爬楼、乘梯三种模式的过程噪声要拉开档次,噪声调错了,滤波要么过度平滑掉真实转移,要么对噪声过于敏感。参数建议实测标定,不要抄教科书默认值。

然后处理电梯黑体效应。明确"进电梯→切盲推→出电梯→绝对校核"的完整状态机,别在轿厢里硬判层。这是楼层错层最常见的单一来源。

最后给业务留置信度。楼层输出带上可信度,关键动作按置信门槛触发,把"估计"和"猜测"在系统层面区分开。

状态估计这层加得好,无线电可以省一档精度;加得不好,再贵的无线电也救不了反复横跳的楼层。

调试时有个常被忽略的对照实验:拿同一段真实轨迹,分别用"直接取最近层"和"卡尔曼加多假设"跑两遍,统计错层次数。多数项目做完这个对比才发现,朴素算法在电梯和边界处的错层率能比估计方案高一个数量级,而平时两者看起来差不多——问题都藏在转移过程里。这个实验不花成本,却能在选型时给你硬证据,避免凭感觉拍板。把错层率当成楼层判定的一等指标来盯,比盯着静态精度更有意义。

局限与边界

卡尔曼和多假设都不是银弹。第一,它们依赖合理的运动模型和噪声参数,参数没调好,滤波反而会"平滑"掉真实的快速转移,让人乘梯时楼层反应迟钝。第二,多假设跟踪在极端长盲区(比如电梯故障被困半小时)下,候选可能全部失效或全错,这时需要外部手段(如楼层按钮信号、信标兜底)介入。第三,这两套方法处理的是"楼层状态"这一层,水平位置仍由各无线电技术负责,别指望状态估计能补平面定位的短板。

还有一个现实边界:状态估计越精细,调试越费人。小项目上卡尔曼平滑通常够用,多假设跟踪只在电梯密集、信号极差的关键区域才划算。别为了"技术完整"上全套,按痛点选型。

结论

楼层判定不是一次定位,而是一个持续的状态估计。卡尔曼滤波负责把带噪测量平滑成可信的楼层状态,多假设跟踪负责在转移不确定时留住多种可能、避免过早锁错。给工程师一个判断标准:如果你的系统里电梯多、信号盲区多、且错层会触发关键报警,就上多假设跟踪;如果只是普通办公楼层、转移简单,卡尔曼平滑足矣。

一句话收束:楼层定位的精度,不只来自无线电,也来自你把"一次猜测"变成"一个估计"的那套状态逻辑。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 问题定义:为什么"取最近层"会翻车
  • 技术原理:把楼层当成一条会动的状态
  • 方案对比:三种楼层判定策略
  • 技术细节:滤波和跟踪真正难的地方
  • 交互式多模型与电梯盲推的实现细节
  • 落地清单:状态估计该调到什么程度
  • 局限与边界
  • 结论
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档