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

Razek

А мне тут пришел наконец HMC5983. Буду эксперементировать с вынесением датчика на шелдвоном проводе

rual
Razek:

Буду эксперементировать с вынесением датчика

Что хотите выяснить? Что не нравилось когда компас на плате?

Razek

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

SergDoc

Так как mahowik отдыхает в бане, приходится общаться через личку, он мне объяснил про новый ПИД, ну и дабы не устраивать глухой телефон, разглашу тайную переписку:

SergDoc

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

mahowik

если ты про новую имплементацию, то да

в классическом пид регуле два параметра из трех зависимы от dt

I * dt - умножение т.к. интегрирование/сложение
D / dt - деление т.к. дифферинцирование

вот по простому о непонятном написано 😉 pidcontrol.narod.ru

SergDoc

Я в принципе понял в чём камень преткновения, и почему сделано так, а не иначе.
Я представлял себе так: есть возмущение - которое нужно погасить D составляющей - завышающей пропорцию, потом пропорцией (от этого возмущения) вернуть в исходное положение - естественно сгладив/подтянув I составляющей, но такой метод не подходит, ибо надо практически предсказать какое возмущение будет в момент “запуска” D составляющей. По этой причине используется более простое представление, где пропорцией возвращаем в нужное положение, D составляющая служит как “тормоз” от переруливания самой P ну а интегральная составляющая дотягивает до нужного положения “медленно но верно” без переруливания. По сей причине и формула выглядит так P+I-D, вот и смутило что в новом ПИДе:

// -----calculate total PID output
        axisPID[axis] = PTerm + ITerm + DTerm;

как если бы было как в примере который я привёл выше…

mahowik

посмотрел код… короче и там и там знак минус 😉

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

delta          = imu.gyroData[axis] - lastGyro[axis];

а в другом из ошибки по гире, а она в инверте

RateError = AngleRateTmp  - imu.gyroData[axis];
....
delta          = RateError - lastError[axis];

т.е. и там и там D работает на торможение 😉

SergDoc

Нарисовал инвертор для фриски, может когда-нибудь разбогатею на неё, в архиве файлы для орла:

Ой чёт ошибся, на разъёме фриски RX, размеры 12Х7мм

SergDoc

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

нашел в загашнике старый статор - надеюсь завтра починю, а нет - значит соберу обратно трёху…
а да подключил напряжометр (АЦП+DMA) работает…

oleg70

Кто знает секрет: в каких единицах нужно подавать данные в FreeImu c акселя и магнетометра ??
С гирой все ясно - град./сек. переводим в радианы делим на “сампл.” и т.д…
А вот с акселем и магом мне непонятно…, по логике вещей вообще без разницы какой размерности (ведь считается отношение) но в готовом коде от ARDU присутствует “магический” коэфициент для акселя:
gains[0] = 0.00376390;
gains[1] = 0.00376009;
gains[2] = 0.00349265;
Сейчас активно кручу коэфициенты TwoKi и TwoKp, наблюдаю реакцию системы, пытаюсь понять воздействие/зависимости, а тут что то в тупик зашел…

SergDoc

Движек починил, мудрю с микшером к своей кривой раме, учитывая что цт посередине между моторами, получается картинка непривлекательная, надо ввести коэффициенты поправочные, кто владеет математикой, проверте пожалуйста:

Перезалил в гит прошивку и исходники с новым ПИД-ом (включен по умолчанию)…

oleg70
SergDoc:

получается картинка непривлекательная

Может я не прав…, а сместить центр тяжести в любое нужное место (например батареей) не проще?

VitaliyRU
SergDoc:

Так как mahowik отдыхает в бане, приходится общаться через личку, он мне объяснил про новый ПИД, ну и дабы не устраивать глухой телефон, разглашу тайную переписку:

Вот замедленно что там с PD происходит

Синий столбец это Р зеленый D. Столбцы направлены в ту сторону в которую от них результирующая сила. При действии возмущающей силы D P тянут в одну и туже стороны. При снятии силы в противоположные. Т.е. сначала D сопротивляется возмущению, а потом препятствует перегулированию(это самая важная его задача) от Р.
т.е. Во всех системах D направлен одинаково иначе от него вред один.

SergDoc
oleg70:

Может я не прав…, а сместить центр тяжести в любое нужное место (например батареей) не проще?

ну пока так и летаю - батарея сзади 😃
на счёт ПИД, то что вчера казалось плавным и красивым, сегодня в ветер сыграло со мной злую шутку - жуткий расколбас (с увеличением, как будто перегулирование) как следствие - переворот и минус два пропа, остался один комплект 😦 сейчас смотрю в чём бяка…

VitaliyRU
SergDoc:

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

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

SergDoc:

надо ввести коэффициенты поправочные, кто владеет математикой, проверте пожалуйста:

Самое простое и надежное(хоть и не самое быстрое). Это установить AutoCAD, 2000й в самый раз 😃) начертить в нем и померить расстояния - ошибок точно не будет. Да и при прикидывании рамы он очень полезен 😃

oleg70
SergDoc:

переворот и минус два пропа

Я решил, пока досконально не пойму работу алгоритма, не пробовать полеты…(движки по 33$ жалко)

SergDoc

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

oleg70:

Я решил, пока досконально не пойму работу алгоритма, не пробовать полеты…(движки по 33$ жалко)

ну так для экспериментов, чё нить подешевле на разбить надо 😃

VitaliyRU:

Самое простое и надежное(хоть и не самое быстрое). Это установить AutoCAD, 2000й в самый раз ) начертить в нем и померить расстояния - ошибок точно не будет. Да и при прикидывании рамы он очень полезен

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

VitaliyRU
SergDoc:

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

По моему опыту, если расколбашивает в ветер, надо P убрать на четверть. Вот такое УГ этот PID 😃)

SergDoc:

(надо будет чуть Д добавить, а то небольшие подёргивания на спуске)

Подергивания это не обязательно перегулирование. Может D шуметь. Увеличь усреднение до 5 - станет намного лучше

deltaSum = delta1[axis] + delta2[axis] + delta3[axis] +delta4[axis] + delta;
delta4[axis] = delta2[axis];
delta3[axis] = delta2[axis];
delta2[axis] = delta1[axis];
delta1[axis] = delta;

Все это D очень не срочно(усреднение же дает лаг), если интересно понять работу PID, могу EXEшником поделиться, что на видео. В уме представить колебательный процесс - анрыл 😃 Для этого я это “стенд” и написал.

И кстати если качает на спуске(мы же постоянно падаем в зону адовой турбуленции) - это еще один признак слишком злого Р.

ЗЫ D вообще зло для коптеров. т.к. мы его получаем дифференцируя гирик. Т.е. шум от вибрации возводим во 2ю степень. Плясать надо от того на сколько разогнались моторы. Площадь под кривой тяги(разнотяга) мотора - это сила импульса. Дальше пока подсказать не буду 😃 Надеюсь скоро на железо перенесу.

SergDoc

Поэкспериментирую, у меня есть непреодолимое желание петлю запускать по готовности гир а не с этими извращениями:

currentTime = micros();
    if (mcfg.looptime == 0 || (int32_t)(currentTime - loopTime) >= 0) {
        loopTime = currentTime + mcfg.looptime;

        computeIMU();
        // Measure loop rate just afer reading the sensors
        currentTime = micros();
        cycleTime = (int32_t)(currentTime - previousTime);
        previousTime = currentTime;

а да расколбас только в angle, в acro и horizont летабельно…

VitaliyRU:

И кстати если качает на спуске

не качает, слегка поддёргивает, p меньше 4-х не хочу опускать, а d я поставил 30 (обычно 35 но лень было с батарейками в карманах домой возвращаться) приедут меньшие пропы должно быть лучше (12-е слишком большие для этой рамы)

VitaliyRU
SergDoc:

а да расколбас только в angle, в acro и horizont летабельно…

А мультивий-мутант или что? Скорее всего где-то ошибка в коде. Когда все правильно P вLEVEL режиме это I в ACRO. Просто не абстрактный как I а с привязкой к горизонту. Но такой же линейный коэффициент, если соблюдать все размерности - даже численно равны будут при прочих равных.
Я что бы ловить такие пакости такую хрень соорудил

Но пока к USB подключен и к акку, валиться по питанию видимо(атмега перегружается) 😦

SergDoc
VitaliyRU:

А мультивий-мутант или что?

ну да мутант ещё тот, если цикл на волю отпустить 780 получится, со всеми плюшками включенными 😃

VitaliyRU:

Но пока к USB подключен и к акку, валиться по питанию видимо(атмега перегружается)

это как?

VitaliyRU
SergDoc:

не качает, слегка поддёргивает,

Ой пропустил, усредни D до 5 ну или 7ми - скорее всего поможет. 99% шум D

SergDoc:

это как?

Ну ходовой акк от него питание, и через FTDI подключен к питанию. Я в электронике дуб 😦 Чего там происходит не очень понимаю. Но как только отключаю от бука(т.е. убираю питание от USB-) ресетиться перестает. Не спалить бы блин 😃

SergDoc

диода на usb нет, напряжение на нём чуть меньше 5-ти вольт, получается ток от стаба течёт не туда куда надо (FTDI начинает кушать от стаба, и её от этого рвёт, а т.к. там ещё и на ресет проца разводка она и перегружает проц) - ну эт моё предположение, у меня такой беды в принципе быть не может ибо и питания развязаны спаренными диодами и стабы свои на плате, да и вообще у меня всё на 3.3В работает… снять питание которое идёт уже с ftdi на плату, можно конечно и от акка, но лучше ненадо…

VitaliyRU
SergDoc:

олучается ток от стаба течёт не туда куда надо - ну эт моё предположение,

У меня такое же(подсознательно), тоесть разрезать +5 от FTDI?, я так хотел попробовать.