Нормализующее угловое магнитное поле Земли - PullRequest
0 голосов
/ 25 января 2019

Я и моя команда участвуем в соревнованиях ESA Astro Pi .Наша программа будет работать на МКС в течение 3 часов, и мы вернем результаты и проанализируем их.


Мы хотим исследовать связь между измерениями магнитной интенсивности от Sense HAT магнитометраи предсказания из Мировой Магнитной Модели (WMM).Мы хотим исследовать точность магнитометра в Sense HAT.

Программа получит необработанные данные магнитометра (X, Y и Z) в микротеслале из Sense HAT и вычислит значения H и Fкак описано в статье Британской геологической службы (раздел 2.1).Затем он сохранит их в файл CSV вместе с отметкой времени и местоположением, рассчитанными с помощью ephem.

Затем мы сравним значения Z, H и F из ISS и WMM и создадим карты с нашими данными и различиями (как на рисунках 6, 8 и 10).Затем мы исследуем, насколько точны данные магнитометра Sense HAT.


Мы хотим сравнить наши данные с данными из WMM, чтобы увидеть, насколько точен магнитометр Sense HAT, но у нас есть проблема, связанная с ориентацией магнитометра.всегда будет другим.Из-за этого наши данные всегда будут (очень) отличаться от WMM, поэтому мы не сможем их правильно сравнить.

Мы поговорили со службой поддержки Astro Pi, и они предложили «нормализовать угловые измерения, чтобыпохоже, что они были взяты устройством, выровненным по направлениям Север / Юг ".

К сожалению, мы (и они) не знаем, как это сделать, поэтому они предложили задать этот вопрос на Stack Exchange.Я спросил об этом на Математическом стеке , Физическом стеке и Raspberry Pi Forums .Вне всякого сомнения, они не получили никаких ответов, поэтому я снова задаю этот вопрос.

Как мы можем это сделать?У нас есть данные для отметки времени, местоположения МКС (широта, долгота, высота), магнитные данные (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-контактному разъему.

На МКС ориентация AstroPi такова, что порты Ethernet + USB обращены к палубе, а слот для SD-карты - к небу.Итак, это в основном вращение вокруг оси Y от плоскости.Таким образом, вы сохраняете ось Y одинаковой и меняете местами Z и X.


Это может помочь взглянуть на вид Google Street внутри модуля ISS Columbus, чтобы лучше понять, как AstroPiпозиционируется;https://www.google.com/streetview/#international-space-station/columbus-research-laboratory

Если вы наклоните камеру вниз и вправо, вы увидите зеленый свет - это AstroPi.Направление движения всей космической станции - надувной шарик Земли, который вы видите слева.

ISS

Итак, в общем, SDслот для карты указывает на азимут, как вдали от центра Земли (так оси X).Светодиодная матрица направлена ​​в направлении движения космической станции (ось Z).

Из-за траектории орбиты МКС оси Z и Y будут постоянно менять направление относительно полюсов при перемещении вокруг нее.Земля.

location

Итак, я предполагаю, что вы хотите нормализовать угловые измерения так, чтобы они выглядели так, как будто они были сделаны устройством, выровненным с севера на юг?

1 Ответ

0 голосов
/ 26 января 2019

Я думаю, вам нужно создать локальную систему координат, подобную NEH (север, восток, высота / высота / вверх), что-то вроде

Обычно он используется в авиации в качестве системы отсчета (из нее получается заголовок), поэтому ваша система отсчета рассчитывается исходя из вашего географического положения, а ее оси указывают на Север, Восток и Вверх .

Теперь проблема в том, что это означает aligned North/South и normalizing ..?

Если эталонное устройство измеряет только проекцию , чем вам нужно будет сделать что-то вроде этого:

dot(measured_vector,reference_unit_direction)

где направление будет направлением North, но в виде единичного вектора.

Если эталонное устройство также измеряет full 3D , то вам необходимо преобразовать как контрольные, так и проверенные данные измерений в одну и ту же систему координат. Это делается с помощью

Так просто matrix * vector умножение подойдет ... Только тогда вычислим значения H,F,Z, которые я не знаю, какие они есть, и слишком ленив, чтобы просматривать бумаги ... ожидал бы E,H или B векторов вместо этого.

Однако, если у вас нет географического местоположения в момент измерения, у вас есть только направление North относительно МКС в форме углов Эйлера, поэтому вы вообще не можете построить трехмерную систему отсчета (если вы не получили 2 известные векторы вместо одного, такого как UP). В таком случае вам нужно выбрать опцию 1 проекция (с использованием точечного произведения и вектора направления на север). Таким образом, впоследствии вы будете обрабатывать только скалярные значения вместо трехмерных векторов.

[Edit1]

По вашей ссылке:

Вектор геомагнитного поля, B, описывается ортогональным компоненты X (северная интенсивность), Y (восточная интенсивность) и Z (вертикальная интенсивность, положительная вниз);

Это не моя область знаний, поэтому я могу ошибаться, но вот как я понимаю:


B(Bx,By,Bz) - вектор магнитного поля
a(ax,ay,az) - ускорение

Теперь F является величиной B, поэтому его инвариант при вращении:

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

вам нужно вычислить значения X, Y, Z для B в системе отсчета NED (север, восток, вниз), поэтому сначала вам понадобятся базисные векторы:

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

Вы должны сделать так, чтобы они визуально проверяли, указывают ли они на правильные направления, если не отменяют их, переупорядочивая перекрестные операнды (возможно, у меня неправильный порядок, вместо этого я использовал вектор Up). Теперь просто конвертируйте B в NED :

X = dot(North,B)
Y = dot(East,B)
Z = dot(Down,B)

А теперь вы можете вычислить H

H = sqrt( X*X +Y*Y )

Векторная математика, необходимая для этого, вы найдете в ссылке на матрицу преобразования выше.

остерегайтесь, это будет работать, только если нет ускорений (датчик не находится на манипуляторе робота во время его работы, или МКС не сжигает ...) В противном случае вам нужно получить NED кадр по-другому (как у бортовых систем)

Если это не работает должным образом, то вы можете вычислить NED из вашей позиции на МКС, но для этого вам нужно будет знать точную ориентацию и смещение датчика относительно вашей имитационной модели, которая обеспечивает ваше местоположение. Я не знаю, что делает вращение МКС, поэтому я бы не затрагивал эту тему, если бы не было крайней меры.

Я боюсь, что у меня не будет времени для кодирования в течение некоторого времени ... в любом случае, кодирование без выборочных входных данных, без расширений системы координат и всех входных / выходных переменных - безумие ... простое отрицание оси сделает недействительным все это и есть множество дубликатов по пути, и чтобы покрыть все из них, у вас будет много разных версий, чтобы попытаться ...

Приложения должны создаваться постепенно, но я боюсь, что без доступа к симуляции или реального HW это невозможно. И есть целый ряд вещей, которые могут пойти не так ... сделать даже простые программы более трудными для кодирования ... Я сначала проверил бы F, так как он не требует "нормализации", чтобы посмотреть, если результаты выключены или нет. Если выключить, это может означать, что другие юниты или бог знает что ...

...