Skip to content

Instantly share code, notes, and snippets.

@s-celles
Created February 29, 2024 13:29
Show Gist options
  • Select an option

  • Save s-celles/5b464bcddea63d3b3d79507d2779a79f to your computer and use it in GitHub Desktop.

Select an option

Save s-celles/5b464bcddea63d3b3d79507d2779a79f to your computer and use it in GitHub Desktop.

Revisions

  1. Sébastien Celles revised this gist Feb 29, 2024. No changes.
  2. Sébastien Celles created this gist Feb 29, 2024.
    38 changes: 38 additions & 0 deletions slew_rate_limiter.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,38 @@
    class SlewRateLimiter:
    def __init__(self, slew_rate, neg_slew_rate=None, t_init=0, y_init=0.0):
    self.slew_rate = slew_rate
    if neg_slew_rate is None:
    self.neg_slew_rate = -slew_rate
    else:
    self.neg_slew_rate = neg_slew_rate
    self.t = t_init
    self.y = y_init

    def process(self, t, y):
    delta_t = t - self.t
    if delta_t != 0:
    rate = (y - self.y) / delta_t
    clamped_rate = clamp(rate, self.neg_slew_rate, self.slew_rate)
    new_y = self.y + clamped_rate * delta_t
    else:
    new_y = y
    self.t = t
    self.y = new_y
    return new_y


    import numpy as np
    import matplotlib.pyplot as plt

    T = np.arange(start=-1.0, stop=10.0, step=0.01)
    t0, t1 = 1.0, 6.0
    U = U0 * (np.heaviside(T - t0, 0.5) - np.heaviside(T - t1, 0.5))
    slew_rate = SlewRateLimiter(1.0, neg_slew_rate=-0.75)
    Y = []
    for i, t in enumerate(T):
    Y.append(slew_rate.process(t, U[i]))
    plt.plot(T, U, label="u")
    plt.plot(T, Y, label="y", linestyle='--')
    plt.xlabel("Temps (s)")
    plt.ylabel("Signal")
    plt.legend()