Skip to content

Commit 0cde7a9

Browse files
添加 CARLA 端到端自动驾驶项目 (#5198)
* Create README.md * feat: add CARLA end-to-end autonomous driving project files * Create Torcs_End2End_AutonomousDriving * Create README.md * Add TORCS DDPG autonomous driving agent * Delete src/Torcs_End2End_AutonomousDriving * Delete src/Torcs_End2End directory * Create README.md * 修改模块名和脚本入口 * Delete src/CARLA_End2End_AutonomousDriving directory
1 parent 39089be commit 0cde7a9

10 files changed

Lines changed: 1236 additions & 0 deletions

File tree

src/torcs_end2end/ActorNetwork.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import numpy as np
2+
import math
3+
import torch as t
4+
import torch.nn as nn
5+
import torch.nn.functional as F
6+
from torch.autograd import Variable as V
7+
8+
9+
HIDDEN1_UNITS = 300
10+
HIDDEN2_UNITS = 600
11+
12+
class ActorNetwork(nn.Module):
13+
def __init__(self, state_size):
14+
super(ActorNetwork, self).__init__()
15+
self.fc1 = nn.Linear(state_size, HIDDEN1_UNITS)
16+
self.fc2 = nn.Linear(HIDDEN1_UNITS, HIDDEN2_UNITS)
17+
self.steering = nn.Linear(HIDDEN2_UNITS, 1)
18+
nn.init.normal_(self.steering.weight, 0, 1e-4)
19+
self.acceleration = nn.Linear(HIDDEN2_UNITS, 1)
20+
nn.init.normal_(self.acceleration.weight, 0, 1e-4)
21+
self.brake = nn.Linear(HIDDEN2_UNITS, 1)
22+
nn.init.normal_(self.brake.weight, 0, 1e-4)
23+
24+
25+
def forward(self, x):
26+
x = F.relu(self.fc1(x))
27+
x = F.relu(self.fc2(x))
28+
out1 = t.tanh(self.steering(x))
29+
out2 = t.sigmoid(self.acceleration(x))
30+
out3 = t.sigmoid(self.brake(x))
31+
out = t.cat((out1, out2, out3), 1)
32+
return out
33+
34+
35+
36+

src/torcs_end2end/CriticNetwork.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import numpy as np
2+
import math
3+
import torch
4+
import torch.nn as nn
5+
import torch.nn.functional as F
6+
7+
HIDDEN1_UNITS = 300
8+
HIDDEN2_UNITS = 600
9+
10+
class CriticNetwork(nn.Module):
11+
def __init__(self, state_size, action_size):
12+
super(CriticNetwork, self).__init__()
13+
self.w1 = nn.Linear(state_size, HIDDEN1_UNITS)
14+
self.a1 = nn.Linear(action_size, HIDDEN2_UNITS)
15+
self.h1 = nn.Linear(HIDDEN1_UNITS, HIDDEN2_UNITS)
16+
self.h3 = nn.Linear(HIDDEN2_UNITS, HIDDEN2_UNITS)
17+
self.V = nn.Linear(HIDDEN2_UNITS, action_size)
18+
19+
def forward(self, s, a):
20+
w1 = F.relu(self.w1(s))
21+
a1 = self.a1(a)
22+
h1 = self.h1(w1)
23+
h2 = h1 + a1
24+
h3 = F.relu(self.h3(h2))
25+
out = self.V(h3)
26+
return out

src/torcs_end2end/OU.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import random
2+
import numpy as np
3+
4+
class OU():
5+
"""
6+
Ornstein-Uhlenbeck (OU) 过程类
7+
OU过程是一种均值回归的随机过程,常用于模拟具有均值回归特性的随机波动。
8+
"""
9+
def function(self, x, mu, theta, sigma):
10+
return theta * (mu - x) + sigma * np.random.randn(1)

src/torcs_end2end/README.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# TORCS 自动驾驶强化学习项目
2+
3+
## 项目概述
4+
本项目基于 TORCS 模拟器,使用深度确定性策略梯度(DDPG)算法实现自动驾驶。智能体通过强化学习学习驾驶策略,能够在赛道上自主行驶。
5+
6+
本项目是对 https://github.com/jastfkjg/DDPG_Torcs_PyTorch.git 的复现,并针对实验中出现的问题对代码进行改进。
7+
8+
## 文件结构
9+
```text
10+
├── snakeoil3_gym.py # TORCS客户端通信接口
11+
├── gym_torcs.py # OpenAI Gym环境封装
12+
├── main.py # DDPG算法主训练脚本
13+
├── ActorNetwork.py # Actor网络定义
14+
├── CriticNetwork.py # Critic网络定义
15+
├── ReplayBuffer.py # 经验回放缓冲区
16+
├── OU.py # Ornstein-Uhlenbeck噪声过程
17+
├── autostart.sh # TORCS自动启动脚本
18+
└── Runtime_Screenshot.jpg # 运行时截图
19+
```
20+
21+
## 环境配置要求
22+
* Python 3
23+
* [gym_torcs](https://github.com/ugo-nama-kun/gym_torcs)
24+
* PyTorch 0.4.1
25+
26+
## 运行方法
27+
```
28+
git clone https://github.com/jastfkjg/DDPG_Torcs_PyTorch.git
29+
cd DDPG_Torcs_PyTorch
30+
python main.py
31+
32+
```
33+
34+
## 项目运行截图
35+
<p>
36+
<img src="Runtime_Screenshot.jpg" alt="TORCS 仿真运行界面" width="600">
37+
</p>

src/torcs_end2end/ReplayBuffer.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from collections import deque
2+
import random
3+
4+
class ReplayBuffer():
5+
6+
def __init__(self, buffer_size):
7+
self.buffer_size = buffer_size
8+
self.num_experiences = 0
9+
self.buffer = deque()
10+
11+
def getBatch(self, batch_size):
12+
if self.num_experiences < batch_size:
13+
return random.sample(self.buffer, self.num_experiences)
14+
else:
15+
return random.sample(self.buffer, batch_size)
16+
17+
def size(self):
18+
return self.buffer_size
19+
20+
def add(self, state, action, reward, new_state, done):
21+
experience = (state, action, reward, new_state, done)
22+
if self.num_experiences < self.buffer_size:
23+
self.buffer.append(experience)
24+
self.num_experiences += 1
25+
else:
26+
self.buffer.popleft()
27+
self.buffer.append(experience)
28+
29+
def count(self):
30+
return self.num_experiences
31+
32+
def erase(self):
33+
self.buffer = deque()
34+
self.num_experiences = 0
35+
91.2 KB
Loading

src/torcs_end2end/autostart.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#!/bin/bash
2+
xte 'key Return'
3+
xte 'usleep 100000'
4+
xte 'key Return'
5+
xte 'usleep 100000'
6+
xte 'key Up'
7+
xte 'usleep 100000'
8+
xte 'key Up'
9+
xte 'usleep 100000'
10+
xte 'key Return'
11+
xte 'usleep 100000'
12+
xte 'key Return'

0 commit comments

Comments
 (0)