Documente Academic
Documente Profesional
Documente Cultură
Ingeniería en Informática
febrero de 2011
Universidad San Pablo - CEU
Escuela Politécnica Superior
División de Ingeniería Informática y de Telecomunicación
APELLIDOS NOMBRE
Directores
Director 1 (tantos como sean los directores)
D/Dª
Tribunal calificador
Presidente
D/Dª FIRMA
Secretario
D/Dª FIRMA
Vocal
D/Dª FIRMA
Fecha de calificación
Calificación
Resumen
El presente proyecto surge con el objetivo de diseñar un robot hexápodo programable dedicado
al aprendizaje de programación robótica por parte de estudiantes de ingeniería.
Antes de comenzar el diseño se definieron con claridad los requisitos que el robot debe
cumplir: caminar y rotar simulando el comportamiento de una hormiga u otro insecto de seis
patas, adoptar posturas relativamente complejas, detectar objetos remotamente (mediante una
cámara) y determinar la distancia de posibles obstáculos al caminar, entre otros. Además, el
robot debe ser autónomo en cuanto a fuente de energía y debe poderse controlar remotamente
desde un ordenador.
Una vez comprendidos los requisitos se define la arquitectura principal del sistema. Esta
arquitectura cuenta con tres capas: hardware, servicios de acceso al hardware y software de
control. La capa de hardware incluye todo lo relacionado con la estructura mecánica y
electrónica, los actuadores, sistemas de control y fuentes de energía. Por otro lado, la capa de
servicios de acceso al hardware, como su nombre indica, contiene módulos de software y
firmware cuyo objetivo es servir de mediador entre el software de control y el hardware. Por
último, la capa de software de control constituye el “cerebro” que rige las funciones de alto nivel
del robot.
La estructura mecánica cuenta con 20 grados de libertad, tres en cada pata y dos en el cuello.
Esta estructura se diseñó totalmente utilizando técnicas de diseño asistido por ordenador, para
ello se utilizó la herramienta Varicad 3.01. Las piezas diseñadas se fabricaron en aluminio y
policarbonato. Los actuadores que mueven la estructura son 20 servomotores de radio control.
El robot, además de la electrónica que se desarrolló específicamente para él, cuenta con un
ordenador de a bordo, que ejecuta el sistema operativo Debian Linux 5.0.
4
Una característica notable es la visión artificial que se ha incluido en el robot, la cual consiste
en la detección de rostros humanos mediante una cámara web para posteriormente realizar su
seguimiento. Este módulo de software se ha implementado utilizando las librerías OpenCV.
Al concluir el proyecto se cuenta con un prototipo de robot hexápodo, llamado WHEX 1, sobre
el cual se han aplicado un conjunto de pruebas para validar el correcto funcionamiento de los
subsistemas que lo componen. El proyecto se dio por terminado en el momento en que el
prototipo creado pasó satisfactoriamente todas las pruebas.
5
Abstract
This project has been created to design a programmable hexapod robot, useful as a hardware
platform in the learning of robotics programming.
The first step was to define the specific requirements of the robot: To be able to walk and rotate
simulating the behavior of an ant or other insect with six legs, to adopt relatively complex
postures, to identify objects remotely (via a camera) and determine the distance to potential
barriers while walking, among others. In addition, the robot must be autonomous in terms of
source of energy and should be controllable from a computer.
Once the requirements were understood, the next step was to define the core architecture of the
system. This architecture has three layers: hardware, hardware access services and control
software. The hardware layer includes everything related to the mechanical structure and
electronics, actuators, control systems and energy sources. On the other hand, the hardware
access services layer, as its name suggests, contains software and firmware modules intended
to serve as a mediator between the control software and hardware. Finally, the control software
layer is the "brain" that governs high level functions of the robot.
The mechanical structure has 20 degrees of freedom, three in each leg and two in the
neck. This structure was designed entirely using computer aided design techniques, using
Varicad 3.01 tools. The designed parts were manufactured using aluminum and
polycarbonate. The actuators are 20 radio control servomotors.
The electronics was developed using Labcenter Electronics Proteus and Cadence Orcad 10.3
software tools. All the circuits were simulated and validated previus to their manufacture. The
firmware executed by the PIC microcontrollers included in the electronics was programmed in
assembler and C, using MPLAB IDE.
The robot, as well as the electronics developed specifically for it, features an onboard computer,
running the Debian Linux 5.0 operating system.
The control software was designed to be modular; all the functionality of processing and input-
output is distributed in modules; this characteristic is a prerequisite because the robot needs to
be easily modifiable and programmable. The software was coded using the GCC C++ compiler.
An important feature is the artificial vision that has been included in the robot, which is the
detection of human faces using a webcam to track them later. This software module was
implemented using the OpenCV libraries.
6
The hexapod robot prototype called WHEX 1 was finished at the end of the project, and several
tests were run in order to validate the proper function of its subsystems. Once the prototype
passed all the tests, the project was considered successfully terminated.
7
Dedicatoria
A m i p a dre ,
8
Agradecimientos
A m i f am il ia , es p ec i a l m ente a m is pa dr es , m is her m an os y m i t í a C ac h a , s i n
s u a po yo s e gu r am en t e es te dí a n o ha br ía s id o p os i b l e.
A m i n o v ia S an dr a, f u en t e de m i i ns p ir ac ió n .
A m is pr of es or es , t an t o de l a UP R c om o d e l a E PS , s i n los c o n oc i m ient os q ue
m e ha n d a do n o h a br í a s i do pos i b le t erm in a r es ta obr a .
A l d ir ec t or d e es t e pr o ye c t o, s in s u gu í a to d o h abr ía s i do m u y d if í c i l.
A t od os , m uc h as gr ac i as .
10
Ín d ic e de c o n te n id os
RESUMEN 4
ABSTRACT 6
DEDICATORIA 8
AGRADECIMIENTOS 10
CAPITULO 1: INTRODUCCIÓN 26
2.1 MICROCONTROLADORES 34
2.2 ACTUADORES EN ROBÓTICA 36
2.2.1 MOTORES 36
2.2.2 MOTOR DC CON CAJA REDUCTORA 37
2.2.3 SERVOMOTOR 37
2.2.4 ALAMBRES MUSCULARES 38
2.2.5 MÚSCULOS ARTIFICIALES 39
2.2.6 PISTONES NEUMÁTICOS E HIDRÁULICOS 40
2.3 PLACAS DE CIRCUITO IMPRESO COMERCIALES 40
2.4 SENSORES 41
2.5 BATERÍAS 41
2.5.1 BATERÍAS DE PLOMO 43
2.5.2 BATERÍAS DE NÍQUEL CADMIO 43
2.5.3 BATERÍAS DE NÍQUEL E HIDRURO METÁLICO 44
2.5.4 BATERÍAS DE IONES DE LITIO 44
2.5.5 BATERÍAS DE POLÍMERO DE LITIO. 45
2.6 ALGORITMOS EMPLEADOS EN ROBÓTICA MÓVIL 45
2.6.1 GENERACIÓN DE MOVIMIENTOS EN ROBOTS MÓVILES Y MANIPULADORES 46
2.6.2 ALGORITMOS DE PERCEPCIÓN COMPUTACIONAL 48
2.7 PROYECTOS ACTUALES DE ROBÓTICA MÓVIL 51
2.7.1 ASIMO 51
2.7.2 BIGDOG 52
2.7.3 RHEX 53
2.7.4 AIBO 53
2.7.5 OTROS PROYECTOS DE ROBÓTICA 53
12
3.6.2 REQUISITOS DE INTERFACES EXTERNAS 65
3.6.3 REQUISITOS DE RENDIMIENTO 66
3.6.4 REQUISITOS DE FIABILIDAD 66
6.1 BATERÍAS: 93
6.2 CIRCUITO DE DISTRIBUCIÓN DE ENERGÍA 94
6.3 PLACA CONTROLADORA WHEX 1 95
6.3.1 METODOLOGÍA DE DISEÑO HARDWARE EMPLEADA. 98
6.3.2 DISEÑO DE LOS DIAGRAMAS ESQUEMÁTICOS DE LA PLACA CONTROLADORA. 99
6.3.3 DISEÑO Y FABRICACIÓN DEL CIRCUITO IMPRESO DE LA PLACA CONTROLADORA WHEX 1. 106
6.4 ORDENADOR DE A BORDO 109
7.1 METODOLOGÍAS Y TÉCNICAS EMPLEADAS PARA EL DISEÑO Y CODIFICACIÓN DEL FIRMWARE 115
7.2 DISEÑO Y CODIFICACIÓN DEL PAQUETE CONTROLADOR DE SERVOMOTORES. 117
7.2.1 MÉTODO EMPLEADO PARA CONTROLAR 24 SERVOMOTORES UTILIZANDO UN PIC18F4525. 118
7.2.2 MODELOS MATEMÁTICOS EMPLEADOS PARA LA PROGRAMACIÓN DE LOS TEMPORIZADORES. 119
7.2.3 ALGORITMO DEL PROGRAMA CONTROLADOR DE SERVOMOTORES. 121
7.3 DISEÑO Y CODIFICACIÓN DEL PAQUETE CONTROLADOR PRINCIPAL WHEX 1. 130
7.3.1 ARQUITECTURA GENERAL DEL PAQUETE CONTROLADOR PRINCIPAL WHEX 1. 130
7.3.2 COMUNICACIÓN CON EL EXTERIOR. 131
7.3.3 GESTOR DE PETICIONES. 134
7.3.4 CINEMÁTICA INVERSA 135
7.3.5 GENERADOR DE MOVIMIENTOS. 140
7.3.6 GESTOR DE PERIFÉRICOS. 153
13
CAPITULO 9: DISEÑO Y DESARROLLO DEL SOFTWARE DE CONTROL WHEX 1. 164
BIBLIOGRAFÍA 202
14
Ín d ic e de f i gu r as
16
FIG. 5.18: ESTRUCTURA MECÁNICA DEL CUERPO DE WHEX 1, INCLUYENDO LAS 6 PATAS. ................ 84
FIG. 5.21: PIEZA HEAD 1 DISEÑADA EN VARICAD............................................................................ 85
FIG. 5.19: MECANISMO PAN & TILT COMERCIALIZADO POR LA EMPRESA LYNXMOTION. ...................... 85
FIG. 5.20: PLATINAS EN FORMA DE C UTILIZADAS EN EL MECANISMO PAN & TILT ............................... 85
FIG. 5.22: SECUENCIA DE MONTAJE DE LA CABEZA DEL ROBOT WHEX 1. ......................................... 86
FIG. 5.23: ESTRUCTURA MECÁNICA DE LA CABEZA DEL ROBOT HEXÁPODO WHEX 1. ........................ 87
FIG. 5.25: ESTRUCTURA MECÁNICA TERMINADA DEL ROBOT HEXÁPODO WHEX 1. ............................ 87
FIG. 5.24: SECUENCIA DE UNIÓN DE LA CABEZA DEL ROBOT AL CUERPO. ........................................... 87
FIG. 5.26: PIEZA WHEX BODY 1. ................................................................................................... 88
FIG. 5.27: PIEZA WHEX BODY 2. ................................................................................................... 88
FIG. 5.28: PIEZA WHEX BODY 1 CON EL ORDENADOR INSTALADO. .................................................. 88
FIG. 5.29: PIEZA WHEX BODY 2 CON SERVOMOTORES. .................................................................. 88
FIG. 5.30: CUERPO DEL ROBOT WHEX 1. ....................................................................................... 89
FIG. 5.31: PATA DEL ROBOT WHEX 1............................................................................................. 89
FIG. 6.1: ELEMENTOS DE LA ARQUITECTURA DEL ROBOT QUE ABORDA EL CAPÍTULO 6. ...................... 92
FIG. 6.2: COMPONENTES PRINCIPALES DE LA ELECTRÓNICA DE WHEX 1.......................................... 93
FIG. 6.3: BATERÍA LIPO UTILIZADA EN WHEX 1. ............................................................................. 93
FIG. 6.4: REPRESENTACIÓN ESQUEMÁTICA DEL CIRCUITO DISTRIBUIDOR DE ENERGÍA. ....................... 94
FIG. 6.5: UBEC DE 5 V / 6 V, 3 A CONSTANTES Y 5 A DE PICO, DE MARCA TURNIGY....................... 95
FIG. 6.6: UBEC DE 5 V / 6 V, 8 A CONSTANTES Y 15 A DE PICO, DE MARCA G.T. POWER.................. 95
FIG. 6.7: ESQUEMA QUE REPRESENTA LOS COMPONENTES Y CONECTORES DE LA PLACA WHEX 1. ... 96
FIG. 6.8: PROCESO DE DISEÑO DE HARDWARE SIN UTILIZAR SIMULACIONES. ..................................... 98
FIG. 6.9: PROCESO DE DISEÑO DE HARDWARE UTILIZANDO SIMULACIONES. ....................................... 99
FIG. 6.10: CAMINO LÓGICO SEGUIDO POR LOS DATOS EN LA PLACA CONTROLADORA WHEX 1......... 100
FIG. 6.11: DIAGRAMA ESQUEMÁTICO DEL CIRCUITO DEL DRIVER RS232. ........................................ 101
FIG. 6.12: CONFIGURACIÓN DE LOS JUMPERS DEL DRIVER RS232 PARA: ....................................... 101
FIG. 6.13: DIAGRAMA ESQUEMÁTICO DEL CONTROLADOR PRINCIPAL WHEX 1. .............................. 102
FIG. 6.14: DIAGRAMA ESQUEMÁTICO DEL CONTROLADOR DE SERVOMOTORES. .............................. 105
FIG. 6.15: CAPA SUPERIOR DEL CIRCUITO IMPRESO DE LA PLACA CONTROLADORA WHEX 1............ 107
FIG. 6.16: CAPA INFERIOR DEL CIRCUITO IMPRESO DE LA PLACA CONTROLADORA WHEX 1. ............ 107
FIG. 6.17: VISTA DE SERIGRAFÍA DE ORCAD DE LA PLACA CONTROLADORA. ................................... 108
FIG. 6.18: PLACA CONTROLADORA WHEX 1 INSTALADA EN EL CUERPO DEL ROBOT. ....................... 108
FIG. 6.19: COMPONENTES DEL ORDENADOR DE A BORDO DE WHEX 1. .......................................... 109
FIG. 6.20: PLACA BASE VIA EPIA PICO ITX. .................................................................................. 109
FIG. 6.22: COMPONENTES DEL SUBSISTEMA DE ALMACENAMIENTO CONFIGURADO PARA WHEX 1. .. 110
FIG. 6.21: FUENTE DE ALIMENTACIÓN PICOPSU 60WI .................................................................. 110
FIG. 6.24: PROTOTIPO DEL ROBOT WHEX 1 CONSTRUIDO. ............................................................ 111
FIG. 6.23: CONTROLADORA WIFI USB SMC EZ CONNECT, UTILIZADA EN WHEX 1. ...................... 111
FIG. 7.1: ELEMENTOS DE LA ARQUITECTURA QUE SE ANALIZAN EN EL CAPÍTULO 7. .......................... 114
FIG. 7.2: DIAGRAMA DE DESPLIEGUE DE LOS COMPONENTES DEL ROBOT WHEX 1.......................... 114
FIG. 7.3: GRAFO DE DEPENDENCIAS DE LOS MÓDULOS DEL FIRMWARE DEL ROBOT WHEX 1. .......... 116
FIG. 7.4: INCREMENTOS DEFINIDOS PARA EL DESARROLLO DEL CONTROLADOR DE SERVOMOTORES. 116
FIG. 7.5: INCREMENTOS DEFINIDOS PARA EL DESARROLLO DEL GENERADOR DE MOVIMIENTOS. ....... 116
FIG. 7.6: ESQUEMA DE TIEMPO QUE MUESTRA EL COMPORTAMIENTO DE 8 SEÑALES PWM. ............. 119
FIG. 7.7: ESQUEMA DE TIEMPO QUE MUESTRA LAS 8 SEÑALES PWM SOLAPADAS............................ 119
FIG. 7.8: DIAGRAMA DE FLUJO DEL PROGRAMA PRINCIPAL DEL CONTROLADOR DE SERVOMOTORES. 122
FIG. 7.9: DIAGRAMA DE FLUJO DEL PROCESO ACTUALIZAR POSICIÓN DE SERVOMOTORES. .............. 125
FIG. 7.10: ALGORITMO DEL ESCLAVO I2C ..................................................................................... 126
FIG. 7.11: ARQUITECTURA DEL PAQUETE DE FIRMWARE CONTROLADOR PRINCIPAL WHEX 1 ........... 130
FIG. 7.12: MÁQUINA DE MOORE QUE GESTIONA EL PUERTO SERIE. ................................................. 132
FIG. 7.13: ARQUITECTURA INTERNA DEL GESTOR DE PETICIONES ................................................... 134
FIG. 7.14: SISTEMAS DE COORDENADAS DEFINIDOS PARA LA CINEMÁTICA INVERSA. ........................ 135
FIG. 7.15: MODELO GEOMÉTRICO TRIDIMENSIONAL DE UNA PATA DEL ROBOT WHEX 1. .................. 137
17
FIG. 7.16: PROYECCIÓN DEL MODELO GEOMÉTRICO DE LA FIGURA 3.67 EN EL PLANO ZW. .............. 137
FIG. 7.17: ESQUEMA QUE MUESTRA AL AUTÓMATA GENERADOR DE MOVIMIENTOS. .......................... 140
FIG. 7.18: DIAGRAMA QUE MUESTRA LOS ESTADOS DE LAS PATAS DEL ROBOT Y SUS TRANSICIONES 141
FIG. 7.19: VISTA SUPERIOR DEL ROBOT WHEX 1. ......................................................................... 145
FIG. 7.20: SECUENCIA DE MOVIMIENTOS DE UNA PATA EN UN PASO. ............................................... 145
FIG. 7.21: SECUENCIA DE PASOS QUE EJECUTA EL ROBOT WHEX 1 EN LOS MODOS 0 Y 1. .............. 146
FIG. 7.22: SECUENCIA DE PASOS QUE EJECUTA EL ROBOT WHEX 1 EN EL MODO 2. ........................ 146
FIG. 7.23: SECUENCIA DE PASOS QUE EJECUTA EL ROBOT WHEX 1 EN EL MODO 3. ........................ 146
FIG. 7.24: SECUENCIA DE MOVIMIENTOS DE UNA PATA EN UN PASO CON ANOTACIONES ................... 147
FIG. 7.25: AUTÓMATA GENERADOR DE MOVIMIENTOS CON EL ESTADO 2 AMPLIADO. ........................ 149
FIG. 7.26: VISTA SUPERIOR DEL ROBOT WHEX 1. ......................................................................... 152
FIG. 7.27: SECUENCIA DE MOVIMIENTOS DE UNA PATA AL ROTAR.................................................... 152
FIG. 8.1: ELEMENTOS DE LA ARQUITECTURA QUE SE ANALIZAN EN EL CAPÍTULO 8. .......................... 156
FIG. 9.1: ELEMENTOS DE LA ARQUITECTURA QUE SE ANALIZAN EN EL CAPÍTULO 9. .......................... 164
FIG. 9.2: ARQUITECTURA GENERAL DEL FRAMEWORK WHEX 1. ..................................................... 165
FIG. 9.3: ESTRUCTURA DE BUZONES MANTENIDA POR EL SISTEMA DE COMUNICACIÓN. .................... 167
FIG. 9.4: ARQUITECTURA DEL SOFTWARE CONTROLADOR WHEX 1. ............................................... 171
FIG. 9.5: DIAGRAMA DE FLUJO QUE REPRESENTA EL ALGORITMO DEL PROCESO DRIVER. ................. 173
FIG. 9.6: DIAGRAMA DE FLUJO DEL ALGORITMO DEL PROCESO DETECTOR DE ROSTROS. .................. 178
FIG. 9.7: MECANISMO DE COMUNICACIÓN CONFIGURADO EN EL SOFTWARE DE CONTROL WHEX 1. . 180
FIG. 9.8: MÁQUINA DE MEALY QUE IMPLEMENTA EL MÓDULO SEGUIDOR DE ROSTROS ...................... 182
FIG. 9.9: VENTANA “CONECTAR CON EL ROBOT” DEL CLIENTE WHEX 1. ......................................... 186
FIG. 9.10: VENTANA PRINCIPAL DEL CLIENTE WHEX 1. ................................................................. 186
FIG. 10.1: PIEZAS DE LAS PATAS FABRICADAS EN POLICARBONATO QUE SE DESCARTARON. ............. 190
FIG. 10.2: FIJADOR DE PLÁSTICO RODEANDO EL SERVOMOTOR DE LA CADERA. ............................... 191
FIG. 10.3: CIRCUITO COMMASTERPORT. ...................................................................................... 191
18
Ín d ic e de t a bl as
TABLA 2.1: TABLA DE BÚSQUEDA PARA UNA ARTICULACIÓN EN EL ALGORITMO DE LOCOMOCIÓN FIJA. . 47
TABLA 2.2: PATAS QUE PUEDEN MOVERSE EN EL ALGORITMO DE LOCOMOCIÓN LIBRE. ....................... 48
TABLA 5.1: PRECIOS DE LOS COMPONENTES DE LA ESTRUCTURA MECÁNICA DEL ROBOT WHEX 1. .... 88
TABLA 6.1: PRECIOS DE LOS COMPONENTES DE LA ELECTRÓNICA DEL ROBOT WHEX 1 .................. 111
TABLA 7.1: ESTRUCTURA DE LOS REGISTROS DE VELOCIDAD Y POSICIÓN DE LOS SERVOMOTORES... 123
TABLA 7.2: ASIGNACIÓN DE LAS 24 SEÑALES PWM A LOS INTERVALOS DEFINIDOS EN SU PERÍODO. . 128
TABLA 7.3: ORDEN DE LAS PATAS ASIGNADO A CADA UNO DE LOS MODOS DEL ROBOT. .................... 150
TABLA 9.1: ENTRADAS DEL FICHERO DE CONFIGURACIÓN DEL PROCESO DRIVER. ............................ 174
TABLA 9.2: ENTRADAS DEL FICHERO DE NOMBRES DE COMANDOS. ................................................. 174
TABLA 9.3: MÓDULOS CREADOS E INCLUIDOS DE SERIE EN EL SOFTWARE CONTROLADOR WHEX 1. 179
TABLA 9.4: BUZONES DE MENSAJES QUE SE HAN DEFINIDO Y LOS MÓDULOS SUSCRITOS A ELLOS. .... 179
TABLA 11.1: DURACIONES ESTIMADAS Y REALES DE LAS TAREAS DEL PROYECTO. ........................... 198
20
Bloque I
Introducción
Capítulo
Introducción 1
1 Introducción
Para llegar a este objetivo se ha manifestado la necesidad de realizar las siguientes tareas que
conforman la aproximación que se ha planteado a la solución:
Estudio del estado de la cuestión en materia de desarrollo de robots: tecnologías
existentes, kits comercializados, proyectos actuales, etc.
Diseño y desarrollo de la estructura mecánica del robot: piezas mecánicas de las
extremidades, el cuerpo y la cabeza, así como sus uniones.
Elección de los actuadores, sensores y partes mecánicas comerciales que serán
utilizados, y los que serán desarrollados.
Diseño y desarrollo de una placa controladora de las funciones de bajo nivel del robot,
como son la generación de movimientos y lecturas de los sensores.
Diseño y codificación del firmware de los microcontroladores de la placa creada.
Elección y puesta a punto del hardware de procesamiento de a bordo del robot (placa
base que se utilizará, fuente de alimentación, discos, etc.), maximizando la sencillez del
mismo.
Configuración de una distribución de Linux para operar en el ordenador de a bordo del
robot.
Diseño y codificación del software de control de las funciones de alto nivel del robot,
como son la planificación de movimientos, la navegación y la comunicación.
Crear código de ejemplo para mostrar las potencialidades técnicas y académicas del
robot y un programa cliente para controlarlo.
Diseño y ejecución de las pruebas que debe pasar el sistema creado.
El presente proyecto concluye con la fabricación y prueba del hardware, firmware y software de
control del prototipo. Queda fuera del alcance de este trabajo:
Creación de un sistema de localización y navegación visual del robot.
Creación de un sistema de gestión de energía y carga automática de las baterías del
robot.
Creación de módulos hardware de expansión, aunque sí entra en el trabajo crear las
interfaces hardware necesarias para la expansión mediante tarjetas nuevas.
Funcionamiento del robot en superficies irregulares.
Detección por parte del robot de precipicios, como por ejemplo escaleras.
Es necesario mencionar que los anexos no se han incluido en este documento por motivos de
extensión. Para consultarlos se debe buscar el documento de anexos que se ha incluido en el
CD que se adjunta. Este CD contiene además otros materiales de interés que han sido
generados a lo largo del proyecto, como por ejemplo el diseño tridimensional de la estructura
mecánica del robot, los diagramas esquemáticos de la electrónica y el código fuente de los
distintos módulos de firmware y software, entre otros.
Capítulo
Estado de la cuestión 2
2 Estado de la cuestión
También se comentarán algunos proyectos actuales de robótica, que por su relevancia en los
campos de investigación y comercial se hacen imposibles de pasar por alto.
2.1 Microcontroladores
Estos elementos de procesamiento actúan como bucles de control en los sistemas, permitiendo
leer de sus entradas, procesar los datos recibidos y generar salidas a los diferentes
actuadores. [1]
En robótica los microcontroladores pueden desempeñar varias tareas, dependiendo del grado
de complejidad del robot:
Generación de señales de control de actuadores.
Gestión de entradas provenientes de sensores.
Cerebro del robot, cuando este es sencillo.
Todas estas familias contienen dispositivos muy similares, pudiendo ser programados en
Ensamblador (propio de cada familia y dispositivo), Visual Basic, C, o incluso C++.
2.2.1 Motores
Un motor eléctrico es un dispositivo que transforma energía eléctrica en energía mecánica por
medio de interacciones electromagnéticas [2].
1
http://www.forosdeelectronica.com/wiki/microcontroladores
2
http://www.atmel.com/
3
http://www.microchip.com
4
http://www.freescale.com
5
http://www.renesas.eu/prod/mcumpu/
6
http://www.st.com/mcu/
Este motor se comporta exactamente igual al motor DC, solo que presenta
en su eje de rotación una serie de engranajes reductores, logrando que
disminuya la velocidad de rotación del eje, permitiendo aumentar
considerablemente el torque generado por el motor. Fig. 2.4: Motor DC con
caja reductora.
Son muy útiles en robots móviles con ruedas, siendo un esquema muy extendido el uso de dos
motores, uno en cada rueda del robot, y una rueda no motriz que puede girar en cualquier
sentido (rueda loca).
La figura 2.4 muestra un motor DC con caja reductora acoplada directamente sobre la carcasa
del motor.
2.2.3 Servomotor
Los servomotores solo pueden girar su eje principal un ángulo determinado, por ejemplo 180
grados [3].
El esquema de la figura 2.6 muestra las diferentes partes que componen un servomotor:
El circuito de control interno determina, dada la señal de control, la posición que debe
tener el eje principal del motor.
El circuito de control también lee la información de posición real del eje del motor desde
el sensor que incorpora.
Entonces, si estas dos posiciones difieren, se genera la corriente necesaria hacia el
motor DC que haga girar el eje a la posición deseada.
Si las dos lecturas coinciden, el motor permanece en reposo, manteniendo la posición
actual.
La modulación por ancho de pulso suele utilizarse para codificar la señal de control de los
servomotores, dicha modulación consiste en enviar una serie de pulsos de período constante,
por ejemplo 20 milisegundos, haciendo variar el tiempo en el cual la señal se encuentra en
estado 1 [3], esto se puede ver en la figura 2.7.
Estos alambres metálicos delgados cuando conduce corriente eléctrica se contraen y cuando
dejan de conducir corriente se relajan de forma muy parecida a como lo hace un músculo [4].
7
http://www.mondotronics.com/
terminan en “LT”. El nombre de estos alambres se divide en tres partes: “Flexinol” que es la
marca, luego viene el diámetro en micrones, y luego si es HT o LT. Por ejemplo: el alambre
“FLEXINOL 100 HT” es de 100 micrómetros y se activa a 90 grados centígrados [4]. La figura
2.8 muestra varios alambres de Flexinol.
La figura 2.9 muestra un robot hexápodo que mueve sus patas gracias a esta tecnología.
una válvula.
Para contraer el músculo, es necesario abrir la válvula e inyectar aire presurizado en el interior
del músculo, haciendo que se contraiga. Para relajarlo basta con abrir la válvula y extraer el
9
aire .
Para la utilización de este tipo de actuador es necesario contar con una fuente de aire
presurizado, que puede ser un compresor, un tanque de aire presurizado previamente o la
combinación de ambos elementos.
8
http://lucy.vub.ac.be/gendescription.htm
9
http://www.shadowrobot.com/airmuscles/overview.shtml
Estos dispositivos suelen utilizarse en estructuras mecánicas grandes y Fig. 2.11: Pistones
Hidráulicos.
pesadas, que no requieran de una velocidad de actuación muy elevada,
pues suelen ser lentos, por este motivo no suelen utilizarse en robótica móvil, sí en brazos
robóticos.
Estas placas se suelen utilizar para la sincronización de múltiples Fig. 2.14: Controladora de
servos por I2C.
servomotores en proyectos de robótica móvil con patas y en
manipuladores (brazos robóticos).
10
http://www.lynxmotion.com/Product.aspx?productID=395
11
http://www.electan.com/robotica/6/controladora-30-servos-usb/
12
http://www.acroname.com/robotics/parts/R240-SD21.html
2.4 Sensores
Los sensores son los sentidos de los robots, existen muchos tipos de sensores, desde los más
sencillos, como los detectores de luz, hasta los sensores CCD de imágenes, pasando por
sensores de distancia por infrarrojos y ultrasonidos, de movimiento, de presencia y de campos
magnéticos, entre otros.
2.5 Baterías
Las baterías son utilizadas como fuente de energía de a bordo en robots móviles. Existen en el
13
mercado muchos tipos de baterías :
Plomo
Níquel Cadmio
Níquel e Hidruro Metálico
Iones de Litio.
Polímero de Litio.
13
Más información en: http://www.avele.org/index.php?option=com_content&view=article&id=21&Itemid=26
Antes de describir cada tipo de batería, es necesario definir los conceptos “efecto memoria” y
“auto descarga”, que serán utilizados más adelante.
Efecto Memoria:
El efecto memoria es un fenómeno que reduce la capacidad de las baterías al ser cargadas de
14
forma incompleta . Se produce cuando se carga una batería sin haber sido descargada del
todo o se interrumpe la carga antes de que esta finalice.
a) b)
Fig. 2.15: Efecto memoria.
Dependiendo del tipo de batería, el efecto memoria será más o menos intenso, siendo las de
Níquel Cadmio las más propensas.
Para evitar el efecto memoria basta con realizar cargas completas a las baterías cada cierto
tiempo.
Auto descarga:
Las baterías sufren también de un efecto de auto descarga, o sea, pierden parte de su energía
cuando no son utilizadas.
Una batería de Níquel Cadmio puede perder cerca del 10% su energía en las primeras 24
horas. Normalmente, una batería con una tasa de auto descarga superior a 30% al día deberá
ser reciclada.
14
http://medellincelular.com/consejos/tipos_de_baterias.pdf
Las baterías de plomo son un tipo de batería muy común en automóviles. Suelen dar 6, 12 u
otro múltiplo de 6 V. La tensión que suministra cada celda es de 2 V. Tienen una gran
capacidad de corriente que las hacen ideales para los motores de arranque de vehículos.
Este tipo de batería consiste en un depósito de ácido sulfúrico y dentro de él una serie de
placas de plomo dispuestas alternadamente.
Este tipo de batería presenta muy poco efecto memoria y su grado de auto descarga es
también muy bajo (alrededor del 5% de su carga al mes).
Las baterías de Níquel Cadmio tienen muy baja densidad de energía: tan sólo 50 Wh/kg; lo que
hace que tengan poca capacidad en comparación con su peso.
Debido al efecto nocivo del cadmio para el medio ambiente y a la introducción en el mercado
de las baterías de Níquel e Hidruro Metálico, las baterías de Níquel Cadmio se han dejado de
producir y comercializar.
La tensión proporcionada por una celda es de 1,2V, la densidad de energía es un poco mayor:
80 Wh/Kg.
La figura 2.18 muestra varias baterías de Níquel e Hidruro Metálico, de diferentes tamaños y
capacidades.
Las baterías de Iones de Litio (Li-ion) tienen un ánodo de grafito y un cátodo de óxido de
cobalto, trifilina (LiFePO4) u óxido de manganeso.
Estas baterías tienen un tamaño más reducido respecto a las de otros componentes. Su
tamaño y peso las hace muy útiles para equipos pequeños que requieran potencia y duración,
como por ejemplo un robot.
La robótica es todavía una ciencia joven, una gran comunidad de científicos e ingenieros
continúa investigando sus diferentes áreas. Como fruto de esta investigación han surgido
muchas técnicas y algoritmos relacionados con la generación de movimientos, control y
navegación en robots móviles.
Para que un robot se mueva, este debe determinar la posición a establecer en cada una de sus
articulaciones para lograr una pose determinada y posteriormente sincronizar los movimientos
de todas sus articulaciones para que el cambio de una pose a otra sea el necesario para
generar locomoción u otro movimiento útil.
Para lograr lo anterior se han creado varios algoritmos, a continuación se describirán los más
utilizados.
El problema cinemático inverso consiste en encontrar los valores que deben adoptar las
coordenadas articulares del robot q = [q1, q2, . . . , qn] para que su extremo se posicione y
oriente según una determinada localización espacial, o sea, para posicionar el robot de una
forma determinada, qué valores angulares debo tener en cada articulación [5].
El algoritmo de locomoción fija establece el uso de tablas de búsqueda para determinar qué
articulaciones se mueven a qué posición en cada momento del tiempo. [6]
Se cuenta con tablas similares a la mostrada en la tabla 2.1, una para cada articulación.
El funcionamiento es el siguiente:
Dado el tiempo t, el robot moverá cada una de sus articulaciones al valor que se
encuentre en las tablas, en dicho momento t.
Si en la tabla no hay ningún valor en esa posición, el robot no moverá dicha articulación
en ese tiempo.
15
https://disclab.ua.es/robolab/
Los tiempos suelen indicarse como un entero que se incrementa o como un intervalo
de tiempo desde el evento anterior.
Tiempo Posición
1 30º
2 0º
3 -
4 120º
Tabla 2.1: Tabla de búsqueda para una articulación en el algoritmo de locomoción fija.
Este algoritmo suele utilizarse para generar secuencias predefinidas en robots, como por
ejemplo un baile, o la secuencia de locomoción en un robot con patas. [6]
El algoritmo, una vez creadas las tablas, se comporta de forma rígida, siendo poco adaptable a
cambios de ambiente del robot. [6]
Entonces, lo primero que se debe determinar en cada iteración es la posición del centro de
gravedad del robot, para esto puede ser necesario incluir hardware específico en el robot,
como por ejemplo, sensores de presión en cada pata. [6, 7]
Una vez determinada la posición del centro de gravedad, se analiza que patas pueden ser
levantadas sin que se comprometa la estabilidad.
pueden levantarse cuando el centro de gravedad del robot se encuentra en cada región de la
figura.
Región Patas
A P4, P5, P6
B P3, P5, P6
C P1, P2, P4
D P1, P2, P3
E P2, P3, P4, P6
F P1, P3, P4, P5
G P1, P2, P3,P4,P5,P6
H P2, P4, P6
I P1, P3, P5
Fig. 2.21: Robot hexápodo, vista superior. Tabla 2.2: Patas que pueden moverse en el algoritmo de
Regiones para el algoritmo de locomoción locomoción libre según la región en la que se encuentre
libre. el centro de gravedad del robot.
El resultado de este algoritmo es un movimiento mucho más adaptable a los cambios del
entorno del robot en comparación con el algoritmo de locomoción fija [6, 7].
En la figura 2.23 se puede apreciar que cada rectángulo posee regiones claras y regiones
oscuras, a continuación se describirá cómo son utilizadas dichas ventanas a la hora de extraer
las características de la imagen.
El detector implementado en las librerías OpenCV utiliza las características Haar mostradas en
la figura 2.24. [11]
Utilizando varios clasificadores simples (que utilizan una sola característica de las
anteriormente descritas), es entrenado un clasificador resultante de la combinación lineal de
estos, partiendo de muchas imágenes del objeto que se quiere reconocer. Una vez concluido el
entrenamiento, el clasificador es capaz de detectar los objetos en una imagen.
1 Calcular las imágenes integrales de cada imagen que será utilizada en el entrenamiento.
Sea X el conjunto de todas las imágenes integrales que serán utilizadas en el
entrenamiento.
2 Representar las imágenes y su clase con (x, y), donde x X es la imagen integral e y es su
clase (-1: imagen negativa, 1: imagen positiva).
3 Se define m: cantidad de imágenes que se utilizará en el entrenamiento.
4 Para cada: (x1, y1), . . . , (xm, ym); xi X, yi {−1, 1}
4.1 Inicializar los pesos W1(i) = 1/m
4.2 Iterar por t = 0, … , T-1, (t: clasificador débil, T: número de clasificadores débiles a
emplear):
a) Seleccionar el clasificador base ht(xi) respecto al peso del error:
b) Calcular:
16
2.7.1 Asimo
La primera versión del robot fue creada en 1986. El resultado es ASIMO, un robot humanoide
tecnológicamente muy avanzado, capaz de andar, correr, subir y bajar escaleras, girarse
17 18
suavemente e imitar muchos otros movimientos humanos.
16
http://world.honda.com/ASIMO/
17
http://www.roboticspot.com/especial/asi2004/asi2004.php
18
http://www.abadiadigital.com/articulo/historia-de-los-robots-de-honda-del-proyecto-e0-a-asimo/
19
El robot ASIMO cuenta con los siguientes sensores :
Sensor de superficie del suelo: es un sensor láser, que utiliza para determinar la
inclinación del suelo y los obstáculos que podría haber, como por ejemplo, huecos.
Cámara estereoscópica: sensor compuesto por dos cámaras de vídeo situadas en la
posición de los ojos.
Dos sensores de distancias por ultrasonidos, uno en el pecho y otro en la espalda.
Dos micrófonos situados en su cabeza, para el reconocimiento de sonidos.
Un giroscopio y un acelerómetro situados en el torso, utilizados para mantener el
equilibrio.
Sensores de presión en los pies.
20
2.7.2 BigDog
Mide 0,91 m de largo, por 0,76 de alto y pesa 110 kg; más o
19
menos como una mula pequeña. Fig. 2.26: Robot cuadrúpedo
militar BigDog.
Es capaz de atravesar terrenos complicados a una velocidad de 6,4 km/h cargando hasta 150
kg de peso y de subir pendientes de 35°. Un ordenador de a bordo controla la tracción, en base
a las entradas que recibe de los múltiples sensores con los que cuenta el robot, así como la
19
navegación y el equilibrio.
BigDog está alimentado por un motor 15-HP go-kart de dos tiempos y un cilindro a 9.000 rpm,
el cual acciona una bomba hidráulica, la cual a su vez acciona los actuadores de las piernas.
Cada pierna tiene cuatro actuadores, dos para el junte con la cadera, uno para la rodilla y otro
para el tobillo, por lo que cada robot tiene un total de 16.
El ordenador de a bordo consta de una placa base PC/104 modificada, con un procesador
Pentium 4. Utiliza QNX como sistema operativo.
19
http://nosoyfriky.wordpress.com/2009/10/08/asimo-sensores-y-grados-de-libertad/
20
http://www.bostondynamics.com/robot_bigdog.html
21
http://www.bostondynamics.com/img/BigDog_IFAC_Apr-8-2008.pdf
22
2.7.3 RHex
24
2.7.4 Aibo
Aibo es capaz de reconocer los gestos e incluso la actitud corporal de su dueño, es sensible a
las caricias, tiene mucha capacidad de movimientos y equilibrio.
A parte de haber sido concebido como una mascota, Aibo se ha usado para la investigación de
la inteligencia artificial, dado que integra una computadora, sistema de visión y motores de
articulación en un único paquete muy barato comparado con otros robots de investigación de
inteligencia artificial más comunes.
Las imágenes 2.29, 2.30, 2.31 y 2.32 muestran robots hexápodos que utilizan servomotores de
radio control como actuadores, y las placas controladoras de servomotores mencionadas
anteriormente como cerebro del robot.
22
http://www.bostondynamics.com/robot_rhex.html
23
http://www.bostondynamics.com/dist/RHex.wmv
24
http://support.sony-europe.com/aibo/index.asp
Fig. 2.29: Robot hexápodo Lynxmotion Phenix. Fig. 2.30: Robot hexápodo de Micromagic.
Fig. 2.31: Robot hexápodo Hexpider. Fig. 2.32: Robot hexápodo A-Pod.
Los cuatro robots anteriores son muy similares, todos usan cinemática inversa para generar
sus movimientos, que son llevados a cabo por medio de sus actuadores de tipo servomotores
de radiocontrol y no presentan procesamiento a bordo, necesitan de un ordenador externo para
operar.
En este capítulo se han analizado las diferentes tecnologías que se utilizan en el campo de la
robótica así como los distintos proyectos existentes en la actualidad, algunos tan ambiciosos
como Asimo y BigDog, mientras que otros se han desarrollado con presupuestos muchísimo
menores, como es el caso de RHex, pero que no dejan de sorprender en cuanto a las
habilidades que son capaces de desarrollar.
Capítulo
Especificación de requisitos 3
3 Especificación de requisitos
La presente especificación describe los requisitos que el robot WHEX 1 debe cumplir una vez
terminado su desarrollo. Dichos requisitos incluyen las funcionalidades, restricciones y
características de rendimiento del sistema así como de las interfaces mediante las cuales se
interactuará con este.
El propósito de esta sección de la memoria del proyecto es asegurar que los requisitos
plasmados en ella queden definidos y se comprendan correctamente.
Los robots WHEX 1 de la figura 3.1 se encuentran conectados a ordenadores remotos a través
de un enlace WIFI, configurado en modo de infraestructura, por tanto el entorno debe tener un
punto de acceso para la conectividad con los robots, e incluso entre ellos.
En primer lugar, se caracterizará al robot que se desea crear, describiéndolo según los
siguientes criterios de clasificación.
El robot WHEX 1 será un robot móvil de seis patas, de propósito general. Se ha concebido
como plataforma hardware para el entrenamiento en técnicas de programación robótica, por
este motivo debe ser programable.
WHEX 1 debe ser totalmente autónomo en cuanto a energía. En cuanto al control, WHEX 1
debe ser híbrido, permitiendo la posibilidad de ser controlado remotamente sin que esto impida
que en un momento determinado se comporte de forma autónoma.
3.3 Funciones
El robot WHEX 1 debe ser capaz de desplazarse, rotar, detectar objetos próximos e incluso
reconocerlos.
El cuerpo del robot debe poder adoptar posturas complejas que consideren los siguientes
aspectos:
Inclinación del cuerpo: el robot debe poder inclinar el cuerpo hasta un ángulo de 30
grados en todas direcciones.
Desplazamiento del centro de gravedad del cuerpo: el robot debe poder desplazar su
centro de gravedad realizando movimientos de alabeo.
Altura del cuerpo: el robot debe poder modificar la altura de su cuerpo.
Grado de apertura de patas: las patas del robot deben poder situarse más o menos
cercanas al cuerpo para así crear posturas más relajadas o contraídas.
Además de la adopción de posturas complejas, el robot deberá ser capaz de caminar y rotar,
manteniendo la postura que se halla establecido previamente, a varias velocidades y en
cualquier sentido. Para esto se definen 4 modos:
Modos 0 y 1: En estos modos el robot camina o rota moviendo solo una pata cada vez.
En el modo 0 la velocidad de desplazamiento es inferior a la alcanzada en el modo 1.
Modo 2: En este modo el robot es capaz de desplazarse y rotar moviendo
simultáneamente dos patas.
Modo 3: En este modo el robot mueve simultáneamente tres patas.
Mientras camina o rota, WHEX 1 deberá tener la posibilidad de detectar los obstáculos que
pudiese encontrar a su paso, impidiendo, por ejemplo, que se produzca un choque. Así mismo
se proporcionará la posibilidad de reconocer y clasificar objetos mediante el uso de una
cámara. Se podrá seleccionar la dirección a la cual apuntar la cámara.
3.5 Restricciones
En este apartado se presentan los requisitos funcionales que deben ser satisfechos por el
sistema desarrollado.
Los requisitos funcionales se han descrito mediante casos de uso, estos casos de uso se
muestran a continuación:
Prioridad: Alta
Actor principal: El usuario
Actores de apoyo: No existen.
Casos de uso relacionados: (1) Comenzar a caminar y (2) comenzar a rotar.
Precondiciones: No existen.
Postcondiciones: Después de la ejecución del caso de uso se han establecido el vector de
dirección de movimientos, el grado de giro al desplazarse y la dirección de giro.
Escenario principal de éxito: Se escriben el vector de dirección de movimientos, el grado de
giro al desplazarse y la dirección de giro en los registros del hardware del robot.
Escenarios alternativos: (1) El grado de giro no es un valor real comprendido entre -1 y 1 y
(2) la dirección de giro no es un valor booleano.
Prioridad: Alta
Actor principal: El usuario
Actores de apoyo: No existen.
Casos de uso relacionados: (1) Adoptar postura.
Precondiciones: No existen.
Postcondiciones: Después de la ejecución del caso de uso se han establecido los parámetros
que describen la postura del cuerpo.
Escenario principal de éxito: Se escriben los datos de inclinación y altura del cuerpo, el grado
de separación de las patas y la posición del centro de gravedad en los registros del hardware
del robot.
Escenarios alternativos: (1) Los datos no se encuentran dentro de los rangos permitidos.
Prioridad: Alta
Actor principal: WHEX 1
Actores de apoyo: No existen.
Casos de uso relacionados: No existen.
Precondiciones: El robot no se encuentra en estado de reposo.
Postcondiciones: Después de la ejecución del caso de uso la articulación se ha movido hacia
el ángulo determinado.
Escenario principal de éxito: La articulación se mueve hacia el ángulo deseado a la velocidad
establecida.
Escenarios alternativos: (1) El ángulo es menor que 0 o mayor que 180 y (2) velocidad es
igual a cero.
Prioridad: Alta
Actor principal: WHEX 1
Actores de apoyo: No existen.
Casos de uso relacionados: (1) Mover articulación.
Precondiciones: El robot no se encuentra en estado de reposo y el punto hacia el cual se
desea mover la pata es alcanzable por esta.
Postcondiciones: Después de la ejecución del caso de uso el extremo de la pata se encuentra
en el punto deseado.
Escenario principal de éxito: Se comprueba que la pata se encuentra en posición.
Escenarios alternativos: (1) El punto está fuera del alcance de la pata.
Prioridad: Media
Actor principal: El usuario; WHEX 1
Actores de apoyo: No existen.
Casos de uso relacionados: No existen.
Precondiciones: No existen.
Postcondiciones: Con la ejecución del caso de uso se obtiene la medición de la distancia
hacia el objeto más cercano.
Escenario principal de éxito: Se lee una distancia mayor que cero.
Escenarios alternativos: (1) Se lee cero, significando que el sensor no se encuentra
preparado para realizar una medición.
Prioridad: Media
Actor principal: WHEX 1
Actores de apoyo: No existen.
Casos de uso relacionados: No existen.
Precondiciones: La cámara se encuentra preparada para tomar una fotografía.
Postcondiciones: Con la ejecución del caso de uso se obtiene una lista de objetos clasificados
que han sido detectados por el robot.
Escenario principal de éxito: Se obtiene un listado (posiblemente vacío) de objetos
reconocidos.
Escenarios alternativos: (1) No se puede inicializar la cámara.
Prioridad: Media
Actor principal: WHEX 1
Actores de apoyo: No existen.
Casos de uso relacionados: (1) reconocer objeto visualmente; (2) mover articulación; (3)
mover pata y (4) leer distancia a objeto.
Precondiciones: Se ha detectado un objeto.
Postcondiciones: El robot mueve la cámara en dirección al objeto que se desea seguir,
enfocando en todo momento dicho objeto.
Escenario principal de éxito: El objeto se encuentra centrado en el espacio visual de la
cámara.
Escenarios alternativos: (1) Se pierde el objeto que se está siguiendo.
Prioridad: Alta
Actor principal: El usuario
Actores de apoyo: No existen.
Casos de uso relacionados: (1) Enviar datos de movimiento y (2) gestionar movimientos.
Precondiciones: El robot no se encuentra en estado de reposo; el modo establecido es menor
o igual que 4.
Postcondiciones: Con la ejecución del caso de uso se observa que el robot comienza a
caminar, cambiando su estado a Caminando.
Escenario principal de éxito: el robot se encuentra en estado Caminando.
Escenarios alternativos: (1) El robot no puede iniciar a caminar si se encuentra en estado de
reposo.
Prioridad: Alta
Actor principal: El usuario
Actores de apoyo: No existen.
Casos de uso relacionados: (1) Enviar datos de movimiento y (2) gestionar movimientos.
Precondiciones: El robot no se encuentra en estado de reposo; el modo establecido es menor
o igual que 4.
Postcondiciones: Con la ejecución del caso de uso se observa que el robot comienza a rotar
hacia la dirección establecida previamente, cambiando su estado a Rotando.
Escenario principal de éxito: el robot se encuentra en estado Rotando.
Escenarios alternativos: (1) El robot no puede iniciar a rotar si se encuentra en estado de
reposo.
Prioridad: Alta
Actor principal: El usuario
Actores de apoyo: No existen.
Casos de uso relacionados: (1) Gestionar movimientos.
Precondiciones: El robot se encuentra en estado Caminando o Rotando.
Postcondiciones: Con la ejecución del caso de uso se observa que el robot comienza la
secuencia de detención, cambiando su estado a Detenido.
Escenario principal de éxito: El robot se encuentra en estado Detenido.
Prioridad: Alta
Actor principal: El usuario
Actores de apoyo: No existen.
Casos de uso relacionados: (1) Mover pata y (2) establecer datos de postura.
Precondiciones: Se han establecido correctamente los datos de la postura que se desea
adoptar.
Postcondiciones: El robot adopta la postura definida por los datos de postura establecidos
con anterioridad y se mantiene inmovil.
Escenario principal de éxito: El robot se queda inmóvil, adoptando la postura deseada.
Escenarios alternativos: No existen
Prioridad: Alta
Actor principal: WHEX 1
Actores de apoyo: No existen.
Casos de uso relacionados: (1) Mover pata; (2) leer distancia a objeto y (3) reconocer objeto
visualmente.
Precondiciones: No existen.
Postcondiciones: El caso de uso se mantiene funcionando continuamente mientras el robot se
encuentre energizado.
Escenario principal de éxito: El robot realiza las acciones necesarias, dependiendo del
estado en el que se encuentre.
Escenarios alternativos: No existen
En este apartado se definen los requisitos que deben cumplir las interfaces existentes en el
robot.
Interfaces de usuario
El robot WHEX 1 se podrá comandar desde un ordenador remoto a través de una conexión
inalámbrica. En el ordenador remoto deben facilitarse dos interfaces de usuario:
Interfaz de texto:
La primera interfaz de usuario debe ser de tipo texto. En esta interfaz se mostrará un mensaje
pidiendo los datos de usuario y contraseña para realizar la conexión con el robot. En caso de
que la conexión se realice correctamente se notificará al usuario y se comenzará a aceptar
comandos para enviar al robot.
En esta sintaxis el texto del comando debe ser una cadena alfanumérica que comience por una
letra y el dato, opcional, un valor numérico.
Interfaz gráfica:
Interfaces hardware
No se han definido.
Interfaces software
Esta interfaz se definirá mediante clases y macros que formen, en su conjunto, un framework
de desarrollo de nuevas funcionalidades utilizando el lenguaje C++.
Interfaces de comunicación
La interfaz de comunicación que empleará el robot WHEX 1 para conectar con ordenadores
remotos será un enlace WIFI sobre el cual se encontrará montada una red TCP/IP de
direccionamiento dinámico, de modo que el entorno sea responsable de la funcionalidad
DHCP.
Esta red se utilizará para establecer conexiones inalámbricas TCP utilizando un protocolo
cliente servidor desarrollado íntegramente para el robot WHEX 1. El robot actuará en modo
servidor siempre que la conexión se establezca con un ordenador remoto y opcionalmente
podrá actuar como cliente en caso de programarse algún modo cooperativo entre varios robots
WHEX 1.
La fiabilidad del sistema creado debe ser acorde con el propósito académico del mismo.
Es necesario que la estructura mecánica sea lo suficientemente robusta como para soportar
maltrato moderado causado por la programación errónea de movimientos por parte de los
usuarios: movimientos que puedan, en algún momento, luxar alguna articulación. Por este
motivo las articulaciones deben protegerse a varios niveles, desde el nivel mecánico hasta el
nivel de control para evitar que una orden errónea resulte en un movimiento fuera del rango de
la articulación.
Así mismo debe protegerse el circuito electrónico añadiendo algún dispositivo de seguridad que
desconecte la alimentación en caso de avería o sobre-consumo, por ejemplo un fusible.
Se desarrollarán baterías de prueba que deben pasar el firmware y el software de control para
que pueda darse por terminado su desarrollo.
Capítulo
Arquitectura general del sistema 4
Una vez analizados los requisitos, se ha diseñado la arquitectura general del sistema a
desarrollar. El diagrama de la figura 4.1 muestra los componentes principales de dicha
arquitectura.
Fig. 4.1: Diagrama de capas que muestra los componentes principales de la arquitectura general del robot WHEX 1.
A continuación se describen brevemente cada una de estas capas, sus componentes internos y
las funciones que desempeñan.
La capa de hardware integra la estructura mecánica, los actuadores que mueven dicha
estructura, la electrónica de control y el sistema de alimentación. Esta capa es en sí el cuerpo
físico del robot.
La estructura mecánica da soporte a todo el sistema, es el cuerpo del robot y le permite actuar
en el mundo físico. La estructura mecánica también alberga todos los sistemas de a bordo del
robot.
La estructura se mueve por motivo del trabajo realizado por los actuadores que, en el caso del
robot WHEX 1, son servomotores de modelismo, específicamente los modelos:
HITEC HS311: Articulaciones verticales de las caderas y articulaciones del cuello.
BlueBird BMS620MG: Articulaciones de la rodillas.
BlueBird BMS630MG: Artiulaciones horizontales de las caderas.
El sistema de alimentación regula la tensión proveniente de las baterías del robot y envía dicha
tensión hacia la electrónica y los actuadores.
La placa controladora WHEX 1 se encarga de la ejecución del firmware del robot. La función
principal de esta placa es servir de enlace entre el ordenador de a bordo del robot y los
sensores y actuadores de la estructura mecánica del mismo. Esta placa también se encarga de
las funciones de bajo nivel, por ejemplo la lectura de los sensores y la generación de señales
PWM de los servomotores, entre otros.
El Framework WHEX 1 se ha diseñado con el objetivo de dar soporte a los programadores para
que puedan crear nuevas funcionalidades para el robot de forma sencilla.
El framework permite a los programas de control del robot (módulos de usuario) acceder a los
recursos de la plataforma hardware y permite que dichos programas se comuniquen entre sí.
La ventaja principal de este framework es que posibilita la creación de software de control muy
fácil de modificar en un futuro (debido a la modularidad) y por tanto facilita que el robot pueda
ser utilizado como plataforma académica para el aprendizaje de programación robótica.
Los módulos de usuario son los programas que rigen el funcionamiento global del robot.
Como puede verse en el esquema de la figura 5.1, en este capítulo se mostrará el diseño de
las partes mecánicas del robot hexápodo WHEX 1: la estructura mecánica y los servomotores;
explicando las decisiones que se han tomado, las piezas fabricadas y las adquiridas; así como
el proceso de fabricación que se ha seguido.
Para el cuerpo del robot se han diseñado 3 piezas planas, de 3 mm de espesor. Las imágenes
5.2, 5.3 y 5.4 muestran el trazado y una vista tridimensional de cada una de estas piezas.
La pieza de la figura 5.2, llamada WHEX Body 1 se ha diseñado para ser fabricada utilizando
cualquier plancha de plástico, por ejemplo policarbonato o PVC, pudiendo ser algo flexible, ya
que la rigidez del cuerpo del robot vendrá dada por la combinación de esta pieza con las
siguientes que se han diseñado.
a) b)
Fig. 5.2: Pieza WHEX Body 1 diseñada en VariCAD.
La figura 5.3 muestra el trazado en VariCAD y una vista tridimensional de la segunda pieza del
cuerpo del robot, llamada WHEX Body 2, la cual ha sido diseñada para ser fabricada en
aluminio de 2 mm. En esta pieza van fijos los servomotores de las caderas del robot.
a) b)
Fig. 5.3: Pieza WHEX Body 2 diseñada en VariCAD.
La figura 5.4 muestra la tercera pieza que se ha diseñado para conformar el cuerpo del robot,
llamada WHEX Body Cover. Esta pieza se utiliza como cubierta del ordenador de a bordo y su
función principal es protegerlo.
a) b)
Fig. 5.4: Pieza WHEX Body Cover diseñada en VariCAD.
La figura 5.5 muestra los componentes del cuerpo del robot WHEX 1 dispuestos según el orden
de montaje de las piezas. Los pasos de la secuencia de montaje son los siguientes:
1) Fijar cada servomotor a la pieza WHEX Body 2, utilizando los espaciadores y tornillos
mostrados en la figura 5.6b.
2) Fijar la pieza WHEX Body 1 a los espaciadores montados en el paso 1 utilizando las
tuercas de la figura 5.6b.
3) Fijar la pieza WHEX Body Cover al cuerpo del robot, utilizando los espaciadores,
tornillos y tuercas de la figura 5.6a.
Opcionalmente puede añadirse a la pieza WHEX Body Cover una malla metálica u otra
superficie plana para cubrir las cuatro aberturas de la misma
Una vez terminado el montaje, el cuerpo del robot debe asimilarse al esquema de la figura 5.7.
Es necesario mencionar que puede accederse al interior del robot, a través de la cubierta
(pieza WHEX Body Cover), quitándola temporalmente.
Para el montaje de la electrónica en el robot, se utilizan los agujeros para tornillos de la pieza
WHEX Body 2.
Fig. 5.5: Componentes del cuerpo del robot WHEX 1 dispuestos en orden de montaje.
a) b)
Fig. 5.6: Separadores, tuercas y tornillos utilizados en el montaje del cuerpo del robot.
a) Separador hexagonal de 15 mm de largo con terminales hembra – macho con rosca M3 y tornillo y tuerca
M3 utilizados en el montaje de la pieza WHEX Body Cover.
b) Separador hexagonal de 30 mm de largo con terminales hembra – macho con rosca M3 y tornillo y tuerca
M3 utilizados en el montaje de las piezas WHEX Body 1, WHEX Body 2 y los servomotores de las caderas
del robot.
Fig. 5.7: Estructura mecánica ensamblada del cuerpo del robot WHEX 1.
Para el diseño de las patas del robot hexápodo WHEX 1 se tuvieron en cuenta varios aspectos:
los grados de libertad que se debía otorgar a cada pata, la flexibilidad de los materiales que
debían ser utilizados y el máximo grado de torsión tolerable, entre otros.
Se diseñaron dos modelos de pata, uno con dos grados de libertad, mostrado en la figura 5.8a
y otro con tres, mostrado en la figura 5.8b.
a) b)
Fig. 5.8: Modelos de pata diseñados para el robot WHEX 1.
El modelo mostrado en la figura 5.8a es bastante sencillo, presenta dos grados de libertad
(ambos en la cadera), pudiendo ejecutar movimientos básicos como la traslación y rotación del
robot, pero no permite la adopción de posturas complejas (requisito necesario). Por otro lado, el
modelo mostrado en la figura 5.8b, al tener tres grados de libertad (dos en la cadera y uno en la
rodilla), permite un número muy elevado de movimientos y posturas, por este motivo, a pesar
de ser más complejo, se ha decidido utilizarlo para las patas del robot WHEX 1.
Al diseñar la pata según el modelo de tres grados de libertad, se han desarrollado dos piezas,
que deben ser fabricadas utilizando planchas de aluminio de 3 mm. Estas piezas se deben
fabricar en aluminio para garantizar una baja torsión mecánica, minimizando el error inducido
por la torsión; entonces, el error mecánico de cada pata, solo vendrá dado por la precisión de
los servomotores de cada articulación.
La figura 5.9 muestra la primera pieza fabricada, llamada Leg 1 y la figura 5.10 muestra la
segunda pieza Leg 2.
Fig. 5.9: Trazado en VariCAD y representación Fig. 5.10: Trazado en VariCAD y representación
tridimensional de la pieza Leg 1. tridimensional de la pieza Leg 2.
La figura 5.11 muestra de forma esquemática los componentes de la pata, en esta se puede
apreciar la forma en que deben montarse dichos componentes para conformar la estructura
mecánica.
superior del movimiento de la rodilla debe formar un ángulo de 180 grados con la recta
definida por los extremos de la pieza Leg 2 (ver figura 5.12a).
3) Fijar el otro extremo de la pieza Leg 2 a la platina del servomotor de la cadera. En este
paso es necesario también garantizar un rango de movimientos correcto de la
articulación de la cadera, o sea, el tope superior del movimiento debe formar un ángulo
de 90 grados con la horizontal (ver figura 5.12b).
4) Por último fijar la punta de goma antideslizante de la figura 5.13 al extremo de la pata.
1
2
3
4
5 6
7
8
Fig. 5.11: Componentes de la estructura mecánica de las patas del robot hexápodo WHEX 1.
1. Pieza Leg 1.
2. Tornillo y tuerca de fijación del servomotor de la rodilla.
3. Servomotor de la rodilla.
4. Tornillos y tuercas de fijación de la pieza Leg2 a las platinas giratorias de los servomotores de la
cadera y la rodilla.
5. Pieza Leg 2.
6. Servomotor de la cadera.
7. Tornillo y tuerca de fijación de la punta de goma de la pata.
8. Punta de goma antideslizante de la pata.
a) b)
Fig. 5.12: Rango permitido de movimientos de las articulaciones de la pata.
Hecho lo anterior, la estructura terminada debe ser similar a la mostrada en la figura 5.14 y
debe poder moverse según los rangos de movimientos anteriormente descritos en la figura
5.12.
Fig. 5.13: Puntas de goma Fig. 5.14: Representación Fig. 5.15: Soporte multifuncional
antideslizante comercializadas por esquemática de la estructura para servomotores comercializado
la compañía Lynxmotion. mecánica de una pata del robot por la compañía Lynxmotion.
hexápodo WHEX 1 terminada.
Fig. 5.16: Pasos de la secuencia de unión de cada pata al cuerpo del robot hexápodo WHEX 1 utilizando
el soporte multifuncional para servomotores de Lynxmotion.
Fig. 5.17: Rango de movimientos de los servomotores de la cadera que se encuentran fijos al cuerpo del robot.
Una vez unidas las seis patas al cuerpo, la estructura mecánica del robot debe
parecerse al esquema de la figura 5.18.
Fig. 5.18: Estructura mecánica del cuerpo de WHEX 1, incluyendo las 6 patas.
La cabeza del robot WHEX 1 tiene la función principal de dar soporte a los sensores de
visión (Cámara Creative Live Cam) y de distancias por ultrasonidos (SRF08).
La cabeza cuenta con un mecanismo Pan & Tilt (a modo de cuello) que le permite
ajustar la dirección en que apuntan los sensores que soporta, para esto emplea dos
servomotores, uno para el desplazamiento vertical y otro para el horizontal.
La figura 5.19 muestra el mecanismo Pan & Tilt que se ha optado utilizar, este es
comercializado en forma de kit por la empresa Lynxmotion. Este mecanismo está
formado por dos servomotores, un soporte multifuncional para servomotores (ver figura
5.15) y una platina en forma de C, mostrada en la figura 5.20.
Fig. 5.19: Mecanismo Pan & Tilt Fig. 5.20: Platinas en forma de C utilizadas en
comercializado por la empresa Lynxmotion. el mecanismo Pan & Tilt del cuello de WHEX 1
Para montar los sensores en el mecanismo anterior se ha diseñado una pieza, llamada
Head 1, mostrada en la figura 5.21.
a) b)
Fig. 5.21: Pieza Head 1 diseñada en VariCAD.
2
F 4
3
5
C
C
E D
G
A
Una vez terminado el montaje de la cabeza, esta debe ser semejante al esquema de la
figura 5.23.
a) b)
Fig. 5.23: Estructura mecánica de la cabeza del robot hexápodo WHEX 1.
Todas las piezas diseñadas fueron fabricadas de forma artesanal utilizando, entre otras
herramientas, una multifuncional Dremel.
Tabla 5.1: Precios de los componentes de la estructura mecánica del robot WHEX 1.
A continuación se muestran imágenes reales de algunas de las piezas que han sido
fabricadas, así como de diferentes estados intermedios del montaje del robot.
Fig. 5.26: Pieza WHEX Body 1. Fig. 5.27: Pieza WHEX Body 2.
Fig. 5.28: Pieza WHEX Body 1 con el ordenador Fig. 5.29: Pieza WHEX Body 2 con servomotores.
instalado.
Fig. 5.30: Cuerpo del robot WHEX 1. Fig. 5.31: Pata del robot WHEX 1.
El diagrama de la figura 6.2 muestra de forma muy detallada los componentes electrónicos del
hardware del robot WHEX 1 y las interfaces entre ellos. En este diagrama se puede apreciar
que la electrónica está dividida en dos secciones principales, la sección de alimentación y la
sección de procesamiento del robot.
La sección de procesamiento del robot está formada por la placa controladora WHEX 1 y el
ordenador de a bordo. La placa controladora se encarga de las funciones de bajo nivel del
robot, como por ejemplo la gestión de los servomotores y el sensor de distancias por
ultrasonidos, la generación de secuencias de pasos y la expansión hardware mediante sus
múltiples puertos disponibles, entre otras. Por otro lado, el ordenador de a bordo debe ejecutar
las tareas de alto nivel del robot que le sean programadas.
6.1 Baterías:
El alto nivel de descarga que soporta (hasta 20 C), esto significa que puede descargar
hasta 20 x 4300 mA en varios segundos, lo cual es más que suficiente para la
necesidad de picos de energía del robot.
No presentan efecto memoria.
Se recargan muy rápidamente utilizando un cargador diseñado para baterías LIPO.
Debido a que el mayor problema de este tipo de baterías es que no toleran los cortocircuitos,
se ha colocado en su terminal positivo un fusible de 10 A. con esto se evita que la batería se
dañe por un fallo de hardware.
25
Manual de uso de baterías LIPO: http://www.rcmaterial.com/pdfs/LipoManualES.pdf
El circuito distribuidor de energía debe alimentarse a partir de las baterías del robot y generar
tres salidas con tensiones e intensidades de corriente máxima diferentes e independientes,
aisladas entre sí para evitar interferencias provenientes de los servomotores, que pudieran
generar un malfuncionamiento de la placa controladora y el ordenador de a bordo.
Estas salidas se generan utilizando fuentes de tensión conmutadas DC / DC, como se puede
ver en el diagrama de la figura 6.4.
El conmutador SW1 tiene la doble función del encendido / apagado del robot y la conexión
directa de la toma de carga con las baterías, para posibilitar cargarlas utilizando un cargador
para baterías LIPO externo. SW1, en la posición mostrada en la figura 6.4, cierra el circuito de
alimentación del robot, y en la otra posición apaga el robot y conecta la entrada de carga de las
baterías a estas.
La figura 6.5 muestra un UBEC (Ultimate Battery Eliminator Circuit) diseñado para aplicaciones
de modelismo, este se ha utilizado para generar la salida hacia la placa controladora. La figura
6.6 muestra también un UBEC de modelismo, de mayor capacidad, utilizado para generar la
salida hacia los servomotores, se ha requerido de dos de estos conectados en paralelo para
cumplir con los requerimientos de consumo de los servomotores.
entre otros). Esta placa se ha desarrollado íntegramente y ha sido diseñada para el robot
WHEX 1; pero teniendo como principal objetivo de diseño, que pueda ser expandida mediante
módulos hardware adicionales, sin que esto implique la modificación de ninguna de las partes
de la placa.
La figura 6.7 muestra los componentes principales de esta placa, así como los conectores que
presenta.
Fig. 6.7: Esquema que representa los componentes y conectores de la placa controladora WHEX 1.
Para la comunicación con esta placa se ha diseñado un set de comandos. Este set de
comandos puede ser consultado en la tabla del Anexo A.
Además, la placa cuenta con los siguientes puertos de expansión, que serán explicados más
detalladamente en la sección 6.3.2.2:
8 puertos del bus I2C interno de la placa, a través de los cuales pueden ser
conectados a los microcontroladores del robot, otros microcontroladores externos,
sensores, y placas de expansión.
8 puertos para pulsadores. En estos puertos pueden conectarse hasta 8 pulsadores,
por ejemplo, para detectar si las patas del robot se encuentran apoyadas o no.
6 puertos digitales de 1 bit, o un puerto digital de 6 bits. Estos puertos se pueden
utilizar para la conexión de sensores que requieran de líneas digitales para la
interconexión con microcontroladores.
4 puertos analógicos. Estos se pueden utilizar para que el robot lea magnitudes
analógicas, como por ejemplo, la señal proveniente de una LDR (sensor de luz).
Para la realización de sus funciones, la placa integra dos módulos principales: el controlador
principal WHEX 1 y el controlador de servomotores.
En caso de que sea necesario, el controlador principal WHEX 1, debe generar comandos de
control de servomotores y enviarlos al controlador de servomotores, para que este los ejecute.
El segundo módulo es el controlador de servomotores, que solo tiene una tarea, generar y
mantener las 48 señales PWM independientes que se necesitan para controlar los 48
26
servomotores. Se ha requerido de un módulo aparte al Controlador Principal WHEX 1, debido
a la complejidad que tiene la gestión de 48 señales PWM independientes entre sí.
Como se puede ver en la figura 6.7, este módulo recibe los comandos que ejecuta a través del
bus I2C al que se encuentra conectado.
Además de los módulos descritos anteriormente, la placa controladora cuenta con un módulo
auxiliar responsable de la comunicación RS232 con el ordenador: el driver RS232 (ver figura
6.7).
26
Esta placa permite controlar hasta 48 servomotores, aunque el robot solo necesita 20.
Las metodologías de diseño hardware más utilizadas son las llamadas Bottom-Up y Top-Down.
En la metodología Bottom-Up, se comienza a partir de los componentes más simples del
diseño, agrupándolos en módulos hasta llegar al sistema como un todo, probando su
funcionamiento antes de la integración en cada etapa; esta metodología es válida para
sistemas relativamente pequeños, ya que en sistemas grandes se hace muy compleja la
integración de todas las partes. La metodología Top-Down describe primeramente al sistema
como una entidad, con entradas, salidas y un estado interno, es decir, desde el punto de vista
funcional; a continuación desciende cada vez más hacia sus componentes internos hasta llegar
a los elementos básicos de diseño. [13]
La ventaja principal del uso de un entorno de diseño asistido por ordenador es la eliminación de
la necesidad de construcción de prototipos físicos para la validación y verificación del sistema
diseñado, ya que estos entornos incluyen, en cada iteración de diseño, una etapa de
simulación del hardware a varios niveles de abstracción; por tanto, solo es necesaria la
creación de un prototipo físico al final del proceso de diseño. [15]
El esquema de la figura 6.8 muestra el proceso iterativo de diseño hardware sin utilizar
simulación, resultando en iteraciones muy costosas en tiempo y recursos, ya que para validar y
verificar el diseño es necesario realizar un prototipo. [15]
En este trabajo se ha seguido el ciclo de diseño con simulación de la figura 6.9. Esto ha
posibilitado validar el diseño sin la necesidad de construir prototipos intermedios y de este
modo fabricar la placa controladora una vez verificado su funcionamiento.
Como ya se ha visto en la figura 6.7, la placa controladora está formada principalmente por tres
módulos:
1. El driver RS232.
2. El controlador principal WHEX 1.
3. El controlador de servomotores.
El driver RS232 tiene como única función la conversión de niveles de tensión desde los ±12 V
del puerto serie del ordenador a los 5 V que necesita el puerto serie de los microcontroladores
utilizados en la placa. Esta función es totalmente hardware y es ejecutada por el circuito
integrado MAX232.
El controlador principal WHEX 1 actúa como maestro del bus I2C interno de la placa, al cual se
encuentra conectado, entre otros dispositivos, el módulo controlador de servomotores. Entre
estos dos módulos se establece, mediante el bus I2C, una relación maestro – esclavo.
La figura 6.10 muestra el camino lógico que siguen los datos en la placa controladora. Como se
ve en esta figura, la información proveniente del ordenador de a bordo, codificada según el
estándar RS232 y con niveles de tensión entre 12 y -12 VDC, ingresa al driver RS232 de la
placa controladora. El driver transforma los niveles de tensión de la señal a niveles TTL (5 VDC
para el 1 lógico y 0 VDC para el 0 lógico). La señal modificada sale del driver e ingresa al
controlador principal WHEX 1, transportando los comandos que este debe ejecutar.
El controlador principal ejecuta las acciones necesarias y genera respuestas, las cuales son
enviadas de regreso al ordenador de a bordo. El controlador principal (maestro del bus I2C)
genera también comandos que son enviados al módulo controlador de servomotores (esclavo
27
I2C), estos comandos se codifican según el estándar I2C .
Por último, el controlador de servomotores genera y mantiene las 48 señales PWM que
controlan la posición y movimientos de los servomotores del robot.
Fig. 6.10: Camino lógico seguido por los datos en la placa controladora WHEX 1.
Según este camino lógico de datos han sido determinadas las entradas y salidas de cada
módulo.
La figura 6.11 muestra el diagrama esquemático del driver RS232. El componente principal de
este módulo es el circuito integrado MAX232, que realiza la función de conversión de niveles
de tensión de los 12 y -12 VDC que requiere un puerto serie de ordenador (según el estándar
RS232) a los 5 VDC requeridos por los módulos Serie de la mayoría de los circuitos integrados
existentes actualmente, entre ellos los PIC.
Sobre este circuito es necesario mencionar también que ha sido provisto de varios
conmutadores tipo “jumper” para habilitar o deshabilitar su funcionamiento, y con esto las
conversiones (ver figura 6.12). Esto es necesario para brindar flexibilidad a la placa
controladora; pues de esta forma puede ser comandada desde el puerto serie de un ordenador,
haciéndose necesaria la activación del driver RS232 para que convierta los niveles de tensión,
o desde un PIC u otro microcontrolador, en cuyo caso no sería necesario realizar conversiones
de tensión.
27
Especificación del estándar en: http://www.nxp.com/acrobat_download2/literature/9398/39340011.pdf
En la figura 6.12a se muestra la configuración necesaria para activar el Driver RS232: deben
ser conectados los terminales 1-2 del conmutador ON/OFF, 1-2 del conmutador RX y 1-2 del
conmutador TX. Así mismo, la figura 6.12b muestra la configuración necesaria para desactivar
el módulo: deben conectarse solamente los terminales 2-3 de los conmutadores TX y RX.
a) b)
Fig. 6.12: Configuración de los jumpers del Driver RS232 para:
La figura 6.13 muestra el diagrama esquemático del circuito del módulo Controlador Principal
28
WHEX 1, este circuito tiene como elemento principal al microcontrolador PIC18F4525 ,
ejecutando a 24 Mhz.
Como puede verse en el circuito de la figura 6.13, los comandos llegan a través de la línea
serial RX y las respuestas son transmitidas a través de la línea TX hacia la entidad que
comande la placa, ya sea un ordenador u otro microcontrolador, pasando, si es necesario, a
través del driver RS232.
28
Hoja de datos del PIC18F4525 en la url: http://ww1.microchip.com/downloads/en/DeviceDoc/39626e.pdf
También es necesario mencionar que el circuito puede expandirse añadiendo más hardware a
cualquiera de los puertos que provee. A continuación se describirán las interfaces de dichos
puertos.
La placa controladora WHEX 1 tiene ocho conectores para dispositivos que funcionen
utilizando el bus I2C en modo esclavo. El microcontrolador PIC18F4525 actúa como nodo
maestro en este bus.
La cantidad de dispositivos I2C que pueden conectarse al bus está determinada por la longitud
de las direcciones, que en el caso del bus I2C es de 7 bits; por tanto, pueden ser conectados
hasta 128 dispositivos esclavos. Sin embargo solo se proveen 8 conectores para este puerto,
así que en caso de necesitar conectar más de 8 dispositivos, será necesario instalar, en uno de
los puertos, un extensor que provea más conectores.
La placa provee 4 puertos para conectar estos dispositivos, cada puerto tiene los siguientes
terminales:
1. Entrada analógica (salida del dispositivo).
2. VCC: 5 VDC.
3. VSS: Tensión de referencia o masa (0 VDC).
Si se desea conectar un dispositivo que necesite más de una línea analógica para enviar sus
datos, por ejemplo un acelerómetro de dos o tres ejes, este puede ser conectado utilizando un
conector por cada línea que se necesite (hasta un máximo de 4).
La placa cuenta con 8 conectores para pulsadores. A estos conectores de dos terminales
pueden ser conectados pulsadores normalmente abiertos sin la necesidad de añadir hardware
extra, ya que la placa cuenta con resistencias de pull-up que mantienen la salida del pulsador
en estado lógico 1 mientras este no se presione, cambiando a estado lógico 0 al ser
presionado.
La figura 6.14 muestra el diagrama esquemático del circuito controlador de servomotores, cuyo
componente principal es un PIC18F4525 ejecutando a 24 MHz.
Este controlador, con el firmware preciso, es capaz de generar 24 señales PWM para el control
de 24 servomotores.
La placa controladora WHEX 1 presenta dos de estos módulos, por tanto es capaz de generar
hasta 48 señales PWM simultáneamente.
Este módulo funciona como esclavo I2C, recibiendo las órdenes mediante el bus I2C de la
placa controladora y realizando las acciones necesarias para mantener las señales PWM de
cada servomotor.
Como puede verse en el diagrama de la figura 6.14, cada servomotor se conecta mediante un
conector de tres terminales, compatible con las marcas más conocidas de servomotores de
modelismo. Este conector tiene los siguientes pines:
1. Señal PWM de control.
2. VCC: 6 VDC para alimentar al servomotor.
3. VSS: Tensión de referencia o masa (0 VDC).
Al igual que sucede con el controlador principal WHEX 1, el componente principal de este
circuito es un microcontrolador PIC18F4525, por tanto es necesario un firmware que ejecute las
funciones del módulo. El desarrollo de este firmware será abordado en siguientes secciones de
este trabajo.
Llegados a este punto se cuenta con los circuitos esquemáticos de la placa, los cuales han sido
comprobados mediante simulación y su implementación en la placa de prototipado rápido.
Entonces, para concluir el desarrollo de la placa controladora solo resta la fabricación de un
prototipo permanente mediante una placa de circuitos impresos.
Para el diseño del circuito impreso se partió de los diagramas esquemáticos creados en
secciones anteriores y utilizando la herramienta Layout Plus integrada en OrCAD 10.3 se
realizó el posicionamiento de los componentes y encaminamiento de las pistas en el circuito.
29
El método completo en: http://www.pcpaudio.com/pcpfiles/doc_amplificadores/PCBs/PCBs.html
Fig. 6.15: Capa superior del circuito impreso de la placa controladora WHEX 1.
Fig. 6.16: Capa inferior del circuito impreso de la placa controladora WHEX 1.
Los componentes han sido fijados en la capa superior del circuito siguiendo como guía para
realizar esta tarea la vista de serigrafía que brinda OrCAD, esta vista puede apreciarse en la
figura 6.17.
Fig. 6.17: Vista en OrCAD que permite la localización de las posiciones de los componentes en el circuito impreso.
La figura 6.18 muestra la placa fabricada e instalada en su sitio dentro del cuerpo del robot
WHEX 1.
WHEX 1 cuenta con un ordenador de a bordo responsable de las tareas de alto nivel del robot,
como por ejemplo la gestión de la comunicación con el ordenador remoto y la navegación,
entre otras.
El diagrama de la figura 6.19 muestra los componentes que han sido configurados para el
ordenador de a bordo de WHEX 1.
El ordenador que se ha utilizado está basado en la placa base VIA Epia Pico ITX: un sistema
provisto de controladora de vídeo, conexiones PATA y SATA para unidades de
almacenamiento, 4 puertos USB y un puerto serie RS232 para la conexión de dispositivos
periféricos, un conector RJ45 para LAN de 10/100Mbps y conectores de altavoces y micrófono,
30
entre otros. En la figura 6.20 se puede ver esta placa base.
a) b)
Fig. 6.20: Placa base VIA Epia Pico ITX.
a) Placa base sin el disipador y ventilador del procesador, comparada con un naipe.
b) Placa base con el disipador y ventilador del procesador instalados.
30
La hoja de datos en: http://www.via.com.tw/en/products/embedded/ProductDetailTabs.jsp?id=690&tabs=1#tabs-4
Como se puede ver en la figura 6.20, se ha instalado 1 GB de memoria RAM DDR2, lo cual es
suficiente para que el software del robot (sobre todo la visión artificial) pueda ejecutar con
fluidez.
Otro elemento que debe ser analizado del diagrama de la figura 6.19 es la solución que se ha
dado al almacenamiento.
Un disco duro necesita mantener girando a alta velocidad (7200 RPM) los discos donde
almacena los datos, por tanto, sus motores consumen mucha energía. En esta aplicación, el
ahorro energético es de vital importancia, así que se ha optado por una unidad de estado
sólido, específicamente, una tarjeta Compact Flash de 4 Gb, conectada al conector PATA de la
placa base a través de un adaptador IDE a Compact Flash. La figura 6.22 muestra estos
componentes.
a) b)
Fig. 6.22: Componentes del subsistema de almacenamiento configurado para WHEX 1.
31
El manual en: http://resources.mini-box.com/online/PWR-PICOPSU-60-WI/PWR-PICOPSU-60-WI-manual.pdf
La figura 6.24 muestra el prototipo del robot hexápodo WHEX 1 que se ha construido. En
siguientes capítulos del presente trabajo se analiza la configuración del firmware, software de
su sistema operativo y sistemas de control.
32
http://www.smc.com/index.cfm?event=viewProduct&localeCode=EN_USA&cid=5&scid=117&pid=1645
Como se ha visto en el capítulo anterior, la placa controladora WHEX 1 cuenta con tres
microcontroladores PIC18F4525, que se comunican mediante un bus I2C, en el cual, uno de
los microcontroladores actúa como maestro (controlador principal WHEX 1) y los otros dos
actúan como esclavo (controladores de servomotores).
La figura 7.2 muestra un diagrama de despliegue en el cual se pueden apreciar los distintos
elementos de firmware que integra la placa controladora.
Fig. 7.2: Diagrama de despliegue de los distintos componentes software / firmware en el robot WHEX 1.
Como se ha dicho en la sección anterior, el firmware se ha dividido en dos paquetes, uno para
el controlador principal WHEX 1 y el otro para los controladores de servomotores.
Para determinar en cada momento que parte de estos paquetes de firmware debe ser
desarrollada y en qué orden, se han analizado los requisitos que debe cumplir la placa
controladora, determinando las prioridades de cada requisito y las dependencias entre ellos.
Como resultado de este análisis se han dividido los paquetes en los siguientes componentes:
Así mismo se han definido los incrementos que deben efectuarse en la codificación de los
componentes más complejos, que son el controlador de servomotores y el generador de
movimientos. Esto ha sido necesario dado el ciclo de vida evolutivo que ha guiado el desarrollo.
Las figuras 7.4 y 7.5 muestran las secuencias de incrementos que han sido definidas para el
desarrollo del controlador de servomotores y el generador de movimientos respectivamente.
Fig. 7.3: Grafo de precedencia que representa las dependencias de construcción de los módulos que integran el firmware de la
placa controladora WHEX 1.
Con esta secuencia de pasos ya establecida, solo queda comenzar a diseñar y codificar los
componentes que han sido definidos.
En este caso se trata de software que debe ejecutar embebido en un circuito electrónico y
alojado en un microcontrolador PIC18F4525; por tanto, el primer paso en esta decisión es
determinar los lenguajes de programación que soporta este microcontrolador así como las
ventajas, desventajas y esfuerzo que llevaría realizar los programas con cada uno de ellos.
Para desarrollar el firmware se han escogido dos lenguajes de los arriba listados, el
ensamblador propio del PIC18F4525 para el paquete controlador de servomotores y el
compilador de C de CCS para el paquete controlador principal WHEX 1. Esta selección se ha
basado en dos aspectos principales:
Para generar las señales PWM utilizadas para controlar servomotores es
extremadamente importante que el microcontrolador ejecute las secuencias de código
en un tiempo específico, ya que si existen desviaciones de este tiempo el servomotor
puede moverse de forma errática. Por tanto, solo puede ser programado este paquete
utilizando ensamblador, ya que los compiladores de otros lenguajes de alto nivel hacen
una traducción del código escrito en el lenguaje de alto nivel a código ensamblador y
de este a código máquina, generando varias instrucciones en código maquina por cada
instrucción en el lenguaje de alto nivel, con lo cual se hace imposible realizar
mediciones exactas del tiempo de ejecución del código de máquina generado.
Para el otro paquete de firmware se ha utilizado el compilador C de CCS debido a que
este paquete no presenta el requisito de diseño mencionado anteriormente y el
lenguaje C está muy extendido y existe mucha documentación para él; por tanto, la
utilización de este lenguaje facilita mucho el desarrollo de este paquete.
Antes de continuar, es necesario mencionar que este PIC cuenta con 4 temporizadores en
hardware capaces de medir tiempo de forma muy precisa. Estos temporizadores incrementan
su valor cada vez que ocurre un ciclo de instrucción en el PIC, generando una interrupción
software cuando desbordan; pueden ser programados, precargándolos con un valor específico,
para que desborden justamente en un tiempo determinado. Estos temporizadores se han
utilizado en este paquete para controlar los intervalos de tiempo.
7.2.1 Método empleado para controlar 24 servomotores utilizando los recursos limitados de
un chip PIC18F4525.
La codificación está determinada por el intervalo de tiempo que dura el pulso en estado lógico
alto en esta señal, variando desde 0.5 ms para el 0º hasta los 2.5 ms para los 180º.
Entonces, si dividimos los 20 ms del período de la señal entre 2.5 ms, que es el tiempo máximo
que la señal puede estar en estado lógico alto, el resultado obtenido es 8; lo cual indica que
podrían generarse hasta 8 pulsos seguidos de 2.5 ms como máximo cada 20 ms.
Si utilizamos un temporizador para generar esos 8 pulsos en salidas diferentes del PIC, se
obtendrían 8 señales PWM con período de 20 ms y tiempos de pulso de entre 0.5 y 2.5 ms,
desfasadas unos 2.5 ms entre sí.
Como puede verse en el esquema de la figura 7.6, las señales están desfasadas unos 2.5 ms.
Este comportamiento no implica consecuencias para el resultado final, ya que cuando
transcurra el primer período de 20 ms todos los servomotores habrán recibido su primer pulso,
posicionándose en el ángulo correspondiente, y a partir de este, seguirán recibiendo pulsos
cada 20 milisegundos exactamente.
El esquema de la figura 7.7 muestra las 8 señales solapadas para poder apreciar mejor la
forma en que trabaja el temporizador: en cada intervalo de 2.5 ms el temporizador genera un
pulso en la señal correspondiente.
Fig. 7.6: Esquema de tiempo que muestra el comportamiento de 8 señales PWM en uno de sus períodos de 20 ms.
Fig. 7.7: Esquema de tiempo que muestra las 8 señales PWM solapadas.
Para poder medir tiempos utilizando los temporizadores hardware que integra el PIC18F4525
es necesario comprender bien su funcionamiento. Existen dos modelos matemáticos
empleados por estos módulos hardware: el primero de ellos rige el funcionamiento de los
temporizadores 0, 1 y 3 y el segundo modelo rige el funcionamiento del temporizador 2.
El robot WHEX 1 emplea los 4 temporizadores para controlar sus servomotores; por tanto, en
esta sección se explicará la aplicación concreta al robot WHEX 1 de estos modelos
matemáticos.
La ecuación anterior no es más que la relación lineal que se establece entre la posición del eje
de un servomotor, representada mediante 8 bits y con rango desde 0 hasta 255, y el valor de
precarga necesario para que los temporizadores 0, 1 y 3 midan tiempos entre 0.5 ms
(posición = 0) y 2.5 ms (posición = 255).
(2)
Donde:
Período es el tiempo entre desbordamientos del temporizador, medido en segundos.
Fosc es la frecuencia del reloj interno del PIC, medida en Hz.
Prescaler es el valor asignado al divisor de frecuencias integrado en la mayoría de los
temporizadores del PIC.
Rango es la cantidad de valores que puede tomar el temporizador: 256 para
temporizadores de 8 bits y 65536 para temporizadores de 16 bits.
Precarga es el valor que se escribe en el temporizador antes de hacerlo funcionar para
poder ajustar el Período.
Quedando:
(3)
Utilizando la ecuación (3), se calculan las precargas necesarias para la medición de los
tiempos de 0.5 ms y 2.5 ms correspondientes a las posiciones 0 y 255 (0º y 180º
respectivamente), resultando las siguientes:
Entonces, utilizando los puntos (0; 62536) y (255; 50536) se calcula la ecuación de la recta que
representa la relación lineal entre estos dominios, resultando la ecuación:
La ecuación (5) establece la correspondencia entre la posición del eje de los servomotores y el
valor de precarga necesario para realizar la medición, utilizando los temporizadores 0, 1 y 3,
del tiempo de pulso necesario para que los servomotores posicionen su eje en dicha posición.
El segundo modelo se ha empleado para medir un intervalo de tiempo fijo de 2.5 ms utilizando
el temporizador 2 del PIC (en la siguiente sección se explica la finalidad de esta medición):
El período entre interrupciones del temporizador 2 está dado por la siguiente ecuación:
(6)
Donde:
Período es el tiempo entre desbordamientos del temporizador, medido en segundos.
Fosc es la frecuencia del reloj interno del PIC, medida en Hz.
Prescaler es el valor asignado al divisor de frecuencias integrado en la mayoría de los
temporizadores del PIC.
Postscaler es un divisor de frecuencias que se aplica en la salida del temporizador 2.
ValorDeInterrupción es un registro de 8 bits que determina el fin del conteo del
temporizador 2, si el valor del temporizador es igual a este valor, se solicita la
interrupción y se reinicia el temporizador.
Precarga es el valor que se escribe en el temporizador antes de hacerlo funcionar para
poder ajustar el Período.
Para obtener un tiempo de 2.5 ms utilizando el temporizador 2 del PIC solo es necesario
despejar en la ecuación (6) y sustituir los valores constantes siguientes:
Quedando:
(7)
Fig. 7.8: Diagrama de flujo del programa principal del paquete controlador de servomotores.
En el diagrama de la figura 7.8 puede apreciarse que existen tres almacenes de información
principales: los registros de control, los registros de servomotores y los puertos del
microcontrolador.
Los registros de control son todas las variables globales que determinan el funcionamiento
general del programa.
Para hacer que un servomotor rote su eje desde un ángulo hacia otro es necesario modificar el
ancho de los pulsos que se le suministran. Si este ancho de pulsos se modifica de forma
inmediata el servomotor se desplazará a su velocidad máxima. Por el contrario, si el ancho de
los pulsos se hace variar de forma gradual, el servomotor se desplazará hacia el ángulo final a
una menor velocidad.
La velocidad de los servomotores se ha definido como un entero de 8 bits cuyo rango válido va
desde 1 hasta 255, extremos incluidos. Esta variable determina la rapidez a la que se hará
variar la posición del eje del servomotor en cuestión.
Tanto la posición final del servo como la posición actual han sido representadas de dos formas:
Mediante un entero de 8 bits, con rango desde 0 (0º) hasta 255 (180º).
Mediante un entero de 16 bits que almacena el valor de precarga necesario para
realizar la programación de los temporizadores 0, 1 y 3. Este valor es calculado a partir
de la representación de 8 bits mediante la ecuación (5) de la sección 7.2.2:
Posición16Bits = 62536 – 47*Posición8Bits.
Los registros de posición y velocidad de los servomotores incluyen también tres registros de 8
bits que almacenan un bit por cada servomotor (8 x 3 = 24 servomotores). Si el bit
correspondiente a un servomotor en estos registros es igual a 1, el servomotor se encuentra
activado, en otro caso, el servomotor se encuentra desactivado.
El tercer almacén definido en el diagrama contiene los puertos del microcontrolador a los que
se han conectado físicamente los servomotores. Estos puertos son los siguientes:
Servo 0: PuertoB[7] Servo 8: PuertoD[7] Servo 16: PuertoA[4]
Servo 1: PuertoB[6] Servo 9: PuertoD[6] Servo 17: PuertoA[5]
Servo 2: PuertoB[5] Servo 10: PuertoD[5] Servo 18: PuertoC[2]
Servo 3: PuertoB[4] Servo 11: PuertoD[4] Servo 19: PuertoC[1]
Servo 4: PuertoB[3] Servo 12: PuertoA[0] Servo 20: PuertoC[0]
Servo 5: PuertoB[2] Servo 13: PuertoA[1] Servo 21: PuertoD[0]
Servo 6: PuertoB[1] Servo 14: PuertoA[2] Servo 22: PuertoD[1]
Servo 7: PuertoB[0] Servo 15: PuertoA[3] Servo 23: PuertoD[2]
Vistos los datos manipulados, a continuación se explicarán los diferentes algoritmos que
forman parte del paquete controlador de servomotores.
Inicializar
Inicializar registros de control.
Inicializar puertos.
Inicializar registros de servomotores a sus valores iniciales.
Inicializar comunicación I2C.
Inicializar temporizadores.
Inicializar interrupciones hardware del módulo SSP y los contadores.
Repetir indefinidamente:
Actualizar posición actual de servomotores.
Esperar un tiempo determinado.
Atender eventos de interrupciones de forma paralela.
En caso de ocurrir un evento, pausar la ejecución del programa y
atender dicho evento.
Fin repetir.
Una vez realizada la inicialización, el programa entra en un bucle infinito en el cual se actualiza
la posición actual de cada servomotor. La figura 7.9 muestra el diagrama de flujo de este
proceso.
Fig. 7.10: Algoritmo del autómata que gestiona las actualizaciones de los registros de posición y velocidad de los servomotores
(Esclavo I2C).
Las direcciones en el bus I2C de los dos controladores de servomotores que utiliza el robot
WHEX 1 son la 22h para el primer controlador y la 24h para el segundo controlador.
Las acciones se dividen en dos grupos: las que necesitan un parámetro y las que no necesitan
ningún parámetro, teniendo todas ellas como objetivo final mantener actualizado los registros
de posición y velocidad de los servomotores
El algoritmo es el siguiente:
Esclavo I2C:
Recibir Comando y almacenarlo.
Recibir Dato y almacenarlo.
Determinar acción a realizar:
Si comando == Activar Servo
Establecer bit ServoEnabled[Dato] = ‘1’.
Sino Si comando == Desactivar Servo
Restablecer bit ServoEnabled[Dato] = ‘0’.
Sino Si comando == Copiar Velocidad
Asignar VelocidadRecibida = Dato.
Sino Si comando == Copiar Posición
Asignar PosiciónRecibida = Dato.
Sino Si comando == Actualizar Servo
Asignar PosiciónFinal8Bits[Dato] = PosiciónRecibida.
Asignar Velocidad[Dato] = VelocidadRecibida.
Sino Si comando == Leer Velocidad de Servo
Enviar por I2C Velocidad[Dato].
Sino Si comando == Leer Posición de Servo
Enviar por I2C PosiciónActual[Dato].
Sino Si comando == Actualizar todos los Servos
Para cada servomotor i, desde 0 hasta 23, repetir:
Asignar PosiciónFinal8Bits[i] = PosiciónRecibida.
Asignar Velocidad[i] = VelocidadRecibida.
Fin repetir
Sino Si comando == Activar todos los Servos
Para cada servomotor i, desde 0 hasta 23, repetir:
Establecer bit ServoEnabled[i] = ‘1’.
Fin repetir
Sino
Para cada servomotor i, desde 0 hasta 23, repetir:
Restablecer bit ServoEnabled[i] = ‘0’.
Fin repetir
Fin si
Fin repetir
Por último queda explicar el algoritmo que se ha seguido para la generación de las 24 señales
PWM empleando el método de generación explicado en la sección 7.2.1 y los modelos
matemáticos de la sección 7.2.2.
Además de las interrupciones generadas por las solicitudes I2C, se han configurado los cuatro
temporizadores hardware del PIC para que generen interrupciones cuyas rutinas de atención
son las responsables de la generación de los flancos de subida y bajada de las señales PWM
que controlan los servomotores.
Para lograr lo anterior se ha utilizado una variable contador cuyo valor define el intervalo de 2,5
ms en el cual deben ser generados los pulsos de cada señal. La tabla 7.2 muestra los
intervalos y el temporizador asignados a cada señal según el valor de dicha variable.
Tabla 7.2: Asignación de las 24 señales PWM a los intervalos de tiempo en que ha sido dividido el período de estas.
Los algoritmos de las rutinas de interrupción de los temporizadores son los siguientes:
Temporizador 2:
Asignar Contador = Contador + 1.
Si Contador == 8
Asignar Contador = 0.
Asignar AtenderServoTemp0 = Contador.
Asignar AtenderServoTemp1 = Contador + 8.
Asignar AtenderServoTemp3 = Contador + 16.
Asignar Temporizador 0 Precarga = PosiciónActual16Bits[AtenderServoTemp0].
Asignar Temporizador 1 Precarga = PosiciónActual16Bits[AtenderServoTemp1].
Asignar Temporizador 3 Precarga = PosiciónActual16Bits[AtenderServoTemp3].
Activar Temporizador 0.
Activar Temporizador 1.
Activar Temporizador 3.
Si ServoEnabled[AtenderServoTemp0] == ‘1’
Establecer bit Puertos[AtenderServoTemp0] = ‘1’.
Si ServoEnabled[AtenderServoTemp1] == ‘1’
Establecer bit Puertos[AtenderServoTemp1] = ‘1’.
Si ServoEnabled[AtenderServoTemp3] == ‘1’
Establecer bit Puertos[AtenderServoTemp3] = ‘1’.
Temporizador 0:
Asignar AtenderServoTemp0 = Contador.
Restablecer bit Puertos[AtenderServoTemp0] = ‘0’.
Desactivar Temporizador 0.
Temporizador 1:
Asignar AtenderServoTemp1 = Contador + 8.
Restablecer bit Puertos[AtenderServoTemp1] = ‘0’.
Desactivar Temporizador 1.
Temporizador 3:
Asignar AtenderServoTemp3 = Contador + 16.
Restablecer bit Puertos[AtenderServoTemp3] = ‘0’.
Desactivar Temporizador 3.
El listado del Anexo B muestra las partes más significativas del programa en lenguaje
ensamblador correspondiente al paquete controlador de servomotores.
El paquete controlador principal WHEX 1 ha sido diseñado optimizando al máximo cada uno de
sus componentes, tanto en cantidad de código como en eficiencia del mismo. Esta optimización
ha sido necesaria pues sus algoritmos presentan una mayor complejidad que los del
controlador de servomotores y al igual que estos, deben ejecutar en un microcontrolador
PIC18F4525, con una memoria de programa de tan solo 48 KB y un reloj principal de 24 MHz.
Fig. 7.11: Arquitectura del paquete de firmware controlador principal WHEX 1: componentes principales e interfaces de
comunicación con el exterior.
El ordenador de a bordo genera comandos que son enviados al controlador a través del driver
RS232 integrado en la placa controladora WHEX 1.
Los comandos recibidos por el controlador principal WHEX 1 son tratados por el módulo
“Comunicación con el exterior”, específicamente por el “Gestor del puerto serie” y puestos en
una cola de peticiones administrada por el “Gestor de peticiones”; entonces, según el orden de
llegada, las peticiones son atendidas dependiendo de su tipo por el “Generador de
movimientos” o por el “Gestor de periféricos”.
El módulo “Generador de movimientos” delega cálculos relacionados con la geometría del robot
al módulo de “Cinemática inversa”, que se encarga de calcular los valores de los ángulos de
cada articulación del robot para adoptar una postura concreta. Una vez calculados los ángulos
de las articulaciones, el “Generador de movimientos” envía mediante el “Maestro I2C” los
comandos de actualización de servomotores necesarios para que el robot adopte la postura
deseada.
Por último, en el diagrama de la figura 7.11 pueden ser apreciadas las interfaces de
comunicación con el exterior de este paquete de firmware:
Interfaz serie (RS232): comunicación con el ordenador de a bordo del robot WHEX 1.
Interfaz bus I2C: configurada en modo maestro único del bus, para controlar periféricos
I2C que se conecten al bus en modo esclavo, incluyendo los dos controladores de
servomotores que utiliza el robot WHEX 1.
Puertos digitales y analógicos de la placa controladora: comunicación con los
periféricos no I2C conectados a dichos puertos.
El ordenador de a bordo envía comandos de 8 o 16 bits; de los cuales, los primeros 8 bits
identifican el comando y los siguientes 8 bits, opcionales, transportan los datos que necesita el
comando. La tabla completa de comandos aceptados por el controlador principal WHEX 1 y los
datos que necesitan se puede consultar en el anexo A.
Opcionalmente, el ordenador de a bordo puede enviar un byte con el valor hexadecimal 0xFF.
Este byte es considerado por el controlador como un byte de sincronización, es decir, al ser
recibido este byte el controlador WHEX 1 descarta el comando que se pudo haber recibido con
anterioridad, asumiendo que el próximo byte que recibirá es un nuevo comando y no un dato.
Por cada byte recibido, ya sea un byte de sincronización, un comando o un dato, se envía un
carácter 0x21 hacia el ordenador a modo de notificación de la recepción.
Fig. 7.12: Máquina de Moore que gestiona la recepción de comandos a través del puerto serie.
El autómata de la figura 7.12 se ejecuta cada vez que se recibe un byte de información a través
del puerto serie y, dependiendo el estado, realiza las siguientes acciones:
Estado 0: en este estado el autómata espera como entrada un comando o el byte de
sincronización.
o En caso de recibirse el byte de sincronización la máquina permanece en el
estado 0 y se notifica la recepción enviando por el puerto serie el byte 0x21.
o En caso de recibirse un comando menor que 6, la máquina pasa al estado 2,
donde se envía el comando recibido al módulo “Gestor de peticiones” para que
sea puesto en la cola de ejecución y automáticamente se retorna al estado 0,
notificando la recepción con el envío del carácter 0x21.
o En caso de recibirse un comando mayor o igual a 6, la máquina pasa al estado
1, notificando la recepción con el envío del carácter 0x21.
Estado 1: en este estado el autómata espera como entrada un dato, o el byte de
sincronización.
o En caso de recibirse el byte de sincronización la máquina retorna al estado 0 y
se notifica la recepción enviando por el puerto serie el byte 0x21.
o En caso de recibirse un dato, la máquina pasa al estado 2, donde se envían el
comando y dato recibidos al módulo “Gestor de peticiones” para que sean
La otra funcionalidad del módulo de comunicación con el exterior, además de la gestión del
puerto serie explicada en la sección anterior, es la de controlar el bus I2C de la placa
controladora WHEX 1.
Se ha configurado el módulo hardware SSP del PIC para que funcione en modo maestro I2C,
con los siguientes parámetros:
Modo maestro.
Baja velocidad.
Líneas utilizadas:
o SDA: C4.
o SCL: C3.
Con la configuración anterior ya es posible gestionar todos los periféricos de tipo I2C que sean
conectados al bus en modo esclavo, incluyendo los dos controladores de servomotores que
utiliza el robot WHEX 1, estos se han configurado en las direcciones I2C siguientes:
Controlador #1: 22h
Controlador #2: 24h
Así mismo la dirección del sensor de distancias por ultrasonido SRF08 utilizado se ha
establecido al valor E0h.
El controlador principal WHEX 1 debe estar siempre disponible para atender peticiones
provenientes del ordenador de a bordo a través del puerto serie, así que el diseño del firmware
debe minimizar el tiempo mínimo entre peticiones consecutivas, para así reducir la probabilidad
de perder una petición por no estar escuchando al puerto serie en el momento de su llegada.
Como se ha explicado en secciones anteriores, cada vez que se recibe un byte de información
en el puerto serie se desencadena una interrupción que hace que sea ejecutado el algoritmo
del autómata de la figura 7.12. Durante el tiempo de ejecución de esta rutina de interrupción
serán descartados todos los bytes de información que se reciban a través del puerto serie; por
tanto, es necesario que dicha rutina tenga un tiempo de ejecución mínimo.
Para lograr ese tiempo de ejecución mínimo se hace imprescindible un diseño que permita la
ejecución asíncrona de los comandos recibidos. Esto se ha logrado utilizando una cola donde
los comandos recibidos son depositados para que esperen su turno de ejecución y de este
modo la rutina de interrupción del puerto serie pueda retornar inmediatamente después de
colocar el comando en la cola.
Fig. 7.13: Arquitectura interna del gestor de peticiones que permite la ejecución asíncrona de comandos.
El esquema de la figura 7.13 muestra la arquitectura interna del módulo “Gestor de peticiones”,
y como elemento principal de esta arquitectura se puede apreciar la cola de comandos.
La cola de comandos posibilita que los comandos puedan ser ejecutados de forma asíncrona
por un proceso diferente a la rutina de interrupciones que gestiona el puerto serie, de forma tal
que dicha rutina retorna inmediatamente una vez que el comando ha sido añadido a la cola,
minimizando su tiempo de ejecución.
La longitud de la cola debe fijarse lo suficientemente grande como para que no desborde, este
valor se ha calculado de forma empírica y se ha establecido a 50.
La cinemática inversa puede ser aplicada de forma específica a todo tipo de robot con
articulaciones móviles, de forma tal que partiendo de los datos que describen una postura del
robot, puedan ser calculados los valores angulares que cada articulación debe tomar para
lograr dicha postura.
WHEX 1 es un robot móvil de seis patas, cada una de las cuales presenta tres articulaciones:
una en la rodilla (llamada “rodilla”) y dos en la cadera (llamadas “cadera 1” y “cadera 2”). Cada
una de estas patas puede ser modelada como un brazo robótico de tres grados de libertad,
cuya postura se define con un punto en el espacio tridimensional donde el extremo de la pata
debe situarse.
Siguiendo el análisis anterior, el problema cinemático inverso específico del robot WHEX 1 se
ha dividido en 7 ámbitos: un ámbito global, y 6 ámbitos locales: uno para cada pata del robot.
Cada ámbito tiene su propio sistema de coordenadas rectangulares, la figura 7.14 muestra
dichos sistemas de coordenadas.
Fig. 7.14: Sistemas de coordenadas definidos para la resolución de la cinemática inversa del robot hexápodo WHEX 1.
Entonces, el proceso de resolución de los valores angulares de las articulaciones para lograr
una postura se divide en los siguientes apartados:
A partir de los datos que definen la postura que se desea adoptar , calcular los puntos
33
(relativos al sistema global de coordenadas) en los cuales deben situarse los extremos
de las 6 patas del robot.
33
Estos datos se explican en la especificación de requisitos.
Del proceso anterior solo será explicado en esta sección el método empleado para determinar
los ángulos que deben adoptar las articulaciones de las patas para posicionar sus extremos en
un punto determinado, pues solamente en este apartado se utiliza cinemática inversa. La
explicación del resto de apartados puede encontrarse en la sección 7.3.5.
Como ya se ha visto anteriormente, las patas del robot hexápodo WHEX 1 presentan dos
partes rígidas, articuladas mediante tres articulaciones, que le confieren tres grados de libertad.
En la rodilla:
Articulación de la rodilla.
En la cadera:
Articulación horizontal de la cadera (llamada cadera 1).
Articulación vertical de la cadera (llamada cadera 2).
Resolución:
Las patas del robot WHEX 1 están formadas por dos piezas de diferentes longitudes. La
diferencia de dichas longitudes es de unos 3 cm. A pesar de lo anterior, para el cálculo de la
cinemática inversa se han modelado las patas como si ambas piezas tuvieran la misma
longitud L. Esta aproximación ha sido necesaria debido a que los cálculos del modelo original
consumían más tiempo que el máximo admisible, retardando excesivamente la ejecución de
todo el programa. Es preciso mencionar que se ha verificado de forma empírica el buen
funcionamiento de esta aproximación.
y la constante:
L: Longitud de las dos piezas rígidas de la pata.
La solución obtenida calcula los tres ángulos a, b y c de las articulaciones para cualquier punto
que se encuentre dentro del alcance de la pata. Los ángulos a y c se calculan de forma
semejante para todos estos puntos, mientras que para el cálculo del ángulo b es necesario
diferenciar dos casos específicos:
Caso 1: Z < 0.
Caso 2: Z ≥ 0.
La figura 7.15 muestra la representación geométrica tridimensional del modelo empleado para
los cálculos de la cinemática inversa y la figura 7.16 muestra las proyecciones en el plano ZW
correspondientes a los casos 1 y 2 anteriormente explicados.
Fig. 7.15: Modelo geométrico tridimensional de una pata del robot WHEX 1.
a) b)
Fig. 7.16: Proyección del modelo geométrico de la figura 3.67 en el plano ZW.
Calcular el ángulo a:
(8)
Como:
∆ORP es isósceles, pues como se puede ver en la figura 7.16 las longitudes de sus
lados y son iguales a L.
es mediatriz del triángulo ORP relativa su lado y también bisectriz relativa al
ángulo , pues contiene al vértice R del triángulo isósceles ORP y OMR es
recto.
, pues es bisectriz del ángulo .
(9)
(10)
Como , por ser mediatriz relativa al lado del triángulo ORP, entonces:
(11)
Calcular el ángulo b:
Para el cálculo del ángulo b, el problema se ha dividido en dos casos: cuando Z < 0 y cuando
Z ≥ 0. Las figuras 7.16a y 7.16b muestran estos casos.
Caso 1: Z < 0
(11)
Como:
, por suma de ángulos interiores de un triángulo.
, por ser los ángulos opuestos a los lados iguales de un triángulo
isósceles.
(12)
(13)
Caso 2: Z ≥ 0
(14)
Partiendo de la ecuación anterior, y siguiendo la misma deducción que dio como resultado la
ecuación (12) se obtiene:
(15)
(16)
Calcular el ángulo c:
Al observar la figura 7.15 se puede apreciar que ∆NPZ es rectángulo, por tanto se plantea:
(17)
Las ecuaciones 11, 13, 16 y 17 se utilizan para el cálculo de los ángulos de las articulaciones
de la pata, obteniendo los resultados en radianes; pero los controladores de servomotores no
tratan los ángulos en radianes, sino mediante un byte donde el valor 0 corresponde a los 0
radianes y el 255 a los π radianes. Por tanto es necesario definir una ecuación de conversión
para expresar los valores de ángulos en la unidad de medida utilizada por los controladores de
servomotores.
(18)
(18)
El robot WHEX 1 es capaz de adoptar posturas complejas además de caminar y rotar de cuatro
modos diferentes, dos de los modos mueven solo una pata cada vez, mientras que los otros
dos modos mueven dos y tres patas de forma simultánea respectivamente. El cálculo y
ejecución de estas secuencias de movimientos es responsabilidad íntegra del generador de
movimiento.
Fig. 7.17: Esquema que muestra al autómata que implementa el generador de movimientos.
Estados
0: Durmiendo. 3: Rotando.
1: Detenido. 4: Deteniendo.
2: Caminando.
* Fin de la secuencia de movimientos que se estaban ejecutando al recibir
la orden de detenerse.
El estado del robot se define como una enumeración de los siguientes conceptos:
Durmiendo: En este estado el robot se encuentra apoyado en su cuerpo, con las seis
patas posicionadas junto a él.
Detenido: En este estado el robot adopta la postura que se le ordene, soportando todo
su peso en las 6 patas.
Cada pata del robot se encuentra en todo momento en uno de los siguientes estados:
Recogida: En este estado la pata se encuentra totalmente recogida al lado del cuerpo
del robot, sin soportar peso alguno. Este estado se corresponde con el estado de
“Durmiendo” del robot.
En punto neutro: en este estado la pata se encuentra apoyada y detenida en su
posición de postura normal, correspondiéndose con el estado de “Detenido” del robot.
Moviendo: en este estado la pata se encuentra apoyada y desplazándose en un paso,
ya sea cuando el robot se encuentra caminando o rotando.
Avanzando: En este estado la pata se encuentra levantada y moviéndose para iniciar
un nuevo paso, ya sea cuando el robot se encuentre caminando o rotando.
La figura 7.18 muestra las transiciones entre los estados definidos para las patas del robot.
Fig. 7.18: Diagrama que muestra los estados en los que puede encontrarse
una pata del robot y las transiciones entre estos.
Estados
0: Recogida.
1: En punto neutro.
2: Avanzando.
3: Moviendo.
Entonces, el estado del módulo generador de movimientos puede ser expresado de la siguiente
forma:
[Estado del robot, [Estado Pata 1, Estado pata 2, … , Estado pata 6]]
7.3.5.1 Durmiendo
Dormir:
Asignar punto = (0, 1, -2).
Para cada pata p, repetir:
Ejecutar MoverPata(p, punto, 1).
Fin repetir.
7.3.5.2 Detenido.
Torsión del cuerpo: Ángulo en grados que define la rotación del cuerpo del robot
alrededor del eje Z del sistema global de coordenadas.
Descentre del cuerpo: Vector en R2 que, unido a la componente Z proporcionada por el
parámetro “Altura del cuerpo”, define la posición del centro geométrico del cuerpo del
robot en el sistema de coordenadas global.
Inclinación longitudinal del cuerpo: valor en centímetros que define la mitad de la
diferencia de alturas entre la parte anterior y la parte posterior del cuerpo.
Inclinación transversal del cuerpo: valor en centímetros que define la mitad de la
diferencia de alturas entre la parte derecha y la parte izquierda del cuerpo.
Vector de posición de cada pata: este parámetro es específico de cada pata y es un
vector unitario en R2, relativo al sistema de coordenadas local de la pata, que
determina la razón de las coordenadas de la pata cuando el robot se encuentra en
estado Detenido.
El algoritmo siguiente se utiliza para adoptar una postura determinada por los parámetros
anteriormente explicados:
Adoptar postura:
Para cada pata p, repetir:
Ejecutar CalcularPuntoNeutro(p, parametros).
Ejecutar MoverPata(p, p.PuntoNeutro, velocidad).
Fin repetir.
7.3.5.3 Caminando.
En la figura 7.19 puede apreciarse que los pasos de las patas de la derecha del robot tienen
una menor longitud que los de las patas de la izquierda, esto se debe a que el valor del grado
de giro al desplazarse tomado como ejemplo es -0.6, o sea, un valor negativo; entonces, las
patas de la derecha deben acortar sus pasos para que el robot cambie de dirección hacia ese
lado.
Fig. 7.19: Vista superior del robot WHEX 1 en la que se han representado mediante vectores los desplazamientos de las patas
del robot cuando este camina.
El esquema de la figura 7.20 muestra, en una vista lateral, la secuencia de movimientos de una
pata en un paso, esta secuencia se repite continuamente mientras el robot camina. En esta
figura, los puntos etiquetados desde el 1 hasta el 6 se denominan puntos principales del paso,
los vectores de color azul corresponden a los movimientos de la pata cuando esta no está
apoyada (movimientos de posicionamiento para un nuevo paso) y los vectores de color negro
representan los movimientos de avance del paso, cuando la pata está apoyada.
Fig. 7.20: Secuencia de movimientos de una pata en un paso en la que se representan los puntos principales del paso y los
vectores de movimiento implicados en este.
En los diagramas que acompañan las explicaciones que siguen a continuación se ha utilizado,
para referirse a cada pata del robot, la siguiente nomenclatura:
ID: Pata izquierda delantera.
DD: Pata derecha delantera.
IC: Pata izquierda central
DC: Pata derecha central.
IT: Pata izquierda trasera.
DT: Pata derecha trasera.
En cada paso, el robot puede ejecutar los movimientos de posicionamiento (vectores azules en
la figura 7.20) simultáneamente en varias patas: desde una hasta tres (dependiendo del modo
que se seleccione para caminar). En los modos 0 y 1 se ejecutan estos movimientos en sólo
una pata a la vez; en el modo 2 se ejecutan estos movimientos en dos patas simultáneamente
y en el modo 3 se ejecutan en tres patas.
Los esquemas de las figuras 7.21, 7.22 y 7.23 muestran las secuencias que utiliza el robot
WHEX 1 al caminar. En estos esquemas, el trazo azul simboliza el tiempo empleado por la pata
en ejecutar los movimientos de posicionamiento para un nuevo paso y la línea fina simboliza el
tiempo que tarda la pata en ejecutar los movimientos de avance del paso.
Fig. 7.21: Secuencia de pasos que ejecuta el robot WHEX 1 al caminar y rotar en los modos 0 y 1.
Fig. 7.22: Secuencia de pasos que ejecuta el robot WHEX 1 al caminar y rotar en el modo 2.
Fig. 7.23: Secuencia de pasos que ejecuta el robot WHEX 1 al caminar y rotar en el modo 3.
En los esquemas de las figuras 7.21, 7.22 y 7.23 se han representado los extremos de las
secuencias de pasos mediante una línea vertical un poco más gruesa que las demás. En esos
instantes termina una secuencia completa y se inicia la siguiente, dando como resultado un
movimiento continuo y repetitivo.
Se puede observar en estos diagramas que en los modos 0 y 1 se ejecutan los movimientos de
avance del paso (vectores negros en la figura 7.20) más lentamente que en el modo 2, y en
este más lentamente que en el modo 3, resultando en velocidades de desplazamiento
diferentes.
La figura 7.24 muestra, de forma similar al diagrama de la figura 7.20, los 6 puntos que definen
los vectores del movimiento de la pata en un paso. Para un mejor entendimiento de las
explicaciones estos puntos serán denotados según la figura, con números desde el 1 hasta el
6. También se ha representado el punto neutro de la pata y algunas distancias importantes en
los cálculos como son la elevación, ancho y variación del paso.
Fig. 7.24: Secuencia de movimientos de una pata en un paso en la cual han sido anotadas las dimensiones entre los puntos
principales del paso.
No se puede perder de vista que los vectores representados en los diagramas de las figuras
7.20 y 7.24 no pertenecen a R2, sino que pertenecen al espacio R3 definido por el sistema de
coordenadas local de la pata. La dimensión horizontal en estos diagramas es paralela al vector
de dirección de movimiento y la dimensión vertical se corresponde con el eje Z del sistema de
coordenadas local de la pata.
Para calcular las coordenadas de los puntos principales del paso se parte del punto neutro de
la pata que es en sí el punto medio del paso (ver figuras 7.19 y 7.24). Se define:
Las ecuaciones utilizadas para calcular los puntos principales del paso son ecuaciones
iterativas, es decir, cada ecuación necesita del resultado de la ecuación anterior para
evaluarse.
Como datos para el cálculo de las coordenadas se cuenta con los parámetros que definen el
desplazamiento del robot: vector de dirección del movimiento ( ), grado de giro al
desplazarse (GG) y modo (M). Además de estos datos, se cuenta con los siguientes:
Elevación del paso (EP): Valor real positivo que define la altura a la que debe
mantenerse la pata cuando esta está efectuando los movimientos de posicionamiento
para un nuevo paso.
Descriptor del ancho máximo del paso (AMP): Valor real, dependiente del modo de
desplazamiento, que representa la tercera parte del valor máximo del ancho total de los
pasos.
Valores temporales necesarios para el cálculo de las coordenadas de los puntos del paso
(relativos a cada pata):
Dirección del paso ( ): Vector que define la dirección del paso y que tiene por norma
la mitad del ancho total del paso después de calcular el impacto del grado de giro sobre
la pata en cuestión. (ver figura 7.24)
Variación del Paso ( ): Vector que define los movimientos de avance del paso y que
tiene por norma la tercera parte del ancho total del mismo después de calcular el
impacto del grado de giro sobre la pata en cuestión. (vectores negros en las figuras
7.20 y 7.24).
Con los datos ya expuestos es hora de definir las ecuaciones que se han utilizado, no sin antes
aclarar que todas las coordenadas calculadas por estas ecuaciones son relativas al sistema de
coordenadas local de la pata.
Para calcular este vector es necesario definir su norma, la cual es igual a 1.5*AMP si la pata se
encuentra en el lado opuesto a donde debe girar el robot según GG, en otro caso dicha norma
se ve afectada por GG:
(19)
(20)
Una vez calculada la norma del vector, podemos generar las componentes del mismo. Esto se
hace generando primeramente el vector unitario relativo a con coordenadas en el sistema
local de la pata y multiplicándolo por la norma previamente calculada:
(21)
El vector variación del paso es un vector con dirección paralela a la dirección del movimiento
pero con sentido opuesto y con una norma igual a la tercera parte del ancho total del paso:
(22)
(23)
(24)
(25)
(26)
(27)
(28)
Para programar las secuencias de pasos que cumplan con los requisitos anteriormente
explicados se ha diseñado un autómata de tipo Moore, sincronizado utilizando el temporizador
0 del PIC. El temporizador 0 se ha configurado en modo de 16 bits con divisor de frecuencias
(prescaler) de 1:256 y se ha precargado con el valor 63426, resultando en una interrupción
cada 90 ms aproximadamente (tiempo entre pulsos en los diagramas de las figuras 7.21, 7.22 y
7.23).
Una vez el robot alcanza el estado Caminando (por recibir el comando Caminar), este entra al
sub-estado 2.0, activando el temporizador y comenzando así la secuencia de pasos, esto se
mantiene mientras no se reciba ninguno de los comandos que hacen que el robot abandone el
estado Caminando.
7.3.5.3.3 Algoritmo
Las patas del robot se tratan como miembros de una lista indexada en la cual el orden define la
secuencia en que las patas se moverán (ver figuras 7.21, 7.22 y 7.23). La tabla 7.3 muestra el
orden asignado a las patas para cada modo de funcionamiento.
Tabla 7.3: Orden de las patas asignado a cada uno de los modos de funcionamiento del robot.
El algoritmo mantiene tres índices que apuntan a las patas que debe mover en cada momento
según el modo de funcionamiento. Al comenzar cada secuencia de paso se actualizan dichos
índices. También se mantienen calculados los vectores y para agilizar los cálculos de los
puntos … en cada pata.
Caminar:
// Estado 2.0
Si estado == 2.0
Para cada pata i, desde 0 hasta 5, repetir:
Asignar listaPatas[i].Estado = Avanzando.
Fin repetir
Ejecutar InicializarIndicesPatas(Modo).
Ejecutar SeleccionarSiguientesPatas(Modo).
Ejecutar MoverPatasSeleccionadasPunto2(Modo).
Ejecutar EstablecerEstadoPatasSeleccionadas(Modo, Avanzando).
Asignar estado = 2.1.
// Estado 2.1
Sino Si estado == 2.1
Ejecutar MoverPatasSeleccionadasPunto3(Modo).
// Estado 2.2
Sino Si estado == 2.2
Ejecutar MoverPatasSeleccionadasPunto4(Modo).
// Estado 2.3
Sino Si estado == 2.3
Ejecutar MoverPatasSeleccionadasPunto5(Modo).
Ejecutar EstablecerEstadoPatasSeleccionadas(Modo, Moviendo).
Ejecutar EstablecerContadorPasoPatasSeleccionadas(Modo).
Ejecutar SeleccionarSiguientesPatas(Modo).
Ejecutar MoverPatasSeleccionadasPunto2(Modo).
Ejecutar EstablecerEstadoPatasSeleccionadas(Modo, Avanzando).
Asignar estado = 2.1.
Fin Si.
El algoritmo anterior es simple: en cada estado el autómata actualiza la posición de las patas
seleccionadas según el modo de funcionamiento, haciéndolas mover hacia el punto que le
corresponda.
En el estado 2.3 ocurre la transición entre una secuencia de paso y la siguiente; por tanto,
después de mover las patas seleccionadas hacia es necesario establecer el estado de
dichas patas a Moviendo y comenzar una nueva secuencia, seleccionando nuevamente las
patas que correspondan y haciéndolas mover hacia .
En todos los estados el autómata actualiza la posición de todas las patas que no se encuentren
en estado Avanzando, esto es necesario para que dichas patas ejecuten los movimientos hacia
y simultáneamente y a la velocidad necesaria.
7.3.5.4 Rotando.
En el estado Rotando el robot funciona de forma muy similar a como lo hace en el estado
Caminando: los mismos modos de funcionamiento, secuencias de pasos y el autómata que las
genera. La diferencia principal radica en la forma en que se calculan los puntos principales del
paso, que en este caso solo dependen del ángulo de giro que se halla establecido con
anterioridad.
La figura 7.26 muestra una vista superior del robot WHEX 1 en la que se han señalado con
arcos los movimientos de sus patas cuando este rota.
Fig. 7.26: Vista superior del robot WHEX 1 en la que se han representado mediante arcos los desplazamientos de las patas del
robot cuando este rota.
El esquema de la figura 7.27 muestra la secuencia de movimientos de una pata cuando el robot
rota sobre su propio eje. Como puede apreciarse en esta figura solo existe un movimiento de
avance (vector negro), esto se debe principalmente a que el movimiento que se necesita tiene
forma de arco y por tanto no es necesario insertar puntos intermedios para que el trayecto sea
rectilíneo (como sucedía en el estado Caminando).
Fig. 7.27: Secuencia de movimientos de una pata en un paso cuando el robot rota sobre su propio eje.
Los puntos se calculan haciendo rotar las coordenadas del punto neutro de la pata un ángulo
determinado, utilizando para esto una matriz de rotación en R2.
7.3.5.5 Deteniendo.
Cuando se recibe el comando Detenerse, el robot pasa al estado Deteniendo. En este estado
se permanece mientras se concluya la secuencia de pasos actual y se esté en condiciones de
adoptar la postura definida por los puntos neutros de las patas, instante en el cual se pasa
automáticamente al estado Detenido.
El último módulo del paquete de firmware del controlador principal WHEX 1 es el llamado
Gestor de periféricos, este módulo se ha incluido como soporte a futuras expansiones de
software relacionadas con la inclusión de nuevo hardware al robot, utilizando para ello los
puertos de expansión de la tarjeta controladora.
Los comandos dirigidos a este módulo comienzan siempre por un byte 0xEE, que le dice al
controlador que debe encaminar el siguiente byte al gestor de peticiones.
En estos momentos solo se da soporte al sensor de distancias por ultrasonido SRF08 instalado
en el robot mediante el bus I2C, permitiendo los comandos siguientes:
Realizar lectura de distancia: Este comando ordena una medición de la distancia
utilizando el sensor de distancias por ultrasonidos instalado en el puerto I2C en la
dirección 0xE0.
Realizar lectura de luminosidad: Este comando ordena una lectura de la intensidad de
luz mediante la LDR integrada en el sensor SRF08.
El listado del Anexo C muestra las partes más significativas del programa en lenguaje C para
PIC correspondiente al paquete controlador principal WHEX 1.
El hardware del ordenador de a bordo del robot WHEX 1 se ha configurado para permitir
ejecutar una versión de Linux como sistema operativo. Entre las múltiples distribuciones de
este sistema operativo se ha seleccionado la distribución Debian 5.0 “Lenny” debido
principalmente a que es una de las distribuciones “ligeras” más completa que existe y a su
facilidad de configuración.
Para poder conectar mediante SSH es necesario contar con una interfaz de red operativa a
nivel 3 en el robot. La interfaz que se utiliza para este fin es la controladora Ethernet integrada,
así que antes de nada, es necesario configurar dicha interfaz.
$ /etc/init.d/networking -stop
$ /etc/init.d/networking -start
Con el interfaz Ethernet ya configurado se puede proceder a realizar la configuración del resto
de elementos necesarios.
Como ya se ha visto anteriormente, el robot WHEX 1 necesita que su sistema operativo brinde
soporte para los siguientes periféricos:
Multimedia: Controladora onboard AC’97.
Soporte WIFI: Controladora WIFI USB SMC EZ Connect.
Sensor de visión: Webcam Creative Live! Cam Notebook.
Librerías OpenCV para procesamiento de imágenes.
La controladora de audio con que cuenta el ordenador de a bordo es una controladora AC’97,
con chipset Realtek. Para estas tarjetas se puede instalar el software Alsa, lo cual se hace
mediante los comandos siguientes:
Una vez ejecutados los comandos anteriores es necesario reiniciar el ordenador. Hecho esto ya
se ha instalado y configurado el driver de audio.
Además de la controladora de audio AC’97, el robot cuenta con una webcan Creative Live!
Cam y esta a su vez incluye hardware de audio (micrófono), por este motivo es necesario
configurar la controladora AC’97 como el dispositivo de reproducción y grabación de audio por
defecto del sistema.
$ cat /proc/asound/modules
0 snd_hda_intel
1 snd_usb_audio
En el fichero anterior, la línea con la anotación “index=0” establece el dispositivo por defecto.
Para la puesta en funcionamiento de esta tarjeta se han utilizado los drivers para Windows XP,
esto se ha hecho debido a que no existen drivers nativos para este hardware en Linux.
Para hacer funcionar drivers de red diseñados para Windows XP bajo entornos Linux se debe
instalar el software Ndiswrapper. Para instalar este paquete se debe ejecutar el siguiente
comando:
Hecho lo anterior ya se cuenta con Ndiswrapper en el sistema, ahora es necesario cargar los
drivers de Windows XP que se desean utilizar:
Este comando copia el archivo driver.sys y crea una configuración para él. Hecho lo anterior es
necesario cargar el módulo Ndiswrapper, esto lo hacemos de la siguiente forma:
$ sudo depmod -a
$ sudo modprobe ndiswrapper
$ sudo ndiswrapper -m
Ahora es necesario editar el fichero /etc/modules para que al iniciarse el sistema se cargue
automáticamente Ndiswrapper. Para esto, se añade la siguiente línea:
ndiswrapper
Con los drivers de red ya instalados, es hora de configurar el sistema para que haga uso de la
WIFI, ya sea conectándose a una red inalámbrica existente o generando una red inalámbrica
propia en modo “ad hoc”.
La configuración es la siguiente:
En caso de que la red no cuente con un servidor DHCP que gestione las direcciones IP, puede
ser necesario modificar también la entrada iface, especificando que es del tipo static y añadir
entradas address y netmask que provean los parámetros de nivel 3 necesarios para configurar
el interfaz.
Al igual que en el caso de WEP, solo es necesario modificar para establecer el SSID y la
contraseña de la red a la que se desea conectar.
Para generar una red inalámbrica propia cifrada con WEP y conectarse a esta es necesario
configurar del modo siguiente:
En la configuración anterior se genera una red inalámbrica cifrada con WEP sobre el canal 1.
Además el interfaz inalámbrico se configura para que se conecte de forma estática a dicha red,
utilizando la dirección IP 192.168.50.100/24.
8.3 Instalación y configuración del driver de la webcam Creative Live! Cam Notebook.
Antes de nada se debe descargar la última versión del driver ov51x JPEG, esto se hace desde
su web: http://www.rastageeks.org/ov51x-jpeg/index.php/Main_Page.
El siguiente paso es asegurar que no se tiene instalado el módulo ov511, pues este se podría
iniciar primero y hacer que el driver deje de funcionar:
Antes de continuar con la instalación es imprescindible asegurar que el sistema cuenta con
todo lo necesario para compilar código. Para instalar las herramientas de compilación se debe
ejecutar el siguiente comando:
Para instalar el driver se deben extraer los archivos, compilarlos e instalar el módulo, para
hacer esto se ejecutan los comandos siguientes:
En este punto se cuenta con un prototipo totalmente funcional del robot hexápodo WHEX 1, por
tanto solo queda desarrollar el software de control responsable de generar los comandos que el
robot debe acatar.
La figura 9.1 muestra los componentes de la arquitectura del sistema que se tratan en el
presente capítulo.
Debido al carácter académico del proyecto y que el robot se ha concebido desde sus inicios
como plataforma hardware de apoyo al aprendizaje de la programación de robots móviles, el
software de control debe ser muy flexible a modificaciones futuras tanto de su lógica como de
los datos manipulados.
El software debe definirse desde un enfoque modular, pues así el estudiante puede reemplazar
los módulos que estime conveniente por otros que cumplan sus expectativas o que presenten
alguna mejora con respecto al original, o también agregar módulos que proporcionen nuevas
funcionalidades al robot y de esta forma ir modificando la programación del mismo.
Así mismo el software debe ser robusto ante las modificaciones que le sean realizadas: cada
módulo debe reaccionar correctamente ante errores generados por otros módulos.
Para cumplir los requisitos no funcionales anteriormente descritos y utilizando las técnicas de
diseño dirigido por pruebas se ha creado un framework de programación. Este framework debe
permitir acceder a los recursos de hardware y software del robot de forma fácil, por ejemplo,
ejecutando funciones o instanciando alguna clase.
En la figura 9.2 se puede apreciar que el framework permite crear software totalmente modular,
toda la funcionalidad de procesamiento y entrada – salida se encuentra organizada en módulos
que se comunican a través de subscripciones a buzones de mensajes gestionados por el
sistema de comunicación interno. Los módulos son mantenidos por el gestor de módulos y
acceden a los servicios del hardware del robot mediante una interfaz hacia este.
En secciones siguientes se comenta el diseño de cada una de las partes de esta arquitectura.
El gestor de módulos tiene por responsabilidad la gestión del listado de módulos: añadiendo,
eliminando, activando y desactivando los módulos que sean necesarios para lograr la
configuración del software que se desee.
Los módulos son las unidades funcionales en las que se ha dividido el software de control del
robot WHEX 1, estos pueden ser de los siguientes tipos:
Módulo Procesador: Este tipo de módulo se utiliza como nodo de procesamiento en el
robot, analizando los mensajes que le llegan a través del sistema interno de
comunicación, tomando decisiones y generando respuestas que son inyectadas
también al sistema de comunicación.
Módulo E/S: Este tipo de módulo gestiona la entrada - salida con algún agente externo,
posibilitando por ejemplo la comunicación de un PC remoto con el robot a través de
Internet o la conexión de un mando a distancias.
Módulo Sniffer: Este tipo de módulo se ha definido para obtener información
secuencial desde algún medio externo e inyectarla al sistema de comunicación interno.
Cada clase de módulo debe tener una serie de servicios mínimos indispensables para su
integración en el software, específicamente en el sistema de comunicación interno y en el
gestor de eventos periódicos. Estos servicios mínimos se logran haciendo que el desarrollador
Módulo Procesador:
inicializar(): esta función es ejecutada por el gestor de módulos al crear la instancia del
módulo en cuestión.
onMensajeInterno(Modulo& remitente, MSG & msg): esta función es ejecutada por el
sistema de comunicación cada vez que llega un mensaje interno que debe ser
encaminado al módulo en cuestión. En esta función debe ser programada la
funcionalidad de procesamiento del módulo, en caso de existir.
onEventoPeriodico(int IdEvento): esta función se ejecuta de forma periódica si el
módulo se encuentra suscrito a algún evento periódico(en secciones siguientes se
amplía este concepto).
El sistema de comunicación interno permite que los módulos existentes se comuniquen entre sí
de forma eficiente y segura. La comunicación es síncrona: los mensajes son entregados a
todos los módulos que lo necesiten de forma inmediata. Un mensaje puede ser entregado a
más de un módulo, notificando la recepción al módulo emisor en todo caso.
La figura 9.3 muestra la estructura de buzones mantenida por el sistema de comunicación y las
subscripciones de los distintos módulos a estos.
Fig. 9.3: Estructura de buzones mantenida por el sistema de comunicación interna para realizar el encaminamiento de
mensajes.
El sistema de comunicación mantiene una lista de buzones. Cada buzón corresponde a un tipo
de mensaje, identificado por un id. Los módulos se suscriben a los buzones de los cuales
deseen recibir mensajes y el gestor de buzones (ver figura 9.3) encamina el mensaje hacia
todos los módulos que se encuentren suscritos al buzón correspondiente.
El siguiente algoritmo es empleado por el gestor de buzones para encaminar cada mensaje
hacia los módulos destino:
De este modo, el sistema de comunicación provee un medio de transporte flexible para que
todos los módulos se comuniquen entre sí.
Este mecanismo de comunicación es muy útil cuando los módulos no conocen el destino de los
mensajes. Por ejemplo, un módulo que gestione el sensor de distancias por ultrasonidos no
necesita saber que módulos utilizarán posteriormente los datos de distancias leídos,
simplemente se limita a leer los datos provenientes del sensor de distancias e inyectarlos en el
sistema de comunicación.
Los módulos también pueden enviarse mensajes directamente unos a otros siempre y cuando
conozcan los módulos de destino. Esta forma de comunicación punto a punto es útil por
ejemplo para enviar respuestas hacia el remitente de una petición.
Existen dos tipos de mensajes internos: los mensajes de texto y los mensajes de objetos.
Un robot, además de poderse comandar de forma remota, debe ser capaz de tomar decisiones
propias con cierta autonomía. Por este motivo surge la necesidad de poder ejecutar
procedimientos sin que estos sean desencadenados por eventos de entrada / salida. Para
poder realizar esta tarea el framework WHEX 1 utiliza el gestor de eventos periódicos.
El gestor permite que los módulos se suscriban a eventos internos generados de forma
periódica. Los módulos, para suscribirse a un evento, solamente necesitan especificar el
periodo de tiempo entre notificaciones que necesiten.
Al ocurrir una señal SIGALRM el gestor de eventos periódicos determina que eventos deben
ser notificados. Para esto cada evento mantiene un contador que es disminuido en uno por el
gestor cada vez que se recibe una señal. Cuando el contador llega a cero, se notifica la
ocurrencia del evento al módulo correspondiente.
La interfaz con el hardware del robot es el medio mediante el cual el resto del software, que se
encuentra dividido en módulos, se comunica con los recursos hardware del robot. Está formada
por dos clases principales:
Driver de la placa controladora WHEX 1: esta clase incluye todas las funciones
necesarias para acceder a los servicios de la placa controladora a través de los
comandos mostrados en la tabla del anexo A. para utilizarla solo es necesario
referenciar la clase y ejecutar alguna de sus funciones.
Driver de la cámara: esta clase se utiliza para acceder a la cámara del robot.
// Sección de declaraciones
#include "WHEX.h"
#include "Modulo1.h‛
#include "Modulo2.h‛
#include "Modulo3.h‛
// Unidad modular
WHEX_MODULOS(UnidadModularEjemplo)
INSTANCIA_MODULO(1,Modulo1(1))
INSTANCIA_MODULO(2,Modulo2(2))
INSTANCIA_MODULO(3,Modulo3(3))
WHEX_FIN_MODULOS
// Unidad de comunicaciones
WHEX_UNIDAD_COMUNICACION(UnidadComunicacionEjemplo)
WHEX_BUZONES
WHEX_BUZON(1,Mensajes de estado)
WHEX_BUZON(2,Mensajes de comandos)
WHEX_FIN_BUZONES
WHEX_SUSCRIPCIONES
WHEX_SUSCRIPCION_BUZON(1,1)
WHEX_SUSCRIPCION_BUZON(1,2)
WHEX_SUSCRIPCION_BUZON(2,1)
WHEX_SUSCRIPCION_BUZON(3,2)
WHEX_FIN_SUSCRIPCIONES
WHEX_EVENTOS_PERIODICOS(100000,100000)
WHEX_SUSCRIPCION_EVENTO(1,3,500000)
WHEX_ACTIVAR_EVENTO(1,3)
WHEX_FIN_EVENTOS_PERIODICOS
WHEX_FIN_UNIDAD_COMUNICACION
En la sección de declaraciones deben añadirse los encabezamientos de todos los módulos que
se han codificado y que serán utilizados por la unidad modular y de comunicación. La unidad
modular define e inicializa los módulos que se utilizarán. Esta inicialización se realiza
estableciendo el identificador de cada módulo e invocando su constructor. Por último la unidad
de comunicación define los buzones de mensajes, establece las suscripciones de los módulos
a estos buzones y configura al gestor de eventos periódicos.
Entonces, un programa desarrollado utilizando esta arquitectura incluye una serie de módulos
que contienen toda la funcionalidad de la aplicación y una unidad modular y de comunicación
que define la interacción entre dichos módulos.
Para definir la unidad modular y de comunicación el framework WHEX 1 provee las siguientes
macros:
El esquema de la figura 9.4 muestra la arquitectura general del software de control del robot
WHEX 1. El núcleo de este sistema está formado por un conjunto de módulos que se
comunican a través del mecanismo de comunicación interno que provee el framework.
En el diagrama de la figura 9.4 pueden apreciarse también los cuatro procesos que conforman
el sistema:
Proceso principal del software: cuyo núcleo es el mecanismo de comunicación interno
del framework WHEX 1. Este proceso incluye toda la funcionalidad del software,
distribuida en un conjunto de módulos.
Proceso driver de la placa controladora WHEX 1: este proceso constituye la interfaz de
comunicación del software con el hardware de la placa controladora. Como se observa
en la figura 9.4, este proceso se comunica con la tarjeta controladora mediante el
protocolo RS232 y con el proceso principal mediante una tubería FIFO gestionada por
un módulo de entrada – salida.
Proceso detector de rostros: este proceso incluye toda la funcionalidad de detección de
rostros, utiliza para ello las librerías de visión artificial OpenCV.
Proceso cliente WHEX 1: este proceso actúa como cliente del robot. Permite enviar
comandos al robot para que sean ejecutados. La comunicación de este proceso con el
proceso principal es del tipo cliente – servidor, utilizando los protocolos TCP/IP; en esta
comunicación el servidor está implementado mediante un módulo de entrada – salida
en el proceso principal.
En el diagrama de la figura 9.4 es fácil deducir la ruta que siguen los datos. Como ejemplo
tomar el caso en el cual un ordenador remoto ordena al robot que comience a caminar,
enviando el vector de dirección y el grado de giro:
El proceso cliente genera y envía al proceso principal del software un mensaje con el
comando “comenzar a caminar”, que incluye como datos el vector de dirección de
movimiento y el grado de giro.
El comando llega al módulo E/S que gestiona las conexiones TCP/IP, este módulo
genera un mensaje interno que es encaminado al módulo procesador de movimiento.
El módulo procesador de movimiento recibe el mensaje y lo procesa, extrayendo los
comandos necesarios para hacer efectiva la orden.
Los comandos son enviados secuencialmente al módulo E/S que gestiona el driver de
la tarjeta controladora WHEX 1, el cual los envía al proceso driver WHEX 1.
El proceso driver WHEX 1 se comunica con el hardware a través de su interfaz serie y
el robot comienza a caminar.
En las secciones siguientes se describen los diferentes procesos que conforman el software
controlador WHEX 1.
El proceso driver tiene como principal función permitir que el software de control interactúe con
el firmware presente en la placa controladora.
Como se ha visto en la sección anterior, este proceso se comunica con el hardware mediante
una interfaz serie sobre la cual actúa el protocolo RS232 y con el proceso principal del software
WHEX 1 a través de una tubería FIFO (ver figura 9.4).
Fig. 9.5: Diagrama de flujo que representa el algoritmo del proceso driver.
Primeramente se inicializan los datos y recursos que utilizará el proceso. Esta inicialización se
compone de las siguientes tareas (ver figura 9.5):
1. Primeramente se inicializan los datos que manejará el proceso, leyendo de un fichero
de configuración principal (llamado driver.conf). La tabla 9.1 muestra las entradas de
este fichero y sus descripciones.
2. A continuación se carga un fichero de comandos que tiene como función principal
asignar a cada comando admitido por la placa controladora (valor numérico de 8 bits),
un nombre (cadena de texto alfanumérico). Esto se hace para permitir que los
comandos se identifiquen mediante un nombre de alto nivel, independiente del
hardware y que pueda ser cambiado en el futuro. La tabla 9.2 muestra las entradas de
este fichero.
3. El último paso de la inicialización es la apertura del puerto serie y las tuberías de
comunicación con el proceso principal.
Nombre del comando Valor numérico Nombre del comando Valor numérico
get_version 0 set_body_slope_trans 18
enable_all_servos 1 adopt_stand 19
disable_all_servos 2 go_sleep 20
refresh_all_servos 3 go_walk 21
set_stand_neutral_values 4 go_turn 22
go_stop 5 set_walk_dir_x 23
change_servo_controller_state 6 set_walk_dir_y 24
enable_servo 7 set_turn_dir 25
disable_servo 8 set_walking_turn_grade 26
set_speed 9 get_stand_values 27
set_position 10 adopt_stand_steps 28
refresh_servo 11 set_head_x 29
set_body_height 12 set_head_y 30
set_legs_openness 13 adopt_head_stand 31
set_body_twist 14 change_head_x 32
set_body_center_x 15 change_head_y 33
set_body_center_y 16 get_head_pos 34
set_body_slope_long 17
Este proceso tiene como principal función la detección de rostros humanos haciendo uso del
sensor de visión del robot WHEX 1.
Como se ha mencionado en secciones anteriores de este trabajo, WHEX 1 utiliza una cámara
web Creative Live! a modo de sensor óptico. El proceso detector de rostros utiliza esta cámara
para realizar su labor.
En este trabajo se han utilizado, como imágenes negativas, cerca de 200 fondos de escritorio
de distintas resoluciones. Esta cantidad de imágenes ha sido multiplicada aplicando las
transformaciones anteriormente mencionadas. Las imágenes negativas deben indexarse en un
fichero de texto en el cual cada línea contiene la ruta hacia una imagen:
negativas/imagen1.jpg
negativas/imagen2.jpg
…
negativas/imagenN.jpg
34
Como imágenes positivas se ha utilizado la base de datos de rostros FERET , publicada por el
NIST (National Institute of Standards and Technology) para uso en investigaciones. De esta
base de datos se han tomado 500 imágenes, las cuales han sido escaladas a un tamaño de 50
x 50 píxeles. Para obtener las 1500 imágenes positivas a partir de las 500 existentes se ha
hecho variar la exposición y la saturación, creando a partir de cada imagen, dos más. Estas
34
Link de descarga previo registro: http://face.nist.gov/colorferet/request.html
imágenes también necesitan de un fichero índice que además de listarlas, brinde información
de coordenadas donde se encuentra el objeto que queremos detectar. El fichero índice de
imágenes positivas tiene la siguiente estructura:
En el fichero anterior se puede observar que las rutas de las imágenes van acompañadas de
cuatro valores numéricos: X e Y de las coordenadas del objeto que deseamos detectar y las
dimensiones (Ancho y Alto) de dicho objeto. Estas medidas son relativas al sistema de
coordenadas de la imagen, con origen en la esquina superior izquierda y la unidad de medida
es el píxel. Dado el caso de que las imágenes positivas que se han utilizado solamente
contienen el rostro de una persona y que estas han sido escaladas con anterioridad a 50 x 50
píxeles, los valores numéricos que se han empleado en este fichero, para todas las imágenes
positivas son: 0 0 50 50.
El siguiente paso es la creación de las muestras, para esto se utiliza una herramienta
proporcionada por OpenCV: opencv-createsamples. El siguiente listado muestra un uso típico
de esta herramienta:
donde:
-info: especifica la ruta del fichero con el índice de las imágenes positivas.
-vec: especifica el nombre del fichero de salida con las muestras generadas.
-num: establece la cantidad de imágenes positivas que contiene el índice.
-w: especifica el ancho en píxeles de las muestras que se generarán.
-h: especifica el alto en píxeles de las muestras que se generarán.
Una vez generadas las muestras, solo queda realizar el entrenamiento del clasificador. En este
entrenamiento se obtiene como resultado un fichero XML que contiene el clasificador.
Para el entrenamiento se utiliza otra utilidad facilitada por OpenCV: opencv-haartraining. Esta
utilidad necesita dos entradas: el fichero índice de imágenes negativas y el fichero de muestras
generado en el paso anterior. El siguiente listado muestra el modo de empleo típico de esta
utilidad:
donde:
-data: provee el directorio de salida donde se almacenará el fichero XML resultante.
-vec: proporciona el archivo de muestras generado en la etapa anterior.
Una vez terminada la ejecución del entrenamiento se cuenta con un fichero XML que define el
clasificador.
Una vez entrenado el clasificador solamente resta codificar un programa que lo utilice. El
programa debe detectar los rostros a través de la cámara y enviar sus coordenadas al proceso
principal a través de FIFOs. En caso de que no se detecte ningún rostro, el programa debe
enviar un mensaje notificando el hecho. La figura 9.6 muestra el algoritmo de este programa.
Primeramente se inicializan los datos y recursos que utilizará el proceso. Esta inicialización se
compone de las siguientes tareas (ver figura 9.6):
Cargar el fichero de configuración visión.conf y establecer los valores iniciales de las
variables globales según este fichero.
Cargar el listado de detectores de objetos desde un fichero. Este listado incluye las
rutas de los ficheros XML de los detectores que se utilizarán. En estos momentos
solamente se utiliza el detector de rostros descrito en secciones anteriores; pero el
software se ha desarrollado de forma que sea muy sencillo agregar más detectores
(solamente es necesario añadirlo a este fichero).
Inicializar la cámara, estableciendo el formato de imagen, su resolución, etc.
Abrir las tuberías de comunicación con el proceso principal.
Si la inicialización ha concluido con éxito el proceso entra en un bucle hasta que se detecte una
señal SIGINT o SIGTERM. En este bucle se realizan dos tareas de forma secuencial:
Atender a eventos de lectura en las FIFOs de comunicación con el proceso principal. Si
se detecta la llegada de un mensaje por esta vía, se extrae le comando y se ejecuta.
Ejecución del clasificador. Si después de ejecutado el clasificador sobre la imagen de la
cámara se ha detectado algún rostro, se procede a extraer las coordenadas de dicho
rostro, adaptarlas correctamente y enviarlas al proceso principal a través de las FIFOs.
Si por el contrario no se ha detectado ningún rostro, se notifica este hecho mediante la
misma vía.
Fig. 9.6: Diagrama de flujo que representa el algoritmo del proceso detector de rostros.
Las coordenadas de rostros detectados y demás notificaciones generadas por este proceso
constituyen la entrada al módulo seguidor de rostros que será explicado en secciones
siguientes.
Como se puede observar en la figura 9.4 se han desarrollado, utilizando las herramientas
facilitadas por el framework WHEX 1, un conjunto de módulos. La tabla 9.3 muestra una
descripción de cada uno de estos módulos.
Tabla 9.4: Buzones de mensajes que se han definido y los módulos suscritos a cada uno.
El diagrama de la figura 9.7 muestra una vista lógica de los mecanismos de comunicación que
se han configurado en el software de control.
Los usuarios, para conectarse, necesitan disponer de un nombre de usuario y una contraseña.
Las contraseñas no se almacenan en texto plano, en su lugar se almacenan sus resúmenes
Los usuarios pueden ser de dos tipos: administradores y usuarios básicos. A pesar de que esto
no se utiliza aún, esta característica se ha incluido para uso futuro.
Pedro#admin#********************
Juan#admin#********************
Ana#user#********************
Este módulo es muy sencillo, su única función es servir de “puente” entre el resto de módulos y
el proceso driver de la placa controladora.
Este módulo, al inicializarse, abre dos tuberías de tipo FIFO: una para los comandos enviados
al driver y otra para las respuestas. A continuación y mediante la llamada al sistema “fork”, crea
un nuevo proceso hijo y ejecuta al driver de la placa.
Al igual que el módulo driver, este módulo tiene como única función servir de enlace, en este
caso con el proceso detector de rostros, obteniendo las coordenadas de los rostros detectados
y enviándolas al módulo seguidor de rostros.
El módulo seguidor de rostros tiene como función realizar el seguimiento de un rostro detectado
mediante la cámara del robot.
El módulo está implementado mediante una maquina de Mealy de cuatro estados. El diagrama
de la figura 9.8 muestra este autómata.
Antes de continuar con la explicación del autómata es necesario mencionar que un rostro
detectado se considera centrado en el campo de visión de la cámara si el valor absoluto de su
coordenada x es menor que 30 píxeles.
Fig. 9.8: Máquina de Mealy que implementa el módulo seguidor de rostros. En este diagrama:
vx: coordenadas de un rostro detectado por la cámara, pudiendo estar centrado o no en el campo de visión.
vc: coordenadas de un rostro detectado por la cámara aproximadamente en el centro del campo de visión.
vd: coordenadas de un rostro detectado por la cámara en la periferia del campo de visión.
f: notificación de que no se ha detectado ningún rostro.
A, B, C, D, E y F: Acciones ejecutadas por el autómata en cada transición.
Como puede observarse en la figura 9.8, el autómata tiene como entradas las coordenadas de
los rostros detectados (en la figura: vx, vc y vd). También es una entrada válida al autómata la
notificación de que no se ha detectado rostro alguno (en la figura: f). El estado inicial es el cero,
y con cada transición se ejecutan las siguientes acciones (ver figura 9.8):
A) Mover la cabeza del robot a su posición de origen (en posición horizontal y mirando al
frente).
B) Mover la cabeza del robot en dirección al rostro detectado.
C) Iniciar movimiento de rotación del cuerpo en la dirección del rostro detectado.
Mover la cabeza del robot en dirección al rostro detectado.
D) Detener la rotación del cuerpo del robot.
Mover la cabeza del robot en dirección al rostro detectado.
E) Calcular las coordenadas del punto donde es más probable que se encuentre el rostro
que se estaba siguiendo (y que se ha perdido).
Mover la cabeza del robot hacia las coordenadas calculadas.
F) Detener la rotación del cuerpo del robot.
Calcular las coordenadas del punto donde es más probable que se encuentre el rostro
que se estaba siguiendo (y que se ha perdido).
Mover la cabeza del robot hacia las coordenadas calculadas.
Si Estado == 0
Si EsCoordenadaRostro(M)
Asignar P = CalcularVectorDesplazamientoP().
Ejecutar EnviarMensajeInterno(‚set_head_x=M.Param1
set_head_y=M.param2 adopt_head_stand=10‛).
Asignar Estado = 1.
Fin Si
Sino Si Estado == 1
Si EsCoordenadaRostro(M)
Asignar P = CalcularVectorDesplazamientoP().
Si M.Param1 > 30 || M.Param1 < -30
Asignar Dir = ‚left‛.
Si M.Param1 > 0
Asignar Dir = ‚right‛.
Fin Si
Ejecutar EnviarMensajeInterno(‚set_turn_dir=Dir go_turn=1‛).
Asignar Estado = 2.
Fin Si
Ejecutar EnviarMensajeInterno(‚set_head_x=M.Param1
set_head_y=M.param2 adopt_head_stand=10‛).
Sino
Ejecutar EnviarMensajeInterno(‚set_head_x=P.X set_head_y=P.Y
adopt_head_stand=10‛).
Asignar Estado = 3.
Fin Si
Sino Si Estado == 2
Si EsCoordenadaRostro(M)
Asignar P = CalcularVectorDesplazamientoP().
Si M.Param1 > 30 || M.Param1 < -30
Asignar Dir = ‚left‛.
Si M.Param1 > 0
Asignar Dir = ‚right‛.
Fin Si
Ejecutar EnviarMensajeInterno(‚set_turn_dir=Dir go_turn=1‛).
Sino
Ejecutar EnviarMensajeInterno(‚go_stop‛).
Asignar Estado = 1.
Fin Si
Ejecutar EnviarMensajeInterno(‚set_head_x=M.Param1
set_head_y=M.param2 adopt_head_stand=10‛).
Sino
Ejecutar EnviarMensajeInterno(‚go_stop‛).
Ejecutar EnviarMensajeInterno(‚set_head_x=P.X set_head_y=P.Y
adopt_head_stand=10‛).
Asignar Estado = 3.
Fin Si
Sino Si Estado == 3
Si EsCoordenadaRostro(M)
Asignar P = CalcularVectorDesplazamientoP().
Ejecutar EnviarMensajeInterno(‚set_head_x=M.Param1
set_head_y=M.param2 adopt_head_stand=10‛).
Asignar Estado = 1.
Sino
Ejecutar EnviarMensajeInterno(‚set_head_x=0 set_head_y=0
adopt_head_stand=10‛).
Asignar Estado = 0.
Fin Si
Fin Si
Fin función
Módulo de movimientos.
Este módulo se ha codificado para disminuir el acoplamiento existente entre los módulos de
entrada / salida que manejan las conexiones TCP/IP y el driver de la placa controladora
respectivamente. La única función del módulo de movimientos (por ahora) es servir de puente
entre estos dos módulos de entrada - salida.
Este módulo realiza mediciones de la distancia cada medio segundo y solamente cuando el
robot camina hacia adelante. Las lecturas obtenidas se analizan para determinar si hay peligro
de colisión con algún obstáculo (distancia menor que 35 cm), en este caso, se ordena al robot
que se detenga.
Para poder realizar las mediciones cada medio segundo, este módulo se suscribe a un evento
periódico gestionado, como ya se ha visto, por el gestor de eventos periódicos del framework
WHEX 1.
// Sección de declaraciones
#include "../WHEX/WHEX.h"
#include "src/Modulos/ModuloTCPIP.h"
#include "src/Modulos/ModuloDriver.h"
#include "src/Modulos/ModuloVisionRostros.h"
#include "src/Modulos/ModuloSeguidorRostros.h"
#include "src/Modulos/ModuloSensorDistancias.h"
#include "src/Modulos/ModuloMovimiento.h"
#include "src/Modulos/ModuloVoz.h"
WHEX_MODULOS(WHEX_MODS)
INSTANCIA_MODULO(1,ModuloTCPIP(1))
INSTANCIA_MODULO(2,ModuloDriver(2))
INSTANCIA_MODULO(3,ModuloVisionRostros(3))
INSTANCIA_MODULO(4,ModuloSeguidorRostros(4))
INSTANCIA_MODULO(5,ModuloSensorDistancias(5))
INSTANCIA_MODULO(6,ModuloMovimiento(6))
INSTANCIA_MODULO(7,ModuloVoz(7))
WHEX_FIN_MODULOS
WHEX_UNIDAD_COMUNICACION(WHEX_COM)
WHEX_BUZONES
WHEX_BUZON(1,Mensajes TCP/IP)
WHEX_BUZON(2,Mensajes al Driver)
WHEX_BUZON(3,Mensajes enviados al proceso de vision)
WHEX_BUZON(4,Mensajes de vision)
WHEX_BUZON(5,Mensajes del sensor de distancias)
WHEX_BUZON(6,Mensajes de comandos de movimiento de alto nivel)
WHEX_BUZON(7,Mensajes de voz)
WHEX_FIN_BUZONES
WHEX_SUSCRIPCIONES
WHEX_SUSCRIPCION_BUZON(1,1)
WHEX_SUSCRIPCION_BUZON(2,2)
WHEX_SUSCRIPCION_BUZON(3,3)
WHEX_SUSCRIPCION_BUZON(4,4)
WHEX_SUSCRIPCION_BUZON(5,5)
WHEX_SUSCRIPCION_BUZON(6,6)
WHEX_SUSCRIPCION_BUZON(7,7)
WHEX_FIN_SUSCRIPCIONES
WHEX_EVENTOS_PERIODICOS(100000,100000)
WHEX_SUSCRIPCION_EVENTO(1,5,500000)
WHEX_FIN_EVENTOS_PERIODICOS
WHEX_FIN_UNIDAD_COMUNICACION
35
Descarga y documentación en: http://mpg321.sourceforge.net/
36
Descarga y documentación en: http://www.cstr.ed.ac.uk/projects/festival/
Como puede apreciarse en el listado anterior, utilizando las macros expuestas en la sección
9.1.5 se ha definido la arquitectura modular que se utilizará en el software: se han declarado
los módulos, los buzones de mensajes internos y los eventos periódicos que se necesitan
además de las suscripciones de los módulos a estos recursos del framework.
Este proceso se ejecuta fuera del robot en ordenadores clientes y consiste en una interfaz
gráfica creada utilizando el lenguaje Java y las librerías de creación de interfaces gráficas
Swing.
Al iniciar el programa se muestra una ventana que solicita los datos necesarios para conectar
con el robot (ver figura 9.9). Es necesario aclarar que la contraseña no viaja a través de la red,
en su lugar se envía su resumen SHA1.
Si los datos de acceso son correctos y se establece la conexión con el robot, se muestra la
ventana principal de la interfaz gráfica (ver figura 9.10). Esta ventana permite controlar los
movimientos y la postura del robot de forma sencilla para el usuario.
El listado del anexo D muestra las partes más significativas del código fuente de los programas
que componen el software controlador WHEX 1, este anexo puede ser consultado como guía
para la codificación de módulos nuevos y su integración en el software.
Para finalizar el desarrollo del presente trabajo se han ejecutado una serie de pruebas que
demuestran el correcto funcionamiento del robot WHEX 1. Se realizaron pruebas unitarias
sobre cada elemento desarrollado y una vez aprobadas dichas pruebas se procedió a su
integración con los demás elementos del sistema. Finalmente, para garantizar el correcto
funcionamiento del robot como un todo, se realizaron pruebas de aceptación.
Una vez comprobado que todos los elementos anteriores funcionan correctamente de forma
individual se realizaron pruebas de aceptación. A continuación se comentan las pruebas
realizadas y los resultados obtenidos en ellas.
Por otra parte se comprobó que los servomotores que se pretendía Fig. 10.1: Piezas de las patas
utilizar (HITEC HS311) no contaban con la fuerza suficiente para fabricadas en policarbonato
que se descartaron debido a
soportar el peso del robot, que para realizar las pruebas se estimó en su alta torsión.
2.5 Kg.
Si el robot pesa 2.5 Kg, cada pata del mismo debe poder soportar un peso igual a la sexta
parte de esta cantidad cuando el robot está detenido y de la tercera parte cuando camina, o
sea, aproximadamente 400 y 800 gramos respectivamente. Al aplicar peso sobre una pata
energizada se comprobó que los servomotores no pudieron mantener la posición cuando
pesaban sobre estos aproximadamente 600 gramos.
También se comprobó que se generaba torsión en los ejes de los servomotores, pues en el
HITEC HS311 estos están hechos de plástico; por tanto, debido a esto y a su falta de fuerza,
fueron sustituidos los servomotores de la rodilla por el modelo BMS620MG y los de la cadera
(eje horizontal) por el modelo BMS630MG, ambos de la marca BlueBird; mientras que se
decidió seguir utilizando el modelo de HITEC para el eje vertical de la cadera y para las
articulaciones del cuello del robot.
Cuando todas las patas ya se encontraban en su sitio se decidió realizar una prueba de peso
sobre toda la estructura, fabricada en aluminio y utilizando los nuevos servomotores. Para esto
se colocó un peso de 1.5 Kg sobre la estructura, para así
completar el peso total de 2.5 Kg.
Las pruebas del controlador principal WHEX 1 se ejecutaron con el controlador insertado en la
placa controladora WHEX 1 y esta a su vez montada en la estructura mecánica del robot. A
continuación se conectaron correctamente todos los servomotores a las salidas PWM
definitivas y utilizando un cable serie se conectó el controlador a un ordenador portátil. Los
comandos se enviaron utilizando el software Eltima Advanced Serial Port Terminal para
Windows.
El diseño de los casos de prueba se realizó por separado para cada funcionalidad del
controlador:
La comunicación RS232 y el módulo maestro I2C se probaron utilizando el mismo set
de pruebas empleado para probar el controlador de servomotores (ver anexo E).
La cinemática inversa se probó utilizando los casos de prueba mostrados en el
anexo F.
El generador de movimientos se probó haciendo funcionar al robot, realizando todas
las transiciones entre estados existentes y corrigiendo sobre la marcha los problemas
encontrados.
Al finalizar las pruebas unitarias se realizaron pruebas de carga utilizando el comando
0x00 para determinar si la comunicación se efectuaba de forma eficiente.
Los resultados obtenidos con las pruebas realizadas demostraron la existencia de varios fallos,
como por ejemplo los siguientes:
El módulo maestro I2C se colgaba al enviar una solicitud de lectura a los servomotores
cuando estos se encontraban inactivos.
El módulo de cinemática inversa no realizaba bien el cálculo del ángulo 1 de la cadera
cuando el punto se encontraba por encima de la base de la pata.
La necesidad de crear el módulo gestor de peticiones surgió debido a que el
controlador se colgaba cuando se realizaban peticiones a ráfagas de 150 comandos
por segundo o más.
El generador de movimientos no generaba una trayectoria rectilínea al caminar
utilizando 1 o 2 patas.
De igual forma se probaron las salidas PWM, utilizando un osciloscopio para medir las
frecuencias y los tiempos en los que la señal se mantenía en estado 1.
El desarrollo del software controlador WHEX 1 se verificó en todo momento mediante pruebas
unitarias automáticas, para esto se utilizaron las librerías CppUnit. El uso de la técnica de
diseño dirigido por pruebas (TDD) facilitó mucho el desarrollo y la detección de fallos en
momentos tempranos del desarrollo.
Capítulo
Conclusiones y líneas futuras 11
11.1 Conclusiones.
Este proyecto ha abordado el diseño y construcción de un robot móvil articulado de seis patas,
el cual se ha concebido desde sus inicios como una plataforma hardware de apoyo a la
enseñanza de técnicas de programación robótica.
Para lograr este objetivo se han realizado un número de tareas relacionadas con el diseño de
la estructura mecánica y la electrónica del robot. Se ha instalado y configurado apropiadamente
la distribución de Linux Debian en el ordenador de a bordo y se han codificado los paquetes de
software y firmware que controlan al robot. La tabla 11.1 muestra las tareas que se han
realizado en el proyecto, especificando para cada una de ellas sus tiempos estimados y reales
(estos tiempos son aproximados).
Tabla 11.1: Duraciones estimadas y reales de las tareas del proyecto. Nótese que la tarea “documentar” no se ha concluido en
el momento de la redacción de estas conclusiones, por eso se han añadido los signos de interrogación.
En el transcurso del proyecto se han tenido que abordar de forma práctica muchos temas en
los cuales no se tenía experiencia alguna, como por ejemplo en la programación de
microcontroladores PIC de gama alta en C; de hecho, las desviaciones en los tiempos de la
tabla 11.1 se han debido principalmente a este motivo.
No obstante, el sistema obtenido es muy flexible tanto desde el punto de vista del hardware
como del software y, dado el propósito académico del robot, esta flexibilidad es una ventaja
clara sobre los proyectos de robótica similares que se pueden encontrar actualmente en el
mercado. El hardware WHEX 1 posibilita, a través de sus múltiples puertos de expansión, la
posibilidad de añadir hardware nuevo sin modificar el ya existente y el software desarrollado
permite ser modificado libremente por los usuarios.
Otra característica que hace que WHEX 1 sea una plataforma robótica hexápoda diferente
dentro de su categoría es la existencia de procesamiento de a bordo. Durante el estudio del
estado de la cuestión en materia de robótica documentado en este trabajo no se encontró
ningún proyecto de robótica que haya diseñado un hexápodo que presente ordenador de a
bordo. Estos robots en realidad no tienen procesamiento alguno, sino que reproducen
secuencias de movimientos grabadas con anterioridad y enviadas desde un ordenador remoto.
Si bien esta es una ventaja de WHEX 1 sobre otros proyectos, su hardware permite crear una
configuración que carezca de ordenador de a bordo, sustituyéndolo por un cable de
comunicación o un módulo de radiofrecuencia serial que establezca la comunicación con algún
ordenador externo.
El desarrollo del firmware del controlador principal WHEX 1 se comenzó utilizando el lenguaje
ensamblador para PIC18. No obstante, de forma temprana se observó que las desventajas de
este lenguaje eran muy superiores a las ventajas de utilizarlo para codificar un programa
complejo. Por este motivo se decidió, a pesar de la falta de experiencia, utilizar el lenguaje C
para programar este paquete de firmware. Esta decisión impuso el reto de aprender la
tecnología y posibilitó que el desarrollo del firmware concluyera de forma exitosa.
En cuanto a la codificación del software de control hay que mencionar que fue muy ventajoso
utilizar el diseño dirigido por pruebas como técnica principal de diseño. Esto posibilitó aumentar
la agilidad en la codificación y disminuir el número de errores generados. También es preciso
mencionar que la utilización de patrones de diseño en el desarrollo del framework WHEX 1
permitió la creación de un código bastante estándar, escalable y fácil de comprender.
El robot hexápodo desarrollado en este trabajo cumple con los objetivos que se han planteado
en el inicio del proyecto: servir de plataforma académica y funcionar en condiciones óptimas de
laboratorio. No obstante, su desarrollo puede continuar y para esto se recomiendan las
siguientes líneas futuras.
En estos momentos el ciclo de control que implementa WHEX 1 es abierto, pues no existe
retroalimentación de las posiciones reales de las articulaciones. Por este motivo el robot no
puede reaccionar ante fuerzas externas que impidan la adopción de una postura concreta o la
ejecución de un movimiento determinado.
Algunos servomotores más avanzados y sobre todo más caros que los empleados en WHEX 1
permiten conocer la posición real de su eje en tiempo real; pero estos servomotores fueron
descartados desde el comienzo debido principalmente a su elevado precio. Para implementar
esta característica en los servomotores empleados actualmente en el robot se propone la
siguiente modificación: extraer una línea directamente desde el potenciómetro que codifica la
posición del eje del servomotor. Un microcontrolador auxiliar, que se comunique con el
microcontrolador principal WHEX 1 mediante el bus I2C, podría leer los niveles de tensión
provenientes de estos potenciómetros y decodificar las posiciones reales de las articulaciones.
Por otra parte, el algoritmo de locomoción fija que emplea el robot actualmente funciona muy
bien en superficies regulares; pero no funciona adecuadamente en terreno irregular, por tanto
se propone la implementación del algoritmo de locomoción libre descrito en el estado de la
cuestión. Uno de los pasos de este algoritmo es el cálculo de las coordenadas del centro de
gravedad. Para esto es necesario agregar sensores de presión en la punta de las patas.
Otra modificación que puede ser útil en el diseño del algoritmo de locomoción libre es la
incorporación de un sensor gravitacional que le indique al robot el grado de inclinación de la
superficie por la que camina.
Estas y muchas otras actualizaciones de hardware podrían realizarse utilizando los puertos de
expansión hardware de la tarjeta controladora.
En cuanto al futuro desarrollo del software de control, este se deja a los usuarios que podrán
añadir módulos nuevos y modificar los existentes para crear nuevas funcionalidades
personalizadas.