Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Flatland
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
elrichgro
Flatland
Commits
a7cf0af3
Commit
a7cf0af3
authored
5 years ago
by
Egli Adrian (IT-SCI-API-PFI)
Browse files
Options
Downloads
Patches
Plain Diff
realistic scene generator : done
parent
4678b94c
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
flatland/envs/generators.py
+71
-87
71 additions, 87 deletions
flatland/envs/generators.py
tests/test_flatland_env_sparse_rail_generator.py
+13
-11
13 additions, 11 deletions
tests/test_flatland_env_sparse_rail_generator.py
with
84 additions
and
98 deletions
flatland/envs/generators.py
+
71
−
87
View file @
a7cf0af3
...
@@ -543,7 +543,7 @@ def random_rail_generator(cell_type_relative_proportion=[1.0] * 11):
...
@@ -543,7 +543,7 @@ def random_rail_generator(cell_type_relative_proportion=[1.0] * 11):
return
generator
return
generator
def
realistic_rail_generator
(
nr_start_goal
=
1
,
nr_extra
=
100
,
min_dist
=
20
,
max_dist
=
99999
,
seed
=
0
):
def
realistic_rail_generator
(
nr_start_goal
=
1
,
seed
=
0
):
"""
"""
Parameters
Parameters
-------
-------
...
@@ -572,18 +572,19 @@ def realistic_rail_generator(nr_start_goal=1, nr_extra=100, min_dist=20, max_dis
...
@@ -572,18 +572,19 @@ def realistic_rail_generator(nr_start_goal=1, nr_extra=100, min_dist=20, max_dis
int(
'
1100000000100010
'
, 2)] # Case 2b (10) - simple switch mirrored
int(
'
1100000000100010
'
, 2)] # Case 2b (10) - simple switch mirrored
"""
"""
def
min_max_cut
(
min_v
,
max_v
,
v
):
return
max
(
min_v
,
min
(
max_v
,
v
))
def
add_rail
(
width
,
height
,
grid_map
,
pt_from
,
pt_via
,
pt_to
,
bAddRemove
=
True
):
def
min_max_cut
(
min_v
,
max_v
,
v
):
return
max
(
min_v
,
min
(
max_v
,
v
))
def
add_rail
(
width
,
height
,
grid_map
,
pt_from
,
pt_via
,
pt_to
,
bAddRemove
=
True
):
gRCTrans
=
np
.
array
([[
-
1
,
0
],
[
0
,
1
],
[
1
,
0
],
[
0
,
-
1
]])
# NESW in RC
gRCTrans
=
np
.
array
([[
-
1
,
0
],
[
0
,
1
],
[
1
,
0
],
[
0
,
-
1
]])
# NESW in RC
lrcStroke
=
[[
min_max_cut
(
0
,
height
-
1
,
pt_from
[
0
]),
lrcStroke
=
[[
min_max_cut
(
0
,
height
-
1
,
pt_from
[
0
]),
min_max_cut
(
0
,
width
-
1
,
pt_from
[
1
])],
min_max_cut
(
0
,
width
-
1
,
pt_from
[
1
])],
[
min_max_cut
(
0
,
height
-
1
,
pt_via
[
0
]),
[
min_max_cut
(
0
,
height
-
1
,
pt_via
[
0
]),
min_max_cut
(
0
,
width
-
1
,
pt_via
[
1
])],
min_max_cut
(
0
,
width
-
1
,
pt_via
[
1
])],
[
min_max_cut
(
0
,
height
-
1
,
pt_to
[
0
]),
[
min_max_cut
(
0
,
height
-
1
,
pt_to
[
0
]),
min_max_cut
(
0
,
width
-
1
,
pt_to
[
1
])]]
min_max_cut
(
0
,
width
-
1
,
pt_to
[
1
])]]
rc3Cells
=
np
.
array
(
lrcStroke
[:
3
])
# the 3 cells
rc3Cells
=
np
.
array
(
lrcStroke
[:
3
])
# the 3 cells
rcMiddle
=
rc3Cells
[
1
]
# the middle cell which we will update
rcMiddle
=
rc3Cells
[
1
]
# the middle cell which we will update
...
@@ -622,27 +623,27 @@ def realistic_rail_generator(nr_start_goal=1, nr_extra=100, min_dist=20, max_dis
...
@@ -622,27 +623,27 @@ def realistic_rail_generator(nr_start_goal=1, nr_extra=100, min_dist=20, max_dis
grid_map
.
set_transition
((
*
rcMiddle
,
mirror
(
liTrans
[
1
])),
grid_map
.
set_transition
((
*
rcMiddle
,
mirror
(
liTrans
[
1
])),
mirror
(
liTrans
[
0
]),
bAddRemove
,
remove_deadends
=
not
bDeadend
)
mirror
(
liTrans
[
0
]),
bAddRemove
,
remove_deadends
=
not
bDeadend
)
def
make_switch_w_e
(
width
,
height
,
grid_map
,
center
):
def
make_switch_w_e
(
width
,
height
,
grid_map
,
center
):
# e -> w
# e -> w
start
=
(
center
[
0
]
+
1
,
center
[
1
]
-
1
)
start
=
(
center
[
0
]
+
1
,
center
[
1
]
-
1
)
via
=
(
center
[
0
],
center
[
1
]
-
1
)
via
=
(
center
[
0
],
center
[
1
]
-
1
)
goal
=
(
center
[
0
],
center
[
1
])
goal
=
(
center
[
0
],
center
[
1
])
add_rail
(
width
,
height
,
grid_map
,
start
,
via
,
goal
)
add_rail
(
width
,
height
,
grid_map
,
start
,
via
,
goal
)
start
=
(
center
[
0
],
center
[
1
]
-
1
)
start
=
(
center
[
0
],
center
[
1
]
-
1
)
via
=
(
center
[
0
]
+
1
,
center
[
1
]
-
1
)
via
=
(
center
[
0
]
+
1
,
center
[
1
]
-
1
)
goal
=
(
center
[
0
]
+
1
,
center
[
1
]
-
2
)
goal
=
(
center
[
0
]
+
1
,
center
[
1
]
-
2
)
add_rail
(
width
,
height
,
grid_map
,
start
,
via
,
goal
)
add_rail
(
width
,
height
,
grid_map
,
start
,
via
,
goal
)
def
make_switch_e_w
(
width
,
height
,
grid_map
,
center
):
def
make_switch_e_w
(
width
,
height
,
grid_map
,
center
):
# e -> w
# e -> w
start
=
(
center
[
0
]
+
1
,
center
[
1
])
start
=
(
center
[
0
]
+
1
,
center
[
1
])
via
=
(
center
[
0
]
+
1
,
center
[
1
]
-
1
)
via
=
(
center
[
0
]
+
1
,
center
[
1
]
-
1
)
goal
=
(
center
[
0
],
center
[
1
]
-
1
)
goal
=
(
center
[
0
],
center
[
1
]
-
1
)
add_rail
(
width
,
height
,
grid_map
,
start
,
via
,
goal
)
add_rail
(
width
,
height
,
grid_map
,
start
,
via
,
goal
)
start
=
(
center
[
0
]
+
1
,
center
[
1
]
-
1
)
start
=
(
center
[
0
]
+
1
,
center
[
1
]
-
1
)
via
=
(
center
[
0
],
center
[
1
]
-
1
)
via
=
(
center
[
0
],
center
[
1
]
-
1
)
goal
=
(
center
[
0
],
center
[
1
]
-
2
)
goal
=
(
center
[
0
],
center
[
1
]
-
2
)
add_rail
(
width
,
height
,
grid_map
,
start
,
via
,
goal
)
add_rail
(
width
,
height
,
grid_map
,
start
,
via
,
goal
)
class
Grid4TransitionsEnum
(
IntEnum
):
class
Grid4TransitionsEnum
(
IntEnum
):
NORTH
=
0
NORTH
=
0
...
@@ -669,10 +670,8 @@ def realistic_rail_generator(nr_start_goal=1, nr_extra=100, min_dist=20, max_dis
...
@@ -669,10 +670,8 @@ def realistic_rail_generator(nr_start_goal=1, nr_extra=100, min_dist=20, max_dis
np
.
random
.
seed
(
seed
+
num_resets
)
np
.
random
.
seed
(
seed
+
num_resets
)
max_n_track_seg
=
np
.
random
.
choice
([
3
,
4
,
5
])
x_offsets
=
np
.
arange
(
0
,
height
,
max_n_track_seg
).
astype
(
int
)
max_n_track_seg
=
4
x_offsets
=
np
.
arange
(
0
,
height
,
max_n_track_seg
).
astype
(
int
)
agents_position
=
[]
agents_position
=
[]
agents_target
=
[]
agents_target
=
[]
...
@@ -681,7 +680,7 @@ def realistic_rail_generator(nr_start_goal=1, nr_extra=100, min_dist=20, max_dis
...
@@ -681,7 +680,7 @@ def realistic_rail_generator(nr_start_goal=1, nr_extra=100, min_dist=20, max_dis
for
off_set_loop
in
range
(
len
(
x_offsets
)):
for
off_set_loop
in
range
(
len
(
x_offsets
)):
off_set
=
x_offsets
[
off_set_loop
]
off_set
=
x_offsets
[
off_set_loop
]
# second track
# second track
data
=
np
.
arange
(
int
((
width
-
4
-
max_n_track_seg
)
/
max_n_track_seg
))
*
max_n_track_seg
+
4
data
=
np
.
arange
(
int
((
width
-
4
-
max_n_track_seg
)
/
max_n_track_seg
))
*
max_n_track_seg
+
4
n_track_seg
=
np
.
random
.
choice
(
max_n_track_seg
)
+
1
n_track_seg
=
np
.
random
.
choice
(
max_n_track_seg
)
+
1
start_track
=
(
off_set
,
0
)
start_track
=
(
off_set
,
0
)
...
@@ -691,86 +690,73 @@ def realistic_rail_generator(nr_start_goal=1, nr_extra=100, min_dist=20, max_dis
...
@@ -691,86 +690,73 @@ def realistic_rail_generator(nr_start_goal=1, nr_extra=100, min_dist=20, max_dis
# track one (full track : left right)
# track one (full track : left right)
if
off_set_loop
>
0
:
if
off_set_loop
>
0
:
if
off_set_loop
%
2
==
1
:
if
off_set_loop
%
2
==
1
:
start_track
=
(
x_offsets
[
off_set_loop
-
1
]
+
1
,
width
-
1
)
start_track
=
(
x_offsets
[
off_set_loop
-
1
]
+
1
,
width
-
1
)
goal_track
=
(
x_offsets
[
off_set_loop
]
-
1
,
width
-
1
)
goal_track
=
(
x_offsets
[
off_set_loop
]
-
1
,
width
-
1
)
new_path
=
connect_rail
(
rail_trans
,
rail_array
,
start_track
,
goal_track
)
new_path
=
connect_rail
(
rail_trans
,
rail_array
,
start_track
,
goal_track
)
add_rail
(
width
,
height
,
grid_map
,
add_rail
(
width
,
height
,
grid_map
,
(
x_offsets
[
off_set_loop
-
1
],
width
-
2
),
(
x_offsets
[
off_set_loop
-
1
],
width
-
2
),
(
x_offsets
[
off_set_loop
-
1
],
width
-
1
),
(
x_offsets
[
off_set_loop
-
1
],
width
-
1
),
(
x_offsets
[
off_set_loop
-
1
]
+
1
,
width
-
1
))
(
x_offsets
[
off_set_loop
-
1
]
+
1
,
width
-
1
))
add_rail
(
width
,
height
,
grid_map
,
add_rail
(
width
,
height
,
grid_map
,
(
x_offsets
[
off_set_loop
],
width
-
2
),
(
x_offsets
[
off_set_loop
],
width
-
2
),
(
x_offsets
[
off_set_loop
],
width
-
1
),
(
x_offsets
[
off_set_loop
],
width
-
1
),
(
x_offsets
[
off_set_loop
]
-
1
,
width
-
1
))
(
x_offsets
[
off_set_loop
]
-
1
,
width
-
1
))
add_rail
(
width
,
height
,
grid_map
,
add_rail
(
width
,
height
,
grid_map
,
(
x_offsets
[
off_set_loop
-
1
],
width
-
1
),
(
x_offsets
[
off_set_loop
-
1
],
width
-
1
),
(
x_offsets
[
off_set_loop
-
1
]
+
1
,
width
-
1
),
(
x_offsets
[
off_set_loop
-
1
]
+
1
,
width
-
1
),
(
x_offsets
[
off_set_loop
-
1
]
+
2
,
width
-
1
))
(
x_offsets
[
off_set_loop
-
1
]
+
2
,
width
-
1
))
add_rail
(
width
,
height
,
grid_map
,
add_rail
(
width
,
height
,
grid_map
,
(
x_offsets
[
off_set_loop
],
width
-
1
),
(
x_offsets
[
off_set_loop
],
width
-
1
),
(
x_offsets
[
off_set_loop
]
-
1
,
width
-
1
),
(
x_offsets
[
off_set_loop
]
-
1
,
width
-
1
),
(
x_offsets
[
off_set_loop
]
-
2
,
width
-
1
))
(
x_offsets
[
off_set_loop
]
-
2
,
width
-
1
))
else
:
else
:
start_track
=
(
x_offsets
[
off_set_loop
-
1
]
+
1
,
0
)
start_track
=
(
x_offsets
[
off_set_loop
-
1
]
+
1
,
0
)
goal_track
=
(
x_offsets
[
off_set_loop
]
-
1
,
0
)
goal_track
=
(
x_offsets
[
off_set_loop
]
-
1
,
0
)
new_path
=
connect_rail
(
rail_trans
,
rail_array
,
start_track
,
goal_track
)
new_path
=
connect_rail
(
rail_trans
,
rail_array
,
start_track
,
goal_track
)
add_rail
(
width
,
height
,
grid_map
,
add_rail
(
width
,
height
,
grid_map
,
(
x_offsets
[
off_set_loop
-
1
],
1
),
(
x_offsets
[
off_set_loop
-
1
],
1
),
(
x_offsets
[
off_set_loop
-
1
],
0
),
(
x_offsets
[
off_set_loop
-
1
],
0
),
(
x_offsets
[
off_set_loop
-
1
]
+
1
,
0
))
(
x_offsets
[
off_set_loop
-
1
]
+
1
,
0
))
add_rail
(
width
,
height
,
grid_map
,
add_rail
(
width
,
height
,
grid_map
,
(
x_offsets
[
off_set_loop
],
1
),
(
x_offsets
[
off_set_loop
],
1
),
(
x_offsets
[
off_set_loop
],
0
),
(
x_offsets
[
off_set_loop
],
0
),
(
x_offsets
[
off_set_loop
]
-
1
,
0
))
(
x_offsets
[
off_set_loop
]
-
1
,
0
))
add_rail
(
width
,
height
,
grid_map
,
add_rail
(
width
,
height
,
grid_map
,
(
x_offsets
[
off_set_loop
-
1
],
0
),
(
x_offsets
[
off_set_loop
-
1
],
0
),
(
x_offsets
[
off_set_loop
-
1
]
+
1
,
0
),
(
x_offsets
[
off_set_loop
-
1
]
+
1
,
0
),
(
x_offsets
[
off_set_loop
-
1
]
+
2
,
0
))
(
x_offsets
[
off_set_loop
-
1
]
+
2
,
0
))
add_rail
(
width
,
height
,
grid_map
,
add_rail
(
width
,
height
,
grid_map
,
(
x_offsets
[
off_set_loop
],
0
),
(
x_offsets
[
off_set_loop
],
0
),
(
x_offsets
[
off_set_loop
]
-
1
,
0
),
(
x_offsets
[
off_set_loop
]
-
1
,
0
),
(
x_offsets
[
off_set_loop
]
-
2
,
0
))
(
x_offsets
[
off_set_loop
]
-
2
,
0
))
for
nbr_track_loop
in
range
(
height
-
1
):
for
nbr_track_loop
in
range
(
height
-
1
):
if
len
(
data
)
<
2
*
n_track_seg
+
1
:
if
len
(
data
)
<
2
*
n_track_seg
+
1
:
break
break
x
=
np
.
sort
(
np
.
random
.
choice
(
data
,
2
*
n_track_seg
,
False
)).
astype
(
int
)
x
=
np
.
sort
(
np
.
random
.
choice
(
data
,
2
*
n_track_seg
,
False
)).
astype
(
int
)
data
=
[]
data
=
[]
for
x_loop
in
range
(
int
(
len
(
x
)
/
2
)):
for
x_loop
in
range
(
int
(
len
(
x
)
/
2
)):
start
=
(
max
(
0
,
min
(
off_set
+
nbr_track_loop
+
1
,
height
-
1
)),
max
(
0
,
min
(
x
[
2
*
x_loop
],
width
-
1
)))
start
=
(
max
(
0
,
min
(
off_set
+
nbr_track_loop
+
1
,
height
-
1
)),
max
(
0
,
min
(
x
[
2
*
x_loop
],
width
-
1
)))
goal
=
(
max
(
0
,
min
(
off_set
+
nbr_track_loop
+
1
,
height
-
1
)),
max
(
0
,
min
(
x
[
2
*
x_loop
+
1
],
width
-
1
)))
goal
=
(
max
(
0
,
min
(
off_set
+
nbr_track_loop
+
1
,
height
-
1
)),
max
(
0
,
min
(
x
[
2
*
x_loop
+
1
],
width
-
1
)))
d
=
np
.
arange
(
x
[
2
*
x_loop
]
+
1
,
x
[
2
*
x_loop
+
1
]
-
1
,
2
)
d
=
np
.
arange
(
x
[
2
*
x_loop
]
+
1
,
x
[
2
*
x_loop
+
1
]
-
1
,
2
)
data
.
extend
(
d
)
data
.
extend
(
d
)
new_path
=
connect_rail
(
rail_trans
,
rail_array
,
start
,
goal
)
new_path
=
connect_rail
(
rail_trans
,
rail_array
,
start
,
goal
)
if
len
(
new_path
)
>
0
:
if
len
(
new_path
)
>
0
:
c
=
(
off_set
+
nbr_track_loop
,
x
[
2
*
x_loop
]
+
1
)
c
=
(
off_set
+
nbr_track_loop
,
x
[
2
*
x_loop
]
+
1
)
make_switch_e_w
(
width
,
height
,
grid_map
,
c
)
make_switch_e_w
(
width
,
height
,
grid_map
,
c
)
c
=
(
off_set
+
nbr_track_loop
,
x
[
2
*
x_loop
+
1
]
+
1
)
c
=
(
off_set
+
nbr_track_loop
,
x
[
2
*
x_loop
+
1
]
+
1
)
make_switch_w_e
(
width
,
height
,
grid_map
,
c
)
make_switch_w_e
(
width
,
height
,
grid_map
,
c
)
if
nbr_track_loop
>
0
:
add_pos
=
(
int
((
start
[
0
]
+
goal
[
0
])
/
2
),
int
((
start
[
1
]
+
goal
[
1
])
/
2
))
add_pos
=
(
int
((
start
[
0
]
+
goal
[
0
])
/
2
),
int
((
start
[
1
]
+
goal
[
1
])
/
2
))
agents_position
.
append
(
add_pos
)
agents_position
.
append
(
add_pos
)
agents_target
.
append
(
add_pos
)
agents_target
.
append
(
add_pos
)
agents_direction
.
append
(
np
.
random
.
choice
([
3
,
1
]))
agents_direction
.
append
(
np
.
random
.
choice
([
3
,
1
]))
print
(
agents_direction
)
print
(
agents_position
)
print
(
agents_target
)
x
=
np
.
arange
(
len
(
agents_direction
))
num_a
=
min
(
num_agents
,
np
.
floor
(
len
(
agents_direction
)
/
2
))
if
num_a
>
1
:
filter_agent
=
np
.
random
.
choice
(
x
,
num_a
,
False
)
agents_position
=
agents_position
[
filter_agent
]
agents_direction
=
agents_direction
[
filter_agent
]
np
.
delete
(
x
,
filter_agent
)
filter_agent
=
np
.
random
.
choice
(
x
,
num_a
,
False
)
agents_target
=
agents_target
[
filter_agent
]
return
grid_map
,
agents_position
,
agents_direction
,
agents_target
,
[
1.0
]
*
len
(
agents_position
)
return
grid_map
,
agents_position
,
agents_direction
,
agents_target
,
[
1.0
]
*
len
(
agents_position
)
...
@@ -838,8 +824,6 @@ def sparse_rail_generator(nr_nodes=100, max_neigbours=2, min_node_dist=20, node_
...
@@ -838,8 +824,6 @@ def sparse_rail_generator(nr_nodes=100, max_neigbours=2, min_node_dist=20, node_
new_path
=
connect_nodes
(
rail_trans
,
rail_array
,
node_positions
[
current_node
],
node_positions
[
neighb
])
new_path
=
connect_nodes
(
rail_trans
,
rail_array
,
node_positions
[
current_node
],
node_positions
[
neighb
])
node_stack
.
pop
(
0
)
node_stack
.
pop
(
0
)
# Generate start and target node directory for all agents
# Generate start and target node directory for all agents
agent_start_targets_nodes
=
[]
agent_start_targets_nodes
=
[]
for
agent_idx
in
range
(
num_agents
):
for
agent_idx
in
range
(
num_agents
):
...
...
This diff is collapsed.
Click to expand it.
tests/test_flatland_env_sparse_rail_generator.py
+
13
−
11
View file @
a7cf0af3
...
@@ -5,19 +5,21 @@ from flatland.envs.observations import GlobalObsForRailEnv
...
@@ -5,19 +5,21 @@ from flatland.envs.observations import GlobalObsForRailEnv
from
flatland.envs.rail_env
import
RailEnv
from
flatland.envs.rail_env
import
RailEnv
from
flatland.utils.rendertools
import
RenderTool
from
flatland.utils.rendertools
import
RenderTool
import
numpy
as
np
def
test_realistic_rail_generator
():
def
test_realistic_rail_generator
():
for
test_loop
in
range
(
20
):
env
=
RailEnv
(
width
=
40
,
num_agents
=
np
.
random
.
randint
(
10
,
30
)
height
=
16
,
env
=
RailEnv
(
width
=
np
.
random
.
randint
(
40
,
80
),
rail_generator
=
realistic_rail_generator
(),
height
=
np
.
random
.
randint
(
10
,
20
),
number_of_agents
=
15
,
rail_generator
=
realistic_rail_generator
(
nr_start_goal
=
num_agents
+
1
,
seed
=
test_loop
),
obs_builder_object
=
GlobalObsForRailEnv
())
number_of_agents
=
num_agents
,
# reset to initialize agents_static
obs_builder_object
=
GlobalObsForRailEnv
())
env_renderer
=
RenderTool
(
env
,
gl
=
"
PILSVG
"
,
)
# reset to initialize agents_static
env_renderer
.
render_env
(
show
=
True
,
show_observations
=
True
,
show_predictions
=
False
)
env_renderer
=
RenderTool
(
env
,
gl
=
"
PILSVG
"
,
)
time
.
sleep
(
10
)
env_renderer
.
render_env
(
show
=
True
,
show_observations
=
True
,
show_predictions
=
False
)
time
.
sleep
(
1
)
env_renderer
.
close_window
()
def
test_sparse_rail_generator
():
def
test_sparse_rail_generator
():
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment