osrm-backend/features/guidance/turn-angles.feature
Moritz Kobitzsch 5e167b8745 Turn Angles in OSRM were computed using a lookahead of 10 meters.
This PR adds more advanced coordinate extraction, analysing the road
to detect offsets due to OSM way modelling.

In addition it improves the handling of bearings. Right now OSM reports
bearings simply based on the very first coordinate along a way.
With this PR, we store the bearings for a turn correctly, making the
bearings for turns correct.
2016-10-20 10:47:29 +02:00

1152 lines
50 KiB
Gherkin

@routing @guidance @turn-angles
Feature: Simple Turns
Background:
Given the profile "car"
Given a grid size of 1 meters
Scenario: Offset Turn
Given the node map
"""
a - - - - - - - - b - - - - - - - - - c
|
|
|
|
|
|
d
'
'
'
'
'
e
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
f
"""
And the ways
| nodes | highway | name | lanes |
| abc | primary | road | 4 |
| bdef | primary | turn | 2 |
When I route I should get
| waypoints | route | turns |
| a,c | road,road | depart,arrive |
| a,e | road,turn,turn | depart,turn slight right,arrive |
| e,a | turn,road,road | depart,turn slight left,arrive |
| e,c | turn,road,road | depart,turn sharp right,arrive |
Scenario: Road Taking a Turn after Intersection
Given the node map
"""
a - - - - - - - - b - - - - - - - - - c
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
d
'
'
'
'
'
e
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
f
"""
And the ways
| nodes | highway | name | lanes |
| abc | primary | road | 4 |
| bdef | primary | turn | 2 |
When I route I should get
| waypoints | route | turns |
| a,c | road,road | depart,arrive |
| a,e | road,turn,turn | depart,turn right,arrive |
| e,a | turn,road,road | depart,turn left,arrive |
| e,c | turn,road,road | depart,turn right,arrive |
Scenario: U-Turn Lane
Given the node map
"""
j
|
|
|
|
|
|
|
i - - - - - - - - - - - - - - - - - g - h
|
|
|
|
|
|
f
|
/
/
d - - - - - - - - e
/
c
/
|
|
|
|
|
a - k - - - - - - - - - - - - - - - - - b
"""
And the ways
| nodes | highway | name | lanes | oneway |
| akb | primary | road | 4 | yes |
| hgi | primary | road | 4 | yes |
| akcdefg | primary_link | | 1 | yes |
| gj | tertiary | turn | 1 | |
When I route I should get
| waypoints | route | turns |
| a,b | road,road | depart,arrive |
| a,i | road,road,road | depart,continue uturn,arrive |
| a,j | road,turn,turn | depart,turn left,arrive |
#http://www.openstreetmap.org/#map=19/52.50871/13.26127
Scenario: Curved Turn
Given the node map
"""
f - - - - - - - - - - - e - - - - - - - d
l
k
\
\
j
\
\
i
\
\
h
|
|
|
|
a - - - - - - - - - - - - - - - - - b - c
|
|
|
|
|
|
|
|
g
"""
And the ways
| nodes | highway | name | lanes | oneway |
| abc | primary | road | 5 | no |
| gb | secondary | turn | 3 | yes |
| bhijkle | unclassified | turn | 2 | yes |
| de | residential | road | | yes |
| ef | residential | road | 2 | yes |
When I route I should get
| waypoints | route | turns |
| a,c | road,road | depart,arrive |
| c,a | road,road | depart,arrive |
| g,a | turn,road,road | depart,turn left,arrive |
| g,c | turn,road,road | depart,turn right,arrive |
| g,f | turn,road | depart,arrive |
| c,f | road,road,road | depart,continue right,arrive |
| a,f | road,road,road | depart,continue uturn,arrive |
# http://www.openstreetmap.org/#map=19/52.48753/13.52838
Scenario: Traffic Circle
Given the node map
"""
. l .
m k
.
.
j
n
.
.
i - - - p
o
. h
a - b
g
c
.
d f
. .
e
"""
And the ways
| nodes | highway | name | lanes | oneway | junction |
| ab | residential | road | 1 | yes | |
| ip | residential | road | 1 | yes | |
| bcdefghijklmnob | residential | road | 1 | yes | roundabout |
When I route I should get
| waypoints | route | turns | intersections |
| a,p | road,road,road | depart,roundabout turn straight exit-1,arrive | true:90;true:135 false:270 false:345,true:90 false:180 true:345;true:270 |
Scenario: Splitting Road with many lanes
Given the node map
"""
f - - - - - - - - - - - - - - - - - - - - e
'
'
'
'
'
a - - - - - b
'
'
'
'
'
c - - - - - - - - - - - - - - - - - - - - d
"""
And the ways
| nodes | highway | name | lanes | oneway |
| ab | primary | road | 4 | no |
| bcd | primary | road | 2 | yes |
| efb | primary | road | 2 | yes |
When I route I should get
| waypoints | route | turns |
| a,d | road,road | depart,arrive |
| e,a | road,road | depart,arrive |
@todo
# currently the intersections don't match up do to the `merging` process.
# The intermediate intersection is technically no-turn at all, since the road continues.
Scenario: Splitting Road with many lanes
Given the node map
"""
f - - - - - - - - - - - - - - - - - - - - e
'
'
'
'
'
a - - - - - b
'
'
'
'
'
c - - - - - - - - - - - - - - - - - - - - d
"""
And the ways
| nodes | highway | name | lanes | oneway |
| ab | primary | road | 4 | no |
| bcd | primary | road | 2 | yes |
| efb | primary | road | 2 | yes |
When I route I should get
| waypoints | route | turns | intersections ; |
| a,d | road,road | depart,arrive | true:90;true:270 |
| e,a | road,road | depart,arrive | true:270;rue:90 |
#http://www.openstreetmap.org/#map=19/52.54759/13.43929
Scenario: Curved Turn At Cross
Given the node map
"""
h
|
|
|
|
| . b - - - - - - - - - - - - - - - - - - a
| .
| .
| c
|
|
|
d
|
|
|
e |
. |
. |
g - - - - - - - - - - - - - f |
|
|
|
i
"""
And the ways
| nodes | lanes | name |
| abcd | 3 | road |
| defg | 2 | road |
| hdi | 2 | cross |
When I route I should get
| waypoints | route | turns |
| a,g | road,road | depart,arrive |
| i,a | cross,road,road | depart,turn right,arrive |
| i,g | cross,road,road | depart,turn left,arrive |
| h,g | cross,road,road | depart,turn right,arrive |
| h,a | cross,road,road | depart,turn left,arrive |
#http://www.openstreetmap.org/#map=19/52.56243/13.32666
Scenario: Modelled Curve on Segregated Road
Given the node map
"""
a f
| . e - - - - g
| h ' |
| . ' |
| i |
| . |
| |
| . |
| |
| j |
| |
| ' |
|. |
| |
m b - - - - - - - - - - - - - - - - - - - k - - - - l
| |
c d
"""
And the ways
| nodes | name | oneway | lanes |
| abc | road | yes | 3 |
| dkef | road | yes | 3 |
| mbkl | turn | yes | 3 |
| gehijb | turn | yes | 3 |
When I route I should get
| waypoints | route | turns |
| a,c | road,road | depart,arrive |
| a,l | road,turn,turn | depart,turn left,arrive |
| a,f | road,road,road | depart,continue uturn,arrive |
| d,f | road,road | depart,arrive |
| d,l | road,turn,turn | depart,turn right,arrive |
| d,c | road,road,road | depart,continue uturn,arrive |
| g,l | turn,turn,turn | depart,continue uturn,arrive |
| g,c | turn,road,road | depart,turn left,arrive |
#http://www.openstreetmap.org/#map=19/52.50878/13.26085
Scenario: Curved Turn
Given the node map
"""
f - - - - - - - - - e - - - - - - - - - d
k
.
j
.
i
.
h
|
|
|
|
|
|
|
|
a - - - - - - - - - - - - - - - - - b - c
|
|
|
|
|
|
|
|
g
"""
And the ways
| nodes | highway | name | lanes | oneway |
| abc | primary | road | 5 | no |
| gb | secondary | turn | 3 | yes |
| bhijke | unclassified | turn | 2 | yes |
| de | residential | road | | yes |
| ef | residential | road | 2 | yes |
When I route I should get
| waypoints | route | turns |
| g,f | turn,road,road | depart,turn left,arrive |
| c,f | road,road,road | depart,continue right,arrive |
#http://www.openstreetmap.org/search?query=52.479264%2013.295617#map=19/52.47926/13.29562
Scenario: Splitting Roads with curved split
Given the node map
"""
f - - - - - - - - - - - - - - - - - e
.
.
g
.
a - - - - - b
.
c
.
.
h - - - - - - - - - - - - - - - - - d
"""
And the ways
| nodes | highway | name | lanes | oneway |
| ab | primary | road | 4 | no |
| bchd | primary | road | 2 | yes |
| efgb | primary | road | 2 | yes |
When I route I should get
| waypoints | route | turns |
| a,d | road,road | depart,arrive |
| e,a | road,road | depart,arrive |
#http://www.openstreetmap.org/#map=19/52.51710/13.35462
Scenario: Merge next to modelled turn
Given the node map
"""
f - - - - - - - - - - - - - - - e
.
.
.
a - - - - - - - - b
.\
.\
.\
g \
\
. \
c- - - - - - - - - - - - - - - d
h
|
|
|
|
|
|
|
|
|
|
i
"""
And the ways
| nodes | name | oneway | lanes | highway |
| ab | spree | no | 6 | tertiary |
| bcd | spree | yes | 3 | tertiary |
| efb | spree | yes | 3 | tertiary |
| bghi | | no | | service |
When I route I should get
| waypoints | route | turns |
| a,d | spree,spree | depart,arrive |
| e,a | spree,spree | depart,arrive |
| a,i | spree,, | depart,turn right,arrive |
| e,i | spree,, | depart,turn left,arrive |
Scenario: Merge next to modelled turn
Given the node map
"""
f - - - - - - - - - - - - - - - e
.
.
.
a - - - - - - - - b
.\
.\
.\
g \
\
. \
c- - - - - - - - - - - - - - - d
h
|
|
|
|
|
|
|
|
|
|
i
"""
And the ways
| nodes | name | oneway | lanes | highway |
| ab | spree | no | 6 | tertiary |
| bcd | spree | yes | 3 | tertiary |
| efb | spree | yes | 3 | tertiary |
| bghi | | no | | living_street |
When I route I should get
| waypoints | route | turns |
| a,d | spree,spree | depart,arrive |
| e,a | spree,spree | depart,arrive |
| a,i | spree,, | depart,turn right,arrive |
| e,i | spree,, | depart,turn left,arrive |
# http://www.openstreetmap.org/#map=18/52.52147/13.41779
Scenario: Parking Isle
Given the node map
"""
c - - - - - - - - - - - - - - b - - - - - - - - - - - - - - a
.
.
.
.
.
.
.
1 .
.
.
.
.
j - - - - - - - - - - - - - - - - - - - - - - i
.
.
.
.
d
.
.
.
.
e
.
.
.
k
2
.
.
g - - - - - - - - - - f - - - - - - - - - - - - - - - - - - h
"""
And the ways
| nodes | name | oneway | lanes | highway |
| gfh | allee | yes | 3 | primary |
| bjdekf | | yes | | service |
| ij | | no | | parking aisle |
| abc | allee | yes | 3 | primary |
When I route I should get
| waypoints | route | turns |
| a,c | allee,allee | depart,arrive |
| a,h | allee,allee,allee | depart,continue uturn,arrive |
| 1,h | ,allee,allee | depart,turn left,arrive |
| 2,h | ,allee,allee | depart,turn left,arrive |
#http://www.openstreetmap.org/#map=18/52.56251/13.32650
Scenario: Curved Turn on Separated Directions
Given the node map
"""
e d
f - - - - - - - - - - - - - - - c - - - - - - - - - - - j
| l ' |
| ' |
| ' |
| ' |
| ' |
| n |
| |
| ' |
| |
| ' |
| |
| |
| |
|' |
| |
| |
| |
| |
g |
h - - - - - - - - - - - - - - - b - - - - - - - - - - - o
| |
| |
| |
| |
| |
| |
i a
"""
And the ways
| nodes | name | oneway | lanes | highway |
| jc | Kapweg | yes | 3 | primary |
| clng | Kapweg | yes | | primary_link |
| hbo | Kapweg | yes | 2 | primary |
| efg | Kurt | yes | 4 | secondary |
| gh | Kurt | yes | 2 | primary |
| hi | Kurt | yes | 3 | primary |
| ab | Kurt | yes | 4 | primary |
| cd | Kurt | yes | 3 | secondary |
| bc | Kurt | yes | 2 | primary |
When I route I should get
| waypoints | route | turns |
| j,i | Kapweg,Kurt,Kurt | depart,turn left,arrive |
| j,o | Kapweg,Kapweg,Kapweg | depart,continue uturn,arrive |
| a,i | Kurt,Kurt,Kurt | depart,continue uturn,arrive |
#http://www.openstreetmap.org/#map=19/52.53731/13.36033
Scenario: Splitting Road to Left
Given the node map
"""
k
.
.
j
.
.
.
a - - - - - - - b - - - - - - c - - - - - - - d - - - - - - e
.
'
f .
.
i
. .
. .
. .
. .
. .
g h
"""
And the nodes
| node | highway |
| i | traffic_signals |
And the ways
| nodes | name | oneway | lanes | highway |
| abc | Perle | no | 4 | secondary |
| cde | Perle | no | 6 | secondary |
| cfg | Heide | yes | 2 | secondary |
| hic | Heide | yes | 3 | secondary |
| cjk | Friede | no | | tertiary |
When I route I should get
| waypoints | route | turns |
| a,g | Perle,Heide,Heide | depart,turn right,arrive |
| a,k | Perle,Friede,Friede | depart,turn left,arrive |
| a,e | Perle,Perle | depart,arrive |
| e,k | Perle,Friede,Friede | depart,turn right,arrive |
| e,g | Perle,Heide,Heide | depart,turn left,arrive |
| h,k | Heide,Friede,Friede | depart,new name slight left,arrive |
| h,e | Heide,Perle,Perle | depart,turn right,arrive |
| h,a | Heide,Perle,Perle | depart,turn left,arrive |
#http://www.openstreetmap.org/#map=19/52.53293/13.32956
Scenario: Curved Exit from Curved Road
Given the node map
"""
g
.
.
f
.
.
.
.
.
e
.
d
'
c \
a - - - - - - b '
h .
i
' . . . j
"""
And the ways
| nodes | name | oneway | lanes | highway |
| abcd | Siemens | no | 5 | secondary |
| defg | Erna | no | 3 | secondary |
| dhij | Siemens | no | | residential |
When I route I should get
| waypoints | route | turns |
| a,j | Siemens,Siemens,Siemens | depart,continue slight right,arrive |
| a,g | Siemens,Erna,Erna | depart,new name slight left,arrive |
| g,j | Erna,Siemens,Siemens | depart,turn sharp left,arrive |
| g,a | Erna,Siemens,Siemens | depart,new name slight right,arrive |
#http://www.openstreetmap.org/#map=19/52.51303/13.32170
Scenario: Ernst Reuter Platz
Given the node map
"""
j g
. .
. .
. .
i h
.' e - - k - - d '.
' .
f c
.
.
.
b
.
.
.
.
a
"""
And the ways
| nodes | name | oneway | lanes | highway |
| abcdk | ernst | yes | 4 | primary |
| ek | ernst | yes | 5 | primary |
| kef | ernst | yes | 4 | primary |
| ghd | march | yes | 3 | secondary |
| eij | otto | yes | 2 | secondary |
When I route I should get
| waypoints | route | turns |
| a,j | ernst,otto,otto | depart,turn slight right,arrive |
| a,f | ernst,ernst | depart,arrive |
#http://www.openstreetmap.org/#map=19/52.52409/13.36829
Scenario: Tiny Curve at Turn
Given the node map
"""
h
|
|
|
|
|
|
f - - - - - - - - i - - g
e |
. d |
a - - - - - - - - - - b - c ' j
"""
And the ways
| nodes | name | oneway | lanes | highway |
| abcdef | ella | no | | residential |
| fig | ella | no | | residential |
| hf | ilse | no | | residential |
| ij | wash | no | | residential |
When I route I should get
| waypoints | route | turns |
| a,g | ella,ella | depart,arrive |
| g,a | ella,ella | depart,arrive |
| g,h | ella,ilse,ilse | depart,turn right,arrive |
| a,h | ella,ilse,ilse | depart,turn left,arrive |
| h,g | ilse,ella,ella | depart,turn left,arrive |
| h,a | ilse,ella,ella | depart,turn right,arrive |
#http://www.openstreetmap.org/#map=18/52.53738/13.36027
Scenario: Merging at Turn - Don't report u-turn
Given the node map
"""
g
.
.
.
.
f
h .
. .
. j
. .
c
. . .
. . .
. . .
. . .
. . .
. . .
. . b
. . .
. . .
. . .
. d .
. . .
. . .
i . .
e a
"""
And the ways
| nodes | name | oneway | lanes | highway |
| abc | Heide | yes | 3 | secondary |
| cde | Heide | yes | 2 | secondary |
| cjf | Perle | yes | 6 | secondary |
| cjf | Perle | no | 6 | secondary |
| fg | Fenn | no | 6 | secondary |
| ch | Friede | no | | tertiary |
| ic | Perle | no | 4 | secondary |
And the nodes
| node | highway |
| j | traffic_signals |
| b | traffic_signals |
When I route I should get
| waypoints | route | turns |
| a,e | Heide,Heide,Heide | depart,continue uturn,arrive |
| a,g | Heide,Fenn,Fenn | depart,turn right,arrive |
| a,h | Heide,Friede,Friede | depart,turn slight left,arrive |
| i,e | Perle,Heide,Heide | depart,turn right,arrive |
| i,h | Perle,Friede,Friede | depart,turn left,arrive |
#http://www.openstreetmap.org/#map=19/52.48630/13.36017
Scenario: Don't Break U-turns
Given the node map
"""
. . . b - - - - - - - - - - a
c '
. ' /
. ' i
d ' /
/
j
|
|
|
|
|
|
e - - - - - - - k
| .
f .
l ' - g - - - - - - - - - - - h
"""
And the ways
| nodes | name | oneway | lanes | highway |
| ab | julius | yes | 2 | secondary |
| gh | julius | yes | 2 | secondary |
| bcd | kolonne | yes | 2 | secondary |
| ekg | kolonne | yes | 2 | secondary |
| cijkf | feurig | yes | | residential |
| fl | feurig | no | | residential |
When I route I should get
| waypoints | route | turns |
| b,g | kolonne,kolonne,kolonne | depart,continue uturn,arrive |
#http://www.openstreetmap.org/#map=19/52.51633/13.42077
Scenario: Service Road at the end with slight offset
Given the node map
"""
d - - - - - - - - - - - - - - e
|
c - - - - - - - - - - - - - - b
|
|
|
|
|
|
|
|
|
a
"""
And the ways
| nodes | name | highway |
| ab | holz | residential |
| bc | | service |
| bde | | service |
When I route I should get
| waypoints | route | turns |
| e,c | , | depart,arrive |
| e,a | ,holz,holz | depart,turn left,arrive |
| c,e | , | depart,arrive |
| c,a | ,holz,holz | depart,turn right,arrive |
| a,c | holz,, | depart,turn left,arrive |
| a,e | holz,, | depart,turn right,arrive |
#http://www.openstreetmap.org/#map=19/52.45037/13.51923
Scenario: Special Turn Road
Given the node map
"""
h - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - g - - - - f
|
|
|
|
|
d - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - e
.
.
.
.
.
a - - - b - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - c
"""
And the ways
| nodes | name | ref | lanes | highway | oneway |
| abc | mich | b9 | 3 | primary | yes |
| fgh | mich | b9 | 3 | primary | yes |
| bdeg | mich | | | primary_link | yes |
When I route I should get
| waypoints | route | ref | turns |
| a,h | mich,mich,mich | b9,b9,b9 | depart,continue uturn,arrive |
#http://www.openstreetmap.org/#map=19/52.49449/13.18116
Scenario: Curved Parking Lot Road
Given the node map
"""
m
|
|
|
|
f - - - - - - - - - - - - - - e - - - - - - - - - - - - - - d
l
k
\
j
i
/
h
g
a - - - - - - - - - - - - - - b - - - - - - - - - - - - - - c
"""
And the ways
| nodes | name | oneway | highway |
| abc | gato | yes | residential |
| def | gato | yes | residential |
| bghijkle | | yes | service |
| em | hain | no | service |
When I route I should get
| waypoints | route | turns |
| a,f | gato,gato,gato | depart,continue uturn,arrive |
| d,m | gato,hain,hain | depart,turn right,arrive |
| a,m | gato,hain,hain | depart,turn left,arrive |
| d,f | gato,gato | depart,arrive |
#http://www.openstreetmap.org/#map=19/52.60831/13.42990
Scenario: Double Curve Turn
Given the node map
"""
_ . d
f - - - - - - - - - - - - - - - - - - - -_- e '
.
g
.
.
.
.
h
. _ c
. .
. .
i .
. .
. .
a - - - - - - - - - - - - - - b
.
.
.
j
.
.
k
"""
And the ways
| nodes | name | oneway | highway | lanes |
| ab | rose | yes | secondary | 2 |
| ef | rose | yes | secondary | 2 |
| de | trift | yes | secondary | 2 |
| bc | trift | yes | secondary | 2 |
| eghibj | muhle | yes | tertiary | 1 |
And the nodes
| node | highway |
| h | traffic_signals |
| j | traffic_signals |
When I route I should get
| waypoints | route | turns |
| a,c | rose,trift,trift | depart,new name slight left,arrive |
| a,k | rose,muhle,muhle | depart,turn slight right,arrive |
| d,f | trift,rose,rose | depart,new name straight,arrive |
| d,k | trift,muhle,muhle | depart,turn sharp left,arrive |
| d,c | trift,trift,trift | depart,continue uturn,arrive |
#http://www.openstreetmap.org/#map=19/52.50740/13.44824
Scenario: Turning Loop at the end of the road
Given the node map
"""
l - - k _
. j
m '
. i
. .
. .
. h
. .
n .
. .
. g
o .
. .
p f
. .
. .
. . e
a - - - - b - - - - c - - - - - - - - - - - - - d '
"""
And the ways
| nodes | name | highway | lanes |
| abcdefghijklmnopc | circled | residential | 1 |
When I route I should get
| waypoints | bearings | route | turns |
| b,a | 90,2 180,180 | circled,circled | depart,arrive |
Scenario: Curved Parking Lot Road
Given the node map
"""
m
|
|
|
|
f - - - - - - - - - - - - - - e - - - - - - - - - - - - - - d
l
k
j
i
h
g
a - - - - - - - - - - - - - - b - - - - - - - - - - - - - - c
"""
And the ways
| nodes | name | oneway | highway |
| abc | gato | yes | residential |
| def | gato | yes | residential |
| bghijkle | | yes | service |
| em | hain | no | service |
When I route I should get
| waypoints | route | turns |
| a,m | gato,hain,hain | depart,turn left,arrive |