我和我的团队正在参加ESA Astro Pi挑战。我们的程序将在ISS上运行3个小时,我们将返回结果并对其进行分析。
我们想研究Sense HAT磁力计的磁强度测量结果与世界磁模型(WMM)的预测之间的联系。我们想研究Sense HAT上磁力计的准确性。
该程序将从Sense HAT中获取微特斯拉中的原始磁力计数据(X
,Y
和Z
),并按照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 Exchange,Physics Stack Exchange和Raspberry Pi Forums上问过。毫无生气,他们没有收到任何答案,所以我再次问这个问题。
我们该怎么做?我们拥有时间戳,ISS位置(纬度,经度,海拔),磁数据(X
,Y
和Z
)以及从北方来的方向的数据。
我们想规范化我们的数据,以便我们能够将它们与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。整个空间站的行进方向朝着可充气的地球球,您可以在左侧看到它。
因此,从广义上讲,SD卡插槽指向方位角,而远离地球中心(即X轴)。 LED矩阵面向空间站的行进方向(Z轴)。
由于国际空间站的轨道路径,Z和Y轴在绕地球移动时将相对于两极不断改变方向。
所以,我猜您想对角度测量进行归一化,以使其看起来像是由对准北/南的设备进行的测量?
答案 0 :(得分:2)
我认为您需要创建类似于 NEH (北,东,高/海拔/上)的本地参考坐标系,
它通常在航空中用作参考系(标题是从中得出的),因此参考系是根据地理位置及其指向北,东和上< / strong>。
现在的问题是aligned North/South
和normalizing
是什么意思。??
如果参考设备仅测量投影,则您需要执行以下操作:
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 )
,因为它不需要任何“规范化”即可查看是否结果是否正确。如果关闭,则可能表明其他单位或上帝知道...