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 进行计算。与QTimer共轭的t5(间隔为10毫秒(。

首先,你不需要使用计时器来做计算:你可以提前预先计算所有内容,计算使用不需要耦合到任何计时器的时间变量。它只是您在执行数值积分步骤时递增的变量。你必须告诉我们为什么你认为程序必须以一定的时间间隔运行 - 因为到目前为止它完全是错误的。这甚至不是一个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不是"硬实时"。 如果你绝对必须有硬实时,你将不得不寻找其他地方。

最新更新