Расчет магнитного курса с использованием необработанных данных акселерометра и магнитометра
У меня есть акселерометр и магнитометр, каждый из которых производит необработанные показания X, Y и Z. Из этого мне нужно определить магнитный курс объекта.
Я не очень хорош в триггере, но я собрал формулу, которая довольно хорошо реагирует на вращение устройства, но также реагирует на движение, которое, как вы думаете, не имеет отношения к делу, например, наклоняет устройство в таком положении. путь, который не влияет на направление, которое он указал. Такие, как укладка его плоско и "раскатывание" устройства.
Я думаю, что формула для расчета магнитного курса в порядке, но я думаю, что мои радиусы шага и крена для ввода неверны.
Так что я думаю, суть моего вопроса (если у кого-то нет формулы, которая это делает) - как рассчитать углы в радианах, используя акселерометр для тангажа и крена.
Во-вторых, любая информация о самой формуле заголовка будет отличной.
3 ответа
В зависимости от точности, необходимой для вашего приложения, вам может потребоваться решить несколько проблем:
Оси акселерометра откалиброваны? Я видел акселерометры MEM, которые имели оси, которые не были взаимно перпендикулярны, и имели значительно отличающиеся характеристики отклика для каждой оси (обычно X и Y совпадали, а Z отличались). Вам нужно будет синтезировать идеальные оси XYZ из любых физических показателей, которые дает ваше устройство. (Google 'калибровка акселерометра'.)
Калиброваны ли оси магнитометра? Проблема, аналогичная описанной выше, за исключением того, что ее гораздо сложнее проверить: очень трудно создать однородные калиброванные магнитные поля. Если вы используете окружающее геомагнитное поле, вам нужно будет тщательно контролировать локальный магнетизм вашей рабочей среды и ваших инструментов. (Google 'калибровка магнитометра'.)
После индивидуальной калибровки акселерометра и магнитометра их оси должны быть откалиброваны относительно друг друга. Поскольку оба эти устройства, как правило, припаяны к печатной плате, почти гарантировано значительное смещение. Во многих случаях расположение платы и параметры устройства могут даже не позволять осям XYZ соответствовать друг другу! Это может быть самой трудной частью в лабораторных условиях, поэтому я бы порекомендовал вам провести прямое сравнение, используя другое оборудование, имеющее оба типа датчиков и уже откалиброванное (например, телефон iPhone или Android), но проверьте устройство перед использования). Обычно это достигается путем корректировки двух предыдущих калибровочных матриц, пока они не сгенерируют векторы, которые правильно выровнены относительно друг друга.
Только после создания взаимно калиброванных векторов магнитного и акселерометра вы можете применять решения, предложенные другими респондентами.
Я описал только статическое решение, когда магнитометр и акселерометр неподвижны относительно локального гравитационного и магнитного полей. Если вам нужно генерировать ответы в режиме реального времени, когда система быстро движется, вам нужно будет учитывать временные характеристики каждого датчика. Есть два основных способа сделать это: 1) Применить фильтры временной области к каждому датчику, чтобы их выходы разделяли общую временную область (обычно добавляя некоторую задержку). 2) Используйте интеллектуальное моделирование для изменения выходных сигналов датчика в режиме реального времени (меньшая задержка, но больше шума).
Я видел фильтры Калмана, используемые для таких приложений, но применение их в векторной области может потребовать использования кватернионов вместо матриц Эйлера. Кватернионы проще в вычислительном отношении (требуется меньше операций по сравнению с матрицами), но я обнаружил, что их гораздо сложнее понять и понять правильно.
Или вы можете выбрать совершенно другой путь и использовать статистику и подбор данных, чтобы выполнить всю вышеуказанную работу за один гигантский шаг. Рассмотрим проблему следующим образом: учитывая 6 входных значений (XYZ каждое из некалиброванного магнитометра и акселерометра) и ссылку на устройство (если оно ручное, а на корпусе нарисована стрелка), выведите один угол, представляющий магнитный подшипник, на который указывает стрелка на корпусе, и угол наклона стрелки относительно вектора силы тяжести (наклон корпуса).
Используя откалиброванное эталонное устройство (как упомянуто выше), соедините его с калибруемым устройством и возьмите несколько сотен точек данных с устройством в разных ориентациях. Затем используйте мощный математический пакет, такой как Matlab, MathCAD, R или SciPy, чтобы настроить и решить нелинейные уравнения для создания матриц преобразования.
Вы не думаете в достаточно измерениях. Это будет ответом только в двух измерениях, и он будет прекрасно работать, если вы сможете найти способ, чтобы "Z" всегда совпадал с гравитацией.
int heading=180-atan2(mag_datX, mag_datY)/0.0174532925; // 0/359=N, 90=E, 180=S, 270=W
(если вы читаете непосредственно с устройства - знайте, что оно, вероятно, возвращает X, Z, Y - не X, Y, Z!)
Однако - это не проблема 2D-компаса - представьте, что вы достаете иглу из компаса, уравновешиваете ее так, что гравитация не играет никакой роли в поддержании его "уровня", и вы обнаружите, что "север" будет указывать немного вверх или вниз - в зависимости от того, где вы находитесь (или, если на полюсах, прямо вверх или вниз!).
Поэтому вам нужно попытаться вычислить ТРЕХМЕРНЫЙ вектор из всех трех значений - это матричная операция.