Feedforward Control

Feedforward predicts control inputs

Feedforward or open-loop control is a way to control your robot actuators by estimating what the optimal inputs to the system are. In robotics, most systems are powered by dc motors and for these type of systems a generalizable motion model exists

This equation relates our motor input 'u' to the desired velocity and acceleration of the robot. Since giving a motor a constant power will result in convergence to a constant velocity we can find the voltage/velocity slope to use as our value of kV. Similarly, since input is proportional to force and force is proportional to acceleration, we can find the input / acceleration relationship to be the value of kA. This simple linear model can also be converted to a transfer function for more advanced control.

You can use SimpleFeedforward to implement this controller within sunset.

kv = volts / meter / second
ka = volts / meter / second ^ 2 

# static is the minimum power needed to overcome friction.
feedforward = SimpleFeedforward(kv,ka,static = 0)
voltage = feedforward.update(velocity, acceleration)
motor.setPower(voltage)

Rejecting nonlinear effects

Our equation above assumes that our system is linear -- which it is not. In many cases this assumption is adequate but in others we require additional terms to combat nonlinear effects.

The most common addition is a static friction or kstatic term implemented as

Notice this is part of the SimpleFeedforward example!

This term takes the direction that your robot should be traveling and multiplies it by the static friction constant, effectively canceling the effect that friction has on the system. For rotating arms, implementing this to factor in the cos(theta) of your arms angle will work well and produce a robust result.

Last updated