归一化地磁场磁场

时间:2019-01-25 17:37:34

标签: python 3d raspberry-pi physics wgs84

我和我的团队正在参加ESA Astro Pi挑战。我们的程序将在ISS上运行3个小时,我们将返回结果并对其进行分析。


我们想研究Sense HAT磁力计的磁强度测量结果与世界磁模型(WMM)的预测之间的联系。我们想研究Sense HAT上磁力计的准确性。

该程序将从Sense HAT中获取微特斯拉中的原始磁力计数据(XYZ),并按照British geological survey's article中所述计算H和F值(本节2.1)。然后将它们以及使用ephem计算的时间戳和位置保存到CSV文件中。

然后,我们将比较来自ISS和WMM的Z,H和F值,并使用我们的数据和差异创建映射(如图6、8和10)。然后,我们将研究Sense HAT磁力计数据的准确性。


我们想将我们的数据与WMM数据进行比较,以了解Sense HAT磁力计的准确性如何,但存在磁力计方向始终不同的问题。因此,我们的数据将始终(与WMM完全不同),因此我们将无法正确比较它们。

我们与Astro Pi支持团队进行了交谈,他们建议“对角度测量进行归一化,以便看起来像是由对准北/南的设备进行的测量。”

不幸的是,我们(和他们)不知道该怎么做,所以他们建议在Stack Exchange上问这个问题。我在Math Stack ExchangePhysics Stack ExchangeRaspberry Pi Forums上问过。毫无生气,他们没有收到任何答案,所以我再次问这个问题。

我们该怎么做?我们拥有时间戳,ISS位置(纬度,经度,海拔),磁数据(XYZ)以及从北方来的方向的数据。

我们想规范化我们的数据,以便我们能够将它们与WMM中的数据正确比较。


这是我们程序的一部分,该程序计算磁力计的值(未获得归一化的数据):

compass = sense.get_compass_raw()

try:
    # Get raw data (values are swapped because Sense HAT on ISS is in different position)
    # x: northerly intensity
    # y: easterly intensity
    #  z: vertical intensity
    x = float(compass['z'])
    y = float(compass['y'])
    z = float(compass['x'])

except (ValueError, KeyError) as err:
    # Write error to log (excluded from this snippet)
    pass

try:
    # h: horizontal intensity
    # f: total intensity
    # d: declination
    # i: inclination
    h = sqrt(x ** 2 + y ** 2)
    f = sqrt(h ** 2 + z ** 2)
    d = degrees(atan(y / x))
    i = degrees(atan(z / h))

except (TypeError, ValueError, ZeroDivisionError) as err:
    # Write error to log (excluded from this snippet)
    pass

我们的代码中还提供了一些简单的模拟器:https://trinket.io/library/trinkets/cc87813ce7


来自Astro Pi团队的有关磁力计位置和位置的电子邮件的一部分:

  
      
  • Z穿过Sense Hat的中间。
  •   
  • X在USB端口和SD卡插槽之间运行。
  •   
  • Y从HDMI端口延伸到40针引脚接头。
  •   
     

在ISS上,AstroPi的方向是以太网+ USB端口面向甲板,而SD卡插槽朝向天空。   因此,这基本上是从平面绕Y轴旋转。因此,您将Y轴保持不变,并围绕Z和X进行交换。

     
     

它可以帮助您查看ISS哥伦布模块内部的Google Street视图,以更好地了解AstroPi的位置;   https://www.google.com/streetview/#international-space-station/columbus-research-laboratory

     

如果将摄像机向下和向右平移,则会看到绿灯-这就是AstroPi。整个空间站的行进方向朝着可充气的地球球,您可以在左侧看到它。

     

ISS

     

因此,从广义上讲,SD卡插槽指向方位角,而远离地球中心(即X轴)。   LED矩阵面向空间站的行进方向(Z轴)。

     

由于国际空间站的轨道路径,Z和Y轴在绕地球移动时将相对于两极不断改变方向。

     

location

     

所以,我猜您想对角度测量进行归一化,以使其看起来像是由对准北/南的设备进行的测量?

1 个答案:

答案 0 :(得分:2)

我认为您需要创建类似于 NEH (北,东,高/海拔/上)的本地参考坐标系,

它通常在航空中用作参考系(标题是从中得出的),因此参考系是根据地理位置及其指向北,东上< / strong>。

现在的问题是aligned North/Southnormalizing是什么意思。??

如果参考设备仅测量投影,则您需要执行以下操作:

dot(measured_vector,reference_unit_direction)

方向为North方向,但作为单位矢量。

如果参考设备也测量了全3D ,那么您需要将参考数据和经过测试的测量数据都转换为同一坐标系。通过使用

如此简单的matrix * vector乘法就可以了...只有然后计算值H,F,Z,我不知道它们是什么,而且太懒了以致无法阅读论文...会期望{{1} }或E,H向量。

但是,如果在测量时刻没有地理位置,则相对于国际空间站的B方向仅以欧拉角的形式,因此根本无法构造3D参考系(除非您有2个已知向量,而不是像UP这样的向量)。在这种情况下,您需要使用选项1 projection (使用点积和北向矢量)。因此,之后您将只处理标量值而不是3D向量。

[Edit1]

通过您的链接:

  

地磁场矢量B由正交描述   分量X(向北强度),Y(向东强度)和Z   (垂直强度,向下为正);

这不是我的专业领域,所以我在这里可能是错的,但这是我的理解方式:


North-磁场矢量
B(Bx,By,Bz)-加速

现在a(ax,ay,az)的大小为F,因此其旋转不变:

B

您需要计算NED参考帧(北,东,下)中B的X,Y,Z值,因此首先需要基向量:

F = |B| = sqrt( Bx*Bx + By*By + Bz*Bz )

您应该使它们可视化地检查它们是否指向正确的方向,如果不通过重新排列交叉操作数取反它们的话(我可能使用了错误的顺序来代替使用Up向量)。现在,只需将Down = a/|a| // gravity points down North = B/|B| // north is close to B direction East = cross(Down,North) // East is perpendicular to Down and North North = cross(East,Down) // north is perpendicular to Down and East, this should convert North to the horizontal plane 转换为 NED 即可:

B

现在您可以计算X = dot(North,B) Y = dot(East,B) Z = dot(Down,B)

H

所需的向量数学运算将在上面的转换矩阵链接中找到。

请注意,只有在不存在加速度的情况下(传感器在操作过程中未将机械臂放在机械臂上,或者ISS并未在灼伤……),此方法才有效。否则,您需要获取 NED >框架不同(例如车载系统)

如果这不能正常工作,则可以从ISS位置计算NED,但是为此,您需要知道传感器相对于提供位置的仿真模型的确切方向和位移。我不知道ISS会做什么样的轮换,所以除非万不得已,否则我不会碰那个话题。

恐怕我将有一段时间没有编码时间了……总之,如果没有样本输入数据也没有坐标系统说明,并且所有输入/输出变量都是疯狂的,那么编码……简单的轴取反将使编码无效。整个过程中都有很多重复项,要覆盖所有这些重复项,您最终会有很多版本尝试...

应逐步构建应用程序,但恐怕无法访问仿真或实际硬件是不可能的。还有很多事情可能会出错...使即使简单的程序也难以编写代码...我将首先检查H = sqrt( X*X +Y*Y ) ,因为它不需要任何“规范化”即可查看是否结果是否正确。如果关闭,则可能表明其他单位或上帝知道...