I agree that keeping NavSatFix as is could be a good thing. Not everyone has a high-end receiver, and not everyone is interested in the highly detailed data.
What I do have a problem with is NavSatStatus which is clearly missing some constants for the fix type and constellations (remember there are also NAVIC, QZSS and many other private constellations). It is also missing many types of fix, and also a datum and height reference (whether ellipsoid height or MASL). In the case of non-RTK receivers, the datum should always be WGS84, but with RTK, it gets more complicated. In my view, this is the absolute minimum that needs to be known to interpret data from the NavSatFix message.
When creating the more detailed message type (starting from GPSFix or not), I’d consider it bad practice to redefine all the constellations and fix types there for the second time. So I propose that the new detailed fix message should include the updated NavSatStatus (or not include it at all and say that each detailed message is accompanied by a NavSatFix with the same stamp; then we could also leave out lat/lon/alt from the detailed message, but I’m not sure about this).
What I consider very unsuitable on the current GPSStatus is the usage of integer PRNs for satellites. That only works for GPS and QZSS. The other constellations do not use PRNs, or use fake/virtual/unofficial ones, but they are not unique. The best satellite identifier I’ve found is its Satcat ID. That is really an ID bound to a specific piece of hardware.
PRNs/other simple identifiers get reassigned e.g. when a satellite malfunctions and is replaced by a new one. The complete history of satellite IDs is published by IGS at https://files.igs.org/pub/station/general/igs_satellite_metadata.snx .
I don’t think that full RTK data should be a part of the new message. First, define full RTK data. You could get all the way down to RTCM streams from both the receiver and base stations. But most receivers can’t even reliably generate and report full RTCM streams with observations at the full speed. Or you could go half-way with something like gnss-info/gnss_info_msgs/msg at master · ctu-vras/gnss-info · GitHub which gives you full information about what did the receiver see and what were the observations (because these are the most interesting pieces for robotics, if anything). But I think these detailed messages would only be useful to a little group of people doing advanced GNSS processing.
So, if anything should be retained from RTK, it is just the status (fix/float/nothing), the datum of the reference station, age of corrections and the integer ambiguity/AR ratio value (this is very important for deciding whether to trust the results or not!).
You could even leave out the fix/float binary decision and provide only integer ambiguity, because the "fix" state is only a thresholded integer ambiguity (most libraries have this threshold set to 3.0). But I guess many people just look for a simple indicator, so keeping the simple fix/float decision is reasonable (with the downside that you don't actually know what exactly does it mean).
Regarding the orientation (heading from dual antennas), I don’t think putting it inside the detailed fix message is a good idea. First, many receivers just can’t produce this information. Second, dual-antenna receivers aren’t the only possible source of heading (you have magnetic/sun/star compasses and more). If the heading is kept separate, imagine how nice it would be to have it as an additional supported type in robot_localization, being able to pass heading from any source, not just dual-antenna GNSS. If someone is interested in both fix and heading, there is the standard mechanism of message synchronizer, so if the timestamps are kept identical, I don’t see a problem.
What to do with tilt from dual-antenna GNSS receivers, I don’t really know. The height measurements from GNSS sometimes suck, and so does the tilt. But hey, is anyone actually using it? I mean, using an IMU for that is just so much more precise (not sure about airplanes/rockets/other things with high acceleration, though). And if you really want, you could publish an IMU message for the tilt. You could also include the heading there, too, but it would probably be lying (because the receivers give heading in geographic frame, but in IMU message, you should have heading in a local cartesian frame/UTM).
Last idea - some receivers (like Septentrio) can directly produce position output in a local cartesian system or UTM. I guess that such messages can be easily converted to Odometry. The only unclear thing is what should be the parent frame. Maybe creating a common naming convention wouldn’t be bad, at least for the UTM frames.