В зависимости от точности, необходимой для вашего приложения, вам может потребоваться решить несколько проблем:
Калиброваны ли оси акселерометра?Я видел акселерометры MEM, которые имели оси, которые не были взаимно перпендикулярны, и имели значительно отличающиеся характеристики отклика для каждой оси (обычно X и Y совпадали, а Z отличались).Вам нужно будет синтезировать идеальные оси XYZ из любых физических показателей, которые дает ваше устройство.(Google 'калибровка акселерометра'.)
Калиброваны ли оси магнитометра?Проблема, аналогичная описанной выше, за исключением того, что ее гораздо сложнее проверить: очень трудно создать однородные калиброванные магнитные поля.Если вы используете окружающее геомагнитное поле, вам нужно будет тщательно контролировать локальный магнетизм вашей рабочей среды и ваших инструментов.(Google 'Калибровка магнитометра'.)
После того, как акселерометр и магнитометр были откалиброваны по отдельности, их оси должны быть откалиброваны относительно друг друга.Поскольку оба эти устройства, как правило, припаяны к печатной плате, почти гарантировано значительное смещение.Во многих случаях расположение платы и параметры устройства могут даже не позволять осям XYZ соответствовать друг другу!Это может быть самой трудной частью в лабораторных условиях, поэтому я рекомендую вам провести прямое сравнение, используя другое оборудование, которое имеет оба типа датчиков и уже откалибровано (например, телефон iPhone или Android - но проверьте устройство до того, какиспользования).Обычно это достигается путем настройки двух предыдущих калибровочных матриц до тех пор, пока они не сгенерируют векторы, которые правильно выровнены относительно друг друга.
Только после генерации взаимно калиброванных векторов магнитного и акселерометра вы можетепримените решения, предложенные другими респондентами.
Я описал только статическое решение, в котором магнитометр и акселерометр неподвижны относительно локального гравитационного и магнитного полей.Если вам нужно генерировать ответы в режиме реального времени, когда система быстро движется, вам нужно будет учитывать временные характеристики каждого датчика.Есть два основных способа сделать это: 1) Применить фильтры временной области к каждому датчику, чтобы их выходы разделяли общую временную область (обычно добавляя некоторую задержку).2) Используйте интеллектуальное моделирование для изменения выходных сигналов датчика в режиме реального времени (меньшая задержка, но больше шума).
Я видел фильтры Калмана, используемые для таких приложений, но применение их в векторной области может потребовать использованиякватернионы вместо эйлеровых матриц.Кватернионы проще использовать в вычислительном отношении (требуется меньше операций по сравнению с матрицами), но я обнаружил, что их гораздо сложнее понять и понять.
Или вы можете выбрать совершенно другой путь и использовать статистику иподгонка данных для выполнения всей вышеперечисленной работы за один гигантский шаг.Рассмотрим проблему следующим образом: учитывая 6 входных значений (XYZ каждое из некалиброванного магнитометра и акселерометра) и ссылку на устройство (если оно ручное, а на корпусе нарисована стрелка), выведите один угол, представляющиймагнитный подшипник, на который указывает стрелка на корпусе, и угол наклона стрелки относительно вектора силы тяжести (наклон корпуса).
Используя калиброванное эталонное устройство (как упомянуто выше), соедините его сустройство должно быть откалибровано, и взять несколько сотен точек данных, с устройством в разных ориентациях.Затем используйте мощный математический пакет, такой как Matlab, MathCAD, R или SciPy, для настройки и решения нелинейных уравнений для создания матриц преобразования.