Получение ориентации с 3-х осевым акселерометром и гироскопом
Это мой первый пост на SO. Я еще не разработал много кода для встраиваемых систем, но у меня мало проблем и мне нужна помощь более опытных программистов. Я использую следующие устройства: - плату LandTiger с микроконтроллером LPC1768 (Cortex M3), - Digilent pmodACL с акселерометром ADXL345 (3 оси), - Digilent pmodGYRO с гироскопом L3G4200D (3 оси).
Я хотел бы получить некоторую информацию об ориентации устройства, то есть углы поворота по осям X, Y и Z. Я читал, что для достижения этой цели мне нужно объединить данные из акселерометра и гироскопа, используя фильтр Каллмана или его более простую форму, т.е. дополнительный фильтр. Я хотел бы знать, возможно ли рассчитывать крен, наклон и рыскание от полного диапазона (0-360 градусов), используя данные измерений только с гироскопа и акселерометра (без магнитометра). Я также нашел некоторые математические формулы ( http://www.ewerksinc.com/refdocs/Tilt%20Sensing%20with%20LA.pdf и http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdf) но они содержат корневые квадраты в числителях / знаменателях, поэтому информация о собственном квадранте системы координат теряется.
1 ответ
Вопрос, который вы задаете, является довольно частым и довольно сложным, со многими различными решениями. Хотя в названии упоминается только акселерометр, в тексте вашего поста упоминается гироскоп, поэтому я предполагаю, что у вас есть оба. Кроме того, есть много шагов к тому, чтобы заставить работать недорогие акселерометры и гироскопы, одним из которых является преобразование напряжения в измерение. Я не буду освещать эту часть.
В первую очередь я отвечу на ваш вопрос. Вы спросили, можно ли, посчитав гироскопические измерения, оценить положение (ориентацию) устройства в углах Эйлера.
Краткий ответ: Да, вы можете суммировать масштабированные гироскопические измерения, чтобы получить очень шумную оценку вращения устройства (фактические радианы, а не ориентацию), однако оно не будет работать, как только вы повернете более одной оси. Этого не хватит для большинства приложений.
Я предоставлю вам некоторые общие советы, конкретные знания и пример кода, который я использовал ранее.
Во-первых, вы не должны пытаться решить эту проблему, написав программу и протестировав ее с помощью IMU. Вам следует начать с написания симуляции с использованием проверенных библиотек, затем проверить ваш алгоритм / программу и только затем попытаться реализовать ее с помощью IMU.
Во-вторых, вы говорите, что хотите "считать крен, наклон и рыскание от полного диапазона (0-360 градусов)". Исходя из этого, я предполагаю, что вы имеете в виду, что вы хотите иметь возможность определять углы Эйлера, которые представляют отношение устройства относительно внешнего стационарного кадра "северо-восток-вниз" (NED). Ваше утверждение заставляет меня думать, что вы не знакомы с представлениями об отношении, потому что, насколько я знаю, нет представлений Эйлеровых углов со всеми 3 углами в диапазоне 0-360.
Приложение, для которого вы хотите использовать отношение устройства, будет иметь важное значение. Если вы используете Euler Angles, вы не сможете точно отследить положение устройства, когда на осях крена или тангажа совершаются большие (более чем на 50 градусов) повороты из-за того, что известно как Gimbal Lock. Если вам требуется отслеживание таких движений, вам нужно будет использовать кватернионное или косинус-матричное представление (DCM) для представления позиции.
В-третьих, как вы сказали, вы можете использовать дополнительный фильтр или вариант фильтра Калмана (расширенный фильтр Калмана, фильтр состояния Калмана с ошибкой, косвенный фильтр Калмана) для точного отслеживания положения устройства путем объединения данных с акселерометра, гироскопа и магнитометр. Я предлагаю Complimentary Filter, описанный Madgwick, который реализован на C, C# и MATLAB здесь. Вариант фильтра Калмана был бы необходим, если вы хотите отслеживать положение устройства и иметь дополнительный датчик, такой как GPS.
Для моего примера кода, использующего только акселерометр, чтобы получить угол наклона Эйлера, посмотрите мой ответ на этот другой вопрос.