【问题标题】:Ramping Joystick values over time随时间变化的操纵杆值
【发布时间】:2015-02-16 05:34:59
【问题描述】:

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

现在我想添加一个斜坡功能。假设以给定的延迟上升到输入值。如果操纵杆的输入是“100”,它应该只在延迟过去后将该值传递给电机控制器,并在两者之间“淡出”。

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

有没有一种简单的方法可以做到这一点? 感谢您的帮助!

【问题讨论】:

    标签: python pygame joystick


    【解决方案1】:

    一个简单的类可能如下所示:

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

    【讨论】:

    • 感谢您的意见!我尝试了简单的代码,它只是在每次迭代中添加一个步骤,这很好,但我还想指定从起始值“淡化”到输出值所需的时间。我怎么能用更复杂的功能做到这一点?
    • 您可以更改函数,使其不再简单地添加或减去 1,而是另一个值。请参阅我的更新答案。当然,这取决于您拨打next(gen) 的频率。在我的示例中,如果您每秒调用一次,它将在 12 秒内达到其目标值20。您可以简单地调整这些值以满足您的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多