GPS坐标的多点定位

zer*_*erm 4 language-agnostic algorithm gps coordinates

我有NGPS坐标N,我希望确定一个未知位置的距离.

我的第一个方法是使用只有三点和三角测量,精确描述这里.这种方法已经非常准确(最佳误差~5km),但我想改进这一点并增加鲁棒性.因为给定距离开始时不是很准确,所以我考虑使用多个测量和多点定位.然而,事实证明这种方法准确性不太准确(最佳误差~100km)虽然我提供超过3点/距离(最多6次测试),现在我问,如果有人知道我可以拥有什么做错了.

简而言之,我的多点定位方法如下:

  1. 将所有坐标转换为ECEF
  2. 维基百科的方程7中所述构建矩阵
  3. 使用SVD查找最小化器
  4. 由于解决方案仅达到规模,我使用根寻找方法来确定归一化,以便转换回LLA的坐标导致高度为0(我的初始假设是所有坐标都在零高度)
  5. 转换回LLA

LLA/ECEF转换经过双重检查并且正确无误.第2步和第3步我用欧氏坐标(和精确距离)检查并显示正确.我自己想出了第4步,我不知道这是否是一个很好的方法,所以欢迎提出建议.

+++ UPDATE

我已经在python中汇总了示例代码,以说明一些基本事实的问题.三角测量接近400米,而多重定位在这里10-130公里.因为长度,我把它放在了想象中

zer*_*erm 6

最终,我自己弄清楚了 - 或者至少显着提高了准确性.

维基百科(方程式7)中描述的方法显然不太适合这个应用程序,但在这种情况下它已经容易得多了.

考虑方程式 6来自维基百科,我们可以简化它:R_0可以猜测为地球半径,因为ECEF坐标的原点位于地球的中心.因此,没有必要移动所有东西使一个点成为原点,我们可以使用所有N方程.

在python中,有P一个ECEF坐标数组和dists到这些点的距离,这一切都归结为

R = 6378137 # Earth radius in meters
A = []
for m in range(0,len(P)):
    x = P[m][0]
    y = P[m][1]
    z = P[m][2]
    Am = -2*x
    Bm = -2*y
    Cm = -2*z
    Dm = R*R + (pow(x,2)+pow(y,2)+pow(z,2)) - pow(dists[m],2)
    A += [[Am,Bm,Cm,Dm]]
# Solve using SVD
A = numpy.array(A)
(_,_,v) = numpy.linalg.svd(A)
# Get the minimizer
w = v[3,:]
w /= w[3] # Resulting position in ECEF
Run Code Online (Sandbox Code Playgroud)

通过这种方法,我不再需要我所描述的步骤4.事实上,它甚至使解决方案变得更糟.

现在,精度范围在2km到275m之间 - 在大多数情况下比"最佳"三边测量更好,误差为464m.

  • 为什么这被否决了?请你好心地向我解释一下好吗?这种方法有什么问题吗?我错过了什么吗? (2认同)