3D(7 参数)Helmert 变换在 Python 中不起作用

Posted

技术标签:

【中文标题】3D(7 参数)Helmert 变换在 Python 中不起作用【英文标题】:3D (7 Parameter) Helmert Transformation Not Working in Python 【发布时间】:2020-10-27 05:44:30 【问题描述】:

我正在尝试用 Python 创建一个程序,它可以让我检查我的测量软件中的大地测量应用程序吐出的大地测量变换。我有一个测试点并且知道我的程序当前返回的都是垃圾。

我使用的公式是 7 参数 Halmert 变换:

Vb = T + (1 + s * 10^−6)•R•Va

我的代码是:

import numpy as np
from math import pow

# Input Parameters
Tx = 89.5          # in metres
Ty = 93.8
Tz = 123.1
Rx = 0             # in arcsecs
Ry = 0
Rz = 0.156
s = -1.2           # ppm
Vax = 58.000086817 # Lat
Vay = 0.723469322  # Long
Vaz = 0            # Height

# Arrays
T = np.array([[Tx], [Ty], [Tz]])
R = np.array([[1, -Rz, Ry], 
              [Rz, 1, -Rx], 
              [-Ry, Rx, 1]])
Va = np.array([[Vax], [Vay], [Vaz]])

# Calculations
RVa = R * Va
RVa = np.sum(RVa, axis=1)
RVa = np.array([[RVa[0]], [RVa[1]], [RVa[2]]])

S = 1 + s * pow(10, -6)

SRVa = S * RVa

Vb = T + SRVa

正确的输出是:

纬度 = 58.0007206472222 长 = 0.72507962777778

我还有很长的路要走。

我知道发生了一些有趣的事情,因为我在求和后尝试转置 RVa,但什么也没发生(因此手动转置。我显然把事情搞砸了,感谢任何帮助。

干杯,

【问题讨论】:

您是否尝试过使用可以或多或少手动解决的已知案例进行调试? 【参考方案1】:

Helmert 变换用于将相对于一个坐标系的笛卡尔(ECEF,又称地心地球固定)坐标中的点映射到相对于另一个坐标系的笛卡尔坐标。

如果要将相对于第一个坐标系的纬度、经度、高度坐标转换为相对于第二个坐标系的经度、经度、高度坐标,钻头是:

Convert the lat,long,height coordinates to cartesians
Apply Helmert to those cartesians, getting cartesians relative to the second coordinate system
Convert those cartesians to lat,long,height in second coordinate system

几点:

Helmert 变换参数通常用于地球的椭球模型。忽略这一点并使用球形地球会引入数十甚至数百米的误差。

当从和到笛卡尔坐标转换时,高度是椭球高度,即从椭球到您的点沿椭球法线的距离。您很可能将一个系统中的 0 高度转换为另一个系统中的非零点。但是,如果您靠近地球表面,则忽略高度引起的误差会很小(通常是亚米)。

【讨论】:

以上是关于3D(7 参数)Helmert 变换在 Python 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB点云处理(二十):三维刚体几何变换矩阵(regid3d)与仿射几何变换矩阵(affine3d)

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记7——四大变换

如何使用椭圆计算透视变换

自定义UI 使用Camera做三维变换

特征工程--特征变换

自定义UI 使用Camera做三维变换