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

HikeR
rual:

Контроллер получает от сима

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

rual:

как скрестить коптерный АП с самолетным

имхо, у вас основная ошибка — разделять АП по модельному признаку. вспоминая Openpilot, один и тот же АП используется для коптеров, самолетов, машинок и даже двухколесных моделей (которые статически неустойчивы). разница лишь в задействованных микшерах.

alexeykozin
rual:

Теперь, как обещал Алексею, выложу наработки по “виртуальной лаборатории”. Вот так я это назвал )))

это супер!
в самом деле это супер инструмент когда есть сим, ускоряет процесс на несколько порядков.
еще со времен ардупилота на 328 меге изучал ардупилот именно с xplane
потом появился апм и в мишен планере появилась возможность соединять контроллер и симулятор прямо по юсб
с использованием mission planner
но билд “hil” (hardware in loop) работал только с совсем редкими самолетными прошивами.
была мечта изучить поведение коптера и даже модель квадрика нашлась для иксплейна но заставить квадрик летать так и не смог.
после многих попыток он таки стал стабилизироваться но ни высоту не держал ни делал адекватных попыток пройти маршрут.
видимо нужные ардукоптеру значения акселей и компаса кудато нетуда шли

rual:

или F4BY. Спрашивайте, расскажу как запустить

это интересно.
но если это писать в этой ветке то инфа которая может понадобиться многим может потеряться
как минимум надо веточку начать

HikeR:

имхо, у вас основная ошибка — разделять АП по модельному признаку. вспоминая Openpilot, один и тот же АП используется для коптеров, самолетов, машинок и даже двухколесных моделей (которые статически неустойчивы). разница лишь в задействованных микшерах.

миксами получится УГ
хороший автопилот использует физику модели

SergDoc
rual:

или F4BY

да только кто попробовать захочет слейте и сохраните лодырь на всякий, ну или заранее предупредите…

rual
HikeR:

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

ХPlane 10 , арду тоже его пользует. Спасибо Алексею Козину за предоставленные материалы по АРДУ.

HikeR:

у вас основная ошибка — разделять АП по модельному признаку.

)) У меня нет такой ошибки, коптер и самоль отличаются по принципам управления, хотя и не критично. Собствнно я этим и воспользовался на сегодня - работа углового стаба вполне адекватна. Только не хватает коэффициента эффективности аэрорулей. А вот возврат домой уже требует различий в алго…

HikeR
alexeykozin:

миксами получится УГ

хороший АП принимает на вход фактическое и желаемое положение (направление/координаты/…) модели, а выдает только ошибку между этими параметрами. УГ — это использование “физики модели” в несвойственных задаче расчетах.

rual:

ХPlane 10

ох, ну и здоровенный же “микроскоп” для такой задачи 😉 AeroSim RC не желаете попробовать? размер и тех. требования намного более скромные, набор данных включает все что душеньке угодно. единственное ограничение у него заключается в частоте обновления 60 Гц (т. е. зависит от монитора).

alexeykozin
HikeR:

хороший АП принимает на вход фактическое и желаемое положение (направление/координаты/…) модели, а выдает только ошибку между этими параметрами. УГ — это использование “физики модели” в несвойственных задаче расчетах.

объясню вкратце чем разница.
вверх у коптера это +газ в случаях если на стабилизацию хватает мощности
вверх у самолета это рв на себя при условии что достаточно ВОЗДУШНОЙ скорости а газ должен контролировать воздушную скорость
повернуть у коптера - наклониться в нужную сторону
повернуть у самолета в зависимости от типа модели - можно на руле направления, можно на крене, можно на крене + рв на себя, можно на крене + рв + руддер
к примеру нужен маневр влево и вниз - коптер сбросил газ и дал крен.
для многих самолей это сложный маневр. при левом крене (для левого поворота) и руле высоты (от себя) очень многие модели совершают снижение и правый поворот
у самолета есть режим планирования, у коптера нельзя вырубать моторы (у некоторых моделей они не раскрутятся) самолету при наличии аирспида свойственен режим полета в котором он может определить курс не имея компаса, коптер этого не умеет (хотя будем учить)
если делать универсальный код который будет использовать только миксы то он будет настолько сложный и в разработке и в чтении и настройке что будет неприменим

rual
alexeykozin:

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

Вот именно, как я раньше этого не знал, сколько денег бы с экономил!!!)))

alexeykozin:

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

Вот я пару лет назад искал хотя бы генератор NMEA (эмулятор ГНСС), чтоб отлаживать навигацию, а тут такие возможности были… всё мимо проходил ((( я тоже нашел модель коптера, но она для 9го хэплана, в 10м неадекватна, даже отображается криво. Правда в нём имеется мегакоптер (конвертоплан), его можно использовать, но он настолько инертный, что я с наскоку так и не смог его запустить, надо пиды сильно править.

alexeykozin:

но если это писать в этой ветке то инфа которая может понадобиться многим может потеряться
как минимум надо веточку начать

Отдельная ветка это слишком, пмсм, писать буду здесь, последнее время ветка практически незагружена, потом соберу в дневник…

alexeykozin:

миксами получится УГ

Да нет, у меня вот всё миксами сделано. Но вертикалы от аэродинамиков, таки да, отличаются…

alexeykozin:

хороший автопилот использует физику модели

Поэтому нужно сделать “умные” миксы ) Пока вижу такой примитив: сделать два класса рулей, тяговые и аэро.

HikeR:

ох, ну и здоровенный же “микроскоп” для такой задачи

а что мелочится, у меня Б777 так же летает, как РУ модель, только ПИДы надо поправить )))

HikeR:

единственное ограничение у него заключается в частоте обновления 60 Гц (т. е. зависит от монитора).

У меня реально обновление до 50 Гц не дотягивает, обычно 25-35…

HikeR:

AeroSim RC не желаете попробовать?

Вся проблема в том что я дремучий человек, 4 года этим занимаюсь и только сейчас узнал, что хплан несложно связать с АП, вот помогли люди - разобрался ) О AeroSim RC я даже не слышал )

alexeykozin
rual:

Пока вижу такой примитив: сделать два класса рулей, тяговые и аэро.

это слишком примитивно.
у коптера факторы только для каждого вмг

  • яв фактор по часовой или против
  • рол фактор влияние на крен
  • питч фатор влияние на пикирование
    если будут тяговые моторы то еще форвард фактор для всех моторов

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

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

HikeR
alexeykozin:

объясню вкратце чем разница.

вы объясняете разницу между оконечными микшерами и актуаторами, а тема автопилота совершенно не раскрыта.

[off]впрочем, также поступает подавляющее большинство производителей и (не в обиду) прочих клепателей очередных АП. чтобы переставить железку с коптера на самолет, нужно купить новую железку или залить новую прошивку, а то и вовсе остаться ни с чем, ибо у коптера “газ это верх”, видите-ли.
а в (уже) древнем Openpilot-е и его последователях нужно просто переключить/перенастроить микшеры и ставить железку хоть на велосипед с мотором.[/off]

rual
alexeykozin:

объясню вкратце чем разница.
и т.д.

вот эти вещи я и хочу описать в “умных миксах”. Вот приведу пример отличия PT-60 (сесна?) от боинга777 в хплне:

  1. Инертная масса - надо править ПИДы и ничего более;
  2. Рудер: у ПТ60 практически не рулит, посему добавил рассогласование курса в элероны - отлично работает (см. видео).
    у Б777 огромный киль, при сильном рулении валит эроплан набок. Что делать? Соответственно из элеронов убран курс, а в рудер с минусом добавлен крен.
HikeR
rual:

О AeroSim RC я даже не слышал )

а я им вроде бы даже в этой ветке когда-то хвастался (железный CC подключен через GSC к симу) 😉

на то время это был единственный модельный симулятор с поддержкой плагинов (то есть полным доступом ко всей внутрянке). пробовали использовать X-Plane, Flightgear и даже Ил-2, но боинги и цессны все-таки имеют другие масштабы. с подачи OP-сообщества пробовали пинать разработчиков Aerofly, RealFlight, Phoenix RC и прочих ClearView, но откликнулся только разработчик Аэросима. причем не только откликнулся, но и добавил много чего по просьбам трудящихся.

принцип там такой же, как у X-Plane, dll-ка имеет доступ к нужным параметрам и большинство из них может изменять. самое сложное — перенастроить модель в самом симуляторе, чтобы отключить все встроенные помогайки и оставить только прямое управление моторами/плоскостями.

p.s.
а, киллер-фичу забыл: в Аэросиме можно рулить стабилизированой бортовой камерой (время 4:30 в вышеуказанном видео).

rual
alexeykozin:

это слишком примитивно.
у коптера факторы только для каждого вмг

  • яв фактор по часовой или против
  • рол фактор влияние на крен
  • питч фатор влияние на пикирование
    если будут тяговые моторы то еще форвард фактор для всех моторов

Всё это есть, для коптера на любую конфигурацию можно настроить, моторы хоть в шахматном порядке (см. картинку).

HikeR:

а, киллер-фичу забыл: в Аэросиме можно рулить (стабилизированой) бортовой камерой

Это классно, но для испытаний АП не особо нужно. Вот если б полная иммитация механики (энерции, вибрации) подвеса, то можно бы было ПО для стабов подвесов пробовать )

alexeykozin:

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

Вот всё кино исключительно в том, что нелинейно. Иначе бы я просто доп измерение в микс добавил - аэро. А тяга там и так есть, ставь соответсвующий коэффициент и всё. Поэтому надо придумать мин и дост набор примитивов для описания и ввода нелинейностей

HikeR
rual:

Вот если б полная иммитация механики (энерции, вибрации) подвеса

хех, это уже отдельный симулятор выйдет.

rual:

Вот всё кино исключительно в том, что нелинейно.

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

сошлюсь опять на свое видео, 2:25 — влияние турбулентностей. включил ветер, добавил ему “неспокойности”, модель с теми же самыми миксами и ПИД-ами продолжает выдерживать положение и направление. несмотря на кособокий полет.

rual
HikeR:

а какая, по большому счету, разница?

Разница есть, см. мое видео 1:18 и 1:44, при высокой скорости эффективность рулей резко растет и начинается раскачка. Более того раскачка может начаться сама по себе при закритичной скорости. Так что приборную скорость нужно отслежтвать и менять коэффициенты.
Хплан очень хорошо отрабатывает физику (жесткость, упругость, кручение), твой же сим видимо вообще этим не заморочен. Не в обиду, но мне кажется эти фактры стоит учитывать.

HikeR

раскачка есть следствие малой и нестабильной частоты опроса “датчиков”, а любой цифровой ПИД-регулятор чрезвычайно критичен к этим цифрам. железки худо-бедно работают на сотнях герц, дорогущие коммерческие модельные IMU уже на килогерцах, а у вас “обычно 25-35”. тяжелым и инертным боингом рулить можно, отлаживать работу автопилота по маршрутным точкам тоже кое-как можно. а посмотреть, как железка справится с реактивной моделькой — уже нет.

у Аэросим-а та же беда, либо ограничиваем опрос до 60-75-120 Гц вертикальной синхронизацией, либо отключаем ее и получаем 300-400 Гц (сим-то к компьютеру не требовательный) и гарантированный затык в любом внешнем протоколе обмена. но 60 всяко лучше, чем 30.

по поводу жесткости и прочего. X-Plane еще и профиль плоскостей и форму фюзеляжа учитывает (модель табуретки может и не полететь, в отличии от MFS), но только с таким шагом, что в промежутках поместится несколько коптеров. XP технически неспособен проводить симуляцию моделей малых размеров, любые попытки это сделать вынуждены натыкаться на масштабирование и/или ускорение внутреннего времени.

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

SergejK

Возвращаясь к истокам беседы, мне вот интересно, как в симуляторе отладить с нуля писаную ИНС?

HikeR

если теоретически, то взять входные данные из сима, подсунуть их ИНС и посмотреть на результат. а на практике — только в связке с конкретными датчиками/сенсорами, ибо шумы/дрейфы/погрешности симуляторы не симулируют.

SergDoc

Дмитрий, кстати а чего опенпилоты, разбежались?
сижу курю их екф и - это чё чтобы шпионы не догадались?

void SerialUpdate(float H[NUMV][NUMX], float R[NUMV], float Z[NUMV],
          float Y[NUMV], float P[NUMX][NUMX], float X[NUMX],
          uint16_t SensorsUsed)
{
    float HP[NUMX], HPHR, Error;
    uint8_t i, j, k, m;

    // Iterate through all the possible measurements and apply the
    // appropriate corrections
    for (m = 0; m < NUMV; m++) {

        if (SensorsUsed & (0x01 << m)) {    // use this sensor for update

            for (j = 0; j < NUMX; j++) {    // Find Hp = H*P
                HP[j] = 0.0f;
                for (k = 0; k < NUMX; k++)
                    HP[j] += H[m][k] * P[k][j];
            }
            HPHR = R[m];    // Find  HPHR = H*P*H' + R
            for (k = 0; k < NUMX; k++)
                HPHR += HP[k] * H[m][k];

            for (k = 0; k < NUMX; k++)
                K[k][m] = HP[k] / HPHR;    // find K = HP/HPHR

            for (i = 0; i < NUMX; i++) {    // Find P(m)= P(m-1) + K*HP
                for (j = i; j < NUMX; j++)
                    P[i][j] = P[j][i] =
                        P[i][j] - K[i][m] * HP[j];
            }

            Error = Z[m] - Y[m];
            for (i = 0; i < NUMX; i++)    // Find X(m)= X(m-1) + K*Error
                X[i] = X[i] + K[i][m] * Error;

        }
    }
}

я то дурак всё голову ломал, чёй-то с екф загрузка проца 18% вот досюда всё чики-пуки // Find HPHR = H*P*H’ + R , а потом должно быть так K = HP*invHPHR (т.е. умножение на обратную матрицу), а что мы видим K = HP/HPHR - ход конём прям, вместо этого взять и разделить? Кстати - там затык конкретный матрица 16Х16 не то что я балуюсь с 3Х3

HikeR

скажу просто “сменились люди”, чтобы сор не выносить. но все-таки хочется надеятся, что форум и вики не работают временно, а не по причине “всё”. что выпиливание поддержки старых моделей из последнего софта ради “клонов” Revo Nano и CC3D Atom обусловлено аппаратными проблемами, а не денежными…

а про EKF не только шпионы не догадывались 😉

alexeykozin
SergDoc:

лаг ЖПС у тебя перекрывается уже здесь: инав_позиция = инав_позиция * 0.998 + жпс_позиция * 0.002 и служит это дело для долгосрочной коррекции “уплывания” интегратора и совершенно пофиг, что оно лагает пока ЖПС “доплывёт” до пределов способных существенно влиять на интегратор - оно усреднится так, что мама не горюй… короче показания будут правдоподобны…

Сереж, это была отличная идея. видя по логам что частота собственных колебаний системы 1/5 Гц подобрал экспериментально минимальный коэфициент при котором скорость спадает секунд за пять и … это полетело

Тимур - тестировщик мечты.
зима, ночь, минус 10, толково выполнил все инструкции и облетал.

youtu.be/UgPeTYqHec8

на будущее
багофиксы основного функционала:

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

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

  • нужно искать в инерциалке причины недостаточно точных измерений ускорений, это можно сделать в домашних условиях

зы. напрасно я сделал усиление подтяга на скорости. по логам как только скорость растет свыше 1мс до трех осциляции прогрессируют - явно этот коэф мешает…
в этом графике видно что при скорости по жпс < 1мс осциляций инерциальной скорости нет (красный тренд в см/с)

float spd_kff = mapf(constrain(fabs(pythagorous2(_velocity.x, _velocity.y)), 100.f, 300.f)  ,100.f ,300.f , 1.f , 3.f  ); // speed 0-100 cm per second spd_kff = 1 200=2  300 and above  = 3

    _gps_k_gps_spd = (float)_gps_k_spd * spd_kff /1000.0f; //v7 10 000 v008 1000
    _gps_k_inav_spd = 1.0f - _gps_k_gps_spd ;

    _gps_k_gps_pos = (float)_gps_k_pos  * spd_kff /1000.0f; //v7 10 000 v008 1000
    _gps_k_inav_pos = 1.0f - _gps_k_gps_pos ;
SergDoc
alexeykozin:

зы. напрасно я сделал усиление подтяга на скорости.

фильтр должен быть адаптивный, ты не смотрел - Hdop на скорости часом не растёт?
у нас есть такие параметры как вибрации, hdop, “количество звёзд на небе” высота (ну тут hdop везде сработает) вот и выстраиваешь если hdop>2.8 - коэф=о и всё доверие акселю, и чем меньше hdop увеличиваешь доверие ЖПС - т.е. увеличиваешь коэф влияния его на интегратор? плюс на скорости коптер наклоняется - 100% часть спутников он в этот момент теряет… да и для скоростей больше доверие акселю, для положения - меньше, т.к. там уже двойное интегрирование…
p.s. по видео так прям зима, а у нас дожди (((