2. 定位算法基础:三边测量法、三角测量法、指纹定位法

大家好,我是你们的老朋友。今天咱们聊聊定位算法里最基础的三种方法。说实话,我刚入行那会儿,觉得定位嘛,不就是算个距离嘛。后来踩了不少坑,才发现这里面的门道还挺深。

这三种方法——三边测量、三角测量、指纹定位——几乎是所有定位系统的基石。你想想看,不管是室内定位还是室外定位,核心逻辑都跑不出这几个框架。我个人习惯把这三者比作:量尺子、看角度、对特征。嗯,咱们一个一个来拆解。

核心观点: 定位的本质,就是利用已知的参考点(基站、AP、卫星)和未知点(目标)之间的几何或信号关系,解算出未知点的坐标。这三种方法代表了三种不同的“关系”建模思路。

2.1 三边测量法:最直观的“量尺子”

三边测量法,说白了就是“已知三个点的距离,求第四个点的位置”。这是最朴素、最符合直觉的定位方法。

核心思想: 假设你知道自己到三个已知位置点的距离,那么你就在以每个已知点为圆心、距离为半径的圆的交点上。

数学原理:

设三个已知点坐标为 (x₁, y₁), (x₂, y₂), (x₃, y₃),未知点坐标为 (x, y)。已知距离分别为 d₁, d₂, d₃。那么有方程组:

(x - x₁)² + (y - y₁)² = d₁²
(x - x₂)² + (y - y₂)² = d₂²
(x - x₃)² + (y - y₃)² = d₃²

这是个非线性方程组。怎么解?我一般用线性化的方法。用第一个方程减去第二个、第三个,消去二次项,得到两个线性方程:

2(x₂ - x₁)x + 2(y₂ - y₁)y = d₁² - d₂² + x₂² - x₁² + y₂² - y₁²
2(x₃ - x₁)x + 2(y₃ - y₁)y = d₁² - d₃² + x₃² - x₁² + y₃² - y₁²

然后直接用矩阵求解就行了。嗯,这里要注意:三个圆必须交于一点,否则无解。但在实际中,由于测量误差,三个圆往往不会完美交于一点。

避坑指南: 我曾经在项目中遇到过,三个基站测出来的距离,画出来的圆根本不交于一点,而是形成一个“模糊区域”。这时候别硬解,用最小二乘法求近似解才是正道。我习惯用 np.linalg.lstsq 来处理这种超定方程组。

适用场景: GPS定位、UWB室内定位、蓝牙AOA测距定位。说白了,只要你能测到距离,就能用三边测量。

2.2 三角测量法:用角度说话

三角测量法和三边测量法一字之差,但思路完全不同。三边测量靠的是距离,三角测量靠的是角度。

核心思想: 已知两个参考点的位置,以及目标相对于这两个参考点的方位角(角度),就可以通过几何关系确定目标的位置。

数学原理:

设两个已知点 A 和 B,坐标分别为 (xₐ, yₐ) 和 (x_b, y_b)。目标点 P 相对于 A 的方位角为 α,相对于 B 的方位角为 β。那么从 A 点出发,沿 α 方向作射线;从 B 点出发,沿 β 方向作射线。两条射线的交点就是 P 点。

具体计算时,可以用正弦定理。先算出 A 和 B 之间的距离 d_AB,然后根据三角形内角和算出 ∠APB,再用正弦定理求出 AP 或 BP 的距离:

∠APB = 180° - (α - β)   // 注意角度方向定义
AP / sin(β) = AB / sin(∠APB)
BP / sin(α) = AB / sin(∠APB)

有了距离和角度,P 点的坐标就出来了。

注意: 角度测量对误差非常敏感。我记得有一次做视觉定位,摄像头角度偏差了 0.5 度,结果目标位置偏了十几米。所以,三角测量法对硬件精度要求很高。你想想看,角度误差会随着距离线性放大,距离越远,误差越大。

适用场景: 视觉定位(双目摄像头)、基站测向定位、声源定位。说白了,只要你能测到方向角,就能用三角测量。

2.3 指纹定位法:不靠几何,靠“记忆”

指纹定位法,和前两种完全不是一个路子。它不依赖几何关系,而是依赖信号特征的匹配。

核心思想: 每个位置都有独特的“信号指纹”——比如 Wi-Fi 信号强度(RSSI)、蓝牙信号强度、磁场强度等。先建一个指纹库(离线阶段),然后在定位时(在线阶段)把当前测到的指纹和库里的指纹做匹配,找到最相似的那个位置。

数学原理:

指纹定位的核心是最近邻匹配。假设指纹库里有 N 个参考点,每个参考点有 M 个信号特征(比如来自 M 个 AP 的 RSSI 值)。当前测到的信号向量为 S = [s₁, s₂, ..., s_M]。指纹库中第 i 个参考点的信号向量为 F_i = [f_i1, f_i2, ..., f_iM]。

计算 S 和每个 F_i 的“距离”,常用的有:

  • 欧氏距离: d_i = √(Σ(s_j - f_ij)²)
  • 曼哈顿距离: d_i = Σ|s_j - f_ij|
  • 余弦相似度: cosθ = (S·F_i) / (||S||·||F_i||)

找到距离最小的那个参考点,它的坐标就是定位结果。更高级的做法是用 K 个最近邻(KNN)做加权平均。

个人经验: 我在做商场室内定位时,指纹定位法效果出奇的好。但有个大坑——指纹库会过时。商场里店铺装修、货架移动、甚至人流变化,都会改变信号特征。我曾经遇到过,建库时好好的,三个月后定位精度从 2 米掉到了 8 米。所以,指纹库需要定期更新,或者用在线学习的方法自适应调整。

适用场景: Wi-Fi 室内定位、蓝牙 iBeacon 定位、地磁定位。说白了,只要信号特征有空间区分度,就能用指纹法。

2.4 三种方法的对比与选择

这三种方法各有优劣,没有绝对的好坏。我一般这样选:

方法 所需数据 优点 缺点 典型精度
三边测量法 距离 原理简单,计算快 对距离误差敏感,需要至少3个基站 1-5米(UWB可达厘米级)
三角测量法 角度 只需2个参考点 角度误差随距离放大,硬件要求高 5-20米(视距内较好)
指纹定位法 信号特征 无需测距测角,抗多径好 建库工作量大,环境变化需更新 2-8米(取决于指纹密度)

我的建议: 实际项目中,别死磕一种方法。我做过一个混合方案——先用指纹法粗定位(精度 5 米),再用三边测量法精定位(精度 1 米)。效果比单独用任何一种都好。说白了,融合才是王道。

2.5 知识体系总览

下面这张图,是我自己梳理的三种定位方法的核心逻辑。你看一眼,就能明白它们之间的区别和联系。

定位算法基础:三种方法核心逻辑 三边测量法 输入:距离 d₁, d₂, d₃ 模型:圆方程求交点 输出:坐标 (x, y) 三角测量法 输入:角度 α, β 模型:射线求交点 输出:坐标 (x, y) 指纹定位法 输入:信号向量 S 模型:最近邻匹配 输出:坐标 (x, y) 混合定位 / 融合定位 三种方法各有优劣,实际项目中常组合使用 三边测量 + 指纹法 或 三角测量 + 三边测量

你看,这三种方法最终都指向同一个目标——输出坐标。但它们的输入和模型完全不同。三边测量和三角测量属于几何方法,依赖精确的物理测量;指纹法属于经验方法,依赖数据驱动的匹配。

我个人觉得,初学者最好先把三边测量法吃透。为什么?因为它的数学最简单,而且很多高级算法(比如 TDOA、AOA)本质上都是三边测量的变种。等你把三边测量玩熟了,再去看三角测量和指纹法,会发现很多东西是相通的。

最后提醒一句: 别迷信理论精度。我在仿真里跑三边测量,精度能到厘米级。但一到真实环境,多径效应、非视距传播、信号衰减……各种问题全来了。所以,仿真验证只是第一步,真正的考验在实地测试。

好了,这一章就到这里。三种方法的核心思想和数学原理,你应该已经清楚了。下一章咱们聊聊怎么在仿真环境里把这些算法跑起来,看看它们到底表现如何。

可可精品资料库