Ориентация по показаниям магнитометра и акселерометра
возвращает orientation = ecompass(accelerometerReading,magnetometerReading)quaternion которые могут поворачивать величины из родительского (NED) кадра в дочерний (сенсорный) кадр.
задает формат ориентации как orientation = ecompass(accelerometerReading,magnetometerReading,orientationFormat)quaternion или матрица вращения.
также позволяет задать опорную рамку orientation = ecompass(accelerometerReading,magnetometerReading,orientationFormat,'ReferenceFrame',RF)RF из orientation выход. Определить RF как 'NED' (Север-Восток-вниз) или 'ENU' (Восток-Север-Вверх). Значение по умолчанию: 'NED'.
ecompass функция возвращает матрицу кватерниона или поворота, которая может поворачивать величины из родительского (NED, например) кадра в дочерний (сенсорный) кадр. Для обоих форматов ориентации вывода оператор поворота определяется вычислением матрицы поворота.
Матрицу вращения сначала вычисляют с помощью промежуточного средства:
aa × ma]
и затем нормализовано по столбцам. a и m являются accelerometerReading входные данные и magnetometerReading вход, соответственно.
Чтобы понять вычисление матрицы вращения, рассмотрим произвольную точку на Земле и соответствующий ей локальный кадр NED. Предположим, что корпус датчика [x, y, z] имеет то же начало координат.

Напомним, что ориентация корпуса датчика определяется как оператор поворота (матрица поворота или кватернион), необходимый для поворота величины от родительского (NED) кадра к дочернему (корпусу датчика) кадру:
pchild]
где
R - матрица вращения 3 на 3, которая может быть интерпретирована как ориентация дочернего кадра.
pparent является вектором 3 на 1 в родительском кадре.
pchild - вектор 3 на 1 в дочернем кадре.
Для стабильного корпуса датчика акселерометр возвращает ускорение под действием силы тяжести. Если корпус датчика полностью выровнен с системой координат NED, все ускорение, вызванное гравитацией, происходит вдоль оси Z, и акселерометр считывает [0 0 1]. Рассмотрим матрицу вращения, необходимую для поворота величины от системы координат NED до величины, указанной акселерометром.

Третий столбец матрицы вращения соответствует показанию акселерометра:
Магнитометр, считывающий данные, указывает на магнитный север и находится в плоскости N-D. Рассмотрим корпус датчика, выровненный с системой координат NED.

По определению, ось E перпендикулярна плоскости N-D, поэтому N ⨯ D = E, в пределах некоторого масштабирования амплитуды. Если корпус датчика совмещен с NED, то вектор ускорения от акселерометра и вектор магнитного поля от магнитометра лежат в плоскости N-D. Поэтому m ⨯ a = y, снова с некоторым масштабированием амплитуды.
Рассмотрим матрицу поворота, необходимую для поворота NED к дочернему кадру, [x y z].

Второй столбец матрицы вращения соответствует поперечному произведению показаний акселерометра и магнитометра:
По определению матрицы вращения столбец 1 является перекрестным произведением столбцов 2 и 3:
m) × a
Наконец, матрица вращения нормализуется по столбцам:
Примечание
ecompass алгоритм использует для системы координат NED магнитный север, а не истинный север.
[1] Слияние датчиков с открытым исходным кодом. https://github.com/memsindustrygroup/Open-Source-Sensor-Fusion/tree/master/docs