Делаю OSD, автопилот и инерциалку...

Musgravehill
Diman_Y:

Итак, как это сделать?

Я бы сначала начал корректировать положение по акселям в моменты, когда перегрузки ~ G. А потом уже проецировать вектор магнитного поля на полученную повернутую плоскость.
Посмотрите DCM.cpp в АрдуКоптере.

Diman_Y:

Из-за наличия постоянной составляющей в сигнале гироскопа, значение после интегрирования постоянно “плывет”

Я думал, что это накапливается ошибка во время интегрирования… Постоянную составляющую нужно вычитать.

Diman_Y
Musgravehill:

Я бы сначала начал корректировать положение по акселям в моменты, когда перегрузки ~ G. А потом уже проецировать вектор магнитного поля на полученную повернутую плоскость.

Думал я про аксель. Не годится он. Использовать аксель можно только как второй контур коррекции.
Вектор, который выдает аксель: А = g + а; g - векторо силы тяжести, a - комбинированный вектор дополнительной силы ( маневр, ветер, двигатель и т.д.), |g| - 9.8.
Из этих данный положение самолета определить невозможно. Простой пример:
Вектор A в покое будет равно А когда самолет делает петлю с перегрузкой 2g.
Короче, аксель использовать можно, но только как вспомогательный инструмент.

Musgravehill:

Я думал, что это накапливается ошибка во время интегрирования… Постоянную составляющую нужно вычитать.

Проблема в том, что эта постоянная составляющая не такая уж и постоянная. 😃 Она плывает сама по себе. В определенном диапазоне конечно, но все равно плывет. Понятное дело что я вычитаю ее до интегрирования, но этого недостаточно.

Вообще, задача с коррекцией гироскопа мне очень напоминает задачу АПЧ на основе коррекции честоты (есть еще на основе коррекции фазы).

Musgravehill
Diman_Y:

Думал я про аксель. Не годится он. Использовать аксель можно только как второй контур коррекции.
Вектор, который выдает аксель: А = g + а; g - векторо силы тяжести, a - комбинированный вектор дополнительной силы ( маневр, ветер, двигатель и т.д.), |g| - 9.8.

В АрдуКоптере корректировка по акселю происходит, когда а = достаточно мал (по мнению эксперта). Не всегда же летим быстро и по дуге. При полете блинчиком коррекция срабатывает постоянно.

Diman_Y
Musgravehill:

В АрдуКоптере корректировка по акселю происходит, когда а = достаточно мал (по мнению эксперта). Не всегда же летим быстро и по дуге. При полете блинчиком коррекция срабатывает постоянно.

Все верно. Это и есть второй контур коррекции. Аксель будет использоваться потом, для коррекции как компаса так и гироскопа.
Т.е. аксель будет использоваться для маневров как аксель, и для корреции в прямолинейном полете.

Тут только что придумал как делать коррекцию гироскопа по компасу.

  1. Измеряем компас.
  2. Измеряем положение по гироскопу D’
  3. Проецируем положение на вектор
  4. Корректируем проекции
  5. На основе корреций, корректируем вектор.

В худшем случае мы не сможем корректировать один из векторов положения, когда вектор изменение положения будет в плоскости перпендикулярной вектору компаса.

Musgravehill
Diman_Y:
  1. Измеряем компас.
  2. Измеряем положение по гироскопу D’
  3. Проецируем положение на вектор
  4. Корректируем проекции
  5. На основе корреций, корректируем вектор.

вы хотите корректировать гиры при помощи магнетометра? У mag точность +_ 2…4 градуса. Как первичная корректировка - может, и подойдет.
Обычно гиры корректируют по акселям. А YAW гиры (у акселя нет такого) по компасу.
У нас вектор магнитного поля под 70 градусов в землю, проекция на горизонт очень мала…

blade
Diman_Y:

Итак, как это сделать?

Не просто, а очень просто: почитать #121.
Ещё, Вы как то совсем игнорируете в своих выводах силу Кориолиса 😦
А она - один из важнейших источников ошибки в ИМУ.
Причём, её вектор и величина- сильно меняются в зависимости от широты места и курса самолёта.
То есть, скомпенсировать её простым введением коэффициента - нельзя.

Musgravehill:

У mag точность +_ 2…4 градуса. Как первичная корректировка - может, и подойдет.

И Ето- прАвильно.
А в сумме с коррекцией по ЖПС- и получится то, что надо.

Diman_Y
Musgravehill:

вы хотите корректировать гиры при помощи магнетометра? У mag точность +_ 2…4 градуса. Как первичная корректировка - может, и подойдет.

Это постоянная ошибка. Она не плывет во времени. Поэтому подойдет для коррекции скорости вращения. Да и точность 2 градуса это совсем не плохо. Остальное нужно будет ГПС корректировать.

Musgravehill:

У нас вектор магнитного поля под 70 градусов в землю, проекция на горизонт очень мала…

Главное что у нас есть вектор, и этот вектор не меняется во времени. По нему и будет проводиться коррекция.

blade:

Не просто, а очень просто: почитать #121.

ГПС оставим пока. Надо выжать максимум из того что есть.

blade:

То есть, скомпенсировать её простым введением коэффициента - нельзя.

Это понятно, что одним коэффициентом не обойтись. Поэтому и делается динамическая автоподстройка.

Musgravehill
blade:

Ещё, Вы как то совсем игнорируете в своих выводах силу Кориолиса
А она - один из важнейших источников ошибки в ИМУ.

Она на акселерометры влияет. А по ним коррекцию проводить, если A ~ g. Хотя если коптер летит вниз и по дуге, то итоговая векторная сумма может дать длину вектора ~ g…А у нас нифига не прямолинейное движение.

Вообще, для коптера и так сойдет! Блинчиком полетали, пару кульбитов - и хватит!

SGordon

по моему в начале темы был тезис что типа - большой комп и нет проблем? Чтобы не было проблем нужна крутая математика и прочие финтифлюшки …

Diman_Y
SGordon:

по моему в начале темы был тезис что типа - большой комп и нет проблем? Чтобы не было проблем нужна крутая математика и прочие финтифлюшки …

А это Вы к чему?

blade
Diman_Y:

Поэтому и делается динамическая автоподстройка.

Так а что мешает сделать сразу- по уму?
Просто из разговоров с отцами русского ДПЛА строения Чистяковым (“Новик XXI”) и Дроновым (“Текнол”)- я уяснил, что магнетометр и ЖПС- вполне достаточные условия для долгого и счастливого летания ИМУ по горизонтали, а не на боку или ещё каким извращённым образом 😃
Тем более, что из ЖПС данных надо знать всего два параметра: курс и высоту.
И сравнивать их изменение (ли отсутствие такового ) с тем, что идёт со связки гиры- аксели.

Diman_Y
blade:

Так а что мешает сделать сразу- по уму?

Ничего не мешает. Просто до этого еще не дошло. 😃

По моим представлениям это будет выглядеть так:
Первый контур: гиро + компас
Второй контур: скорость + аксель + высота
Третий контур: ГПС курс + высота + скорость
Четвертый контур: координаты и т.д.

Аксель еще будет использоваться для определения начального положения.

Я не вижу смысла переходить к ГПС пока я не смог выжать все параметры из инерциалки.
В идеале все должно управляться инерциалкой без ГПС, или хотя бы ГПС но с частотой обновления раз в минуту. 😃
Это не просто прихоть. Для нормального руления самолетом нужна именно инерциалка, так как ГПС идет с большой задержкой и использоваться для руления не может.
Короче, как только будет определено положения самолета в пространстве на основе компаса и гироскопа, так сразу можно будет переходить к следующему контуру. 😃

serj

На основе компаса и гироскопа не получится. Это еще Артем Силкин (ученик упомянутого выше дедушки Чистякова) в своем диссере доказал 11 лет назад примерно.
Нужна ПАРА или больше “как можно более порпендикулярных” векторов. Например акселерометр и магнитометр. Или gps и акселерометр.

Frr
serj:

На основе компаса и гироскопа не получится.

На одном отсчете не получится.
А если отсчетов несколько и компас (3-х осевой магнитометр) меняется ?
(самоль покачивается)

Diman_Y
serj:

На основе компаса и гироскопа не получится. Это еще Артем Силкин (ученик упомянутого выше дедушки Чистякова) в своем диссере доказал 11 лет назад примерно.

Скорее всего там речь идет о моментальном определении положения. Вы не правильно интерпритируете выводы.

Frr:

На одном отсчете не получится. А если отсчетов несколько и компас (3-х осевой магнитометр) меняется ?

Да. Так и есть.

Dir’ = Mxyz*Dir; Dit’ и Dir - известны. М надо найти.
Mxyz - это матрица поворота по углам Эйлера. Т.е. это просто функция трех переменных.
В итоге имеем три уравнения с тремя неизвестными. Да, там неудобно то, что придется выражать косинус через корень и квадрат синуса. И ограничения будут при углах близких к углам осей. Но в принципе задачка решаема.

Сейчас есть два пути решения задачи коррекции гироскопа.

  1. Я вычисляю оффсет АЦП и вычитаю его из каждой из коорданит гироскопа перед интегрированием. Этот метод аналогичен методу авто подстройци частоты по частоте. Недостатот в том, что ошибка будет накапливаться из-за скорости реакции. Теоретически ошибка должна быть нулевой. Но если количество левых поворотов будет больше чем правых, то гироскоп будет врать немного в право. 😃
  2. Вычитать из сигнала гироскопа полученный сигнал от компаса. Недостаток в том, что метод будет работать в определенном диапазоне углов. Тут ошибка будет кратковременной, или ошибка будет при определенных углах.

Вот так, пока короче. 😃
Сейчас вот сижу и икса гоняю по бумаге. 😃

serj:

На основе компаса и гироскопа не получится.

Еще забыл сказать.

Мы ищем и компенсируем ошибку гироскопа, а не пытаемся заменить гироскоп компасом. Заменить гироскоп компасом действительно невозможно, поэтому мои выкладки никак не опровергают дисер товарища Силкина, а наоборот его только подтверждают. 😃

Diman_Y

Всем привет!

Сделал я короче коррекцию по компасу! А за одно и с гироскопом разобрался. 😃

Получилось очень интересно и красиво. Есть конечно ограничения, но отслеживает достаточно хорошо. 😃
Как это ни странно, но получился аналог фазовой коррекции, что означает что ошибка не будет накапливаться.
Осталось только оптимизировать и улучшить алгоритм слежения. 😃

PS. Пока реализовывал алгоритм, выяснил, что значения гироскопа надо интегрировать как матрицу поворота, что уже само по себе является достаточно энергоемкой задачей. Я не знаю как народ может что-то подобное без плавучки реализовать. 😃

blade
Diman_Y:

Сделал я короче коррекцию по компасу! А за одно и с гироскопом разобрался.

А если- чуть подробнее?
Алгоритм, хотя бы “на пальцах”?

Diman_Y
blade:

А если- чуть подробнее? Алгоритм, хотя бы “на пальцах”?

Там все просто.

Есть с[n] это значение компаса в n моменты времени.
Есть угол поворота в момент времени n - f[n], M(f[n]) - это матрица поворота.
Имеем:
C[n] = M(f[n])*С[n-1]

Дальше все просто. Методом подбора из комбинации 81 возможных 3Д углов (0, +a, -a для каждой оси) по трем осям определяем в какую сторону надо сдвигать C[n-1] чтобы в итоге приблизиться к С[n].
Т.е. получаем некий l[n]. Сдвигаем C[n-1] на этот угол и повторяем все снова (тут у меня еще ФНЧ стоит для этого угла). В итоге за определенное время мы приблизимся к необходимому нам f[n].
Сдвигаем вектор в эту сторону. Потом повторяем операцию. Вместе с компасом сдвигаем начальную матрицу [1,1,1] что есть наша система координат.

В итоге после всех этих опираций мы имеем реальное положение самолета определенное по компасу.
А дальше начинаются манимуляции с оценкой ошибки гироскопа и ее коррекцией. 😃

По идее, в данном случае мне гироскоп вообще не нужен, так как я уже знаю матрицу поворота и могу определить положение самолета. 😃
Но в связи с тем что значение компаса требует значительного усреднения и фильтрации, то оно может использоваться с очень низкой частотой и использовать его как показатель крена, тангажа и рысканья будет достаточно проблематично. Поэтому надо использовать гироскоп.

Недостаток данного метода один: он не корректирует постоянную составляющую гироскопа. Исходя из данного метода я могу корректировать результать интегрирования гироскопа, но никак не сам гироскоп.
Достоинство одно - ошибка оценки положения стремиться к нулю и не может быть больше чем заданное значение (у меня в модели это 0.01 градуса, в реале такое будет не нужно).

Сейчас я пытаюсь доделать алгоритм коррекции именно значения гироскопа, т.е. убрать ADC офсет. 😃

Как-то так. 😃

Diman_Y

Еще забыл написать.
Коррекция матрицы поворота производится только когда вектор меняется.

blade
Diman_Y:

Еще забыл написать.

Всё это хорошо, бумага- написана правильно 😃
Но может, чтобы не изобретать велосипед, поглядеть как это сделано у тех, у кого уже летает: diydrones.com/…/getting-the-most-out-of-your
Проект уже несколько лет существует, участвуют в нем множество народу со всего мира…

msv

А я, не математик, ничего не понял… Ну узнаем мы поворот вектора магнитного поля в системе координат датчика (модели) за одну итерацию (по сути - скорость поворота этого вектора)… Но по нему все равно невозможно однозначно определить положение самой системы координат. Ибо вокруг одного вектора можно построить множество этих систем. И тут никакие математические уловки не помогут. Ну не изменится значения проекций вектора при повороте системы координат вокруг оси вектора, продифференцируй их хоть 100 раз…