Нормализация наклонного магнитного поля Земли

Я и моя команда участвуем в конкурсе 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. Я задал этот вопрос на Math Stack Exchange, Physics Stack Exchange и Форумы Raspberry Pi. К сожалению, они не получили никаких ответов, поэтому я задаю этот вопрос снова.

Как мы можем это сделать? У нас есть данные для временной метки, местоположения МКС (широта, долгота, высота), магнитные данные (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 такова, что порты Ethernet + USB обращены к деке, а слот для SD-карты — к небу. Итак, это в основном вращение вокруг оси Y из плоскости. Таким образом, вы сохраняете ось Y прежней и меняете местами Z и X.


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

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

ИСС

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

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

местоположение

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


person Filip Š    schedule 25.01.2019    source источник
comment
Не могли бы вы уточнить значение направления с севера? Означает ли это вектор от северного полюса к спутнику?   -  person Saviour    schedule 25.01.2019
comment
@Saviour Из справки Sense HAT: вызывает set_imu_config для отключения гироскопа и акселерометра, а затем получает направление на север от магнитометра в градусах.   -  person Filip Š    schedule 25.01.2019


Ответы (1)


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

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

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

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

dot(measured_vector,reference_unit_direction)

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

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

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

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

[Изменить1]

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

Вектор геомагнитного поля 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 )

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

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

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

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

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

person Spektre    schedule 26.01.2019
comment
Это техпаспорт датчика IMU с магнитометром: st .com/web/en/resource/technical/document/datasheet/ - person Filip Š; 26.01.2019
comment
Значения X и Y, а также расчетные значения магнитометра будут зависеть от направления Sense HAT. Я этого не хочу, потому что я не смогу сравнить их с данными мировой магнитной модели. Я хочу нормализовать (не знаю, правильный ли это термин), чтобы иметь возможность сравнить их с данными из WMM. Я хочу получить различия с данными из Sense HAT и WMM. - person Filip Š; 26.01.2019
comment
Кроме того, можете ли вы также предоставить некоторые подробности и код Python для этого? Спасибо! - person Filip Š; 26.01.2019
comment
@FilipŠ 1. кодирование без каких-либо спецификаций бессмысленно, мы не знаем, какие системы координат, известные и неизвестные, которые вы получили, предоставленная вами таблица данных - это 3-осевой датчик, поэтому вы получили 3D-данные, как я предполагал, но вопрос в том, знаете ли вы, как это ориентированы относительно земли/МКС/экватора? И еще больший вопрос заключается в том, на какую форму данных вы хотите ссылаться, является ли она скалярной/2D/3D в какой системе координат относительно чего? Если эталоном является ваша модель магнитного поля Земли, вам также потребуется геолокация. 2. Я кодирую в основном на C++, python для меня тарабарщина. - person Spektre; 26.01.2019
comment
@FilipŠ ориентация может быть частично получена с помощью акселерометров, предоставляющих вам приблизительный вектор вверх / вниз по отношению к вашему датчику, но только приблизительный, поскольку происходит много вещей, а не только гравитация, и я предполагаю, что датчик не фиксирован, а на некоторых механизм рычага или что-то в этом роде... магнитный датчик может предоставить вам приблизительный вектор направления север/юг, поэтому из них вы можете построить локальную матрицу NEH... если вы знаете положение МКС, но можете ли вы сделать то же самое и для справочных данных ? - person Spektre; 26.01.2019
comment
@FilipŠ Я думаю, что должна быть какая-то бортовая система, делающая это на основе известных стартов (отслеживание) или даже подключенных к GPS, таких как позиционирование. Я не знаю, так как я не разрабатываю в этой области и у меня недостаточно справочной информации. Положение также может быть только виртуальным, а не измеренным, рассчитанным по реальному времени и параметрам орбиты МКС. - person Spektre; 26.01.2019
comment
Направление на север для нашего исследования не требуется. Я просто включил его, если это необходимо для этой нормализации. - person Filip Š; 26.01.2019
comment
Нашими реальными данными будут x,, y и z (магнитная напряженность оси в микротеслах (мкТл)) от магнитометра. Затем мы вычислили бы из них h и f. Затем мы также получим данные из WMM и сравним их с нашими данными, чтобы получить различия, но перед этим нам нужно будет их нормализовать. - person Filip Š; 26.01.2019
comment
Для системы координат мы используем классические широту, долготу и высоту, рассчитанные с помощью модуля Python ephem. Итак, если я правильно вас понимаю, нам нужно будет преобразовать их в NEH. - person Filip Š; 26.01.2019
comment
Кроме того, вы также можете добавить пример C++. Код должен быть написан на Python, но я также понимаю C++, поэтому смогу его преобразовать. - person Filip Š; 26.01.2019
comment
Спасибо! Для системы координат мы используем данные из эфемов sublat и sublong. Вот ссылка на это: rhodesmill.org/pyephem/quick.html#body- дата вычисления. Вам стоит заглянуть в раздел искусственные спутники. Я не знаю, какую именно систему координат он использует. С нашим кодом также доступен простой симулятор: trinket.io/library/trinkets/cc87813ce7 - person Filip Š; 27.01.2019
comment
@FilipŠ наличия местоположения недостаточно, если вы моделируете ... вам нужно точно знать, как датчик ориентирован относительно МКС ... и разместить это в базисных векторах. Вы также должны добавить ссылку на симуляцию в свой вопрос. Я до сих пор не совсем уверен в вычислении вектора севера из B теоретически он должен работать, но... я думаю, что горизонтальная плоскость в порядке, но не уверен насчет курса... так что X, Y могут быть повернуты, но это не должно влиять на H вычисление - person Spektre; 27.01.2019
comment
У меня есть информация, как ориентирован сенсор. В настоящее время я разговариваю по телефону, поэтому сегодня я обновлю свой вопрос, указав эти подробности. - person Filip Š; 27.01.2019
comment
Я добавил больше деталей в вопросе. - person Filip Š; 27.01.2019
comment
Спасибо за исчерпывающий ответ. Я снова попросил команду Astro Pi убедиться, что это полностью правильно. Когда я получу от них ответ, я проверю и приму это. Кроме того, если я правильно понимаю ваш ответ (в Edit1), мне также потребуется ускорение для расчета? Это нормально, потому что он доступен, но мне нужно знать, потому что мне нужно получить его вручную. - person Filip Š; 01.02.2019
comment
@FilipŠ Вам нужно ускорение для вычисления нисходящего вектора, поэтому, если вы получили его в известной системе отсчета из другого источника, то оно вам не нужно ... но, поскольку датчик имеет на борту акселерометр, лучше использовать его как стенд измерения (B,a) находятся в одной системе отсчета. Извините за поздний ответ, но месяц был в отпуске на море и на островах без компа :) только паруса морской песок и много рома... - person Spektre; 28.02.2019