歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Python 實現布爾莎轉換模型

1. 公式

布爾莎七參數的數學模型為

 [X1,Y1,Z1]為待求坐標,[X2,Y2,Z2]為目標坐標系坐標。顧及旋轉角度都是非常小的,布爾莎七參數轉換模型的數學模型可以簡化為:

這樣有利於使用編程語言來求解。由公式可知,必要觀測條件數為 t=7, 所以至少需要3個已知點對。設已知點對數為m,則多余觀測數 r = 3*m - 7, 這在最終的精度評定中是有用的。

2. 核心問題

1. 由於是同等精度觀測且相互獨立,最終使用的權陣應該為單位矩陣 P(3m*3m), m為已知點對個數。

p = np.eye(n)  # 單位權矩陣 3n * 3n

2. 程序實現時,所有的已知點對XYZ坐標都讀入相應的列矩陣,系數陣B同樣需要這樣操作(V=BX-L)。在numpy處理時可以表示為:

for i in range(vector_count):
        matrix_source.append(vector3d_list_source[i].X)
        matrix_source.append(vector3d_list_source[i].Y)
        matrix_source.append(vector3d_list_source[i].Z)
        matrix_dest.append(vector3d_list_dest[i].X)
        matrix_dest.append(vector3d_list_dest[i].Y)
        matrix_dest.append(vector3d_list_dest[i].Z)
        matrix_B.append([1, 0, 0, 0, -vector3d_list_source[i].Z, vector3d_list_source[i].Y, vector3d_list_source[i].X])
        matrix_B.append([0, 1, 0, vector3d_list_source[i].Z, 0, -vector3d_list_source[i].X, vector3d_list_source[i].Y])
        matrix_B.append([0, 0, 1, -vector3d_list_source[i].Y, vector3d_list_source[i].X, 0, vector3d_list_source[i].Z])
    matrix_source =  np.array(matrix_source).reshape(1, -1).T
    matrix_dest = np.array(matrix_dest).reshape(1, -1).T
    matrix_B =  np.array(matrix_B)
    L = matrix_dest - matrix_source

3. 參數矩陣值(列矩陣)

X = np.dot(np.linalg.inv(np.dot(matrix_B.T, matrix_B)), np.dot(matrix_B.T, L))

4. 誤差方程

V = np.dot(matrix_B, X) - L #誤差方程

5. 精度評估

standard_deviation = math.sqrt(np.dot(np.dot(V.T, p), V) / r) # 轉換中誤差

Copyright © Linux教程網 All Rights Reserved