Skip to content

The ACRE Scene#

The scene is one surveyed tile of ACRE with its terrain, fields, ground layer, buildings, grain bins and trees. This page gives the frames of the tile, the contents of the scene, the data sources and the measured errors.

The coordinate frames of ACRES: base_footprint, world ENU, Unreal world and survey grid on the left, the geodetic chain from EPSG:2968 through NAD83 to UTM zone 16N and WGS84 on the right, with the conversion constants. LOCAL FRAMES OF THE GAME AND ACRES CORE GEODETIC CHAIN OF THE SURVEY frame of the simulation datum of the survey frame that an interface reports base_footprint Forward, left, up; m. Rear-axle midpoint on the ground. pose in world: (x, y, z), yaw ψ from east compass heading H = 90° − ψ Unreal yaw = H − 90° = −ψ World ENU (frame world) x east, y north, z up; m. Origin: tile centre. Grid north. x = X / 100, y = −Y / 100, z = Z / 100 X = 100 x, Y = −100 y, Z = 100 z Unreal world X east, Y south, Z up; cm. Origin: tile centre. X = 100 (x0 + u s), Y = 100 (y0 + v s) x0 = y0 = −762.001524 m s = 1.524003048 m (5 ftUS) Survey grid u east, v south; cells. (0, 0): north-west corner. E = 2977500 + x / f, N = 1902500 + y / f H = 705 f + z (NAVD88 height, m) f = 1200 / 3937 m (US survey foot) EPSG:2968 NAD83(HARN) / Indiana West. E, N in US survey feet. transverse Mercator on GRS80 lat0 37.5°, lon0 −87.083333°, k0 0.999966667 false E 900000 m, false N 250000 m NAD83(HARN) latitude, longitude Tile centre: 40.47157654° N, 86.99437399° W. + (−7.742258e−9°, +2.4261007e−7°) h = H + N, N = −33.627 m at the centre (GEOID12B plane, sensors.json) NAD83(2011) latitude, longitude, height The frame of an RTK fix of the Polaris. Krüger series k0 0.9996, CM −87° false E 500000 m Helmert, 14 parameters, at the epoch UTM zone 16N Easting, northing; m. WGS84(G2139) Latitude, longitude. Affine map of the simulator control channel E = E0 + x cos α + y sin α N = N0 − x sin α + y cos α E0 = 500476.935 m, N0 = 4480099.755 m α = 0.05409°. Error: 0.39 m maximum on the tile.
The frames of the scene and the conversions between them, with the constants of the tile. Open the diagram

Scope and Assumptions#

The page describes the world that the game and ACRES Core load. The level of the game is V03ACRE. Map Products gives the format of each map file.

The scene makes these assumptions.

  • The world is a plane. The axes of the world are the axes of the survey grid EPSG:2968.
  • North in the world is grid north. Grid north is 0.058° east of true north on the tile.
  • A length in the world is a grid length. A grid length is 61 ppm shorter than the length on the ground.
  • A height is a NAVD88 height above the origin height of 705 US survey feet.
  • The map is a record of one season. The lanes, the plots and the crops of the real farm change each season.
  • The vehicles drive on the terrain. The roads, the lots and the yards have no collision of their own.

Symbols#

Symbol Quantity Unit
\(u, v\) Survey grid coordinates: east and south from the north-west corner cell
\(s\) Size of a survey cell m
\(x_0, y_0\) World position of the north-west corner (grid_x0_m, grid_y0_m) m
\(X, Y, Z\) Unreal world position: east, south, up cm
\(x, y, z\) World ENU position: east, north, up m
\(\psi\) Yaw in the world ENU frame, from east, positive to the left rad
\(H_c\) Compass heading, from grid north, positive clockwise deg
\(E, N\) Easting and northing of EPSG:2968 ftUS
\(E_0, N_0, H_0\) Origin of the tile in EPSG:2968 and its NAVD88 height (origin_source_ft) ftUS
\(f\) Length of the US survey foot m
\(\varphi, \lambda\) Geodetic latitude and longitude rad
\(a, e, e'\) Semi-major axis, first eccentricity and second eccentricity of the ellipsoid m, -, -
\(k_0\) Scale factor on the central meridian of a projection -
\(h\) Ellipsoidal height m
\(N_g\) Geoid height m
\(E_U, N_U\) Easting and northing of UTM zone 16N m
\(\alpha\) Azimuth of grid north in the UTM grid (grid_rotation_deg) deg
\(z_A, z_B, z_C, z_D\) Heights of the four corners of a survey cell m

The Tile#

The tile is one square of the Indiana state grid: easting 2975000 to 2980000 and northing 1900000 to 1905000 in US survey feet. The coordinate reference system is EPSG:2968 (NAD83(HARN) / Indiana West). The origin of the world is the centre of the tile.

Quantity Value
Side of the tile 5000 ftUS = 1524.003 m
Area 232.26 ha
Survey grid 1000 x 1000 cells, 1001 x 1001 nodes
Cell size \(s\) 5 ftUS = 1.524003048 m
Origin \(E_0, N_0\) 2977500, 1902500 ftUS
Origin height \(H_0\) 705 ftUS = 214.884 m (NAVD88)
Tile centre, NAD83(HARN) 40.47157654° N, 86.99437399° W
Tile corners, WGS84 40.46471° N, 87.00337° W and 40.47845° N, 86.98538° W
UTM zone 16N

US 52 crosses the tile near its south edge. The land south of US 52 is woodland in the scene. The farm roads, the campus of the Beck Agricultural Center and the 59 fields are north of US 52.

Coordinate Frames#

Six frames describe a position. The table gives the frame that each part of ACRES uses.

Frame Axes and Unit Use
Survey grid \(u\) east, \(v\) south; cells Map files, spawn options, places.json, fields.json.
Unreal world \(X\) east, \(Y\) south, \(Z\) up; cm The level and surface_polygons.json. The game physics uses the same axes in metres.
World ENU \(x\) east, \(y\) north, \(z\) up; m ACRES Core, the ROS 2 frame world, the episode log and the learning files.
base_footprint Forward, left, up; m The pose of a vehicle. The origin is the rear-axle midpoint on the ground.
EPSG:2968 Easting, northing; ftUS The survey datum.
UTM zone 16N Easting, northing; m The odometry of the INS and the UTM poses of the simulator control channel.

Survey Grid and Unreal World#

The survey grid starts at the north-west corner of the tile. Cell \((500, 500)\) is the origin of the world. The function AAcresVehiclePawn::LoadAcreTerrain reads \(x_0\), \(y_0\) and \(s\) from site.json.

\[ X = 100\,(x_0 + u\,s), \qquad Y = 100\,(y_0 + v\,s) \]
\[ u = \frac{X/100 - x_0}{s}, \qquad v = \frac{Y/100 - y_0}{s} \]

The constants are \(x_0 = y_0 = -762.001524\) m and \(s = 1.524003048\) m. A start position of a vehicle must obey \(5 < u < 995\) and \(5 < v < 995\).

World ENU and Headings#

The world ENU frame has the same origin as the Unreal world. Only the direction of the second axis and the unit change.

\[ x = \frac{X}{100}, \qquad y = -\frac{Y}{100}, \qquad z = \frac{Z}{100} \]

FAcresTerrain::ToGrid gives the grid coordinates of a world ENU point.

\[ u = \frac{x - x_0}{s}, \qquad v = \frac{-y - y_0}{s} \]

Three angles describe a direction in the horizontal plane. An Unreal yaw is positive from east to south.

\[ H_c = 90^\circ - \psi, \qquad \psi_{UE} = H_c - 90^\circ = -\psi \]

The pose of a vehicle is the pose of base_footprint in the world ENU frame.

Survey Datum#

The world ENU frame is EPSG:2968 with a different origin and unit. FAcresGnssModel::Geodetic and FSiteGeoreference::EnuToNad83 use these equations.

\[ E = E_0 + \frac{x}{f}, \qquad N = N_0 + \frac{y}{f}, \qquad H = H_0\,f + z \]

The US survey foot is \(f = 1200/3937\) m. \(H\) is the NAVD88 height in metres.

Inverse Transverse Mercator#

AcresGeo::IndianaWestFeetToGeographic changes EPSG:2968 coordinates to NAD83(HARN) latitude and longitude. It uses the series of Snyder (1987) on the GRS80 ellipsoid. ACRES Core has the same function in CoreSimGeo.cpp.

Constant Value
\(a\) 6378137 m
Flattening 1/298.257222101
\(\varphi_0\) 37.5°
\(\lambda_0\) -87.08333333333333°
\(k_0\) 0.999966667
False easting \(F_E\) 900000 m
False northing \(F_N\) 250000 m

The length of the meridian from the equator to the latitude \(\varphi\) is \(M(\varphi)\).

\[ M(\varphi) = a\left[\left(1 - \tfrac{e^2}{4} - \tfrac{3e^4}{64} - \tfrac{5e^6}{256}\right)\varphi - \left(\tfrac{3e^2}{8} + \tfrac{3e^4}{32} + \tfrac{45e^6}{1024}\right)\sin 2\varphi + \left(\tfrac{15e^4}{256} + \tfrac{45e^6}{1024}\right)\sin 4\varphi - \tfrac{35e^6}{3072}\sin 6\varphi\right] \]

The function computes the footpoint latitude \(\varphi_1\) from the meridian distance of the point.

\[ M = M(\varphi_0) + \frac{N f - F_N}{k_0}, \qquad \mu = \frac{M}{a\left(1 - \tfrac{e^2}{4} - \tfrac{3e^4}{64} - \tfrac{5e^6}{256}\right)}, \qquad e_1 = \frac{1 - \sqrt{1 - e^2}}{1 + \sqrt{1 - e^2}} \]
\[ \varphi_1 = \mu + \left(\tfrac{3e_1}{2} - \tfrac{27e_1^3}{32}\right)\sin 2\mu + \left(\tfrac{21e_1^2}{16} - \tfrac{55e_1^4}{32}\right)\sin 4\mu + \tfrac{151e_1^3}{96}\sin 6\mu + \tfrac{1097e_1^4}{512}\sin 8\mu \]

Then it computes the auxiliary quantities at the footpoint.

\[ C_1 = e'^2\cos^2\varphi_1, \quad T_1 = \tan^2\varphi_1, \quad N_1 = \frac{a}{\sqrt{1 - e^2\sin^2\varphi_1}}, \quad R_1 = \frac{a\,(1 - e^2)}{(1 - e^2\sin^2\varphi_1)^{3/2}}, \quad D = \frac{E f - F_E}{N_1 k_0} \]

The latitude and the longitude are power series in \(D\).

\[ \begin{aligned} \varphi = \varphi_1 - \frac{N_1\tan\varphi_1}{R_1}\Big[&\frac{D^2}{2} - \left(5 + 3T_1 + 10C_1 - 4C_1^2 - 9e'^2\right)\frac{D^4}{24} \\ &+ \left(61 + 90T_1 + 298C_1 + 45T_1^2 - 252e'^2 - 3C_1^2\right)\frac{D^6}{720}\Big] \end{aligned} \]
\[ \lambda = \lambda_0 + \frac{1}{\cos\varphi_1}\left[D - \left(1 + 2T_1 + C_1\right)\frac{D^3}{6} + \left(5 - 2C_1 + 28T_1 - 3C_1^2 + 8e'^2 + 24T_1^2\right)\frac{D^5}{120}\right] \]

Datum Chain to NAD83(2011) and WGS84#

The survey datum is NAD83(HARN). An RTK fix of the Polaris is in NAD83(2011). A fix without RTK is in WGS84(G2139). FAcresGnssModel::Geodetic applies the full chain. The constants are in the block gnss.datum of sensors.json.

  1. A constant shift changes NAD83(HARN) to NAD83(2011). The shift is the NADCON5 value at the tile.

    \[ \varphi_{2011} = \varphi + (-7.742258\times10^{-9})^\circ, \qquad \lambda_{2011} = \lambda + (2.4261007\times10^{-7})^\circ \]
  2. A plane of the GEOID12B model gives the ellipsoidal height.

    \[ h = H + N_g, \qquad N_g = -33.6268735 - 1.07779725\times10^{-5}\,x - 6.19783884\times10^{-6}\,y \]
  3. The inverse of the Helmert transformation "ITRF2014 to NAD83(2011)" gives WGS84(G2139) at the epoch of the session. The transformation has 14 parameters. INS and GNSS describes the receiver model that uses this step.

The shift of step 1 is 0.9 mm south and 2.1 cm east. In 2026, a WGS84(G2139) position is 1.30 m from the NAD83(2011) position of the same point.

UTM Zone 16N#

AcresGeo::GeographicToUtm in AcresGeoUtm.h projects a latitude and a longitude to UTM. It uses the series of Krüger to the sixth order in the third flattening \(n\) (Karney, 2011). The ellipsoid is WGS84: \(a = 6378137\) m and flattening \(1/298.257223563\). The constants of the zone are \(k_0 = 0.9996\), a central meridian of -87° and a false easting of 500000 m. In this section, \(\lambda\) is the longitude relative to the central meridian.

\[ n = \frac{f_e}{2 - f_e}, \qquad A = \frac{a}{1 + n}\left(1 + \frac{n^2}{4} + \frac{n^4}{64} + \frac{n^6}{256}\right) \]

Here \(f_e\) is the flattening. The conformal latitude comes from \(\tau = \tan\varphi\).

\[ \sigma = \sinh\!\left(e\,\operatorname{atanh}\frac{e\,\tau}{\sqrt{1 + \tau^2}}\right), \qquad \tau' = \tau\sqrt{1 + \sigma^2} - \sigma\sqrt{1 + \tau^2} \]
\[ \xi' = \mathrm{atan2}(\tau', \cos\lambda), \qquad \eta' = \operatorname{asinh}\frac{\sin\lambda}{\sqrt{\tau'^2 + \cos^2\lambda}} \]
\[ \xi = \xi' + \sum_{j=1}^{6}\alpha_j\sin(2j\xi')\cosh(2j\eta'), \qquad \eta = \eta' + \sum_{j=1}^{6}\alpha_j\cos(2j\xi')\sinh(2j\eta') \]
\[ E_U = 500000 + k_0 A\,\eta, \qquad N_U = k_0 A\,\xi \]

The function also returns the meridian convergence \(\gamma\) and the point scale \(k\).

\[ p = 1 + \sum_{j=1}^{6} 2j\,\alpha_j\cos(2j\xi')\cosh(2j\eta'), \qquad q = \sum_{j=1}^{6} 2j\,\alpha_j\sin(2j\xi')\sinh(2j\eta') \]
\[ \gamma = \arctan\!\left(\frac{\tau'}{\sqrt{1 + \tau'^2}}\tan\lambda\right) + \mathrm{atan2}(q, p), \qquad k = \frac{k_0 A}{a}\sqrt{p^2 + q^2}\;\frac{\sqrt{1 - e^2\sin^2\varphi}\,\sqrt{1 + \tau^2}}{\sqrt{\tau'^2 + \cos^2\lambda}} \]
Coefficient Series
\(\alpha_1\) \(\tfrac{n}{2} - \tfrac{2n^2}{3} + \tfrac{5n^3}{16} + \tfrac{41n^4}{180} - \tfrac{127n^5}{288} + \tfrac{7891n^6}{37800}\)
\(\alpha_2\) \(\tfrac{13n^2}{48} - \tfrac{3n^3}{5} + \tfrac{557n^4}{1440} + \tfrac{281n^5}{630} - \tfrac{1983433n^6}{1935360}\)
\(\alpha_3\) \(\tfrac{61n^3}{240} - \tfrac{103n^4}{140} + \tfrac{15061n^5}{26880} + \tfrac{167603n^6}{181440}\)
\(\alpha_4\) \(\tfrac{49561n^4}{161280} - \tfrac{179n^5}{168} + \tfrac{6601661n^6}{7257600}\)
\(\alpha_5\) \(\tfrac{34729n^5}{80640} - \tfrac{3418889n^6}{1995840}\)
\(\alpha_6\) \(\tfrac{212378941n^6}{319334400}\)

AcresGeo::UtmToGeographic is the inverse. It removes the series with the coefficients \(\beta_j\) of the same source.

\[ \xi = \frac{N_U}{k_0 A}, \quad \eta = \frac{E_U - 500000}{k_0 A}, \quad \xi' = \xi - \sum_{j=1}^{6}\beta_j\sin(2j\xi)\cosh(2j\eta), \quad \eta' = \eta - \sum_{j=1}^{6}\beta_j\cos(2j\xi)\sinh(2j\eta) \]
\[ \tau' = \frac{\sin\xi'}{\sqrt{\sinh^2\eta' + \cos^2\xi'}}, \qquad \lambda = \mathrm{atan2}(\sinh\eta', \cos\xi') \]

Newton iterations then solve \(\tau'(\tau) = \tau'\) for \(\tau\). The function stops after six iterations or when the step is smaller than \(10^{-14}\). The latitude is \(\varphi = \arctan\tau\).

Coefficient Series
\(\beta_1\) \(\tfrac{n}{2} - \tfrac{2n^2}{3} + \tfrac{37n^3}{96} - \tfrac{n^4}{360} - \tfrac{81n^5}{512} + \tfrac{96199n^6}{604800}\)
\(\beta_2\) \(\tfrac{n^2}{48} + \tfrac{n^3}{15} - \tfrac{437n^4}{1440} + \tfrac{46n^5}{105} - \tfrac{1118711n^6}{3870720}\)
\(\beta_3\) \(\tfrac{17n^3}{480} - \tfrac{37n^4}{840} - \tfrac{209n^5}{4480} + \tfrac{5569n^6}{90720}\)
\(\beta_4\) \(\tfrac{4397n^4}{161280} - \tfrac{11n^5}{504} - \tfrac{830251n^6}{7257600}\)
\(\beta_5\) \(\tfrac{4583n^5}{161280} - \tfrac{108847n^6}{3991680}\)
\(\beta_6\) \(\tfrac{20648693n^6}{638668800}\)

The INS of the Polaris reports its odometry through this chain: world ENU, EPSG:2968, NAD83(2011), UTM.

Affine Map of the Simulator Control Channel#

The simulator control channel changes a world ENU position to UTM with one rotation and one offset. FAcresSimControl::WorldToUtm and FSiteGeoreference::WorldToUtm use the same equations.

\[ E_U = E_{U0} + x\cos\alpha + y\sin\alpha, \qquad N_U = N_{U0} - x\sin\alpha + y\cos\alpha \]
\[ x = (E_U - E_{U0})\cos\alpha - (N_U - N_{U0})\sin\alpha, \qquad y = (E_U - E_{U0})\sin\alpha + (N_U - N_{U0})\cos\alpha \]

The game computes the constants at the start from two points of the full chain: the origin and the point 500 m north of it.

\[ \alpha = \mathrm{atan2}\big(E_U(0, 500) - E_U(0, 0),\; N_U(0, 500) - N_U(0, 0)\big) \]
Constant Value
\(E_{U0}\) 500476.935 m
\(N_{U0}\) 4480099.755 m
\(\alpha\) 0.05409°

A UTM heading is the compass heading plus \(\alpha\): \(H_U = 90^\circ - \psi + \alpha\).

Georeference Caveats#

The source code and the calibration files state these limits of the georeference.

Caveat Effect
The affine map has no scale term. A UTM length is 0.99963 of a grid length on the tile. The error of the map thus increases by 0.37 mm for each metre from the origin. It is 0.39 m at a corner of the tile. The unit test Geo.AffineMapAcrossTile permits 0.45 m. The INS stream uses the full chain and does not have this error.
A comment in AcresSimControl.cpp gives a smaller error. The comment states "a few millimetres". The unit test of acres_core_sim shows the value of the row above.
The world uses grid lengths. The combined scale factor of EPSG:2968 on the tile is 0.9999386. A grid length is 6 mm short in 100 m. A UTM length is 4.3 cm short in 100 m (factor 0.9995712).
The world uses grid north. Grid north is 0.058° east of true north. The UTM grid differs from the survey grid by 0.054°.
A fix does not name its datum. An RTK fix is in NAD83(2011). A fix without RTK is in WGS84(G2139). The two differ by 1.30 m in 2026.
The false northing has a different last digit. The series uses 250000 m. The value of EPSG is 0.1 mm smaller.
The road polygons of Purdue Physical Facilities have the frame wkid 2245. The tools read them as the EPSG:2968 grid. The asphalt edges agree with the imaged edges at 0.36 m.
The plan files of the optimizer use NAD83(HARN). fields.geojson has the label WGS84, but the code does not apply steps 1 to 3 of the datum chain. The difference is approximately 1.3 m.

Terrain#

The terrain is the file heights.f32: one height for each of the 1001 x 1001 nodes of the survey grid. The heights agree with the USGS 3DEP LiDAR tile in2018_29751900 at 0.0 cm median (Calibration/Map/lanes_validation.md). The range of the heights is -12.65 m to 7.83 m relative to the origin height.

Each cell has two triangles. The diagonal goes from the north-east corner B to the south-west corner C. Let A be the north-west corner \((i, j)\), D the south-east corner, and \(f_x = u - i\), \(f_y = v - j\). AAcresVehiclePawn::AcreHeight and FAcresTerrain::HeightAt compute the height.

\[ z = \begin{cases} z_A + (z_B - z_A)\,f_x + (z_C - z_A)\,f_y & f_x + f_y \le 1 \\ z_D + (z_C - z_D)(1 - f_x) + (z_B - z_D)(1 - f_y) & f_x + f_y > 1 \end{cases} \]

FAcresTerrain::NormalAt gives the unit normal of the triangle below a point in the world ENU frame.

\[ \mathbf{n} = \frac{(-d_u/s,\; d_v/s,\; 1)}{\lVert(-d_u/s,\; d_v/s,\; 1)\rVert}, \qquad (d_u, d_v) = \begin{cases} (z_B - z_A,\; z_C - z_A) & f_x + f_y \le 1 \\ (z_D - z_C,\; z_D - z_B) & f_x + f_y > 1 \end{cases} \]

The level shows the terrain as 16 static meshes (ACRE_Ground_0_0 to ACRE_Ground_3_3) with the tag ACRETerrainVisual. One collision mesh (ACRE_CollisionFull) has the same triangles. The wheels trace against this mesh. The option -TerrainVerify compares the collision mesh with heights.f32 at 441 points. The test fails at an error of 1 cm.

Two changes apply to the survey heights.

  • Road review. The block road_review_corrections of site.json records one correction of the heights along 34 roads. The correction changed 170058 nodes by -1.33 m to +1.38 m. It limits the side tilt of a road to 5°.
  • Terrain edits. The Fields tab of the menu has a brush that raises, lowers, smooths or flattens the ground in one field. An edit is a height offset for each node, limited to ±1 m. The session folder keeps it as terrain-edits.f32. FAcresFieldSetup::GroundAt adds the offset to the survey height with the same two triangles.

The wheels, the routed water, the crops and the rendered ground use the edited height. The collision of the chassis keeps the survey mesh.

Fields#

The tile has 59 fields. fields.json gives each field an identifier from F01 to F59 and one outline in survey grid coordinates. The number of the identifier is the field identifier in the code: 1 to 59. The value 0 means no field.

FAcresFieldSetup::Fields reads the outer ring of each outline and computes the area with the shoelace formula.

\[ A_{ha} = \frac{s^2}{10^4}\cdot\frac{1}{2}\left|\sum_{k}\left(u_{k-1}v_k - u_k v_{k-1}\right)\right| \]

FAcresFieldSetup::FieldAtUv finds the field of a point with the bounding box and then an even-odd test. The farm uses the raster field_ids.u8 (4 m cells) for the same question.

Land Cover in fields.json Fields Meaning in the Game
unassigned 27 The game plants corn and generates the crop patches.
corn 17 A crop field.
soybean 5 A crop field.
empty 4 Bare soil: F29, F32, F39 and F48. The tractors of the farm traffic work these fields.
lawn 4 Mown grass. No crop.
shrubs 1 F57.
woodland 1 F59.

The sum of the field areas is 126.5 ha. The outlines follow the measured edges of the lanes, roads and yards. Tools/ACRE/Map/fields_recut.py cut them from the ground layer.

The crop season file crops_2026.json replaces the crop of each field at the start of a session. It plants 28 fields with corn and 19 fields with soybean. It leaves 12 fields without a crop. Crops and Ground Classes describes the crop model.

Ground Layer#

The ground layer is a list of polygons in surface_polygons.json. Each polygon has a surface class and a priority. The wheels, the implements and the farm read the class at their contact points. The ground material and the minimap come from the same polygons, so the image and the physics change at the same edge.

Class Code Priority Polygons Area (ha) Contents
field 0 none 182.24 The background: crop fields and woodland floor.
asphalt 1 60 33 6.39 Paved roads, US 52, parking lots.
concrete 2 55 22 0.29 Aprons, walks, plazas.
gravel 3 40 139 5.07 Farm roads, yards, pads, driveways.
grass_lane 4 20 78 6.46 Mown lanes with two wheel tracks.
grass 5 10 236 31.47 Verges, lawns, grass strips, the median of US 52.
dirt 6 30 13 0.33 Bare tracks and turn rows.

The areas come from a raster of the lookup rule with 0.5 m cells.

Lookup rule. FSurfaceMap::ClassAt and the Python function surface_class_at of game_layer.py use one rule.

  1. Find the polygons that contain the point. The test is the even-odd rule on the outer ring. A point in a hole is outside.
  2. Select the polygon with the highest priority.
  3. If two polygons have the same priority, select the polygon that is later in the file.
  4. If no polygon contains the point, the class is field.

The even-odd test counts the edges that a ray to the east crosses. For an edge from \((x_i, y_i)\) to \((x_j, y_j)\), the ray from \((x, y)\) crosses when

\[ (y_i > y) \ne (y_j > y) \quad \text{and} \quad x < x_i + \frac{(x_j - x_i)(y - y_i)}{y_j - y_i} \]

FSurfaceMap::Build puts the polygons into square buckets of 2 m. A query examines only the polygons of one bucket.

Contents of the layer.

  • Roads. The paved roads, the gravel farm roads and US 52 are the road polygons of Purdue Physical Facilities.
  • Lanes. The grass lanes and the dirt tracks come from the 2023 orthophoto, NAIP 2025 and the 2018 LiDAR. The county orthophoto of 2025 gave better edges for 28 lane segments.
  • Verges. 139 polygons are mown strips between a road and a field. verges.py measured them along 13.4 km of road edge. The median width is 3.5 m.
  • Yards and lots. hardstanding.py found the ground without vegetation in the imagery of 2025. The parking lots A, D and E are on their painted stalls.
  • Site edits. site_edits.py added the entrances and the driveways of the buildings and 123 curb returns with a radius of 5 m.

US 52 has a grass median of 12.4 m. Each carriageway has two lanes of 3.65 m, an inner shoulder of 1.2 m and an outer shoulder of 3.2 m. The lane centres are 9.21 m and 12.86 m from the centreline (lane_offsets_m in site.json).

Only US 52 and the parking lots are meshes above the terrain. These meshes have the tag ACREPavementVisual and no collision. Crops and Ground Classes and Tyre and Soil describe how a class changes the physics.

Buildings and Bins#

The level has 41 buildings and 26 grain bins (Calibration/Map/buildings_check.json). Each one is on a measured footprint.

  • Footprints. Tools/ACRE/Map/buildings.py selects one footprint for each building from three sources: Microsoft, Purdue Physical Facilities and OpenStreetMap. The best footprint has the smallest distance between its outline and the roof edge in the 2018 LiDAR.
  • Original models. 23 buildings are hand-made models. fit_original_buildings.py puts each model into its footprint with a translation, a yaw of 1.8° maximum and a stretch in X and Y.
  • Footprint models. 18 buildings are models that building_models.py generates from the footprint and the roof heights of the LiDAR.
  • Bins. 23 bins are original models on their round footprints. Three bins are footprint models.
  • South of US 52. The 21 buildings south of US 52 are not in the level.

The buildings and the bins have the tags ACREBuildingVisual and ACRESiloVisual. The GNSS model and the LiDAR use the tags. site.json also has a list of 23 building boxes and 32 bins. The farm traffic reads its service points from these lists.

ACRES Core does not load the level. It reads the buildings, the bins and the trees from Core/Data/acre_scene.json.

Trees#

The surveyed trees are instances of four meshes: three variants of an American elm and one broadleaf tree. Each tree has a trunk collision cylinder. The level has 6984 trunks (ACRE/Scouting/obstacles.json).

  • Tools/ACRE/Map/tree_check.py examined 7307 surveyed trees in the imagery of 2023 and 2025. It removed the 342 trees that are not there now.
  • The land south of US 52 is dense woodland with 97 trees for each hectare.
  • No tree is nearer than 1.5 m to a pavement, 2 m to a building or 12 m to US 52.

The sensors find a tree by its tag (woodland, ACRETree) or by its mesh (AcresVegetation::IsTreeActor).

Named Places#

places.json gives names to points and areas of the tile. A point can have a heading. A session without an explicit pose starts at the place spawn-icsc-garage. The option -SpawnAt= selects a different point by its identifier or its name.

Identifier Name Category Kind Survey Grid \((u, v)\) World ENU (m)
spawn-icsc-garage Spawn: ICSC garage spawn point 474.6, 592.2 -38.710, -140.513
spawn-beck-lot Spawn: Beck's parking lot spawn point 638.0, 664.0 210.312, -249.936
pmumbr7olz33s6 Indiana Corn and Soybean Center landmark point 491.3, 605.681 -13.259, -161.058
pmumbs9bp8b53v Beck Agricultural Center landmark point 597.12, 667.696 148.011, -255.569
pmumbtvetutegb Beck's Parking Lot yard area 7 points 1696.8 m²
pmumc3tsdv2mpd ICSC Parking Lot 1 yard area 4 points 682.1 m²
pmumc5fobt37kh ICSC Parking Lot 2 yard area 4 points 413.6 m²

Both spawn places have a heading of 0° (north). The real Polaris parks at the ICSC garage. The explicit options -VehicleSpawnU=, -VehicleSpawnV= and -VehicleSpawnYaw= have priority over a place. Command-Line Options describes these options.

Data Sources and Licences#

The table lists the data that the map uses. Each source keeps its own licence.

Source Use Licence
Purdue University Digital Forestry: DTM, DSM and LiDAR point cloud of the tile Terrain. Credit Purdue Digital Forestry.
USGS 3DEP LiDAR, Indiana Statewide 2017 B17 (flown 2018-04, QL2) Building heights, roof and edge checks, sod edges of the lanes. Public domain.
IndianaMap 2023 orthophoto, 6 inch (Indiana GIO) Edges of lanes, verges and yards; figures. CC0.
USDA NAIP 2025, 0.6 m Edges of lanes and verges; the minimap; figures. Public domain.
Tippecanoe County 2025 true orthophoto (EagleView imagery) Measurement of edges only. Licensed to the county. See the caution below.
Purdue University Physical Facilities GIS Road polygons, parking lots, building footprints. No licence stated (public read).
Microsoft Global ML Building Footprints Building footprints. ODbL 1.0.
OpenStreetMap contributors Building footprints; road lines for checks. ODbL 1.0.
USDA-NRCS SSURGO (Soil Data Access) Soil map units and their properties. Public domain.
USDA NASS Cropland Data Layer 2021 to 2025 Labels for the crop classifier; the rotation of the crops. Public domain.
Copernicus Sentinel-2, 2024 to 2026 The crop classifier of 2026. Copernicus data licence (free and open, with attribution).
Purdue Mesonet, ACRE station Air temperature for the crop season. Terms of use not confirmed.
NGS CORS station P775 A check of the frame. The station is inside the tile. Public domain.
RTK drives of the Polaris The line of N 500 W; checks of roads and heights. Data of the Purdue lab.

CAUTION

Do not add pixels of the Tippecanoe County orthophoto to the repository. EagleView licenses the imagery to the county. The repository contains only the vectors that the tools measured on it. These vectors have the mark county2025.

The layer Calibration/Map/Layers/buildings.geojson combines footprints of Microsoft, OpenStreetMap and Purdue Physical Facilities. It is thus a derivative database under the ODbL. Calibration/Map/data_sources.md gives the measured quality of each source.

Third-Party Models and Textures#

Asset Source Licence
Header and reel of the harvest cutter (Tools/ACRE/Props/harvester_header.py) "Harvester" by Francesco Coldesina, Sketchfab CC BY-NC 4.0: credit, no commercial use.
Pavement, concrete, wall and ground textures Poly Haven CC0.
Farm workers: "Bubba The Handyman" CGTrader Royalty Free License.
Pickup trucks of the farm traffic CGTrader Royalty Free License (no AI).
American elm (Tools/ACRE/Vegetation/elm_variants.py) Downloaded model The licence of the download.
Highway cars (Tools/ACRE/Vehicles/prep_npc_cars.py), dumpster Downloaded models The licence file of each model.
Potato plants (Tools/ACRE/Vegetation/potato_patches.py) Unreal farm asset pack The licence of the pack.

Examine each licence before a commercial use.

Validation and Error Budget#

Calibration/Map/error_budget.md gives the difference between the real farm and the scene. Each value is the median and the 95th percentile of the absolute difference. The table shows the state of the game now.

Quantity Median 95th Percentile Basis
Terrain, horizontal 3 cm 0.43 m Measured and stated by the provider.
Terrain, vertical 9 cm 0.25 m Measured.
Paved roads 0.80 m 4.55 m Measured.
Gravel roads 0.72 m 4.95 m Measured.
Grass lanes and their edges 0.28 m 1.20 m Measured and estimated.
Buildings 0.30 m 3.05 m Measured.
Field boundaries 0.28 m 1.20 m Measured and estimated.
Widths of lanes and roads 0.25 m 0.80 m Measured and estimated.
Distance in 100 m (scale) 6 mm 6 mm Computed.
Distance in 1 km (scale) 6 cm 6 cm Computed.
Crop type of a field 12 % wrong Measured and estimated.
Wheel surface on the RTK drives 3 % wrong Measured.

The validation reports give these results.

  • Frame. The imagery is 3.9 cm from the frame of the RTK drives (lanes_validation.md). The NGS position of the station P775 agrees with the frame at 2.3 cm.
  • Lane edges. The scatter of an edge is 0.29 m at each station of 0.5 m. A lane that did not move differs by 0.30 m between 2023 and 2025.
  • RTK drives. On five RTK drives, 98.5 % of the length is on a road or a lane of the layer (game_layer.md). The value for the original map was 71 %.
  • Wheels in the game. The Polaris replays the RTK drives in the packaged game. The wheels are on a road or a lane for 96.8 % of the samples.
  • Lookup. The C++ lookup and the Python lookup give the same class for 99.3 % of these samples.
  • Buildings. The outlines in the level are 0.31 m from the roof edge of the LiDAR for each building (median). The 95th percentile of all samples is 3.05 m.
  • US 52. The centreline is 0.23 m from the county centrelines (median). The original line was 10.4 m south of the real road at the west edge.

Parameters#

site.json#

Name Type Unit Default Description
origin_source_ft array of 3 numbers ftUS 2977500, 1902500, 705 The origin of the world in EPSG:2968 and its NAVD88 height.
us_survey_ft_to_m number m 0.3048006096012192 The length of the US survey foot.
crs text EPSG:2968 The coordinate reference system of the survey.
vertical_datum text NAVD88 Geoid12B ftUS The vertical datum of the survey.
grid_step_m number m 1.524003048006096 The cell size \(s\).
grid_x0_m, grid_y0_m number m -762.001524003048 The world position of the north-west corner.
grid_width, grid_height integer node 1001 The number of height nodes on each side.
surface_width, surface_height integer cell 1000 The number of cells on each side.
spawn_uv array of 2 numbers cell 625, 477 The start position when places.json is not available.
spawn_yaw_deg number deg 180 The Unreal yaw of that start position.
terrain_revision text 2026-09-23-road-review-3 The revision of heights.f32.

surface_polygons.json#

Name Type Unit Default Description
priority.asphalt integer 60 The priority of the class. A higher value has priority.
priority.concrete integer 55
priority.gravel integer 40
priority.dirt integer 30
priority.grass_lane integer 20
priority.grass integer 10
wheel_track_m number m 1.55 The distance between the two wheel tracks of a grass lane.

sensors.json, Block gnss.datum#

Name Type Unit Default Description
harn_to_nad83_2011_shift_deg array of 2 numbers deg -7.742258e-09, 2.4261007e-07 The shift of latitude and longitude from NAD83(HARN) to NAD83(2011).
geoid.n0_m number m -33.6268735 The geoid height at the origin.
geoid.dn_de number m/m -1.07779725e-05 The slope of the geoid height to the east.
geoid.dn_dn number m/m -6.19783884e-06 The slope of the geoid height to the north.
output_frame choice wgs84_g2139 The frame of the GNSS output: wgs84_g2139 or nad83.

Code Map#

Item File Function
Grid, heights, spawn Acres/Source/Acres/AcresVehicle.cpp AAcresVehiclePawn::LoadAcreTerrain, AcreHeight, VerifyAcreTerrain
Surface under a wheel Acres/Source/Acres/AcresVehicle.cpp AAcresVehiclePawn::SampleSurface
Surface lookup Acres/Source/Acres/AcresSurfaceMap.cpp FSurfaceMap::Build, FSurfaceMap::ClassAt, FSurfaceMap::Contains
Fields, terrain edits, crop season Acres/Source/Acres/AcresFieldSetup.cpp FAcresFieldSetup::Fields, FieldAtUv, SurfaceMap, GroundAt, Brush, CropSeason
Named places Acres/Source/Acres/AcresPlaces.cpp AcresPlaces::All, Find, Spawns, Requested
UTM projection Acres/Source/Acres/AcresGeoUtm.h AcresGeo::GeographicToUtm, AcresGeo::UtmToGeographic
Survey datum to latitude and longitude Acres/Source/Acres/AcresSensors.cpp AcresGeo::IndianaWestFeetToGeographic
Datum chain Acres/Source/Acres/AcresGnssModel.cpp FAcresGnssModel::Geodetic, FAcresGnssModel::EnuFromWgs84
Affine map Acres/Source/Acres/AcresSimControl.cpp FAcresSimControl::WorldToUtm, FAcresSimControl::UtmToWorld
Terrain of ACRES Core Core/Source/AcresCoreTerrain.cpp FAcresTerrain::Load, HeightAt, NormalAt, RayCast
Obstacles of ACRES Core Core/Source/AcresCoreScene.cpp FAcresScene::Load, FAcresScene::LoadObstacles
Georeference of ACRES Core ROS/acres_core_sim/src/CoreSimGeo.cpp FSiteGeoreference::Load, EnuToNad83, EnuToUtm, WorldToUtm
Georeference in Python Calibration/Polaris/geo.py enu_to_geographic, enu_to_utm, utm_to_enu, enu_to_cell
Frames in the learning package Learning/acres_learn/acre.py cells_to_enu, enu_to_cells, ue_cm_to_enu
Map tools Tools/ACRE/Map game_layer.py, site_edits.py, fields_recut.py, places.py

Limitations#

  • The terrain has cells of 1.524 m. A ditch or a crown that is smaller than a cell is not in the terrain.
  • The terrain is the LiDAR survey of 2018. A road that changed after 2018 has the old heights.
  • The edges of the lanes come from the imagery of 2023 and 2025. A lane edge moves approximately 0.3 m in one season.
  • No RTK drive exists on a grass lane that is there now. The accuracy of the grass lanes thus comes from the imagery.
  • The plots inside the research blocks (F32 to F45) are not in the map. The crop of these fields has low confidence.
  • The roads, the lots and the yards have no height of their own. A curb or a road crown does not exist.
  • The collision of the chassis ignores the terrain edits and the ruts.
  • acre_scene.json has all 63 building models of building_models.json. The 21 buildings south of US 52 are thus in the LiDAR of ACRES Core but not in the level.
  • The affine map of the simulator control channel has no scale term (see the caveats above).

References#

  • Snyder, J. P. (1987). Map Projections: A Working Manual. U.S. Geological Survey Professional Paper 1395. Washington, DC: U.S. Government Printing Office.
  • Karney, C. F. F. (2011). Transverse Mercator with an accuracy of a few nanometers. Journal of Geodesy, 85(8), 475-485.
  • EPSG Geodetic Parameter Dataset. Coordinate operation "ITRF2014 to NAD83(2011) (1)" and CRS EPSG:2968. International Association of Oil and Gas Producers.
  • National Geodetic Survey. GEOID12B and NADCON5 models. NOAA.
  • U.S. Geological Survey (2018). 3D Elevation Program, IN Indiana Statewide LiDAR 2017 B17.
  • Soil Survey Staff. Soil Survey Geographic (SSURGO) Database. USDA Natural Resources Conservation Service.