%pip install aitk aitk.robots keras numpy opencv-python-headless matplotlib requests
# Dos caminos para la red, y cada uno pide algo distinto:
# - `aitk.networks.SimpleNetwork` es el mas simple y se integra con aitk.robots, pero por
# dentro usa TensorFlow. En Colab ya viene instalado y funciona sin mas.
# - `keras` 3 es agnostico del backend (TensorFlow en Colab, PyTorch en local) y no necesita
# TensorFlow. Es el camino que funciona en cualquier entorno.
import os
os.environ.setdefault("KERAS_BACKEND", "torch")
Preparamos el entorno¶
import aitk.robots as bots
import aitk.networks as nets
import numpy as np
import matplotlib.pyplot as plt
import cv2
import requests
nom_imatge = "EX2_pista_6.png"
# Carreguem la imatge en una variable
img = cv2.imread(nom_imatge)
# Mostrem la imatge
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
<matplotlib.image.AxesImage at 0x7d964892d810>
world = bots.World(220, 180, boundary_wall_color="yellow", ground_image_filename=nom_imatge)
robot = bots.Scribbler(x=36, y=90, a=90)
robot.add_device(bots.GroundCamera(width=100, height=50))
world.add_robot(robot)
robot['ground-camera'].watch()
world.watch()
Random seed set to: 2452170
HTML(value='<style>img.pixelated {image-rendering: pixelated;}</style>') HTML(value='<style>img.pixelated {image-rendering: pixelated;}</style>') HTML(value='<style>img.pixelated {image-rendering: pixelated;}</style>') Image(value=b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00d\x00\x00\x002\x08\x06\x00\x00\x00\xaa5~\xbe\x00\…
Image(value=b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x08\x06\x0…
Generación de valores de movimiento y rotación¶
En la práctica anterior controlamos directamente el robot usando robot.move(translate, rotate). Ahora queremos mover el robot y guardar los movimientos en un archivo. Para hacer esto, crearemos una función llamada determine_move que tomará los valores actuales de los sensores y devuelva una tupla que represente las cantidades de traslación y rotación apropiadas para esta situación, junto el valor central de la carretera. Esta función será llamada por la función move que controla el robot.
def determine_move(robot):
"""
Determina el movimiento del robot según las lecturas de sus sensores.
Devuelva una tupla con la velocidad de traslación, la velocidad de rotación y el valor central de la carretera.
El robot debe permanecer dentro de la pista durante el tiempo que dure la simulación.
"""
cam = robot['ground-camera']
image = cam.get_image()
# Convirtemos la imagen en una matriz numpy para trabajar en OpenCV
# Nos quedamos con la parte superior de la imagen
# convertir a escala de grises
# Aplicamos un filtro de desenfoque gaussiano
# Binarizamos la imagen (treshold)
# Buscamos los contornos
# Dibujamos los contornos
# Definir las variables que se devolveran
# Calculamos el centro de masas del borde más grande
# En m tenemos los momentos de la imagen
# Si el área es diferente de 0, calculamos el centro de masa
# Dibujamos el centro de la masa
# Movemos el robot
return moviment, rotacio, centre
Probando la función determine_move¶
Necesitamos probar la función determine_move Y verifique que todavía controla correctamente el robot para seguir la pared. Para hacer esto, llamaremos a la función determine_move en un bucle y llamaremos robot.move con los valores de movimiento devueltos por la función determine_move. Esto debería hacer que el robot pase por el circuito sin ningún problema.
def controlador_cam(robot):
translate, rotate, centre = determine_move(robot)
robot.move(translate, rotate)
world.reset()
world.seconds(30, [controlador_cam], real_time=True)
0%| | 0/300 [00:00<?, ?it/s]
Simulation stopped at: 00:00:30.00; speed 0.96 x real time
Generación de datos de entrenamiento¶
Ahora tenemos todas las piezas en el sitio para generar los datos de entrenamiento.
Queremos generar un conjunto de entrenamiento para nuestra red neuronal y el simulador de tiempo real será demasiado lento. Por lo tanto, utilizaremos la versión NO a tiempo real del simulador. Por eso usarém realtime = False cuando llamemos a world.seconds.
También debemos tener en cuenta, que para entrenar una red neuronal, todos los valores de los datos deben estar estandarizados para ajustarse al intervalo de la función de activación que utilizaremos. Usaremos una función de activación con un intervalo de [-1,1], ya que las órdenes del motor pueden ser negativas o positivas. Los valores del centro de la carretera estarán en el intervalo [0,100] por lo que la estandarización será simple: dividiremos por 100.
En cada línea del archivo que crearemos habrá valores de los sensores, separados por espacios en blanco, seguidos de órdenes de motor separados por espacios en blanco, que terminan con un salto de línea.
Un problema que tenemos que abordar es que nuestro programa de viajar por el circuito se puede detener en ciertas situaciones o volver hacia atrás. Debemos construir nuestra función de generación de datos con esto en mente. Por ejemplo, si se detiene el robot, no queremos que los datos de entrenamiento reflejen esta situación.
Crearemos la función generate_data para generar una lista de datos de entrenamiento.Esta característica debe generar un número fijo de datos de entrenamiento. Para cada iteración de entrenamiento, la función debe llamarinici_aleatori Para establecer la posición del robot en una ubicación aleatoria, reinicie el mundo y ejecute una simulación.
# Redefinimos la función controlador_cam para que añada los valores devueltos a "data"
def controlador_cam(robot):
global data
translate, rotate, centre = determine_move(robot)
robot.move(translate, rotate)
data.append([centre, translate, rotate])
# Generamos los datos de manera masiva
def generate_data(robot, world, trials):
generate_data(robot, world, 20)
0%| | 0/300 [00:00<?, ?it/s]
Simulation stopped at: 00:00:30.00; speed 43.44 x real time
data
[[50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [51, 1, 0], [51, 1, 0], [52, 1, 0], [53, 1, 0], [53, 1, 0], [54, 1, 0], [56, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [57, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [54, 1, 0], [53, 1, 0], [53, 1, 0], [52, 1, 0], [52, 1, 0], [51, 1, 0], [50, 1, 0], [50, 1, 0], [49, 1, 0], [48, 1, 0], [47, 1, 0], [47, 1, 0], [46, 1, 0], [45, 1, 0], [44, 1, 0.3], [44, 1, 0.3], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [46, 1, 0], [46, 1, 0], [47, 1, 0], [47, 1, 0], [47, 1, 0], [48, 1, 0], [49, 1, 0], [50, 1, 0], [51, 1, 0], [52, 1, 0], [53, 1, 0], [55, 1, 0], [57, 1, -0.3], [58, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [54, 1, 0], [54, 1, 0], [57, 1, -0.3], [58, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [55, 1, 0], [55, 1, 0], [55, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [54, 1, 0], [53, 1, 0], [53, 1, 0], [51, 1, 0], [51, 1, 0], [50, 1, 0], [49, 1, 0], [49, 1, 0], [48, 1, 0], [48, 1, 0], [47, 1, 0], [47, 1, 0], [46, 1, 0], [45, 1, 0], [46, 1, 0], [45, 1, 0], [46, 1, 0], [46, 1, 0], [47, 1, 0], [47, 1, 0], [48, 1, 0], [50, 1, 0], [52, 1, 0], [55, 1, 0], [57, 1, -0.3], [59, 1, -0.3], [60, 1, -0.3], [61, 1, -0.3], [62, 1, -0.3], [63, 1, -0.3], [64, 1, -0.3], [66, 1, -0.3], [67, 1, -0.3], [69, 1, -0.3], [70, 1, -0.3], [72, 1, -0.3], [72, 1, -0.3], [73, 1, -0.3], [73, 1, -0.3], [73, 1, -0.3], [73, 1, -0.3], [72, 1, -0.3], [71, 1, -0.3], [70, 1, -0.3], [68, 1, -0.3], [66, 1, -0.3], [63, 1, -0.3], [60, 1, -0.3], [57, 1, -0.3], [53, 1, 0], [48, 1, 0], [45, 1, 0], [41, 1, 0.3], [39, 1, 0.3], [37, 1, 0.3], [36, 1, 0.3], [36, 1, 0.3], [37, 1, 0.3], [37, 1, 0.3], [39, 1, 0.3], [40, 1, 0.3], [42, 1, 0.3], [45, 1, 0], [48, 1, 0], [49, 1, 0], [52, 1, 0], [54, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [54, 1, 0], [55, 1, 0], [56, 1, -0.3], [55, 1, 0], [57, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [54, 1, 0], [54, 1, 0], [53, 1, 0], [54, 1, 0], [56, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [54, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [54, 1, 0], [55, 1, 0], [54, 1, 0], [54, 1, 0], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [56, 1, -0.3], [56, 1, -0.3], [54, 1, 0], [54, 1, 0], [55, 1, 0], [57, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [59, 1, -0.3], [60, 1, -0.3], [60, 1, -0.3], [60, 1, -0.3], [60, 1, -0.3], [60, 1, -0.3], [61, 1, -0.3], [60, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [55, 1, 0], [54, 1, 0], [53, 1, 0], [52, 1, 0], [52, 1, 0], [52, 1, 0], [51, 1, 0], [51, 1, 0], [51, 1, 0], [51, 1, 0], [51, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [51, 1, 0], [51, 1, 0], [52, 1, 0], [53, 1, 0], [53, 1, 0], [54, 1, 0], [56, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [57, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [54, 1, 0], [53, 1, 0], [53, 1, 0], [52, 1, 0], [52, 1, 0], [51, 1, 0], [50, 1, 0], [50, 1, 0], [49, 1, 0], [48, 1, 0], [47, 1, 0], [47, 1, 0], [46, 1, 0], [45, 1, 0], [44, 1, 0.3], [44, 1, 0.3], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [46, 1, 0], [46, 1, 0], [47, 1, 0], [47, 1, 0], [47, 1, 0], [48, 1, 0], [49, 1, 0], [50, 1, 0], [51, 1, 0], [52, 1, 0], [53, 1, 0], [55, 1, 0], [57, 1, -0.3], [58, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [54, 1, 0], [54, 1, 0], [57, 1, -0.3], [58, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [55, 1, 0], [55, 1, 0], [55, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [54, 1, 0], [53, 1, 0], [53, 1, 0], [51, 1, 0], [51, 1, 0], [50, 1, 0], [49, 1, 0], [49, 1, 0], [48, 1, 0], [48, 1, 0], [47, 1, 0], [47, 1, 0], [46, 1, 0], [45, 1, 0], [46, 1, 0], [45, 1, 0], [46, 1, 0], [46, 1, 0], [47, 1, 0], [47, 1, 0], [48, 1, 0], [50, 1, 0], [52, 1, 0], [55, 1, 0], [57, 1, -0.3], [59, 1, -0.3], [60, 1, -0.3], [61, 1, -0.3], [62, 1, -0.3], [63, 1, -0.3], [64, 1, -0.3], [66, 1, -0.3], [67, 1, -0.3], [69, 1, -0.3], [70, 1, -0.3], [72, 1, -0.3], [72, 1, -0.3], [73, 1, -0.3], [73, 1, -0.3], [73, 1, -0.3], [73, 1, -0.3], [72, 1, -0.3], [71, 1, -0.3], [70, 1, -0.3], [68, 1, -0.3], [66, 1, -0.3], [63, 1, -0.3], [60, 1, -0.3], [57, 1, -0.3], [53, 1, 0], [48, 1, 0], [45, 1, 0], [41, 1, 0.3], [39, 1, 0.3], [37, 1, 0.3], [36, 1, 0.3], [36, 1, 0.3], [37, 1, 0.3], [37, 1, 0.3], [39, 1, 0.3], [40, 1, 0.3], [42, 1, 0.3], [45, 1, 0], [48, 1, 0], [49, 1, 0], [52, 1, 0], [54, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [54, 1, 0], [55, 1, 0], [56, 1, -0.3], [55, 1, 0], [57, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [54, 1, 0], [54, 1, 0], [53, 1, 0], [54, 1, 0], [56, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [54, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [54, 1, 0], [55, 1, 0], [54, 1, 0], [54, 1, 0], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [56, 1, -0.3], [56, 1, -0.3], [54, 1, 0], [54, 1, 0], [55, 1, 0], [57, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [59, 1, -0.3], [60, 1, -0.3], [60, 1, -0.3], [60, 1, -0.3], [60, 1, -0.3], [60, 1, -0.3], [61, 1, -0.3], [60, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [55, 1, 0], [54, 1, 0], [53, 1, 0], [52, 1, 0], [52, 1, 0], [52, 1, 0], [51, 1, 0], [51, 1, 0], [51, 1, 0], [51, 1, 0], [51, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [51, 1, 0], [51, 1, 0], [52, 1, 0], [53, 1, 0], [53, 1, 0], [54, 1, 0], [56, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [57, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [54, 1, 0], [53, 1, 0], [53, 1, 0], [52, 1, 0], [52, 1, 0], [51, 1, 0], [50, 1, 0], [50, 1, 0], [49, 1, 0], [48, 1, 0], [47, 1, 0], [47, 1, 0], [46, 1, 0], [45, 1, 0], [44, 1, 0.3], [44, 1, 0.3], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [46, 1, 0], [46, 1, 0], [47, 1, 0], [47, 1, 0], [47, 1, 0], [48, 1, 0], [49, 1, 0], [50, 1, 0], [51, 1, 0], [52, 1, 0], [53, 1, 0], [55, 1, 0], [57, 1, -0.3], [58, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [54, 1, 0], [54, 1, 0], [57, 1, -0.3], [58, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [55, 1, 0], [55, 1, 0], [55, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [54, 1, 0], [53, 1, 0], [53, 1, 0], [51, 1, 0], [51, 1, 0], [50, 1, 0], [49, 1, 0], [49, 1, 0], [48, 1, 0], [48, 1, 0], [47, 1, 0], [47, 1, 0], [46, 1, 0], [45, 1, 0], [46, 1, 0], [45, 1, 0], [46, 1, 0], [46, 1, 0], [47, 1, 0], [47, 1, 0], [48, 1, 0], [50, 1, 0], [52, 1, 0], [55, 1, 0], [57, 1, -0.3], [59, 1, -0.3], [60, 1, -0.3], [61, 1, -0.3], [62, 1, -0.3], [63, 1, -0.3], [64, 1, -0.3], [66, 1, -0.3], [67, 1, -0.3], [69, 1, -0.3], [70, 1, -0.3], [72, 1, -0.3], [72, 1, -0.3], [73, 1, -0.3], [73, 1, -0.3], [73, 1, -0.3], [73, 1, -0.3], [72, 1, -0.3], [71, 1, -0.3], [70, 1, -0.3], [68, 1, -0.3], [66, 1, -0.3], [63, 1, -0.3], [60, 1, -0.3], [57, 1, -0.3], [53, 1, 0], [48, 1, 0], [45, 1, 0], [41, 1, 0.3], [39, 1, 0.3], [37, 1, 0.3], [36, 1, 0.3], [36, 1, 0.3], [37, 1, 0.3], [37, 1, 0.3], [39, 1, 0.3], [40, 1, 0.3], [42, 1, 0.3], [45, 1, 0], [48, 1, 0], [49, 1, 0], [52, 1, 0], [54, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [54, 1, 0], [55, 1, 0], [56, 1, -0.3], [55, 1, 0], [57, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [54, 1, 0], [54, 1, 0], [53, 1, 0], [54, 1, 0], [56, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [54, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [53, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [54, 1, 0], [55, 1, 0], [54, 1, 0], [54, 1, 0], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [56, 1, -0.3], [56, 1, -0.3], [54, 1, 0], [54, 1, 0], [55, 1, 0], [57, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [59, 1, -0.3], [60, 1, -0.3], [60, 1, -0.3], [60, 1, -0.3], [60, 1, -0.3], [60, 1, -0.3], [61, 1, -0.3], [60, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [55, 1, 0], [54, 1, 0], [53, 1, 0], [52, 1, 0], [52, 1, 0], [52, 1, 0], [51, 1, 0], [51, 1, 0], [51, 1, 0], [51, 1, 0], [51, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [50, 1, 0], [51, 1, 0], [51, 1, 0], [52, 1, 0], [53, 1, 0], [53, 1, 0], [54, 1, 0], [56, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [57, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [58, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [54, 1, 0], [55, 1, 0], [55, 1, 0], [56, 1, -0.3], [56, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [55, 1, 0], [54, 1, 0], [53, 1, 0], [53, 1, 0], [52, 1, 0], [52, 1, 0], [51, 1, 0], [50, 1, 0], [50, 1, 0], [49, 1, 0], [48, 1, 0], [47, 1, 0], [47, 1, 0], [46, 1, 0], [45, 1, 0], [44, 1, 0.3], [44, 1, 0.3], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [45, 1, 0], [46, 1, 0], [46, 1, 0], [47, 1, 0], [47, 1, 0], [47, 1, 0], [48, 1, 0], [49, 1, 0], [50, 1, 0], [51, 1, 0], [52, 1, 0], [53, 1, 0], [55, 1, 0], [57, 1, -0.3], [58, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [59, 1, -0.3], [58, 1, -0.3], [57, 1, -0.3], [56, 1, -0.3], [55, 1, 0], [54, 1, 0], [54, 1, 0], [57, 1, -0.3], ...]
Procesaremos los datos de entrenamiento en la siguiente celda. Aplicaremos las siguientes transformaciones:
- Normalizaremos los datos del sensor y las órdenes del motor para ajustar al intervalo de la función de activación. En nuestro caso, utilizaremos la función de activación
tanh, que tiene un intervalo de [-1,1] y solo necesitamos normalizar los datos de los sensores de proximidad. - Eliminaremos los datos donde se detiene el robot o regresa.
processed_lines = []
for line in data:
# Procesamos los datos para tener un formato más adecuado para la red neuronal.
with open("training_data.txt", "w") as f:
f.writelines(processed_lines)
training_data.txt¶
Recuerda conservar el fichero generado, lo necesitaras en el siguiente ejercicio.