Skip to content

Session Log#

This page describes each file that the game writes into the session folder: the names, the columns, the keys and the units. The examples show rows of real sessions.

Group Contents
Session Folder The location, the name and the layout of the folder.
Conventions The frames, the time bases, the rates and the units.
Vehicle Files tractor.csv, session-summary.json, dbw.csv, vehicle.csv, the replay files and the test files.
Sensor Episodes The streams, the images, the point clouds and episode.json.
Farm Files The farm state, the water grid, the field totals and the events.
Configuration Copies The files that the menu writes before the session starts.

The episode log is a different file. It is one MCAP file with the states of all agents. Episode Log describes it.

At recording stop, the recorder waits for submitted GPU LiDAR copies and releases their readback buffers. A scan that still waits for a rendered view keeps its CPU result. The manifest counts these scans in lidar.gpu_stop_fallbacks; the stop log uses lidar_stop_fallback. Actual GPU failures remain in lidar.gpu_scan_failures and the error list. Missed camera or LiDAR deadlines have separate counters.

Session Folder#

The session folder contains the configuration and the logs of one session. The menu makes a new folder for each session. A session from the command line uses the folder of -VehicleOutput=.

Start Folder
Menu Saved/Sessions/<YYYYMMDD-HHMMSS>-<mode>. The mode is simulation, replay or pilot.
Menu, second session in the same second The same name with the suffix -2, -3 and higher.
Command line with -VehicleOutput=<folder> The given folder.
Command line without -VehicleOutput= Saved/Vehicle. Each session writes over the files of the last session.

The folder Saved is in the project folder of the game.

Build Location of Saved
Development, packaged Packaged/Linux/Acres/Saved or Packaged\Windows\Acres\Saved.
Development, editor Acres/Saved.
Shipping, Linux ~/.config/Epic/Acres/Saved. Unreal Engine puts the data of a Shipping build in the user folder.
Shipping, Windows %LOCALAPPDATA%\Acres\Saved.

Layout#

A session with one agent writes all files into the session folder. In a session with more than one agent, each agent has a subfolder with the name of the agent. The farm files and the configuration copies stay in the session folder.

File or Folder Condition Agent Folder
tractor.csv, session-summary.json -SessionLog yes
dbw.csv Polaris with -SessionLog, -VehicleRecord or -DbwLog yes
vehicle.csv, metadata.json, georeference.json -VehicleRecord, -VehicleTest= or -VehicleRoute= yes
sensors/episode-NNN/ -SensorRecord or the key F6 yes
replay-tracking.csv, replay-summary.json -ReplayFile= yes
review-frames.csv, route-result.json -VehicleRoute= yes
terrain-probes.csv, vehicle.png -TerrainVerify, -VehicleCapture no
farm-*.json, farm-*.csv, farm-*.bin, theta.f32, water-depth.f32 A session with the farm no
npc-events.csv -NpcVehicles, -NpcWorkers or -NpcTraffic= no
episode-NNNN.mcap A recording that a client starts without a path no
environment.json, tractor.json, sensors.json, session-config.json, field-setup.json, terrain-edits.f32 A session from the menu no

-SensorOutput= moves the episodes to a different folder. Command-Line Options describes the options.

One agent

# -SessionLog -SensorRecord -VehicleRecord -NpcVehicles
session1/
  tractor.csv            session-summary.json
  vehicle.csv            metadata.json
  georeference.json      npc-events.csv
  farm-state.json        farm-water.bin
  farm-field.bin         farm-config.json
  farm-fields.csv        farm-events.csv
  farm-weather.csv       farm-water.json
  farm-visuals.json      theta.f32
  water-depth.f32
  sensors/episode-001/

Two agents

# -Vehicles=maxxum,polaris -SessionLog -SensorRecord
session2/
  maxxum/
    tractor.csv  session-summary.json
    sensors/episode-001/
  polaris/
    tractor.csv  session-summary.json  dbw.csv
    sensors/episode-001/
  farm-state.json  farm-water.bin  ...

Conventions#

Item Convention
Physics step One step is 1/120 s. step and physics_step count the steps from the start of the session.
time_s in tractor.csv, vehicle.csv, dbw.csv The physics time of the vehicle from its spawn, in seconds.
time_s in a sensor stream The time from the start of the episode: the number of physics steps divided by 120.
simulation_time_s The physics time of the session. It does not start again in a new episode.
sample_time_s, available_time_s, delivery_time_s The sample time of a sensor, the sample time plus the delay of the sensor, and the time of the write.
ENU frame East, north and up in metres. The origin is the origin of the tile. The axes are the grid axes of EPSG:2968.
Unreal frame ue_x_m points east and ue_y_m points south. The values are in metres.
FLU frame Forward, left and up, in metres. The origin is the reference origin of the chassis.
Quaternion quaternion_flu_to_enu_xyzw rotates a vector from the FLU frame to the ENU frame. The sequence is x, y, z, w.
Geographic position tractor.csv gives NAD83(HARN) latitude and longitude. The GNSS stream gives WGS84(G2139) and the NAD83 values.
Height altitude_navd88_m is a NAVD88 height. An ellipsoidal height has ellipsoidal in its name.
Angle Radians, unless the name ends with _deg. heading_deg is clockwise from north.
Curvature 1/m. A positive value is a turn to the left.
Unit SI. The name of a column or a key ends with the unit, for example _m, _mps, _n, _kpa, _kw.
File Rate
tractor.csv 120 Hz, one row for each physics step.
vehicle.csv 120 Hz, one row for each wheel in each physics step.
dbw.csv 50 Hz.
truth.jsonl, actions.jsonl 120 Hz.
imu.jsonl 120 Hz by default (imu.hz).
ins.jsonl 100 Hz by default (ins.hz).
gnss.jsonl, lidar.jsonl, camera.jsonl 10 Hz by default (gnss.hz, lidar.hz, camera.hz).
can.jsonl 20 Hz by default (can.hz), two frames in each sample.
replay-tracking.csv 10 Hz.
farm-weather.csv One row for each hour of game time.

Vehicle Files#

tractor.csv#

The vehicle log of one agent. The Maxxum and the Polaris write the same 153 columns. The file is also a valid input for -ReplayFile=. The source is AcresSessionLog.cpp.

For the Polaris, gear is the gear of the drive-by-wire: 1 park, 2 reverse, 3 neutral, 4 high, 5 low. The implement columns of the Polaris are empty or zero.

Column Unit Description
time_s s The physics time from the spawn.
step The physics step.
local_hour h The local time of the environment clock.
day d The day index of the session, from 0.
ue_x_m, ue_y_m, ue_z_m m The position in the Unreal frame.
east_m, north_m, up_m m The position in the ENU frame.
latitude_deg, longitude_deg deg The NAD83(HARN) position from the inverse projection of EPSG:2968.
altitude_navd88_m m The NAVD88 height.
heading_deg deg The heading, clockwise from north, 0 to 360.
pitch_deg, roll_deg deg The pitch and the roll of the Unreal rotator.
speed_mps m/s The speed with a sign. A negative value is reverse motion.
v_forward_mps, v_left_mps m/s The velocity along the forward axis and the left axis.
yaw_rate_radps rad/s The yaw rate. A positive value is counter-clockwise.
accel_forward_mps2, accel_left_mps2 m/s² The difference of the velocity between two rows, without gravity.
rpm rev/min The engine speed.
engine_torque_nm, clutch_torque_nm N m The engine torque and the torque that the clutch transmits.
engine_power_kw kW The engine torque multiplied by the engine speed.
gear The gear. The first gear of the Maxxum is 1.
direction 1 for forward and -1 for reverse.
throttle, brake The pedal inputs, 0 to 1.
steer_command_rad rad The steering command. A positive value is a turn to the left.
steer_fl_rad, steer_fr_rad rad The angles of the front left and the front right wheel.
curvature_command_1pm 1/m \(\tan(\delta_{cmd})/L\) with the wheelbase \(L\).
curvature_measured_1pm 1/m The yaw rate divided by the forward speed. Below 0.3 m/s, the mean front wheel angle gives the value.
turn_radius_m m The inverse of the measured curvature. 0 for a straight path.

Nine columns follow for each wheel. The prefixes are fl, fr, rl and rr.

Column Unit Description
fl_load_n N The normal load of the wheel.
fl_traction_n N The longitudinal force of the tyre.
fl_lateral_n N The lateral force of the tyre.
fl_slip The slip ratio.
fl_omega_radps rad/s The angular speed of the wheel.
fl_sinkage_m m The sinkage of the tyre into the soil.
fl_pressure_kpa kPa The contact pressure.
fl_surface The surface index: 0 asphalt, 1 concrete, 2 gravel, 3 dry soil, 4 wet soil, 5 mud, 7 sod lane, 8 sod, 9 dirt track.
fl_contact 1 when the wheel touches the ground.
Column Unit Description
total_traction_n N The sum of the longitudinal forces of the four tyres.
implement_draft_n N The draft of the implement in this step.
mass_kg kg The mass of the vehicle with its load.
pto_kw kW The constant PTO load of -VehiclePtoKW= and of the harvest cutter.
bunker_kg kg The crop mass in the bunker.
fuel_lph, fuel_used_l L/h, L The fuel flow and the fuel from the start.
air_c, rain_mmh °C, mm/h The air temperature and the rain rate.
wind_mps, wind_from_deg m/s, deg The wind speed and the direction that the wind comes from.
cloud_cover The cloud cover, 0 to 1.
diff_lock 0 open, 1 rear lock, 2 rear and front lock.
fuel_power_kw kW The power of the fuel flow.
brake_power_kw kW The fuel power minus the losses of the engine.
engine_loss_kw, parasitic_kw kW The thermal and friction loss of the engine, and the parasitic load.
pto_shaft_kw, hydraulic_kw, accessory_loss_kw kW The PTO power, the hydraulic power and the loss of the accessories.
clutch_loss_kw, driveline_loss_kw, brake_loss_kw kW The losses in the clutch, the driveline and the brakes.
tyre_rolling_kw, tyre_slip_kw, soil_rutting_kw kW The tyre hysteresis, the slip loss and the work that makes the ruts.
traction_kw, axle_kw kW The net tyre power and the power at the axles.
drawbar_kw kW The draft multiplied by the forward speed.
tractive_eff The net tyre work divided by the axle work.
fuel_tank_l L The fuel in the tank.
fuel_l_per_km, fuel_l_per_ha L/km, L/ha The fuel for each kilometre and for each hectare of the implement width.

The implement columns come from the implement model of the Maxxum. Implement Mechanics gives the model.

Column Unit Description
implement The implement identifier, for example chisel_plow. Empty without an implement.
implement_depth_m, implement_depth_setting_m m The depth of the tools and the depth setting.
implement_vertical_n, implement_lateral_n N The vertical force (up is positive) and the lateral force on the tractor.
sensed_draft_n, draft_setpoint_n N The draft at the lower links and the set-point of the draft control.
hitch_mode 0 position, 1 draft, 2 float.
hitch_lever, hitch_lift_deg , deg The position of the hitch lever and the lift angle of the lower links.
implement_in_soil, implement_floating 1 when the tools are in the soil. 1 when the hitch floats.
tines_tripped, trip_max_deg , deg The number of tripped tines and the largest trip angle.
ground_offset_m m The height of the ground below the tools in the tractor frame.
pto_on, pto_rpm , rev/min The state and the speed of the PTO shaft.
implement_pto_kw, implement_hydraulic_kw, implement_draft_kw kW The PTO power, the hydraulic power and the draft power of the implement.
implement_mass_kg, implement_payload_kg kg The mass of the implement and of its contents.
seed_kg, sown_ha, sown_rate_kg_ha kg, ha, kg/ha The seed in the hopper, the sown area and the seed rate.
tank_l, sprayed_ha, spray_rate_l_ha L, ha, L/ha The liquid in the tank, the sprayed area and the application rate.
bales_dropped, flywheel_rpm, plunger_kn, baler_intake_kg_s , rev/min, kN, kg/s The state of the baler.
loader_lift_deg, loader_curl_deg deg The angles of the loader.
bucket_kg, dug_kg kg The soil in the bucket of the backhoe and the total dug mass.
baler_yaw_deg deg The articulation angle of the baler drawbar.
hand_throttle, park_brake The hand throttle, 0 to 1, and the state of the park brake.

The last nine columns give the soil below the rear axle. The values are the mean of the two rear wheels.

Column Unit Description
soil_class The soil class of the soil library. Empty on a hard surface.
soil_theta m³/m³ The volumetric water content.
soil_saturation The effective saturation, 0 to 1.
soil_wetness The surface wetness, 0 to 1.
cone_index_kpa kPa The cone index.
soil_density_mg_m3 Mg/m³ The dry density after compaction.
water_depth_mm mm The depth of the water on the surface.
soil_resistance_n N The motion resistance of the soil, sum of the four wheels.
bulldozing_n N The bulldozing part of the resistance.

The first 16 columns of one row

time_s,step,local_hour,day,ue_x_m,ue_y_m,ue_z_m,
east_m,north_m,up_m,latitude_deg,longitude_deg,
altitude_navd88_m,heading_deg,pitch_deg,roll_deg,...
5.000000,600,10.001389,0,-38.7155,129.2747,1.4134,
-38.7155,-129.2747,1.4134,40.470412677,-86.994832067,
216.2978,0.068,-0.718,-0.423,...

Other values of the same row

speed_mps        2.0030    rpm            1878.6
gear             8         throttle       0.724
engine_power_kw  9.320     fuel_lph       4.825
rl_load_n        25069.2   rl_slip        -0.0032
rl_surface       0         rl_contact     1
mass_kg          6920.0    implement      chisel_plow
hitch_lift_deg   32.000    fuel_tank_l    214.994
import pandas as pd

log = pd.read_csv("session1/tractor.csv")
print(log[["time_s", "speed_mps", "rl_slip"]].describe())

session-summary.json#

The totals of tractor.csv. The game writes the file when the session stops.

Key Unit Description
schema acres-session-summary-1.
rows, dropped_rows The number of rows, and the rows that the writer dropped at a full queue.
duration_s s The time between the first and the last row.
distance_m m The length of the path in three dimensions. A jump of more than 5 m in one row does not count.
max_speed_mps m/s The maximum absolute speed.
fuel_used_l L The integral of the fuel flow.
engine_energy_kwh kWh The integral of the positive engine power.
max_abs_slip The maximum absolute slip ratio of a wheel in contact.
max_sinkage_m m The maximum sinkage.
distance_model, fuel_model Text that describes the two calculations.
files Text that names the other files of the session.
{
  "schema": "acres-session-summary-1",
  "rows": 2644,
  "dropped_rows": 0,
  "duration_s": 22.025,
  "distance_m": 14.650,
  "max_speed_mps": 2.121,
  "fuel_used_l": 0.0986,
  "engine_energy_kwh": 0.4024,
  "max_abs_slip": 1.4881,
  "max_sinkage_m": 0.0350
}

dbw.csv#

The drive-by-wire reports of the Polaris. The values and the units are those of the ds_dbw_msgs reports. Drive-by-Wire and ULC gives the model. The source is AcresPolaris.cpp.

Column Unit Description
time_s s The physics time from the spawn.
system_enabled, override 1 when the drive-by-wire is on. 1 after an override by the driver.
steer_enabled, throttle_enabled, brake_enabled, ulc_enabled 1 when the subsystem obeys commands.
steering_wheel_angle_deg, steering_cmd_deg deg The angle of the steering wheel and the command angle.
steering_cmd_type The command type of the steering report.
throttle_percent_input, throttle_percent_cmd, throttle_percent_output % The pedal of the driver, the command and the output.
throttle_cmd_type The command type of the throttle report.
brake_pressure_input_bar, brake_pressure_cmd_bar, brake_pressure_output_bar bar The pressure of the driver, the command and the output.
brake_cmd_type The command type of the brake report.
gear, gear_cmd, gear_driver The gear, the command and the lever of the driver: 1 park, 2 reverse, 3 neutral, 4 high, 5 low.
ulc_cmd_type The command type of the ULC report.
ulc_vel_ref_mps, ulc_vel_meas_mps m/s The reference speed and the measured speed of the ULC.
ulc_accel_ref_mps2 m/s² The reference acceleration of the ULC.
ulc_holding 1 when the ULC holds the vehicle at a stop.
vehicle_velocity_brake_mps, vehicle_velocity_propulsion_mps m/s The two speeds of the vehicle velocity report.
drive_mode 0 turf, 1 two-wheel drive, 2 all-wheel drive.
road_wheel_rad rad The steering angle of the bicycle model.
cvt_ratio The ratio of the CVT.
time_s,system_enabled,override,steer_enabled,
throttle_enabled,brake_enabled,ulc_enabled,
steering_wheel_angle_deg,steering_cmd_deg,...
7.9833,0,0,0,0,0,0,12.531,12.531,0,
0.000,0.000,0.000,0,80.000,80.000,80.000,0,
5,0,5,0,0.0009,0.0009,0.0000,0,
0.0009,0.0009,2,0.0000,3.200

vehicle.csv and metadata.json#

The telemetry of the wheels. The game keeps a maximum of 50000 physics steps in memory and writes the file at the end. -VehicleRecord, a scripted test and a review route write it. georeference.json is a copy of ACRE/site.json. A session on the test pad does not write georeference.json.

Column Unit Description
step, time_s, dt_s , s, s The physics step, the physics time and the length of the step.
x_m, y_m, z_m m The position in the Unreal frame.
speed_mps, vx_mps, vy_mps, vz_mps m/s The speed with a sign and the velocity in the Unreal frame.
pitch_deg, yaw_deg, roll_deg deg The Unreal rotator. A yaw of 0 points east and 90 points south.
rpm, engine_torque_nm, clutch_torque_nm rev/min, N m, N m The state of the engine.
throttle, brake, direction The inputs.
wheel The wheel index: 0 front left, 1 front right, 2 rear left, 3 rear right.
contact 1 when the wheel touches the ground.
normal_n, fx_n, fy_n N The normal load, the longitudinal force and the lateral force.
slip, omega_rad_s, steer_rad , rad/s, rad The slip ratio, the angular speed and the steering angle of the wheel.
suspension_m, sinkage_m m The length of the suspension and the sinkage.
pressure_pa, shear_capacity_n, area_m2 Pa, N, m² The contact pressure, the shear capacity of the soil and the contact area.
water_drag_n, normal_impulse_ns N, N s The drag of standing water and the normal impulse of the step.
surface_index, wetness, water_depth_m , , m The surface below the wheel.
gear, episode_time_s, reset_epoch , s, The gear, the time from the last reset and the number of resets.
wheel_lift, excessive_slip, rollback, rollover Labels of the outcome, 0 or 1. They ignore the first 3 s after a reset.
chassis_mass_kg, pto_kw, bunker_kg, farm_time_s kg, kW, kg, s The mass, the PTO load, the bunker mass and the farm clock.

metadata.json has the keys mass_kg, payload_kg, trailer, physics_hz, dropped_samples, units and calibration.

step,time_s,dt_s,x_m,y_m,z_m,speed_mps,...,wheel,contact,
normal_n,fx_n,fy_n,slip,omega_rad_s,...
601,5.008333595,0.008333334,-38.715431,129.257995,
1.413169,2.003569,...,2,1,
25061.668649,-1013.273466,78.642621,-0.003474,2.206998,...
{"mass_kg":6920.000000,"payload_kg":0.000000,
 "trailer":false,"physics_hz":120,"dropped_samples":0,
 "units":"SI; pose in Unreal world axes; yaw degrees",
 "calibration":"estimated"}

Replay Files#

A session with -ReplayFile= writes the tracking error. Replay shows the procedure.

Column of replay-tracking.csv Unit Description
time_s s The time on the reference track.
ref_x_m, ref_y_m m The reference position in the Unreal frame.
x_m, y_m m The position of the vehicle in the Unreal frame.
cross_track_m m The distance from the reference path. 0 for a track without a path.
ref_speed_mps, speed_mps m/s The reference speed and the speed of the vehicle.
ref_curvature_1pm 1/m The reference curvature.
steer_rad rad The steering command.
Key of replay-summary.json Unit Description
source The path of the replay file.
mode commands or path.
reference_duration_s s The length of the reference track.
path_available True when the file has path columns.
rms_cross_track_m, max_cross_track_m m The RMS and the maximum of the cross-track error.
completed True when the vehicle got to the end of the track.
vehicle maxxum_150, legacy or polaris.
failure Empty, stalled or time_limit. A failed path replay has completed=false.
shift_east_north_m m The shift of -ReplayShift=.

In the example, the game stopped before the vehicle got to the end of the track. Thus completed is false.

time_s,ref_x_m,ref_y_m,x_m,y_m,cross_track_m,
ref_speed_mps,speed_mps,ref_curvature_1pm,steer_rad
0.200,-38.710,134.510,-38.717,134.466,0.001,
1.880,0.044,-0.00022,0.00034
{"source":"/data/run1/tractor.csv","mode":"path",
 "reference_duration_s":22.000,"path_available":true,
 "rms_cross_track_m":0.0050,"max_cross_track_m":0.0075,
 "completed":false,"vehicle":"maxxum_150",
 "shift_east_north_m":[0.000,0.000]}

Test Files#

The test options of Command-Line Options write these files.

File Option Contents
review-frames.csv -VehicleRoute= One row for each frame: the route, the frame, the physics step and the times. The row also gives the poses of the vehicle and of the view camera.
route-result.json -VehicleRoute= The keys route, completed, frames, time_s, remaining_m and note.
terrain-probes.csv -TerrainVerify 441 rows with the columns u, v, expected_z_m, hit_z_m, error_m, normal_z and hit.
vehicle.png -VehicleCapture A screenshot of the view.
npc-events.csv Farm traffic The columns time_s, event, x_m, y_m, speed_mps. The event is worker_struck.

A session without an incident has only the header line in npc-events.csv.

time_s,event,x_m,y_m,speed_mps

Sensor Episodes#

The sensor recorder divides a recording into episodes. The first episode of a folder is episode-001. The key F6 stops the episode and starts the next one. Collect Data shows the procedure. The source is AcresSensors.cpp.

Episode Folder#

File Contents
episode.json The manifest: the configuration, the frames, the calibration, the counts and the errors.
sensors-config.json The sensor configuration after the overlay and the command-line options.
truth.jsonl The true state of the vehicle.
actions.jsonl The controls of the vehicle.
gnss.jsonl, imu.jsonl, can.jsonl The samples of the GNSS receiver, the IMU and the CAN log.
ins.jsonl The samples of the INS. Only a vehicle with an INS writes it (the Polaris).
lidar.jsonl, lidar/ One row for each scan, and the point clouds.
camera.jsonl, camera/ One row for each image, and the images.

Each .jsonl file has one JSON object in each line. The file of a disabled sensor is empty. A row of a sensor with a delay ends with sample_time_s, available_time_s and delivery_time_s. When the episode stops before the delivery of a row, the row has delivery_time_s null and pending_at_stop true.

The name of an image or a scan contains the sample time in microseconds with 9 digits.

sensors/episode-001/
  episode.json
  sensors-config.json
  truth.jsonl    actions.jsonl
  gnss.jsonl     imu.jsonl     can.jsonl
  ins.jsonl                      (Polaris)
  lidar.jsonl    camera.jsonl
  camera/front_000116667.png
  lidar/scan_000100000.ply       (Maxxum)
  lidar/scan_000100000.pcd       (Polaris)
  lidar/scan_000100000.png
import json

with open("sensors/episode-001/truth.jsonl") as f:
    rows = [json.loads(line) for line in f]
print(len(rows), rows[0]["position_enu_m"])

truth.jsonl and actions.jsonl#

The true state and the controls, one row for each physics step.

Key of truth.jsonl Unit Description
time_s, simulation_time_s, physics_step s, s, The time of the episode, the physics time and the physics step.
episode_time_s, reset_epoch s, The time from the last reset and the number of resets.
position_enu_m m The position of the chassis origin in the ENU frame.
quaternion_flu_to_enu_xyzw The attitude.
yaw_enu_deg deg The yaw in the ENU frame. 0 points east and 90 points north.
velocity_enu_mps, angular_velocity_enu_radps m/s, rad/s The velocity and the angular velocity in the ENU frame.
speed_mps, rpm, steer_rad m/s, rev/min, rad The speed with a sign, the engine speed and the steering angle.
chassis_mass_kg, bunker_kg, farm_time_s kg, kg, s The mass, the bunker mass and the farm clock.
wheels Four objects with contact, normal_n, slip, sinkage_m and surface.
Key of actions.jsonl Unit Description
time_s, physics_step s, The time of the episode and the physics step.
throttle, brake The inputs, 0 to 1.
steer_request_rad rad The steering command.
gear_direction, gear The direction (1 or -1) and the gear.
source The controller: manual, replay, route_review, scripted_test or benchmark.
{"time_s":0.008333334,"simulation_time_s":0.016666668,
 "physics_step":2,"episode_time_s":0.016666668,
 "reset_epoch":0,
 "position_enu_m":[-38.709677,-134.513081,1.776000],
 "quaternion_flu_to_enu_xyzw":
   [0.000000000,0.000000000,0.707106745,0.707106793],
 "yaw_enu_deg":89.999998,
 "velocity_enu_mps":[0.000000,-0.000000,-0.081722],
 "angular_velocity_enu_radps":[-0.000000,0.000000,-0.000000],
 "speed_mps":0.000000,"rpm":798.902,"steer_rad":0.000000,
 "chassis_mass_kg":6920.000,"bunker_kg":0.0000,
 "farm_time_s":0.000,
 "wheels":[{"contact":0,"normal_n":0.000,"slip":0.000000,
            "sinkage_m":0.000000,"surface":0}, ...]}
{"time_s":0.008333334,"physics_step":2,
 "throttle":0.000000,"brake":1.000000,
 "steer_request_rad":0.000000,"gear_direction":1,
 "gear":8,"source":"manual"}

imu.jsonl and can.jsonl#

Key of imu.jsonl Unit Description
physics_step The physics step of the sample.
specific_force_flu_mps2 m/s² The specific force in the FLU frame, with noise and bias.
angular_velocity_flu_radps rad/s The angular velocity in the FLU frame, with noise and bias.

Each sample of the CAN log writes two rows: the engine speed and the control frame. Wheel and CAN Signals gives the encoding.

Key of can.jsonl Unit Description
time_s s The time of the episode.
extended True. All frames have a 29-bit identifier.
id_hex, pgn The identifier and the parameter group number.
data The 8 data bytes.
direction feedback for the engine speed (PGN 61444). command for the control frame (PGN 65280).
source The controller, on the control frame only.
mapping Text that describes the encoding.
{"physics_step":4,
 "specific_force_flu_mps2":[-0.027588,-0.030645,-0.055103],
 "angular_velocity_flu_radps":
   [-0.00040830,-0.00001156,-0.00054956],
 "sample_time_s":0.025000001,
 "available_time_s":0.075000001,
 "delivery_time_s":0.075000004}
{"time_s":0.000000000,"extended":true,
 "id_hex":"18FF0080","pgn":65280,
 "data":[0,250,0,128,1,255,255,255],
 "direction":"command","source":"manual",
 "mapping":"ACRES proprietary v1; NOT a standard
            tractor actuation PGN"}

gnss.jsonl#

One row for each epoch of the GNSS receiver. INS and GNSS gives the model. Without a fix, the position keys are null.

Key Unit Description
physics_step The physics step of the sample.
fix_type, solution rtk_fixed, rtk_float, dgps, single or no_fix.
gga_quality The quality number of the GGA sentence.
satellites_used, satellites_above_mask The satellites in the solution and above the elevation mask.
satellites_clear, satellites_near_obstruction, satellites_foliage, satellites_blocked The satellites in each visibility class.
hdop, vdop, pdop The dilution of precision.
hdop_open_sky, vdop_open_sky The dilution of precision without obstructions.
multipath_index, reflector_index The multipath indices, 0 to 1.
correction_age_s s The age of the RTK corrections.
rtk_lock_age_s, rtk_converge_s, rtk_time_to_fix_s s The times of the RTK state machine.
model The parameters of the error model in this epoch.
epoch_year a The epoch of the position as a decimal year.
position_enu_m, sigma_enu_m, covariance_enu_m2 m, m, m² The position in the ENU frame with its standard deviation and covariance.
latitude_deg, longitude_deg, ellipsoidal_height_m deg, deg, m The position in the output frame (gnss.datum.output_frame).
nad83_harn_latitude_deg, nad83_harn_longitude_deg deg The NAD83(HARN) position.
nad83_2011_ellipsoidal_height_m m The NAD83(2011) ellipsoidal height.
wgs84_latitude_deg, wgs84_longitude_deg, wgs84_ellipsoidal_height_m deg, deg, m The WGS84(G2139) position.
altitude_navd88_m, geoid_undulation_nad83_m m The NAVD88 height and the geoid undulation.
position_std_m m The horizontal standard deviation.
nmea_gga The $GNGGA sentence of the epoch.

Part of one row

{"physics_step":13,"fix_type":"rtk_fixed",
 "gga_quality":4,"satellites_used":17,
 "satellites_clear":15,"satellites_near_obstruction":2,
 "satellites_foliage":0,"satellites_blocked":6,
 "satellites_above_mask":23,
 "hdop":0.843726633,"vdop":1.11322412,"pdop":1.39683305,
 "correction_age_s":1.10000001,
 "epoch_year":2026.727740,
 "position_enu_m":[-38.691659,-134.487053,3.431649],
 "sigma_enu_m":[0.0200068123,0.0200068123,0.0277449639],
 "latitude_deg":40.4703735606,
 "longitude_deg":-86.9948430354,
 "ellipsoidal_height_m":183.5614,
 "nad83_harn_latitude_deg":40.4703657358,
 "nad83_harn_longitude_deg":-86.9948318477,
 "altitude_navd88_m":218.3161,
 "solution":"rtk_fixed","position_std_m":0.0282939053,
 "nmea_gga":"$GNGGA,150000.10,4028.2224136,N,
   08659.6905821,W,4,17,0.84,218.316,M,-34.755,M,1.1,0001*58",
 "sample_time_s":0.100000005,
 "available_time_s":0.150000005,
 "delivery_time_s":0.150000008}

ins.jsonl#

The INS of the Polaris gives the pose of base_footprint. The keys follow the messages of the real vehicle.

Key Unit Description
physics_step The physics step of the sample.
frame_id oxts_link.
fix deg, deg, m latitude, longitude, altitude, datum, status, service and position_covariance_diag.
imu orientation_enu_xyzw, angular_velocity_flu_radps and linear_acceleration_flu_mps2.
velocity m/s, rad/s linear_flu_mps and angular_flu_radps.
position_enu_m m The position in the ENU frame.
odom The UTM odometry: frame_id, child_frame_id, utm_zone, position_m, orientation_xyzw, linear_flu_mps, angular_flu_radps and grid_rotation_deg.
{"physics_step":3,"frame_id":"oxts_link",
 "fix":{"latitude":40.4703011546,
        "longitude":-86.9949143788,"altitude":182.0489,
        "datum":"nad83_2011","status":2,"service":1,
        "position_covariance_diag":
          [0.000109,0.000109,0.00024525]},
 "imu":{"orientation_enu_xyzw":
          [-0.000335770,-0.000091392,0.705420504,0.708788937],
        "angular_velocity_flu_radps":
          [-0.000759,-0.000270,-0.000344],
        "linear_acceleration_flu_mps2":
          [-0.00662,0.02029,0.00191]},
 "velocity":{"linear_flu_mps":[-0.00488,-0.01016,-0.19364],
             "angular_flu_radps":
               [-0.000759,-0.000270,-0.000344]},
 "position_enu_m":[-45.7039,-141.6643,0.7900],
 "odom":{"frame_id":"utm","child_frame_id":"base_footprint",
         "utm_zone":"16N",
         "position_m":[500431.1143,4479958.1857,182.0489],
         "orientation_xyzw":
           [-0.000335813,-0.000091233,0.705085873,0.709121820],
         "grid_rotation_deg":0.054088},
 "sample_time_s":0.016666668,
 "available_time_s":0.066666668,
 "delivery_time_s":0.066666670}

lidar.jsonl and the Point Clouds#

One row for each scan. The stamp of a scan is the end of its sweep. LiDAR gives the model.

Key Unit Description
physics_step, simulation_time_s , s The physics step and the physics time of the stamp.
file, preview The point cloud and the preview image, relative to the episode folder.
points, rays, echoes The number of points, of rays and of detected echoes.
beams_with_return, multi_return_beams The beams with one return or more, and with two returns or more.
returns_by_index The number of points for the return indices 1, 2 and 3.
return_mode The return mode of the scan.
class_counts, material_counts The number of points for each class and each material.
intensity_mean_by_material The mean intensity byte for each material.
range_m m The maximum range.
mode gpu_inline_raytracing or cpu_collision_proxies.
pose, vehicle_pose The pose of the sensor and of the vehicle at the stamp: position_enu_m and quaternion_flu_to_enu_xyzw.
sweep motion_distortion, period_s, time_offset_min_s, time_offset_max_s, sweep_start_pose and stamp.
weather source, rain_mmh, visibility_m, the extinction coefficients, the transmission and clutter_points.
timing Text that describes the timing of the scan.

The PLY file is binary and little-endian. One point has 31 bytes. The format version is 2.

Property Type Description
x, y, z float The position in the FLU frame of the sensor at the firing time of the point, in metres.
reflectivity float The reflectivity after range compensation. 1 is a Lambertian target of 100 %.
signal ushort The raw signal counts.
intensity uchar The calibrated reflectivity byte, 0 to 255.
ring uchar The ring index. Ring 0 has the lowest elevation.
column ushort The azimuth column.
class uchar The class of the hit object. episode.json gives the list.
material uchar The material of the hit surface. episode.json gives the list.
return_index uchar The index of the return in range sequence, from 1.
num_returns uchar The number of points of this beam.
return_flags uchar Bit flags: 1 first, 2 strongest, 4 last, 8 second strongest.
time_offset_s float The firing time minus the stamp, in seconds. The range is \([-1/f, 0)\) for the scan rate \(f\).
Value Class Material
0 other other
1 ground soil
2 tree trunk grass
3 building gravel
4 silo asphalt
5 tree concrete
6 shrub water
7 corn corn leaf
8 soybean soybean leaf
9 mud clod tree foliage
10 ground cover bark
11 potato shrub
12 vehicle building
13 precipitation metal bin
14 vehicle
15 mud
16 potato leaf

The key lidar.output of the sensor configuration selects ply, pcd or both. The Polaris writes PCD files. A PCD file is version 0.7 with DATA binary. It has the fields x, y, z and intensity as float32.

WIDTH is the number of rings and HEIGHT is the number of columns. The file contains one return for each beam, the strongest. A beam without a return has NaN in x, y and z.

The preview is a PNG image of 384 × 384 pixels. It shows the scan from above with one colour for each class.

{"physics_step":13,"simulation_time_s":0.108333339,
 "file":"lidar/scan_000100000.ply",
 "preview":"lidar/scan_000100000.png",
 "points":1176,"rays":1440,"beams_with_return":1065,
 "multi_return_beams":111,"echoes":1659,
 "returns_by_index":{"1":1065,"2":111,"3":0},
 "return_mode":"dual_strongest_last",
 "class_counts":{"other":13,"ground":512,"building":350,
                 "tree":238,"corn":55,"ground_cover":8},
 "range_m":60,"mode":"gpu_inline_raytracing",
 "pose":{"position_enu_m":[-38.710395,-134.512498,3.624664],
         "quaternion_flu_to_enu_xyzw":
           [-0.000237411,-0.000026092,0.707106785,0.707106693]},
 "sweep":{"motion_distortion":true,"period_s":0.100000,
          "time_offset_min_s":-0.100000,
          "time_offset_max_s":-0.000556,
          "stamp":"end_of_sweep"},
 "weather":{"source":"environment","rain_mmh":0.000,
            "visibility_m":15637.5,"clutter_points":0},
 "sample_time_s":0.100000005,
 "available_time_s":0.150000005,
 "delivery_time_s":0.266666681}
ply
format binary_little_endian 1.0
element vertex 1176
property float x
property float y
property float z
property float reflectivity
property ushort signal
property uchar intensity
property uchar ring
property ushort column
property uchar class
property uchar material
property uchar return_index
property uchar num_returns
property uchar return_flags
property float time_offset_s
end_header
# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z intensity
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 32
HEIGHT 1800
VIEWPOINT 0 0 0 1 0 0 0
POINTS 57600
DATA binary
import numpy as np

raw = open("lidar/scan_000100000.pcd", "rb").read()
body = raw[raw.index(b"DATA binary\n") + 12:]
cloud = np.frombuffer(body, np.float32).reshape(1800, 32, 4)

camera.jsonl and the Images#

One row for each image. An image is a PNG file with 8 bits for each channel in the sRGB colour space. The size is that of the sensor configuration, 896 × 512 pixels by default. Camera gives the model.

Key Unit Description
physics_step, simulation_time_s , s The physics step and the physics time of the image.
file The image, relative to the episode folder.
width, height px The size of the image.
pose, vehicle_pose The pose of the camera and of the vehicle: position_enu_m and quaternion_flu_to_enu_xyzw.
frame_index The index of the image in the episode.
processing_ms ms The time of the camera model for this image.
rolling_shutter_motion_optical rad/s, m/s The angular and linear velocity that the rolling shutter uses, in the optical frame.
timing Text that describes the timing of the render.
{"physics_step":29,"simulation_time_s":0.241666679,
 "file":"camera/front_000233333.png",
 "width":896,"height":512,
 "pose":{"position_enu_m":[-38.716053,-133.888723,3.261297],
         "quaternion_flu_to_enu_xyzw":
           [-0.005644940,0.003191951,0.707046314,0.707137509]},
 "vehicle_pose":{"position_enu_m":
                   [-38.710970,-134.505598,1.600388], ...},
 "frame_index":1,"processing_ms":2.62,
 "rolling_shutter_motion_optical":
   {"angular_radps":[-0.155066,0.002484,-0.024763],
    "velocity_mps":[-0.066883,0.786047,0.435862]},
 "sample_time_s":0.233333346,
 "available_time_s":0.283333346,
 "delivery_time_s":0.425000022}

episode.json#

The manifest of the episode. The recorder writes it at the start with the state recording. At the end, the recorder writes it again with the state complete or complete_with_errors.

Key Description
schema acres-episode-2-unreal.
engine, map The version of Unreal Engine and the name of the map.
state recording, complete or complete_with_errors.
config The sensor configuration of the episode. sensors-config.json contains the same data.
config_source The path and the SHA-1 hash of the configuration files.
command_line The command line of the game.
sensor_profile The name of the sensor profile, for example tractor-default or polaris-calibrated.
sensor_profile_detail profile, profile_validated, changes and render. render gives the render tier and the render settings.
start_simulation_s, duration_s, final_simulation_s The physics time at the start, the length and the physics time at the end, in seconds.
physics_hz, final_physics_step 120, and the last physics step.
counts The number of rows of each stream, and lidar_points.
dropped The dropped samples: rows_queue_overflow, lidar_busy, camera_missed, camera_busy and camera_encode_backlog.
errors The error messages of the recorder.
imu_bias_flu The constant bias of the accelerometer and the gyroscope in this episode.
frames Text that defines the world frame, the ENU frame, the body frame, the quaternion, the angular velocity and the clocks.
georeference The coordinate reference system, the origin and the projection of the tile.
gnss The parameters and the statistics of the GNSS model.
extrinsics_flu_m The position of each sensor in the FLU frame.
mount_rotations The roll, pitch and yaw of the LiDAR and the camera.
camera_model, camera_intrinsics The parameters of the camera model. The intrinsic matrix and the distortion coefficients.
lidar The layout, the file format, the timing, the weather statistics, the class list and the material list.
limitations Text that lists the limits of each sensor model.

Part of the manifest

{
  "schema": "acres-episode-2-unreal",
  "state": "complete_with_errors",
  "sensor_profile": "tractor-default",
  "map": "V03ACRE",
  "start_simulation_s": 0.008333333767950535,
  "duration_s": 22.025001148693264,
  "physics_hz": 120,
  "final_physics_step": 2644,
  "counts": {"truth": 2644, "actions": 2644, "gnss": 221,
             "imu": 2642, "lidar": 221, "camera": 220,
             "can": 882, "ins": 0, "lidar_points": 319702},
  "dropped": {"rows_queue_overflow": 0, "lidar_busy": 0,
              "camera_missed": 1, "camera_busy": 0,
              "camera_encode_backlog": 0},
  "errors": ["GPU LiDAR scan pending at stop; CPU
              ground/collision result kept at 22.000001"],
  "camera_intrinsics": {"fx": 448.0, "fy": 448.0,
                        "cx": 451, "cy": 253,
                        "width": 896, "height": 512,
                        "distortion_model": "opencv_plumb_bob",
                        "distortion_coefficients":
                          [-0.08, 0.012, 0.0004, -0.0003, 0]}
}

Farm Files#

The game writes the farm files when the session stops. The key F5 writes them during the session. The source is AcresFarmRuntime.cpp.

Farm State#

The farm state lets a later session continue on the same fields. The option is -FarmLoad=.

File Contents
farm-state.json The saved farm. The keys are below.
farm-water.bin The water grid: 11 arrays of float64 with one value for each cell. farm-state.json gives the layout.
farm-field.bin The field work, the pits, the spoil and the bales. farm-state.json gives the layout.
farm-start-state.json, farm-start-water.bin, farm-start-field.bin The state at the start. Only a session that started from a saved state writes them.
farm-config.json A copy of farm.json.
Key of farm-state.json Description
schema 4.
fingerprint The SHA-1 hash of the farm inputs. The game refuses a state with a different hash.
state 11 numbers: the clock, the weather and the totals of the farm.
gdd, thermal_gdd The growing degree days of each field, 60 values.
patches The state of each crop patch.
ruts The ruts: the cell and the depth.
worked, worked_m2 The cells with field work, and the worked area of each field.
harvest_enabled The state of the harvest cutter.
water, field The name, the hash and the layout of the two binary files.
{
  "schema": 4,
  "fingerprint": "329FF2E32558EB9B37588580D1EC62F4A0020E2D",
  "state": [20, 2.0333344824612141, 1, 0, 16, 28,
            11.713738946279683, 0, 0, 0, 0],
  "water": {
    "file": "farm-water.bin",
    "cells": 145924,
    "clock_s": 20,
    "layout": "11 x cells float64: theta_surface, pond_m,
      rain_m, infiltrated_m, evaporated_m, drained_m, tile_m,
      lateral_m, compaction, theta_subsoil, runoff_m"
  },
  "field": {"file": "farm-field.bin", "cells": 165,
            "bales": 0}
}

farm-fields.csv#

One row for each field and for four other areas, 63 rows. F01 to F59 are the fields. F00 is the area outside the fields. F60, F61 and F62 are asphalt, concrete and gravel. Soil Water and Crops and Ground Classes give the models.

Column Unit Description
field The field identifier.
kind The crop: 0 corn, 1 soybean, 2 potato, -1 none.
growth The growth fraction, 0 to 1.
effective_gdd_c °C d The growing degree days.
crushed_m2, harvested_m2 m² The crushed area and the harvested area.
standing_yield_kg kg The yield of the crop that stands.
theta, theta_subsoil m³/m³ The mean water content of the surface layer and of the subsoil.
pond_m m The mean depth of the water on the surface.
rain_m, evaporated_m, drained_m, tile_m, lateral_m m The mean depth of each term of the water balance.
water_balance_error_m m The largest balance error of a cell.
cells The number of cells of 4 m.
tilled_m2, seeded_m2, sprayed_m2 m² The worked area.
field,kind,growth,effective_gdd_c,crushed_m2,
harvested_m2,standing_yield_kg,theta,pond_m,rain_m,
evaporated_m,drained_m,tile_m,lateral_m,
water_balance_error_m,cells,theta_subsoil,
tilled_m2,seeded_m2,sprayed_m2
F29,1,1.00000000,1100.00206930,0.00000000,
0.00000000,3085.06800000,0.27220021,0.00000000,0.00000000,
0.00000271,0.00000000,0.00000000,0.00000000,
9.13313275377e-18,569,0.22835298,
0.0000,0.0000,0.0000

Events, Weather and Water#

File Contents
farm-events.csv The columns environment_time_s, action, field and quantity.
farm-weather.csv One row for each hour of game time. The columns are below.
farm-water.json The statistics of the water grid at the end.
farm-visuals.json The statistics of the ground visuals at the end.
theta.f32 The water content of the surface layer: 382 × 382 float32 values, little-endian, row by row.
water-depth.f32 The depth of the water on the surface, in the same format, in metres.

The actions of farm-events.csv are harvest_kg, crush_m2, reseed, restore and load.

Column of farm-weather.csv Unit Description
environment_time_s s The farm clock.
rain_mm_h mm/h The rain rate.
time_scale The ratio of game time to real time.
min_c, max_c °C The low and the high temperature of the day.
harvested_kg, bunker_kg kg The harvested mass and the mass in the bunker.
crushed_m2 m² The crushed crop area.
max_water_balance_error_m m The largest balance error of the water grid.
mean_pond_m, max_pond_m m The mean and the maximum depth of the water on the surface.
water_clock_s s The clock of the water grid.
environment_time_s,rain_mm_h,time_scale,min_c,max_c,
harvested_kg,bunker_kg,crushed_m2,
max_water_balance_error_m,mean_pond_m,max_pond_m,
water_clock_s
0.000000,0.000000,1.0,16.000,28.000,
0.000000,0.000000,0.000000,0,0.000000,0.000000,0.0
{
  "cells": 145924,
  "cell_m": 4,
  "clock_s": 20,
  "max_pond_m": 0,
  "wet_cells_over_5mm": 0,
  "total_residual_m": -4.308771100672586e-18,
  "wheel_subgrid_tiles": 2,
  "wheel_subgrid_cell_m": 0.25,
  "mean_evaporated_m": 2.6295214770702185e-06
}
import numpy as np

theta = np.fromfile("theta.f32", "<f4").reshape(382, 382)

Configuration Copies#

The menu writes these files into the session folder before the session starts. The session then reads them. Configuration Files describes the formats and the sequence.

File Contents
environment.json, tractor.json, sensors.json The shipped files with the values of the menu.
session-config.json All values of the menu and the field setup. The schema is acres-session-config-1.
field-setup.json The changes of the fields: the crop, the soil and the wetness.
terrain-edits.f32 The terrain edits: 1001 × 1001 float32 height offsets in metres. Only a session with edits has the file.

A session from the command line does not write these copies. episode.json and sensors-config.json record the sensor configuration and the command line of each episode.