Я думаю, вам нужно создать локальную систему координат, подобную 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
, так как он не требует "нормализации", чтобы посмотреть, если результаты выключены или нет. Если выключить, это может означать, что другие юниты или бог знает что ...