Code
https://github.com/Rrojin11/SUMO/tree/master/Random
random_run : 랜덤으로 루트를 변경합니다.
함수 1 : random_run [수정전]
현재 edge에서 다음으로 통과할 수 있는 edge들을 계산하고, 그 중에서 랜덤으로 nextedge를 고릅니다.
이후 traci.vehicle.changeTarget('veh0',nextedge) 코드를 통해 다음 루트를 지정합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
def random_run(alldets):
step = 0
traci.route.add("rou1", ["E19", "E0", "E1","E2","E3","E4"]) #default route
traci.vehicle.add("veh0", "rou1")
while traci.simulation.getMinExpectedNumber() > 0:
traci.simulationStep()
try:
#get current edge
curlane = traci.vehicle.getLaneID("veh0")
curedge = traci.lane.getEdgeID(curlane)
curdet = curedge.replace('E','D')
if curdet in alldets and traci.inductionloop.getLastStepVehicleNumber(curdet)>0:
#get possible toedges (= target for nextedge)
toedges = get_toedges(net, curedge)
#print("To Edges: ", toedges)
#choose next edge randomly
nextedge = random.choice(toedges)
print(nextedge,end=' -> ')
traci.vehicle.changeTarget('veh0',nextedge)
except:
print('error')
pass
step += 1
traci.close()
sys.stdout.flush()
|
cs |
함수 1_1 : random_run [수정후]
수정전 random_run함수는 자동차의 속도와 detector의 위치 싱크가 맞지않아 detector를 그냥 지나칠때 nextedge를 고를 수 없게되고, 그로 인해서 veh0의 루트가 끊기는 문제가 발생하였다. 다음 루트가 지정되지 않은 vehicle은 "veh0 is unknown"과 같은 오류를 남긴다.
따라서, detector로 루트 변경 여부를 결정하지않고, edge가 변경될 때마다 다음 nextedge를 고르는 방식으로 변경하였다. 현재edge와 이전edge를 비교하여 달라질 때마다, 새로운 nextedge를 루트로 지정한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
def random_run(edgelists):
#routing randomly by changing the route when any detector that located in the end of each lane is occured.
edgelists = edgelists
step = 0
traci.route.add("rou1", ["E19", "E0", "E1","E2","E3","E4"]) #default route
traci.vehicle.add("veh0", "rou1")
print('[ Veh0 Random Routes ]')
traci.simulationStep()
beforelane = traci.vehicle.getLaneID("veh0")
beforeedge = traci.lane.getEdgeID(beforelane)
print(beforeedge,end=' -> ') #start point
while traci.simulation.getMinExpectedNumber() > 0:
traci.simulationStep()
#print("before : ",beforeedge)
try:
#get current edges
curlane = traci.vehicle.getLaneID("veh0") # ** Error Point (2022/2/8) : Detector 지우고 edge변경시 routesetting하는 걸로 해결 가능 **
curedge = traci.lane.getEdgeID(curlane)
#curdet = curedge.replace('E','D') #골인 부분에서만 detector사용
#print('current : ', curedge)
if traci.inductionloop.getLastStepVehicleNumber("D4")>0 or traci.inductionloop.getLastStepVehicleNumber("-D0")>0: #골인 detector
print("[ Veh0 Arrived ]")
traci.close()
if curedge in edgelists and curedge !=beforeedge : #이전edge와 달라지면 nextedge결정
#if curdet in alldets and traci.inductionloop.getLastStepVehicleNumber(curdet)>0:
toedges = get_toedges(net, curedge)#get possible toedges (= target for nextedge)
nextedge = random.choice(toedges)#choose next edge randomly
print(curedge,end=' -> ')
traci.vehicle.changeTarget('veh0',nextedge)
beforeedge = curedge
except:
print('Simulation error occured. ')
break
step += 1
traci.close()
sys.stdout.flush()
|
cs |
'Traffic Simulation > SUMO' 카테고리의 다른 글
OSM에 쿼리 적용하여 SUMO지도 생성(Overpass Turbo) (2) | 2022.02.23 |
---|---|
[Routing] SUMO + TraCI + DQN Routing (1) | 2022.02.15 |
[Routing] SUMO + TraCI + Qlearning Routing (0) | 2022.02.14 |
[Tutorial] TraCI4Traffic Lights (0) | 2022.02.05 |
[Tutorial] Hello SUMO (2) | 2022.02.04 |