罗盘传感器从 359 变为 1,我如何将此变化计算为“向上 1”,而不是“向下 358”?
Compass sensor goes from 359 to 1, how do I calculate this change as "1 up", rather than "358 down"?
我有一个带有罗盘传感器的项目,它每秒输出一次以度为单位的航向。值的变化显示给用户。
所以当传感器从例如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
>>>
从整体上考虑一下。所有增量都有两个值:“向上”和“向下”。在所有情况下,您都希望 return 这两个值中的较小者。编写一个函数来执行此操作。
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'}"
我有一个带有罗盘传感器的项目,它每秒输出一次以度为单位的航向。值的变化显示给用户。
所以当传感器从例如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
>>>
从整体上考虑一下。所有增量都有两个值:“向上”和“向下”。在所有情况下,您都希望 return 这两个值中的较小者。编写一个函数来执行此操作。
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'}"