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) # 轉換中誤差