Successfully reported this slideshow.
Your SlideShare is downloading. ×

How JSR 385 could have Saved the Mars Climate Orbiter - JFokus 2020

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 54 Ad

How JSR 385 could have Saved the Mars Climate Orbiter - JFokus 2020

Download to read offline

In 1999, NASA lost the $125 million Mars Climate Orbiter as it went into orbital insertion. Due to a mismatch between US customary and SI units of measurements in one of the APIs, the spacecraft came too close to the planet, passed through the upper atmosphere and disintegrated. Sadly, this hasn’t been the only instance where a mismatch between units of measurements had catastrophic consequences, but it’s certainly one of the most spectacular and expensive ones.

How could this happen? The bad news: if you use primitive types to handle quantities in your code, due to the same practice at best, you’ve codified the unit in a variable name or database field, e.g. calling it lengthInMetres. Otherwise, you’re only relying on convention, just like Lockheed Martin and NASA did.

Join this talk to learn how JSR 385 can help you avoid $125 million mistakes, how it applies the 2019 redefinition of SI base units, and discover the immeasurable world of dimensions, units and quantities.

In 1999, NASA lost the $125 million Mars Climate Orbiter as it went into orbital insertion. Due to a mismatch between US customary and SI units of measurements in one of the APIs, the spacecraft came too close to the planet, passed through the upper atmosphere and disintegrated. Sadly, this hasn’t been the only instance where a mismatch between units of measurements had catastrophic consequences, but it’s certainly one of the most spectacular and expensive ones.

How could this happen? The bad news: if you use primitive types to handle quantities in your code, due to the same practice at best, you’ve codified the unit in a variable name or database field, e.g. calling it lengthInMetres. Otherwise, you’re only relying on convention, just like Lockheed Martin and NASA did.

Join this talk to learn how JSR 385 can help you avoid $125 million mistakes, how it applies the 2019 redefinition of SI base units, and discover the immeasurable world of dimensions, units and quantities.

Advertisement
Advertisement

More Related Content

Advertisement

More from Werner Keil (20)

Advertisement

How JSR 385 could have Saved the Mars Climate Orbiter - JFokus 2020

  1. 1. How JSR 385 could have Saved the Mars Climate Orbiter Werner Keil @wernerkeil @UnitAPI
  2. 2. @wernerkeil https://hobbylark.com/party-games/1999-Fun-Facts-Trivia-and-News @UnitAPI
  3. 3. https://memegenerator.https://eu.usatoday.com/story/money/markets/2016/08/11/stocks-dow--sp500-thursday-wall-street/88557406/et/instance/78251780/party-like-its-1999-prince-reboot-like-its-1999 Party like it's 1999 @wernerkeil @UnitAPI
  4. 4. https://youtu.be/v1Zst19VWvo Life on Mars 1999 @wernerkeil @UnitAPI https://youtu.be/2CZl7ysDKOI https://youtu.be/EdLdL-Su_fo
  5. 5. Mars Climate Orbiter • Launched on 11 December 1998 • 338 kilograms • $125 millions • To study Martian climate, atmosphere and surface changes @wernerkeil @UnitAPI
  6. 6. @thodorisbais@wernerkeil
  7. 7. What went wrong @thodorisbais@wernerkeil lbf·s N·s4.45
  8. 8. Mars Climate Orbiter “The problem here was not the error; it was the failure of NASA’s systems engineering, and the checks and balances in our process, to detect the error. That’s why we lost the spacecraft.” Edward Weiler NASA associate administrator of space science, IEEE Spectrum: Why the Mars Probe went off course @thodorisbais@wernerkeil
  9. 9. Lessons Learned @thodorisbais@wernerkeil •Read the software specifications •Use JSR-385 instead of primitives •Fail-fast
  10. 10. More unit mishaps @thodorisbais@wernerkeil
  11. 11. Problem Statement @thodorisbais@wernerkeil
  12. 12. What is the Fundamental Problem? Primitive (Java) types are primitive types • static final double C = 1079252849; • static final double SPEED_OF_LIGHT = 1079252849; • static final double SPEED_OF_LIGHT_IN_KM_PER_H = 1079252849; @thodorisbais@wernerkeil static final Quantity<Speed> SPEED_OF_LIGHT = Quantities.getQuantity(1079252849, Units.KILOMETRE_PER_HOUR);
  13. 13. Rolling your Own Library • Development • Maintenance • Upgrades & extensions @thodorisbais@wernerkeil
  14. 14. Werner Keil Thodoris Bais Maintenance Lead JSR-385 Expert Group Member JSR-385 Let’s meet @thodorisbais@wernerkeil
  15. 15. What is JSR-385? @thodorisbais@wernerkeil
  16. 16. @thodorisbais@wernerkeil JSR-385: Units of Measurement API 2.0 JSR-275 Modularity Support Java SE >=8 JSR-363
  17. 17. JSR-385 Basic Concepts • Dimensions • Units • Quantities • Prefixes • Converters • Formats • Systems of units @thodorisbais@wernerkeil
  18. 18. Exercise @thodorisbais@wernerkeil
  19. 19. Write a program to calculate the BMI of a person Exercise description @thodorisbais@wernerkeil
  20. 20. Setting up a project <dependencies> <dependency> <groupId>tech.units</groupId> <artifactId>indriya</artifactId> <version>2.0.2</version> </dependency> </dependencies> @thodorisbais@wernerkeil
  21. 21. @thodorisbais@wernerkeil Quantities
  22. 22. –Wikipedia “A physical quantity is a physical property of a phenomenon, body, or substance, that can be quantified by measurement.” Definition of a Physical Quantity @thodorisbais@wernerkeil
  23. 23. Speed of Light c = 299,792,458 m/s Value Unit @thodorisbais@wernerkeil
  24. 24. One more quote @thodorisbais@wernerkeil –Ibidem “The same physical quantity can be represented equivalently in many unit systems.”
  25. 25. Speed of Light c = 299,792,458 m/s = 1,079,252,849 km/h @thodorisbais@wernerkeil
  26. 26. 1. Define two quantities a. A mass b. A length 2. Print them out Useful classes: •tech.units.indriya.quantity.Quantities •getQuantity(java.lang.Number value, javax.measure.Unit unit) •tech.units.indriya.unit.Units •javax.measure.Quantity •javax.measure.quantity.Mass Exercise Time @thodorisbais@wernerkeil
  27. 27. •Divide the mass by the square of the height •Print out the result Exercise Time @thodorisbais@wernerkeil
  28. 28. •Parse mass and height from a String •Read mass and height from the command line Exercise Time @thodorisbais@wernerkeil
  29. 29. @thodorisbais@wernerkeil Units
  30. 30. Base Units @wernerkeil @UnitAPI
  31. 31. Derived Units @wernerkeil @UnitAPI
  32. 32. Multiples • km • ms • Mm? • ks? @thodorisbais@wernerkeil
  33. 33. 1.Define a BMI quantity 2.Define a BMI unit 3.Convert the quantity to the BMI unit before printing it out Exercise Time @thodorisbais@wernerkeil
  34. 34. @thodorisbais@wernerkeil Dimensions
  35. 35. Dimensions • L: length • T: time • M: mass • I: electric current • Θ: thermodynamic temperature • N: amount of substance • J: luminous intensity • (1) Force: L · M · T-2 @thodorisbais@wernerkeil
  36. 36. •Autodetect which argument has mass dimension and which length Exercise Time @thodorisbais@wernerkeil
  37. 37. Summary Table @thodorisbais@wernerkeil
  38. 38. Doing the Math @thodorisbais@wernerkeil
  39. 39. Equality and Equivalence • kΩ ≠ mHz • kΩ ≠ mΩ • kΩ ≡ kΩ • N ≅ kg·m·s-2 • kg·m-2 ≅ mg·mm-2 • 1 kΩ ≠ 1 mHz • 1 kΩ ≠ 1 mΩ • 1 kΩ ≡ 1 kΩ • 1 N ≅ 1 kg·m·s-2 • 1 kg·m-2 ≅ 1 mg·mm-2 • 1 kΩ ≅ 1,000 Ω Units Quantities @thodorisbais@wernerkeil
  40. 40. Quantity Addition • 1 Ω + 1 Ω = 2 Ω • 1 Ω + 1 mΩ = 1.001 Ω • 1 mΩ + 1 Ω = 1,001 mΩ • 1 Ω + 1 m “does not compile” @thodorisbais@wernerkeil
  41. 41. Royal Swedish Academy of Sciences February Exam on Math How much is 0 °C + 0 °C? • 0 °C • 0 °C • 273.15 °C Two absolute temperatures 0 °C + 0 °C = 273.15K + 273.15K = 546.30K = 273.15 °C @thodorisbais@wernerkeil
  42. 42. How much is 0 °C + 0 °C? • 0 °C • 0 °C • 273.15 °C An absolute temperature and a temperature change 0 °C + 0 °C = 273.15K + 0K = 273.15K = 0 °C @thodorisbais@wernerkeil Royal Swedish Academy of Sciences February Exam on Math
  43. 43. How much is 0 °C + 0 °C? • 0 °C • 0 °C • 273.15 °C Two temperature changes 0 °C + 0 °C = 0K + 0K = 0K = 0 °C @thodorisbais@wernerkeil Royal Swedish Academy of Sciences February Exam on Math
  44. 44. How much is 0 °C + 0 °C? Answer @thodorisbais@wernerkeil Royal Swedish Academy of Sciences February Exam on Math
  45. 45. Temperature Scales @UnitAPI@wernerkeil Lord Kelvin (1824 - 1907) Anders Celsius (1701 - 1744) Daniel G. Fahrenheit (1686 - 1736)
  46. 46. •Swedish astronomer, physicist and mathematician •Born in Uppsala, on 27 November 1701 •Supported formation of the Royal Swedish Academy of Sciences in Stockholm in 1739 •Founded the Uppsala Astronomical Observatory in 1741 •Proposed the Celsius temperature scale in a paper to the Royal Society of Sciences in Uppsala in 1742 •Died from tuberculosis on 25 April 1744 Anders Celsius @wernerkeil @UnitAPI
  47. 47. Royal Swedish Academy of Sciences @UnitAPI@wernerkeil
  48. 48. Systems of UnitSystems of Unit •Metric System •Imperial System •US customary units •Roman units of measurement •Swedish Units of Measurement @wernerkeil @UnitAPI
  49. 49. Demo Time @thodorisbais@wernerkeil
  50. 50. What was the Fundamental Problem Again? Primitive (Java) types are primitive types @thodorisbais@wernerkeil
  51. 51. JSR-385 Links • JCP page • https://jcp.org/en/jsr/detail?id=385 • GitHub pages • https://unitsofmeasurement.github.io/ • https://github.com/unitsofmeasurement • http://uom.si • Current status • Final Release @thodorisbais@wernerkeil
  52. 52. Java Community Process @wernerkeil @UnitAPI
  53. 53. Becoming a JCP Member @thodorisbais@wernerkeil
  54. 54. @UnitAPI@wernerkeil

Editor's Notes

  • Software engineers
  • Software engineers
  • Launched on the 19th of December 1998 at 18:45 UTC. It was launched from Cape Canaveral aboard a delta to launch the eco.
    the complete burn sequence lasted 42’ and brought the spacecraft into a so called human transform orbit from earth to Mars.
    The orbit is 669million kilometers long and takes 9.5 months to complete > over a pregnancy

    Primary science objectives of the mission:
    determine the distribution of water in Mars
    monitor the daily atmospheric conditions
    record changes of the Martian surface (due to wind)
    determine temperature profiles in the atmosphere
    look for evidence of past climate change

    So that was a whole set of things the MCO was supposed to do
  • into a trajectory above 226km above the surface of Mars
    It probably got disintegrated in the atmosphere and disappeared.

    Minimum altitude to survive was 80km
  • A piece of software provided by Lockheed Martin produced results for the total impulse by the thruster firing in pound force seconds, whereas the trajectory calculation software provided by NASA expected it to be in Newton seconds.
    The software specification said it should have been in Newton seconds so Luckheed Martin clearly made a mistake
  • if Lockheed Martin had done a good job, it would have never happened
    Use JSR-385 instead of primitives
    Fail fast <== don’t rely on the checksum balancer to discover problems
  • The 12 October 1492 “mishap” Colombus miscalculated the circumference of the earth cuz he used roman miles instead of nautical miles. ended up in Bahamas, but thought he was in Asia. Consequence? the native americans were called for Indians 500 years afterwards

    2) “Gimli Glider”, 1983 - Air Canada flight 143 from Montreal to Edmonton.-After Canada went over from imperial units to SI system. received Less than the half needed and run out of fuel. Captain made a mistake in the conversion of the units. Groundcrew didn’t look it up independently.

    Less than the half needed and run out of fuel.

    Airport nearby used for car races, festivals, social happenings. There was a festival that day.

    just a few injuries

    3) Clarence the Tortoise, 2001 , Galapagos tortoise
    Los Angeles Zoo loaned to Moorpark College.
    “Build an enclosure for an animal that weighs in at about 250”
    Forgot to say “kilograms” . so Moorpark college built one for a 250 pound tortoise. Guess what happened the first night. Clarence wrecked the cage

    “It weighs 250”. forgot to say kilograms
    they built a cage for a 250 pound

    tortoise comes in, eats, and the tortoise wrecked the cage

    4) units begging for mistakes —> Tea spoon . gram and grain “take 5 grains” is being understood as “take 5 grams”
  • using a primitive to represent a quantity is fundamentally conflicting with OOP and DDD, cuz you’re using a type representing just a number to represent a quantity which has a unit

    —-
    built in into the property and it contains both the value and the unit

    —-

    No way to misinterpret the SPEED of light at the bottom as that number in km/h
  • wanna do it properly? define ur own library
    how difficult can it be? it’s just a value and a unit

    lot of work —> many units

    meter, time units, electrical resistance , TEMPERATURES?, divide & multiply

    Are you a UoM domain expert? so even if you use the SI system every day do you really understand how it works? TBH I didn’t even answer that question to myself. I would be surprised if you know all the peculiarities around SI.

    There is a number of strange things, even though it is designed as the rational system as compared to some other systems.

  • This JSR is a major evolution of the Unit API 1.0 (JSR 363) specification. Focussed on the SI System redefinition, modularity and support for Java SE 8/9 and above.

    JSR 363
    This JSR specifies Java packages for modelling and working with measurement values, quantities and their corresponding units.
  • Dimensions: length
    Unit: metre
    Quantity: 5 metres
    prefixes: kilo, milli, etc.
    converters: km/h —> m/s or mph
    formatting: print out the quantity and parse the quantity of the unit
    systems of units: metric, imperial and handle them in a good way
  • kg/m^2

    a thing that matters for the BMI index is to express the units as kilograms and meters and not cm for example.

    We’ll see as we go through th exercise that we can handle that in a good way
  • It doesn’t do some kinds of optimisations that one could think it would be nice to have
  • Let’s start by defining a number of quantities and try to print them out.
  • 5 meters = 500 cm
  • So you see? this is not difficult to do, so instead of defining an Integer to hold 75 as the mass, that’s not much of simplification compared to this
  • Yesterday I travelled 1.6Mm???
    1hour = 3.6ks, but “come back in 1ks”???
  • Yesterday I travelled 1.6Mm???
    1hour = 3.6ks, but “come back in 1ks”???
  • Yesterday I travelled 1.6Mm???
    1hour = 3.6ks, but “come back in 1ks”???
  • You need 1 for the angle for example so that you can handle the absence of dimension
  • Should you have functions to normalize expressions into what could be closer to the base unit
    That’s something you could consider, and also for quantities for example that 1 mg per mm-2 is automatically normalized to 1kg m-2

    Special paint for small devices

    It’s not just about comparing the values and the units
    you have to convert to one unit
    and do the comparison in one reference unit

  • We use the 1st unit if we can
    If it leads to an overflow, we can fall back to the second unit
    Otherwise, if it leads to an overflow in both units, we just throw an overflow error
  • THAT’S EASY! RIGHT?

    There are thermodynamic parameters when you want to add temperatures
  • All 3 answers are correct depending on the situation.
    absolute or relative quantity? We hadn’t modelled this.

    So, again, are you a domain expert in ur system? Do you really know the SI system so that you can write a library to handle this stuff?

    Why are we using degrees celsius. Undoubtedly, it’s easy (0-100 degrees), but degrees celsius is not such a good unit to measure temperature.

    JavaZone example with Time (i.e. day light, saving time, etc., formatting problem with US month – dd - yyyy, countries using F and celsius)

  • Metre, kilogram, second, ampere…

    Foot, ounce, pound, gallon, Fahrenheit, horsepower

    Foot, ounce, pound, gallon, Fahrenheit, gallon, …

    Pes, uncia, libra, …

    Fot, favn, mål, tønne, snes, …

×