Traffic Simulation/SUMO

[Routing] SUMO + TraCI + DQN Routing

rrojin 2022. 2. 15. 17:14

1) environment

netedit

 

구현

netedit 사용해서 7개 node와 20개 edges로 구성된 네트워크를 (.net.xml) 생성한다. 이때 E7, -E7만 제한 속도 10으로 제한하고, 나머지는 agent의 maxSpeed에 맞추어 15로 구성하였다. 추가로, lane위의 vehicle수를 구하기 위해 모든 edge에 laneAreaDetector을 설치하였다. *dqn.add.xml에 lanedetector를 명시하며 pos와 endPos생략시 lane전체를 의미하며 freq 또는 tl은 필수로 입력해야한다.

laneAreaDetector예시) <laneAreaDetector id="-D0" lane="-E0_0" length="100.00" freq ="1" file="dqn_addfile.out"/>

 

목표 : agent는 dynamic traffic상황에서 0번 노드부터 6번 노드까지 최단 시간안에 도착하는 것이다. 

 

 


 

2) Traffic with random routes 

truck : 빨강색 normal_car : 파랑색 dqnAgent : 노랑

vTtype Length Accel Decel maxSpeed sigma Probability
normal_car 5.0 2.0 5.0 12.0 0.5 0.7
truck 8.0 1.0 5.0 5.0 0.5 0.3
agent 5.0 2.0 5.0 15.0 0.5 1

 

Random Route 생성 방법 (for truck & normal_car)

매 에피소드마다 정해진 양의 traffic을 random route로 흘려보내며 dynamic traffic상황을 조성한다.

dqn.add.xml 파일에 <vTypeDistribution>을 지정해준다. 원하는 vType을 생성하고, probability로 각 vType의 생성 비율을 조절해준다. 이 실험에서는 normal_car : car을 7:3비율로 생성한다.

이후, tools/randomTrips.py 을 사용하여 randomRoute를 설정해준다.  traffic volume을 3600초 당 2400대로 계산하여 옵션을 설정하였다.

 

dqn.add.xml

1
2
3
4
5
6
<additional>
        <vTypeDistribution id="type1" >
              <vType id="normal_car" length="5.0" accel="2.0" decel="5.0" maxSpeed="15.0" color="0,1,0" sigma="0.5" guiShape="passenger/van" probability = "0.8"/>
              <vType id="truck" length="8.0" accel="1.0" decel="5.0" maxSpeed="5.0" color="1,0,0" sigma="0.5" guiShape="truck" probability = "0.2"/>
        </vTypeDistribution>             
</additional>
cs
 
terminal cmd in Source code(os.system 사용) 
 
--random : output random route for every episode 

Traffic Volume : To let n vehicles depart between times t0 and t1 set the options

-b t0 -e t1 -p ((t1 - t0) / n)
1
2
cmd_genDemand = "python \"C:/Program Files (x86)/Eclipse/Sumo/tools/randomTrips.py\" -n {} -o {} -r {} -b 0 -e 3600 -p 1.5 --additional-file {} --trip-attributes \"type='type1'\" --random\"".format(net, trip, randomrou, add)
os.system(cmd_genDemand)    
cs

 

 


 

3) State observation

 


 

4) Reward

 


 

5) DQN

DQN Parameter

self.discount_factor=0.99
self.learning_rate = 0.001
self.epsilon=1.0
self.epsilon_decay=0.95
self.epsilon_min = 0.05
self.batch_size = 32    #조절
self.train_start = 500 #조절
 

DQN Model layer

1
2
3
4
5
def __init__(self, action_size):
        super(DQN, self).__init__()
        self.fc1 = Dense(150, activation= 'relu')
        self.fc2 = Dense(100, activation= 'relu')
        self.fc_out = Dense(action_size, kernel_initializer=RandomUniform(-1e-3,1e-3))
cs

 


 

6) Result

Train Result

episode 500을 설정하고 train해보았을 때, Mean Travel TIme이 100~200사이로 수렴하는 것을 확인할 수 있다.

 

EPISODE 분석해보기

episode1: 트럭때문에 아래로 돌아서 감!

episode1

episode1: 트럭때문에 아래로 돌아서 감!

 

 


 

7) Code

 

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

 

GitHub - Rrojin11/SUMO: sumo + RL

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

github.com

>>  python .\DQN\dqnrun.py --nogui -N 500  

-N : episodenum

--nogui : without sumo-gui


 

8) Error 해결

Error1 Answered with error to command 0xa3: Lane '' is not known TOT 1 ACT 1 BUF 1)       

Error1 해결방법

lane을 받아오지 못하는 오류였는데, vehicle.getLaneID와 lane.getEdgeID를 사용하는 대신 vehicle.getRoadID를 통해서 특정 차량의 현재 edge를 구했다. 

        curlane = self.sumo.vehicle.getLaneID(veh)          ---------->      traci.vehicle.getRoadID(veh)
        curedge = self.sumo.lane.getEdgeID(curlane)
  
 

Error2 Keras 모델 저장 오류 

https://stackoverflow.com/questions/51806852/cant-save-custom-subclassed-model

 

Can't save custom subclassed model

Inspired by tf.keras.Model subclassing I created custom model. I can train it and get successfull results, but I can't save it. I use python3.6 with tensorflow v1.10 (or v1.9) Minimal complete c...

stackoverflow.com

 

Error2 해결방법

https://ltlkodae.tistory.com/13

 

케라스(keras) 모델 저장(save) 및 불러오는(load) 2가지 방법

케라스 모델을 저장하고 불러오는 2가지 방법에 대해서 설명드리겠습니다. 모델 만들기 먼저 모델을 만들어야 겠죠? 7개 Layer 로 된 간단한 분류 모델을 만들었습니다. import tensorflow as tf from sklear

ltlkodae.tistory.com

 

Can't save custom subclassed model

Inspired by tf.keras.Model subclassing I created custom model. I can train it and get successfull results, but I can't save it. I use python3.6 with tensorflow v1.10 (or v1.9) Minimal complete c...

stackoverflow.com

나의 경우, keras 모델을 save, load_model 하는게 되지 않아서, 대신 weights만 저장하는 방식을(save_weights, load_weights) 사용했다. 그리고 추가적으로 model.built=True가 필요했다.

1
2
3
4
self.trained_model = self.get_trainedmodel()
self.trained_model.built = True
self.trained_model.load_weights(dirModel+str(num_episode)+'.h5')
 
cs

 

 

 


 

9) 개선점

Emission 정보 추가하기

1) dqn.sumocfg에 <emission-output>파일을 명시하면 emission정보를 확인할 수 있다. 단, vType=='agent'일때만 가능하도록 하고 싶은데, 다른 type에 has.emission.device = false해도 되지 않는다. (이유는 아직 파악하지 못함.) 이러면 모든 차량에 대해서 emission정보를 구하기에 불가피한 정보량까지 모조리 구해버리게 된다.

<output>
        <emission-output value="dqn.emissionoutput.xml"/>
</output>

 

2) 적용해볼 수 있는 다른 방법으로는, vehicle모듈 사용하는 것이다.

getCOEmission

 

Python: module traci._vehicle

        builtins.object StopData traci.domain.Domain(builtins.object) VehicleDomain   class StopData(builtins.object)     StopData(lane='', startPos=-1, endPos=-1, stoppingPlaceID='', stopFlags=0, duration=-1, until=-1, intendedArrival=-1

sumo.dlr.de