Идея улучшения стаб. мода

mahowik

Возникла идея добавить немного “ума” в алгоритм стабилизации (в стаб. мод. или левел мод. по другому). Сперва решил написать это в мультивии ветке, потому как эксперементировать собираюсь на нем, но решил создать отдельную тему, чтобы взвесить все за против, почерпнуть идеи и возможно узнать, вдруг подобное уже реализовано в других проектах.
И так стаб. мод. хорош тем, что в идеале при отпускании стиков, коптрер пытается выравняться по горизонту, НО при этом когда горизонт достигнут, он пролжает двигаться в прежнем направлении по инерции… В случае с ГПС проблема разрешается понятно и легко (ну или легче) 😃 А если на борту только гира и аксель?!
В общем идея такова: добавить логику противодействия при отпускании ролл/питч стиков, типа отпустили стик, а коптер привстает на дыбы для более быстрой оставновки. Ясное дело что в состояние покоя его таким образом не вывести, но если это поможет при отпускании стиков (на скорости) остановить его с точностью в 60-80% то былоб очень даже ничаво. Т.к. при движении выше 20-30 км/ч и если зарулиться потеряв управление, мне лично не помогало просто кинуть стики… Ну и как правило крЭшшш…

Как можно реализовать:

  1. Сохраняем историю манипуляций стиками последние 2-3 секунды с шагом примерно 100мс (учитывая среднюю скорость реакции человека в 300мс). Почему 2-3 секунды? Это примерное время чтобы коптер достиг желаемой скорости при отклонении стика, т.е. когда его ускорение уже стремится к нулю а скорость постоянна…
  2. Проверяем стики на ноль (т.е. когда они в центре). Если стик в нуле, ищем его максимальное зафиксированное отклонение в истории.
  3. Находим амплитуду отклонения стика и примерное время воздействия с этой амплитудой.
  4. Формируем/симулируем обратное отклонение стика в соответствии с вычисленной амплитудой, временем воздействия на стик и коэф. (подбираем эмпирически). Возможно сюда даже придеццо прикрутить ПД-регулятор. Т.е. не только обратное пропорциональное воздествие, но и дифф. для увеличения воздействия в начале переходного процесса.

Нюансы:

  1. Компенсация не применяется на мелкие и быстрые отклонения. Подразумевается что это корректировки пилота не требующие обратного воздействия.
  2. При отклонении стиков от нуля, немедленный сброс компенсации. К примеру, оператор отклонил по РОЛЛ на 30гр., а потом в обратную сторону на -20гр.

Очевидные минусы:

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

Что думаете?!

Musgravehill

Может, надо раздельно суммировать отклонения*время по осям за последние * секунд?
Roll: -30*1сек, +20*1сек, -20*0.5сек = -20
Pitch: 0, 0, +10*3сек = +30
Значит, противодействием будет плавнонарастающее и затухающее отклонение Roll --20, Pitch -+30

  • нормализация. Чтобы не зарулился под 45 градусов.
Covax

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

iBat
Covax:

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

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

Covax

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

iBat

Для этого на концах лучей аксели надо ставить.

Covax

Ну аксели, они сейчас стоят копейки же, пару акселей то можно поставить.

delfin000
iBat:

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

Лазер - это сильно! От дальномера китайского наврядли подойдет.Лежит такой. В нем единственный плюс - безопасный лазер. А вот вариант подобие мышки лазерной…и код обработки уже не раз прописан … Плюс хорошо зарекомендовалось в Флайменторе и в Хеликомандере (правда там по картинке, стаб. изображения). Но принцип похож. Пусть для начало не высоко, потом и оптику подтянуть можно. Еще можно использовать стаб изображения через оптику фотика , как то так это представляется… В нем ведь это все есть. И по уровню выше будет чем у Хелика. И хелик бы высако держал , но оптика не позволяет

Covax

Нет, вот именно надо чтобы высоко и стабильно 😃 Знаем мы эти мульки с мышками, нужен чтобы на 50метрах висел точно 😃

delfin000
Covax:

Знаем мы эти мульки с мышками, нужен чтобы на 50метрах висел точно

Тогда брать оптику и матрицу от фотика, как основу. Может и правда кто сделает. Сложно это конечно

Covax

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

delfin000
Covax:

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

Тут ничего не могу сказать… здесь у меня темное пятнышко. Хотя каКчество оптики никто не отменял. И добавлю, из теории наведения лазерных систем …по интенсивности отраженного луча. С лазером именно это используется в силу физических свойств. И совсем нет необходимости вешать несколько лазеров, Нужно будет еще и импульсное кодироване вводить каждому источнику. Все только усложнится при этом

botvoed
Musgravehill:

Может, надо раздельно суммировать отклонения*время по осям за последние * секунд?
Roll: -30*1сек, +20*1сек, -20*0.5сек = -20
Pitch: 0, 0, +10*3сек = +30
Значит, противодействием будет плавнонарастающее и затухающее отклонение Roll --20, Pitch -+30

  • нормализация. Чтобы не зарулился под 45 градусов.

"
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; //вот это оно и есть
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; //вот это оно и есть
"
EE_Parameter.Stick_D - а это переменная которую нужно подбирать!

Musgravehill
botvoed:

EE_Parameter.Stick_D

На “крутилку” пульта установить, в полете с пульта “подкручивать”.

mahowik
Musgravehill:

Может, надо раздельно суммировать отклонения*время по осям за последние * секунд?
Roll: -30*1сек, +20*1сек, -20*0.5сек = -20
Pitch: 0, 0, +10*3сек = +30

тут надо хорошо подумать + проверять на практике… пример: держим ролл на +30 и через секунду коптер набрал макс. скорость. Стик не отпускаем… скорость таже… прошло 2 сек… И если все просуммируем, то результат для формирования противодействия по Ролл будет не верным (в 2 раза болше). Т.е. суммировать по идее надо только “первую” секунду, пока идет набор скорости. Как вариант фиксировать например можно не изменяемые отклонения стика в течении делта тайм (0.5 сек к примеру)…

Musgravehill:

Значит, противодействием будет плавнонарастающее и затухающее отклонение Roll --20, Pitch -+30

не обязателно плавное противодействие… изменять/корректировать же будем отклониния стиков… т.е. потом это все пройдет через ПИД регулятор… у меня такие настройки - как резко не дергай стики, наклоны отрабатывает плавно (высокий “Д” параметр…в мултибии он не классик и задает “плавность”)

Musgravehill:
  • нормализация. Чтобы не зарулился под 45 градусов.

тут поясните если можно

botvoed:

"
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4;
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; //вот это оно и есть
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4;
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; //вот это оно и есть
"
EE_Parameter.Stick_D - а это переменная которую нужно подбирать!

я так понял это из микрокоптера?
forum.mikrokopter.de/topic-20272.html
дома поразбираюсь… сейчас на работе…

Musgravehill
mahowik:
  • нормализация. Чтобы не зарулился под 45 градусов.

тут поясните если можно

Александр, я про ограничения управляющего воздействия. Чтобы не “насуммировало” 90 градусов.
Даже хороший алгоритм я бы сверху ограничил в рамки.

mahowik
Musgravehill:

Александр, я про ограничения управляющего воздействия. Чтобы не “насуммировало” 90 градусов. Даже хороший алгоритм я бы сверху ограничил в рамки.

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

// 50 degrees max inclination
      errorAngle = constrain(2*rcCommand[axis],-500,+500) - angle[axis] + accTrim[axis]; //16 bits is ok here