class StreamDrive(object): def __init__(self): # Set up GPIO for RPi GPIO.setmode(GPIO.BOARD) forwardPin = 7 backwardPin = 11 leftPin = 13 rightPin = 15 controlStraightPin = 29 self.motor = Motor(forwardPin, backwardPin, controlStraightPin, leftPin, rightPin) self.sensor = UltrasonicSensor() # Initialize server for receiving driving instructions self.server_socket = socket.socket() self.server_socket.bind(('0.0.0.0', 8000)) self.server_socket.listen(0) self.server_connection, self.client_address = self.server_socket.accept( ) print("Connection from: ", self.client_address) # Initialize client for streaming camera pictures self.client_socket = socket.socket() self.client_socket.connect(('192.168.1.11', 8000)) # Make a file-like object out of the client connection self.client_connection = self.client_socket.makefile('wb') # Start the stream self.stream() def stream(self): try: # Initialize camera and allow some warmup time, create stream self.camera = picamera.PiCamera() self.camera.resolution = (320, 240) self.camera.framerate = 10 time.sleep(2) start = time.time() stream = io.BytesIO() for frame in self.camera.capture_continuous(stream, 'jpeg', use_video_port=True): # Write the length of the capture to the stream # and flush to make sure it gets sent self.client_connection.write(struct.pack('<L', stream.tell())) self.client_connection.flush() # Rewind the stream and send image data through stream.seek(0) self.client_connection.write(stream.read()) # Reset stream for next capture stream.seek(0) stream.truncate() # Write sensor data to server distance = self.sensor.measure_average() self.server_connection.send(struct.pack("f", distance)) # Get the pressed key key = self.server_connection.recv(1024).decode() if (key == "w"): self.motor.forward() elif (key == "s"): self.motor.backward() elif (key == "a"): self.motor.forward_left() elif (key == "d"): self.motor.forward_right() elif (key == "space"): self.motor.stop() elif (key == "x"): print("Program terminated") break else: self.motor.stop() key = "" # Write a length of 0 to the stream to signal we're done self.client_connection.write(struct.pack('<L', 0)) finally: self.client_connection.close() self.client_socket.close() self.server_connection.close() self.server_socket.close() GPIO.cleanup()
forwardPin = 7 backwardPin = 11 leftPin = 13 rightPin = 15 controlStraightPin = 29 motor = Motor(forwardPin, backwardPin, controlStraightPin, leftPin, rightPin) while True: key = get_keys() if (key == "w"): motor.forward() elif (key == "s"): motor.backward() elif (key == "a"): motor.forward_left() elif (key == "d"): motor.forward_right() elif (key == "space"): motor.stop() elif (key == "x"): print("Program terminated") break else: motor.stop() key = "" GPIO.cleanup()