zer*_*erm 4 language-agnostic algorithm gps coordinates
我有NGPS坐标N,我希望确定一个未知位置的距离.
我的第一个方法是使用只有三点和三角测量,精确描述这里.这种方法已经非常准确(最佳误差~5km),但我想改进这一点并增加鲁棒性.因为给定距离开始时不是很准确,所以我考虑使用多个测量和多点定位.然而,事实证明这种方法准确性不太准确(最佳误差~100km)虽然我提供超过3点/距离(最多6次测试),现在我问,如果有人知道我可以拥有什么做错了.
简而言之,我的多点定位方法如下:
LLA/ECEF转换经过双重检查并且正确无误.第2步和第3步我用欧氏坐标(和精确距离)检查并显示正确.我自己想出了第4步,我不知道这是否是一个很好的方法,所以欢迎提出建议.
+++ UPDATE
我已经在python中汇总了示例代码,以说明一些基本事实的问题.三角测量接近400米,而多重定位在这里10-130公里.因为长度,我把它放在了想象中
最终,我自己弄清楚了 - 或者至少显着提高了准确性.
维基百科(方程式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.