Three parts, running in real time:
- particle filter for vehicle location and speed
- Kalman filter for transit road network state (speed)
- travel- and arrival-time predictions for each vehicle/stop combination in the network
IN: GTFS realtime protobuf feed
OUT: (updated) vehicle objects with updated particle states
IN: particle filter state estimates, road state at time now - delta
OUT: road state at time now
IN: particle filter state estimates, road state estimates
OUT: ETA to remaining stops along route
apt-get install build-essential cmake unzip libboost-all-dev libprotobuf-dev libsqlite3-dev cxxtest sqlite3- (optional) Doxygen (for making the Documentation)
- (optional) Google protobuf compiler
protoc: https://github.com/google/protobuf/blob/master/src/README.md (install withmake protoc)
- Application to run indefinitely
- Use a
Vehicleobject concept withvector<Particle> (N)void update (gtfs::VehiclePosition, gtfs::TripUpdate): adjust the position, arrival/departure times etc, trigger particle transitionsvoid resample (N): perform particle filter weighted resample- properties
vehicle_id,timestamp,trip_id,route_id,position,stop_sequence,arrival_time,departure_time
- And the particles work in memory only
Particlevoid initialize ()void transition ()void calc_likelihood (): uses parent Vehiclevoid calc_weight ()- properties
distance,velocity,stop_index,arrival_time,departure_time,segment_index,queue_time,begin_time,likelihood,weight
- Similar concept for network route segments
Segmentvector<Path> shape: the GPS coordinates and cumulative distance of segment shapedouble speedvoid update (): perform Kalman filter update, using particle summaries (?)
- The GTFS information can either be
- loaded into an SQLite database, or
- loaded into a MEMORY table via MySQL
- Vehicle state summaries can be written to a file (?)
- Making information available (via server) - road segment speeds + arrival time predictions
- database (with no foreign key checks, and no transaction?)
(?) best way of collecting vehicle/segment data
- sequentially append speed estimates to
Segment, then periodically update and clear? - write to file? (makes keeping history easier?)
docs: documentation (HTML and LaTeX)gps: a library containing methods for dealing with GPS coordinatesgtfs: a library with GTFS object classes, and methods for modeling themVehicle: Class representing a physical vehicleParticle: Class representing a single vehicle state estimateSegment: Class representing a road segment
include: header files for programsprotobuf: GTFS Realtime protobuf description and classessrctransit_network_model.cpp: mostly just a wrapper forwhile (TRUE) { ... }load_gtfs.cpp: a program that imports the latest GTFS data and segments it