随时间推移操纵杆值

时间:2015-02-16 05:35:00

标签: python pygame joystick

我有一个python脚本,它通过pygame读取操纵杆的输入信号,并将该输入传递给电机控制器。

现在我想添加一个渐变功能。让我们说以给定的延迟提升到输入值。如果操纵杆的输入是' 100'只有在延迟结束后才能将该值传递给电机控制器并且“退色”。介于两者之间。

此外,定义斜坡也是一个优势。 (线性或对数曲线)

有一种简单的方法吗? 谢谢你的帮助!

1 个答案:

答案 0 :(得分: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.)