consolidating some docs

This commit is contained in:
Dustin Carlino 2020-06-08 12:17:27 -07:00
parent 473d0cccee
commit 4d3531caea
31 changed files with 167 additions and 601 deletions

View File

@ -23,13 +23,14 @@ Measure the effects:
![evaluating_impacts](docs/videos/evaluating_impacts.gif) ![evaluating_impacts](docs/videos/evaluating_impacts.gif)
## Documentation for developers ## Documentation
- [Developer guide](docs/dev.md) - [How A/B Street works](docs/how_it_works.md)
- [Map model](docs/articles/map/article.md) - Technical
- [Traffic simulation](docs/articles/trafficsim/article.md) - [Developer guide](docs/dev.md)
- [Rust implementation notes](docs/articles/rust/article.md) - [Map model](docs/articles/map/article.md)
- [Running A/B Street in a new city](docs/new_city.md) - [Traffic simulation](docs/articles/trafficsim/article.md)
- [Running A/B Street in a new city](docs/new_city.md)
- Presentations - Presentations
- April 2020 Rust meetup: - April 2020 Rust meetup:
[recording](https://www.youtube.com/watch?v=chYd5I-5oyc), [recording](https://www.youtube.com/watch?v=chYd5I-5oyc),
@ -37,39 +38,12 @@ Measure the effects:
- [Feb 2020 traffic sim](https://docs.google.com/presentation/d/181so6bWkGsPzpc-mI72CQffthMKMVzFPAkYxIyzgfAs/edit?usp=sharing) - [Feb 2020 traffic sim](https://docs.google.com/presentation/d/181so6bWkGsPzpc-mI72CQffthMKMVzFPAkYxIyzgfAs/edit?usp=sharing)
- [Oct 2019 Traffic sim and current challenges](https://docs.google.com/presentation/d/1PJRFoXmJAyenkqHIwo48zxqu1LSH6pc7XKSzhyC1raw/edit?usp=sharing) - [Oct 2019 Traffic sim and current challenges](https://docs.google.com/presentation/d/1PJRFoXmJAyenkqHIwo48zxqu1LSH6pc7XKSzhyC1raw/edit?usp=sharing)
- [Oct 2019 Map construction](https://docs.google.com/presentation/d/1cF7qFtjAzkXL_r62CjxBvgQnLvuQ9I2WTE2iX_5tMCY/edit?usp=sharing) - [Oct 2019 Map construction](https://docs.google.com/presentation/d/1cF7qFtjAzkXL_r62CjxBvgQnLvuQ9I2WTE2iX_5tMCY/edit?usp=sharing)
- Project
- [Roadmap](docs/roadmap.md)
- [Motivations](docs/motivations.md)
- [History](docs/history/history.md)
## Features ## Roadmap and contributing
- The map
- A detailed rendering of Seattle from OpenStreetMap and King County GIS data,
including sidewalks, on-street parking, bike lanes, bus-only lanes, turn
lanes, buildings, and bus stops.
- Intersections governed by stop signs and traffic signals, with default
signal timings heuristically inferred. Hand-tuned geometry to reasonably
model Seattle's strangest intersections.
- You can adjust lane types, stop signs, and traffic signals, and reverse
lanes.
- The traffic
- Individual cars, buses, bikes, and pedestrians move through the map.
- Most trips are multi-modal -- for example, a pedestrian exits a building,
walks a few blocks over to their parked car, drives somewhere, looks for
parking, and walks to their final destination.
- A realistic set of trips -- how many people go from building 1 to building 2
at some time using some form of transport -- based on
[PSRC's Soundcast](https://www.psrc.org/activity-based-travel-model-soundcast)
model.
- The gameplay
- Start in sandbox mode, exploring the map, watching traffic patterns,
following individual agents, looking for problems.
- Jump to edit mode, where you can convert some on-street parking to bus lanes
and adjust traffic signals to try to fix some problem.
- Try your change in A/B test mode, running two traffic simulations
side-by-side. Explore how individual agents finish their trips faster or
slower, and compare aggregate results about different groups of traffic.
- Attempt a predefined challenge with particular objectives, like speeding up
certain bus routes or designing a full bike network.
### Roadmap and contributing
See the [roadmap](docs/roadmap.md) for current work, including ways to help. If See the [roadmap](docs/roadmap.md) for current work, including ways to help. If
you want to bring this to your city or if you're skilled in design, traffic you want to bring this to your city or if you're skilled in design, traffic
@ -100,6 +74,7 @@ writes:
Existing urban planning software is either proprietary or hard to use. A/B Existing urban planning software is either proprietary or hard to use. A/B
Street strives to set the accessibility bar high, by being a fun, engaging game. Street strives to set the accessibility bar high, by being a fun, engaging game.
See [here](docs/motivations.md) for more guiding principles.
## Credits ## Credits
@ -108,11 +83,6 @@ Core team:
- Dustin Carlino (<dabreegster@gmail.com>) - Dustin Carlino (<dabreegster@gmail.com>)
- [Yuwen Li](https://www.yuwen-li.com/) (UX) - [Yuwen Li](https://www.yuwen-li.com/) (UX)
Active contributors:
- Orestis Malaspinas (<orestis.malaspinas@hesge.ch>) (pandemic modeling)
- Christopher Klein (game design)
Others: Others:
- Logo by [Ryan Pierson](https://www.ryandpierson.com/) - Logo by [Ryan Pierson](https://www.ryandpierson.com/)
@ -127,6 +97,8 @@ Others:
have been great sounding boards for ideas since the beginning have been great sounding boards for ideas since the beginning
- In-game character faces adapted from - In-game character faces adapted from
[Anokhee Jandhyala](https://github.com/anokhee/visual-synthesizer) [Anokhee Jandhyala](https://github.com/anokhee/visual-synthesizer)
- Pandemic modeling by Orestis Malaspinas (<orestis.malaspinas@hesge.ch>)
- Game design advice from Christopher Klein
Data: Data:

View File

@ -1,257 +0,0 @@
# A/B Street Features
Ever been on a bus stuck in traffic, wondering why there are cars parked on the
road instead of a bus lane? This article overviews the features of A/B Street,
an in-progress traffic simulation game set in Seattle. Players explore how small
changes to road layout and intersection rules affect multi-modal trips of
pedestrians, drivers, transit users, and cyclists. The game's mission is to make
it fun and simple for anybody to test an idea to improve Seattle's traffic flow
and, if the idea works well, to communicate it to others.
Warning: This article last updated April 2019; screenshots have changed since
then.
<!--ts-->
- [A/B Street Features](#ab-street-features)
- [Core gameplay](#core-gameplay)
- [Map](#map)
- [Lanes](#lanes)
- [Intersections (geometry)](#intersections-geometry)
- [Intersections (semantics)](#intersections-semantics)
- [Boundaries](#boundaries)
- [Buildings](#buildings)
- [Traffic simulation](#traffic-simulation)
- [Scale](#scale)
- [Trips](#trips)
- [A/B Tests](#ab-tests)
- [Ongoing work](#ongoing-work)
<!-- Added by: dabreegster, at: Fri Apr 19 13:28:13 PDT 2019 -->
<!--te-->
## Core gameplay
Explore Seattle and observe how traffic currently flows.
![](screenshots/demo.gif)
After finding a problem, edit the map in a few ways:
- change lane types (example: replace on-street parking with a bus-only lane)
- change which roads stop or yield at a stop sign
- change the phases and timing of a traffic signal (example: ban a left turn or
give it a dedicated phase)
![](screenshots/map_editing.gif)
These are changes that could be prototyped in real life relatively cheaply. A/B
Street's purpose is to explore improvements to Seattle that we could try
tomorrow, not longer-term improvements like light rail extensions.
After making edits, you can see how the same traffic patterns behave. I'm
currently working on a way to easily visualize and compare results with and
without edits. The game is currently more of a sandbox, but these phases of
exploring, editing, and evaluating will be tied together in a more game-friendly
format.
## Map
A/B Street generates a detailed map of Seattle from OpenStreetMap (OSM), King
County GIS, and a few other sources. It takes lots of processing to make a map
suitable for simulating traffic and that's visually appealing for a game. This
section describes some of these problems and solutions.
The portion of the code-base to transform and clean up the map are separate from
the traffic simulation. If you see another use for this map, contact me and
we'll figure out a format to export the data for your purposes. The code isn't
Seattle-specific; most things work if you only feed in OpenStreetMap data, and
plugging in another city's custom GIS data is probably not hard.
### Lanes
OSM models entire roads (crossing many intersections) coarsely, sometimes with
some metadata about lane restrictions.
![](screenshots/lanes_osm.gif)
A/B Street breaks roads down into indidual lanes, automatically finding the
geometry from the OSM road's center-line. Lane types and the number of lanes
come from heuristics on the OSM metadata and from extra King County GIS
shapefiles. Types of lanes include:
- Regular driving lanes, usable by any vehicle
- Sidewalks for pedestrian movement, including bus stops and paths to buildings
- Bus- and bike-only lanes
- On-street parking lanes, with individual parking spots
![](screenshots/lanes_abst.gif)
### Intersections (geometry)
OSM doesn't explicitly model intersections at all; some roads just share points.
![](screenshots/intersections_osm.gif)
In A/B Street, lanes and intersections have disjoint geometry.
![](screenshots/intersections_abst.gif)
This means that cars and pedestrians stop and queue at the correct position
before crossing an intersection.
![](screenshots/moving_through_intersection.gif)
The intersection geometry is calculated automatically, even for strangely-shaped
cases.
![](screenshots/intersection_good_geom.gif)
OSM ways often have many "intersections" very close together. These appear as
extremely short roads in A/B Street, which complicates traffic modeling.
![](screenshots/short_roads_bridge_before.gif)
These can be merged automatically, which works reasonably well sometimes.
![](screenshots/short_roads_bridge_after.gif)
But some cases are very complex; this is Montlake and 520 without merging short
roads:
![](screenshots/short_roads_montlake_before.gif)
Montlake and 520 with merging doesn't look much better, so currently short road
merging is still disabled.
![](screenshots/short_roads_montlake_after.gif)
Some highway on-ramps in OSM are modeled with particularly unusual geometry,
overlapping an arterial road.
![](screenshots/highway_onramp_osm.gif)
A/B Street detects and fixes these cases.
![](screenshots/highway_onramp_abst.gif)
### Intersections (semantics)
A/B Street models each turn through intersections, connecting an incoming lane
to an outgoing lane. Some of these turns conflict, so cars can't perform them
simultaneously. Currently stop signs and traffic signals are modeled
(roundabouts act like all-way stops).
For stop-sign controlled intersections, the bigger road by default has priority.
![](screenshots/turns.gif)
Intersections controlled by traffic signals have a default set of timed phases.
Players can edit these.
![](screenshots/traffic_signal.gif)
### Boundaries
How should the boundary of the map be handled? Without proper clipping, roads
and lakes go out-of-bounds, often with very strange, long roads to nowhere.
![](screenshots/clipping_before.gif)
Proper clipping trims polygons to fit properly. Roads that cross the boundary
terminate at special border intersections, which can model traffic flowing into
or out of the map.
![](screenshots/clipping_after.gif)
### Buildings
Light orange buildings are classified as residential, and dark orange as
commercial. Additional data from King County GIS reveals how many units some
apartments have. This could be used to generate a realistic number of trips
between residential and commercial areas.
![](screenshots/buildings.gif)
## Traffic simulation
A/B Street simulates the movement of individual agents:
- Cars move along lanes in a queue, only changing lanes at intersections.
- Buses are cars that cycle between bus stops, waiting at each one to unload and
load passengers.
- Bikes are cars with a maximum speed limit.
- Pedestrians move bidirectionally along sidewalks. They can pass through each
other; they don't queue or otherwise wait except at intersections. (Seattle
has very few places where pedestrian movement is significantly bottlenecked
due to other pedestrians.)
![](screenshots/lots_of_agents.gif)
### Scale
A/B Street originally used a discrete timestep model, updating every agent every
0.1 seconds. This was unnecessarily complex and too slow, so it now uses a
discrete-event simulation, only updating agents when an interesting transition
happens. So while a car crosses a long lane, its exact position is only
interpolated for drawing, and a full update happens when the car reaches the
intersection or the end of the queued cars.
On my modest laptop (7th-gen Intel i5, 8GB RAM), I can simulate 10,000 agents on
the small map at 2x speed (one minute of game-time in 30 seconds). This
definitely needs improvement, but many interesting scenarios will be around this
scale. Simulating ~800,000 agents in all of Seattle is not a high priority; the
flow into and out of a smaller region can be modeled much more cheaply.
A/B Street has a time-travel mode, useful for rewinding to trace the source of a
bottleneck. This is a bit memory-intensive right now, but hasn't been updated to
take advantage of the discrete-event model.
![](screenshots/time_travel.gif)
### Trips
Most trips are multi-modal. A pedestrian will appear at a building, travel down
the front path to the sidewalk, walk to a parked car they own or a bus stop,
start driving or riding, park or deboard, and walk to their final destination.
Bicycle trips have a fixed time to start or stop; this models how easy it is to
find bike parking in Seattle. In contrast, car parking is often scarce, so
drivers sometimes reach their destination, but start roaming around until they
find an available spot.
Trip generation -- travel from here to there, starting at this time, using a
car/bike/bus -- is currently very unrealistic. Players can manually define
groups of cars to spawn uniformly from somewhere within a region they outline,
but this is tedious. I'm actively looking for data sources (like the U.S census)
that'll give hints about where people live and work, to generate more realistic
demand data.
### A/B Tests
Traffic simulation is fully deterministic -- run exactly the same scenario twice
with the same version of the game, and you'll get the same results. Map edits
like adding or removing parking will change the initial conditions minimally (so
parked cars on unedited roads will usually not change). This lets players run
meaningful A/B tests, holding everything fixed except for a few tweaks to lanes
and intersections. Two simulations can be run in parallel, and there are tools
to visualize how individual agents are taking different paths or moving
faster/slower between the two runs.
## Ongoing work
A/B Street is not yet generally playable (but
[if you want to anyway](/docs/INSTRUCTIONS.md)...):
- The user interface to explore and edit the map is quite clunky.
- The pieces of the game -- editing the map, running a simulation, comparing
results -- exist, but nothing is tied together yet in a game-like format.
- Data sources describing a realistic set of trips is missing; cars start and
end at uniformly chosen places.
- Some important things aren't yet modeled: light rail, big bike trails like the
Burke Gilman, ridesharing services, off-street parking lots and garages.
If you're interested in joining me and working on problems like these, please
get in touch. Funding is available. I also have half-finished articles with
technical details about how A/B Street works; just ask me to finish them.
Contact Dustin Carlino at <dabreegster@gmail.com>.

View File

@ -1,61 +0,0 @@
## Gameplay
Most players will repeatedly:
1) Start in sandbox mode, watching a traffic simulation and browsing around for problems.
2) Use the map edit mode to change lane types and adjust intersections to try
to fix some particular problem.
3) Run an A/B test to compare how the same trips perform with and without some edits.
## Parking
On-street parking lanes are modeled, with the available spots based on the
road's length. The blockface dataset from King County GIS is used to infer
which roads have a parking lane -- but this dataset isn't meant to be so
accurate, so the results are often incorrect.
Driving trips between buildings (not starting or ending outside the map) are
multi-modal: the trip starts with a pedestrian leaving a building by foot,
walking to the closest parked car that they own, driving to their destination,
and then wandering around to look for a free parking spot (which can take a
while if there are no free parking spots nearby!). Simulations start with each
building having some number of parked cars spawned somewhere close by.
gif of ped entering a car
gif of ped parking a car and going to a bldg
TODO:
- More accurate data for the number of cars associated with each household
- Distinguish between types of on-street parking (free, pay by the hour, residences-only restrictions)
- Off-street parking (driveways, public and private parking lots and garages)
## Trips
During a typical day in Seattle, where do people travel, when do they depart,
and do they walk, bike, bus, or drive there? A/B Street imports trip data from
PSRC's [Soundcast](https://www.psrc.org/activity-based-travel-model-soundcast),
which models a synthetic population and has been carefully calibrated to match
census data, travel surveys, landuse, vehicle counts, and so on.
Mission Edit mode contains tools to visualize individual and aggregate trips
from this data, without running a traffic simulation.
gif of these tools
TODO:
- Trips that begin and end outside the boundary of a map, but pass through it,
are currently skipped. This happens often for trips passing through I5 or
520.
## Map borders
## Buildings
home / commerical / mixed-use, etc. number of households and employees from psrc.
## Generalizing to other cities
anywhere with OSM data... reasonable defaults

Binary file not shown.

Before

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 776 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 931 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 485 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,125 +0,0 @@
# Notes on Rust in A/B Street
This article describes parts of A/B Street's implementation that might be of
interest to the Rust community.
Background:
[What is A/B Street](https://github.com/dabreegster/abstreet/blob/master/docs/articles/features/article.md)?
<!--ts-->
- [Notes on Rust in A/B Street](#notes-on-rust-in-ab-street)
- [ezgui](#ezgui)
- [Wizard and WrappedWizard](#wizard-and-wrappedwizard)
- [Test runner](#test-runner)
- [Grievances](#grievances)
<!-- Added by: dabreegster, at: Mon Apr 22 15:46:36 PDT 2019 -->
<!--te-->
## ezgui
After dabbling with the [existing GUI frameworks](http://areweguiyet.com/), I
wound up rolling my own, highly specialized to my use case. I originally used
Piston for underlying rendering, but I eventually switched to glium to stop
uploading so much geometry constantly. A/B Street only makes use of OpenGL 3
features and seems to work fine on Linux, Windows, and Mac. I don't have any
interest in Vulkan and the other newer things, but would love to also get A/B
Street running in the browser with WebGL or similar.
The ezgui library exposes a very simple, immediate-mode API. There's no messy
synchronization between application and GUI state; the application just asks
what events happened and says what to draw. There are basic widgets for text
entry and menus. The application creates and stores these, passes events along
to them, and asks them to draw themselves. There's no layouting, besides options
to align individual widgets. A "canvas" (really a 2D camera) handles basic
panning and zooming.
[This](https://github.com/dabreegster/abstreet/blob/eae301ee1bde247be5a2b067f6a4eadaa68aa6e7/synthetic/src/main.rs)
is a simple example of usage. In the `event` method, the application checks its
own current state and, based on that, tests for relevant key-presses or clicks.
At the bottom of the screen, the current possible actions are shown with their
hotkey -- a cheap context-sensitive help function. `draw` is simple as well;
ezgui just exposes methods to draw a colored polygon and render text. Large
batches of geometry can be uploaded once, then cheaply redrawn later.
![](hotkeys.gif)
One mildly hilarious feature I have to mention is the
[screen capture](https://github.com/dabreegster/abstreet/blob/eae301ee1bde247be5a2b067f6a4eadaa68aa6e7/ezgui/src/widgets/screenshot.rs)
tool. I wanted a way to visually compare the Seattle maps I'm rendering, so I
can verify my changes to intersection layout code don't quietly butcher some
part of the map I'm not looking at. I tried a few different ways of coercing
glium to rendering to one big texture and saving to a file, but the result was
extremely slow unless I compiled in release mode (which is absolutely not an
option in the middle of debugging hairy geometry code). So instead, the
application can ask the ezgui layer to zoom in some amount, then take a bunch of
left-to-right, top-to-bottom steps over the canvas, calling an external
screenshot tool after each render. Sometimes the quick hack works perfectly.
I would consider cleaning up ezgui and publishing it as a generally usable
crate, except it's pretty crippled:
- basic widgets like a scrolling text box, list with radio buttons, and tables
are missing
- The imperative style makes it quite easy for different parts of the UI to
stomp on each other, both using the same key. I'm not happy with how the
paradigm scales, and want to experiment with other solutions before leading
somebody else down the same hole I'm digging myself out of.
I'm still unsure if I'll keep making ezgui handle the growing complexity of A/B
Street's UI or if I'll try to adapt something else.
### Wizard and WrappedWizard
One trick I'm super proud of is the "wizard"-style dialogs for asking a series
of questions. Suppose you have a struct with a bunch of fields, like
[SpawnOverTime](https://github.com/dabreegster/abstreet/blob/eae301ee1bde247be5a2b067f6a4eadaa68aa6e7/sim/src/make/scenario.rs).
You want to prompt the user to fill out this struct, maybe even branching the
questions you ask based on previous answers.
My solution to this problem is
[edit_scenario](https://github.com/dabreegster/abstreet/blob/eae301ee1bde247be5a2b067f6a4eadaa68aa6e7/editor/src/plugins/edit/scenarios.rs),
which is called once per event (keypress). This code is extremely easy to write
and maintain; the complexity of the user prompts being filled out slowly over
the course of many `event()` and `draw()` calls is invisible. The
`WrappedWizard` works by storing confirmed responses and some widget
representing the current question. So the first many rounds, the `choose_string`
call for "What kind of edit" just defers to an ezgui Menu, which keeps its own
state about the current selected item. Once the Menu is done, WrappedWizard
stores the String response. The next time `choose_string` is called, it
immediately returns that answer, so `edit_scenario` makes it to the next step.
This is a simple way of simulating continuations. WrappedWizard returns `None`
for incomplete answers, and the `?` short-circuiting takes care of the rest.
## Test runner
The Rust test runner is painful to use. When a test fails, I want STDOUT and
STDERR in a log file, not inlined with information on test runs. I sometimes
want to surface a custom string in the main test results that lets me quickly
re-run a failed test with a GUI. So I wrote
[this](https://github.com/dabreegster/abstreet/blob/eae301ee1bde247be5a2b067f6a4eadaa68aa6e7/tests/src/runner.rs)
to solve my needs, at least until https://github.com/rust-lang/rust/issues/50297
makes progress.
![](tests.gif)
The downside is that all test code has to live in one crate, but I'm sure some
macro cleverness could avoid this.
## Grievances
No surprises here: compile times suck. It's especially frustrating to add a few
lines to `geom` for debugging (not affecting any of the crate's external APIs),
then wait for the dependent crates `map_model`, `sim`, and `game` to recompile
(or maybe just link again, but it sure is slow). It's also frustrating to
recompile all dependencies from scratch when I switch between compiling for
Linux and Windows.
There are a few crates with binary heaps for priority queues, but I couldn't
make any of them work with Serde, have deterministic behavior (so no hashing
underneath), and act as a min-heap instead of a max-heap.
Otherwise, Rust is amazing! Sometimes the borrow checker makes me express
something awkwardly, but mostly it's forced me to avoid bad ideas.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

View File

@ -1,60 +0,0 @@
# Modeling assumptions
This is pretty disorganized right now, just need to start something.
## Sidewalk connectivity
Should it be possible to close sidewalks for construction? Right now, this
breaks too many assumptions that're hard to recompute. Building front paths and
bus stops are associated with a sidewalk, so that makes applying the edit way
more unclear. Closing intersections is still useful -- remove all of the vehicle
turns, but allow the walking turns.
## Graph connectivity
For now, no map edits should be able to impact any of the trips possible in the
baseline -- so no impacting graph connectivity, no killing bus stops, etc.
## Over-taking
Unsupported right now, but it should happen. Unlocks shared bike/ped trails like
the Burke.
## Left turns in the middle of a road
Into a driveway, or using the shared left turn lanes. This should be supported.
Parking and unparking already have the ability to block one queue -- extend
that.
## Demand modeling
When the player makes it much more/less convenient to take some trip, people
will eventually shift mode or take different trips altogether. Not attempting
any of that yet -- just using PSRC trips. I don't understand the demand modeling
process well at all yet.
## Bike/bus lane connectivity
Bikes and buses can make crazy left turns from the rightmost protected lane.
Alternatively, stop generating those turns and start generating turns between
protected and general lanes.
## Parking
No restrictions -- all available spots are treated equally. No cost, time
limits, or private spots.
## U-turns
Only happen at dead-ends right now. But there are a few important ones to
support -- like Montlake Blvd to go WB on 520.
## Roads without sidewalks
Last-leg routing... pedestrians need to walk on the road. How to model this?
Happens in Seattle when there's parking without sidewalks nearby.
## One-at-a-time roads
Some roads are "two-way", but have parking on both sides, and so are effectively
one way at a time. How's this tagged in OSM? How do we model this?

View File

@ -11,8 +11,10 @@ has been festering since I was about 16.
* [Year 1 (June 2018-2019)](#year-1-june-2018-2019) * [Year 1 (June 2018-2019)](#year-1-june-2018-2019)
* [Year 2 (June 2019-2020)](#year-2-june-2019-2020) * [Year 2 (June 2019-2020)](#year-2-june-2019-2020)
* [Retrospective](#retrospective) * [Retrospective](#retrospective)
* [Trivia](#trivia)
<!-- Added by: dabreegster, at: Mon Jun 8 12:16:39 PDT 2020 -->
<!-- Added by: dabreegster, at: Sat May 30 15:43:02 PDT 2020 -->
<!--te--> <!--te-->
## Backstory ## Backstory
@ -23,12 +25,12 @@ quick version.
I grew up in Baton Rouge, where driving is effectively the only mode of I grew up in Baton Rouge, where driving is effectively the only mode of
transport. (I've gone back and made a point of taking long walks to confirm how transport. (I've gone back and made a point of taking long walks to confirm how
antagonistically the city is designed towards other modes.) Very early on, I antagonistically the city is designed towards walking.) Very early on, I fell in
fell in love with a Nintendo 64 game called Banjo Kazooie, which led me to the love with a Nintendo 64 game called Banjo Kazooie, which led me to the online
online fan communities of the early 2000's. I wanted to create games too, so I fan communities of the early 2000's. I wanted to create games too, so I started
started learning programming via library books and lots of questions on IRC. learning programming via library books and lots of questions on IRC. Because I
Because I never had any confidence in art, I wound up working on roguelikes, never had any confidence in art, I wound up working on roguelikes, which led to
which led to a fervent interest in pathfinding algorithms and a fervent interest in pathfinding algorithms and
[collaborative diffusion](http://www.cs.colorado.edu/~ralex/papers/PDF/OOPSLA06antiobjects.pdf). [collaborative diffusion](http://www.cs.colorado.edu/~ralex/papers/PDF/OOPSLA06antiobjects.pdf).
When I started driving in high school, I quickly realized how bad people were at When I started driving in high school, I quickly realized how bad people were at
it. I remember being stuck at the intersection of it. I remember being stuck at the intersection of
@ -111,6 +113,7 @@ calling out milestones. "UI churn" is pretty much constantly happening.
test runner framework test runner framework
- December: bezier curves for turns, traffic signal editor, a first attempt at - December: bezier curves for turns, traffic signal editor, a first attempt at
merging intersections, right-click menus, a top menu, modal menus merging intersections, right-click menus, a top menu, modal menus
- the grand colorscheme refactor: a python script scraped `cs.get_def` calls - the grand colorscheme refactor: a python script scraped `cs.get_def` calls
at build-time at build-time
@ -139,6 +142,7 @@ calling out milestones. "UI churn" is pretty much constantly happening.
- September: offstreet parking, associating parked cars with buildings using - September: offstreet parking, associating parked cars with buildings using
Soundcast (before that, anybody could use any car!), implemented texture Soundcast (before that, anybody could use any car!), implemented texture
support for some reason, doing manual `MapFixes` at scale to fix OSM bugs support for some reason, doing manual `MapFixes` at scale to fix OSM bugs
- **milestone**: got the smallest montlake map to run without gridlock - **milestone**: got the smallest montlake map to run without gridlock
- October: parking sim fixes, opportunistic lane-changing, starting challenge - October: parking sim fixes, opportunistic lane-changing, starting challenge
@ -148,6 +152,7 @@ calling out milestones. "UI churn" is pretty much constantly happening.
- **milestone**: Yuwen joins project - **milestone**: Yuwen joins project
- December: the UI reform begins (flexbox, minimap, trip timelines, cutting over - December: the UI reform begins (flexbox, minimap, trip timelines, cutting over
to SVGs, info panels, scrolling), started naming releases sensibly to SVGs, info panels, scrolling), started naming releases sensibly
- Project leaked to [HN](https://news.ycombinator.com/item?id=21763636), woops - Project leaked to [HN](https://news.ycombinator.com/item?id=21763636), woops
- January: UI reform continues, the modern tutorial mode appears - January: UI reform continues, the modern tutorial mode appears
@ -180,4 +185,6 @@ What poor judgments have cost me the most time?
## Trivia ## Trivia
The name was almost "Unstreet" or "Superban" (superb urban) - The name was almost "Unstreet" or "Superban" (superb urban)
- I hope you enjoy and/or are baffled by the
[release names](https://github.com/dabreegster/abstreet/releases)

View File

@ -1,56 +1,146 @@
# How A/B Street works # How A/B Street works
The big caveat: I'm a software engineer with no background in civil engineering. The overview:
A/B Street absolutely shouldn't replace other planning or analysis. It's just
meant to be an additional tool to quickly prototype ideas without expensive
software and formal training.
This page gives a non-technical overview. See 1. A detailed map of Seattle is built from
[here](https://github.com/dabreegster/abstreet/#documentation-for-developers) [OpenStreetMap (OSM)](https://www.openstreetmap.org/about)
for details. 2. A realistic set of daily trips by car, bike, foot, and bus are simulated
3. You make small changes to roads and intersections
4. You explore how these changes affect the trips
## The map of Seattle Details below. Many limitations are mentioned; improvements are ongoing. I'll
add pictures to explain better when I get time.
The map in A/B Street is built from <!--ts-->
[OpenStreetMap](https://www.openstreetmap.org/about). You will notice many * [How A/B Street works](#how-ab-street-works)
places where the number of lanes is wrong; let me know about these, and we can * [Driving](#driving)
contribute the fix to OpenStreetMap. Many sidewalks and crosswalks are also * [Parking](#parking)
incorrectly placed. * [Biking](#biking)
* [Walking](#walking)
* [Transit](#transit)
* [Intersections](#intersections)
* [People and trips](#people-and-trips)
* [Map edits](#map-edits)
People in A/B Street have to park their cars somewhere. I can't find good data <!-- Added by: dabreegster, at: Mon Jun 8 12:17:13 PDT 2020 -->
about either public or private parking. For now, I'm using a Seattle
[GeoData blockface dataset](http://data-seattlecitygis.opendata.arcgis.com/datasets/blockface)
to guess on-street parking, but this is frequently wrong. I'm assigning every
building one offstreet spot. This is wildly unrealistic, but I have nothing
better yet.
There's also no public data about how traffic signals in Seattle are timed. I'm <!--te-->
making automatic guesses, and attempting to manually survey as many signals
in-person as I can. I could really use help here!
## The traffic ## Driving
Vehicles in A/B Street instantly accelerate and brake. They change lanes only at - Movement: no acceleration, go the full speed limit of the road unless there's
intersections, and they can't over-take slower vehicles in the middle of a lane. a slower vehicle in front
People walking on sidewalks can "ghost" through one another, or walk together in - Lanes
a crowd -- before COVID-19, this was a reasonable model in most areas. Despite - No over-taking or lane-changing in the middle of a road, only at
these limits, I hope you'll find the large-scale traffic patterns that emerge intersections
from the simulation to be at least a little familiar from your real-world - Strange choice of lanes -- the least full at the time of arrival
experiences. - Narrow two-way neighborhood roads where, in practice, only one car at a time
can go are currently full two-way roads
- Routing is based on fastest time assuming no traffic
- No rerouting if the driver encounters a traffic jam
People in A/B Street follow a specific schedule, taking trips between buildings ## Parking
throughout the day. The trips come from
[PSRC's Soundcast model](https://www.psrc.org/activity-based-travel-model-soundcast),
which uses census, land-use, and vehicle count data to generate a "synthetic
population" roughly matching reality. The trip data is from 2014, which is quite
old.
When you make changes to the map in A/B Street, exactly the people still take - Types
exactly the same trips, making the same decision whether to drive, walk, bike, - On-street: parallel parking lanes from
or take transit. Currently, your changes only influence their route and [GeoData blockface dataset](http://data-seattlecitygis.opendata.arcgis.com/datasets/blockface)
experience along it. and
[manually mapped](https://dabreegster.github.io/abstreet/map_parking.html)
- Off-street: most buildings have at least a few parking spots in a driveway
or carport
- Parking lots: the number of spots is inferred
- Restrictions
- All spots are public except for the few spots associated with each building
- No time restrictions or modeling of payment
- How cars park
- Drivers won't look for parking until they first reach their destination
building. Then they'll drive to the nearest open parking spot (magically
knowing what spots are open, even if they're a few blocks away). If somebody
else has taken the spot when they arrive, they'll try again.
- Once a driver finds an open spot, they'll take 10-15 seconds to park. They
block the road behind them in the meantime. There are no conflicts between
pedestrians and cars when using a driveway. Cars won't make left turns into
or out of driveways.
- Some parking along the boundary of the map is "blackholed", meaning it's
impossible to actually reach it. Nobody will use these spots.
## Missing things ## Biking
Light rail, shared biking/walking trails like the Burke Gilman, and ridesharing - Choice of lane
are some of the notable things missing right now. - Multi-use trails like the Burke Gilman and separated cycle-tracks like the
one along Broadway are currently missing
- Cyclists won't use an empty parking lane
- On roads without a bike lane, cyclists currently won't stick to the
rightmost lane
- No over-taking yet, so cars can get stuck behind a bike even if there's a
passing lane
- Elevation change isn't factored into route choice or speed yet; pretend
everybody has an e-bike
- Beginning or ending a cycling trip takes 30-45 seconds. Locking up at bike
racks with limited capacity isn't modeled; in practice, it's always easy in
Seattle to find a place to lock up.
# Walking
- Not using sidewalk and crosswalk data from OSM yet
- No jay-walking, even on empty residential streets
- Pedestrians can't use roads without sidewalks at all
- When a road only has a sidewalk on one side, driveways will cross the road
- Pedestrians can "ghost" through each other; crowds of people can grow to any
size
## Transit
- The modeling of buses is extremely simple and buggy; I'll work on this soon
- No light rail yet
## Intersections
- Conflicting movements are coarse: a second vehicle won't start a conflicting
turn, even if the first vehicle is physically out of the way but still
partially in the intersection
- Most of the time, vehicles won't "block the box" -- if there's no room in the
target lane, a vehicle won't start turning and risk getting stuck in the
intersection
- Traffic signals
- Only fixed timers; no actuated signals or
[centralized control](https://www.seattle.gov/transportation/projects-and-programs/programs/technology-program/mercer-scoot)
yet
- The timing and phases are automatically guessed, except some intersections
are
[manually mapped](https://docs.google.com/document/d/1Od_7WvBVYsvpY4etRI0sKmYmZnwXMAXcJxVmm8Iwdcg/edit?usp=sharing)
- No pedestrian beg buttons; walk signals always come on
- The signal doesn't change for rush hour or weekday/weekend traffic; there's
one pattern all day
- Turn restrictions from OSM are applied
- Per lane (left turn only from leftmost lane), entire roads, multiple
intersections
## People and trips
- A "synthetic population" of ~700,000 people come from
[PSRC's Soundcast model](https://www.psrc.org/activity-based-travel-model-soundcast)
- Soundcast uses census, land-use, vehicle counts, and commuter surveys. The
current data is from 2014.
- All driving trips are currently single-occupancy; no car-pooling or
ridesharing
- Parked cars are initially placed at midnight based on the number of trips
between buildings
- Each person's schedule never changes
- Your changes to the map won't yet convince somebody to take a bus or walk
instead of drive
## Map edits
- Types of edits
- Change types of lanes. Sometimes this is unrealistic based on actual road
width, but data for this is unavailable.
- Reversing direction of lanes
- Changing stop signs
- Changing traffic signal timing
- Closing roads and intersections for construction, forcing rerouting
- Disconnecting the map
- Generally you can't close sidewalks or make changes to make buildings
unreachable
- You shouldn't be able to make bus stops unreachable, but currently this is
buggy

View File

@ -44,7 +44,7 @@ these here. In no particular order:
land-use patterns handle population growth better. land-use patterns handle population growth better.
- **Compromise and trade-offs**: I see lots of rhetoric calling for extreme, - **Compromise and trade-offs**: I see lots of rhetoric calling for extreme,
sudden change. I don't want to ban all cars, because that's not realistic. I sudden change. I don't want to ban all cars from downtown Seattle, because
want to focus on immediate steps forward. I want to come up with estimates that's not realistic. I want to focus on immediate steps forward. I want to
about impacting drivers by a median 3 minutes in order to save a bus route 1 come up with estimates about impacting drivers by a median 3 minutes in order
minute, and to shift public discourse towards that. to save a bus route 1 minute, and to shift public discourse towards that.