-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdriver.py
More file actions
140 lines (112 loc) · 3.91 KB
/
driver.py
File metadata and controls
140 lines (112 loc) · 3.91 KB
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import csv
import msgParser
import carState
import carControl
from ai_controller import AIController
class Driver(object):
def __init__(self, stage):
self.WARM_UP = 0
self.QUALIFYING = 1
self.RACE = 2
self.UNKNOWN = 3
self.stage = stage
self.parser = msgParser.MsgParser()
self.state = carState.CarState()
self.control = carControl.CarControl()
self.ai_controller = AIController()
self.steer_lock = 0.785398
self.prev_rpm = None
self.training_mode = False # Set to False after training
def init(self):
self.angles = [0 for x in range(19)]
for i in range(5):
self.angles[i] = -90 + i * 15
self.angles[18 - i] = 90 - i * 15
for i in range(5, 9):
self.angles[i] = -20 + (i - 5) * 5
self.angles[18 - i] = 20 - (i - 5) * 5
if not self.training_mode:
self.ai_controller.load_models()
return self.parser.stringify({'init': self.angles})
def drive(self, msg):
self.state.setFromMsg(msg)
if self.training_mode:
self.record_telemetry()
self.steer()
self.gear()
self.speed()
else:
try:
steering, acceleration, gear = self.ai_controller.predict_controls(self.state)
self.control.setSteer(steering)
self.control.setAccel(acceleration)
self.control.setGear(gear)
except Exception as e:
print(f"Error in AI control: {e}")
self.steer()
self.gear()
self.speed()
return self.control.toMsg()
def record_telemetry(self):
with open("telemetry_data.csv", mode="a", newline="") as file:
writer = csv.writer(file)
if file.tell() == 0:
writer.writerow([
"angle", "trackPos", "speedX", "speedY", "speedZ",
"rpm", "gear", "track_edges", "opponents_data",
"race_position", "damage", "distance_raced"
])
writer.writerow([
self.state.angle,
self.state.trackPos,
self.state.speedX,
self.state.speedY,
self.state.speedZ,
self.state.rpm,
self.state.gear,
self.state.track,
self.state.opponents,
self.state.racePos,
self.state.damage,
self.state.distRaced
])
def steer(self):
angle = self.state.angle
dist = self.state.trackPos
self.control.setSteer((angle - dist * 0.5) / self.steer_lock)
def gear(self):
rpm = self.state.getRpm()
gear = self.state.getGear()
speed = self.state.getSpeedX()
if self.prev_rpm is None:
up = True
else:
up = (self.prev_rpm - rpm) < 0
if up and rpm > 7000 and gear < 6:
gear += 1
elif (not up and rpm < 3000 and gear > 1) or (speed < 40 and gear > 1):
gear -= 1
self.prev_rpm = rpm
self.control.setGear(gear)
def speed(self):
track = self.state.getTrack()
# Look at the five forward-facing sensors (angles roughly –20° to +20°)
front_distances = track[7:12]
min_front = min(front_distances)
# If the road is very clear, floor it
if min_front > 200:
accel = 2.0
# If a gentle bend is coming, back off a little
elif min_front > 100:
accel = 0.8
# If a sharper turn is near, slow further
elif min_front > 50:
accel = 0.5
# If the curve is almost on us, crawl in
else:
accel = 0.2
self.control.setAccel(accel)
def onShutDown(self):
pass
def onRestart(self):
pass