Стабилизация квадрокоптера (PID)

Samer

Сегодня протестировал удержние высоты. Работает не плохо.
Держит в пределах 50 см чисто по бародатчику . Также настроил спасение при потере пульта. При потере сигнала переводит газ в режим висения, опускается до высоты взлёта + 1 метр и отрубает двигатели. Пришлось много раз настраивать PID по высоте. В итоге всё отлично. С любой высоты спускается до 1 метра и вырубается. А летать начал просто шикарно. Автомат газа работет отлично. Если его настроить до 30 гр. то при 35-40 мы начнём снижатся . Сегодня как бы пересел с механики на автомат. В стабе управляется всего одним стиком по YAW. Разворот на месте на любой скорости. При небольшой скорости и не большому YAW отлично делает круги , с направлением морды в центр. Всё дело в правильном PID по YAW .
До этого был недо ID. Вроде работал , но не то. Сейчас если его руками вращать то он возвращается в первоначальный азимут. Не важно на сколько его повернуть 30 или 130 градусов. И пришлось применить для управления по YAW интеграл . Фото ПК , вес 5 гр, на ардуино нано сверху припаян 10DOF GY-86 . Гира 6050 выпаиваится отлично. Уже поменял, сдохла ось Z акселя при падении . Менял такие микрухи первый раз и удачно, всё заработало . В общем такой ПК ничем не уступает другим на мощных чипах. Да нет ОСД ,но как то не надо . Напряжение передаёт , пульт пищит при определенном напряжении , при малом RSSI включается вибро в пульте. Сейчас более 20 параметров меняю в кваде с пульта. Данные с GPS забираю по I2С, передаю на пульт. Всё выводится на экран. Следующий этап полёты по GPS .

Samer

По снижению интересные моменты. Если P больше чем надо то он быстро снижается и при подходе к заданной высоте D просто не успевает его остановить . А если D большая то происходит снижение ступеньками метра по 3. Снижается , останов далее все снова. И мысль следующая надо просто сразу ограничивать P до общего суммирования . А то получается при большой высоте даже с малым P , слишком большая дельта на уменьшение газа. Сильно уменьшаем P и плохо реагирует при малой ошибке ±1 метр.

Приращение_газа= constrain ( (p_h + d_h + i_h) , -7,7 ) ;

А так лучше :

i_h = constrain( ( i_h + I_PID_высоты*ошибка_высоты),-2,2);
d_h= constrain( D_PID_высоты*(ошибка_высоты-стар_ошибка_высоты),-6,6);
p_h= constrain( P_PID_высоты * ошибка_высоты ,-3,3 );

Приращение_газа= p_h+ d_h+i_h;

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

Donkrat

Constrain как помню это если больше Х то Х?
Ну да теория без практики бесполезна

Samer
Donkrat:

Constrain как помню это если больше Х то Х?

Два последних числа это диапазон допустимых значений.
По GPS. К GPS датчику по UART подключена ардуина.
На ней софт , который обрабатывает NMEA протокол. Он все проверяет , из строк получает числовые значения , широта, долгота, курс, число спутников, выcота, скорость. И все эти данные по запросу основного ПК передаёт . Включение по I2C . На GPS ардуине прописан I2C адрес , она типа конвертора. Основной ПК совсем не загружен обработкой NMEA .
Это аналогично как например забирать данные с гироскопа, единственный минус шина I2c общая с гирой и барометром, надо делать не слишком длинный провод.
Кусок кода на удержание или возврат написал давно, но проверить всё не получалось.
Данные GPS передаю не в виде градусов , а метрами , в 4-х байтах широта и в 4-х долгота. Так проще обрабатывать без перевода. Всё эти данные в обратном UART от ПК передаю на пульт . Там обратное конвертирование в градусы. На картах вбиваю с пульта широту и долготу и совпадение до метра. Ну и на пульте также курс домой, курс движения , курс носа .
Возился долго с удержание высоты. Теперь можно пробовать . Хочу сделать без компаса. Калибровкой курса носа по курсу GPS.

Donkrat

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