Skip to content

CoreSimGeo.h#

ROS/acres_core_sim/include/acres_core_sim/CoreSimGeo.h Generated

The simulator's georeference without Unreal: the game's datum chain from the grid ENU frame of the ACRE tile to NAD83(2011) latitude / longitude and UTM zone 16N, as the Polaris' INS stream reports them (AcresSensors.cpp FAcresSensorRecorder::InsEpoch with sensors.json "ins.frame": "nad83"), and the affine world <-> UTM map of the simulator-control channel (AcresSimControl.cpp WorldToUtm / UtmToWorld).

Chain (Calibration/Polaris/geo.py documents it in full): grid ENU m -> EPSG:2968 (NAD83(HARN) / Indiana West, US survey feet, origin site.json origin_source_ft) -> NAD83(HARN) latitude / longitude by the inverse transverse Mercator of Snyder (1987) on GRS80 (the game's IndianaWestFeetToGeographic, ported here unchanged) -> + the constant NADCON5 HARN -> NAD83(2011) shift at the site (sensors.json gnss.datum) -> UTM by Krueger's series (Karney 2011; the game's header-only AcresGeoUtm.h). Heights: NAVD88 (origin height + ENU up) plus the GEOID12B plane of sensors.json. The WGS84(G2139) branch (a time-dependent Helmert) is not needed for the Polaris' RTK fix and is not ported.

Pure functions after Load; any thread.

IndianaWestFeetToGeographic#

EPSG:2968 grid coordinates (US survey feet) to NAD83(HARN) latitude / longitude, deg (the game's AcresGeo::IndianaWestFeetToGeographic: Snyder 1987 inverse TM series on GRS80, lat0 37.5, lon0 -87.0833333, k0 0.999966667, false easting 900000 m, false northing 250000 m).

void IndianaWestFeetToGeographic(double EastingFt, double NorthingFt, double& LatitudeDeg, double& LongitudeDeg);

FSiteGeoreference#

class FSiteGeoreference

The site's georeference (site.json origin, sensors.json gnss.datum).

Name Type Unit Default Description
UtmOriginE, UtmOriginN, GridRotationDeg double Origin of the affine map (UTM of world 0, 0), m, and its grid rotation, deg.
OriginFt double site.json origin_source_ft (EPSG:2968 easting, northing, NAVD88 height; US survey feet).
HarnTo2011DegLat, HarnTo2011DegLon, GeoidN0M, GeoidDnDeM, GeoidDnDnM double NADCON5 HARN -> NAD83(2011) shift, deg; GEOID12B plane N = N0 + dN/dE E + dN/dN N (m, m/m, m/m).

FSiteGeoreference::Load#

Reads Content/Simulation/ACRE/site.json and Content/Simulation/sensors.json.

Argument Description
ContentDir Acres/Content/Simulation.
Error Why it failed (may be null).

Returns: False when a file is missing or malformed.

bool Load(const std::string& ContentDir, std::string* Error = nullptr);

FSiteGeoreference::EnuToNad83#

NAD83(2011) latitude, longitude (deg) and ellipsoidal height (m) of a grid ENU point.

void EnuToNad83(double E, double N, double U, double& LatDeg, double& LonDeg, double& HeightM) const;

FSiteGeoreference::EnuToUtm#

UTM of a grid ENU point through the full chain (NAD83(2011), zone Zone), m.

void EnuToUtm(double E, double N, int Zone, double& EastingM, double& NorthingM) const;

FSiteGeoreference::WorldToUtm#

The control channel's affine georeference: world (grid ENU) to UTM 16N and back, exact to a few millimetres across the tile; GridRotationDeg is the UTM azimuth of the world's grid north.

void WorldToUtm(double E, double N, double& EastingM, double& NorthingM) const;