Датчик компаса переходит с 359 на 1, как рассчитать это изменение как «1 вверх», а не как «358 вниз»? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть проект с датчиком компаса, который каждую секунду выводит курс в градусах. Изменение значения отображается для пользователя.

Таким образом, когда датчик поворачивается, например, с 283 градусов до 285 градусов, программа отображает «2 вверх», а когда он поворачивается от 163 градусов до 152 градусов, программа отображает «11 вниз».

Моя проблема - угол поворота превышает 359 градусов. Когда компас изменяется, например, с 358 градусов на 1 градус, программа отображает «357 вниз», но я бы хотел, чтобы он говорил «3 вверх». Я не знаю, как этого добиться.

Это также проблема, если пойти другим путем, например, от 5 до 359, вместо «6 вниз» возвращается «354 вверх».

Вот мой код:

# 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
>>>

1 Ответ

2 голосов
/ 05 августа 2020

Подумайте об этом целостно. Все дельты имеют два значения: «вверх» и «вниз». Вы хотите вернуть меньшее из этих двух значений во всех случаях. Напишите функцию, которая сделает это.

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'}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...