John Parejko thanks for agreeing to take a look at obs_metadata. Please focus your review on the infrastructure and DECam, HSC, and MegaPrime example implementations. I've copied relevant translations from the obs packages. There is some minor code duplication that could be implemented. Jim Bosch was not keen on multiple inheritance of lots of little translator classes, so I've been pondering importing explicit helper methods and attaching them as methods directly to the class. Unlike in the obs package config/ingest.py all translation methods have the same form (trivial mappings become actual methods).
The code is designed to be as generic as possible and assumes dict-like header access (not PropertyList at the moment, although PropertyList is handled).
The concept here is that we have a standardized set of derived quantities, rather than letting obs packages do whatever they want (VisitInfo started on this). I've used Astropy classes throughout, and this has the added advantage of letting me do a self consistency check on the RA/Dec and AltAz headers. In theory you should not need to know which particular set of headers you have, the translation routines will work it out for you.
The initial plan would be to replace the makeRawVisitInfo routine in daf_butler with the ObservationInfo calculation and translate the astropy versions to afw versions so that they can be attached to an exposure. Eventually the two sets of header translation code (one for visit info and one for ingest) will be removed.