Summary
Design and document a TF frame hierarchy for marine robotics that extends REP-105 with vertical datum frames specific to marine operations. This is a project-level spec to be implemented in mru_transform, with potential future formalization as a contribution to the marine robotics REP.
Motivation
Marine robots need multiple vertical reference surfaces that don't exist in standard REP-105:
- Chart datum (MLLW, LAT, etc.) — the static reference for nautical charts and S57 data
- Sea surface / tide — the dynamic water level, needed for navigation and depth interpretation
- Ellipsoidal height — what GPS measures directly
Currently these relationships are handled ad-hoc. A well-defined TF tree makes vertical datum conversions available to any node via standard tf2 lookups, and establishes conventions that other marine ROS projects can adopt.
Proposed Frame Hierarchy
earth (ECEF)
└─ map (ENU, WGS84 ellipsoid, established at first GPS fix)
├─ chart_datum (static offset via VDatum/PROJ, position-dependent, optional)
├─ map_tide (dynamic, current water surface in ellipsoidal height)
└─ odom (identity or localization correction)
└─ base_link
├─ base_link_north_up (position only, no orientation)
├─ base_link_level (heading only, no pitch/roll)
├─ waterline (static, from URDF)
└─ [sensor frames]
Design Decisions
-
map stays ellipsoidal — GPS positions work directly without VDatum. The system functions without datum conversion; chart_datum is additive/optional.
-
chart_datum is a child of map — the map→chart_datum transform encodes the static VDatum offset (ellipsoid to chart datum) for the current geographic position. Updated spatially as the robot moves. Requires VDatum grids (PROJ + .GTX files) or NOAA VDatum API.
-
map_tide is a child of map — water surface expressed in ellipsoidal height. Tide height above chart datum is recoverable via tf2 lookup from chart_datum to map_tide.
-
Multiple strategies for deriving map_tide:
- RTK averaging (current
sea_surface_estimator approach) — averages base_link Z over time to filter out wave motion and estimate sea surface
- MRU heave — if the MRU provides heave data, subtract heave from current position for an instantaneous sea surface estimate (no buffer delay)
- Tidal model — predicted tide from a model or external source
- The
map_tide frame is the same regardless of derivation method; consumers don't need to know the source.
-
waterline frame in URDF — resolves the existing TODO in sea_surface_estimator (the node currently averages base_link Z, but the robot isn't at the waterline).
-
NED convention variants — suffixed frames (map_ned, base_link_fsd) connected by static rotations, per the marine REP discussion. Not detailed here; to be addressed separately.
Analogies to Aviation
| Aviation |
Marine |
Nature |
pressure_altitude (REP-105) |
map_tide |
Dynamic surface measurement |
| MSL / geoid (EGM96) |
chart_datum (MLLW/LAT) |
Static reference, position-dependent |
| WGS84 ellipsoid |
map |
Geodetic reference |
REP-105 already suggests pressure_altitude as an extra intermediate frame for aerial vehicles. The marine vertical datum frames follow the same pattern.
Scope
Out of scope (for now):
- NED/FSD convention details
- Formal REP contribution
Related
Authored-By: Claude Code Agent
Model: Claude Opus 4.6
Summary
Design and document a TF frame hierarchy for marine robotics that extends REP-105 with vertical datum frames specific to marine operations. This is a project-level spec to be implemented in
mru_transform, with potential future formalization as a contribution to the marine robotics REP.Motivation
Marine robots need multiple vertical reference surfaces that don't exist in standard REP-105:
Currently these relationships are handled ad-hoc. A well-defined TF tree makes vertical datum conversions available to any node via standard
tf2lookups, and establishes conventions that other marine ROS projects can adopt.Proposed Frame Hierarchy
Design Decisions
mapstays ellipsoidal — GPS positions work directly without VDatum. The system functions without datum conversion;chart_datumis additive/optional.chart_datumis a child ofmap— themap→chart_datumtransform encodes the static VDatum offset (ellipsoid to chart datum) for the current geographic position. Updated spatially as the robot moves. Requires VDatum grids (PROJ + .GTX files) or NOAA VDatum API.map_tideis a child ofmap— water surface expressed in ellipsoidal height. Tide height above chart datum is recoverable viatf2lookup fromchart_datumtomap_tide.Multiple strategies for deriving
map_tide:sea_surface_estimatorapproach) — averagesbase_linkZ over time to filter out wave motion and estimate sea surfacemap_tideframe is the same regardless of derivation method; consumers don't need to know the source.waterlineframe in URDF — resolves the existing TODO insea_surface_estimator(the node currently averagesbase_linkZ, but the robot isn't at the waterline).NED convention variants — suffixed frames (
map_ned,base_link_fsd) connected by static rotations, per the marine REP discussion. Not detailed here; to be addressed separately.Analogies to Aviation
pressure_altitude(REP-105)map_tidechart_datum(MLLW/LAT)mapREP-105 already suggests
pressure_altitudeas an extra intermediate frame for aerial vehicles. The marine vertical datum frames follow the same pattern.Scope
chart_datumnode interface (links to mru_transform#7)map_tidederivation strategies (RTK averaging, MRU heave, tidal model)waterlineframe conventionOut of scope (for now):
Related
chart_datumnodepressure_altitudeframe precedentAuthored-By:
Claude Code AgentModel:
Claude Opus 4.6