2015-02-16 5 views
0

У меня есть скрипт python, который считывает входной сигнал джойстика с помощью pygame и передает этот вход на контроллер двигателя.Значения всплеска джойстика со временем

Теперь я хотел бы добавить функцию линейного изменения. допустим, чтобы нарастать до входного значения с заданной задержкой. если вход джойстика равен «100», он должен передать это значение только контроллеру двигателя после простоя и «затухать» между ними.

Кроме того, было бы неплохо определить рампу. (линейная или логарифмическая кривая)

Есть ли простой способ сделать это? Спасибо за помощь!

ответ

0

Простой класс может выглядеть следующим образом:

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.) 
+0

Благодарим вас за ввод! Я попробовал простой код, который просто добавляет один шаг на каждую итерацию, что приятно, но я также хотел бы указать время, которое требуется для «выцветания» от начального значения до выходного значения. Как я мог сделать это с помощью более сложной функции? – user3603948

+0

Вы можете изменить функцию так, чтобы она просто не добавляла или не вычитала 1, а другое значение. См. Мой обновленный ответ. Конечно, это зависит от того, как часто вы называете 'next (gen)'. В моем примере, если вы вызываете его один раз в секунду, он достигнет своего целевого значения «20» за 12 секунд. Вы можете просто настроить значения в соответствии с вашими требованиями. – sloth

Смежные вопросы