Control Systems

Feedforward Control: Cancelling the Disturbance Before It Moves the Output

A 40-tonne rolling mill accelerates a steel strip from 2 to 12 m/s in 0.3 s. A pure feedback loop watching strip tension would see the error only after the acceleration had already yanked the strip — and by then the strip has snapped. Instead the drive computes the extra torque the acceleration will demand (τ = Jα) and injects it the same instant it commands the speed change. The tension never budges. That is feedforward control: measuring a disturbance or command and acting on it before it can perturb the output, rather than waiting for the resulting error.

Where feedback is reactive and inherently lags the disturbance by at least one loop time constant, feedforward is predictive — it works through an explicit model of the plant, cancelling a known input by pushing an equal-and-opposite correction downstream. Get the model right and the error is theoretically zero; get it wrong and you have simply added an open-loop guess. Almost every high-performance controller on Earth pairs the two.

  • Core ideau_ff = G_ff·d, cancel disturbance before it reaches output
  • Ideal compensatorG_ff = −G_d / G_p (disturbance ÷ plant path)
  • Error at ideal→ 0 for the modelled disturbance; no lag
  • NeedsMeasurable disturbance + plant model (feedback needs neither)
  • Always paired withFeedback (2-DOF control) to mop up model error
  • Used inRolling mills, HVAC, servo drives, boiler control, robotics

Interactive visualization

Press play, or step through manually. The visualization is yours to drive — try it before reading on.

Open visualization fullscreen ↗

Watch the 60-second explainer

A condensed visual walkthrough — narrated, captioned, under a minute.

The Governing Idea: Cancel the Disturbance Path

Consider a plant output y driven by a control input u through transfer function G_p(s), and disturbed by a measurable disturbance d entering through path G_d(s):

y = G_p(s)·u + G_d(s)·d

A feedforward controller measures d and generates a corrective input u_ff = G_ff(s)·d. Substituting u = u_ff + u_fb, the disturbance contribution to y becomes (G_p·G_ff + G_d)·d. Setting this to zero gives the ideal feedforward compensator:

G_ff(s) = − G_d(s) / G_p(s)

In words: take the transfer function from disturbance to output, divide by the transfer function from control to output, and negate it. The correction travels the control path so it arrives at the summing junction exactly cancelling the disturbance. Because G_ff sits outside the feedback loop, it adds no poles to the closed-loop characteristic equation — it cannot destabilise the system, no matter how aggressive it is. That decoupling of performance from stability is the single most useful property of feedforward, and it is why a 2-DOF (two-degree-of-freedom) architecture — feedforward for tracking/rejection speed, feedback for robustness — beats any single-loop PID tune.

Why Feedback Alone Always Lags

A feedback loop is blind until an error exists. If a disturbance d(t) hits a first-order plant with time constant τ, the error grows as e(t) ≈ (G_d·d)(1 − e^(−t/τ)) before the controller even has a signal to work with. The loop then corrects at a rate limited by its bandwidth ω_c. The peak deviation is set by how fast the disturbance rises relative to the loop crossover — a step disturbance faster than the loop can be neither seen nor rejected in time.

Feedforward removes this fundamental delay because it reads the cause, not the effect. Classic examples where the physics makes feedback hopeless on its own:

  • Transport delay (deadtime): in a paper machine or long heat exchanger, the effect of an inlet change appears at the sensor 5–30 s later. A feedback loop must be detuned to stay stable around that delay; a feedforward path measuring the inlet acts instantly.
  • Large disturbance, slow plant: a building's HVAC sees a 10 kW solar gain step at noon. Feedback zone-temperature control reacts only once the room has already drifted 1–2 °C. An outside-air-temperature and solar-radiation feedforward pre-trims the supply air.
  • Command tracking: a CNC axis asked to follow a trajectory needs torque proportional to commanded acceleration. Waiting for position error to build that torque guarantees following error ∝ velocity/gain.

Two Flavours: Disturbance Feedforward and Command Feedforward

Feedforward comes in two structurally identical but conceptually distinct forms.

Disturbance feedforward measures an external input d (load, inlet temperature, feed flow) and cancels its path, as derived above. It requires a disturbance sensor and a disturbance-to-output model G_d.

Command (reference) feedforward — the dominant form in motion control — inverts the plant to pre-compute the input that produces the desired output. For a rigid inertia J driven through torque, the model is simply Newton's law:

τ_ff = J·α + B·ω + T_friction

where α is commanded angular acceleration, B is viscous damping, ω is commanded speed, and T_friction is a modelled Coulomb term. This is why servo drives expose velocity feedforward and acceleration feedforward gains: the trajectory generator already knows the desired ω and α at every instant, so the drive injects Jα torque a full loop-cycle before position error could ever demand it. A well-tuned Kvff/Kaff pair drops following error on a machine-tool contour from tens of micrometres to <5 µm, which is the difference between a scrapped part and a Class-7 finish.

The two forms are cousins: both require a model, both are open-loop, both need a companion feedback loop to correct what the model gets wrong.

Making It Realisable: The Lead-Lag Approximation

The ideal compensator G_ff = −G_d/G_p is frequently improper — its numerator has higher order than its denominator — which demands pure differentiation and infinite high-frequency gain. That amplifies sensor noise catastrophically and is physically unbuildable. Real feedforward therefore uses a realisable approximation, most often a first-order lead-lag unit that matches the two dominant dynamics:

G_ff(s) = K_ff · (τ₁s + 1)/(τ₂s + 1) · e^(−θs)

  • Static gain K_ff = −(steady-state gain of G_d)/(steady-state gain of G_p). This is the term you can identify from a simple step test and it captures most of the benefit; a static (steady-state) feedforward often removes 70–90% of a slow disturbance's impact.
  • Lead/lag ratio τ₁/τ₂ matches the relative speed of the two paths. If the disturbance reaches the output faster than the control path can, you need lead (τ₁ > τ₂) to speed the correction; if slower, lag.
  • Deadtime term e^(−θs) where θ = θ_d − θ_p. Here lies a hard limit: if the disturbance path is faster than the control path (θ_d < θ_p), θ is negative and the compensator demands a prediction of the future — impossible. Feedforward can slow itself down to match a slow control path but can never outrun physics.

The lead-lag is dialled to about 80–90% cancellation deliberately: over-tuning K_ff a few percent high creates an overcorrection that the feedback loop then has to fight, sometimes worse than no feedforward at all.

Sizing a Feedforward Loop — A Worked Procedure

Take a shell-and-tube heater trimming a process stream to 80 °C, disturbed by feed flow. The steps generalise to any loop:

  • 1 — Identify the disturbance path G_d. Step the feed flow by, say, 10% and record the outlet-temperature response. Suppose ΔT = −6 °C for a +10% flow step, settling with τ_d ≈ 40 s after θ_d ≈ 15 s of transport delay. Then K_d = −0.6 °C per %flow.
  • 2 — Identify the control path G_p. Step the steam valve; suppose +5% valve gives +8 °C, τ_p ≈ 60 s, θ_p ≈ 20 s. Then K_p = +1.6 °C per %valve.
  • 3 — Static feedforward gain: K_ff = −K_d/K_p = −(−0.6)/(1.6) = +0.375 %valve per %flow. On a +10% flow step the compensator opens the valve 3.75%, injecting +6 °C to cancel the −6 °C disturbance.
  • 4 — Dynamic trim: lead-lag τ₁/τ₂ = τ_d/τ_p = 40/60 = 0.67 (a lag, since the control path is slower). Net deadtime θ = θ_d − θ_p = 15 − 20 = −5 s < 0, so drop the deadtime term and accept that the fastest 5 s of the disturbance leaks through to feedback.
  • 5 — Detune slightly: set K_ff ≈ 0.34 (≈90% of ideal) to guard against model drift, and let the temperature-control feedback loop remove the residual and all unmeasured disturbances.

This static-plus-lead-lag recipe is exactly what a distributed control system (DCS) ratio/feedforward block implements, and it typically shrinks peak temperature excursions by a factor of 3–5× versus feedback alone.

Where It Runs: Real Hardware and Applications

Feedforward is quietly load-bearing across industry:

  • Motion & CNC: every high-end servo drive (Siemens SINAMICS, Beckhoff, Delta Tau) offers velocity/acceleration/friction feedforward. On a 1 g, 2 m/s pick-and-place move, torque feedforward can carry 90%+ of the required torque, leaving the position loop to trim only model error.
  • Rolling mills & web handling: tension control uses inertia-compensation feedforward (τ = Jα) during accel/decel so a 1200 mm aluminium strip holds ±2% tension through speed ramps.
  • Process control: boiler drum-level control adds a feedforward from steam demand to beat the notorious 'shrink and swell' inverse response; combustion control feeds air forward from fuel flow to hold the air/fuel ratio during load swings.
  • HVAC: supply-air-temperature reset feeds forward from outside-air temperature and measured solar radiation, pre-empting building thermal load before zone sensors drift.
  • Power electronics: a buck converter's voltage feedforward scales the PWM duty by V_in so that a line-voltage swing is cancelled within one switching cycle instead of waiting for the output-voltage loop.
  • Aerospace & robotics: computed-torque control inverts the full manipulator dynamics M(q)q̈ + C(q,q̇)q̇ + G(q) as a feedforward term, linearising the arm so a modest PD loop achieves tight tracking at high speed.

Failure Modes, Limits, and Best Practice

Feedforward's power is bounded by exactly one thing — model fidelity — and its failure modes all trace back to it:

  • Model mismatch: if K_ff is 20% wrong, 20% of the disturbance passes uncorrected (and an over-high gain injects a disturbance of the opposite sign). This is why you always deliberately under-gain and let feedback finish.
  • Unmeasured disturbances: feedforward is blind to anything without a sensor. A fouling heat exchanger, a wearing tool, a shifting friction coefficient — none appear in G_d, so they must be caught by the feedback loop or an adaptive/learning scheme.
  • Non-invertible plant: a plant with a right-half-plane (non-minimum-phase) zero cannot be inverted stably — the ideal G_ff = −G_d/G_p would have an unstable pole. Use a stable approximate inverse (e.g. Zero-Phase Error Tracking, ZPETC) instead.
  • Noise amplification: derivative (acceleration) feedforward differentiates the reference; a noisy trajectory produces torque chatter. Always filter the feedforward path or generate smooth, jerk-limited trajectories.
  • Actuator saturation: aggressive feedforward can command torque or valve travel beyond limits; the correction clips and the cancellation fails precisely when it's needed most. Size actuators for the feedforward transient, not just steady state.

Best practice: commission the feedback loop first for stability, then add feedforward for performance; identify K_ff from clean step tests; detune to ~85–90%; filter derivative terms; and treat feedforward and feedback as a permanent partnership — feedforward for speed and known inputs, feedback for robustness and the unknown. Neither is complete without the other.

Feedforward vs feedback control for disturbance rejection
AttributeFeedforwardFeedback
TriggerMeasured disturbance / commandMeasured error (after it occurs)
TimingPredictive — acts before output movesReactive — lags by ≥1 time constant
Needs a plant modelYes — accuracy sets performanceNo — works from error alone
Handles unmeasured disturbancesNoYes
Effect on stabilityNone (open loop, no new poles)Can destabilise; must check margins
Steady-state errorOnly as good as the modelZero with integral action

Frequently asked questions

Why use feedforward if I already have a well-tuned PID?

A PID (feedback) loop cannot react to a disturbance until it has already moved the output and created an error — it lags by at least one loop time constant, and worse around deadtime. Feedforward measures the disturbance or command directly and cancels its effect the same instant, so peak deviations typically shrink 3–5×. It also adds no closed-loop poles, so you get that speed without touching stability margins.

How do I compute the feedforward gain?

For a static feedforward, K_ff = −K_d/K_p, where K_d is the steady-state gain from disturbance to output and K_p is the gain from control to output — both read off simple step tests. The full compensator is G_ff = −G_d/G_p, usually approximated by a realisable lead-lag with an optional deadtime term. Deliberately set the gain to ~85–90% of ideal so model error never causes overcorrection.

Can feedforward make my system unstable?

No. Because the feedforward path sits outside the feedback loop, it contributes no terms to the closed-loop characteristic equation and cannot move any poles. That is its defining advantage — you can tune it as aggressively as the actuator allows without affecting stability. The catch is that a bad model simply injects its own error, which the feedback loop must then clean up.

What is the difference between command feedforward and disturbance feedforward?

Command (reference) feedforward inverts the plant to pre-compute the input that produces the desired output — e.g. τ_ff = Jα for a servo trajectory. Disturbance feedforward measures an external input like feed flow or outside temperature and cancels its path via G_ff = −G_d/G_p. Both are open-loop, model-based, and both still need a feedback loop; they just source their signal from the reference versus a disturbance sensor.

When can feedforward NOT cancel a disturbance perfectly?

Three hard limits. First, if the disturbance reaches the output faster than the control path can (net deadtime θ_d − θ_p < 0), the compensator would need to predict the future — impossible, so the fast portion always leaks through. Second, if the plant is non-minimum-phase (a right-half-plane zero), its exact inverse is unstable and you must use an approximate one like ZPETC. Third, any disturbance without a sensor is invisible to feedforward entirely.

Why do servo drives have separate velocity and acceleration feedforward gains?

The plant model τ = Jα + Bω splits torque demand into an acceleration term (Jα) and a velocity/damping term (Bω). Acceleration feedforward supplies the inertial torque so the axis needn't build it from position error; velocity feedforward supplies the damping torque. Setting Kaff ≈ J and Kvff ≈ B (in drive units) can cut contour following error from tens of micrometres to under 5 µm on a machine tool.