Trilateration三邊測量定位演算法

2021-08-27 11:11:42 字數 1709 閱讀 5300

基本原理

trilateration(三邊測量)是一種常用的定位演算法:

已知三點位置 (x1, y1), (x2, y2), (x3, y3)

已知未知點 (x0, y0) 到三點距離 d1, d2, d3

以 d1, d2, d3 為半徑作三個圓,根據畢達哥拉斯定理,得出交點即未知點的位置計算公式:

( x1 - x0 )2 + ( y1 - y0 )2 = d12

( x2 - x0 )2 + ( y2 - y0 )2 = d22

( x3 - x0 )2 + ( y3 - y0 )2 = d32

設未知點位置為 (x, y), 令其中的第乙個球形 p1 的球心座標為 (0, 0),p2 處於相同縱座標,球心座標為 (d, 0),p3 球心座標為 (i, j),三個球形半徑分別為 r1, r2, r3,z為三球形相交點與水平面高度。則有:

r12 = x2 + y2 + z2

r22 = (x - d)2 + y2 + z2

r32 = (x - i)2 + (y - j)2 + z2

當 z = 0 時, 即為三個圓在水平面上相交為一點,首先解出 x:

x = (r12 - r22 + d2) / 2d
將公式二變形,將公式一的 z2 代入公式二,再代入公式三得到 y 的計算公式:

y = (r12 - r32 - x2 + (x - i)2 + j2) / 2j
定義三個圓的座標及半徑,計算出交點的座標 (obj_x, obj_y).

var x_0 = 150, y_0 = 150;

var x_1 = x_0, y_1 = y_0, d = 150, x_2 = x_0 + d, x_3 = 225, y_3 = 315, r = 100;

var i = x_3 - x_0, j = y_3 - y_0;

var x = (math.pow(r, 2) - math.pow(r, 2) + math.pow(d, 2)) / (2 * d) + x_0;

var obj_x = x + x_0;

var y = (math.pow(r, 2) - math.pow(r, 2) - math.pow(x, 2) + math.pow((x - i), 2)

+ math.pow(j, 2)) / (2 * j);

var obj_y = y + y_0;

繪出圓形及交點:

.attr("cy", y_1).attr("r", r)

.style("fill", "blue").style("opacity", 0.3);

.attr("cy", y_0).attr("r", r)

.style("fill", "red").style("opacity", 0.4);

.attr("cy", y_3).style("opacity", 0.5)

.attr("r", r).style("fill", "yellow");

.attr("cy", obj_y).attr("r", 3)

.style("fill", "red");

但在實際定位中,給定的距離由於測量的誤差,並不能真正讓三個圓交於一點,需要在相交區域繪製出矩形並計算矩形的中心位置,除三邊測量計算公式之外,也許還可以採用k-means或overlap聚類演算法,後兩者在地圖標註上使用比較廣,有興趣的可以進一步對定位演算法進行研究。

Trilateration三邊測量定位演算法

基本原理 trilateration 三邊測量 是一種常用的定位演算法 已知三點位置 x1 y1 x2 y2 x3,y3 已知未知點 x0 y0 到三點距離 d1 d2 d3 以 d1 d2 d3 為半徑作三個圓,根據畢達哥拉斯定理,得出交點即未知點的位置計算公式 x1 x0 2 y 1 y0 2 ...

三邊六拍「專案

三邊 指的是 邊計畫,邊行動,邊修改 原因 在目標未清,職責未明的情況下就倉促開始往下做細節,結果常會因為在一些小事上扯皮導致專案不斷地延期,即使最後勉強完成了,也與最初的目標相去甚遠。六拍 拍的是 腦門,肩膀,胸脯,桌子,屁股,大腿。拍腦門 經常有些領導有了做乙個專案的想法後,不是組織相關人員嚴格...

專案管理的「三邊六拍」!

三邊 是指 邊計畫 邊實施 邊修改,六拍 是指 拍腦袋 拍肩膀 拍胸口 拍桌子 拍屁股 拍大腿!三邊六拍 很形象,引人深思!三邊六拍 並非本人原創,最開始我是從我的領導那聽到的,我覺得很有意思,很形象,很貼合實際。下面介紹一下什麼是專案管理 六拍 以及我的一些感受 然後介紹 三邊 和我的體會。作者 ...