Настроить PID регулятор в условиях трения

Гриша
Offline
Зарегистрирован: 27.04.2014

rkit пишет:

Тебя в первом же ответе направили. В ответ тишина.

в первом посте, мягко говоря даже не направление... об утверждении про 50мс вообще умолчу...

Рывок (кинематика) - рискну предположить, что именно в этом проблема, его трудно посчитать и компенсировать. (старт и торможение, на малых скоростях)

""Понятие рывка применяется при перевозке пассажиров, а также хрупких и ценных грузов.

Пассажир приспосабливается к ускорению, напрягая мышцы и подбирая позу. При изменении ускорения поза, естественно, тоже меняется. Пассажиру нужно дать время, чтобы отреагировать и сменить её — иначе стоячий пассажир потеряет равновесие, а сидячий — ударится. Типичный пример — момент полной остановки вагона метро после процесса торможения: стоячие пассажиры, наклонившиеся вперёд в процессе торможения, не успевают приспособиться к новому ускорению, возникающему в момент остановки, и наклоняются назад.

Аналогично, груз, к которому приложено ускорение, деформируется. Частое и быстрое изменение ускорения означает частую и быструю деформацию, что может привести к разрушению хрупкого груза. Частично рывок можно уменьшить, использовав амортизирующую упаковку.""

nik182 пишет:
.... У Вас есть как минимум два разных режима - покой и движение. Использовать PID в покое бесполезно.

как минимум... можно еще и режим старта и остановки (малые скорости при значительном ускорении относительно скорости) ...

как раз об этом половину топика написано.  

ЗЫ и даже картинки красивые есть

dilukhin
Offline
Зарегистрирован: 10.11.2020

50 мс заменил на 5, всё стало плавнее. Единственно функция подсчёта скорости, использующая датчик угла, стала выдавать в 10 раз меньшее значение и расчёты расползлись, но это я заметил и поправил.

Рывки при старте на малых скоростях остались. Есть осознание, что от них полностью избавиться не получится, так как имеется отрицательный градиент усилия от скорости (график изыскания я приводил). Это примерно как скрип резины. Но уменьшить рывки считаю вполне возможным. Они уменьшаются, если увеличить интегральный параметр I, частота "скрипа" становится выше, а амплитуда ниже. Но в то же время на скоростях побольше большой интегральный вызывает рывки.

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

rkit
Offline
Зарегистрирован: 23.11.2016

Теперь замени на 0.5. А если возможно, то на 0.05. И убедись, что частота ШИМ кратная.

И не жди, что получишь идеал - сам принцип работы алгоритма построен на наличии ошибки.

SLKH
Offline
Зарегистрирован: 17.08.2015

rkit пишет:

 

И не жди, что получишь идеал - сам принцип работы алгоритма построен на наличии ошибки.

Вот это очень важно: сразу задать разумное допустимое отклонение от номинального (довольно мифического) параметра. 

 

dilukhin
Offline
Зарегистрирован: 10.11.2020

Обнаружил, что трюк с раздельными режимами для "движения" и "остановки" работает неверно.

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

	if(target_speed == 0)
	{
		pid_reset_entity(process);// Сброс всех накопленных ошибок
		process->summary = converge_exponential(process->summary, 0, 0.97); // Приближение суммы к нулю
	} else // Иначе - нормальный расчёт ошибки, P/I/D коэффициентов и суммирование

А не тут-то было. Достаточно дать на управление единицу и он останавливается как вкопанный, без всяких "плавностей", почти переворачиваясь (центр тяжести высоковат). Алгоритм-то задаёт жёсткое поведение.

Наверное, есть смысл убрать условие if(target_speed == 0) и оставить как есть, жёсткую остановку и просто не давать на управление сразу ноль.

А возможно, есть смысл попробовать так: для малой скорости задать "жёсткие" параметры, при большой - "мягкие", при этом они не должны меняться мгновенно, а "стремиться" к заданному значению, то есть плавно меняться через алгоритм "схождения":

static inline float converge_exponential(float val, float target, float ratio)
{
	return target + (val - target) * ratio;
}

Тогда робот, будучи в движении, будет останавливаться более мягко (пока параметры не уползли), а стартовать с места более жёстко, чтобы трение не мешало.

 

dilukhin
Offline
Зарегистрирован: 10.11.2020

rkit пишет:

Теперь замени на 0.5. А если возможно, то на 0.05. И убедись, что частота ШИМ кратная.

И не жди, что получишь идеал - сам принцип работы алгоритма построен на наличии ошибки.

Там не настолько точные функции ожидания, они принимают целое число, номинированное в миллисекундах. Так что минимум 1, и при единице оно ведёт себя жестковато. Думаю, 3-5 мс будет норм.

Кратность с ШИМом проверю, спасибо.

rkit
Offline
Зарегистрирован: 23.11.2016

Интервалы должны быть выдержаны ТОЧНО. Никаких функций ожидания. Системы реального времени тактируются строго от таймера или АЦП.