Traffic Simulation/SUMO

[Routing] SUMO + TraCI + Random Routing

rrojin 2022. 2. 8. 14:17

Code

https://github.com/Rrojin11/SUMO/tree/master/Random

 

GitHub - Rrojin11/SUMO: sumo + RL

sumo + RL. Contribute to Rrojin11/SUMO development by creating an account on GitHub.

github.com

 

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