上个月在商场找洗手间,手机里的地图指针直接“躺平”,GPS 信号在室内被钢筋混凝土收拾得服服帖帖,显示位置离真实位置差了十几米。这不是手机硬件的问题,是室内环境对卫星信号天然不友好。回公司我决定把这个场景做成一个正经项目:基于 Wi-Fi 的室内定位系统。整套做下来,从原理验证到 Demo 跑通用了三周,位置误差稳定在 2 到 3 米,足够支撑楼层内导航、人员定位一类的应用。这篇文章把整个项目的选型思路、定位原理、环境搭建、算法实现和调优过程从头到尾拆开讲,包括我在 Ubuntu 环境下搭采集链路时遇到的“没有 Wi-Fi”问题,以及在测试 Wi-Fi Direct 无线投屏功能时碰到的信号干扰现象。如果你正准备做类似的东西,这篇文章至少能帮你省下一周试错时间。
1. 我为什么选了 Wi-Fi 而不是其他室内定位技术
1.1 室内定位的候选技术:一次把账算清楚
室内定位这件事,可选的无线技术并不少,但每种技术都有明显的取舍。我先把当时调研时拉出来的对比表放在这里,后面解释我为什么最终押注 Wi-Fi。
| 技术方案 | 定位精度 | 基础设施成本 | 终端兼容性 | 主要坑点 |
|---|---|---|---|---|
| 蓝牙 Beacon | 1~3 米 | 中等(需部署信标) | 手机普遍支持 | 电池维护、部署密度要求高 |
| UWB | 0.1~0.5 米 | 高(硬件贵) | 仅新机型支持 | 芯片成本高,普及率低 |
| 红外 | 1~2 米 | 高(需视距) | 需专用设备 | 怕遮挡,几乎只适用于会议室 |
| 地磁 | 2~5 米 | 极低(零部署) | 手机普遍支持 | 受钢筋结构干扰大,前期采集费劲 |
| Wi-Fi | 2~5 米 | 极低(复用存量AP) | 手机、电脑、IoT全部支持 | 信号易受环境变化影响 |
单看精度,UWB 确实碾压全场,但它的成本也碾压钱包。对于商场、办公楼、停车场这类已经铺了大量无线 AP 的存量场景,Wi-Fi 的方案意味着你不需要额外部署任何硬件,只需要用软件层面的指纹采集和算法处理,就能在现成网络基础之上实现米级定位。这笔账算下来,Wi-Fi 的机会成本几乎为零。
地磁方案零部署确实诱人,但地磁场在钢筋密集区域会发生剧烈变形,这种变形在不同楼层的特征差异又不够明显,楼层判断经常出错。我当时拿手机在办公楼里测过一版地磁定位,走到电梯井附近误差直接飘到 8 米开外,最后放弃。蓝牙 Beacon 需要买设备、装电池、定期巡检,维护成本是持续性的,对个人开发者和小团队来说不算友好。
1.2 我最终选 Wi-Fi 的三个硬理由
第一个理由是基础设施复用。办公楼、医院、学校、商场这些室内场景,Wi-Fi 覆盖率已经接近百分之百。做定位系统时,每一个在用的 AP 都是天然的定位信标,不需要额外的硬件投入,也不需要跟物业反复沟通设备的取电和安装位置。
第二个理由是终端兼容性。Wi-Fi 是几乎所有智能设备的基础通信能力,手机、平板、笔记本、扫地机器人、AGV 小车,全都有 Wi-Fi 模块。这就意味着定位能力可以在不改造硬件的前提下覆盖到大量设备类别。做项目的人都懂,终端兼容性决定了一个方案能走多远。
第三个理由是调试可视化程度高。Wi-Fi 的信号强度 RSSI 可以通过系统命令和 SDK 直接读出来,数据可采集、可记录、可回放。相比红外、蓝牙这些只能通过厂商 SDK 间接拿数据的方案,Wi-Fi 的调试链路非常透明。这个特性在我后面排查问题的时候帮了大忙,我可以把原始信号拉出来画图,一眼看出是哪几个 AP 在搞鬼。
Wi-Fi 定位的精度确实比不上 UWB,但对于室内导航、人员轨迹追踪、设备巡检这些场景,2 到 3 米的精度已经足够用了。与其花大价钱追求亚米级精度,不如先把稳定可用的米级定位做出来。
2. 指纹定位 vs 三边测量:先搞清楚原理再动手
2.1 RSSI 三边测量法在室内为什么容易翻车
很多初次接触定位的人第一反应是:既然能拿到 AP 的信号强度,那根据信号衰减公式把 RSSI 换算成距离,再用三个 AP 的坐标做圆的交点,不就能算出位置了吗?这个思路在室外空旷环境没问题,但在室内基本走不通。
问题出在信号衰减模型上。理想情况下,接收功率和距离的关系可以用对数距离路径损耗模型描述,公式大致是:
[ P_r(d) = P_0 - 10n \log_{10}(d/d_0) + X_\sigma ]
其中P_0是参考距离d_0(通常取 1 米)处的接收功率,n是路径损耗指数,X_\sigma是均值为 0 的高斯噪声。问题在于室内的n值不是固定的,走廊和开阔办公区不一样,隔着玻璃和隔着承重墙也不一样。更何况多径效应会让同一个位置的信号有的是直射路径,有的是反射两次甚至三次后叠加的结果。
我当时在办公室实测了一组数据:同一个点位,同一台笔记本,距离同一个 AP 大约 10 米,半小时内采集到的 RSSI 波动范围达到了 12dB。如果把 12dB 的波动直接套进衰减公式换算距离,得到的距离误差几乎是跳跃性的,有时候甚至会算出负距离。三边测量在这种噪声下,几何交点的位置会剧烈抖动,完全不可用。
2.2 位置指纹法的核心闭环:建库和定位
指纹定位的思路换了一个维度,它跳过了“信号强度转距离”这一步,直接把“位置”和“信号特征”建立映射关系。你可以把它理解成人的嗅觉记忆:你不需要知道气味的化学分子式,也解释不清每层味道是从哪里飘来的,但你进入某个房间时,大脑会自动匹配“这个气味组合我闻过,上次在这里”。
指纹定位分为两个阶段。离线阶段,把目标区域划分成网格,在每个网格点上采集周围可见 AP 的 RSSI 数据,记录成一条指纹记录,格式大概是(网格坐标, AP1的RSSI, AP2的RSSI, AP3的RSSI, ...)。所有网格点的指纹汇总起来,构成位置指纹库。在线阶段,终端实时采集一组 RSSI 向量,把这个向量拿到指纹库里去比对,找出最相似的若干条历史指纹,用它们的坐标去推算当前坐标。
这个方案的好处是,它不需要理解信号传播的物理模型,只需要数据本身的一致性。哪怕环境里存在严重的多径反射,只要这种反射在同一个位置是相对稳定的,指纹库就会把这种特征也学习进去。换句话说,指纹法把物理世界的复杂性抽象成了数据问题。
2.3 一张图看懂相似度匹配的核心逻辑
在线定位阶段最核心的步骤就是把实时 RSSI 向量和库里的每条指纹算相似度。假设室内一共有 N 个 AP,某个位置采集到的信号向量是R = (r_1, r_2, ..., r_N),指纹库中某条记录的向量是F = (f_1, f_2, ..., f_N),最朴素的做法是算欧氏距离:
[ d = \sqrt{\sum_{i=1}^{N} (r_i - f_i)^2} ]
距离越小表示两个向量在信号空间里越接近,也就意味着两个物理位置大概率靠得近。这里面有个小坑:不是每个位置都能收到所有 AP 的信号,采集到的向量里会出现很多空值。我的处理方式是给空值统一赋一个 -100dBm 的底噪值,相当于让它以“几乎收不到信号”的状态参与计算。这个处理能保证向量的维度一致,否则两个长度不同的向量还没法直接算距离。
当 AP 数量比较多的时候,直接用欧氏距离把所有 AP 等权看待并不是最优解。有些 AP 距离远、信号弱,本身波动就大,反而成了噪声源。这就是后面要讲的 AP 筛选和权重分配环节要解决的问题,先说清楚匹配逻辑,后面实操才不懵。
在动手写代码之前,我还建议先把功能拆成采集端、建库端、定位端三块,每一块独立测试。采集端负责收集原始数据,建库端负责把数据整理成指纹库,定位端负责实时匹配。模块拆分越干净,后面排查问题的范围就越小。
3. Ubuntu 环境下搭采集链路:我遇到的“没有 Wi-Fi”问题
3.1 从网卡识别开始的排查链路
我当时的开发机装的是 Ubuntu 系统,用来做数据采集和算法调试。正当我准备开始扫描周围 AP 的 RSSI 时,发现系统里根本找不到无线网卡,ifconfig看不到wlan0接口,设置界面里也直接显示没有 Wi-Fi 适配器。这就是很多人都撞过的“Ubuntu 系统没有 Wi-Fi”问题,排查链路其实是固定的,一步步来,绝大多数情况都能救回来。
第一步,先确认硬件是否被系统识别。执行lspci | grep -i network(PCIe 接口网卡)或lsusb(USB 网卡),看系统层面能否看到设备。如果这里就空荡荡,说明要么网卡硬件损坏,要么没插好,软件层面无从下手。
第二步,确认驱动是否加载成功。用lspci -vvv查看内核是否绑定了对应的驱动模块,常见的是iwlwifi、ath9k、rtl8xxxu等。以 Intel 的无线网卡为例,正常情况下执行lsmod | grep iwlwifi能看到模块列表。如果驱动没加载,考虑手动安装对应的固件包,Ubuntu 下通常就是把linux-firmware包升级到最新版本。
第三步,操作系统层面的无线开关。执行rfkill list,如果看到某个设备显示Soft blocked: yes或Hard blocked: yes,分别代表软件禁用了射频和硬件物理开关关闭了。笔记本一般有 Fn 组合键控制无线开关,排查时容易忽略,我当时就是卡在这一步——之前的会话里执行过rfkill block all,重启后又没自动恢复,界面就一直显示无 Wi-Fi。
走完这三步,网卡接口wlan0终于回来了。这里多说一句,网卡能被系统识别不代表能用于扫描,有些网卡驱动只支持连接 AP 不支持扫描周边的 BSSID,那是因为缺少scan能力。确认方法是用iw list查看Supported interface modes,里面有managed模式就够用了,做 RSSI 采集不需要监听模式。
3.2 采集 RSSI 数据的具体实现
网卡正常工作后,用iw dev wlan0 scan就能扫描周围的无线网络。扫描结果里会列出每个 BSSID 对应的 SSID、信道、信号强度(signal 字段,单位是 dBm)。如果你只需要一次性的手动确认,这条命令就够了,但建指纹库需要批量采集,所以要写一个定时扫描的脚本。
我当时用 Shell 脚本加 Python 解析实现了这个采集器。Shell 脚本负责循环调用扫描命令,把结果输出到文本文件,Python 脚本负责解析 BSSID、SSID、signal 字段,并合并成结构化的数据记录。核心逻辑大致是:
#! /bin/bash while true; do iw dev wlan0 scan > /tmp/scan_$(date +%s).txt sleep 2 doneimport re import json import time def parse_scan(raw_text: str): """解析 iw scan 输出,提取 BSSID、SSID、signal""" records = [] current = {} for line in raw_text.strip().split("\n"): line = line.strip() if line.startswith("BSS "): if current: records.append(current) current = {"bssid": line.split()[1].strip("(")} elif "SSID:" in line: current["ssid"] = line.split("SSID:")[1].strip() elif "signal:" in line: m = re.search(r"signal:\s*(-?\d+)\.\d+", line) if m: current["rssi"] = int(m.group(1)) if current: records.append(current) return records解析输出的RSSI是负值,范围通常在 -30dBm(距离 AP 很近)到 -95dBm(几乎收不到)之间。采集日志要同时记录时间戳和采集位置编号,方便后续离线阶段建立对应关系。这里有个重要细节:扫描命令本身有耗时,iw scan会跳过当前所在信道,扫描全部信道,这个过程中网卡是暂时脱离连接状态的,如果你的网卡同时需要联网工作,要注意扫描频率不能太高。实测下来,设置 3 秒一次的扫描间隔对采集端来说比较平衡,既能收集到足够的数据,也不会让网卡一直处于扫描状态。
3.3 指纹数据的存储格式设计
指纹库的数据结构直接决定了后面算法的写法,建议一开始就用 JSON 格式保存原始指纹。每个采样点的结构可以设计为:
{ "location": { "x": 3.0, "y": 5.0, "floor": 2 }, "timestamp": 1710000000, "samples": [ { "bssid": "a4:2b:b0:xx:xx:xx", "ssid": "Office-wifi", "rssi": -52 }, { "bssid": "c8:3a:35:xx:xx:xx", "ssid": "Shop-WiFi", "rssi": -68 } ] }每个物理采样点建议采集 30~50 条原始记录,时间跨度覆盖几分钟甚至不同时段,这样才能把信号的波动分布特征记录下来。采集点的网格间距我建议先设 1.5 米,定位效果稳定后再考虑是否加密到 1 米。网格太密,建库阶段的工作量会爆炸式增长;网格太稀,实时定位时匹配到的指纹距离实际位置太远,精度上限就被锁死了。
另外,有条件的话要记录采集设备型号。不同终端的 Wi-Fi 天线灵敏度不一样,同一位置同一台 AP,手机和笔记本读到的 RSSI 可能差 5~10dB。如果建库设备用的是笔记本,在线定位用的是手机,这种终端差异会成为误差的主要来源之一。这个问题的缓解方法后面调优部分会细说。
4. 定位引擎实现:从原始信号到坐标输出
4.1 原始信号不能直接用来匹配
实时扫描得到的 RSSI 数据噪声很大,直接拿去做匹配,定位结果会出现明显的跳变。我有一次站在固定位置连续定位,5 秒钟内输出的坐标居然在 4 米范围内乱蹦。原因很简单,RSSI 本身是随机变量,多径效应、突发干扰、终端天线方向都会让单次读数偏离真实值。
所以定位前必须先做信号预处理。我用的方法是滑动窗口滤波:每 3 秒采集一次,窗口大小设为 5,取窗口内所有读数的算术平均值作为当前信号值。如果你追求更好的效果,可以改成中值滤波,它对异常值更鲁棒。实际对比下来,均值滤波的轨迹更平滑,中值滤波则在遇到随机强干扰时更稳。我的建议是两种都实现,根据现场环境切换。
还有一个关键步骤是AP 筛选。环境中能扫到的 AP 可能有几十个,其中大量是周围住户家的路由器,信号弱且不稳定。一种常见做法是只保留在线定位帧和指纹库中共同出现的 AP 集合,再按信号强度排序,取前 8~12 个信号较强的 AP 参与计算。信号太弱的 AP(如低于 -85dBm)测量误差较大,参与匹配反而拉低精度,直接剔除。
AP 筛选还有一个更实用的策略:按 AP 在指纹库中的区分度来排序。如果一个 AP 在整个区域内的 RSSI 分布范围只有 5dB 的波动,说明它对位置变化不敏感,区分度很低;反之,如果不同位置点的 RSSI 分布范围能达到 25dB,那它对定位的贡献就很大。你可以用方差或极差来量化这种区分度,只保留区分度高的 AP,这个操作在走廊这种长条区域尤其有效。
4.2 KNN 算法实现与参数选择
选定了参与计算的 AP 集合后,把实时向量和指纹库的所有记录算欧氏距离,然后取距离最小的 K 个指纹点,用这 K 个点的坐标做加权平均,得到最终位置。这个思路就是标准的KNN(K 最近邻)算法,实现简单,效果也经得起考验。
具体实现时,距离计算我做了个小优化:AP 缺失时不再简单赋 -100dBm,而是根据指纹库中该 AP 的全局信号均值来填充。原因是不同 AP 的信号特征差异很大,有些 AP 本身发射功率低,在远处 -90dBm 是正常值,你给它赋 -100dBm,相当于人为制造了一个“特别远”的错误信号,反而误导匹配。
K 值的选择没有绝对标准,我的测试结果是这样的:AP 数量在 8 个左右时,K=3 到 5 表现最好;AP 数量超过 15 个时,K=7 也不会明显变差。K 太小,单个指纹点的噪声影响太大;K 太大,又会把相距很远的指纹点拉进来平均,位置容易偏向物理空间的几何中心。可以先试 K=5,再根据误差曲线的拐点进行调整。
坐标合成时,我用了距离的倒数加权,权重计算公式是:
[ w_i = \frac{1}{d_i^2 + \epsilon} ]
这里的d_i是实时向量与第i条指纹的距离,加上一个极小值epsilon(比如 10 的 -6 次方)防止除零。距离越近的指纹点权重越大,距离远的点权重被迅速压制。如果只取距离最近的 1 个点(K=1),就是最简单的最近邻算法,优点是实现最简单,缺点是误差波动大,实测平均误差比 K=5 的加权版本大 0.6~1 米左右。
4.3 定位效果怎么量化评估
要把定位系统的能力讲清楚,必须有量化指标。我建议每个版本测试时都在固定的测试路线上记录真实坐标和定位输出坐标,然后统计三个指标:平均误差、RMSE(均方根误差)、CDF 90 分位值。平均误差直观但容易被个别大误差点拉高,RMSE 对异常点更敏感,CDF 90 分位值表示 90% 的情况下误差落在多少米以内,这是与用户感知最相关的指标。
评估的时候建议画一张误差累计分布图,横轴是误差距离(米),纵轴是累计概率。理想曲线应该快速拉升到 90%,说明大部分时间误差都控制在小范围内。如果曲线尾部拖着很长的缓慢上升段,说明有部分区域误差特别大,这时候就要回去检查那些位置的指纹质量。
当时我第一版 KNN 定位在办公室走廊区域的测试结果是:平均误差 4.2 米,CDF 90 分位值 7.8 米。坦白讲这个结果直接用会让人抓狂,主要原因是走廊两端的指纹区分度不够,在线定位时经常把目标匹配到隔了几个房间的位置。这个问题的解决过程放在下一节详细说。
5. 实测调优记录:误差从 4 米降到 2.5 米的全过程
5.1 第一轮实测:误差到底从哪里来
第一轮测试结束后,我把误差大的点标在地图上,发现几个规律:靠近玻璃幕墙的区域误差偏大,走廊尽头的点位经常被误判到走廊另一头,人流量大的开放工位区误差波动剧烈。
玻璃幕墙的问题在于反射严重,RSSI 波动大,指纹库的参考值和实时值之间经常对不上。走廊尽头的误判问题,本质是 AP 分布造成的“信号空间重叠”——走廊两头的设备能看到的 AP 集合高度相似,只是信号强度略有差异,而信号强度的噪声波动完全可能掩盖这种差异。
人流干扰更直白:人体含水量高,对 2.4GHz 信号有显著吸收作用。当有人从测试路径中间穿过时,实时 RSSI 会瞬间下跌 5~8dB,指纹库里的静态值完全没有这种动态特征,匹配自然偏差变大。
我针对这些原因分别做了处理。玻璃幕墙区域加密采样点,把网格间距从 1.5 米缩小到 1 米;走廊尽头增加虚拟插值点,用相邻点位指纹做线性插值,缓解指纹区分度不足;开放工位区则提高采样频次,并且把样本采集时间拉长了 2 倍,用更丰富的统计特征覆盖人员走动带来的波动。
5.2 动态环境干扰:Wi-Fi Direct 无线投屏带来的意外案例
调优过程中有一个意外发现。测试那天,同事用支持Wi-Fi Direct 技术的无线投屏在会议室放演示文稿,正对着会议室的几个定位测试点误差突然飙高,从正常水平跑到 6 米开外。起初我以为只是巧合,后来复现了几次才确定是 Wi-Fi Direct 设备在同一信道上发送探测帧和数据帧,对周边 RSSI 测量造成了短时干扰。
Wi-Fi Direct 的特性是设备间直接建立点对点连接,不需要经过 AP 转发。投屏过程中,发射端和接收端会持续传输大数据量的视频流,这会占用信道资源,并且两个设备之间的突发数据帧会让周边扫描设备测得的信号强度出现周期性跳变。这类基于 Wi-Fi Direct 的投屏、文件传输业务在办公场景越来越常见,对指纹定位来说是一种典型的动态干扰源。
针对这个现象,我的处理方式是:定位端对匹配结果增加一个置信度校验。当实时向量和指纹库最近距离明显大于历史平均水平时,判定当前测量处于“高干扰状态”,此时定位结果多了一个不可靠标记,输出时优先使用上一个稳定位置做平滑,防止坐标被一次干扰信号拉飞。这个机制的代价是定位实时性稍降,但对用户体验的提升非常明显,不会再出现位置满屏乱跳的情况。
5.3 第二轮调优后的效果数据
经过采样加密、插值、平滑处理后,同样测试路线上的效果提升显著:平均误差从 4.2 米降到 2.6 米,CDF 90 分位值从 7.8 米降到 4.5 米。如果继续细化网格并增加采样时长,平均误差可以压到 2.2 米左右,但边际收益已经大幅下降,性价比不高。
这个结果在真实业务里能不能用,要分场景看。商场楼层导览需求,2.5 米误差完全够用;如果是找停车场里自己的车,2.5 米误差意味着走到车附近还需要低头看一眼车牌确认;如果是 AGV 小车的毫米级对接定位,这套方案就完全不合适。做技术选型的人要清醒:Wi-Fi 指纹定位擅长的是“知道你在哪个房间、哪条走廊、哪个区域”,而不是“精确到充电桩上的哪个接口”。
5.4 终端差异的另一层坑
前面提到建库设备和定位终端的天线差异,调优过程中这个坑也彻底暴露了。我用笔记本采集指纹库,用手机 App 做在线定位,整体 RSSI 读数系统性偏低 5~8dB。一开始尝试做固定偏移补偿,发现根本不准,因为不同手机品牌、不同握持姿势,信号衰减的特性都不一样。
后来采用了一个工程上更务实的做法:用手机重新采集一遍指纹库,或者至少用多个常见终端各采一部分数据合并成混合指纹库。这样做虽然采集工作量变大,但效果立竿见影。定位系统上线前,最好先明确主力终端是哪几款,用它们分别建库和测试,否则上线后用户设备千差万别,定位效果会有明显的“设备歧视”。
6. 从定位到场景服务:一些可复用的扩展思路
6.1 把定位能力和 Wi-Fi Direct 场景结合
Wi-Fi Direct 相关的无线投屏、点对点文件传输在办公场景里越来越普遍,这些功能的本质是设备间建立了近距离直连链路。如果把室内定位系统输出的坐标信息与这些直连链路的状态关联起来,可以做一些实用的联动场景。
举个例子,当定位系统检测到两台设备进入同一房间且距离小于 3 米时,自动触发便捷投屏的发现列表排序,让距离最近的投屏设备排在最前面。又或者,在会议室场景下,定位系统可以实时判断主讲人站在哪个位置,自动调整附近投屏设备的信号发射功率方向。这些想法不需要改动 Wi-Fi Direct 协议本身,只需要在上层叠加定位上下文,工程上完全可行。我在项目里已经实现了前一个场景的原型验证,定位坐标给发现列表提供排序权重后,投屏连接的误选率明显下降。
6.2 后续融合方向:蓝牙、PDR 与地图约束
纯 Wi-Fi 指纹定位的精度存在天花板,但融合其他传感器的潜力很大。PDR(行人航位推算)利用手机内置的加速度计、陀螺仪估计行走步数、步长和方向,短期相对精度很高,但会随时间累积漂移。Wi-Fi 指纹定位则相反,单次定位是绝对定位结果,没有累积误差,但噪声较大。两者结合,用卡尔曼滤波或粒子滤波做融合,可以用 PDR 平滑轨迹、用 Wi-Fi 定期纠正漂移,最终效果通常能把平均误差再拉低 0.5~1 米。
地图约束同样重要。把建筑 CAD 图转成栅格可达区域,定位结果经过地图匹配后强制落在可通行的走廊和房间内,这样就能消除穿墙、跳出建筑等明显逻辑错误。我当时在 Demo 里加了最简版本的碰撞检测:如果定位点落在障碍物区域,就往周围可通行像素回退,效果非常直观。
6.3 给后来者的清单和建议
项目做到这个阶段,我对整体开发流程有了清晰的复盘,如果要快速复制一个 Wi-Fi 室内定位系统,我的建议清单是:
- 先评估现场 AP 数量和分布,AP 密度过低的地方需要提前考虑硬件补充方案。
- 优先完成指纹采集工具和可视化工具,否则后续所有调试都像蒙眼开车。
- 算法先用 KNN 跑基线,务必记录第一版误差数据,之后的所有优化才有对照基准。
- 动态环境干扰无法消除,只能在输出侧做置信度和平滑处理。
- 终端兼容性比算法优化更重要,一开始就要决定主力终端类型。
- 定位效果评估指标统一用平均误差与 CDF 90 分位值,避免“感觉差不多”这种模糊判断。
- 项目周期不要排太满,信号采集、标定、环境变更、终端适配,每一项都可能吃掉远超预期的时间。
最后再分享一个个人体会:做室内定位这种偏环境依赖的项目,代码能力只占一半,另一半是现场调试的耐心。RSSI 数据的采集、清洗、标注和迭代,比算法本身更影响最终效果。很多时候看着定位不准,先别急着改算法,回看一下原始数据,答案往往就藏在噪声的分布里。