随着时间的推移增加操纵杆值
Ramping Joystick values over time
我有一个 python 脚本,它通过 pygame 读取操纵杆的输入信号并将该输入传递给电机控制器。
现在我想添加一个渐变功能。假设以给定的延迟增加到输入值。如果操纵杆的输入是“100”,它应该只在延迟过去后将该值传递给电机控制器,并且 'fade' 介于两者之间。
此外,定义坡道将是一个加号。 (线性或对数曲线)
有没有简单的方法可以做到这一点?
感谢您的帮助!
一个简单的 class 可能如下所示:
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
这个 class 只是保存一个状态,是可迭代的,并调用一个在每次迭代中计算新值的函数。
一个简单的 "ramp" 函数可以简单地将输出值增加一个给定的增量:
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.)
我有一个 python 脚本,它通过 pygame 读取操纵杆的输入信号并将该输入传递给电机控制器。
现在我想添加一个渐变功能。假设以给定的延迟增加到输入值。如果操纵杆的输入是“100”,它应该只在延迟过去后将该值传递给电机控制器,并且 'fade' 介于两者之间。
此外,定义坡道将是一个加号。 (线性或对数曲线)
有没有简单的方法可以做到这一点? 感谢您的帮助!
一个简单的 class 可能如下所示:
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
这个 class 只是保存一个状态,是可迭代的,并调用一个在每次迭代中计算新值的函数。
一个简单的 "ramp" 函数可以简单地将输出值增加一个给定的增量:
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.)