martes, 10 de julio de 2007

Desarrollo de un seguidor de paredes inteligente (Parte 4 de 7: Los ejemplos de aprendizaje)


Para crear los ejemplos diseñé un script basado en las conclusiones del apartado anterior para generar una serie de ejemplos.



#!/usr/bin/env python
# -*- coding: utf-8 -*-

# #######################################################
# Diego Muñoz Escalante
#
# Diseño de un seguidor de paredes inteligente
#
# ##########################################################


import sys
import math


#########################
# PARÁMETROS NECESARIOS #
#########################

# Distancia de referencia a la pared
D_WALL = 1/math.cos(math.pi/6)

#Distancia a la que empezamos a responder ante una esquina cerrada
D_ESQUINA = 2.5

# Incremento del error
MIN_AE = -2.0
MAX_AE = +2.0
P_AE = 0.5

# Distancia frontal
MIN_DF = 0.0
MAX_DF = 5.0
P_DF = 0.5

# Error (es más completa que la distancia lateral
MIN_ERROR = -2.0
MAX_ERROR = 5.0
P_ERROR = 0.5

# Velocidad angular
MAX_YAW = 0.5 #La positiva marca un giro izquierdo y la negativa a la derecha

# Velocidad lineal
MAX_XSPEED = 0.5


#############################
# Archivos de entrenamiento #
#############################

lista = []
print 'Generando datos de entrenamiento...'
iAE = MIN_AE - P_AE
while (iAE < MAX_AE):
iAE += P_AE
iDF = MIN_DF - P_DF
while (iDF < MAX_DF):
iDF += P_DF
iERROR = MIN_ERROR - P_ERROR
while (iERROR < MAX_ERROR):
iERROR += P_ERROR
regla = False
# Creación de las reglas
xSpeed = MAX_XSPEED
if (iDF <= D_ESQUINA):
if (iDF < 0.5):
xSpeed = 0
yawSpeed = MAX_YAW
regla = True

elif ((iERROR &mt;= -D_WALL) and (iERROR <= D_WALL)):
yawSpeed = - iERROR * MAX_YAW
regla = True

elif (iAE &mt; 1.0) or (iERROR &mt; D_WALL):
yawSpeed = - MAX_YAW
regla = True

if (regla):
lista.append([iAE,iDF,iERROR,yawSpeed])

f = open('datosAngular.tra','w')
f.write(str(len(lista))+'\n'+str(len(lista[0]))+'\n')
for l in lista:
f.write('%f %f %f %f\n' % (l[0],l[1],l[2],l[3]))
f.close()

####################
# Archivos de test #
####################
lista = []
print 'Generando datos de test...'
iAE = MIN_AE - P_AE/2
while (iAE < MAX_AE/2):
iAE += P_AE
iDF = MIN_DF - P_DF/2
while (iDF < MAX_DF/2):
iDF += P_DF
iERROR = MIN_ERROR - P_ERROR/2
while (iERROR < MAX_ERROR/2):
iERROR += P_ERROR
regla = False
# Creación de las reglas
xSpeed = MAX_XSPEED
if (iDF <= D_ESQUINA):
if (iDF < 0.5):
xSpeed = 0
yawSpeed = MAX_YAW
regla = True

elif ((iERROR &mt;= -D_WALL) and (iERROR <= D_WALL)):
yawSpeed = - iERROR * MAX_YAW
regla = True

elif (iAE &mt; 1.0) or (iERROR &mt; D_WALL):
yawSpeed = - MAX_YAW
regla = True

if (regla):
lista.append([iAE,iDF,iERROR,yawSpeed])

f = open('datosAngular.tst','w')
f.write(str(len(lista))+'\n'+str(len(lista[0]))+'\n')
for l in lista:
f.write('%f %f %f %f\n' % (l[0],l[1],l[2],l[3]))
f.close()

print 'Hecho'

Con este script obtenemos el fichero datosAngular.tra, que será el de los datos de entrenamiento, y el datosAngular.tst que será el de las pruebas de test. Estos dos ficheros son necesarios para obtener las reglas por el método de Wang y Mendel que veremos en el próximo apartado.

La explicación del código es sencilla:

  1. Declaramos los valores máximos, mínimos y de resolución de cada variable, y los valores necesarios como la distancia a la pared y a las esquinas.

  2. Hacemos tres bucles anidados recorriendo todos los posibles valores de las variables.

  3. Vemos si la combinación de los tres valores pertenece a uno de los tres casos fundamentales que comentamos en el caso anterior. Si pertenece, calculamos el valor de salida adecuado y lo añadimos a la lista de casos. Si no, lo desechamos.

  4. Hacemos dos veces el proceso, una para los datos de entrenamiento y otro para los datos de test, pero en el caso de los de test, sumamos la mitad de la resolución al valor inicial, para ir obteniendo valores distintos (los mismos valores de test que de entrenamiento, no sirven).

El script es código Python, para ejecutarlo simplemente hacemos:

#python generaDatos.py



No hay comentarios: