В продолжение вопроса, который я задал здесь: Нестабильность квадрокоптера с простым взлетом в автономном режиме ... Я хотел бы задать несколько вопросов о реализации базового PID для квадротора, управляемого модулем APM 2.6. (Я использую кадр из 3DRobotics)
Я сократил всю систему управления до двух блоков PID, один для управления креном, а другой для контроля высоты тона (рыскание и все остальное ... я подумаю о них позже).
Я тестирую эту установку на буровой установке, которая состоит из свободно вращающейся балки, где я связал два плеча квадротора. Два других могут свободно двигаться. Итак, я на самом деле проверяю одну степень свободы (крен или шаг) за раз.
Проверьте изображение ниже: здесь A, B обозначает свободно вращающийся луч, на котором установлена установка.
Благодаря тщательной настройке параметров P и D, мне удалось достичь продолжительного полета около 30 секунд.
Но под «устойчивым» я имею в виду тест, в котором дрон не опрокидывается в одну сторону. Рок устойчивый полет все еще не где-то в поле зрения, и более 30 секунд полета также выглядит довольно сложно. Это колеблется с самого начала. К тому времени, когда он достигает 20-25 секунд, он начинает наклоняться в одну сторону. В течение 30 секунд он отклоняется в одну сторону с недопустимым краем. Достаточно скоро я нахожу это с ног на голову
Что касается самого кода PID, я вычисляю пропорциональную ошибку из «дополнительного фильтра» данных гироскопа + акселерометр. Интегральный член равен нулю. Термин P составляет около 0,39, а термин D составляет 0,0012. (Я не использую библиотеку Arduino PID специально, просто хочу реализовать здесь один из моих собственных PID.)
Посмотрите это видео, если хотите посмотреть, как оно работает.
http://www.youtube.com/watch?v=LpsNBL8ydBA&feature=youtu.be [Да, установка довольно древняя! Я согласен. :)]
Пожалуйста, дайте мне знать, что я могу сделать, чтобы улучшить стабильность на этом этапе.
@Ian: Из многих тестов, которые я проводил с моей установкой, я делал графики для некоторых тестов, используя показания с последовательного монитора. Вот пример чтения Roll против «Motor1 & Motor2 - PWM input» (два мотора, контролирующие рулон):
Что касается ввода / вывода:
Входные данные: значения крена и тангажа (в градусах), полученные комбинацией акселерометр + гироскоп
Вывод: значения PWM для двигателей, полученные с помощью функции motor.write () библиотеки Servo.
разрешение
Я решил проблему. Вот как:
Суть вопроса заключалась в том, как я реализовал программу Arduino. Я использовал функцию write () для обновления серво-углов, которые принимают только целочисленные шаги в аргументе (или как-то реагируют только на целочисленный ввод, 100 и 100.2 дают одинаковый результат). Я изменил его на writeMicroseconds (), и это сделало вертолет значительно более устойчивым.
Я прибавлял обороты на одном двигателе, поддерживая при этом другое значение. Я изменил это, чтобы увеличить число оборотов в минуту в одном двигателе, одновременно уменьшая противоположный двигатель. Это своего рода сохраняет общую горизонтальную тягу без изменений, что может помочь мне, когда я пытаюсь удержать вертикальную высоту на этой вещи.
Я увеличивал число оборотов до максимального предела, поэтому квадрокоптер продолжал терять управление на полном газу. Там не было места для увеличения оборотов, когда он почувствовал наклон.
Я заметил, что один двигатель был слабее другого, я не знаю почему. Я жестко закодировал смещение во вход ШИМ этих двигателей.
Спасибо всем за поддержку.
Исходный код:
Если вам интересно, вот исходный код моей простой реализации PID : Исходный код PID
Пожалуйста, не стесняйтесь проверить это на своем оборудовании. Любые вклады в проект будут приветствоваться.