在处理环绕时如何从固定航向确定 angular 速度

How can I determine angular velocity from a fixed heading while dealing with the wrap around

我正在尝试确定一个物体的 angular 速度(度/秒)。

我只有每 1/60 秒更新一次该对象的方向(以度为单位)(0 表示北,90 表示东)

我遇到的具体问题之一是当对象从 355 度变为 5 度超过 0/360 时处理环绕。

我目前在想,也许我可以随着时间的推移平均读数,排除异常值,但这会给系统增加不必要的滞后并降低该区域的准确性。

简单的示例代码,其中 degreesIn 是源,degreesPerSecondOut 是结果

degreesPerSecondOut = (degreesIn or 0 - degreesInOld) * 60
degreesInOld = degreesIn

预期结果包括在超过 0 度时平稳准确地过渡


附加想法:我正在计算 angular 速度的物体不应超过每秒 1 转(甚至每 1/60 秒)。我不知道为什么,但我觉得这很有用。

我想我已经找到了答案的解决方案。不幸的是,我认为它不一定是最好的解决方案,因为这个解决方案每次最多只能达到约 180 度(每个 second/1800RPM 10800 度),但我相信它解决了我的问题并且对我的应用程序足够准确.

这里是:

"angularVelocity"是计算出来的速度

"rotationInDegrees" 是输入 rotation/heading

"rotationInDegreesOld"是前面的rotation/heading

if (rotationInDegrees - rotationInDegreesOld > 180) then
    angularVelocity = rotationInDegrees - rotationInDegreesOld - 360 * 60
elseif (inputRotation - inputRotationOld < 180) then
    angularVelocity = rotationInDegrees- rotationInDegreesOld + 360 * 60
else
    angularVelocity= rotationInDegrees - rotationInDegreesOld * 60
end

为了解释发生了什么,当速率如此之高以至于我认为它已经环绕时(比如当你从 355 度变为 5 度时,滴答的测量值为每秒 -350 * 60 度)添加了 360 使其成为更合理的 10 度选项。

同样适用于另一个方向,但减去 360 而不是添加。

我的看法:

function velocity(ain,aout)
    ipersec = 60
    raw = aout - ain
    turn = math.min((-math.abs(raw))%360,math.abs(raw)%360)
    direction = math.abs(raw)/raw
    return direction*turn*ipersec
end
print(velocity(5,355),velocity(355,5),velocity(20,40),velocity(40,20))
--[[600    -600    1200    -1200--]]

我的看法 - 你有三个组成部分:

  1. 环绕,简单地用%360处理。 math.mod 适用于 5.0。
  2. 即使有环绕,您也可以通过两种方式转向 - 我们总是希望转向最少。
  3. 指示方向的符号部分。

一旦你处理了环绕,你就会意识到 355->5 或向后与 10->20 没有什么不同 - 你可以采取 10 度或 350 度,但我们假设最短。