Crate sim

source · []
Expand description

The sim crate runs a traffic simulation on top of the map_model. See also

The simulation is very roughly layered into two pieces: the low-level “mechanics” of simulating individual agents over time, and higher-level systems like TripManager and TransitSimState that glue together individual goals executed by the agents.

Helpful terminology:

  • sov = single occupancy vehicle, a car with just a driver and no passengers. (Car passengers are not currently modelled)


pub use self::prebake::PrebakeSummary;


analytics 🔒
events 🔒
make 🔒

Everything needed to setup a simulation.

mechanics 🔒
pandemic 🔒

An experimental SEIR model by glued to the traffic simulation. Transmission may occur when people spend time in shared spaces like buildings, bus stops, and buses.

recorder 🔒
render 🔒

Intermediate structures so that sim and game crates don’t have a cyclic dependency.

router 🔒

For vehicles only, not pedestrians. Follows a Path from map_model, but can opportunistically lane-change to avoid a slow lane, can can handle re-planning to look for available parking.

scheduler 🔒
sim 🔒
transit 🔒
trips 🔒


As a simulation runs, different pieces emit Events. The Analytics object listens to these, organizing and storing some information from them. The UI queries Analytics to draw time-series and display statistics.

The number of active vehicles and commuters, broken into different categories.

CreateCar 🔒

The Sim ties together all the pieces of the simulation. Its main property is the current time.

SimFlags specifies a simulation to setup. After parsing from structopt, you must call initialize.

Options controlling the traffic simulation.

A sliding window, used to count something over time


Why is an agent delayed? If there are multiple reasons, arbitrarily pick one – ie, somebody could be blocked by two conflicting turns.

Shows an agent’s current inner intention or thoughts.

Point of interest, that is



At all speeds (including at rest), cars must be at least this far apart, measured from front of one car to the back of the other.


When spawning at borders, start the front of the vehicle this far along and gradually appear. Getting too close to EPSILON_DIST can lead to get_draw_car having no geometry at all.



Need to explain this trick – basically keeps consistency between two different simulations when each one might make slightly different sequences of calls to the RNG.