如何在处理环绕时从固定方向确定角速度

我正在试图确定物体的角速度,单位为每秒度数。

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

我的具体问题是处理当物体从355度到5度通过0/360时的包围问题。

我目前的想法是通过时间平均读数,排除异常值,但这会给系统增加不必要的滞后,并降低该区域的精度。

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

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

预期结果是在通过0度时实现平稳而准确的过渡


附加思考:我计算角速度的物体不应超过每秒1次的旋转(甚至不应超过每1/60秒的旋转)。我不知道为什么,但我觉得这很有用。

点赞
用户11360683
用户11360683

我认为我已经找到了我的答案。不幸的是,我不认为它一定是最好的解决方案,因为这个解决方案只能每个单位最多旋转 ~180 度(每秒 10800 度/每分钟 1800 转),但我相信它解决了我的问题,并且足够准确适用于我的应用程序。

下面是这个解决方案:

"angularVelocity" 是计算得出的速度

"rotationInDegrees" 是输入的旋转方向

"rotationInDegreesOld" 是之前的旋转方向

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 而不是加上。

2019-08-01 18:45:25
用户6881240
用户6881240
函数 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简单处理的包装。对于5.0,math.mod将起作用。
  2. 即使有了包装,您也有两种方法可以转向-我们总是想要最小的转向。
  3. 指示方向的符号部分。

一旦处理了包装,您就会意识到355->5或向后是没有区别的,就像10->20一样-您可以采取10度或350度,但我们假设最短的。

2019-08-01 18:57:12