mirror of
https://github.com/a-b-street/abstreet.git
synced 2024-11-28 20:29:04 +03:00
81 lines
3.8 KiB
Markdown
81 lines
3.8 KiB
Markdown
# Intersection-related design notes
|
|
|
|
## Stop sign editor
|
|
|
|
Stop signs are FIFO, except that many intersections only have a stop sign for
|
|
some sides. Going straight on the priority roads is immedite, and left turns
|
|
from those priority roads also take precedence over the low-priority roads. So
|
|
should the stop sign controller mark individual turns as priority/not, or
|
|
individual roads, with implied semantics for left turns? There are really 3
|
|
priorities if turns are considered...
|
|
|
|
Figuring out nonconflicting roads seems tricky. For now, going to have a
|
|
complicated UI and let individual turns be classified into 3 priority classes.
|
|
First group can't conflict, second and third groups can conflict and are FIFO.
|
|
Will probably have to revisit this later.
|
|
|
|
## Stop signs
|
|
|
|
How to depict stop signs? Each driving lane has a priority... asap go or full
|
|
stop. Turns from go lanes might be yields, but shouldn't need to represent that
|
|
visually.
|
|
|
|
- Easy representation: draw red line / stop sign in some driving lanes. Leave the priority lanes alone.
|
|
- Harder: draw a stop sign on the side of the road by some lanes. Won't this look weird top-down and at certain angles?
|
|
|
|
## Traffic signals
|
|
|
|
- per lane would be weird.
|
|
- drawing turn icons as red/yellow/green is pretty clear...
|
|
- could draw an unaligned signal box with 3 circles in the middle of the intersection, but what does it represent? maybe just an initial indicator of what's going on; not full detail.
|
|
- similarly, draw a single stop sign in the middle of other intersections? :P
|
|
|
|
## Intersection policies for pedestrians ##
|
|
|
|
Before figuring out how pedestrians will deterministically use intersections alongside cars, recall how cars currently work...
|
|
|
|
- ask all cars for next move (continue on same thing, or move to a turn/lane)
|
|
- using fixed state, adjust some of the moves that dont have room to move to a new spot to wait instead
|
|
- serially ask intersections if a car can start a turn
|
|
- serially make sure only one new car enters a lane in the tick
|
|
- shouldnt the intersection policy guarantee this by itself?
|
|
- very awkwardly reset all queues from scratch
|
|
|
|
How did AORTA do it?
|
|
|
|
- agent.step for all of em (mutate stuff)
|
|
- enter intersections, telling them. must've previously gotten a ticket
|
|
- let all the agents react to the new world (immutable, except for IDEMPOTENTLY asking for turn)
|
|
- here we ask for tickets, unless we've already got one
|
|
- same for intersections
|
|
- grant them here
|
|
|
|
aka basically yeah, the simple:
|
|
|
|
- agents send a ticket during the planning phase?
|
|
- intersections get a chance to react every tick, granting tickets
|
|
- during the next action phase, an agent can act on the approved ticket?
|
|
|
|
good pattern in intersections:
|
|
- a sim state that the rest of the code interacts with for ALL intersections. rest of code doesnt see individual objects.
|
|
- that manager object delegates out most of the logic to SPECIALIZED versions of individual objects and does the matching
|
|
- no need for this to exist on the individual IntersectionPolicy object
|
|
|
|
How to share common state in intersections?
|
|
- if it's just the accepted set, have a parallel array and pass it into step()
|
|
- data locality gets ruined, this is ECS style, bleh
|
|
- have a common struct that both enum variants contain
|
|
- still have to match on enum type to operate on it commonly!
|
|
- have one struct that then contains an enum
|
|
- when delegating to specialized thing, can pass this unpacked thing down, right?
|
|
|
|
Seeing lots of deadlock bugs from accepting non-leader vehicles. For now,
|
|
switch to only considering leader vehicles, and later maybe relax to anybody
|
|
following only accepted vehicles.
|
|
|
|
Leader vehicle is a bit vague; could be leader on current queue, which is still a bit far away.
|
|
|
|
## Stop sign priority
|
|
|
|
Use OSM highway tags to rank. For all the turns on the higher priority road, detect priority/yield based on turn angle, I guess.
|