在处理环绕时如何从固定航向确定 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--]]
我的看法 - 你有三个组成部分:
- 环绕,简单地用
%360
处理。 math.mod
适用于 5.0。
- 即使有环绕,您也可以通过两种方式转向 - 我们总是希望转向最少。
- 指示方向的符号部分。
一旦你处理了环绕,你就会意识到 355->5 或向后与 10->20 没有什么不同 - 你可以采取 10 度或 350 度,但我们假设最短。
我正在尝试确定一个物体的 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--]]
我的看法 - 你有三个组成部分:
- 环绕,简单地用
%360
处理。math.mod
适用于 5.0。 - 即使有环绕,您也可以通过两种方式转向 - 我们总是希望转向最少。
- 指示方向的符号部分。
一旦你处理了环绕,你就会意识到 355->5 或向后与 10->20 没有什么不同 - 你可以采取 10 度或 350 度,但我们假设最短。