Создание собственной системы стабилизации

alexmos
oleg70:

Была у меня идея: а вот магнитометр находится внутри статического магнитного поля и “своими осями” в принципе может за него неплохо цепляться, нельзя ли математически с ним поработать и “подсунуть” его к гироскопу ?? Или я чё туплю ??

Можно, он в наших широтах почти так же направлен, как и аксель так что и связать их можно. Но проблема в низком доверии к этому сенсору. Есть пространственная неоднородность магнитного поля Земли (нужно калибровать в каждом новом месте, притом калибровать очень точно), кроме того, есть источники магнитного поля на борту, и искажающие его объекты снаружи, которые сложно заранее предсказать и учесть. К примеру пролетаем над металлической конструкцией - компас показал изменение угла, и придется дергать гироскоп, который работает правильно. А в помещениях - вообще труба, там он скачет как безумный.

rual
oleg70:

Была у меня идея: а вот магнитометр находится внутри статического магнитного поля и “своими осями” в принципе может за него неплохо цепляться, нельзя ли математически с ним поработать и “подсунуть” его к гироскопу ??

Дело в том, что нужны 2 и более НЕКОЛЛИНЕАРНЫХ вектора, идеальный вариант был бы если бы вектор магнитометра совпадал с осью Х, а аксль с осью Z. Алексей прав, в наших широтах 60% магнитуды компаса висит в вертикали, оставшиеся 30% сильно уводит местными наводками.

alexeykozin

увы если закрыть глаза то ничем для нас вектор гравитации не отличается от вектора гравитации + горизонтальное ускорение, единственное на что можно полагаться - точный гироскоп.
по компасу недавно Тимур изучал характер магнитых полей в своем городе при помощи нескольких туричтических компасов.
сначала возникло мнение что компас “гуано” когда был куплен второй дорогой - оказалось с копасаом все ок. просто в некоторых местах вектор магнитного поля идет вертикально из земли. Их город в прошлом был славен добычей руды и производством никеля

SergDoc

ADXRS 😦
Плюс, нужен хороший математик, а то я вот нутром чую, что 0.5+0.5=литр, а математически обосновать не могу…

oleg70
alexeykozin:

вектор магнитного поля идет вертикально из земли

Единственное что остаётся поковырять (мысли): брать за основу не абсолютное направление магнитного вектора, а его динамическое изменение отслеживать… т.е. “дельта поворота аппарата в магнитном поле” и потом как нибуть прифильтровывать (?) к акселерометру… может так удастся отделить гравитацию от ускорения…

alexmos
oleg70:

т.е. “дельта поворота аппарата в магнитном поле” и потом как нибуть прифильтровывать (?) к акселерометру

Так проблема в том, что магнетометр сильно врет и без поворотов, и причину нельзя узнать. Пример: коптер летит прямолинейно равномерно, для IMU- полная статика. И тут компас показывает, что его угол начинает медленно отклоняться от угла гироскопа и акселерометра. Как это отделить от события “появились линейные ускорения” или от “гироскоп начал уплывать”, и кому доверять больше?

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

oleg70
alexmos:

И тут компас показывает, что его угол начинает медленно отклоняться от угла гироскопа

Я имел ввиду: брать разницу показаний текущего магнитного вектора и предыдущего за определенный период, получится, как бы, мгновенный признак (производная угла) изменения угловой ориентации в пространстве…
Потом из акселя также взять такую же производную, и вычесть одно из другого… по идее, в остатке будет именно производная линейного ускорение акселя, которую можно использовать…
(может это бред конечно, но пока похоже на правду 😃)

SergDoc
alexmos:

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

Ага, у меня в столовой, компас на расстоянии в полметра способен врать на 90 градусов (вот тебе и деревянный дом), я по незнанке откалибровал раз - такой унитаз получил - хорошо яблоня рядом была )))

oleg70:

производная линейного ускорение акселя

стесняюсь спросить, а что есть производная угла и производная ускорения, ну производная угла - угловая скорость, а ускорения?

alexeykozin
alexmos:

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

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

а если рассматривать подобный кластер из идеальных акселерометров то получаем гравитационное зрение, причем если акселерометры будут идеально малошумны то из наблюдений можно построить гравитационную модель солнечной системы (например луна создает весьма ошутимое влияние на гравитацию - вспоминаем про приливы и отливы)

отсюда мистика.
если вы откалибровали аксель в полнолуние … ))))

oleg70
SergDoc:

а ускорения?

😃 у меня получилось - “ускорение в степени 2”, почти как “интеграция интеграций” (простой вопрос, а ставит в тупик…)

SergDoc
oleg70:

почти как “интеграция интеграций”

дифференцирование - обратный процесс…
мысль то я понял, угол там и угол там - получаем угловые скорости, только шумный алгоритм, при условии, что угловые скорости и так известны…
тогда уж лучще угол акселя “доворачивать” до угла компаса и сравнивать…

alexeykozin
SergDoc:

тогда уж лучще угол акселя “доворачивать” до угла компаса и сравнивать…

о!
как раз моделирую в аксессе -экселе на полетных логах вычисление расхождения компаса и акселя
VxpY это интегратор ошибки velocity_X_positive to Y accel

R!gpsspdx = R!spd * Cos(R!gcrs / 180 * PI) жпс скорость по икс (на север)
R!gpsspdy = R!spd * Sin(R!gcrs / 180 * PI) жпс скорость по игрек (на восток)
Dim LAT As Double, ILAT As Double
LAT = R!LAT * LatLonScale нормализация масштаба широты к долготе
ILAT = R!la * LatLonScale в логе сделал параметр широта по инерциалке
If R!gpsspdx > 0 Then интегрирую влияние положительной скорости по икс на ошибку по иксу и игреку
R!VXPY = R!Lng - R!LN 'gps - inav lon влияние положительной скорости по икс на игрек аксель возможно имеет смысл множить на абс от скорости
R!vxpx = LAT - ILAT положительная скорость по икс на икс аксель (чтобы расчитать множитель акселя - gain и скомпенсировать ошибку калибровки)
Else
R!VXNY = R!Lng - R!LN 'gps - inav lon влияние отрицательной скорости по иксу (на юг) на игрек аксель
R!vxNx = LAT - ILAT
End If

If R!gpsspdy > 0 Then аналогично влияние скорости на восток на аксели
R!VyPY = R!Lng - R!LN 'gps - inav lon
R!vypx = LAT - ILAT
Else
R!VyNY = R!Lng - R!LN 'gps - inav lon
R!vyNx = LAT - ILAT
End If

в результате
нужен ли доворот компаса по часовой стрелке =(-vxpy+vxny+vypx-vynx > 0)
в этом случае в медленном цикле добавляем переменную на полградуса в секунду, впоследствии ее передаем в модуль компаса где прибавляем вместе с деклинейшеном преобразовав в радианы

oleg70
SergDoc:

тогда уж лучще угол акселя “доворачивать” до угла компаса

Вообще то даже и не думал, пока, как и что можно сделать, просто в голове давно крутилась мыслишка (где то в подсознании)) , я б сказал - пока что это концепт… и не факт что стОящий…
Щас сижу вот копаюсь с RPi, пытаюсь найти ему применение… пока что особо ничего в его “применимости” не радует… , правда нашёл способ выводить картинку OSD поверх видео (оказавается можно),
ещё вот покопаюсь и брошу наверно, займусь делом…

rual
alexeykozin:

как раз моделирую в аксессе -экселе

Это очень интересно, Алексей, читаю вашу с Тимуром ветку на апмкоптере, но никак не пойму, откуда берете данные инерциалки?

Ещё вопрос к знатокам ТауЛабс (Серега SergDoc, вроде ты картинки показывал?), как выдать телеметрию во флексипорт? По USB всё работает нормально, в настройках платы выбираю FlexyPort->Telemetry, сохраняю, но не работает зараза((( Хотел три платки на карусельке покатать )))

alexeykozin
rual:

Это очень интересно, Алексей, читаю вашу с Тимуром ветку на апмкоптере, но никак не пойму, откуда берете данные инерциалки?

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

rual
alexeykozin:

для последующего анализа?

Нет, я не это имел ввиду) Как контроллер эти данные считает\получает? Интеграцией акселя и без коррекции?

alexeykozin
rual:

Нет, я не это имел ввиду) Как контроллер эти данные считает\получает? Интеграцией акселя и без коррекции?

весь функционал инерциалки заключен в класс AP_InertialNav github.com/diydrones/ardupilot/…/AP_InertialNav
он берет из класса ahrs готовые данные 3д вектор акселерометра повернутый в системе координат земли где ось икс - на север игрек на восток (в случае если компас не врет)
это тут github.com/diydrones/…/AP_InertialNav.cpp#L53
ну а дальше - дело техники посчитать из ускорений скорость и перемещение

rual
alexeykozin:

ну а дальше - дело техники посчитать из ускорений скорость и перемещение

Понятно, там получается есть коррекция по ГНСС задержанных на полсекунды отсчетов ИНС. Так получается, что ты расхождения ИНС и ГНСС считаешь именно за эти полсекунды?

alexeykozin
rual:

Понятно, там получается есть коррекция по ГНСС задержанных на полсекунды отсчетов ИНС. Так получается, что ты расхождения ИНС и ГНСС считаешь именно за эти полсекунды?

я пока точно не измерял задержки свойственные жпс модулям разных производителей, рассчитывал по логам, но данные противоречивые, нужен стенд. катапульта. включить запись акселераций и вычислить время между рывком и началом изменения координат.
т.к. нет точного времени задержки нет кусочка компенсации задержки жпс данных.
планирую в 100гц цикле сохранять в массив статистику акселя а по мере поступления данных жпс интегрировать кусочек истории за время задержки полученной экспериментально.
Махови проверял задержку времени получаемую от медиатека 3333 в сопоставлении с атомными часами, он утверждает что время почти не запаздывает, но это не говорит о том что не запаздывают координаты или курс

SergDoc
rual:

FlexyPort->Telemetry, сохраняю, но не работает зараза

х.з. может он вообще нерабочий, я хотел его проверить, но руки до него не дошли, там ещё косяков на параход, покатай опенпилот: github.com/openpilot/OpenPilot , HAL почти тот же самый… на flexi в опенпилоте я вешал gps - работал…
тут HAL rcopen.com/blogs/74247/19886

alexeykozin:

Махови проверял задержку времени получаемую от медиатека 3333 в сопоставлении с атомными часами, он утверждает что время почти не запаздывает, но это не говорит о том что не запаздывают координаты или курс

Алексей чем отличается протокол в 3329 и 3333 - беда в том что 3329 ловит 6 спутников но фикс и hdop есть, а 3333 - показывает у меня координаты и 12 спутников дома, но нет ни фикса, ни hdop, ни vdop нету (

HikeR
alexmos:

Гироскоп нужно корректировать всегда, и даже если коррекция будет с плавающим весом, угадать когда понижать вес, гарантированно точно нельзя.

в приснопамятном CC когда-то существовала ветка с банальной коррекцией в пару строк: чем ближе длина вектора акселя к единице (ну или к нулю, после вычета G), тем больше его вес. и наоборот, чем больше текущее ускорение, тем меньше он “корректирует” гироскопы. если в полете наблюдалось совсем уж неприятное уплывание, то самолет достаточно было вывести в прямолинейный полет на пару секунд, а коптер ручками завесить.

дополнительно пытались ввести коррекцию по смещению акселя от центра масс аппарата (т. е. из акселя вычитались угловые ускорения). для полного счастья нужны были пара датчиков симметрично равноудаленных от ЦМ, но все уперлось в быстродействие. или в появление CC3D, не помню уже 😉