Технический форум по робототехнике.
dotzz » 14 июл 2015, 01:04
Добрый день. Разрабатываю систему управления беспилотным дирижаблем, в т.ч. и автопилот. Сейчас стоит задача сделать автоматическое поддержания курса по датчику-компасу путем изменения мощности левого-правого двигателя. Я написал для этих целей ПИД регулятор. Однако когда взялся за настройку возникли проблемы. Начал я с пропорциональной части, при любых коэффициентах дирижабль "входит в резонанс" и в конце-концов начинает крутиться вокруг своей оси. Может сможете дать совет, как лучше реализовать и настроить подобную систему?
Вот кусок кода для регулятора:
- Код: Выделить всё • Развернуть
//Функция масштабирования значений
private double ScaleValue(double value, double valuemin,
double valuemax, double scalemin, double scalemax)
{
double vPerc = (value - valuemin) / (valuemax - valuemin);
double bigSpan = vPerc * (scalemax - scalemin);
double retVal = scalemin + bigSpan;
return retVal;
}
//Определение мин-макс границ
private double Clamp(double value, double min, double max)
{
if (value > max)
return max;
if (value < min)
return min;
return value;
}
//Собственно регулятор
private void Compute()
{
//Значение компаса
double pv = GlobalData.Azimuth;
//Задание автопилота
double sp = GlobalData.Auto_Azimuth;
pv = Clamp(pv, pvMin, pvMax);
//Масштабируем текущее состояние
pv = ScaleValue(pv, pvMin, pvMax, -1.0f, 1.0f);
//..И задание
sp = Clamp(sp, pvMin, pvMax);
sp = ScaleValue(sp, pvMin, pvMax, -1.0f, 1.0f);
//Теперь значение ошибки в процентах
double err = sp - pv;
//Начальные значения для временных переменных коэффициентов, считаем пропорциональную часть
double pTerm = err * kp;
double iTerm = 0.0f;
double dTerm = 0.0f;
double partialSum = 0.0f;
//Запоминаем текущее время
Date nowTime = new Date();
if (lastUpdate != null)
{
double dT = ((double)nowTime.getTime() - (double)lastUpdate.getTime())/1000;
//Compute the integral if we have to...
if (pv >= pvMin && pv <= pvMax)
{
//Если нужно, считаем интегральную часть
if (ki>0)
{
partialSum = errSum + dT * err;
iTerm = ki * partialSum;
}
}
//..и дифференциальную
if (kd>0)
{
if (dT != 0.0f)
dTerm = kd * (pv - lastPV) / dT;
}
}
//обновляем время
lastUpdate = nowTime;
errSum = partialSum;
lastPV = pv;
//Расчет результата
double outReal = pTerm + iTerm + dTerm;
outReal = Clamp(outReal, -1.0f, 1.0f);
outReal = ScaleValue(outReal, -1.0f, 1.0f, outMin, outMax);
//Выводим результат
GlobalData.Auto_PID = outReal;
}
//Вывод на двигатели, Auto_MedPowe- задаваемое значение, с какой средней мощностью должны работать двигатели
double temp;
//Левый двигатель
temp=Auto_MedPower+GlobalData.Auto_PID;
GlobalData.Engine1=(byte)temp;
//правый двигатель
temp=Auto_MedPower-GlobalData.Auto_PID;
GlobalData.Engine2=(byte)temp;
esisl » 14 июл 2015, 11:30
Я так понимаю крутиться он начинает при попытке лететь курсом 0 или 360?
dotzz » 14 июл 2015, 11:41
Да, знаю прикол насчет этого участка
Я пока что специально выбираю направление среднее 180 град, но даже если "успокоить" его рукой в этом направлении, его постепенно начинает носить влево-вправо с увеличивающейся амплитудой. Думаю, что так быть не должно
esisl » 14 июл 2015, 15:32
А пробовали просто платформу на нитке подвесить?
dotzz » 14 июл 2015, 15:41
а у меня так и сделано (см фото во вложении)
- Вложения
-
elmot » 14 июл 2015, 20:18
Ну если регулятор без ошибок, то ясное дело - механическая инерция платформы - мощная И составляющая. Решение - зафигачить мощную Д составляющую для гашения колебаний. Потом потихоньку ее уменьшать, чтобы оно все-таки со внятной скоростью вертелось.
Dmitry__ » 15 июл 2015, 01:18
Не ПИД вам нужен, этожжеж не инкубатор. ПИД - физика термостата...
elmot » 15 июл 2015, 01:20
Думаю ПИДом тоже можно, но настройка ПИДа - веселое занятие:)
Dmitry__ » 15 июл 2015, 01:26
Брушлесы вижу я, безсенсорные, нелинейный элемент это. Драйвер там значит хоббийный - штука с характером, раскручивает брушлесы в 2 этапа, 1-й этап вообще не поддается ПИДированию...
Добавлено спустя 4 минуты 1 секунду:elmot писал(а):Думаю ПИДом тоже можно, но настройка ПИДа - веселое занятие:)
Изучен он давно, веселое занятие до 25 лет возраста инженера, включая среднюю школу и детсад, если не прошло - значит маструбация, извините за мой французский.
Duhas » 15 июл 2015, 07:13
ну так предлагайте структуру регулятора..
dotzz » 15 июл 2015, 10:25
Странно, перелопатил кучу инфы, в основном по коптерам, там тоже брушлес, тоже хоббийные регуляторы, используют ПИД и довольно успешно для стабилизации в воздухе. У меня вроде как задача проще, просто примерно +-5 градусов держать курс...
Dmitry__ » 15 июл 2015, 14:11
dotzz писал(а):Странно, перелопатил кучу инфы, в основном по коптерам, там тоже брушлес, тоже хоббийные регуляторы, используют ПИД и довольно успешно для стабилизации в воздухе.
У них система нагруженная, обороты двигателей всегда выше 50%, чуть убавил - коптер падает. Т.е. у них полностью выбрана нелинейность брушлеса на старте. Да еще в коптерах перешивают контроллеры на управление по и2ц 400гц., ибо штатный контроллер с ppm 50 гц. плохо управляется. А у тебя, минимальный импульс мощности десятикратно выше минимального требуемого значения. Представь себе иголку растянутую на нитках. И ты пытаешься стабилизировать ее положение щелчками
Нужно замерить минимальный импульс мощности системы: дать 50% мощности ppm сигналом, как можно короче по времени (чтоб стабильно запускался двигатель). И только после этого делать выводы...
Duhas писал(а):ну так предлагайте структуру регулятора..
Все просто, как можно ближе к физике конкретного процесса. Например, когда делал свою серву, учитывал срыв коллекторника с точки покоя (кста, похожая ситуация), а сверху ПИД
Ну и интеграл обязательно отключать при больших рассогласованиях, но это уже есть и в описании разных ПИД. Ссылку где-то давал...
elmot » 15 июл 2015, 20:49
ТС, ставь коллекторный импеллер поперек движения, им и рули, как вертолет хвостовым винтом. и будет щастье.
dotzz » 15 июл 2015, 21:17
elmot писал(а):ТС, ставь коллекторный импеллер поперек движения, им и рули, как вертолет хвостовым винтом. и будет щастье.
Да, так делают в дирижаблях, но мне хотелось уйти от этого, т.к. доп мотор это расход батареи и вес, казалось, можно обойтись двумя моторами
elmot » 16 июл 2015, 01:00
Тогда попробуй по-другому. Не пытайся ПИДить мощность моторов, подгазовывай их мощно, но на короткие периоды. И управляй длительностью этих периодов.