Программа оптимизации QT для выполнения вычислений через определенные промежутки времени (истек сигнал и время QTimer)

Привет у меня есть файл в следующем формате, где я пытаюсь вычислить местоположение самолета с радаров (приближающихся к аэропорту) каждые 10 мсек.

Position_X

Position_Y

заголовок

скорость

t1

t2 w1

T3 W2

t4

Где w1, w2 = скорость поворота

в этом случае {t1, t2, t3, t4} = 200 сек ~ 200000 мсек

и оценивая позицию после каждых 10 мсек

Вот как я обрабатываю:

    // defined in Plane.h

    QElapsedTimer t;
    QTimer timer;

   // Plane.cpp

    Plane::Plane : timer()  {

     QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(computePosition()));
     timer.start(10);

        t.start();
    }

    void Plane::computePosition()
    {
     if (!t.hasExpired(t1)
    {
    //do
    }

    if (t.hasExpired(t2) || t.hasExpired(t3))

    {
    //do
    }

    if (t.hasExpired(t3) || t.hasExpired(t4))

    {
    // do
    }

    if (t.hasExpired(t5))
    {

    // do 

    }
    if(t.hasExpired(t5 + 100))

     timer.stop();

     qDebug() << QDateTime::currentMSecsSinceEpoch()<< t.elapsed()
             << Position_X  << Position_Y;
    }

Я не могу сопоставить системное время с истекшим временем или условным временем. интервал таймера составляет 10 мс, но в отладке я вижу, что он варьируется от 15-40 секунд. А также время захода на посадку составляет 200 мс, но с использованием истекшего таймера для оценки положения выталкивает матрицу самолета из аэропорта.

Как мне убедиться, что моя программа работает с интервалами времени t1, t2, t3, t4 и t5 и что позиция оценена правильно.

Ценю любые идеи или помощь. Спасибо!

Расчет позиций не является проблемой. Я хочу выполнить вычисления в момент времени t1..t5 в сочетании с QTimer (интервал составляет 10 мс).

2 ответа

Прежде всего, вам не нужно использовать таймеры для выполнения вычислений: вы можете заранее все рассчитать, в расчетах используется переменная времени, которую не нужно привязывать к какому-либо таймеру. Это просто переменная, которую вы увеличиваете при выполнении шагов численного интегрирования. Вы должны сказать нам, почему вы думаете, что программа должна запускаться через определенные промежутки времени - потому что пока это просто ложь. Это даже не проблема Qt, это простые старые численные методы. Расчеты просты; за каждый временной шаг:

  1. Начать с t=0,
  2. Обновите курс в соответствии с текущей скоростью поворота.
  3. Перевести радиальную скорость в декартовую скорость.
  4. Интегрируйте скорость в положение.
  5. Выберите скорость следующего хода, если текущая t прошлое дано t_i,
  6. инкремент t на 10 мс.
  7. Повторите с № 2, если текущее время t прошло время окончания.

Вот и все. Вы можете свободно выбирать любое правило интеграции. t это просто переменная. Это не имеет ничего общего с течением времени на компьютере, который вычисляет результаты.

Остальное зависит от того, что означает время t1-t4и какие выходы вы ищете - хотите ли вы историю времени от начальной позиции до некоторого времени t4+0.1sили только 4 выхода - по одному на каждый раз t1-t4, так далее.

QTimer Скорее всего, не сможет поддерживать строгие тики 10 мс. QElapsedTimer может быть более точным, но это означает больше для измерения производительности функций, методов и т. д.

Если вы хотите смоделировать интервал X мс, просто установите QTimer стрелять в определенный промежуток времени. Затем вы можете поддерживать счетчик, который увеличивается каждый раз, когда timeout сигнал испускается. Оттуда вы можете рассчитать свое "смоделированное время", которое будет T = X * count, Там нет необходимости для QElapsedTimer совсем.

QTimer не "трудно в режиме реального времени". Если вам абсолютно необходимо иметь в режиме реального времени, вам придется искать в другом месте.

Другие вопросы по тегам