DEV Community

Christopher
Christopher

Posted on Originally published at enginstack.com

Mars Climate Orbiter: When 1 N·s Was Read as 1 lbf·s

Originally published on EnginStack.

Mars Climate Orbiter: When 1 N·s Was Read as 1 lbf·s

September 23, 1999. At 09:00:46 UTC a spacecraft the size of a washing machine fired its main engine behind the planet Mars, beginning a sixteen-minute burn meant to slow it into orbit. Four minutes of telemetry arrived, then Mars blocked the signal — forty-nine seconds earlier than predicted. The blackout was expected to last twenty-one minutes; the deep-space antennas in California, Australia and Spain waited out all twenty-one and heard nothing. The Mars Climate Orbiter had been flying for nine and a half months toward a point 226 kilometres above the Martian surface. It arrived at 57.

By EnginStack Editorial Team | Verified against the NASA Mishap Investigation Board Phase I report and JPL navigation analyses (About)


Nothing broke. That is the part worth sitting with. There was no failed bearing, no cracked tank, no software crash, no leak, no dead sensor. Every component of the mission did precisely what it was built to do, and both systems either side of the failed interface produced numbers that were internally consistent: real pound-force-seconds on one side, a correct reading of newton-seconds on the other. What neither satisfied was the contract joining them. The loss happened in the space between two teams who each believed they were speaking the same language, and the word they disagreed about was not a word at all — it was the unit attached to it.

This is the accident that made "unit error" a phrase spacecraft engineers say out loud, and it is a strict sibling to the Gimli Glider sixteen years earlier: the same failure shape, a right number carrying a wrong unit, in a machine with no way to complain. But the Gimli Glider at least had a human holding a pencil who could have caught it. The Mars Climate Orbiter had a file. The file contained no unit field. And the error it carried was not 2.2× but 4.4482216152605×, applied not once but hundreds of times, in a direction that no instrument on Earth could observe.

Quick Answer: The 169 km Miscalculation

  • Root cause: Ground software SM_FORCES wrote impulse in lbf·s; Interface Spec (SIS) required N·s; navigation parser assumed N·s with no metadata field.
  • Multiplier error: Underestimated every AMD (angular momentum desaturation) thruster impulse by 4.4482216152605× (0.45359237 kg × 9.80665 m/s²).
  • Trajectory impact: Target periapsis 226 km → actual atmospheric arrival 57 km (survival threshold ~80 km).
Failure Boundary SM_FORCES (Lockheed Martin) → AMD file (no unit header) → JPL Navigation Software

The Conversion That Was Never Performed

Start with the number, because the number is where most retellings of this story go soft. The Mars Climate Orbiter Mishap Investigation Board, in its Phase I report of 10 November 1999, described the effect as "a factor of 4.45." That figure has been quoted ever since, and it is close enough for a headline — but it is not the value any engineer would type into a calculator, and the gap between the two is itself instructive.

Pound-force is defined by two other definitions stacked together: the international avoirdupois pound of the 1959 Yard and Pound Agreement, fixed at exactly 0.45359237 kilograms, multiplied by standard gravity, fixed at exactly 9.80665 m/s². Multiply those and you get the exact conversion:

$$\text{0.45359237 kg} \times \text{9.80665 m/s}^2 = \text{4.4482216152605 N} \quad (\text{exact, by definition})$$

The seconds cancel. This is the technical point that almost every popular account of the Mars Climate Orbiter skips, and it matters because it is the reason the error is so easy to mislabel. The unit that was written wrongly was not "pounds" — it was pound-force-seconds, a unit of impulse, not of force. A second of pound-force and a second of newton-force both last one second; the second is identical on both sides. What differed was the force being multiplied by it. So the conversion factor for the impulse is exactly the conversion factor for the force, and it is 4.4482216152605:

$$1\text{ lbf·s} = 4.4482216152605\text{ N·s} \quad \Big\vert{} \quad 1\text{ N·s} = 0.2248089431\text{ lbf·s}$$

Which makes the board's "4.45" a rounding to three significant figures — a value 0.040% above the exact factor. That rounding has cost the accident a certain amount of clarity over the years, because it invites the wrong lesson. Nobody chose 4.45 over 4.4482216152605. Nobody chose anything. The factor was never applied at all. The error is not a precision problem that better rounding would have fixed; it is a missing multiplication, the most complete kind of error there is, sitting at a boundary where no one was checking.

What the file actually said

The Mars Climate Orbiter Mishap Investigation Board was unambiguous about where the failure lived. Root cause: "the failure to use metric units in the coding of a ground software file, 'Small Forces,' used in trajectory models." The program was called SM_FORCES. Its output was written into another file, the AMD file — angular momentum desaturation — which the JPL navigation team then read as input to its trajectory model. The Software Interface Specification (SIS) governing that file defined both its format and its units, and it called for newton-seconds.

SM_FORCES wrote pound-force-seconds. The SIS was not followed. And here is the detail that turns a coding mistake into a systems failure: the file carried no unit field. It was a column of numbers with a header describing their arrangement, not their meaning. The navigation software had no way to test what it was reading, and no reason to doubt it. It applied those numbers as newton-seconds and updated the spacecraft's predicted position — hundreds of times — understating the impulse of each firing by a factor of 4.4482216152605.


text
[ AMD file: numbers only, NO unit field schema ]
        │
        ├─> [SIS Spec requires: N·s (SI)] ────────┐
        │                                         ▼
        └─> [SM_FORCES output: lbf·s] ──> [ NAVIGATION SOFTWARE ]
                                                 │ (parses as N·s per spec)
                                                 ▼
                                       [ TRAJECTORY UNDERSTATED 4.448× ]
                                       (Target 226 km ──> Actual 57 km)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)