-2

嗨,我有一个格式如下的文件,我试图每 10 毫秒从雷达(接近机场)计算飞机的位置。

位置_X

位置_Y

标题

速度

t1

t2 w1

t3 w2

t4

其中 w1, w2 = 转弯率

在这种情况下 {t1, t2, t3, t4} = 200secs ~ 200000 ms

每 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 毫秒)。

4

2 回答 2

1

首先,您不需要使用计时器进行计算:您可以预先计算所有内容,计算使用不需要耦合到任何计时器的时间变量。它只是您在执行数值积分步骤时增加的变量。你必须告诉我们为什么你认为程序必须以一定的间隔运行——因为到目前为止它完全是错误的。这甚至不是 Qt 问题,它是普通的旧数值方法。计算很简单;对于每个时间步:

  1. 开始于t=0
  2. 根据当前转弯速率更新航向。
  3. 将径向速度转换为笛卡尔速度。
  4. 将速度融入位置。
  5. t如果电流超过给定,则选择下一个转向速率t_i
  6. 以 10 毫秒递增t
  7. 从 #2 开始重复,除非当前时间t超过结束时间。

而已。您可以自由选择所需的任何集成规则。t只是一个变量。它与计算结果的计算机上的时间流逝没有任何关系。

其余的取决于时间的含义t1- t4,以及您正在寻找的输出是什么 - 您是想要从起始位置到某个时间的时间历史t4+0.1s,还是只需要 4 个输出 - 每次一个t1-t4等等。

于 2018-06-18T17:32:12.053 回答
0

QTimer很可能无法保持严格的 10 毫秒滴答声。 QElapsedTimer可以更准确,但更多的是衡量功能、方法等的性能。

如果要模拟 X 毫秒的间隔,只需将 设置为QTimer以特定间隔触发。然后,您可以维护一个计数器,该计数器在每次timeout发出信号时递增。从那里,您可以计算您的“模拟时间”,即T = X * count. 根本不需要a QElapsedTimer

QTimer不是“硬实时”。如果你绝对必须有硬实时,你将不得不寻找其他地方。

于 2018-06-19T15:44:58.130 回答