added a brain, need to listen to it

This commit is contained in:
2019-10-21 15:19:50 +02:00
parent 06c54f50fa
commit c31a338957
7 changed files with 253 additions and 162 deletions

188
main.py
View File

@@ -1,25 +1,23 @@
#!/usr/bin/env python
import math
import pygame
from pygame.locals import HWSURFACE, DOUBLEBUF
import random
import numpy as np
from brain import Neural_Network
from maps import map1
from trigo import angle_to_vector, get_line_feats, segments_intersection, distance
from params import FLAGS, GX, GY, CELL_COLOR, CAR_SIZE, VISION_LENGTH, VISION_SPAN, THROTTLE_POWER
FLAGS= HWSURFACE | DOUBLEBUF #| FULLSCREEN
GX = 1000
GY = 1000
CELL_COLOR = (80,80,80)
CAR_SIZE=25
VISION_LENGTH = 50
VISION_SPAN = 25 # degrees
THROTTLE_POWER = 3
pygame.init()
IMG = pygame.image.load("car25.png")#.convert()
class Car(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
@@ -33,7 +31,7 @@ class Car(pygame.sprite.Sprite):
self.rect = self.image.get_rect()
self.rect.center = (75, GY -50)
self.speed = 5
self.speed = 0.5
self.heading = 0
self.heading_change = 0
self.vision_length = VISION_LENGTH # line liength
@@ -50,13 +48,13 @@ class Car(pygame.sprite.Sprite):
self.center_sensor = None
self.left_sensor = None
self.right_sensor = None
self.update_sensors()
self.sensors = [self.left_sensor, self.center_sensor, self.right_sensor]
self.probes = [self.vision_length] *3
self.heading_change = 0
self.throttle = 0
self.brain = Neural_Network()
self.update_sensors()
self.probe_brain()
def update_sensors(self):
center = self.rect.center
@@ -77,37 +75,6 @@ class Car(pygame.sprite.Sprite):
self.update_sensors()
def update(self):
# rotate
old_center = self.rect.center
self.image = pygame.transform.rotate(self.original_image, self.heading)
self.rect = self.image.get_rect()
self.rect.center = old_center
self.update_position()
if self.speed :
self.heading += self.heading_change / self.speed
self.heading = self.heading % 360
if self.throttle :
self.speed += THROTTLE_POWER
else :
self.speed -= THROTTLE_POWER
self.speed = max(0, self.speed)
super().update()
def show_features(self):
if self.draw_sensors:
pygame.draw.line(screen, (255,0,0), self.center_sensor[0], self.center_sensor[1])
pygame.draw.line(screen, (0,255,0), self.left_sensor[0], self.left_sensor[1])
pygame.draw.line(screen, (0,0,255), self.right_sensor[0], self.right_sensor[1])
pygame.draw.circle(screen, (125,255,125), self.rect.center, 4, 2)
def probe_lines_proximity(self, lines):
# print(self.center_sensor, lines[0])
@@ -122,7 +89,52 @@ class Car(pygame.sprite.Sprite):
self.probes[idx] = min(dist, self.probes[idx])
# else :
# self.probes[idx] = self.vision_length * 2
print(self.probes)
# print(self.probes)
def probe_brain(self):
res = self.brain.predict(np.array(self.probes))
self.heading_change = res[0] * 10
self.throttle = res[1] * 10
def update(self):
# rotate
old_center = self.rect.center
self.image = pygame.transform.rotate(self.original_image, self.heading)
self.rect = self.image.get_rect()
self.rect.center = old_center
self.update_position()
print(
'Speed', self.speed,
'heading', self.heading,
'throttle', self.throttle,
'heading change', self.heading_change,
)
if self.speed :
self.heading += self.heading_change * 10 / self.speed
self.heading = self.heading % 360
self.speed += self.throttle #THROTTLE_POWER
# if self.throttle :
# self.speed += self.throttle #THROTTLE_POWER
# else :
# self.speed -= self.throttle #THROTTLE_POWER
self.speed = max(0, self.speed)
super().update()
def show_features(self):
if self.draw_sensors:
pygame.draw.line(screen, (255,0,0), self.center_sensor[0], self.center_sensor[1])
pygame.draw.line(screen, (0,255,0), self.left_sensor[0], self.left_sensor[1])
pygame.draw.line(screen, (0,0,255), self.right_sensor[0], self.right_sensor[1])
pygame.draw.circle(screen, (125,255,125), self.rect.center, 4, 2)
@@ -131,80 +143,17 @@ class Car(pygame.sprite.Sprite):
screen = pygame.display.set_mode((GX, GY), FLAGS)
screen.set_alpha(None)
map_lines = map1
# print(lines)
all_cars = pygame.sprite.Group()
# car = Car()
# car.heading = 0
# all_cars.add(car)
car2 = Car()
car2.heading = 0
car2.heading_change = 30
car2.speed = 25
all_cars.add(car2)
ip = segments_intersection(car2.center_sensor, car2.left_sensor)
# print(math.hypot(ip[0] - car2.rect.center[0], ip[1] - car2.rect.center[1]))
# stress test
# for x in range(100):
# car = Car()
# car.heading=x
# car.heading_change = int(x)/30
# car.speed = int(random.random()*6)
# all_cars.add(car)
# lines = [
# [
# (
# int(random.random()*GX),
# int(random.random()*GY)
# ),(
# int(random.random()*GX),
# int(random.random()*GY)
# )
# ]
# for x in range(10)
# ]
path = [
(25, int(GY-25)),
(int(GX/2), int(GY-25)),
(int(GX/2 + 75), int(GY-150)),
(int(GX/2 + 150), int(GY-150)),
(int(GX -75), int(GY/2)),
(int(GX/2), int(GY/2 - 75)),
(int(GX/2), int(GY/2 - 150)),
(int(GX -50), int( GY/4 )),
(int(3*GX/4 - 50), int(50)),
(int(50), int(50)),
(int(100), int(GY/2)),
(25, int(GY-25)),
]
path2 = [
(100, int(GY-85)),
(int(GX/2 - 50 ), int(GY-85)),
(int(GX/2 + 50), int(GY-210)),
(int(GX/2 + 110), int(GY-210)),
(int(GX - 170), int(GY/2 + 30)),
(int(GX/2 - 60 ), int(GY/2 - 20)),
(int(GX/2 - 60), int(GY/2 - 200)),
(int(GX -170), int( GY/4 -20)),
(int(3*GX/4 - 100), int(120)),
(int(120), int(120)),
(int(175), int(GY/2)),
(100, int(GY-85)),
]
lines = [[path[i], path[i+1]] for i in range(len(path)-1)]
lines2 = [[path2[i], path2[i+1]] for i in range(len(path2)-1)]
lines = lines + lines2
print(lines)
for x in range(1):
car = Car()
car.heading = x * 30 + 35
all_cars.add(car)
clock = pygame.time.Clock()
while True :
@@ -213,9 +162,10 @@ while True :
all_cars.draw(screen)
for c in all_cars :
c.show_features()
c.probe_lines_proximity(lines)
c.probe_lines_proximity(map_lines)
c.probe_brain()
for line in lines :
for line in map_lines :
pygame.draw.line(screen, (255,255,255), line[0], line[1])
# point = (int(GX/2), int(GY/2+25))