Я использую GEKKO для прогнозирующего управления моделью (MPC) квадрокоптера (симулированного), включая оценщик движущегося горизонта (MHE), который вычисляет массу квадрокоптера и силу сопротивления. Командная функция квадрокоптера требует, чтобы я указал период времени (т. е. поддерживал углы r, p и дроссель z в течение x секунд). Дискретность в моей оценке определяется следующим образом:
m = GEKKO()
m.time = (0,5,2)
Функция имитации выглядит следующим образом:
for i in range(cycles):
#Simulation measurements
#Request measurements
#MV inputs
T.MEAS = throttle_i[i]
roll.MEAS = roll_i[i]
pitch.MEAS = pitch_i[I]
#simulate one step
quad.move(roll_i[i],pitch_i[i],throttle_i[i],dt).join()
где dt
— продолжительность указанных команд. (т.е. поддерживать крен, тангаж и газ в течение dt
секунд).
Как убедиться, что дискретизация в моем моделировании соответствует дискретизации MHE? Кроме того, как я могу найти хороший баланс между частотой дискретизации и командной частотой? Я боюсь, что слишком частые команды будут вносить ненужные мелкие коррективы в процесс, но недостаточно частая выборка сделает оценку менее точной.
Вы всегда хотите использовать одно и то же время выборки между Оценка движущегося горизонта и симулятором. Я рекомендую вам использовать numpy.linspace
или numpy.arange
, чтобы определить временной горизонт для оценщика.
import numpy as np
from gekko import GEKKO
m = GEKKO()
m.time = np.linspace(0,5,11)
print(m.time)
m.time = np.arange(0,5.01,0.5)
print(m.time)
Это дает горизонту 11 временных точек с временным шагом 0,5:
[0. 0.5 1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. ]
Если ваш симулятор выполняет измерение с другим интервалом выборки, вы можете настроить 0,5 дюйма numpy.arange
.
Вот дополнительный пример кода для MHE. Если вы используете физическую систему вместо симулятора, то время расчета для MHE должно соответствовать частоте, с которой вы обновляете свои измерения и решаете MHE. Вот исходный код рисунка ниже, который собирает данные о температуре с устройства Arduino.
В этом случае температура измеряется каждую секунду, и MHE решается повторно. Общий временной горизонт составляет 120 секунд с интервалом в 3 секунды или np.linspace(0,120,41)
, чтобы дать m.time=[0,3,...,117,120]
.
Что касается вашего второго вопроса о поиске хорошего баланса между частотой дискретизации и командной частотой, частота дискретизации часто ограничивается тем, насколько быстро может решать MHE. Если вам нужно что-то более быстрое, можно использовать фильтр Калмана или альтернативный подход. Как правило, чем выше скорость команд для контроллера, тем лучше, потому что вы можете быстрее реагировать на помехи. Если вы беспокоитесь о слишком частом перемещении значений параметров, вы можете использовать DCOST (наказание за движение) или DMAX (жесткое ограничение движения) в своей цели.