Простой класс может выглядеть следующим образом:
class RampUp:
def __init__(self):
self.value = 0
self.target = 0
self.next = self.__next__
self.calc = None
def __iter__(self):
return self
def __next__(self):
if self.value == self.target:
return self.value
else:
self.value = self.calc(self.value, self.target)
return self.value
этот класс просто держит состояние, является итерацию и вызывает функцию, которая вычисляет новое значение в каждой итерации.
Простая функция «рампы», которая просто увеличивает значение выходного сигнала по заданной дельта может быть:
def simple(value, target):
if value < target:
value = min(value + 1, target)
else:
value = max(value - 1, target)
return value
Пример использования:
gen = RampUp()
gen.calc = simple
gen.target = 20
for _ in xrange(100):
# that's the value you pass to your motor controller
print next(gen)
Еще один пример функции рампы, которая является более сложным:
def smooth(value, target):
# maximum acceleration is 2
delta_max = 2
# minimun acceleration is 0.5
delta = max(0.5, (abs(target) - abs(target-value))/10.)
delta = min(delta, delta_max)
if value < target:
value = min(value + delta, target)
else:
value = max(value - delta, target)
return value
В ответ на комментарий:
def with_step(step):
def simple(value, target):
if value < target:
value = min(value + step, target)
else:
value = max(value - step, target)
return value
return simple
gen = RampUp()
gen.target = 20
# you could move this line into the class
# reaches the target value in 12 steps
gen.calc = with_step((gen.target - gen.value)/12.)
Благодарим вас за ввод! Я попробовал простой код, который просто добавляет один шаг на каждую итерацию, что приятно, но я также хотел бы указать время, которое требуется для «выцветания» от начального значения до выходного значения. Как я мог сделать это с помощью более сложной функции? – user3603948
Вы можете изменить функцию так, чтобы она просто не добавляла или не вычитала 1, а другое значение. См. Мой обновленный ответ. Конечно, это зависит от того, как часто вы называете 'next (gen)'. В моем примере, если вы вызываете его один раз в секунду, он достигнет своего целевого значения «20» за 12 секунд. Вы можете просто настроить значения в соответствии с вашими требованиями. – sloth