Завершить программу считывания скорости двигателя гироскопом, когда скорость двигателя будет равна ~ 0
Решил задачу следующим способом: программа считывает значение первые несколько секунд. Пока двигатель разгоняться, проверка значения скорости не работает. Через пару секунд после разгона срабатывает таймер, который изменяет флаг переменной TimeEND и после это уже начинает работу функция которая проверяет равна ли скорость нулю. Если больше нуля, то программа продолжает работать, а если равна нулю, следовательно двигатель остановился и можно прекращать работу программы.
Как мне кажется программа слишком запутана и нерациональна. Как можно её упростить и сделать более pythonic?
import random
import time
from threading import Timer
m = 0 # Число при котором цикл завершится
TimeEND = False # Флаг начального времени для разгона двигателя
MotorStop = False # Флаг остановки двигателя
StartTime = time.time() # Время запуска
def randoms(min, max):
x = random.randint(min, max)
return x
def foo(x):
global MotorStop
if x == m:
MotorStop = True
return MotorStop
def timeout_handler(): # Функция остановки цикла
global TimeEND
StepTime = time.time() # Время окончания
TotalTime = StepTime - StartTime # Вычисляем затраченное время
print("Время, затраченное на выполнение данного кода = ", TotalTime)
TimeEND = True # Меняем флаг времени на разгон
try:
timer = Timer(2.05, timeout_handler) # Инициализация таймера
timer.start() # Запуск таймера
while MotorStop == False: # Проверяем флаг остановки двигателя
x = randoms(0, 10) # Эмуляция данных гироскопа
print(x)
if TimeEND: # Если начальное время на разгон истекло, начинается проверка условия скорости
MotorStop = foo(x)
finally:
StepTime = time.time()
TotalTime = StepTime - StartTime
print(
f"Завершение работы. Двигатель Остановился через {TotalTime} секунды")
Ответы (1 шт):
- Непонятно для чего вы используете
globalв функцииfoo, если значение все равно отдаете черезreturn
def foo(x):
MotorStop = False
if x == m:
MotorStop = True
return MotorStop
Однако тогда лучше сделать так:
def foo(x):
return x == m
Тогда для чего выносить это в отдельную функцию ?:
try:
timer = Timer(2.05, timeout_handler) # Инициализация таймера
timer.start() # Запуск таймера
while MotorStop == False: # Проверяем флаг остановки двигателя
x = randoms(0, 10) # Эмуляция данных гироскопа
print(x)
if TimeEND: # Если начальное время на разгон истекло, начинается проверка условия скорости
MotorStop = x==m
...
- Можно сделать так:
Timer(2.05, timeout_handler).start()
вместо ваших
timer = Timer(2.05, timeout_handler) # Инициализация таймера
timer.start() # Запуск таймера
- Цикл
whileможно сделать таким, избавившись от переменнойMotorStop:
while True: # Проверяем флаг остановки двигателя
x = randoms(0, 10) # Эмуляция данных гироскопа
print(x)
if TimeEND and x==m:
break
- Пожалуй, финал: названия переменных лучше делать "нормальными".
m- что за переменная такая. Лучше -stop_speed