Source code for speed_controller

"""Simple speed controller.

The *speed_controller* module contains the `SpeedController` class.

`SpeedController` was made into a class for two reasons:

1) So it would be easier to have more than one SpeedController,
each with their own tuning parameter(s).

2) The current controller is the simplest there is, and there are
a lot of fancier (more tweakable) controllers that we might create
in the future. By wrapping this code up in a class now, it will be
easier to swap in fancier controllers (PI, PD, PID) in the future.
"""

[docs]class SpeedController: """A minimal speed controller that implements Proportional control. When you create one of these, you provide it a constant of proportionality. For example, 0.5 would correspond to 50%. """ def __init__(self, kP): self.kP = kP
[docs] def compute_power(self, target_speed, measured_speed, motor_power, min_motor_power, max_motor_power): """Based on desired versus actual motor speed, compute a new power level that should help. Args: target_speed (number): The speed you want. measured_speed (number): The speed you are currently at. motor_power (int): The motor power you are currently applying. min_motor_power (int): The minimum motor power you want to apply. max_motor_power (int): The maximum motor power you want to apply. Returns: (int): a power level as good or better than the one you had before. """ error = target_speed - measured_speed correction = error * self.kP motor_power += correction # Keep within specified limits if motor_power < min_motor_power: motor_power = min_motor_power if motor_power > max_motor_power: motor_power = max_motor_power return motor_power