The document discusses how using JSR-385 could have prevented the loss of the Mars Climate Orbiter spacecraft. It describes how the orbiter was launched in 1998 to study the Martian climate but was lost due to a failure to convert between metric and imperial units. Had JSR-385 been used to define physical quantities with consistent units, as it does now, this error may have been caught during development. The document then provides an overview of JSR-385 and how it can help define quantities, units, and perform unit conversions to prevent such errors.
4. Mars Climate
Orbiter
• Launched on 11
December 1998
• 338 kilograms
• $125 millions
• To study Martian
climate, atmosphere
and surface changes
@wernerkeil @thodorisbais
7. 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
10. 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);
11. Rolling your Own Library
• Development
• Maintenance
• Upgrades & extensions
@thodorisbais
@wernerkeil
12. Werner Keil Thodoris Bais
Maintenance Lead JSR-385
Expert Group Member JSR-385
Let’s meet
@thodorisbais
@wernerkeil
14. JSR-385 Basic Concepts
• Dimensions
• Units
• Quantities
• Prefixes
• Converters
• Formats
• Systems of units
@thodorisbais
@wernerkeil
15. Setting up a project
<dependencies>
<dependency>
<groupId>tech.units</groupId>
<artifactId>indriya</artifactId>
<version>2.1.2</version>
</dependency>
</dependencies>
@thodorisbais
@wernerkeil
16. –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
17. Speed of Light
c = 299,792,458 m/s
= 1,079,252,849 km/h
@thodorisbais
@wernerkeil
Value Unit
22. Systems of Unit
Systems of Units
• Metric System
• Imperial System
• US customary units
• Roman units of measurement
• Swiss units of measurement
@thodorisbais
@wernerkeil
28. Write a program to calculate the BMI of a person
Exercise description
@thodorisbais
@wernerkeil
29. 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 1
@thodorisbais
@wernerkeil
30. • Divide the mass by the square of the height
• Print out the result
Exercise 2
@thodorisbais
@wernerkeil
31. a. Parse mass and height from a String
b. Read mass and height from the command line
Exercise 3
@thodorisbais
@wernerkeil
32. a. Define a BMI quantity
b. Define a BMI unit
c. Convert the quantity to the BMI unit before printing it out
Exercise 4
@thodorisbais
@wernerkeil
33. • Autodetect which argument has mass dimension and which one
has length
Exercise 5
@thodorisbais
@wernerkeil
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
Mars 2020 Rover contains components from multiple different countries (most of them use the Metric System)
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
It doesn’t do some kinds of optimisations that one could think it would be nice to have
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”???
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
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)
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
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