首页 > 解决方案 > 罗盘传感器从 359 变为 1,我如何将此变化计算为“1 向上”,而不是“358 向下”?

问题描述

我有一个带有指南针传感器的项目,它每秒输出一次以度数为单位的航向。值的变化被显示给用户。

所以当传感器从例如283度旋转到285度时,程序显示“2向上”,当传感器从163度旋转到152度时,程序显示“11向下”。

我的问题是旋转超过 359 度。当指南针从例如 358 度变为 1 度时,程序显示“357 下”,但我希望它说“3 上”。我不知道如何实现这一点。

反过来也是一个问题,例如从 5 到 359,返回“354 up”,而不是“6 down”。

这是我的代码:

# Input from compas sensor:
oldhdg = 358
newhdg = 1

# Calculating and displaying the value change:
if oldhdg == newhdg:
    change = 0
    flowdir = 'stay'
elif oldhdg > newhdg:
    change = oldhdg-newhdg
    flowdir = 'down'
elif newhdg > oldhdg:
    change = newhdg-oldhdg
    flowdir = 'up'
print(f'{change} {flowdir}')

输出:

357 down
>>>

标签: pythonmathsensorsinteger-overflow

解决方案


从整体上考虑。所有增量都有两个值:“up”和“down”。您希望在所有情况下都返回这两个值中的较小者。编写一个执行此操作的函数。

def change_in_heading(old, new):
    """Returns the change in heading between two data points

    >>> change_in_heading(100, 99):
    -1
    >>> change_in_heading(99, 100):
    1
    >>> change_in_heading(358, 2):
    4
    >>> change_in_heading(2, 358):
    -4
    """

    delta = new-old
    smallest_change = (delta + 180) % 360 - 180  # clamp to [-180, 180)

    return smallest_change

然后,您可以格式化以将现有值与另一个函数匹配:

def display_heading_change(change):
    return f"{abs(change)} {'up' if change >= 0 else 'down'}"

推荐阅读