You are on page 1of 63

Universidad Autónoma de Nuevo León

Facultad de Ingeniería Mecánica y Eléctrica

Tesis:
Prototipo de la arquitectura de una red
neuronal convolucional para un Robot
móvil con geometría de Ackermann para
el seguimiento automático de un camino

PRESENTA:

Jahir Antonio Rodríguez Perales | Matrícula: 1806637

Asesor: Dr. José Crescencio Castillo Sarabia

CD. Universitaria | 20 de Mayo de 2022


Agradecimientos

A la vida, por permitirme completar mis estudios y mi tesis de una manera

satisfactoria para mí.

A la Universidad Autónoma de Nuevo León y la Facultad de Ingeniería

Mecánica y Eléctrica, por ser mi alma máter y la fuente de todos los conocimientos

que obtuve durante la carrera.

A mi asesor el Dr. José Crescencio Sarabia, por su guía y sus consejos

durante el desarrollo de esta Tesis.

A todos mis profesores, porque gracias a sus enseñanzas y disposición a

enseñarme logré aprender mucho.

A mis compañeros y amigos de la carrera, por ser una parte importante de

mi formación académica y de mi vida.

A mi madre y a mi padre, por siempre proporcionarme los medios para

dedicarme al estudio y tenerme un amor incondicional.

A mis amigos y compañeros de este proyecto, Esteban Barba e Iván de la

Garza, por todas las contribuciones que hicieron y ayuda que me brindaron.

A la empresa Paradoxa Labs por su contribución en este proyecto.

i
Contenido

Agradecimientos ............................................................................................i

Tabla de figuras ........................................................................................... iv

Resumen ..................................................................................................... 1

Abstract ....................................................................................................... 2

1. Capítulo I. Presentación del Proyecto. ................................................ 3

1.1. Introducción ................................................................................. 3

1.2. Antecedentes ............................................................................... 4

1.3. Definición del problema ................................................................ 5

1.4. Objetivos ...................................................................................... 6

1.4.1. Objetivo general ....................................................................... 6

1.4.2. Objetivos particulares ............................................................... 6

1.5. Hipótesis ...................................................................................... 6

2. Capítulo II. Marco teórico. ................................................................... 7

2.1. Robótica móvil.............................................................................. 7

2.1.1. Antecedentes ........................................................................... 7

2.1.2. Estado del arte ....................................................................... 10

2.1.3. Conceptos básicos ................................................................. 12

2.1.4. Geometría de Ackermann ....................................................... 13

ii
2.2. Visión artificial ............................................................................ 15

2.2.1. Etapas en un proceso de visión artificial ................................. 16

2.2.2. Componentes de un sistema de visión artificial ...................... 18

2.2.3. Aplicaciones ........................................................................... 19

2.3. Inteligencia artificial .................................................................... 20

2.3.1. Redes Neuronales .................................................................. 21

2.3.2. Red Neuronal Convolucional .................................................. 23

3. Capítulo III. Metodología de la investigación. .................................... 25

3.1. Método de investigación ............................................................. 25

3.2. Alcance de la investigación ........................................................ 26

3.3. Diseño de la investigación .......................................................... 27

4. Capítulo VI. Sistemas diseñados. ..................................................... 28

4.1. Diseño de una Red Neuronal Convolucional .............................. 28

4.2. Diseño del prototipo de un robot móvil con geometría de

Ackermann 36

4.2.1. Diseño mecánico .................................................................... 36

4.2.2. Diseño electrónico .................................................................. 38

5. Capítulo V. Conclusiones y observaciones ....................................... 40

5.1. Conclusiones y observaciones sobre la Red Neuronal

Convolucional 40

iii
5.2. Conclusiones y observaciones sobre el diseño del prototipo del

robot móvil con geometría de Ackermann ........................................................ 43

5.3. Conclusiones y observaciones sobre el proyecto en general ..... 43

6. Referencias ...................................................................................... 45

7. Anexo ............................................................................................... 47

7.1. A-1 Código de Python para el seguimiento de un camino .......... 47

Tabla de figuras

Figura 1. Configuraciones de los Robots Móviles con Ruedas. ................. 10

Figura 2. Tipos de rueda. ........................................................................... 11

Figura 3. Geometría de Ackermann. .......................................................... 15

Figura 4. Diagrama de bloques de las etapas de un Sistema de Visión

Artificial. ............................................................................................................... 18

Figura 5. Diagrama de un SVA. ................................................................. 19

Figura 6. Partes de una RNA. .................................................................... 22

Figura 7. Analogía entre una neurona biológica y una neurona artificial. ... 23

Figura 8. Proceso cuantitativo. .................................................................. 27

Figura 9. Proceso cuantitativo. .................................................................. 27

Figura 10. Arquitectura de la CNN utilizada de Nvidia. .............................. 28

Figura 11. Arquitectura de la CNN utilizada de Nvidia. .............................. 28

Figura 12. Menú principal del Self Driving Car Simulator de Udacity. ........ 29

Figura 13. Gráfica del ángulo de giro del volate por imágen ...................... 30

iv
Figura 14. Submuestreo de los datos de entrenamiento. ........................... 31

Figura 15. Grupo de imágenes de entrenamiento y validación. ................. 32

Figura 16. Muestra aleatoria de las técnicas de aumento. ......................... 32

Figura 17. Imagen preprocesada. .............................................................. 33

Figura 18. Imagen de entrenamiento e imagen de validación. ................... 33

Figura 19. Resumen de la arquitectura de la CNN creada. ........................ 34

Figura 20. Épocas de entrenamiento de la CNN. ....................................... 35

Figura 21. Gráfica del mse por época del entrenamiento de la CNN. ........ 35

Figura 22, Vista isométrica inferior de la base inferior del robot en Solidworks

............................................................................................................................. 37

Figura 23. Sistema de dirección diseñado (en rosa). ................................. 37

Figura 24. Vista isométrica frontal del diseño final del prototipo del robot movil.

............................................................................................................................. 38

Figura 25. Layout de la placa central. ........................................................ 39

Figura 26. Vista 3D de la placa central. ..................................................... 39

Figura 27. Automóvil manejando por la primera pista. ............................... 41

Figura 28. Automóvil manejando por la segunda pista............................... 42

v
Resumen
En la siguiente Tesis, se muestra principalmente el trabajo realizado por el

autor en la arquitectura y entrenamiento de una Red Neuronal Convolucional. El

objetivo de la arquitectura de esta Red Neuronal es el del procesamiento de

imágenes para el seguimiento automático de un camino. Como se mostrará más

adelante en la hipótesis, la Red Neuronal fue únicamente entrenada usando

imágenes generadas por un simulador, esto con el objetivo de reducir costos en la

implementación del proyecto así como tiempo de implementación de dicha Red

Neuronal. Adicionalmente, se mostrará brevemente el trabajo realizado por un

equipo de ingenieros en la creación de un prototipo de robot móvil con la geometría

de Ackermman. La idea de este proyecto nació de la convocatoria de un concurso

por parte de la empresa Yazaki.

Palabras clave: Robot móvil, Red Neuronal Convolucional, Geometría

de Ackermann, conducción autónoma.

1
Abstract

In the following Thesis, the work made by the author in the architecture and

training of a Convolutional Neural Network is shown. The main objective of the

architecture of this Neural Network is of image processing for the automatic following

of a track. As it is shown forward in the hypothesis, the Neural Network was only

trained using images generated by a simulator, this with the objective of reducing

cost in the implementation of this project and mainly time in the implementation of

this Neural Network. Additionally, the work made by a team of engineers in the

creation of the prototype of a mobile robot with Ackermann’s geometry is also briefly

shown. The initial idea of this project came from a contest organized by the

enterprise Yasaki.

Keywords: Mobile robot, Convolutional Neural Network, Ackermann’s

geometry, autonomous driving.

2
1. Capítulo I. Presentación del Proyecto.
1.1. Introducción

En esta Investigación se presenta el trabajo realizado sobre un robot móvil

con geometría Ackermann capaz de seguir un camino mediante la ayuda de una

cámara, utilizando visión artificial por computadora y una Red Neuronal

Convolucional (RNC) para la generación de trayectorias.

La RNC encargada de la generación de trayectorias fue entrenada

únicamente utilizando imágenes generadas por un simulador, buscando reducir

costos para facilitar la implementación de este proyecto.

El presente capítulo se utilizará para describir y presentar el proyecto tal

como su nombre lo indica. Se presentará la idea desde la cuál surgió, así como los

detalles que llevaron a tomar la decisión de realizar una investigación sobre este

proyecto.

El capítulo 2 de esta Tesis se dedicará a desarrollar el Marco teórico de esta

investigación, enfocándose al área de redes neuronales, la visión artificial por

computadora y la programación que sigue este robot.

En el capítulo 3 se hablará sobre la metodología seguida para realizar la

investigación de este proyecto

En el capítulo 4 se presentarán los sistemas diseñados de la implementación

del prototipo, tanto como diseño del mismo, así como de la red neuronal

convolucional.

En el capítulo 5 se incluirá la discusión de conclusiones y obervaciones tras

haber trabajado en este proyecto.

3
Finalmente, en el capítulo 6 se incluirán las referencias y el capítulo 7 será

un anexo donde se incluirá el código usado para el entrenamiento y la generación

de datos de la Red Neuronal Convolucional.

1.2. Antecedentes

La idea de este automóvil nace como iniciativa de participar en un concurso

que pedía ciertas características en un prototipo a escala, de un carro real. Por lo

cual, ya se tienen ciertos avances en el trabajo, dentro de los cuales hay una tesina

ya desarrollada que cubre ciertos temas, más no todos, también hay avances en los

diseños CAD y en la parte electrónica de este carrito, hasta el punto de estar casi

completos. En la programación, se tiene cierto avance en las partes de Firmware y

Software, pero aún están pendiente el terminarla y conectarla, así como la parte de

Software puede ser expandida.

El diseño electrónico de la PCB principal del robot se basa en un

microcontrolador SAMD21 imitando a una placa de desarrollo Sparkfun.

Adicionalmente, cuenta con sistemas de potencia individuales para integrar el

control de los motores. Finalmente, cuenta con salidas de 3.3 V y 5 V, para el control

de diferentes sensores y actuadores según sea el requerimiento. El procesamiento

de imágenes se realiza mediante Python y una tarjeta Raspberry Pi 4 que se

comunicará con el microcontrolador SAMD21.

El diseño mecánico se basa en que el robot cumpla con una geometría de

Ackermann para poder tomar así una dirección en el espacio según la potencia que

4
le entregan 2 motores paralelos traseros para poder avanzar, viéndose modificado

el vector de velocidad en la dirección por la parte delantera del robot.

La programación de Firmware está planeada para traducir la parte lógica del

robot a valores sencillos, integrales a ser posible, esto para que el microcontrolador

haga la conversión de medidas a voltajes en los diferentes actuadores y viceversa,

de voltaje a medidas en la lectura de sensores para dar una retroalimetación de su

dirección actual.

La programación de software del robot estará enfocada a que pueda

distinguir carretera con la cámara, y sepa decidir qué acción tomar en base a lo que

percibe en una imagen.

1.3. Definición del problema

Originalmente este proyecto nace de la convocatoria de una competencia

organizada por la compañía Yazaki, en la cual, el objetivo principal era crear un

robot móvil capaz de seguir las líneas de una carretera, soportar señales

interferentes de distintas frecuencias, caídas de hasta 1.5 metros, que fuera a

prueba de agua y que pudiera subir rampas con inclinaciones no mayores a 30°.

Antes de la fecha de la competencia, se lograron avances en la parte de

diseño mecánico y electrónico, sin embargo, por varios motivos de los diferentes

miembros del equipo, este proyecto o pudo se terminado para el día de la

competencia, principalmente en las partes de programación.

Por lo cual, se tomó la decisión de presentar este robot móvil como proyecto

de titulación, integrando el diseño mecánico, eléctrico y la programación en una sola

5
idea, cubriendo así las diferentes ramas de la mecatrónica, y buscando innovar en

los métodos utilizados.

1.4. Objetivos

1.4.1. Objetivo general

El objetivo general de este proyecto es el de realizar el diseño e

implementación de un carro seguidor de trayectorias, capaz de evadir obstáculos y

que, a su vez, logre continuar bajo ciertas condiciones ambientales que puedan

dificultar el recorrido, como, por ejemplo, bajo la precipitación, interferencia de

señales, e incluso golpes o caídas no mayores a 1.5 metros.

1.4.2. Objetivos particulares

• Entrenar la arquitectura propuesta de la Red Neuronal Convolucional

utilizando únicamente imágenes de entrenamiento generadas por un simulador.

• Lograr seguir un camino (tipo carretera) adaptado al tamaño del carro

usando visión computacional y redes neuronales.

• Generar un prototipo robótico con geometría de Akermann

1.5. Hipótesis

Es posible entrenar la RNA que genere las trayectorias de un robot móvil para

que este siga un camino en el mundo real, utilizando únicamente imágenes

generadas por un simulador en computadora de una animación de un vehículo

siguiendo un camino lo mejor posible.

6
2. Capítulo II. Marco teórico.
En el presente capítulo se hablará sobre los puntos más relevantes de la

presente investigación, para la creación de su marco teórico. Se incluirán los temas

de Geometría de Ackermann, visión artificial, redes neuronales, entre otros.

2.1. Robótica móvil

2.1.1. Antecedentes

La robótica nació como una ciencia a partir del siglo XX, en la década de los

40. Los orígenes de esta datan de tiempo más atrás, en el siglo XVIII con la

construcción de autómatas humanoides por Vaucanson y los Jaquel-Droz. Gracias

a la revolución industrial en los albores del siglo XIX se impulsó el crecimiento de

diversas áreas científicas, lo que resultó en el desarrollo de la robótica.

En 1921, el escritor checo Karel Capek, acuñó el término Robot en su obra

dramática Rossum’s Universal Robots (R.U.R). La palabra Robot se deriva de la

palabra checa robota, que significa servidumbre o trabajo forzado. Isaac Asimov

introdujo por primera vez el término robótica en su obra I, Robot, incluyendo en ese

mismo trabajo las 3 leyes de la robótica.

En 1979, el Robot Institute of America definió a un robot como “Un

manipulador reprogramable y multifuncional diseñado para mover material, partes,

herramientas o dispositivos especializados a través de varios movimientos

programados para la realización de una variedad de tareas”. Esta definición va de

acuerdo con la fecha en la que fue propuesta, ya que antes la robótica era más

7
enfocada a la industria en robots que ayudaban a manipular materiales o

automatizar y optimizar ciertas tareas repetitivas.

Existe una gran variedad de formas y aplicaciones en el campo de la robótica,

debido a que debe tomarse muy en cuenta la tarea que va a realizar el robot; debido

a esto, los criterios tomados en cuenta para clasificar a los robots son varios, tales

como son: su arquitectura, su generación, su nivel de inteligencia, su nivel de control

o su nivel de lenguaje de programación. Dentro de la clasificación por su

arquitectura, se encuentran los robots móviles (Barrientos Sotelo, García Sánchez,

& Silva Ortigoza, 2007).

La robótica se ha desarrollado a pasos agigantados entre la década de los

50s hasta el día de hoy, con diferentes campos de aplicación, hasta la identificación

de dos áreas de investigación claramente definidas, así: teleoperados y autonomía.

Uno de los primeros robots fue el llamado Shakey, desarrollado en el Instituto de

Investigaciones de Stanford en 1960 y capaz de tomar bloques de una pila utilizando

una cámara de video como sensor visual, y de procesar información en una

pequeña computadora. (Bermúdez, 2002).

Dentro de los campos de aplicación en los que ha estado presente la robótica

móvil, se encuentran:

Robots industriales: las primeras aplicaciones de la robótica en la industria

fueron en el campo de la limpieza con roboscrub, fabricado por la empresa Denning

Mobile Robots y Windsor Industries; y Robokent, fabricado por la empresa Cleaning

8
Equipments. Ambos robots utilizaban sensores para detectar su entorno y evitar

tropezar con obstáculos que se encontraran en una ruta preestablecida

Robots de seguridad: Un ejemplo de un robot de seguridad es el Denning

Sentry, diseñado por la empresa Demming Mobile Robotics Este robot cumplía con

las labores de un guardia de seguridad, implementando un anillo de sonares para

la detección de obstáculos, sensores de movimiento de tipo infrarrojo y de

microondas, una cámara de TV, micrófono y transmisores inalámbricos. Cuando la

alimentación del robot se agotaba, el robot retornaba automáticamente a su estación

de carga y recargaba sus baterías de forma autónoma.

Robots para hospitales: Helpmate fue un robot enfermero fabricado por

Helpmate Robotics Inc. Fue diseñado con la finalidad de ayudar a los enfermeros

en sus labores, recorría los corredores de los hospitales combinando el sistema de

navegación y la ubicación por sonar. Al presionar un botón el operario podía enviar

el robot a determinado lugar del mapa y navegar de una estación programada a otra

Investigación espacial: Sin duda alguna, una de las misiones más

ambiciosas de la NASA es la de la exploración de marte. En 1997, la misión

pathfinder llevó a Marte el que se puede considerar el robot móvil más sofisticado

de su fecha. El robot Sojourner captó la atención de millones de personas al ejecutar

fielmente los comandos enviados desde controladores en la Tierra. también podía

tomar acciones por sí mismo, manteniéndose alerta de obstáculos y abismos.

Humanoides: El robot Honda P3 fue posiblemente el más avanzado del

mundo en su fecha, al poder hacer tareas únicas como subir escaleras. El diseño

del robot y su sistema sensorial inherente están orientados a conseguir una

capacidad de deslazamiento elevada, pero sus brazos han de ser controlados


9
remotamente. En él pueden distinguirse cuatro tipos de sensores: Los táctiles,

situados en las manos y en los pies, que le permiten controlar la fuerza de agarre o

de pisada; un sensor giroscopio en la cintura, para detectarlos movimientos de las

piernas; también dispone de un inclinómetro que le permite conocer la posición de

su “columna vertebral”; finalmente, tiene una cámara localizada en su cabeza, que

le permite desplazarse por el entorno mediante técnicas de visión

2.1.2. Estado del arte

Un robot móvil se define como un sistema electromecánico capaz de

desplazarse de manera autónoma sin estar sujeto físicamente a un solo punto.

Posee sensores que permiten monitorear a cada momento su posición relativa a su

punto de origen y a su punto de destino. Normalmente su control es en lazo cerrado.

Su desplazamiento es proporcionado mediante dispositivos de locomoción tales

Figura 1. Configuraciones de los Robots Móviles con Ruedas.

10
como ruedas, patas, orugas, etc. (Barrientos Sotelo, García Sánchez, & Silva

Ortigoza, 2007).

Los robots móviles son clasificados según el tipo de locomoción utilizado, los

tres medios de movimiento son: por ruedas, por patas y por orugas. Dentro de los

atributos más relevantes de los Robots Móviles con Ruedas (RMR), destacan su

eficiencia en cuanto a energía en superficies lisas y firmes, a la vez que no causan

desgaste en la superficie donde se mueven y requieren un número menor de partes.

Existen diferentes configuraciones cinemáticas para los RMR, éstas

dependen principalmente de la aplicación hacia dónde va enfocado el RMR, en

general se tienen las siguientes configuraciones: Ackermann, triciclo clásico,

tracción diferencial, skid steer, síncrona y tracción omnidireccional (Figura 1).

Dependiendo de su configuración cinemática, los RMR utilizan cuatro tipos de

ruedas para su locomoción: omnidireccionales, convencionales, tipo castor y ruedas

de bolas (Figura 2).

Figura 2. Tipos de rueda.

Dentro de las suposiciones de diseño general se toman tres: la primera va

dirigida a considerar que las partes dinámicas del RMR son insignificantes, o sea,

que no contiene partes flexibles, esto para aplicar mecanismos de cuerpos rígidos
11
para el modelado cinemático; La segunda limita que la rueda tenga máximo un

eslabón de dirección, con la finalidad de reducir la complejidad del modelado;

finalmente, la tercera es asumir que rodos los ejes de dirección son perpendiculares

a la superficie, para reducir los movimientos a un solo plano.

Por otro lado, también se toman tres suposiciones para la operación: La

primera es que se descarta toda irregularidad de la superficie conde se mueve el

RMR; otra, considera que la fricción de traslación en el punto de contacto de la rueda

con la superficie donde se mueve, es lo suficientemente grande para que no exista

un desplazamiento de traslación del RMR; por último y como complemento de lo

anterior, la tercer suposición es que la fricción rotacional en el punto de contacto de

la rueda con la superficie donde se mueve, es lo suficientemente pequeña para que

exista un desplazamiento rotatorio.

Relativo a los actuadores utilizados para dotar de movimiento a los RMR, es

común que se utilicen motores. Existe una gamma bastante amplia dependiendo de

su empleo; los más utilizados en la robótica móvil son los motores de corriente

directa (CD). (Barrientos Sotelo, García Sánchez, & Silva Ortigoza, 2007)

2.1.3. Conceptos básicos

Las propiedades características de los robots son la versatilidad y la

autoadaptabilidad. La primera se entiende como la potencialidad estructural de

ejecutar tareas diversas y/o ejecutar una misma de forma diversa, lo cual implica

una estructura mecánica de geometría variable. La autoadaptabilidad significa que

12
un robot debe alcanzar su objetivo por si solo a pesar de las perturbaciones

imprevistas del entorno a lo largo de la ejecución de su tarea.

Un robot operacional está constituido por cuatro sistemas que se relacionan

entre sí: mecánico, sensórico, control y alimentación (Bermúdez, 2002).

El sistema mecánico permite el movimiento, utilizando diferentes elementos

de acuerdo con el propósito del robot y ubicados estratégicamente.

El sistema sensórico brinda información importante para la ubicación de

elementos u obstáculos: los sensores propioceptivos permiten determinar posición

y velocidad; los sensores exteroceptivos determinan la interacción del entorno con

él mismo.

El sistema de control es el cerebro del robot, al interpretar y tratar la

información; él debe contener un modelo del robot físico (actuadores y sensores),

un modelo del entorno o estrategias para conocerlo, y los programas que permiten

realizar las tareas (algoritmo de control).

2.1.4. Geometría de Ackermann

Por definición, el sistema de dirección de un vehículo es el conjunto de

mecanismos que permite al conductor controlar las ruedas directrices, de manera

que podrá orientarlas convenientemente según la trayectoria deseada (Castro

Gualán, 2018).

13
Actualmente, existe una gran variedad de sistemas de dirección en el

mercado del automóvil, cada uno con unas determinadas características que lo

hacen apropiado para el tipo de vehículo en el que estarán montados.

Pese a esto, todos son funcionalmente similares. Todos están formados por

una serie de componentes que permiten transformar el movimiento giratorio del

volante en un movimiento lineal que varía la orientación de las ruedas directrices

El sistema de dirección y el modelo cinemático de la mayoría de los vehículos

que circulan por nuestras carreteras está basado en el efecto que produce la

llamada geometría de Ackerman. El hecho que se cumpla este efecto evita un

desgaste no homogéneo de las ruedas y, sobre todo, poder evitar deslizamientos

que suponen un riesgo muy alto de accidentes. (Ponz Campos)

El efecto Ackermann indica que es muy importante que todas las ruedas del

vehículo estén girando respecto a un mismo punto, definido como centro

instantáneo de rotación. De esta forma se denomina centro instantáneo de rotación

(CIR) al punto donde la velocidad será cero respecto al sólido que está girando en

ese instante.

Dado que las ruedas traseras son fijas y no cambian de orientación, el CIR

estará sobre una línea perpendicular al movimiento del vehículo. Además, en caso

de que el vehículo circule en línea recta, el CIR aparecerá en el infinito, por lo que

todas las ruedas del vehículo estarán girando a la misma velocidad.

Mientras que las llantas delanteras de un vehículo sean maniobradas lejos

de la posición que va hacia el frente, el diseño geométrico del sistema de dirección

determinará si ambas ruedas se quedan paralelas o si una girará más que la otra.

14
Para el uso de bajas aceleraciones laterales (vehículos de carretera), es

común utilizar la geometría de Ackermann.

Esta geometría se asegura que todas las

ruedas rueden libremente sin ángulo de

deslizamientos ya que las ruedas giran para

seguir un mismo CIR. (Milliken & Milliken, 1995)

La geometría de Ackermann es utilizada

para construir vehículos de 4 ruedas ya que

permite dar giros con la dirección delantera

produciendo un mínimo derrape en las llantas


Figura 3. Geometría de Ackermann.
delanteras, ya que permite que cada una gire

en un ángulo diferente.

2.2. Visión artificial

Se entiende por visión artificial la disciplina científica que trata de construir

sistemas que obtengan información de las imágenes y así poder interpretarlas

debidamente. El objetivo principal es dotar a las máquinas del sentido de la vista.

La visión artificial abarca una gran variedad de campos como la informática, la

óptica, la ingeniería mecánica, la ingeniería industrial, la robótica, etc. (García

Villanueva, Ramírez Zavala, & Ortega Reyes, 2016).

La visión artificial es una disciplina que engloba todos los procesos y

elementos que proporcionan ojos a una máquina y se podría decir que la visión

15
artificial o comprensión de imágenes describe la deducción automática de la

estructura y propiedades de un mundo tridimensional, posiblemente dinámico, bien

a partir de una o varias imágenes bidimensionales de ese mundo. (González

Marcos, et al. 2006)

Los sistemas de visión son destinados a realizar inspecciones de imágenes

a alta velocidad y que tengan repetitividad en las medidas que realizan En la

actualidad no existe un algoritmo estándar para resolver los problemas que

involucran la visión artificial, por esta razón existe un amplio conjunto de métodos

para resolver problemas acotados y bien definidos.

Las estructuras y propiedades del mundo tridimensional que se quieren

obtener son geométricas y materiales. Ejemplos de propiedades geométricas son la

forma, tamaño y localización de los objetos. Mientras que las propiedades

materiales son cosas como el color, iluminación, textura y composición de un objeto.

2.2.1. Etapas en un proceso de visión artificial

La visión artificial lleva asociada una gran cantidad de conceptos

relacionados con hardware, software y también con desarrollos teóricos. El primer

paso en un proceso de visión artificial es la adquisición de la imagen digital, para lo

cual son necesarios sensores y la capacidad para digitalizar las señales producidas

por dicho sensor.

Una vez que la imagen digital ha sido obtenida, el siguiente paso consiste en

el preprocesamiento de dicha imagen. El objetivo del preprocesamiento es mejorar

la imagen de forma que el objetivo final tenga mayores posibilidades de éxito.

16
El paso posterior es la segmentación, cuyo objetivo es dividir la imagen en

las partes que la constituyen o los objetos que la forman. En general, la

segmentación autónoma es uno de los problemas mas difíciles en el

preprocesamiento de la imagen. Una buena segmentación facilitará mucho la

solución del problema, y una mala segmentación conducirá al fallo en dar solución

al problema.

La salida del proceso de segmentación es una imagen de datos que, o bien

contienen la frontera de la región de interés o los puntos de ella misma. Es necesario

convertir estos datos a una forma que sea apropiada para el ordenador. La primera

decisión es saber si se va a usar la representación por frontera o región completa.

La representación por la frontera es apropiada cuando el objetivo se centra

en las características de la forma externa como esquinas o concavidades y

convexidades,

La representación por regiones es apropiada cuando la atención se entra en

las propiedades internas como la textura o el esqueleto, sin embargo, en muchas

aplicaciones ambas representaciones coexisten.

La elección de una representación es sólo una parte de la transformación de

los datos de entrada. Es necesario especificar un método que extraiga los datos de

interés. La parametrización, que recibe también el nombre de selección de rasgos

se dedica a extraer rasgos que producen alguna información cuantitativa de interés

o rasgos que son básicos para diferenciar una clase de objetos de otra.

17
En último lugar se

encuentran el reconocimiento y la

interpretación. El reconocimiento

es el proceso que asigna una

etiqueta a un objeto basada en la

información que proporcionan los

descriptores (clasificación). La

interpretación lleva a asignar

significado al conjunto de objetos

reconocidos. (González Marcos, y

otros, 2006)

Figura 4. Diagrama de bloques de las etapas de un Sistema de Visión Artificial.

2.2.2. Componentes de un sistema de visión artificial

Los elementos de hardware mínimos necesarios para un Sistema de Visión

Artificial son los siguientes:

Sensor óptico: El sensor puede ser una cámara color o monocromática que

produzca una imagen completa de determinada resolución óptima según el

problema cada cierto tiempo, normalmente a una tasa de 30 cuadros por segundo

(o FPS por las siglas en inglés de Frames per second), pero nuevamente los FPS

elegidos dependerán del problema a resolver. Asimismo, la naturaleza del sensor y

la imagen que produzca son determinadas por la aplicación que se le vaya a dar.

18
Tarjeta de adquisición de imagen: Permite digitalizar la señal del video

entregada por el subsistema anterior.

Computador: Una vez digitalizada la imagen, debe ser almacenada en la

memoria de un computador para su posterior procesamiento y manipulación por

programa.

Monitor de video: Permite visualizar tanto las imágenes o escenas captadas

como los resultados del procesamiento de dichas imágenes.

Figura 5. Diagrama de un SVA.

2.2.3. Aplicaciones

La visión artificial tiene varias aplicaciones menos ambiciosas que la

construcción de robots autónomos. Estas aplicaciones pueden pasar por la

automatización de una línea de ensamblajes, la inspección de circuitos para

detectar defectos, teledirección para construir mapas de regiones no fácilmente

accesibles, comunicación mediante gestos con el ordenador, ayudas a los

discapacitados mediante perros guía robots, etc..

Entre los sectores donde más se están utilizando actualmente la tecnología

de visión artificial se encuentran las industrias: auxiliar del automóvil, farmacéuticas,

19
embotelladoras y de embalaje, etiquetadoras, textiles, papeleras, metalúrgicas, de

fabricación de semiconductores, de fabricación de cerámicos, madereras, etc..

2.3. Inteligencia artificial

La Inteligencia Artificial (IA) es un campo científico en el que se trata de las

que máquinas realicen tareas que podría realizar el hombre aplicando cualquier tipo

de razonamiento. Para lograr este objetivo se necesitan programas informáticos. En

cierta medida cualquier programa informático puede ser considerado inteligente. El

problema es diferenciar entre qué es lo que se considera un programa inteligente y

qué no lo es.

Un programa inteligente es aquel que muestra un comportamiento similar al

humano cuando se encuentra con un problema idéntico. No es necesario que el

problema sea resuelto exactamente de la misma manera que lo haría una persona.

Desde el punto de vista del comportamiento humano, la IA estudia la naturaleza de

la inteligencia humana, como reproducirla e implementarla en un programa

informático (Vicente Lober, 2003).

La definición formal de IA puede variar entre autores, según sea el enfoque.

Mientras que ciertos libros enfocan la definición a sistemas que piensan o actúan

como humanos, otros definen la IA como sistemas que piensan o actúan

racionalmente, definiendo la racionalidad como un concepto ideal de inteligencia.

Un sistema es racional si hace lo correcto, en función de su conocimiento

(Russell & Norvig, 2004). Las definiciones de IA generalmente aluden a los procecos

mentales, razonamientos y a la conducta.

20
2.3.1. Redes Neuronales

El subtema 2.3.1 será retomado de un trabajo realizado anteriormente por el

mismo autor de esta investigación, dando crédito al final en las referencias citadas

para realizar el trabajo hecho con anterioridad.

Una de las ramas más destacadas del campo científico de la IA es la que

corresponde a las Redes Neuronales Artificiales (RNAs). Entendiendo como tales

aquellas redes en las que existen elementos procesadores de información de cuyas

interacciones locales depende el comportamiento del conjunto del sistema.

Las RNAs tratan de emular el comportamiento del cerebro humano,

específicamente su aprendizaje a través de la experiencia y la extracción de

conocimiento genérico a partir de un conjunto de datos, a través de imitar

esquemáticamente su estructura neuronal. El cerebro humano corresponde al de

un sistema altamente complejo, no-lineal y paralelo. En términos sencillos lo anterior

equivale a decir que puede realizar muchas operaciones simultáneamente.

El elemento fundamental de los sistemas neuronales biológicos es la

neurona. De forma genérica, una neurona consta de un cuerpo celular o soma más

o menos esférico, del que parten una rama principal o axón y un denso árbol de

ramificaciones, compuesto por dendritas. La forma final de la neurona depende de

la función que cumple, esto es, de la posición que ocupa en el sistema y de los

estímulos que recibe.

Un conjunto de neuronas artificiales cuyas entradas provienen de la misma

fuente y cuyas salidas se dirigen al mismo destino constituyen lo que se denomina

una capa o nivel, cuya agrupación conforma el sistema neuronal completo

21
Figura 6. Partes de una RNA.

Las RNAs tienen una inclinación natural a adquirir conocimiento a través de

la experiencia, el cual es almacenado en el peso relativo de las conexiones

interneuronales, también son capaces de cambiar dinámicamente junto con el

medio, tienen un alto nivel de tolerancia a fallas y tienen un comportamiento no-

lineal.

22
Figura 7. Analogía entre una neurona biológica y una neurona artificial.

El aprendizaje es la clave de la plasticidad de la RNA y esencialmente es el

proceso en el que se adaptan las sinapsis o pesos, para que la red responda de un

modo distinto a los estímulos del medio. Para casos sencillos, los pesos pueden

asignarse de forma manual, pero lo usual es utilizar algún algoritmo para llevar a

cabo este proceso de entrenamiento. Todos los métodos de aprendizaje pueden ser

englobados en dos categorías: el aprendizaje supervisado y el aprendizaje no

supervisado.

2.3.2. Red Neuronal Convolucional

Existen diversos tipos o arquitecturas de una RNA, la selección de una RNA

se realiza en función de las características del problema a resolver. La mayoría de

éstos se pueden clasificar en aplicaciones de Predicción, Clasificación, Asociación,

Conceptualización, Filtrado y Optimización. Los tres primeros tipos de aplicaciones

requieren un entrenamiento supervisado.

Las Redes Neuronales Convolucionales (RNC o CNN por Convolutional

Neural Network) han revolucionado el reconocimiento de patrones. Antes de su uso

23
en masa, la mayoría de tareas de reconocimiento de patrones eran realizadas

usando una etapa inicial de extracción de características seguido de un clasificador.

El gran hallazgo de las RNC es que las características son aprendidas

automáticamente de ejemplos de entrenamiento. El uso de las RNC es

especialmente útil en las tareas de reconocimiento de imágenes porque la operación

de convolución captura la naturaleza 2D de las imágenes. También, al usar los

kernels de convolución para escanear una imagen completa, relativamente pocos

parámetros necesitan ser aprendidos en comparación al números de operaciones

(Bojarski , y otros).

24
3. Capítulo III. Metodología de la

investigación.
En el presente capítulo se describirá la metodología utilizada para la presente

investigación, respaldando con argumentos claros las razones de la metodología

seleccionada. Según Sampieri, la investigación es un conjunto de procesos

sistemáticos, críticos y empíricos que se aplican al estudio de un fenómeno o

problema. (Hernández Sampieri, Fernández Collado, & Baptista Lucio, 2014)

3.1. Método de investigación

Primeramente, hay que declarar que para la presente tesis se seleccionó el

tipo de investigación después de haber realizado cierto progreso de la misma. Por

esta razón, es posible que no se haya seguido al pie de la letra desde el principio

las “reglas” del tipo de investigación que se declara en este subcapítulo.

Según Sampieri, la investigación está dividida en 2 enfoques: el enfoque

cuantitativo y el enfoque cualitativo. Ambos enfoques tienen sus propios procesos

para generar información y comparten ciertas características en común. Por

ejemplo:

1. Ambos métodos llevan a cabo la observación y evaluación del fenómeno

2. Ambos procesos establecen una hipótesis.

3. Demuestran el grado en que las suposiciones o ideas tienen fundamentos.

4. Revisan tales suposiciones o ideas sobre la base de las pruebas o del análisis

25
5. Proponen nuevas observaciones y evaluaciones para esclarecer, modificar y

fundamentar las suposiciones e ideas o incluso para generar otras.

Sin embargo, aunque ambos enfoques tienen esas similitudes mencionadas,

en realidad son muy diferentes y cada una tiene sus propias características.

También, aunque ambos métodos son diferentes, puede que una investigación opte

por usar una mezcla de ambos o cierta etapa del proceso de uno según sea

conveniente, creando así un método de investigación mixto entre los enfoques

cualitativo y cuantitativo.

Para esta investigación se seguirá el enfoque de investigación cuantitativo.

El enfoque cuantitativo es secuencial y probatorio. Cada etapa precede a la

siguiente y no podemos “brincar” o eludir pasos. Utiliza la recolección de datos para

probar hipótesis con base en la medición numérica y el análisis estadístico, con el

fin establecer pautas de comportamiento y probar teorías.

3.2. Alcance de la investigación

Toda investigación, sin importar que tipo de paradigma siga ni tampoco su

enfoque, se origina de una idea o un conjunto de ideas. Las ideas constituyen el

primer acercamiento a la realidad que se investigará o a los fenómenos, sucesos o

ambientes por estudiar, o como es el caso del enfoque cuantitativo, el primer

acercamiento a la realidad objetiva.

La idea de esta investigación surge de la convocatoria que se hizo a un

concurso de un carro a escala que se manejara de forma autónoma mediante visión

computacional. Originalmente esa era la idea que daba la convocatoria, pero

26
entonces, tras hacer una pequeña investigación al respecto, se desarrolló la idea

principal presentada en la hipótesis de esta tesis.

El objetivo principal de este proyecto es poner a prueba la hipótesis

propuesta, como objetivo secundario el lograr generar un prototipo de un robot móvil

con geometría de Ackermann.

3.3. Diseño de la investigación

Figura 8. Proceso cuantitativo.

Para el diseño de esta investigación, se tomaron en cuenta las 10 fases del

enfoque cuantitativo de la metodología de investigación de sampieri, tal como se

muestra en la figura 8. Cada fase se siguió en secuencia para la realización de esta

tesis.

27
4. Capítulo VI. Sistemas diseñados.
En el presente capítulo, se expondrá el proyecto realizado y los resultados

que se obtuvieron de este, para posteriormente en el capitulo V exponer las

conclusiones halladas tras trabajar en este proyecto. Debido a que este trabajo se

centra más en el desarrollo de la Red Neuronal Convolucional no se mencionará a

grandes rasgos lo que es el desarrollo del prototipo del robot móvil.

4.1. Diseño de una Red Neuronal Convolucional

Para este segmento de la investigación, se hizo uso de una red neuronal

convolucional (CNN por Convolutional Neural Network) basada en la arquitectura

propuesta por NVIDIA en su artículo “end to end learning for self driving cars”

(Bojarski , et. al.).

Figura 10. Arquitectura de la CNN utilizada de Nvidia.

28
Como se menciona en la hipótesis de este trabajo, todas las imágenes con

la que fue entrenada esta CNN, fueron generadas mediante un simulador. Dicho

simulador es completamente gratuito y puede ser obtenido de internet por cualquier

persona. El simulador es hecho por la organización Udacity y está construido con

Unity; el simulador puedes ser encontrado con la búsqueda en Google “Udacity self

driving car simulator”.

Figura 12. Menú principal del Self Driving Car Simulator de Udacity.

Se usará este simulador debido a que tiene 2 modos para manejar el

automóvil. Primeramente, tiene el modo de entrenamiento “Training Mode”, el cual

permite manejar el automóvil manualmente y permite capturar imágenes del

recorrido por 3 cámaras como si estuvieran montadas sobre el espejo retrovisor

derecho, el espejo retrovisor izquierdo, y una tercer cámara sobre el centro del

parabrisas del automóvil.


29
Además, genera un archivo csv donde a cada grupo de 3 imágenes captadas

en cada momento se le asigna el valor actual que tiene de ángulo de giro del volante,

entre otros datos que no se usaron como velocidad y aceleración.

El simulador también cuenta con el modo autónomo, “Autonomous mode”,

que permite poner a prueba nuestra CNN una vez haya sido entrenada, usando un

código para generar predicciones por parte del modelo y conectando un servidor

local al simulador.

Mediante el simulador se lograron generar alrededor de 17 mil imágenes

dando 3 vueltas completas a la pista del simulador en ambas direcciones con el

objetivo de entrenar a la red neuronal. Se dieron vueltas en ambas direcciones para

evitar que los datos mostraran una preferencia de girar hacia la izquierda o la

derecha.

Figura 13. Gráfica del ángulo de giro del volate por imágen

Tal como se puede apreciar en la figura 13 (donde 1 indica un máximo de

giro del volate hacia la derecha, -1 un máximo de giro del volante hacia la izquierda

y 0 indica que el volante no ha sido girado), la gran mayoría de los ángulos de giro
30
del volante se presentan en 0, lo cual ocasionaría que nuestro vehículo aprendiese

a ir recto la mayoría del tiempo.

Para solucionar este problema se tomó únicamente un submuestreo de tal

forma que aunque la mayoría del tiempo el automóvil fuera recto, no se viera tan

influenciado a seguir esta tendencia todo el tiempo. En la figura 13 se puede

apreciar una línea azul que atraviesa el gráfico verticalmente, esta línea indica un

corte en la cantidad de imágenes de tal forma que todas las imágenes por encima

de esta línea sean omitidas del entrenamiento de la CNN. Dicho corte se puede

apreciar mejor en la figura 14.

Figura 14. Submuestreo de los datos de entrenamiento.

Una vez que se hizo el submuestreo de los datos de entrenamiento, sigue

dividirlos en muestras de entrenamiento y muestras de validación para el

entrenamiento de la CNN.

31
Dichas divisiones se pueden apreciar mejor en la figura 15, donde se puede

ver que como datos de entrenamiento se tienen un total de 4610 muestras, mientras

que para validación se tienen 1537 muestras. Ambos grupos de muestras cuentan

con la mayoría de los valores de giro del volante ligeramente hacia la izquierda,

ligeramente a la derecha, y sin ningún giro, o sea recto.

Figura 15. Grupo de imágenes de entrenamiento y validación.

El número total de muestras que se tiene, podría ser insuficiente para

entrenar la RNA, es por esto que se usaron técnicas de aumento con las imágenes

para aumentar el número de muestras, se usaron técnicas como hacerle zoom a la

imagen, añadirle bordes, invertir la imagen en el eje vertical, disminuir su

iluminación, entre otras. Las técnicas de aumento no se aplicaban el 100% de las

veces con todas las imágenes, sino que cada técnica tenía una probabilidad de 50%

Figura 16. Muestra aleatoria de las técnicas de aumento.

32
de aplicarse a la imagen, por lo que ver una imagen con todas las técnicas de

aumento implementadas es muy raro, la figura 16 muestra un ejemplo de las

técnicas de aumento aplicadas a una imagen.

Uno de los últimos pasos antes de entrenar la CNN es preprocesar la imagen,

ya que se requiere que tenga ciertas características antes de ser procesada por la

RNA. Por ejemplo, la imagen debe estar en formato YUV y tener un tamaño de

200x66 píxeles. El preprocesamiento es apreciable en la figura 17.

Figura 17. Imagen preprocesada.

Y el paso final antes de entregarle una imagen a la CNN para su

procesamiento es aplicar las técnicas de aumento en las imágenes de

entrenamiento, lo cual es apreciable en la figura 18.

Figura 18. Imagen de entrenamiento e imagen de validación.

Una vez que se tienen listas las imágenes de entrenamiento y validación,

queda como tal el proceso de entrenar y validar el entrenamiento de la CNN. Para


33
este proceso se hizo uso de Google Colaboratoy, ya que permite la aceleración por

GPU a la hora de compilar el programa, lo cual hace más rápido el proceso en

entrenamiento.

Se hizo uso de las librerías de Keras y Tensorflow para la creación de la CNN,

en la figura 19 se puede apreciar la arquitectura de la CNN creada en base al modelo

de Nvidia para autoaprendizaje.

Figura 19. Resumen de la arquitectura de la CNN creada.

34
Figura 20. Épocas de entrenamiento de la CNN.

Aunque se estuviera usando la aceleración por GPU de Google Colaboratoy,

se creaban y se aplicaban las técnicas de aumento según fueran necesarias en

cada paso de cada época, también para evitar que el proceso de entrenamiento

Figura 21. Gráfica del mse por época del entrenamiento de la CNN.

35
tomara demasiado tiempo, como se puede ver en la figura 20, el entrenamiento de

la red tomó un aproximado de 1600 segundos, o lo que son alrededor de 27 minutos.

Se utilizó el error cuadrático medio (mse por mean squared error) para

evaluar la calidad del entrenamiento por época de la CNN, obteniendo así la gráfica

mostrada en la figura 21.

Para ver la discusión sobre los resultados que se tuvieron respecto a este

segmento, se puede revisar el tema 5.1. De la misma forma, si se desea revisar el

código de Python utilizado para este segmento del trabajo se puede visitar el anexo

del mismo en la sección 7.1.

4.2. Diseño del prototipo de un robot móvil con geometría de Ackermann

En esta sección estará dividido todo el diseño que involucró realizar el

prototipo del robot móvil, desde el diseño mecánico hasta el diseño electrónico. El

nombre otorgado a este prototipo es el de Pibot.

4.2.1. Diseño mecánico

Para el diseño de este prototipo, el punto de partida fue que siguiera la

geometría de Ackermann para el diseño del sistema de dirección. Esta fue la idea

seguida para diseñar la placa base de todo el robot, sobre la cuál estarían montados

todos los componentes. El diseño de esta placa se muestra en la figura 29.

36
Figura 22, Vista isométrica inferior de la base inferior del robot en
Solidworks

Una vez que esta placa fue diseñada, el siguiente diseño importante fue el

del sistema de dirección, ya que de este dependían varios factores de programación

del firmware y software del robot, como por ejemplo el ángulo máximo de giro que

el sistema podía dar. El sistema de dirección diseñado se puede ver en la figura 30.

Figura 23. Sistema de dirección diseñado (en rosa).

37
Habiendo diseñado este sistema de dirección, lo siguiente que quedaba por

hacer era básicamente diseños estéticos y de acomodo de piezas sobre la placa.

Después de varos diseños preliminares, el diseño mostrado en la figura 31 fue el

diseño final que se le dio al prototipo, asemejando una camioneta.

Figura 24. Vista isométrica frontal del diseño final del prototipo del robot
movil.

4.2.2. Diseño electrónico

Para el diseño electrónico se tomó en cuenta principalmente las necesidades

de voltajes de los distintos componentes del robot, teniendo así 12 V de entrada por

parte de la batería y salidas de 3.3V y 5V para alimentar la tarjeta raspberry pi 4, el

microcontrolador SAMD21 y los sensores del robot.

38
Figura 25. Layout de la placa central.

Figura 26. Vista 3D de la placa central.

39
5. Capítulo V. Conclusiones y

observaciones
En este capítulo final de la tesis, se discutirán tanto las conclusiones que se

obtuvieron tras haber realizado el proyecto de investigación, como las conclusiones

y observaciones sobre los resultados obtenidos y presentados en el capítulo

anterior. Para esto, primeramente, se dividirá el capítulo por secciones, para así

organizar las conclusiones según sea la sección.

5.1. Conclusiones y observaciones sobre la Red Neuronal Convolucional

Se puede decir que el entrenamiento de la CNN con los datos obtenidos y la

arquitectura utilizada no fue tan efectivo como se hubiera deseado. Se intentó

entrenar de varias formas diferentes y fueron varios los parámetros que se

modificaron en cada intento. Sin embargo, el mínimo error que se obtuvo en los

intentos fue de 0.0718 para el entrenamiento y 0.0503 para la validación, tal y como

se muestra en el reporte de los resultados obtenidos en la figura 18.

No obstante con que los valores obtenidos en el mse durante el

entrenamiento no hayan cumplido con las expectativas esperadas, se puso a prueba

la efectividad de la CNN en la pista de donde se obtuvieron las imágenes y en una

pista completamente diferente que nuestra RNA veía y exploraba por primera vez.

Para el primer caso, se puede decir que la CNN recorrió la pista dando una

vuelta completa, aunque con algunas complicaciones. Un ejemplo de una

complicación que se tuvo es que el carrito tenía cierta tendencia a seguir la línea de

40
la izquierda muy cercano a ella, mientras que se esperaba que el automóvil siguiera

una trayectoria más centrada al avanzar por la pista, esto que se describe se puede

apreciar de mejor manera en la figura 27.

Figura 27. Automóvil manejando por la primera pista.

Otra de las complicaciones que tuvo la CNN es que a base de que no siempre

iba por el centro del camino, algunas veces chocaba con el borde del camino o con

algún obstáculo que se le atravesara. Cuando se salía del camino tenía

complicaciones para volver, a tal punto de que en algunas ocasiones podía volver,

mientras que en otras no.

41
Figura 28. Automóvil manejando por la segunda pista.

Para la segunda pista, esta era la primera vez que la CNN veía este camino,

por lo cual se esperaba que fallara más fácilmente que en la primera pista, además

que este camino contenía varias curvas en ambas direcciones. Sorpresivamente,

aunque en algunas ocasiones si falló el recorrido al chocar con los bordes, se puede

decir que la CNN tuvo un buen desempeño al poder dar una vuelta completa, al

poder girar incluso en una curva muy pronunciada a una velocidad promedio.

En general, y tras evaluar la CNN creada con la arquitectura mostrada, se

puede concluir que se entrenò bien, aunque no tan satisfactoriamente como se

42
esperaba, únicamente con las imágenes generadas por el simulador. Aunque

también hay que mencionar que los resultados obtenidos del entrenamiento podrían

no ser debido a las imágenes generadas, también se podría dar el caso de que hubo

algún error en la arquitectura propuesta que pudiera generar tales resultados.

5.2. Conclusiones y observaciones sobre el diseño del prototipo del robot

móvil con geometría de Ackermann

El diseño del prototipo robótico del automóvil con geometría Ackermann

requirió de mayor tiempo en realizarse, debido a que el diseño es completamente

propio de los autores de este proyecto. El diseño mecánico estuvo basado en

experiencia propia de diseño de los autores, pero siempre teniendo en cuenta la

geometría de Ackermann para poder permitir el correcto diseño del sistema de

dirección.

A su vez, el diseño electrónico estuvo basado en experiencia propia de los

autores de este prototipo de un robot móvil. Es importante remarcar el

agradecimiento a los ingenieros Esteban Barba e Iván de la Garza, que fueron

miembros del equipo encargado de la creación de este prototipo junto con el autor

de esta Tesis, que sin su contribución en el diseño mecánico y electrónico

respectivamente, no hubiera sido posible.

5.3. Conclusiones y observaciones sobre el proyecto en general

Tras haber trabajado en el desarrollo completo de este prototipo, se adquirió

experiencia por parte del autor en las distintas áreas que incluyó este trabajo, ya

43
sea en el área de trabajo práctico o en el área de trabajo teórico. Esta experiencia

adquirida será muy útil en la búsqueda de futuros proyectos para trabajar ya sea en

un ámbito personal o profesional laboral. En el transcurso del proyecto se iban

presentando nuevas situaciones o problemas que nosotros como equipo de

ingenieros debíamos resolver. Sin duda alguna, por parte del autor, se disfrutó

trabajar en un proyecto de este tipo y se buscará trabajar en un futuro en más

proyectos de robótica móvil.

En cuanto a haber trabajado en el desarrollo de esta tesis como entregable

final de la materia de estancia en la investigación, se puede decir que se adquirió

conocimiento teórico no solo de la investigación como tal, sino de como investigar,

métodos y portales existentes de los cuales se puede obtener información.

44
6. Referencias
Aldabas-Rubira, E., Vega Huerta, H., Cortez Vásquez, A., María Huyana, A., Alarcón

Loayza, L., & Romero Naupari, P. ( 2009). Reconocimiento de patrones

mediante redes neuronales artificiales. Revista de Ingeniería de Sistemas e

Informática, 6(2), 17-26.

Barrientos Sotelo, V. R., García Sánchez, J. R., & Silva Ortigoza, R. (2007). Robots

móviles: Evolución y estado del arte. Polibits, 12-17.

Basogain Olabe, X. (s.f.). Redes Neuronales Artificiales y sus aplicaciones. Bilbao:

Escuela Superior de Ingeniería de Bilbao.

Bermúdez, G. (2002). Robots móvilles. Teoría, aplicaciones y experiencias,.

Tecnura 10, 6-17.

Bojarski , M., Del Testa, D., Dworakowski, D., Firner , B., Flepp, B., Goyal, P., . . .

Zieba, K. (s.f.). End to End Learning for Self-Driving Cars. 1-9.

Castro Gualán, L. Á. (2018). Diseño y fabricación del sistema de dirección de un

vehículo eléctrico ElectroCat. Escuela Técnica Superior de Ingeniería

Industrial de Barcelona.

García Villanueva, M., Ramírez Zavala, S., & Ortega Reyes, H. (2016). Robot móvil

autónomo seguidor de línea con RaspberryPi y sistema de visión artificial.

EDU 07: Pon47.

Gómez Quesada, F. J., Fernández Graciani, M. Á., López Bonal, M. T., & Díaz-

Marta, M. A. (s.f.). Aprebndizaje con Redes Neuronales Artificiales. Escuela

Universitaria Politécnica de Albacete, Universidad de Castilla-La Mancha,

169-179.

45
González Marcos, A., Martínez de Pisón Ascacíbar, F. J., Pernia Espinoza, A. V.,

Alba Elías, F., Castejón Limas, M., Ordieres Meré, J., & Vergara González,

E. (2006). Técnicas y algoritmos básicos de visión artificial. España:

Universidad de la Rioja.

Hernández Sampieri, R., Fernández Collado, C., & Baptista Lucio, P. (2014).

Metodología de la investigación. Sexta Edición. México D.F.: Mc Graw Hill

Education.

Izaurieta, F., & Saavedra , C. (2018). Redes Neuronales Artificiales. Departamento

de física, Universidad de Concepción.

López Flórez, R., & Fernández Fernández, J. M. (2008). Las redes neuronales

artificiales: Fundamentos teóricos y aplicaciones prácticas. España:

Gesbiblo.

Milliken, W. F., & Milliken, D. F. (1995). Race car vehicle Dynamics. E.U.A.: Society

of Automotive Engineers.

Ponz Campos, D. d. (s.f.). Navegación automática en un vehículo con distribución

Ackermann. Universidad Politécnica de Valencia.

Russell, S., & Norvig, P. (2004). Inteligencia Artificial: Un Enfoque Moderno.

Segunda Edición. Madrid: Pearson Educación.

Vicente Lober, J. A. (2003). Técnicas de inteligencia artificial en la construcción de

robots móviles autónomos. Universidad de Salamanca.

46
7. Anexo
7.1. A-1 Código de Python para el seguimiento de un camino

!git clone https://github.com/Kdtito/Behavioural-clonning

!ls Behavioural-clonning

datadir = 'Behavioural-clonning'

columns = ['center', 'left', 'right', 'steering',' throtle', 'throtle', 'speed']

data = pd.read_csv(os.path.join(datadir, 'driving_log.csv'), names = columns)

##Se une el directorio data dir con el csv, y después se especifica el nombre de las

columnas

pd.set_option('display.max_colwidth', -1)#Se muestra todo de cada columna

data.head() #Muestra las primeras 5 filas

def path_leaf(path):

head, tail = ntpath.split(path)

return tail

data['center'] = data['center'].apply(path_leaf)

data['left'] = data['left'].apply(path_leaf)

data['right'] = data['right'].apply(path_leaf)

data.head()

num_bins = 25

samples_per_bin = 400

hist, bins = np.histogram(data['steering'], num_bins)

47
center = (bins[:-1]+ bins[1:]) * 0.5

plt.bar(center, hist, width=0.05)

plt.xlabel('Angulo de giro')

plt.ylabel('Cantidad de imágenes')

plt.plot((np.min(data['steering']), np.max(data['steering'])), (samples_per_bin,

samples_per_bin))

print('total data:', len(data))

remove_list = []

for j in range(num_bins):

list_ = []

for i in range(len(data['steering'])):

if data['steering'][i] >= bins[j] and data['steering'][i] <= bins[j+1]:

list_.append(i)

list_ = shuffle(list_)

list_ = list_[samples_per_bin:]

remove_list.extend(list_)

print('removed:', len(remove_list))

data.drop(data.index[remove_list], inplace=True)

print('remaining:', len(data))

hist, _ = np.histogram(data['steering'], (num_bins))

plt.bar(center, hist, width=0.05)

plt.plot((np.min(data['steering']), np.max(data['steering'])), (samples_per_bin,

samples_per_bin))
48
print(data.iloc[0])

def load_img_steering(datadir, df):

image_path = []

steering = []

for i in range(len(data)):

indexed_data = data.iloc[i]

center, left, right = indexed_data[0], indexed_data[1], indexed_data[2]

image_path.append(os.path.join(datadir, center.strip()))

steering.append(float(indexed_data[3]))

# left image append

image_path.append(os.path.join(datadir,left.strip()))

steering.append(float(indexed_data[3])+0.15)

# right image append

image_path.append(os.path.join(datadir,right.strip()))

steering.append(float(indexed_data[3])-0.15)

image_paths = np.asarray(image_path)

steerings = np.asarray(steering)

return image_paths, steerings

image_paths, steerings = load_img_steering(datadir + '/IMG', data)

X_train, X_valid, y_train, y_valid = train_test_split(image_paths, steerings,

test_size=0.25, random_state=6)

49
print('Training Samples: {}\nValid Samples: {}'.format(len(X_train),

len(X_valid))).

fig, axes = plt.subplots(1, 2, figsize=(12, 4))

axes[0].hist(y_train, bins=num_bins, width=0.05, color='blue')

axes[0].set_title('Training set')

axes[1].hist(y_valid, bins=num_bins, width=0.05, color='red')

axes[1].set_title('Validation set')

def zoom(image):

zoom = iaa.Affine(scale=(1, 1.4))

image = zoom.augment_image(image)

return image

print(image_paths[random.randint(0, len(image_paths))])

image = image_paths[random.randint(0, len(image_paths))]

while image == None:

image = image_paths[random.randint(0, len(image_paths))]

original_image = plt.imread(image)

print (original_image)

zoomed_image = zoom(original_image)

fig, axs = plt.subplots(1, 2, figsize=(15, 10))

fig.tight_layout()

axs[0].imshow(original_image)
50
axs[0].set_title('Original Image')

axs[1].imshow(zoomed_image)

axs[1].set_title('Zoomed Image')

def pan(image):

pan = iaa.Affine(translate_percent= {"x" : (-0.1, 0.1), "y": (-0.1, 0.1)})

image = pan.augment_image(image)

return image

image = image_paths[random.randint(0, 4000)]

original_image = mpimg.imread(image)

panned_image = pan(original_image)

fig, axs = plt.subplots(1, 2, figsize=(15, 10))

fig.tight_layout()

axs[0].imshow(original_image)

axs[0].set_title('Original Image')

axs[1].imshow(panned_image)

axs[1].set_title('Panned Image')

def img_random_brightness(image):

brightness = iaa.Multiply((0.2, 1.2))

image = brightness.augment_image(image)

return image

image = image_paths[random.randint(0, 1000)]

original_image = mpimg.imread(image)

brightness_altered_image = img_random_brightness(original_image)
51
fig, axs = plt.subplots(1, 2, figsize=(15, 10))

fig.tight_layout()

axs[0].imshow(original_image)

axs[0].set_title('Original Image')

axs[1].imshow(brightness_altered_image)

axs[1].set_title('Brightness altered image ')

def img_random_flip(image, steering_angle):

image = cv2.flip(image,1)

steering_angle = -steering_angle

return image, steering_angle

random_index = random.randint(0, 1000)

image = image_paths[random_index]

steering_angle = steerings[random_index]

original_image = mpimg.imread(image)

flipped_image, flipped_steering_angle = img_random_flip(original_image,

steering_angle)

fig, axs = plt.subplots(1, 2, figsize=(15, 10))

fig.tight_layout()

axs[0].imshow(original_image)

axs[0].set_title('Original Image - ' + 'Steering Angle:' + str(steering_angle))

axs[1].imshow(flipped_image)

axs[1].set_title('Flipped Image - ' + 'Steering Angle:' +

str(flipped_steering_angle))
52
def random_augment(image, steering_angle):

image = mpimg.imread(image)

if np.random.rand() < 0.5:

image = pan(image)

if np.random.rand() < 0.5:

image = zoom(image)

if np.random.rand() < 0.5:

image = img_random_brightness(image)

if np.random.rand() < 0.5:

image, steering_angle = img_random_flip(image, steering_angle)

return image, steering_angle

ncol = 2

nrow = 10

fig, axs = plt.subplots(nrow, ncol, figsize=(15, 50))

fig.tight_layout()

for i in range(10):

randnum = random.randint(0, len(image_paths) - 1)

random_image = image_paths[randnum]

random_steering = steerings[randnum]

original_image = mpimg.imread(random_image)

augmented_image, steering = random_augment(random_image,

random_steering)
53
axs[i][0].imshow(original_image)

axs[i][0].set_title("Original Image")

axs[i][1].imshow(augmented_image)

axs[i][1].set_title("Augmented Image")

def img_preprocess(img):

img = img[60:135,:,:]

img = cv2.cvtColor(img, cv2.COLOR_RGB2YUV)

img = cv2.GaussianBlur(img, (3, 3), 0)

img = cv2.resize(img, (200, 66))

img = img/255

return img

image = image_paths[100]

original_image = mpimg.imread(image)

preprocessed_image = img_preprocess(original_image)

fig, axs = plt.subplots(1, 2, figsize=(15, 10))

fig.tight_layout()

axs[0].imshow(original_image)

axs[0].set_title('Original Image')

axs[1].imshow(preprocessed_image)

axs[1].set_title('Preprocessed Image')

def batch_generator(image_paths, steering_ang, batch_size, istraining):

while True:
54
batch_img = []

batch_steering = []

for i in range(batch_size):

random_index = random.randint(0, len(image_paths) - 1)

if istraining:

im, steering = random_augment(image_paths[random_index],

steering_ang[random_index])

else:

im = mpimg.imread(image_paths[random_index])

steering = steering_ang[random_index]

im = img_preprocess(im)

batch_img.append(im)

batch_steering.append(steering)

yield (np.asarray(batch_img), np.asarray(batch_steering))

x_train_gen, y_train_gen = next(batch_generator(X_train, y_train, 1, 1))

x_valid_gen, y_valid_gen = next(batch_generator(X_valid, y_valid, 1, 0))

fig, axs = plt.subplots(1, 2, figsize=(15, 10))

fig.tight_layout()

axs[0].imshow(x_train_gen[0])

axs[0].set_title('Training Image')

axs[1].imshow(x_valid_gen[0])

axs[1].set_title('Validation Image')
55
def nvidia_model():

model = Sequential()

model.add(Convolution2D(24, kernel_size=(5, 5), strides=(2, 2),

input_shape=(66, 200, 3), activation='relu'))

model.add(Convolution2D(36, kernel_size=(5, 5), strides=(2, 2),

activation='relu'))

model.add(Convolution2D(48, kernel_size=(5, 5), strides=(2, 2),

activation='relu'))

model.add(Convolution2D(64, kernel_size=(3, 3), activation='relu'))

model.add(Convolution2D(64, kernel_size=(3, 3), activation='relu'))

#model.add(Dropout(0.5))

model.add(Flatten())

model.add(Dense(100, activation = 'relu'))

model.add(Dropout(0.5))

#model.add(Dense(75, activation = 'relu'))

model.add(Dense(50, activation = 'relu'))

#model.add(Dropout(0.5))

model.add(Dense(10, activation = 'relu'))

#model.add(Dropout(0.5))

model.add(Dense(1))

optimizer = Adam(lr=1e-4)

model.compile(loss='mse', optimizer=optimizer)

return model
56
model = nvidia_model()

print(model.summary())

history = model.fit_generator(batch_generator(X_train, y_train, 100, 1),

steps_per_epoch=300,

epochs=10,

validation_data=batch_generator(X_valid, y_valid, 100,

0),

validation_steps=200,

verbose=1,

shuffle = 1)

plt.plot(history.history['loss'])

plt.plot(history.history['val_loss'])

plt.legend(['training', 'validation'])

plt.title('Loss')

plt.xlabel('Epoch')

model.save('model.h5')

from google.colab import files

files.download('model.h5')

57

You might also like