Как управлять временем выборки и команд в приложении для прогнозного управления моделью с помощью GEKKO - PullRequest
2 голосов
/ 10 апреля 2019

Я использую 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?Кроме того, как я могу найти хороший баланс между частотой дискретизации и частотой командования?Боюсь, что слишком частое командование внесет ненужные незначительные корректировки в процесс, но недостаточно частая выборка сделает оценку менее точной.

1 Ответ

1 голос
/ 10 апреля 2019

Вы всегда хотите использовать одно и то же время выборки между Оценка движущегося горизонта и симулятором. Я рекомендую использовать 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.

Moving Horizon Estimation

В этом случае температура измеряется каждую секунду, и MHE повторно разрешается. Общий временной интервал составляет 120 секунд с 3-секундными интервалами или np.linspace(0,120,41), чтобы дать m.time=[0,3,...,117,120].

Что касается вашего второго вопроса о нахождении хорошего баланса между частотой выборки и частотой командования, то частота выборки часто ограничивается тем, насколько быстро может решить MHE. Если вам нужно что-то более быстрое, тогда можно использовать фильтр Калмана или альтернативный подход. Как правило, более высокая скорость командования для контроллера лучше, потому что вы можете быстрее реагировать на помехи. Если вас беспокоит слишком частое перемещение значений параметров, то вы можете использовать DCOST (штрафовать за движение) или DMAX (жесткое ограничение на движение) в своей цели.

...