Differential thrust

Wed 27 July 2022
Differential thrust (Photo credit: GE)

Principle overview

The basic principle is to create a torque offsetting the total thrust. This offset is done by throttling thrust of multiple engines whose thrust is not align with gravity center.

On the drawing, the thrust is aligned with CG for the left engine and not for the right one. If both engines were mounted like the right one, torque produced by all engine would cancelled out.

Basic torque illustration

Note that some rockets (Ariane 4, Long March 5B,...) have there engines mounted like the left one, partially to minimize torque in case of engine out capability.

Mathematical approach

This section sum up what I think is true and is not based on any sources.

Torque authority is maximal when one engine is at its minimal power setting and the opposite one is at its maximal power setting. But, in this case, the total thrust is not modular.

For the following of this article, let's note:

  • \(T \in [0, 1]\): setpoint value for thrust level
  • \(D \in [-1, 1]\): setpoint value for direction (from full left (-1) to full right (+1))
  • \(F_l\) (resp. \(F_r\)) : setpoint for thrust for left (resp. right) engine.
  • \(T_{min} (\in [0, 1])\): minimal thrust achievable (hopefully low)
  • \(T_{max} = 1\): maximal thrust

Those conventions are made without loss of generality over possible thrusts values (simple multiplication by rated thrust)

Without any limitation, thrust would be:

\begin{align*} F_l = T + D\\ F_r = T - D \end{align*}

But in real life, it would look like:

\begin{align*} F_l = \max(\min(T + D, T_{max}), T_{min})\\ F_r = \max(\min(T - D, T_{max}), T_{min}) \end{align*}

Now let's go to python implementation and let's consider functions taking as input direction and thrust setpoint values.

T_MAX = 1
T_MIN = .1


def basic_thrust(d, t):
    fl = max(min(t + d, T_MAX), T_MIN)
    fr = max(min(t - d, T_MAX), T_MIN)
    return fl, fr

And now let's consider both cases where direction authority is prioritized (modulate thrust to allow the required thrust difference) and where thrust authority is prioritized (modulate thrust to have the required total thrust even if difference between both engines is low). At least one engine's thrust will be modulate to achieve direction (resp. thrust) setpoint value, i.e. have the required thrust difference (resp. total thrust).

T_MAX = 1
T_MIN = .1

def thrust_priority(d, t):
    fl = t + d
    fr = t - d

    # ensure fr + fl = 2 * t
    if fl > T_MAX:
        fl = T_MAX
        fr = T_MAX * (1 - t / 2)

    elif fr > T_MAX:
        fl = T_MAX
        fl = T_MAX * (1 - t / 2)

    elif fl < T_MIN:
        fl = T_MIN
        fr = max(T_MIN, t / 2)

    elif fr < T_MIN:
        fr = T_MIN
        fl = max(T_MIN, t / 2)

    return fl, fr


def direction_priority(d, t):
    fl = t + d
    fr = t - d

    # ensure abs(fl - fr) = 2 * d
    if fl > T_MAX:
        fl = T_MAX
        fr = max(T_MIN, T_MAX - 2 * d)
    elif fr > T_MAX:
        fr = T_MAX
        fl = max(T_MIN, T_MAX - 2 * d)
    elif fl < T_MIN:
        fl = T_MIN
        fr = min(T_MAX, T_MIN + 2 * d)
    elif fr < T_MIN:
        fr = T_MIN
        fl = min(T_MAX, T_MIN + 2 * d)

    return fl, fr

Real life example

The differential thrust mechanism to control direction (roll, pitch) has been used in real life. The most famous example is the soviet rocket N-1. Using this on the first stage is courageous as usually this stage require full thrust during the first part of its flight, leaving almost no thrust marge for direction authority. This is even more surprising as liquid propellant rocket engines with preburner or gas generator <https://en.wikipedia.org/wiki/NK-33c>_ takes time to throttle (time to change velocity of heavy turbines).

Another more mature example is the Space X crew dragon escape system's engines. The goal here is to control the orientation of the capsule during emergency separation event. Given the aerodynamic provided by the trunk, this application seems less critical than the N-1 rocket. Moreover, the pressure fed engines are more reactive.

Also it may not be obvious, this kind of reasoning is also applicable to differential braking (e.g. for taxiing a DC-3) and to flight control surfaces for which bot sides obey both a simultaneous deflection and a differential one. I thin of flaperon (flap setpoint for \(t\), aileron setpoint for \(d\)) and of spoilers when used both for airbrake function (setpoint for \(t\)) and roll function (setpoint for \(d\))

Related articles (or not):

Category: aviation Tagged: aviation Fight dynamics rocket science