nppilot-v2/src/nppilot/scripts/limiter.py

42 lines
878 B
Python

import time
class Rate:
def __init__(self, cap):
self._cap = cap
self._t = None
def step(self, t):
if self._t is None:
self._t = t
return True
elapsed = t - self._t
if elapsed < self._cap:
return False
self._t += self._cap
return True
class SlewLimiter:
def __init__(self, rate: float, now=time.time):
self._rate = rate
self._a = None
self._t = None
self._now = now
def __call__(self, v: float) -> float:
if self._rate is None:
return v
now = self._now()
if self._t is None:
self._v = v
else:
limit = self._rate * (now - self._t)
delta = min(limit, max(-limit, v - self._v))
self._v += delta
self._t = now
return self._v