Numpy庫應用實例——GPS定位


背景介紹
 定位系統
 GPS全球定位系統(Global Positioning System)
以GPS系統為例介紹衛星定位的計算方法

GPS定位的基本原理
 GPS定位的基本原理是根據高速運動衛星的瞬間位置作為已知的起算數據,采用空間距離-后方交會的方法,確定待測點的位置。
 假設t時刻在地面待測點上安置GPS接收機,可以測定GPS信號到達接收機的時間△t,再加上接收機所接收到的衛星星歷等其它數據,就可以確定一個方程組來對位置信息進行求解。
 假設地球上一個點R,同時收到6顆衛星(S1,S2,…,S6)發射的信號,假設接受信息如下表所示。其中x,y表示衛星的經緯度,z表示衛星的高度。


由於上述6個衛星和地球在高速運動,從衛星發出的位置信息以光速傳輸到GPS接收端需要一定的時間。
假設(x,y,z,t)表示R當前的位置, t是R的相對時間,衛星S1(發出信號時刻)到(當前接收時刻)滿足以下關系(其中c是光速)。
 (x-3)^2 + (y-2)^2 + (z-3)^2 = [(10010.00692286 – t)*c]^2,
 該公式表示以(x, y, z,t)為參數的(歐式空間距離)與信號傳輸距離相等。

對於衛星S1,S2,…,S6,滿足方程組:
...(1)
其中,光速為常數c=0.299792458km/us,上述方程組是非線性的,但很容易將所有二次項都消去(每個公式減去第一個公式),從而得到:

此時,上述等式變成了A*X=B形式,根據線性代數方法,X=A-1*B,即只需對系數矩陣求逆,再乘以常數矩陣便可以得到方程組的解。

GPS定位的問題建模
 上面給出了GPS的定位原理,如何利用計算機輔助GPS的定位計算呢?
 以6顆衛星為例,GPS定位計算問題的IPO模式----描述如下:
 輸入:6顆衛星的歐式坐標和信號時間戳
 處理:GPS定位算法
 輸出:GPS接收設備的地理坐標和當前時間
假設第i顆衛星的坐標和時間戳表示為(x_i, y_i ,z_i ,t_i ),結合上述例子,GPS定位算法可以描述為如下公式:


我們下面將使用Numpy函數庫實現上述矩陣操作。首預習一下程序中用到的函數:
numpy.dot(a,b):計算矩陣a與矩陣b的點積
numpy.linalg.inv(a):求矩陣a 的逆矩陣

GPS定位的程序實現
Python代碼如下:
 其中zeros是NumPy提供的函數,用來建立指定維度的數組,
 zeros用來生成數組x用來存儲接受來自外部輸入的六顆衛星坐標,
 數組a,b用來存放前面算法中的系數矩陣,
 例程中我們還展示了兩種數組的索引方法,最后調用求矩陣逆的函數及點乘操作完成坐標計算。

from numpy import *
def main_GPSLocation():
    i = 1
    c = 0.299792458  # 光速 0.299792458km/us
    x = zeros((6, 4)) #存儲6個衛星的(x,y,z,t)參數
    while i<=6:
        print(" %s %d" % ("please input (x,y,z,t) of group",i) )
        temp=input()
        x[i-1]=temp.split()
        j=0
        while j<4:
            x[i-1][j]=float(x[i-1][j])
            j=j+1
        i=i+1
    a=zeros((4,4)) #系數矩陣
    b=zeros((4,1)) #常數項
    j=0
    while j<4:
        a[j][0]=2*(x[5][0]-x[j][0])
        a[j][1]=2*(x[5][1]-x[j][1])
        a[j][2]=2*(x[5][2]-x[j][2])
        a[j][3]=2*c*c*(x[j][3]-x[5][3])
        b[j][0]=x[5][0] * x[5][0] - x[j][0] * x[j][0] + \
                x[5][1] * x[5][1] - x[j][1] * x[j][1] + \
                x[5][2] * x[5][2] - x[j][2] * x[j][2] + \
            c*c*(x[j][3] * x[j][3] - x[5][3] * x[5][3])
        j=j+1
    a_ni=linalg.inv(a) #系數矩陣求逆
    print(dot(a_ni,b))

main_GPSLocation()
運行程序后,依次輸入6顆衛星的坐標,運算結果如下:




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM