Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Director de tesis:
Dr. Marco Antonio Oliver Salazar
Co-Director de tesis:
Dr. Ral Pinto Elas
1 4
de Agosto de 2009
cenidet
Centro Nacional de Investigacin y Desarrollo Tecnolgico
Departamento de Ingeniera Mecatrnica
Director de tesis:
Dr. Marco Antonio Oliver Salazar
Co-Director de tesis:
Dr. Ral Pinto Elas
Jurado:
Dr. Jos Ruiz Ascencio Presidente
M.C. Andrea Magadn Salazar Secretario
M.C. Jos Martn Gmez Lpez Vocal
1 4
de Agosto de 2009
Agradecimientos
A May, por tu apoyo incondicional, tu paciencia, tu sabidura, tu compresin, por el
ejemplo inmenso que me das, por no dejarme claudicar, por hacer que cada da valga
la pena, y por todas las innumerables enseanzas que me regalas a cada instante, por
esto y por todo aquello que no cabra en miles de millones de palabras de gratitud que
intentaran describir lo enorme e innitamente agradecido que estoy contigo. Gracias por
dejarme caminar a tu lado y aprender de ti.
A mis Padres Daniel Alberto y Alicia, que no obstante la distancia y la situacin
siempre estuvieron ah, siendo los mejores padres del mundo.
Al. Dr. Marco Antonio Oliver Salazar que sigui creyendo en mi, an cuando ya no lo
mereca, gracias por sus consejos, por su tiempo y por darme la oportunidad de trabajar
bajo su tutela.
Al Dr. Ral Pinto Elas por sus consejos y su tiempo, por alentarme y conducirme
a concluir con este reto que en muchas partes estuvo lleno de puntos sin retorno y de
intrpretes indescifrables.
A mi compaero el M.C. Cornelio Morales Morales por su ayuda incondicional y sin
la cual hubiera sido ms difcil la conclusin de este trabajo.
A mis revisores: Dr. Jos Ruiz Ascencio, M.C. Andrea Magadn Salazar y M.C. Jos
Martn Gmez Lpez por sus atinados comentarios para el progreso y nalizacin de este
trabajo.
Al M.C. Donovan Snchez Labastida y al M.I. Jos Baudelio Zamora Lpez quienes
an teniendo obligaciones de carcter profundo siempre su inters en mis objetivos, permiti que pudiera continuar con este proyecto.
Al CENIDET que fue mi casa y parte importante de mi formacin, y a todos aquellos
con los que conviv en este lugar he hicieron mi estancia algo memorable.
Al CONACYT por su puntual apoyo sin el cual no hubiera sido posible este sueo.
Resumen
En el campo de la robtica existen diversas disciplinas las cuales deben ser empleadas
para el desarrollo de una aplicacin completa. Dentro de las herramientas necesarias para
esta labor se encuentran la mecnica, la electrnica, el control y la informtica.
Mediante la interaccin de las herramientas correspondientes es posible lograr el desempeo de tareas de complejidad y exactitud considerable. Sin embargo en el camino del
diseo de aplicaciones robticas existen pasos los cuales pueden convertirse en tropiezos
desastrosos que pueden signicar un retraso considerable.
Mediante un simulador grco es posible prescindir de pruebas que por su naturaleza
pueden ser destructivas, ya que algn mal clculo, puede inuir de forma importante a
un mal desempeo del robot e incluso a destruir partes del mismo, sobre todo en la etapa
que corresponde al control.
Para poder generar una animacin sin necesidad de la interaccin de un controlador
externo en esta aplicacin, fue desarrollado un intrprete el cual es capaz de recibir una
serie de instrucciones de movimiento y ejecutarlas de forma lineal dependiendo del tiempo
que se le asigne a cada movimiento, con la capacidad de ejecutar varios movimientos a la
vez mediante la conjuncin en grupos de movimiento.
Los dos propsitos fundamentales del trabajo de tesis fueron: obtener del control implementado en una plataforma como LabVIEW una animacin que representara lo que
ocurrira en un prototipo fsico equivalente; y mediante la recuperacin de las seales
emitidas por los sensores del prototipo fsico, lograr una simulacin que correspondiera a
lo ocurrido en ste.
El desarrollo consisti en la creacin de una aplicacin con mdulos que fueran capaces de lograr la representacin de un prototipo fsico robtico mediante los parmetros
de Denavit-Hartenberg y a travs de la actualizacin de stos parmetros una animacin
fuera generada, la cual correspondiera a los valores reales obtenidos por la tarjeta de adquisicin de datos.
Mediante la generacin y actualizacin de archivos puente, los cuales pueden ser escritos y ledos por dos aplicaciones de forma simultnea es posible de forma simplicada
la comunicacin entre el controlador del robot y el simulador grco, sin necesidad de
monitorear e intervenir los puertos directamente.
iii
iv
RESUMEN
Abstract
In the robotics eld there are several disciplines that must be used for a complete
application development. The necessary tools for this kind of labor are mechanics, electronics, control, and computer science.
By means of the interaction between the corresponding tools it is possible to achieve the performance of the tasks with remarkable complexity and exactness . However in
the way of the robotic application design there are steps that can turn into a disastrous
stumbling than can represent a remarkable delay.
By means of a graphic simulator it is possible to avoid tests that, for their nature, can
be self destructive, specially in the control test stage, because a mistake in the calculations
can have some inuence in the bad performance of the robot and inclusive destroy parts
of it.
To generate the animation without the necessity of the external controller intervention in this application. A parser was developed. This is able to receive an instruction
set of movement and perform them in a lineal way, depending on the time that has been
assigned for each movement, with the capability of performing several movements at the
same time by means of the setting of movement groups.
The two main proposes of this thesis work were: obtain from implemented control in
a LabVIEW platform an animation who represents what would happened with a robotic equivalent prototype; and by means of the signal recovery emitted by the physical
prototype, achieve a corresponding simulation.
The development consisted in the creation of an application with several modules
that were able to achieve the representation of a robotic prototype by means of the
Denavit-Hartenberg parameters and by the updating of this parameters, so animations
were generated, corresponding to the real values obtained by the data acquisition card.
By means of the generation and updating of the bridge les that can be written and
read by two programs in a simultaneous way, it is possible in a simplied way, the communication between the robot controller and the graphic simulator, without the need of
monitoring and direct reading from the ports.
ndice general
Agradecimientos
Resumen
iii
Abstract
ndice general
vii
ndice de tablas
xi
ndice de guras
xiii
ndice de listados
xv
1. Introduccin
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
articulados
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
5
9
9
11
13
16
16
17
22
24
26
29
31
31
34
NDICE GENERAL
viii
2. Intrprete
3. Simulador Grco
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
35
35
36
37
38
39
40
40
40
42
43
44
44
44
44
49
53
54
54
56
57
60
60
65
65
65
68
71
71
76
77
78
79
80
81
81
81
82
85
. 86
. 86
. 86
NDICE GENERAL
ix
4.4.1. Simulacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.4.2. Interpretacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
4.4.3. Emisin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
91
simulacin . . . . . . . . . . . . . . . . . . .
Pruebas al modo simulacin . . . . . . . . .
Validacin al modo simulacin . . . . . . . .
interpretacin . . . . . . . . . . . . . . . . .
Pruebas y validacin al modo interpretacin
emisin . . . . . . . . . . . . . . . . . . . . .
Pruebas y validacin al modo emisin . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6. Conclusiones y Observaciones
91
91
93
94
94
95
95
99
6.1. Observaciones . . . . . . . . . . . . .
6.2. Conclusiones . . . . . . . . . . . . . .
6.2.1. Acerca del intrprete . . . . .
6.2.2. Acerca del simulador grco .
6.2.3. Acerca del manejo de seales .
6.3. Trabajo futuro . . . . . . . . . . . .
6.3.1. Grcos . . . . . . . . . . . .
6.3.2. Intrprete . . . . . . . . . . .
6.3.3. Driver virtual . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
99
99
100
101
101
102
102
102
103
Bibliografa
105
A. Manual de Usuario
109
A.1. Instalacin . . . . . . . . . . . . .
A.2. Grcos . . . . . . . . . . . . . .
A.2.1. Navegacin . . . . . . . .
A.2.2. Entorno . . . . . . . . . .
A.3. Modos . . . . . . . . . . . . . . .
A.3.1. Simulacin . . . . . . . . .
A.3.2. Interpretacin . . . . . . .
A.3.3. Emisin . . . . . . . . . .
A.4. Scripts . . . . . . . . . . . . . . .
A.4.1. Sintaxis . . . . . . . . . .
A.4.2. Lnea de comandos . . . .
A.4.3. Archivo descriptivo . . . .
A.5. Driver . . . . . . . . . . . . . . .
A.5.1. Archivo puente . . . . . .
A.5.2. SubVI's en el programa de
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
control .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
109
109
110
111
111
111
111
112
112
112
112
113
113
113
113
NDICE GENERAL
B. Cdigo Fuente
B.1. Principal . . . . . . . .
B.2. Clase para los grcos
B.2.1. Gracos.cpp . .
B.2.2. Gracos.h . . .
B.3. Clase para el intrprete
B.3.1. Interprete.cpp .
B.3.2. Interprete.h . .
B.4. Programa en LabView
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
115
115
150
150
157
160
160
172
174
C. Instalacin de Paquetes
177
D. Contacto
181
ndice de tablas
o
.
o
.
o
.
.
. 18
. 19
. 20
. 20
.
.
.
.
.
.
.
.
.
38
45
46
47
47
48
49
50
52
3.1. Tipos de forma, modicadores y parmetros admitidos para la representacin de objetos libres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2. Elementos del tipo de datos defDH . . . . . . . . . . . . . . . . . . . . .
3.3. Elementos del tipo de datos oC . . . . . . . . . . . . . . . . . . . . . . .
3.4. Elementos del tipo de datos parF . . . . . . . . . . . . . . . . . . . . . .
3.5. Elementos del tipo de datos camRot . . . . . . . . . . . . . . . . . . . . .
3.6. Elementos del tipo de datos parAnim . . . . . . . . . . . . . . . . . . . .
3.7. Constantes que denen las vistas . . . . . . . . . . . . . . . . . . . . . .
3.8. Constantes que denen las formas . . . . . . . . . . . . . . . . . . . . . .
3.9. Constantes que denen los ejes . . . . . . . . . . . . . . . . . . . . . . .
3.10. Constantes varias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
55
66
66
67
68
68
69
70
70
70
xi
xii
NDICE DE TABLAS
ndice de guras
1.1.
1.2.
1.3.
1.4.
1.5.
1.6.
1.7.
14
15
23
25
28
30
32
33
2.1.
2.2.
2.3.
2.4.
2.5.
2.6.
2.7.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
3
4
5
11
14
.
.
.
.
.
.
.
.
.
.
.
.
.
.
36
37
38
39
41
42
43
en. .
. .
. .
. .
. .
. .
. .
.
.
.
.
.
.
.
57
58
59
60
61
61
64
xiv
NDICE DE FIGURAS
. 78
.
.
.
.
.
.
.
.
79
79
80
83
83
84
84
87
.
.
.
.
88
89
89
90
ndice de listados
xv
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
39
54
56
60
62
63
63
71
71
72
72
72
73
73
73
74
74
74
75
75
75
75
75
76
92
92
112
xvi
NDICE DE LISTADOS
Captulo
Introduccin
El mundo de la robtica est evolucionando a una velocidad vertiginosa, y el quehacer
en este tema es extenso, sin embargo para su prctica es necesario tener un presupuesto
amplio para poder lograr avances importantes.
Mediante el desarrollo de simuladores, la robtica toma un nuevo aire en cuanto a sus
aspectos prcticos, ya que no es necesario el desarrollo de una plataforma robtica fsica
para poder continuar con el estudio de esta fascinante tarea.
Son muchos los alcances de la robtica, los cuales abarcan desde la automatizacin
de procesos, hasta la medicina con prtesis inteligentes, o herramientas que hacen ms
precisas, ms rpidas o ms fuertes las capacidades humanas.
CAPTULO 1. INTRODUCCIN
Script
to
ien
Intrprete
l
tua
Vir
Parmetros de
movimiento
vim
Mo
Simulador
Movimiento real
C++ Driver
Driver
LabView
LabView Driver
Posicin de
los encoders
HMI
Controlador
Etapa de potencia
y acondicionamiento
de seales
Mano
Prototipo Robtico
Figura 1.1: Diagrama de bloques del sistema
El simulador grco debe ser capaz de enviar instrucciones a LabView para su ejecucin
en el prototipo robtico de modo que LabView con el controlador que tenga implementado recupere esa informacin, la procese y ejecute, de modo que el simulador grco
la represente en su entorno. Para lo descrito anteriormente se plantean 3 esquemas de
operacin:
Script
3
im
v
Mo
Simulador
to
ien
Intrprete
l
tua
Vir
Movimiento real
Parmetros de
movimiento
C++ Driver
Driver
LabView
LabView Driver
Posicin de
los encoders
1
HMI
Controlador
Etapa de potencia
y acondicionamiento
de seales
Mano
Prototipo Robtico
CAPTULO 1. INTRODUCCIN
se extrae la informacin contenida en las instrucciones para alimentar al simulador grco(3) y generar la animacin.
Script
2
3
im
v
Mo
Simulador
t
ien
Intrprete
al
irtu
oV
Movimiento real
Parmetros de
movimiento
C++ Driver
Driver
LabView
LabView Driver
Posicin de
los encoders
HMI
Controlador
Etapa de potencia
y acondicionamiento
de seales
Mano
Prototipo Robtico
im
v
Mo
Simulador
to
ien
Intrprete
l
tua
Vir
Parmetros de
movimiento
Movimiento real
C++ Driver
Driver
LabView
LabView Driver
Posicin de
los encoders
4
HMI
Controlador
Etapa de potencia
y acondicionamiento
de seales
Mano
Prototipo Robtico
CAPTULO 1. INTRODUCCIN
Familiarizacin con interfaces grcas y con las libreras que ayuden al desarrollo
de una interfaz, para as crear una herramienta propia.
Estudio y anlisis de los modelos matemticos existentes para su eleccin en la
implementacin del simulador grco, de modo que ayuden a estructurar la inclusin
de conguraciones robticas.
La seleccin de una o varias plataformas de software en donde se pueda generar una
aplicacin robusta y estable.
Generacin de una variedad de modos de operacin que satisfagan las necesidades
de simulacin tanto en tiempo real como fuera de lnea.
El diseo, la estructuracin y la generacin de scripts que ejecuta el prototipo fsico
mediante la interpretacin de las seales elctricas generadas para su funcionamiento, generando el entorno original en el que fue concebido (LabView).
Documentacin del software desarrollado para su uso en aplicaciones similares mediante modicaciones al cdigo principal.
Se busc que esta interfaz despliegue algunos de los movimientos que efecta una mano
robtica basados en modelos previamente desarrollados [3], [14], [5]. Esto dar al usuario
una mejor comprensin de los movimientos reales de un efector mecnico que reproduce
algunos movimientos de una mano robtica.
Para el desarrollo del proyecto es importante que dos puntos queden claros para el
desarrollo de la interfaz a nivel del acondicionamiento de las seales fsicas, estos son:
Entender la informacin codicada proporcionada por los encoders (, ) y cmo
sta es reconocida en la PC.
Entender cmo las seales son procesadas por los FPGA's que accionan motores del
prototipo fsico.
Al haber sido contemplados estos aspectos, el proyecto se enfoc principalmente en
tres partes fundamentales las cuales estarn ligadas entre s, y se ejecutan de manera
secuencial.
1. La creacin de un simulador grco mediante libreras especializadas [10], [7], [26], [6]
que reproduzca los movimientos de una mano robtica donde se observa grcamente
una animacin en la PC de estos movimientos en tiempo real, teniendo como sistema
de referencia los modelos cinemtico y dinmico de la mano robtica anteriormente
analizados y desarrollados en una tesis previa [3]. Los datos que se utilizarn a partir
de la cinemtica directa son:
Las posiciones angulares (i (t)) de cada falange
A partir de las posiciones angulares i (t), se generar un archivo descriptivo (Script ).
2. El script contendr la informacin de la evolucin del movimiento, a partir de alguna
rutina previamente programada. Con esto se lograr obtener una representacin del
movimiento en forma virtual, que posteriormente se sincronizar para obtener una
versin en tiempo real del movimiento del prototipo.
3. Dada una secuencia de movimiento, los scripts interactuarn con los FPGAs de
un tarjeta de adquisicin de datos comercial [9] para generar las seales fsicas que
permitirn el movimiento del prototipo.
Este proyecto comprendi el desarrollo de una herramienta de simulacin para la validacin de modelos, programacin de trayectorias y validacin de algoritmos de control.
Esto ser de gran utilidad ya que ayudar a prevenir movimientos no deseados que pueden
ir desde trayectorias prohibidas hasta comportamientos destructivos del prototipo.
Buscando continuar con el conocimiento que se ha venido adquiriendo en el CENIDET
en torno al diseo de actuadores electromecnicos [3]. Este trabajo busca desarrollar una
herramienta grca que reproduzca algunos de los movimientos reales de un sistema mecnico cualquiera mediante su representacin matemtica, para la validacin completa de
los sistemas diseados, tomando como caso de estudio la mano CENIDET.
El sistema que se desarroll ser una herramienta de simulacin de sistemas robticos
articulados, en la cual se pueden observar distintas circunstancias fsicas en los lmites
de operacin, lo que evitar rutinas que daen el dispositivo, que en ocasiones por errores en los clculos se pasan por alto. El simulador grco muestra de manera virtual el
comportamiento de cada parte del prototipo robtico y entregar informacin precisa del
comportamiento de los actuadores.
Como resultado de este trabajo de tesis se obtuvo un simulador capaz de reproducir
los movimientos de una mano robtica, movimientos que podrn ser creados mediante la
obtencin de seales generadas por el prototipo robtico o bien de forma virtual mediante
comandos que produzcan el movimiento sin tener el dispositivo fsico habilitado.
El intrprete tiene la capacidad de generar animaciones para la conguracin que sea
indicada modicando el cdigo fuente de forma muy breve, y como caso de estudio ser
la mano robtica la conguracin vigente.
CAPTULO 1. INTRODUCCIN
de datos que permitir la interaccin entre el dispositivo fsico y el simulador, leyendo las
instrucciones que se escriban en el puerto que lo controle.
10
CAPTULO 1. INTRODUCCIN
diversos.
En la Universidad de Florida fue desarrollada una interfaz grca para la operacin
robtica a distancia en ambientes peligrosos [27] para poder supervisar en un cuarto de
control remoto las operaciones realizadas en la manipulacin de desechos nucleares y materiales con naturaleza peligrosa para el ser humano. Se cre todo un mundo virtual el cual
pudiera representar el entorno contaminado para as hacer las manipulaciones pertinentes.
En la Universidad de Nuevo Mxico en cooperacin de los Laboratorios Nacionales
Sanda se desarroll un sistema [2] para remover los residuos dentro de los tanques situados bajo tierra, esto mediante recursos robticos donde el mediador entre el software de
control y el hardware fue una interfaz grca que genera un mundo virtual que representa
el entorno real en donde los robots harn su labor.
Dentro de los aspectos simulables en una interfaz grca estn los sensores, en la Universidad de Tennessee en Knoxville, Estados Unidos, se desarroll una interfaz grca
[1] capaz de simular sensores de cinco tipos diferentes: proximidad, rango de punto lser,
rango ultrasnico, rango lser de profundidad por imagen y bordes basados en intensidad
de imagen. Mediante los modelos matemticos de los sensores es como fue posible que se
simulara su comportamiento en un entorno virtual.
En tpicos de operacin remota otro ejemplo mencionable es del una distancia considerable entre el operador y el robot a operar. El Jet Propulsion Laboratory de la NASA
desarroll un sistema grco para la operacin de robots situados en el espacio [15] en
el que cada objeto mvil puede ser manipulado mediante una interfaz grca y se puede
obtener una representacin virtual de lo sucedido sin necesidad de tener que recuperar un
video real.
Otro mundo en el que el acceso es muy limitado es aquel en que las cosas son muy
pequeas. En el Instituto Federal Suizo de Tecnologa en Zurich se desarroll una interfaz
grca [28] mediante equipo muy preciso (resolucin en nanmetros) de 6 grados de libertad y un microscopio capaz de recuperar imgenes en video en ambos modos de video
mono y estreo.
En el campo de la industria de la manufactura se encuentran aplicaciones importantes
para las interfaces robticas y su auxilio mediante interfaces grcas. En la Universidad
de Birmingham en el Reino Unido se dise una interfaz grca [23], la cual al recibir una
pieza descrita en CAD es capaz de desplegarla grcamente as como analizarla y generar
el diseo para su construccin.
Mediante la obtencin de imgenes cada vez han sido desarrolladas aplicaciones ms
complejas. En la Universidad Tcnica de Munich en Alemania y en cooperacin con dos
Universidades en los Estados Unidos, fue desarrollada una interfaz robtica[17] para la
manipulacin de un robot PUMA la cual se basa en la obtencin de imgenes del brazo real del operador, lo que representara una especie de ratn espacial (gura 1.5) en
11
12
CAPTULO 1. INTRODUCCIN
13
reproduccin de la misma y puede ser utilizado para entrenar otra ms que se desee.
Diversos tipos de argumentos y utilidades se han dado a la propuesta de la creacin de
un simulador grco de robots, pero una de las ms recurridas es la de poder contar con
una herramienta para la enseanza de la robtica. Esto lo propone [25],dado que equipo
de laboratorio es muy costoso y requiere de mantenimiento y personal de apoyo que supervise su operacin. Mediante conceptos claves como: denicin de las cadenas enlazadas,
uniones y espacios cartesianos, transformacin de matrices homogneas, transformacin
de cinemtica directa e inversa y la programacin de robots mediante la denicin de secuencias de movimiento es como se plantea la solucin del diseo de dicha interfaz grca.
Un software diseado con funciones las cuales sean capaces de: interpretar una denicin
del robot mediante sus parmetros cinemticos; el movimiento del robot en cada unin
o espacio cartesiano; un despliegue grco de la posicin del robot acompaado de despliegues numricos de dicha posicin, orientacin y desplazamiento de cada unin; y la
creacin y edicin de programas para el robot y su ejecucin por lotes, incluyendo el
clculo de la duracin del movimiento.
Utilizando el mismo argumento de un laboratorio de robtica [11], en la Escuela de
Ingeniera ESA IGELEC en Francia,se proponen algunas prcticas que se pueden implementar con conguraciones muy recurridas en brazos robticas como son el SCARA, pero
utilizando plataformas de simulacin comerciales.
En la Universidad de Alberta en Canad, se abord el tema de la animacin tridimensional creando para esto un simulador para la representacin virtual de robots manipuladores [21] donde se propone que las trayectorias de los robots son denidas por archivo
de trayectoria pre-calculada o puntos y orientaciones especicadas por el usuario. Este
simulador cuenta con dos mtodos para la generacin de trayectorias. El primer mtodo
simplemente implica el escoger el archivo de trayectoria en tiempo de ejecucin del simulador. Este archivo consiste en una lista de valores secuenciales para cada unin que
el manipulador seguir. El otro mtodo es mediante el clculo de la cinemtica inversa
ingresando el punto al que se quiera llegar y as generar la trayectoria, y en el caso de
mltiples trayectorias ser escogida la ms corta de ellas.
La Universidad de Stanford en California, Estados Unidos [18] desarroll una herramienta ms completa donde se crea un ambiente virtual y varios controladores y celdas
de trabajo son probadas. Este simulador lo dividen en dos partes: la primera es donde
objetos locales calculan sus propias ecuaciones dinmicas de movimiento y en la segunda
un coordinador global resuelve interactivamente las fuerzas entre objetos.
14
CAPTULO 1. INTRODUCCIN
tengan semejanza con la de una mano, la cuales han ido desde tenazas, manos con tres,
cuatro y hasta cinco dedos.
En el Instituto de Ciencia y Tecnologa de Nara en Japn se desarroll un sistema el
cual estima los movimientos de una mano y los representa en un entorno virtual [29], mediante un algoritmo que compara las posiciones de la mano a las de un modelo esqueltico,
donde se logra la representacin de los movimientos de una mano humana capturando dichos movimientos por 4 cmaras (gura 1.6), el cual es interpretado y representado en el
entorno virtual del sistema (gura 1.7).
Figura 1.6: Experimento montado para el reconocimiento del movimiento de una mano
Figura 1.7: Interfaz para la representacin de los movimientos capturados de una mano
mediante cmaras digitales
La tarea ms recurrida en la investigacin y el desarrollo de aplicaciones para la simulacin virtual de robots con una morfologa similar a la de una mano es el agarre.
Mediante diversas tcnicas varias universidades hay tratado de resolver este problema, y
los simuladores grcos han tenido un papel importante en el desarrollo de la solucin.
15
El Royal Institute of Technology en Estocolmo, Suecia, en cooperacin con la Universidad de Columbia en Nueva York, Estados Unidos desarrollaron un planicador para
hacer sujeciones en tiempo real. Se integra de un sistema visual de bsqueda [16] en el
cual se busca encontrar la posicin de un objeto a ser sujetado, planicar los movimientos
de sujecin y las trayectorias que deben seguirse y visualizar en un monitor la ejecucin
de la tarea realizada. En este sistema se parte de tener objetos representados en CAD 2 y
as poder hacer el clculo de las trayectorias de los movimientos que se deben hacer para
el sujetado de forma adecuada.
Las instituciones mencionadas en Suecia y Estados Unidos en cooperacin con la Universidad de Karlsruhe en Alemania, disearon un planicador automtico de agarre [22]
basados en caractersticas de forma, en donde utilizando el simulador que disearon aos
atrs y mediante la transformacin de los objetos reales a formas geomtricas tridimensionales bsicas (cilindros, cubos, esferas y prismas) se implemento una recreacin del
entorno. Como se puede observar en la gura 1.8 se obtiene un modelo de una forma
real, modelo del cual se obtiene el patrn a seguir para el agarre adecuado, para algunas
conguraciones de robots manipuladores que se han descrito previamente.
2 Del
16
CAPTULO 1. INTRODUCCIN
17
OpenGL
Las libreras de OpenGL [10], [7], [26] facilitan el manejo de grcos en un entorno de
programacin de C++, poniendo a un lado los problemas en el manejo de estructuras,
18
CAPTULO 1. INTRODUCCIN
Tabla 1.1: Comparacin entre los diferentes generadores de parsers de fuente libre o cdigo
abierto (parte 1 de 3)
Producto
Algoritmo
Lenguajes de Salida
Plataforma
Desarrollo
APG
CLR
C++
Win32
si
ACCENT
GLR
ANSI C
no
ANTLR
LL(k)
Java
si
Beaver
LALR
Java
Java
no
Bison
LALR,
GLR
C, C++
GNU/Linux,
Unix, Win32
no
BYACC
LALR
Unix, Win32
no
BYACC/J
LALR
C, Java
no
Coco/R
LL(k)
no
CppCC
LL(k)
C++
Unix
no
CSTools
LALR
C#
.NET
no
CUP
LALR
Java
Java
no
Elkhound
GLR
C++, Ocaml
Unix, Win32
no
Essence
LR
Scheme
Scheme 48
no
LALR
x86 Assembly,
ANSI C, C#,
D, Delphi, Java,
Pascal, Python,
Visual
Basic
6, Visual Basic
.NET,
Visual
C++
GOLD
Win32
de
IDE
si
Licencia
Fuente Libre
Fuente
Abierta
(GPL)
Fuente
Abierta
(BSD)
Fuente
Abierta
(BSD)
Fuente
Abierta(GPL)
Dominio
pblico
Dominio
pblico
Fuente
abierta
(GPL)
Fuente
aRbierta
(GPL)
Fuente
abierta
Fuente
abierta
(GPL)
Fuente
abierta
(BSD)
Fuente
abierta
Fuente
abierta
(zlib/libpng)
19
Tabla 1.2: Comparacin entre los diferentes generadores de parsers de fuente libre o cdigo
abierto (parte 2 de 3)
Producto
Algoritmo
Grammatica LL(k)
Lenguajes de Salida
Plataforma
Desarrollo
de
C#, Java
Java
no
IDE
Happy
LALR,
GLR
Haskell
Unix, Win32
no
jacc
LALR
Java
Java
no
JavaCC
LL(k)
Java
Java
si
jay
LALR
BSD
yacc redirigido a
C# and Java
C or Java
no
JetPAG
LL(k)
C++
C++
no
LEMON
LALR
Unix
no
More Than
Parsing
LL(1)
Java,
JavaCC
(parser
and
scanner)
Java
no
Parser Objects
LL(k)
Java
Java
no
PRECC
LL(k)
Dos, Unix
no
Rats!
Packrat
Java
Java
no
SableCC
LALR
Java y varios
SmaCC
LALR(1)/
LR(1)
Smalltalk
Todas
si
Spirit
LL(k)
C++
no
no
Licencia
Fuente
abierta
(LGPL)
Software
Libre
(GPL)
Fuente
abierta
(BSD)
Fuente
abierta
(BSD)
Fuente
abierta
(BSD)
Fuente
abierta
(GPL)
Dominio
pblico
Fuente
abierta
(GPL)
Fuente
abierta
(ZLib/LibPNG)
?
Fuente
abierta
(LGPL)
Fuente
abierta
(LGPL)
Fuente
abierta
(MIT)
Fuente
abierta
(Boost)
20
CAPTULO 1. INTRODUCCIN
Tabla 1.3: Comparacin entre los diferentes generadores de parsers de fuente libre o cdigo
abierto (parte 3 de 3)
Producto
Algoritmo
Lenguajes de Salida
Plataforma
Desarrollo
de
Yacc
(AT&T)
LALR
C (disponible en
otros lenguajes)
Unix
no
YooParse
LR
C++
no
LISA
LR,
LL,
LALR,
SLR
Java
Todas
si
IDE
Licencia
Fuente
abierta
(various)
Fuente
abierta
(MIT)
Dominio
pblico
Algoritmo
Lenguajes de Salida
Plataforma
Desarrollo
GLR
Parlanse
LALR
IDE
Licencia
Win32
no
Propietario
ANSI C, C++
C++,
Cualquiera (si es
re-escrito
el
esqueleto)
C, C++, C#,
Java
Win32
si
Propietario
Win32
si
Propietario
Win32, Linux
no
Propietario
LL(k)
C++
Win32
si
Propietario
LR(1)
C#, .NET
si
Propietario
LALR
C++,
C++,
C#, Java
.NET
Framework 2.0
Win32
si
Propietario
LRgen
LALR
SLK
LL(k)
Text
Transformer
Visual
BNF
Visual
Parse++
de
21
LabView
National Instruments desarroll una aplicacin en donde por medio de iconos con determinadas propiedades y sus interconexiones se representaran programas para automatizar
o hacer pruebas de distintos tipos. Esta aplicacin [8] originalmente fue desarrollada para
interconectar los equipo que National Instruments desarrollaba, y esta es una de sus limitantes, que si bien puede ser resuelta mediante la interconexin con equipos compatibles
con protocolos de comunicacin especcos, siempre se depende de un trabajo minucioso
para hacer un correcto mapeo3 de las seales involucradas [9].
En un trabajo de tesis anterior [3] fue elegida esta herramienta tanto de software como
de hardware para el prototipo fsico, es por esto que debe emplearse nuevamente para
poder trasferir aquellas seales generadas a los parmetros de las funciones del intrprete
y poder representar aquellos movimientos en la aplicacin desarrollada en C++ con la
ayuda de las libreras de OpenGL.
Robtica
El principal objetivo que busca esta aplicacin es el de la creacin de una herramienta
que represente sistemas robticos articulados, es por esto que no podra en ningn momento dejarse de lado la robtica.
En lo que a la robtica concierne a los sistemas articulados, existe una representacin
de parmetros en los cuales se describe por completo un sistema de este tipo, y esta es
la representacin de Denavit-Hartenberg [5], [14]. Mediante los parmetros de esta representacin no slo se puede describir la forma que el robot tiene, sino que con la variacin
de los parmetros es posible obtener la descripcin del movimiento de dicho robot. Es
por esto que la herramienta matemtica de la representacin de Denavit-Hartenberg es
de utilidad fundamental en el desarrollo de la aplicacin.
3 El
mapeo es una relacin de etiquetas asignadas a distintas direcciones que alojan variables del
sistema, que representan alguna variable fsica sensada, o bien una seal que activa un actuador
22
CAPTULO 1. INTRODUCCIN
la parte inferior de la interfaz se encuentran separadas un serie de casillas que presentan diversa
informacin del estado del sistema.
Archivo
Descriptivo
(Script)
e. Alarmas
d. Eventos del
prototipo
fsico
c. Modificaciones
de grficos
realizadas desde
la interfaz grfica
Scritpt de
Movimiento
Intrprete
h. Seales
de los
Sensores
i. Seales
elctricas
a los
servomotores
Prototipo
Fsico
(Mano)
Entrada de Hardware
Compilador de Instrucciones
Scritpt de
Simulador
Movimiento
Grfico
Interfaz
C++ / Labview
f. Parmetros para
funciones de OpenGL
g. Parmetros para
generar instruccin
de movimiento
b. Instrucciones de movimiento
a. Funciones a realizar
en tiempo real
Comando
en Lnea
24
CAPTULO 1. INTRODUCCIN
1.4.1. Intrprete
El intrprete es el bloque central, que se encarga de procesar la informacin para asegurar que cada bloque reciba informacin que pueda ser entendida y ejecute las rutinas
procedentes.
La descripcin esquemtica del intrprete se puede visualizar en la gura 1.10, en
donde se especica de forma puntual cada bloque interno5 , indicando su funcin, su interconexin, y el ujo de informacin que debe trasmitir.
c. Compilador de movimientos
Bloque que recibe el script seleccionado o bien la funcin de la lnea de comando y
tiene la funcin de generar los parmetros para generar la animacin.
5 Para
simplicar y hacer referencia ms rpida se expondrn los bloques de arriba hacia abajo y de
izquierda a derecha.
Comando
en lnea
Archivo
descriptivo
(Script)
Comando
en lnea
(LabView - Simulador)
Selector de
origen del
control de
movimiento
Decodificador
de seales
de LabView
Restricciones
y errores de
sintaxis
Generador
de informacin
para los
grficos
Generador
de
alarmas
Parmetros
para generar
los grficos
Alarmas
Compilador
de
movimientos
Generador
de mensajes
en la interfaz
Script electo
Script de movimiento
Intrprete
Simulador
grfico
Simulador
grfico
Comando
en lnea
Interfaz
C++/LabView
26
CAPTULO 1. INTRODUCCIN
d. Generador de alarmas
A partir de los datos de la animacin es posible calcular antes de que ocurra si se
producir alguna violacin a una restriccin en el caso de ingresar un script, o bien en
el caso de estarse ejecutando directamente una rutina en el prototipo fsico, mediante
LabView, se generar una alarma instantnea que advertir de este evento. Las alarmas
generadas, son enviadas para su despliegue en el el entorno del mdulo del comando en
lnea y harn referencia especca de las violaciones encontradas.
a. Control de ambientacin
Conguracin de parmetros de ambientacin, tales como: iluminacin, opacidad, colores de fondo, donde se denen colores por defecto, estos parmetros podrn ser modicables en tiempo de ejecucin mediante un men especial.
b. Parametrizacin Denavit-Hartenberg
Mediante una breve modicacin en el cdigo fuente, es posible cambiar las formas
a simular de la cadena cinemtica indicando los parmetros de Denavit-Hartenberg en
funciones que adems son capaces de albergar varias cadenas independientes a simular en
el mismo entorno.
27
c. Obtencin de parmetros
Obtencin de todos los parmetros admisibles para la simulacin, (la animacin que
se genera a partir de los parmetros) se ejecutar mediante un botn en la interfaz grca (en el modo de ejecucin de script ). Este bloque entrega el conjunto completo de los
parmetros para las funciones de gracacin.
d. Funciones de gracacin
Bloque que contiene las funciones encargadas de la gracacin, que reciben el conjunto de parmetros y se distribuyen en cada una de las funciones para representar forma y
movimiento. Su salida es directamente el conjunto de grcos a representar.
e. Pantalla
Bloque que representa la salida grca en un dispositivo convencional bajo las directivas que genera OpenGL para el despliegue de grcos.
Intrprete
Obtencin de
parmetros
Conjunto de
parmetros para
las funciones de
graficacin
Grficos
Pantalla
Funcin automtica
Controles de
entorno
virtual y de
archivos
Funciones
de graficacin
Configuracin de la ambientacin
Control de
ambientacin
Parmetros de movimiento
Simulador
Grfico
28
CAPTULO 1. INTRODUCCIN
29
b. Driver
Bloque que recibe las instrucciones relativas para el movimiento del dispositivo fsico,
y ajusta dependiendo de una calibracin previa, cuyo resultado son los parmetros que
contiene este bloque para la adaptacin y generacin de las seales correspondientes para
el movimiento. Su salida hacia el intrprete entrega un mensaje de movimiento (relativo
a la simulacin) realizado. En general es un archivo descriptivo con escalamientos de movimiento correspondientes al dispositivo que se est controlando.
c. Seales de control
Bloque que recibe las seales sensadas, as mismo recibe las instrucciones de movimiento para su realizacin y enva aviso del movimiento detectado. En esta etapa se est
implementando la aplicacin obteniendo la lectura de los puertos en los que escribe LabView.
Intrprete
Mensaje de
movimiento
relitivo
generado y
sendado
Driver
Mensaje de movimiento
absoluto generado y
sensado
Eleccin entre
Interfaz/LabView
Seales sensadas
Seales de
control a los
servomotores
Seales
de
control
Selector de
flujo de
control
Parmetros para
la generacin
del movimiento
Interfaz
C++ / Labview
Mano
30
CAPTULO 1. INTRODUCCIN
31
a. Acondicionamiento de seal
Hardware que adapta las seales de control generadas por la interfaz mediante LabView, para el adecuado funcionamiento del prototipo fsico, en donde se encuentre una
correspondencia plena a la simulacin grca generada por el simulador.
b. Mano
Dispositivo fsico. Conguracin robtica que reproduce en su funcionalidad a una
mano humana. Prototipo fsico realizado en el CENIDET [3]. Dispositivo de salida que
puede ser reemplazado por cualquier otro que observe una conguracin robtica diferente mediante la representacin de Denavit-Hartenberg y programando un controlador
adecuado a esta conguracin.
b. Lnea de comando
Campo para ingresar los comandos en lnea situado en la interfaz, el cual valida y exhibe en un listado de instrucciones ejecutadas toda aquella actividad observada en dicho
elemento del simulador.
Interfaz
C++/LabView
Seal sensada
Acondicionamiento
de
Seal
Sensores
Seales para
accionar los
servomotores
Prototipo
Fsico
(Mano)
Hardware
Mano
32
CAPTULO 1. INTRODUCCIN
Instruccin
Lnea de
comando
Scritpt de
Representacin
de la instruccin
Movimiento
Intrprete
Estmulo de entrada
Instrucciones
del teclado
Comando
en Lnea
34
CAPTULO 1. INTRODUCCIN
Captulo
Intrprete
Para dar una versatilidad completa al desarrollo del simulador, es diseado un mdulo
el cual es capaz de transformar lneas de cdigo que tienen un carcter intuitivo, para
operar los distintos niveles de funcionalidad de la herramienta.
Para la herramienta hecha en este trabajo de tesis fue necesario la implementacin de
un intrprete el cual descifre lneas de cdigo que indiquen descripciones de los movimientos de las conguraciones robticas que puedan ejecutar a lo largo de una lnea de tiempo.
Es necesario entonces describir en un script todas aquellas caractersticas particulares
del sistema (que el caso especco de estudio en esta tesis, es el de la mano CENIDET)
a representar, como aquellas que puedan enriquecer el entorno virtual; Todo esto ser
contenido en un script descriptivo general que tiene la capacidad de ser modicado en
tiempo de ejecucin1 .
1 Es
35
36
CAPTULO 2. INTRPRETE
5
3
6
4
1
2
palabra_reservada(dedo,falange,angulo,tiempo,grupo)
Figura 2.1: Representacin general de la sintxis
1.Palabra reservada
Es la palabra que precede a la instruccin e indica la accin a realizar, en el caso de la
aplicacin slo genera el movimiento y la nica palabra reservada que el sistema reconoce
es mov. Esta no es propiamente un parmetro pero es requerida para la ejecucin de
la instruccin. Se asign la palabra para futuras ampliaciones de la aplicacin en donde
podr haber otras instrucciones que formen parte del sistema.
2.Dedo
Parmetro que indica el dedo que ha de accionarse y puede ser accedido mediante su
nombre en minsculas sin acentos en caso de tenerlos o bien mediante un nmero entero
[1..,4] que lo identica y que puede ser ms prctico en algunos casos.
3.Falange
Parmetro que indica la falange que ha de accionarse del dedo seleccionado en el
parmetro anterior. Puede ser accedido mediante su nombre en minsculas sin acentos en
caso de tenerlos o bien mediante un nmero entero [1..,4] que la identica y que puede
ser ms prctico en algunos casos.
4.ngulo
Parmetro que indica el ngulo que ha de alcanzarse por la falange del dedo indicado en los parmetros anteriores y estar descrito en grados [ N ], contemplando que
dependiendo de restricciones denidas puede ser un ngulo invlido al superarse dichas
restricciones.
37
5.Tiempo
Parmetro que indica el tiempo en segundos [ E] que demorar la falange del dedo
indicado en alcanzar el ngulo descrito en parmetros anteriores desde su posicin actual,
y se puede utilizar para clculos de velocidad.
6.Grupo
Parmetro que indica el grupo de movimiento en el cual se encuentra la instruccin, lo
que permite ejecutar varios movimientos a la vez, sin embargo slo es posible comenzar el
siguiente grupo de movimiento hasta que termina el actual. Por ejemplo, al poner en tres
instrucciones el grupo de movimiento 1 con diferentes tiempos, el mayor de estos tiempos
habilitar el comienzo de los movimientos que se encuentran en el grupo nmero 2. El
grupo es denido por el usuario, pero ste debe ser consecutivo y comenzar con el nmero
1.
Palabra Reservada
mov(pulgar,distal,23.12,2.5,1)
Parmetros
Figura 2.2: Representacin general de la sintxis
Existen caracteres especiales que le dan estructura a la sintaxis, los cuales son los
separadores, y los delimitadores estos no tienen ninguna accin en la ejecucin de la instruccin, nicamente indican el principio de un parmetro y el siguiente, as como el
comienzo de la lista de parmetros y el n de una instruccin. Se emplean usualmente
smbolos como parntesis y comas, como se muestra en la gura 2.3
38
CAPTULO 2. INTRPRETE
Tabla 2.1: Parmetros admisibles en una instruccin para generar movimiento con la
palabra reservada mov
Campo
1
Asignacin
Dedo
Falange
3
4
5
ngulo en
Grados
Tiempo en
Segundos
Grupo
Parmetros
pulgar 1
indice 2
medio 3
anular 4
proximal 1
media 2
distal 3
abduccin 4
Tipo de dato
Texto o entero
Formato
TTT o I
Texto o entero
TTT o I
ngulo
Flotante
SFF.FFF
Nmero
Flotante
FF.FFF
Nmero
Flotante
Delimitadores
mov(pulgar,distal,23.12,2.5,1)
Separadores
Figura 2.3: Ubicacin de separadores y delimitadores
En la instruccin que se dise para ser interpretada o compilada, de forma general
se presentara una estructura como la mostrada en la gura 2.4 la misma que se puede
interpretar como una orden de movimiento de 23.12 grados en un tiempo de 2.5 segundos
de la falange distal del dedo pulgar correspondiente al primer grupo de movimiento.
Movimiento
39
Falange
Tiempo
mov(pulgar,distal,23.12,2.5,1)
Dedo
ngulo
Grupo de Movimiento
40
CAPTULO 2. INTRPRETE
senta el movimiento del robot y de escribir en las rutinas que generan el movimiento en
tiempo de ejecucin, lo que constituye un ahorro de tiempo considerable, al no tener que
programar un cdigo especco para lograr una rutina de movimiento.
Mediante este compilador se dene un cdigo simplicado el cual cumple una tarea
especca y entrega al simulador los parmetros para una representacin grca animada
que puede ser determinante en el estudio de diversos controladores.
2.3. Aplicacin
Dentro del programa existe una parte dedicada al intrprete y sta es la encargada,
sobre todo en el modo de simulacin, de lo concerniente a la interpretacin de los parmetros que se ingresan para ser representados de forma instantnea.
La funcionalidad del intrprete dentro de la aplicacin se divide en 4 partes y estas
son:
1. Lnea de comando
2.3. APLICACIN
41
2. Histrico
3. Barra de mensajes
4. Men de archivo
Inicio
Lee palabra
reservada
hasta (
( ?
NO
Error de
Sintaxis
FIN
Error de
Parmetro
FIN
Error de
Sintaxis
FIN
NO
Error de
Parmetro
FIN
NO
Error de
Sintaxis
FIN
Error de
Parmetro
FIN
SI
Validar
Palabra
NO
SI
Busca
parmetro
hasta ,
NO
, ?
SI
Validar
Parmetro
SI
Busca
parmetro
hasta ,
)?
SI
Validar
Parmetro
NO
SI
Asignacin
de valores a
arreglo de
datos
FIN
Figura 2.5: Diagrama de ujo del algoritmo para compilar una lnea
En las subdivisiones de esta seccin se exponen los aspectos particulares de lo que
compone esta parte de la aplicacin, desde lo general que es la parte visible de la interfaz,
hasta las particularidades que son cmo se compone la clase de C++ que le da funcionalidad a la aplicacin, los parmetros que son generados para la creacin de la animacin
42
CAPTULO 2. INTRPRETE
Inicio
Compilacin
de lnea i
Error?
NO
Agregar
Informacin
en Arreglo
NO
i++
Fin de
Archivo?
SI
Mensaje de
Error +
nmero de
lnea
Reset de
Arreglo de
Datos
Fin
SI
Fin
2.3.1. Interfaz
La interfaz grca de forma genrica es la aplicacin completa, y dentro de esta se
encuentra una gran parte de la funcionalidad del desarrollo. En la gura 2.7 se observa la
ventana de la aplicacin y se indican las 4 partes que componen el marco de las entradas
y salidas del intrprete.
El entorno presentado representa la ventana inicial del sistema y donde por defecto se
encuentra listo para ejecutar movimientos en modo de simulacin.
Lnea de comando
La lnea de comando es una caja de texto la cual recibe instrucciones individuales
que deben de respetar la sintaxis descrita con anterioridad. Despus de haber agregado el
comando, ste es analizado y ejecutado al ingresarlo presionando la tecla enter.
Histrico
En esta parte de la interfaz se van registrando todos los comandos ingresados, tanto
los provenientes de la lnea de comando como de un archivo.
2.3. APLICACIN
43
Men Archivo
Histrico
de Funciones
y Mensajes
Lnea de Comando
Barra de mensajes
Barra de mensajes
Esta herramienta es compartida con las funciones de despliegue grco. En esta herramienta aparecern los mensajes de estado concernientes a los archivos descriptivos,
stos mensajes consisten en indicar la ubicacin del archivo abierto para su compilacin
y ejecucin, tambin indica cuntos errores sucedieron.
Men archivo
Este men cuenta con dos opciones que son las de Abrir Script y Cerrar. La funcin
de abrir script abre un cuadro de dialogo donde permite buscar un archivo descriptivo con
la extensin *.rmc la cual ha sido enmascarada para facilitar el encontrar los archivos de
este tipo.
Al abrir un archivo, ste es compilado y en caso de no encontrar errores, las instrucciones son almacenadas en un arreglo de datos, y el programa slo esperar mediante la
opcin animacin, del men ejecutar la secuencia.
44
CAPTULO 2. INTRPRETE
DatosLinea
Este tipo de datos contiene 6 elementos cuyos tipos son variables enteras y de punto
otante los cuales estn descritos en la tabla 2.4 y donde se describe lo que representa el
dato que se ingresa.
2.4.2. Constantes
Para evitar la utilizacin de nmeros mgicos se denen constantes las cuales se
utilizan a lo largo del programa de forma recurrente.
45
Histrico
Histrico
Mensaje
El archivo aaa.bbb no
pudo ser abierto
El archivo aaa.bbb ha
sido abierto
Error:Comando o sintaxis invlida en lnea
##
Histrico
Histrico
Error:Nombre de dedo
invlido en lnea ##
Histrico
Histrico
Error:Valor de ngulo
invlido en lnea ##
Histrico
Error:Valor de tiempo
invlido en lnea ##
Histrico
Error:Valor de grupo
invlido en lnea ##
Histrico
Barra de msgs
Errores
##
Histrico
Compilacin Exitosa
Histrico
Advertencia: Modo de
interpretacin activado, no es posible cargar Script
encontrados:
Causa
Archivo corrupto o actualmente abierto
Correcta apertura de archivo
Error en palabra reservada o error al no
encontrar alguno de los delimitadores al
compilar archivo
El parmetro utilizado en el campo para dedo no corresponde a ninguno de
ellos al compilar archivo
El parmetro utilizado en el campo para falange no corresponde a ninguna de
ellas al compilar archivo
El valor utilizado para el parmetro ngulo no tiene el formato de un nmero
de punto otante al compilar archivo
El valor numrico utilizado para el parmetro tiempo no tiene el formato de
un nmero punto otante al compilar
archivo
El valor numrico utilizado para el grupo de movimiento no tiene el formato
de un nmero entero al compilar archivo
El valor propuesto para ese dedo y falange en particular sobrepasan los lmites de movimiento al compilar archivo
En caso de que en la compilacin existan errores se indica el nmero de estos
al compilar archivo
La compilacin del archivo se realiz de
forma satisfactoria y los valores de la
secuencia estn almacenados en el arreglo
Se intent cargar un script con el modo
de interpretacin presente por lo que no
se almacenar dato alguno
46
CAPTULO 2. INTRPRETE
Mensaje
Error:Comando o sintaxis invlida
Histrico
Histrico
Error:Nombre de dedo
invlido
Histrico
Histrico
Error:Valor de ngulo
invlido
Histrico
Error:Valor de tiempo
invlido
Histrico
Error:Valor de grupo
invlido
Histrico
Histrico
Barra de msgs
Barra de msgs
Dispositivo en Lnea
Histrico
Histrico
Posicin Asignada
Causa
Error en palabra reservada o error al no
encontrar alguno de los delimitadores
El parmetro utilizado en el campo para dedo no corresponde a ninguno de
ellos
El parmetro utilizado en el campo para falange no corresponde a ninguna de
ellas
El valor utilizado para el parmetro ngulo no tiene el formato de un nmero
de punto otante
El valor numrico utilizado para el parmetro tiempo no tiene el formato de
un nmero punto otante
El valor numrico utilizado para el grupo de movimiento no tiene el formato
de un nmero entero
El valor propuesto para ese dedo y falange en particular sobre pasan los lmites de movimiento
Se intento ejecutar un movimiento al
estar el modo de interpretacin activado por lo que este no ser cargado
Archivo de puente no inicializado o no
existente
Archivo de puente inicializado correctamente
El ngulo asignado no puede ser alcanzado por el prototipo fsico
La posicin deseada fue asignada y se
ejecutar por el prototipo fsico.
47
Tipo
palabra
int
dedo
falange
angulo
tiempo
int
int
oat
oat
grupo
int
Descripcin
Recibe el identicador de la palabra reservada
Recibe el identicador del dedo
Recibe el identicador de la falange
Recibe el valor en grados del ngulo
Recibe el valor en segundos del tiempo
Recibe el identicador del grupo de movimiento
Las constantes se han dividido en grupos representativos como lo son aquellas que
describen: dedos, falanges, lmites y varios.
Dedos
Las constantes que representan los dedos permiten la denicin del sistema segn las
conveniencias en cuanto a la estructura y el orden en el que se representan dentro de la
animacin, de modo que no es necesario respetar un orden consecutivo segn la morfologa
del robot, y en caso de que la denicin no corresponda inicialmente, es posible ajustar
las constantes para que la correspondencia sea exacta.
Aunque el dedo meique no es representado tanto en el prototipo fsico como en la
conguracin grca del mismo, es posible aadirse en el futuro. De forma simblica se
agrega para tener el esquema completo de lo que sera una mano humana. En la tabla 2.5
se muestran los dedos denidos y las constantes asignadas para la correcta distribucin
de los dedos asignados.
Nombre de la Constante
pulgar
indice
medio
anular
menique
Constante
4
3
2
1
5
48
CAPTULO 2. INTRPRETE
Falanges
De mismo modo que en los dedos las falanges cuentan con una constante que las dene
y stas estn descritas en la tabla 2.6.
Aunque en s no es una falange, el movimiento de abduccin se incluye como tal, por
su naturaleza de movimiento.
Tabla 2.6: Constantes que denen las falanges
Falange
Proximal
Medial
Distal
Abduccin
Nombre de la Constante
proximal
media
distal
abduccion
Constante
1
3
4
2
El orden consecutivo de las falanges no slo depende de su representacin de DenavitHartenberg, sino de la forma en que el generador de los objetos representa dichas falanges.
Lmites
Para asegurar la integridad del prototipo fsico, y poner una limitante de movimiento
previamente denida y no congurable en tiempo de ejecucin se denieron los ngulos
mximos y mnimos que las falanges en general pueden tener. Son tiles en el diagnstico
y la generacin de mensajes de error. Fueron agrupados por falanges debido a que todos
los dedos tienen la misma conguracin de movimiento.
Las constantes pueden ser modicadas segn la naturaleza del prototipo fsico o bien
si se quiere observar el comportamiento sin restricciones que el prototipo podra tener.
Las constantes se muestran en la tabla 2.7.
Varios
Las constantes que no se encuentran en ningn grupo genrico se enuncian en esta
parte, en donde slo restan dos por mencionar.
Es necesaria una constante que indique que un error fue cometido como salida a una
una funcin. Esta constante se deni con el nombre de: error y su constante asignada
es el valor numrico menos uno (-1).
Se detectaron errores persistentes al denir de forma dinmica el tamao del arreglo
del tipo de datos denido como DatosLinea por lo que se opt por asignar una constante
al nmero mximo de datos que un script puede adquirir, esto mediante la palabra: nDatos
49
Falange
Proximal
Medial
Distal
Abduccin
Proximal
Medial
Distal
Abduccin
Nombre de la Constante
MaxProximal
MaxMedia
MaxDistal
MaxAbduccion
MinProximal
MinMedia
MinDistal
MinAbduccion
Constante
90
90
90
25
0
0
0
-25
la cual tiene un valor asignado de cien (100), siendo ste el mximo nmero de lneas que
puede tener un archivo descriptivo. En caso de ingresar un script con ms datos es posible
modicar esta constante en tiempo de diseo para ampliar las posibilidades del intrprete.
2.4.3. Funciones
En la clase intrprete son necesarias funciones pblicas que ejecuten tareas repetitivas
especcas, y algunas que auxilien a funciones de mayor complejidad, a calcular o encontrar informacin relevante para la ejecucin de las mismas.
Para uso interno en la clase se declara una variable privada de tipo DatosLinea.
En la tabla 2.8 se describen de forma genrica las funciones que denen la clase
Interprete en donde se indica el tipo de datos de entrada y de salida, y la descripcin de funcin en forma sintetizada. Posteriormente se denir a detalle cada una.
Interprete
La funcin Interprete en s solo sirve para inicializar la variable privada salida al
declarar la instancia de clase aprovechando las caractersticas de polimorsmo del C++.
Por lo tanto al denir una instancia de clase del tipo intrprete se inicializan los elementos
de la misma. No recibe ni entrega ningn parmetro.
mov
Esta funcin es la ms relevante en el intrprete ya que recibe la cadena para ser
analizada.
Recibe una cadena de caracteres y entrega un tipo de datos DatosLinea con la informacin que extrajo de la lnea de cdigo. Esta funcin sirve especcamente para analizar
50
CAPTULO 2. INTRPRETE
Tabla 2.8: Descripcin general de las funciones que integran la clase Interprete.
Nombre de
la funcin
Interprete
mov
Entradas
Salida
Descripcin
Ninguna
Cadena de caracteres con la
instruccin
Ninguna
Instancia de Inicializazcn
Datos de la instruccin
maxgM
Arreglo de enteros
Mximo de GM
iniDatos
Arreglo de Dedos,
Arreglo
de
Falanges,
Arreglo ngulos, Arreglo de
Tiempos, Arreglo de Grupos
de Movimiento
Ninguno
pos
Cadena de Caracteres
Posicin Final
puente
Elemento,
gulo
Lnea de Datos
n-
Funcin del Driver que asigna los valores de las posiciones nales en cada
intervalo de actualizacin
Genera la lnea de datos a partir del
elemento y el ngulo ledo del archivo puente generado por el programa de
control en LabView
51
maxgM
Esta funcin mediante comparaciones sucesivas busca el nmero mximo de grupo de
movimiento, al recibir un arreglo de nmeros enteros provenientes normalmente del arreglo general donde se almacenan los datos extrados de las lneas descriptivas de los scripts.
Regresa un nmero entero correspondiente al nmero mximo del grupo de movimiento.
iniDatos
Mediante un ciclo se inicializan todos los parmetros del arreglo de datos que contienen la informacin de las instrucciones de movimiento con la funcin iniDatos, indicando
en la funcin principal la instancia de clase utilizada como parmetro de entrada.
pos
Esta funcin simplemente toma una cadena de nmeros y regresa su valor en punto
otante.
puente
Para la generacin de un archivo puente o driver completo en donde estn actualizadas
todas las variables que componen la mano, la funcin puente escribe en una variable de
tipo DatosLinea la informacin correspondiente a cada elemento, ingresando como dato
de entrada el nmero de elemento correspondiente, segn el orden que lleva el archivo
puente, el cual se muestra en la tabla 2.9.
En el programa principal se lleva a cabo la funcin de la escritura del archivo puente
y se emplea esta funcin para generarlo.
52
CAPTULO 2. INTRPRETE
Dedo
Pulgar
Pulgar
Pulgar
Pulgar
ndice
ndice
ndice
ndice
Medio
Medio
Medio
Medio
Anular
Anular
Anular
Anular
Falange
Proximal
Medial
Distal
Abduccin
Proximal
Medial
Distal
Abduccin
Proximal
Medial
Distal
Abduccin
Proximal
Medial
Distal
Abduccin
Captulo
Simulador Grco
La funcionalidad de la aplicacin se ve representada por la capacidad que tiene de
desplegar grcamente los eventos que en la realidad ocurren o podran ocurrir (simulacin), es en esta seccin donde el simulador grco cobra importancia en el conjunto de
mdulos que integran el proyecto. Por s mismo el simulador grco constituye la parte
que da nombre al trabajo, es aqu donde se simula el movimiento de la mano mediante herramientas para el despliegue de grcos, con libreras de OpenGL1 las cuales son
ampliamente descritas por diversos autores [7], [26], [6].
La parte del simulador grco es siempre visible en la aplicacin y la animacin que
represente depender del modo en el que est activado.
En este captulo se abordan los temas concernientes a las herramientas empleadas para
la generacin de los objetos y las animaciones de stos; as como de aquellas herramientas
que agregan un toque de realismo al entorno visual, como lo es la iluminacin y la eleccin
de los colores para el fondo y el piso. Por ltimo se habla de la navegacin en el entorno
virtual, permitiendo al usuario visualizar la animacin desde cualquier punto de vista.
En la segunda seccin del captulo se explica brevemente cmo es que mediante los
parmetros de Denavit-Hartenberg es posible representar cualquier conguracin robtica
y cmo en el programa se logra dicha representacin, de modo que abre la aplicacin para
representar cualquier conguracin robtica de tipo angular.
Por ltimo en la tercera seccin se exponen las funciones creadas describiendo su funcionalidad y el papel que desempean para la generacin de los grcos.
1 OpenGL
es una serie de libreras desarrolladas por la compaa SUN Microsystems las cuales se basan
en la generacin de formas por medio de vectores
53
54
Coordenadas Espaciales
Las coordenadas espaciales estn compuestas de su origen espacial (x,y,z) y su rotacin
espacial en ese punto denido de origen (rx,ry,rz) en radianes.
Esfera
El parmetro que describe una esfera es nicamente su radio, por lo que la combinacin
de ste y sus coordenadas espaciales en la descripcin de la funcin da como resultado
una esfera.
2 El
identicador de objeto siempre debe ser cero para todos los objetos para poder ser representados
a la vez.
55
Tipo de Figura
Parmetros
Esfera
Cilindro
Caja
Cono
Pirmide
Radio
Radio, alto
Arista, alto
Radio, alto
Arista, alto
Radio interior, radio
exterior
Radio interior, radio
exterior, ngulo inicial, porcin del disco
en ngulo
Disco
Semidisco
Cilindro
Para la descripcin de un cilindro es necesario asignarle el radio de su base y la altura
que este ha de tener; precedido de sus coordenadas espaciales. Es importante considerar
que el cilindro no cuenta con tapas tanto en su base como la parte superior, y de as
desearse deber complementarse la funcin en trabajos posteriores.
Caja
Una caja en esencia se logra al describir un cilindro con cuatro lados utilizando las
funciones de quadrics de OpenGL, y en la funcin resumida es necesario slo describir el
tamao del lado y la altura de la caja; adems precedido de sus coordenadas espaciales.
Al igual que el cilindro la caja no cuenta con tapas y se observan las mismas consideraciones de ampliacin en futuras versiones.
Cono
Para la representacin de un cono al igual que el cilindro es necesario asignarle el
radio de su base y la altura que este ha de tener; precedido sus coordenadas espaciales,
recordando la particularidad de las tapas.
56
Pirmide
La pirmide es la analoga directa de lo que una caja es al cilindro, slo que en este
nicamente se cuenta con tres lados, as bien debe asignarse el lado y la altura, adems
de sus coordenadas espaciales
Disco
Una gura un tanto ms compleja es el disco, el cual es ms bien parecido a una
donael cual requiere de dos parmetros, su radio interior y exterior ms sus coordenadas
espaciales
Semi-Disco
La gura que ms parmetros requiere es el semi-disco ya que a diferencia del disco
este es representado por una seccin del mismo, por lo que es necesario describir el radio
interior, exterior, el ngulo inicial en grados en el cual el disco inicia y por ltimo la
porcin de disco en grados, precedido de sus coordenadas espaciales.
Ejemplo
En el listado 3.2 se describe el cdigo para respresentar cada una de las guras disponibles, y en la gura 3.1 se despliega lo que en la interfaz se representara. La caja en
este caso es la palma de la mano.
Listado 3.2: Cdigo de representacin de guras
fig
fig
fig
fig
fig
fig
. Objeto ( 0 , Caja , 5 , 2 0 , 3 0 , 4 5 , 0 , 0 , 4 0 , 1 0 ) ;
. Objeto ( 0 , C i l i n d r o , 5 0 , 1 0 0 , 5 0 , 0 , 0 , 0 , 1 0 , 3 0 ) ;
. Objeto ( 0 , Cono , 5 0 , 5 0 , 5 0 , 0 , 0 , 0 , 1 0 , 1 0 ) ;
. Objeto ( 0 , E s f e r a , 5 0 , 0 , 5 0 , 0 , 0 , 0 , 1 0 ) ;
. Objeto ( 0 , Disco , 5 0 , 5 0 , 5 0 , 0 , 0 , 0 , 1 0 , 1 5 ) ;
. Objeto ( 0 , S e m i d i s c o , 5 0 , 1 0 0 , 5 0 , 0 , 0 , 0 , 1 0 , 1 5 , 1 , 2 7 0 ) ;
3.1.2. Ambientacin
Como una herramienta adicional se incluy la posibilidad de asignar color a dos parmetros que ofrecen contraste para visualizar de forma ms adecuada la ejecucin de la
aplicacin. Estos parmetros son: La iluminacin y el color de fondo.
Mediante una paleta de colores es posible asignar el color que el usuario desee en
tiempo de ejecucin.
57
Figura 3.1: Representacin grca del cdigo representado en el listado 3.2 en el entorno
de la mano
Iluminacin
El color asignado a la iluminacin cubrir a todos los objetos del entorno de forma
proporcional a la naturaleza del objeto iluminado. En la gura 3.2 se muestra cmo se
representa el espacio iluminado de color rojo.
58
Traslacin
La traslacin modica las coordenadas desde las cuales se ubica el observador y dependiendo de esto mediante el arrastre del ratn se conseguirn nuevas coordenadas. En
la gura 3.4 se muestra el entorno virtual con un desplazamiento del observador.
Rotacin
La rotacin modica el ngulo en el cual se ubica el observador, y de la misma forma
que la traslacin, mediante el arrastre del ratn se consigue modicar el mismo; la gura
3.5 ilustra cmo se representa el objeto rotado. Es importante mencionar que al rotarse el
observador y querer ver desde la parte inferior, lo que se consigue es ver la parte inferior
del plano que enmarca a la mano.
Zoom
La funcin de acercamiento y alejamiento o como comnmente se nombran a estos dos
cambios de orientacin del observador zoom hace posible observar desde un punto ms
lejano o cercano el objeto que se est representando, en este caso la mano, en la gura 3.6
se puede observar como se representa el acercamiento a la mano en el entorno virtual.
59
Vistas
Varias vistas predenidas son incluidas para facilitar la representacin de las mismas en
caso de que se tenga una necesidad particular, las vistas ms frecuentemente utilizadas por
la informacin que se obtiene y por ser las ms recurridas en el dibujo son las siguientes:
1. Vista frontal
2. Vista posterior
3. Vista lateral derecha
4. Vista lateral izquierda
5. Vista superior
6. Vista inferior
7. Vista isomtrica
8. Vista dimtrica
9. Vista trimtica
60
existen algunos parmetros ms referentes a la geometra del eslabn, sin embargo y para
acotar el trabajo los eslabones estarn siempre denidos por cilindros los cuales en sus extremos tendrn
una esfera para dar continuidad visual.
61
62
. DHo( 1 , 0 , 0 , 0 ) ;
.DH( 1 , 0 , 0
.DH( 1 , 1 , 0
.DH( 1 , 2 , 30
.DH( 1 , 3 , 22
.DH( 1 , 4 , 22
,
,
,
,
,
90
90
90
0
0
,
,
,
,
,
0
0
0
0
0
,
,
,
,
,
90);
0);
0);
0);
0);
. DHo( 2 , 0 , 2 0 , 0 ) ;
.DH( 2 , 0 , 0
,
.DH( 2 , 1 , 0
,
.DH( 2 , 2 , 30 ,
.DH( 2 , 3 , 22 ,
.DH( 2 , 4 , 22 ,
90
90
90
0
0
,
,
,
,
,
0
0
0
0
0
,
,
,
,
,
90);
0);
0);
0);
0);
90
90
90
0
0
,
,
,
,
,
0
0
0
0
0
,
,
,
,
,
90);
0);
0);
0);
0);
// Medio
fig
fig
fig
fig
fig
fig
// I n d i c e
fig
fig
fig
fig
fig
fig
. DHo( 3 , 0 , 4 0 , 0 ) ;
.DH( 3 , 0 , 0
,
.DH( 3 , 1 , 0
,
.DH( 3 , 2 , 30 ,
.DH( 3 , 3 , 22 ,
.DH( 3 , 4 , 22 ,
// Pu lg ar
f i g . DHo( 4 , 0 , 4 0 , 4 0 ) ;
.DH( 4 , 0 ,
.DH( 4 , 1 ,
.DH( 4 , 2 ,
.DH( 4 , 3 ,
.DH( 4 , 4 ,
0
0
30
22
22
,
,
,
,
,
0
90
90
0
0
,
,
,
,
,
0
0
0
0
0
,
,
,
,
,
63
90);
0);
0);
0);
0);
// Palma
f i g . Objeto ( 0 , Caja , 5 , 2 0 , 3 0 , 4 5 , 0 , 0 , 4 0 , 1 0 ) ;
Listado 3.5: Cdigo que dene las tapas de la palma
/ Tapas de l a Palma /
g l B e g i n (GL_QUADS) ;
g l V e r t e x 3 i ( 8 , 2 ,5);
glVertex3i (48 , 2 ,5);
glVertex3i (48 , 58 ,5);
g l V e r t e x 3 i ( 8 , 58 ,5);
glEnd ( ) ;
g l B e g i n (GL_QUADS) ;
g l V e r t e x 3 i ( 8 , 2 , 5);
g l V e r t e x 3 i (48 , 2 , 5);
g l V e r t e x 3 i (48 , 58 , 5);
g l V e r t e x 3 i ( 8 , 58 , 5);
glEnd ( ) ;
}
Cualquier conguracin es posible mediante la representacin con los parmetros de
Denavit-Hartenverg, en la gura 3.7 se muestra una mano sin pulgar; con diferentes longitudes en los dedos se ejemplican las posibilidades del simulador grco, en el listado
3.6 se muestra la conguracin de la mano mostrada anteriormente.
Listado 3.6: Conguracin de la mano sin pulgar
// Meique
fig
fig
fig
fig
fig
fig
. DHo( 1 , 0 , 0 , 0 ) ;
.DH( 1 , 0 , 0
.DH( 1 , 1 , 0
.DH( 1 , 2 , 30
.DH( 1 , 3 , 30
.DH( 1 , 4 , 30
,
,
,
,
,
90
90
90
0
0
,
,
,
,
,
0
0
0
0
0
,
,
,
,
,
90);
0);
0);
0);
0);
64
// Anular
fig
fig
fig
fig
fig
fig
. DHo( 2 , 0 , 1 3 , 0 ) ;
.DH( 2 , 0 , 0
,
.DH( 2 , 1 , 0
,
.DH( 2 , 2 , 30 ,
.DH( 2 , 3 , 22 ,
.DH( 2 , 4 , 22 ,
90
90
90
0
0
,
,
,
,
,
0
0
0
0
0
,
,
,
,
,
90);
0);
0);
0);
0);
90
90
90
0
0
,
,
,
,
,
0
0
0
0
0
,
,
,
,
,
90);
0);
0);
0);
0);
90
90
90
0
0
,
,
,
,
,
0
0
0
0
0
,
,
,
,
,
90);
0);
0);
0);
0);
// Medio
fig
fig
fig
fig
fig
fig
. DHo( 3 , 0 , 2 7 , 0 ) ;
.DH( 3 , 0 , 0
,
.DH( 3 , 1 , 0
,
.DH( 3 , 2 , 30 ,
.DH( 3 , 3 , 22 ,
.DH( 3 , 4 , 22 ,
// I n d i c e
fig
fig
fig
fig
fig
fig
. DHo( 4 , 0 , 4 0 , 0 ) ;
.DH( 4 , 0 , 0
,
.DH( 4 , 1 , 0
,
.DH( 4 , 2 , 30 ,
.DH( 4 , 3 , 30 ,
.DH( 4 , 4 , 30 ,
// Palma
65
f i g . Objeto ( 0 , Caja , 5 , 2 0 , 3 0 , 4 5 , 0 , 0 , 4 0 , 1 0 )
defDH
Lo que signica de forma abreviada el tipo de datos defDH es denicin DenavitHartenberg. Este tipo de datos puede albergar los parmetros de Denavit-Hartenberg,
adems de dos parmetros que identican el nmero de cadena independiente que representan y el nmero de eslabn que ocupa dentro de la cadena. Los parmetros que
4 Un tiempo adecuado para obtener una animacin uida podra ser aquel que en un segundo desplegara
al menos hasta 24 actualizaciones por segundo que son las que usualmente se utilizan en el cine y la
televisin las cuales el cerebro humano ya no puede separar en imgenes individuales.
66
Tipo de Nombre
elemento elemento
Entero
Entero
Flotante
Flotante
Flotante
Flotante
del
nC
nV
a
alfa
d
teta
Descripcin
Nmero de cadena cinemtica
Nmero de vnculo o eslabn
Parmetro de Denavit-Hartenberg
Parmetro de Denavit-Hartenberg
Parmetro de Denavit-Hartenberg
Parmetro de Denavit-Hartenberg
distancia a
ngulo
distancia d
ngulo
Tipo de Nombre
elemento elemento
Flotante
Flotante
Flotante
x
y
z
del
Descripcin
Coordenada del origen de la cadena en el eje x
Coordenada del origen de la cadena en el eje y
Coordenada del origen de la cadena en el eje z
identican al eslabn dentro de una cadena son de tipo entero, mientras que todos los
elementos que describen los parmetros de Denavit-Hartenberg son de tipo otante.
La forma en la que estn representados los parmetros de Denavit-Hartenberg y los
identicadores en el tipo de datos se enlistan en la tabla 3.2.
oC
Para cada cadena es necesario denir el origen espacial que esta tendr, para ser representada dentro de la forma precisa. El tipo de datos oC representa el origen de la Cadena
y esta recibe dichas coordenadas espaciales. En la tabla 3.3 se enlistan los elementos que
recibe el tipo de dato.
parF
En la representacin de las formas se utilizan funciones de OpenGL para conseguirlo,
estas a su vez deben recibir ciertos parmetros para generar la forma, y es precisamente
lo que el tipo de datos parF busca; obtener los parmetros de Forma y asignarlos a las
funciones y mtodos que las generan.
Dependiendo de la forma a representar son los parmetros que se emplean, siendo de
67
Tipo de Nombre
elemento elemento
Entero
id
Entero
Tipo
Flotante
Flotante
Flotante
Flotante
Flotante
Flotante
Flotante
Flotante
Flotante
Flotante
x
y
z
Rx
Ry
Rz
par1
par2
par3
par4
del
Descripcin
Identicador de la forma
Tipo de la forma, puede ser, caja, esfera, cilindro,
cono, pirmide, disco y semi-disco.
Coordenada del origen de la cadena en el eje x
Coordenada del origen de la cadena en el eje y
Coordenada del origen de la cadena en el eje z
ngulo del vector de la cadena en el eje x
ngulo del vector de la cadena en el eje y
ngulo del vector de la cadena en el eje z
Parmetro de forma 1
Parmetro de forma 2
Parmetro de forma 3
Parmetro de forma 4
camRot
Para tratar de manera independiente el origen y el ngulo de los objetos representados
con el del punto de vista del observador fue diseado el tipo de datos camRot que hace
referencia a la cmara y su Rotacin aunque en realidad no es slo su rotacin lo que
importa, sino tambin el ngulo que ste tiene.
Para denir este tipo de datos es necesario al igual en que en la denicin de los
parmetros de forma, asignar las coordenadas espaciales de su origen y su direccin y
por tratarse de un punto en el que se sita el observador este vector debe estar completo
contando con una magnitud, la cual la expresar un parmetro denominado zoom.
Para vistas que estn previamente denidas habr un elemento que contendr la instruccin que hace referencia a aquella vista en particular, otorgando un valor en especial
para la libre navegacin en el espacio virtual. En la tabla 3.5 se enlistan los elementos
empleados.
68
Tipo de Nombre
elemento elemento
Entero
Flotante
Flotante
Flotante
Flotante
Flotante
Flotante
x
y
z
Rx
Ry
Rz
Flotante
Zoom
del
Descripcin
Identicador de la una vista predenida o de navegacin libre
Coordenada del observador en el eje x
Coordenada del observador en el eje y
Coordenada del observador en el eje z
ngulo del vector del observador en el eje x
ngulo del vector del observador en el eje y
ngulo del vector del observador en el eje z
Magnitud del vector del observador que asigna las
propiedades alejamiento y acercamiento
parAnim
El ltimo tipo de datos denido en la clase Graficos es referente a los parmetros
para generar la Animacin los cuales se limitan a poder almacenar el ngulo de movimiento actual y el intervalo de tiempo en el cual se ha de efectuar el movimiento. En la
tabla 3.6 se hace descripcin de ellos.
Tipo de Nombre
elemento elemento
Flotante
mA
Flotante
del
Descripcin
ngulo del eslabn que se esta moviendo actualmente
Intervalo de tiempo en el cual se efecta el movimiento
3.3.2. Constantes
La denicin de constantes es necesaria en la aplicacin para identicar determinados valores que representan directamente algn argumento para alguna funcin. Para no
recurrir a nmeros sin aparente signicado, se asignaron tanto a las vistas, las formas,
los ejes y a algunos valores para clculos aritmticos y de control de ujo constantes las
cuales se describen en cuatro grupos que de forma general han sido mencionados.
69
Vistas
Son nueve las vistas predenidas que se pueden elegir, para esto fueron asignadas
constantes a cada una, en donde la rutina encargada de posicionar al observador tiene las
coordenadas en donde se logran dichas vistas. Para que la navegacin en el entorno virtual
sea libre, se asign una constante a esta condicin, para que el punto del observador no
est ligado a la posicin asignada por una vista predenida. En la tabla 3.7 se muestra
las constantes asignadas con su valor y nombre.
Valor
0
1
2
3
4
5
6
7
8
100
Formas
Para la asignacin de los parmetros, para la generacin de las formas se tuvieron en
cuenta todas aquellas que se pueden denir en tiempo de diseo mediante la funciones
denidas previamente.
Estas formas se enlistan en la tabla 3.8 con su nombre y valor.
Ejes
Para la denicin de los ejes y ser asignados para la navegacin en el entorno virtual,
se denieron las constantes que hicieran referencia a stos. En la tabla 3.9 se enlistan estas
constantes.
70
Valor
1
2
3
4
5
6
7
Nombre de la constante
EjeX
EjeY
EjeZ
Valor
1
2
3
Varias
Se denieron constantes que ayudarn a la realizacin de clculos aritmticos y que
adquirieran funcionalidad para el control del ujo del programa. Estas se enuncian en la
tabla 3.10 y se les describe brevemente.
la
Valor
Descripcin
71
// D e f i n i c i o n e s DH de l o s e l e m e n t o s
// Origen de l a s Cadenas
// O b j e t o s G e n e r a l e s
//Nmero de e l e m e n t o a c t u a l g e n e r a l
// Parmetros de l a cmara v i r t u a l
Graficos
Como en toda clase, se declara el constructor de la clase para inicializar todas las declaraciones privadas, tanto los arreglos como las variables independientes que sirven como
ndices o indicadores para algunas funciones de la clase.
Los arreglos son inicializados en su totalidad mediante un ciclo que asigna a cada
elemento de cada arreglo su valor inicial para evitar algn comportamiento errneo.
DHo
Este mtodo permite ingresar las coordenadas de origen de una cadena cinemtica
denida. Mediante el ingreso de cada una de las coordenadas espaciales y el identicador
de la cadena, el mtodo no regresa ningn argumento y slo carga al arreglo interno de la
clase las coordenadas en el tipo de datos que almacena las coordenadas de origen llamado
origen cuyos elementos son los ejes x, y y z . su sintaxis se observa en el listado 3.8.
Listado 3.8: Sintaxis del mtodo DHo de la clase Graficos
DHo( i n t nC , f l o a t x , f l o a t y , f l o a t z )
72
GetO
La funcin GetO regresa el origen de una cadena cinemtica, lo que es til para realizar algunos clculos, adems al ser la informacin propiedad de la clase no es posible
accederla ni modicarla de otro modo, lo que le da integridad a la informacin.
En el listado 3.9 se muestra la sintaxis de la funcin, la cual regresa en un tipo de
datos oC la informacin de las coordenadas de origen.
Listado 3.9: Sintaxis de la funcin GetO de la clase Graficos
oC GetO ( i n t nC)
DH
En la funcin DH es posible ingresar los parmetros de Denavit-Hartenberg con sus
identicadores de nmero de cadena y nmero de eslabn regresando el nmero (entero)
de elemento que este representa en el conjunto de los elementos denidos. Su sintaxis se
muestra en el listado 3.10.
Listado 3.10: Sintaxis de la funcin DH de la clase Graficos
DH( i n t nC , i n t nV , f l o a t a , f l o a t a l f a , f l o a t d , f l o a t t e t a )
Cadena
La funcin Cadena se encarga de convertir los parmetros de Denavit-Hartenberg en
parmetros que aceptan las funciones de OpenGL para generar los grcos que en este
caso van a ser representados por cilindros.
Esta funcin recibe el nmero de elemento global y regresa los parmetros para desplegar una gura en el tipo de datos parF.
En el listado 3.11 se muestra la sintaxis de la funcin.
Listado 3.11: Sintaxis de la funcin Cadena de la clase Graficos
Cadena ( i n t nE)
Objeto
Este tipo de datos aprovecha la capacidad que tiene C++ de poder declarar una misma
funcin en mltiples ocasiones para los casos en que la funcin acepte varios argumentos,
esto es conocido como polimorsmo.
73
Lo que recibe de argumentos la funcin Objeto son todos aquellos parmetros que
requiere una forma para ser representada, parmetros tales como: identicador, tipo de
forma, coordenadas espaciales, y los parmetros que lo denen como radio, altura, lado,
etctera; dichos parmetros estn descritos en la seccin 3.3.1 referente a los tipos de datos en su apartado del tipo parF. El mtodo se encarga de que se desplieguen los objetos
indicados.
Las sintaxis del mtodo se enuncian en el listado 3.12.
Listado 3.12: Diversas sintaxis del mtodo Objeto de la clase Graficos
Objeto ( id
Objeto ( id
Objeto ( id
Objeto ( id
, tipo
, tipo
, tipo
, tipo
,
,
,
,
x,
x,
x,
x,
y , z , rx
y , z , rx ,
y , z , rx ,
y , z , rx ,
, ry
ry ,
ry ,
ry ,
, rz
rz ,
rz ,
rz ,
, par1 )
par1 , par2 )
par1 , par2 , par3 )
par1 , par2 , par3 , par4 )
GraficarObjeto
Esta funcin regresa los parmetros para la gracacin completa de un objeto extrayendo la informacin ingresada al arreglo de objetos, recibe nicamente el nmero de
elemento identicador. En el listado 3.13 se muestra su sintaxis.
Listado 3.13: Sintaxis de la funcin GraficarObjeto de la clase Graficos
G r a f i c a r O b j e t o ( i n t nE)
MovimientoAlfa
El mtodo MovimientoAlfa se encarga de escribir en los parmetros de DenavitHartenberg, variables que representan a los robots para actualizar los ngulos de las
cadenas cinemticas, como argumentos reciben los identicadoras de nmero de cadena y
nmero de eslabn, el nuevo ngulo i , el tiempo en el que la actualizacin del movimiento
se va a llevar a cabo y el grupo de movimiento en el cual se va realizar el mismo.
En el listado 3.14 se muestra la sintaxis del mtodo.
Listado 3.14: Sintaxis del mtodo MovimientoAlfa de la clase Graficos
MovimientoAlfa ( i n t nC , i n t nV , f l o a t a l f a , f l o a t tiempo , i n t gM)
MovimientoTeta
Este mtodo realiza prcticamente lo mismo que el mtodo MovimientoAlfa con la
particularidad que el ngulo a actualizar en este caso es i . La sintaxis se encuentra en el
74
listado 3.15.
Listado 3.15: Sintaxis del mtodo MovimientoTeta de la clase Graficos
MovimientoTeta ( i n t nC , i n t nV , f l o a t t e t a , f l o a t tiempo , i n t gM)
MovimientoObjeto
Los objetos independientes tambin tienen la capacidad de moverse, esto mediante la
actualizacin de algunos parmetros particulares como lo son: su ngulo, eje en el cual se
ejecuta el movimiento de dicho ngulo y el tiempo en el cual se ha de ejecutar el movimiento. En el listado 3.16 se representa la sintaxis para emplear esta mtodo.
Listado 3.16: Sintaxis del mtodo MovimientoObjeto de la clase Graficos
MovimientoObjeto ( i n t id , f l o a t angulo , i n t e j e , i n t tiempo )
Camara
Nuevamente aqu se utilizan las funciones de polimorsmo. La funcin Camara puede
recibir tres conguraciones de argumentos y dependiendo de estos ser el parmetro que
regrese.
En el caso de que reciba un entero que representa una vista predeterminada la funcin
asignar el parmetro a la variable correspondiente y regresar el mismo entero. Si recibe
las coordenadas espaciales (variables de tipo otante todas ellas) del observador la funcin regresar los parmetros asignados en un tipo de datos camRot adems de haber sido
asignados a la variable privada de la clase. Y en el caso de no recibir ningn argumento,
la funcin regresar lo que la variable privada contenga en ese momento. El listado 3.17
indica las tres posibles sintaxis.
Listado 3.17: Sintaxis de la funcin Camara de la clase Graficos
Camara ( i n t v i s t a )
Camara ( Rx , Ry , Rz , x ,
Camara ( )
y,
z , Zoom)
nVC
La funcin nVC regresa el nmero de vnculos o eslabones de una cadena, lo que es
til para calcular el nmero de elementos totales, recibe como argumento el nmero de
cadena y regresa el nmero de vnculos. En el listado 3.18 se muestra la sintaxis de la
funcin muy utilizada internamente en la clase.
75
nCa
Esta funcin regresa el nmero (entero) total de cadenas que fueron denidas. No recibe argumento alguno. La sintaxis se puede observar en el listado 3.19.
Listado 3.19: Sintaxis de la funcin nCa de la clase Graficos
nCa ( )
nElemento
Para recuperar el nmero de elemento correspondiente a una cadena y un eslabn o
vnculo se dise esta funcin la cual recibe estos dos parmetros y regresa el identicador (entero) que representa el nmero de elemento. La sintaxis se observa en el listado 3.20.
Listado 3.20: Sintaxis de la funcin nElemento de la clase Graficos
nElemento ( i n t nC , i n t nV)
nElementosCadenas
Esta funcin regresa el nmero (entero) total de elementos que describen a todas las
cadenas denidas. No lleva argumentos. La sintaxis se muestra en el listado 3.21.
Listado 3.21: Sintaxis de la funcin nElementosCadenas de la clase Graficos
nElementosCadenas ( )
nOb
Esta funcin regresa el nmero (entero) de objetos independientes denidos. No lleva
argumentos. La sintaxis se encuentra en el listado 3.22.
Listado 3.22: Sintaxis de la funcin codnOb de la clase Graficos
nOb ( )
76
angActual
Mediante esta funcin es posible recuperar el ngulo (nmero de punto otante) asignado en el vnculo o eslabn de una cadena indicada. Como argumentos requiere del
vnculo y la cadena. La sintaxis se observa en el listado 3.23.
Listado 3.23: Sintaxis de la funcin angActual de la clase Graficos
angActual ( i n t nC , i n t nV)
0 segundos
3 segundos
1 segundo
2 segundos
4 segundos
Captulo
78
Mdulo
Driver LabView
Variables de
parmetros
Driver
LabView
LabView Driver
Escalamiento
HMI
Controlador
Etapa de potencia
y acondicionamiento
de seales
Mano
Mano CENIDET
C++ Driver
tiempo real se reere al desempeo de un cmputo durante el tiempo actual que est relacionado a
lo que transpira un proceso fsico que resulta del cmputo y puede ser utilizado guiando el proceso fsico
[8].
2 Field Programmable Gate Array, dispositivos semiconductores con bloques de lgica que son programables tanto en interconexin como en funcionalidad.
79
Figura 4.2: Tarjeta de adquisicin y generacin de datos con FPGA PCI-7833 de National
Instruments
80
Datos
MONITOREO
Datos
SCB-68
PCI-7833
Datos
Datos
Mano
CENIDET
Datos
Tarjetas
colectoras
Tarjetas de potencia
81
Venturcom RTX adiciona a Windows un subsistema de tiempo real (RTSS). Venturcom RTX habilita la ejecucin de Windows y del RTSS al mismo tiempo en la misma
computadora[9].
Mediante estas herramientas se puede garantizar una ejecucin en tiempo real del sistema, para obtener un control conable.
Un sistema en tiempo real consta de elementos tanto de software como de hardware.
En los componentes de software esta incluido LabVIEW, la mquina de Tiempo Real (RT
Engine) y los VIs creados por el usuario. Los componentes de hardware constan del sistema de tiempo real, incluyendo una computadora antrin (host) y el objetivo en tiempo
real (RT target)[9].
82
extrado de Wikipedia
83
Inicio
NO
Habilitacin
de Emisin
NO
Fin
SI
Botn
de Ingreso
SI
Escribir Datos
en Archivo
Fin
Inicio
Modo
Interpretacin
o Emisin
NO
Fin
SI
Lectura de
Parmetro N
N+1
Parmetro
final?
Fin
84
Habilitacin
de Lectura
NO
Fin
SI
Lectura de
Parmetro N
N+1
NO
Parmetro
final?
SI
Esperar
101ms
Fin
Inicio
Habilitacin
de Escritura
NO
Fin
SI
Escritura de
Parmetro N
N+1
NO
Parmetro
final?
Esperar
101ms
Fin
85
ngulo
ngulo
ngulo
ngulo
ngulo
ngulo
ngulo
ngulo
ngulo
ngulo
ngulo
ngulo
ngulo
ngulo
ngulo
ngulo
de
de
de
de
de
de
de
de
de
de
de
de
de
de
de
de
dedo
dedo
dedo
dedo
dedo
dedo
dedo
dedo
dedo
dedo
dedo
dedo
dedo
dedo
dedo
dedo
pulgar f a l a n g e proximal
pulgar f a l a n g e medial
pulgar falange d i s t a l
p u l g a r movimiento de a b d u c c i n
n d i c e f a l a n g e proximal
n d i c e f a l a n g e medial
ndice falange distal
n d i c e movimiento de a b d u c c i n
medio f a l a n g e p r o x i m a l
medio f a l a n g e m e d i a l
medio f a l a n g e d i s t a l
medio movimiento de a b d u c c i n
anular f a l a n g e proximal
anular f a l a n g e medial
anular falange d i s t a l
a n u l a r movimiento de a b d u c c i n
86
0.000
0.000
Listado 4.3: Formato del archivo puente de emisin proveniente del simulador grco
f l o a t n g u l o TAB i n t dedo TAB i n t f a l a n g e
Listado 4.4: Ejemplo de archivo de emisin
2.22000002861023
87
4.4.1. Simulacin
En el modo de simulacin el ujo de datos es interno del simulador, pues se indican
mediante funciones o conjunto de funciones (scripts) el comportamiento que debe tener
cada componente de movimiento y en que tiempo debe realizarlo.
Los scripts pueden ingresarse de dos formas: mediante la lnea de comando y mediante
archivos descriptivos con las particularidades descritas en el captulo 2.
Mediante los botones que habilitan la animacin (men animacin, vase gura 4.12)
de los scripts es posible ejecutar el movimiento y analizar sus consecuencias, contando con
las bondades de un depurador que permite identicar que movimientos no son permitidos
antes de ejecutarlos.
El modo simulacin no tiene interaccin con el prototipo fsico, pero conociendo su
88
4.4.2. Interpretacin
El modo interpretacin es el encargado de leer el estado actual el robot, mediante la
generacin de los archivos puente y dependiendo de la capacidad de procesamiento del
equipo residente de la aplicacin es posible observar un animacin en tiempo real.
Al seleccionar el modo debe de contarse con el archivo puente listo para ser actualizado, accin que se conrmar al mostrar la leyenda de Dispositivo en Lnea en la barra
de estado ubicada en la parte inferior del simulador grco, de otra forma provocar un
error y se regresar automticamente al modo de simulacin.
Al estar en este modo es posible cargar el simulador con un simulador del controlador
a utilizar, de esta forma es posible observar su comportamiento sin necesidad de estar
conectado el dispositivo fsico y evitar posibles comportamientos destructivos. Es importante que al conectar el dispositivo, se halla hecho una minuciosa inspeccin de validacin
y correspondencia de los datos que retroalimentan al sistema, pues informacin errnea
de este tipo llevar a una animacin errnea y por lo tanto a una respuesta equvoca del
89
4.4.3. Emisin
El modo de emisin es una ampliacin del modo de interpretacin, pues adems de ser
capaz de leer el archivo puente de posiciones, el simulador es capaz de escribir un archivo
puente de posicin deseada mediante la pestaa de Emisin (gura 4.13)en la cual se
ofrecen las opciones disponibles de elegir dedo, falange y ngulo deseado, mediante el cual
se establece la relacin de movimiento que ha de asignarse para su ejecucin.
Al ingresar los datos, la escritura del archivo puente de emisin se asigna mediante el
botn Ingresar e inmediatamente se asignan las variables por medio de un multiplexor
programado en la aplicacin del controlador (dependiendo de la estructura del controlador).
90
Captulo
92
0 segundos
93
1 segundo
3 segundos
2 segundos
4 segundos
Figura 5.1: Resultado de los Scripts descritos en los listados 5.1 y 5.2
94
95
96
97
Instante de la asignacin
del movimiento
Instante de la respresentacin
del movimiento en el simulador
98
Captulo
Conclusiones y Observaciones
6.1. Observaciones
El presente trabajo de tesis sufri diversas modicaciones, desde aquellas que pretendieron convertirlo en una herramienta genrica de simulacin de robots articulados hasta
la ltima acotacin que deni la estructura de un simulador jo para el prototipo fsico
de la mano CENIDET.
Mediante futuras implementaciones es posible convertir la aplicacin en una herramienta genrica, modicando la estructura general de la misma hacindola ya sea en
forma de formularios o con una estructura de scripts mucho ms compleja que pueda
albergar (como se consideraba inicialmente) la conguracin en parmetros de DenavitHartenberg completa del robot.
6.2. Conclusiones
El simulador grco se limit mediante formas simples, a la representacin de una
mano humana sin dedo meique. Esta es la forma que tiene el prototipo fsico de la mano
CENIDET y que en conjunto tiene un total de 16 grados de libertad.
Mediante la librera de grcos que une los eslabones mediante los parmetros de
Denavit-Hartenberg es posible describir otra conguracin robtica con la limitante que
debe ser un robot que conste completamente de articulaciones cilndricas.
El interprete es capaz de recibir instrucciones para ejecutar movimientos vlidos del
robot mano CENIDET en una secuencia de hasta 100 movimientos por vez, siendo esto
modicable en tiempo de ejecucin.
El driver virtual fue diseado para incluir las seales en forma paralela de un arreglo
de variables, pero en determinado caso es posible pasar los parmetros de forma serial de
99
100
modo de requerir menos terminales en caso de contar con dispositivos limitados en sus
terminales de control, o con buses reducidos, lo que observarn futuras implementaciones
optimizadas en su interfaz electrnica.
En la implementacin de controladores desarrollados en LabVIEW se puede abstraer
de forma ms simple lo sucedido; observando las grcas de movimiento con respecto al
tiempo, da una mejor referencia del desarrollo hecho.
Al hacer pruebas con el simulador se evitan posibles comportamientos destructivos al
prototipo pues se analiza de forma ms directa el comportamiento del controlador, siempre y cuando las caractersticas mecnicas estn en buenas condiciones.
6.2. CONCLUSIONES
101
102
6.3.1. Grcos
Los grcos pueden ser enriquecidos con los siguientes aspectos para su mayor aprovechamiento:
1. Implementacin de texturas para sobresaltar un mayor realismo en las animaciones.
2. Implementacin de fondos que representen escenarios ms complejos.
3. Implementacin de slidos generados con polgonos tridimensionales, los cuales se
acerquen ms a la forma real de los robots representados.
4. Enriquecimiento del entorno por medio de iluminacin dirigida y la generacin de
sombras respecto a los puntos de iluminacin.
6.3.2. Intrprete
Mediante el intrprete el simulador se puede convertir en una herramienta muy poderosa. Un compilador completo depende de la capacidad de anlisis y depuracin. Para
darle esa versatilidad existen herramientas las cuales mediante la denicin de alfabetos
y sintaxis generan un compilador con nes especcos; herramientas como stas son llamadas parsers y son la herramienta precisa para la creacin de un intrprete completo y
eciente. Sin embargo es necesario un conocimiento profundo de stos, as como de materias especializadas como lo son la construccin de compiladores para poder emplearlos
de forma adecuada.
Un intrprete que sea capaz de denir una conguracin robtica cualquiera y poder
extraer los elementos para asignarle movimiento al robot descrito es fundamental para
103
contar con una herramienta poderosa de simulacin, lo que constituira ms que trabajo
futuro de ste tema de tesis, un trabajo completo de un grado superior al de maestra.
104
Bibliografa
[1] C.X. Chen, M.M. Trivedi, and C.R. Bidlack. Simulation and graphical interface for
programming and visualization of sensor-based robot operation. Proceedings of IEEE
International Conference on Robotics and Automation, 2:1095 1101, 1992.
[2] B.K. Christensen and L.M. Desjarlais. A graphical interface for robotic remediation of underground storage tanks. Proceedings of the First IEEE Conference on
Visualization, pages 449 456, 1990.
[3] H. Cimedevilla and J.G. Herrera. Diseo de un sistema articulado emulando el
movimiento de una mano. Master's thesis, CENIDET, 2006.
[4] G.E. Cook, C. Biegl, J.F. Springeld, and K.R. Fernandez. An intelligent robotics
simulator. Conference Record of the 1994 IEEE Industry Applications Society Annual
Meeting, 3:1793 1800, Oct. 1994.
[5] John J. Craig. Robtica. Pearson Prentice Hall, 3ra. edition, 2006.
[6] Jackie Neider Tom Davis Dave Shreiner, Mason Woo. OpenGL Programming Guide:
The Ocial Guide to Learning OpenGL. Addison-Wesley Professional, fth edition,
2005.
[7] et al. OpenGL Reference Manual (Blue Book). Addison-Wesley Publishing Company,
1994.
[8] et al. LabVIEW User Manual. National Instrument Corporation, Jan. 1998.
[9] et al. LabVIEW Real.Time Module User Manual. National Instrument Corporation,
Apr. 2004.
[10] Donald Hearn and M. Pauline Baker. Computer Graphics with OpenGL. Pearson
Prentice Hall, third edition, 2004.
[11] J. Ibanez-Guzman. A robotics and automation teaching laboratory. IEE Colloquium
on Robotics and Education,, pages 5/15/4, 1997.
105
106
BIBLIOGRAFA
[12] K. Ikuta, H. Ishii, and M. Nokata. Development of robot simulator (safe-cad) for
safety design and control. Proceedings of 2001 International Symposium on Micromechatronics and Human Science, pages 161 167, 2001.
[13] A. Infantino, I.and Chella, H. Dzindo, and I. Macaluso. Visual control of a robotic
hand. Proceedings. 2003 IEEE/RSJ International Conference on Intelligent Robots
and Systems., 2:1266 1271, 2003.
[14] Rafael Kelly and Sergio Santibaez. Contro de Movimiento de Robots Manipuladores.
Pearson Prentice Hall, 2003.
[15] W.S. Kim. Graphical operator interface for space telerobotics. In IEEE International
Conference on Robotics and Automation, volume 3, pages 761 768, May 1993.
[16] D. Kragic, A.T. Miller, and P.K. Allen. Real-time tracking meets online grasp planning. Proceedings 2001 ICRA. IEEE International Conference on Robotics and Automation, 3:2460 2465, 2001.
[17] T.P. Kurpjuhn, K. Nickels, A. Hauck, and S. Hutchinson. Development of a visual space-mouse. Proceedings of IEEE International Conference on Robotics and
Automation, 4:2527 2532, 1999.
[18] P.U. Lee, D.C. Ruspini, and O. Khatib. Dynamic simulation of interactive robotic
environment. IEEE International Conference on Robotics and Automation, Proceedings, 2:11471152, 1994.
[19] Juan Gabriel Lpez. Detallador de tareas de visin robtica. Master's thesis, CENIDET, 2003.
[20] Max Meng., D. Lingman, and Xi-Ning Li. A real-time generic animated simulator for
robot manipulators. Canadian Conference on Electrical and Computer Engineering,
2:1077 1080, 1993.
[21] M.Q.-H. Meng, S. Dillen, and M. Koob. A 3-d animated simulator for robot manipulators. Canadian Conference on Electrical and Computer Engineering, 2:574 577,
1996.
[22] A.T. Miller, S. Knoop, H.I. Christensen, and P.K.; Allen. Automatic grasp planning
using shape primitives. Proceedings. ICRA '03. IEEE International Conference on
Robotics and Automation, 2003., 2:1824 1829, Sept. 2003.
[23] P. Montagnier and S.J.; Steiner. Design of a graphical user interface (gui) between
a pc-based cad system and a exible assembly robotic cell. In Fifth International
Conference on Factory 2000 - The Technology Exploitation Process, number 435,
pages 162 169, April 1997.
[24] C. Morales. Simulacin y validacin experimental de un control no lineal aplicado a un
efector reproducioendo algunos movimientos de la mano. Master's thesis, CENIDET,
2008.
BIBLIOGRAFA
107
[25] T. Raz. Graphics robot simulator for teaching introductory robotics. IEEE Transactions on Education, 32:153159, 1989.
[26] Nicholas Haemel Richard S. Wright, Benjamin Lipchak. OpenGL SuperBible: Comprehensive Tutorial and Reference. Addison-Wesley Professional, Jun. 2007.
[27] D.N. Rocheleau and C.D. Crane. Development of a graphical interface for robotic
operation in a hazardous environment. IEEE International Conference on Systems,
Man, and Cybernetics. 'Decision Aiding for Complex Systems, Conference Proceedings., 2:1077 1081, 1991.
[28] M. Rodriguez and A. Codourey. Graphical user interface to manipulate objects in
the micro world with a high precision robot. Proceedings of IEEE International
Conference on Robotics and Automation, 4:3031 3036, 1997.
[29] E. Ueda, Y. Matsumoto, M. Imai, and T. Ogasawara. A hand-pose estimation for
vision-based human interfaces. IEEE Transactions on Industrial Electronics, 50:676
684, 2003.
[30] R.B. White, R.K. Read, M.W. Koch, and R.J. Schilling. A graphics simulator for a
robotic arm. IEEE Transactions on Education, 32:417 429, Nov. 1989.
108
BIBLIOGRAFA
Apendice
Manual de Usuario
El presente manual de usuario busca dar al usuario una breve introduccin al simulador. Desde su proceso de instalacin hasta la utilizacin del mismo y de todas las
herramientas que ste posee.
A.1. Instalacin
El proceso de instalacin consiste en instalar el compilador de Borland C++. Posteriormente debe seguirse el Apndice A para instalar las libreras de OpenGL y el componente
para Borland C++, una vez hecho lo anterior debe copiarse la carpeta de la aplicacin el
directorio C:Simulador.
Una vez hecho esto debe abrirse el proyecto y compilarse la aplicacin.
El proceso de la anexin del driver virtual al programa controlador del dispositivo
fsico se explica en la seccin Driver de este apndice.
A.2. Grcos
Los grcos generados en la aplicacin corresponden a una representacin con guras
simples del robot denominado Mano CENIDET el cual es controlado a travs de una
tarjeta de adquisicin de datos de National Instruments, la cual a su vez es controlada y
programada desde el lenguaje de programacin grca LabVIEW.
La interfaz grca est compuesta principalmente de cuatro partes las cuales se sealan
en la gura A.1 las cuales son:
1. Mens
2. Pestaas de entradas y salidas
109
110
3. rea de gracacin
4. Barra de noticaciones
1
2
4
Figura A.1: Partes del simulador grco
En este caso lo referente a los grcos se ejecuta en el apartado 3 del la gura A.1 y
pueden modicarse mediante Ver, el menu contextual que se ejecuta al hacer click derecho
en el area de gracacin y mediante la pestaa de colores que se encargan de modicar
el entorno.
A.2.1. Navegacin
En el entorno de navegacin pueden modicarse los parmetros de:
1. Rotacin
2. Traslacin
3. Zoom
A.3. MODOS
111
Estos parmetros pueden ser modicados desde el men contextual que aparece al
hacer click derecho sobre el area de gracacin. Al accionar cada uno de los modos es
posible mover el punto de vista del observador mediante el arrastre del ratn en la zona
de gracacin logrando as el efecto deseado.
A.2.2. Entorno
Las variables de entorno que pueden ser modicables son las de el color de la luz y
el color del fondo. Estos parmetros son accesibles desde la pestaa de entrada y salida
llamada Colores. Mediante sta se modican ambas variables mediante la paleta colores
en la cual se puede seleccionar cualquiera que sea de eleccin del usuario.
A.3. Modos
Los modos en los cuales el simulador puede operar se reere al ujo y al origen de la
informacin que es requerida para ejecutar la simulacin. Mediante la eleccin del modo
se selecciona el origen y los efectos que la animacin mostrar.
A.3.1. Simulacin
El modo por defecto es el de simulacin, en el cual es posible introducir secuencias
de movimiento en donde la simulacin solo tomar parte en el la interfaz grca y no
repercutir en el prototipo fsico de ninguna forma.
El modo simulacin cuenta con un depurador de movimientos, el cual indica cuando
un movimiento requerido sobrepasa las limitaciones fsicas estimadas previamente (valores
que pueden ser modicados en tiempo de diseo).
Al estar en modo de Simulacin estn habilitados los scripts y las instrucciones va
lnea de comando, las cuales sern ejecutadas instantneamente despus de haber sido
ingresadas. En el caso de los scripts ser necesario habilitar la animacin desde el men Animacin en su opcin de Ejecutar, siendo posible detenerla con la opcin Detener,
lo que genera una pausa la cual puede ser restablecida nuevamente con la opcin Ejecutar.
En la seccin Scripts se explicar la sintaxis que debe ser seguida as como la forma
de cargar un script desde un archivo.
A.3.2. Interpretacin
En este modo es posible recuperar los movimientos reportados por una interfaz controladora en LabVIEW y representarlos grcamente en el area de gracacin en tiempo
112
A.3.3. Emisin
En el modo de emisin es posible escribir un comando el cual puede ser ledo por la
aplicacin que ejerce el control al robot, adems de contar con las caractersticas del modo
Interpretacin al momento de la ejecucin del controlador.
Ambos modos de interpretacin y de emisin deben contar con correcta interconexin
en la interfaz en el controlador del Driver Virtual para su funcionamiento.
A.4. Scripts
Los scripts utilizados para el modo de simulacin cuentan con una sintaxis simplicada la cual debe encontrarse en archivos de texto plano con la extensin .rmc haciendo
referencia al Robot Mano CENIDET.
A.4.1. Sintaxis
La sintaxis consiste en la secuencia de las instrucciones de movimiento, las cuales a
su ves estn relacionadas en grupos los cuales tienen su inicio de ejecucin en el mismo
instante.
En el listado A.1 se muestra dicha sintaxis la cual es general tanto para la lnea de
comandos como para los archivos descriptivos.
Listado A.1: Sintaxis de orden de movimiento
mov( dedo , f a l a n g e , angulo , tiempo , grupo de movimiento )
A.5. DRIVER
113
A.5. Driver
El Driver de la aplicacin est compuesto de varios programas los cuales interactan
entre ellos generando la escritura y lectura de archivos intermedios los cuales son ledos y
escritos por aplicaciones independientes.
Para que la interaccin sea posible de forma correcta un programa debe ser adicionado
a aquella aplicacin que genera el control de la aplicacin, y en el caso de ser mediante
LabVIEW dicha interaccin, un subVI debe ser la parte que se adiciona al controlador.
114
Apendice
Cdigo Fuente
B.1. Principal
1
2
3
4
5
6
7
8
9
10
//
11
12
13
14
15
//
#pragma package ( s m a r t _ i n i t )
#pragma l i n k "OpenGLPanel"
#pragma r e s o u r c e " . dfm"
16
17
18
TForm1 Form1 ;
19
20
21
22
23
24
25
26
I n t e r p r e t e t x t ; // I n s t a n c i a de c l a s e d e l i n t e r p r e t e
Mftx =0, Mity =0, Mfty =0, Mitz =0, Mftz =0, Miz=0, Mfz=0;
bool enR , enT , enZ , enM ;
// H a b i l i t a l a s r o t a c i o n e s ,
t r a s l a c c i o n e s , zoom y e l movimiento de camara
int s e c u e n c i a =10 , a n g u l o =10;
camRot Cam;
27
115
116
28
29
30
31
32
33
34
35
36
G r a f i c o s f i g ; // I n s t a n c i a de c l a s e de l o s g r a f i c o s
f l o a t t e t a [ 1 0 0 ] , a l f a [ 1 0 0 ] , anguloOb [ 1 0 0 ] ;
int e j e [ 1 0 0 ] ;
37
38
39
40
41
42
// V a r i a b l e s de I l u m i n a c i o n y Fondo
G L f l o a t Background [ 4 ] ;
G L f l o a t OColor [ 5 ] ;
int QuaStyle ;
43
44
45
46
47
FILE
FILE
FILE
FILE
HabEscritura ;
Driver ;
Script ;
Emision ;
48
49
50
DatosLinea S a l i d a ;
// Datos o b t e n i d o s de l a l i n e a de comando
o de l a l i n e a de a r c h i v o
bool E r r o r C o m p i l a c i o n ; // Error de c o m p i l a c i o n para a s i g n a r
parametros de una l i n e a , f a l s o l i n e a c o r r e c t a , v e r d a d e r o
linea incorrecta
51
52
53
54
55
56
57
// B u f f e r de d a t o s de Movimiento a s e r e j e c u t a d o s
int dedom [ nDatos ] ;
int falangem [ nDatos ] ;
f l o a t angulom [ nDatos ] ;
f l o a t tiempom [ nDatos ] ;
int grupom [ nDatos ] ;
58
59
60
// V a r i a b l e s para Animacin
f l o a t mA[ 1 0 0 ] ; // Movimiento A c t u a l
61
62
63
64
65
66
// GLuint t e x t u r e ;
GLuint s t a r t L i s t ;
GLUquadricObj q o b j ;
//
67
68
B.1. PRINCIPAL
69
70
71
72
73
74
75
76
77
78
117
: TForm( Owner )
{
teta [0]=0;
teta [1]=0;
teta [2]=0;
teta [3]=0;
anguloOb [ 1 ] =0;
anguloOb [ 2 ] =0;
// e j e [ 1 ] = EjeX ;
// e j e [ 2 ] = EjeZ ;
79
80
//Mano
81
82
// Anular
83
84
85
86
87
88
89
f i g . DHo( 1 , 0 , 0 , 0 ) ;
f i g .DH( 1 , 0 , 0
,
f i g .DH( 1 , 1 , 0
,
Numero de Vinculo
f i g .DH( 1 , 2 , 30 ,
Numero de Vinculo
f i g .DH( 1 , 3 , 22 ,
Numero de Vinculo
f i g .DH( 1 , 4 , 22 ,
Numero de Vinculo
,
,
,
,
90
90
a,
90
a,
0
a,
0
a,
,
,
alfa
,
alfa
,
alfa
,
alfa
0
0
,
0
,
0
,
0
,
90
90
a,
90
a,
0
a,
0
a,
,
,
alfa
,
alfa
,
alfa
,
alfa
0
0
,
0
,
0
,
0
,
d,
d,
d,
d,
, 90) ;
, 0) ;
teta
, 0) ;
teta
, 0) ;
teta
, 0) ;
teta
//Numero de Cadena ,
//Numero de Cadena ,
//Numero de Cadena ,
//Numero de Cadena ,
90
91
// Medio
92
93
94
95
96
97
98
f i g . DHo( 2 , 0 , 2 0 , 0 ) ;
f i g .DH( 2 , 0 , 0
,
f i g .DH( 2 , 1 , 0
,
Numero de Vinculo
f i g .DH( 2 , 2 , 30 ,
Numero de Vinculo
f i g .DH( 2 , 3 , 22 ,
Numero de Vinculo
f i g .DH( 2 , 4 , 22 ,
Numero de Vinculo
,
,
,
,
d,
d,
d,
d,
, 90) ;
, 0) ;
teta
, 0) ;
teta
, 0) ;
teta
, 0) ;
teta
//Numero de Cadena ,
//Numero de Cadena ,
//Numero de Cadena ,
//Numero de Cadena ,
99
100
// I n d i c e
101
102
103
104
f i g . DHo( 3 , 0 , 4 0 , 0 ) ;
f i g .DH( 3 , 0 , 0
,
90 ,
0
, 90) ;
f i g .DH( 3 , 1 , 0
,
90 ,
0
, 0) ;
Numero de Vinculo , a , a l f a , d , t e t a
//Numero de Cadena ,
118
105
106
107
f i g .DH( 3 , 2 ,
Numero de
f i g .DH( 3 , 3 ,
Numero de
f i g .DH( 3 , 4 ,
Numero de
30 ,
Vinculo
22 ,
Vinculo
22 ,
Vinculo
90 ,
, a , alfa
0 ,
, a , alfa
0 ,
, a , alfa
0
, 0) ;
, d , teta
0
, 0) ;
, d , teta
0
, 0) ;
, d , teta
//Numero de Cadena ,
//Numero de Cadena ,
//Numero de Cadena ,
108
109
// P u l g a r
110
111
112
113
114
115
116
f i g . DHo( 4 , 0 , 4 0 , 4 0 ) ;
f i g .DH( 4 , 0 , 0
,
f i g .DH( 4 , 1 , 0
,
Numero de Vinculo ,
f i g .DH( 4 , 2 , 30 ,
Numero de Vinculo ,
f i g .DH( 4 , 3 , 22 ,
Numero de Vinculo ,
f i g .DH( 4 , 4 , 22 ,
Numero de Vinculo ,
0
90
a,
90
a,
0
a,
0
a,
,
,
alfa
,
alfa
,
alfa
,
alfa
0
0
,
0
,
0
,
0
,
d,
d,
d,
d,
, 90) ;
, 0) ;
teta
, 0) ;
teta
, 0) ;
teta
, 0) ;
teta
//Numero de Cadena ,
//Numero de Cadena ,
//Numero de Cadena ,
//Numero de Cadena ,
117
118
119
//Palma
120
121
122
123
124
125
126
127
fig
/
fig
fig
fig
fig
fig
. Objeto ( 0 , Caja , 5 , 2 0 , 3 0 , 4 5 , 0 , 0 , 4 0 , 1 0 ) ;
128
129
130
}
//
131
132
133
134
135
136
137
138
139
140
141
142
// Paremetros Para G r a f i c a c i n
glPolygonMode (GL_FRONT_AND_BACK, GL_FILL) ;
glShadeModel (GL_SMOOTH) ;
g l E n a b l e (GL_LINE_SMOOTH) ;
g l E n a b l e (GL_BLEND) ;
B.1. PRINCIPAL
143
144
145
119
glBlendFunc (GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) ;
g l H i n t (GL_LINE_SMOOTH_HINT,GL_NICEST) ;
glLineWidth ( 1 . 5 ) ;
146
147
148
149
// g l E n a b l e (GL_TEXTURE_2D) ;
g l E n a b l e (GL_NORMALIZE) ;
glClearDepth ( 1.0 ) ;
150
151
152
153
154
155
156
157
G L f l o a t Ambient [ 4 ] ;
Ambient [ 0 ] = GetRValue ( ColorToRGB ( L i g h t C o l o r >Brush >Color ) )
/255.0 f ;
Ambient [ 1 ] = GetGValue ( ColorToRGB ( L i g h t C o l o r >Brush >Color ) )
/255.0 f ;
Ambient [ 2 ] = GetBValue ( ColorToRGB ( L i g h t C o l o r >Brush >Color ) )
/255.0 f ;
Ambient [ 3 ] = 1 . 0 ;
GLfloat Diffuse [ ] = {0.8 f , 0.8 f , 0.8 f , 1.0 f };
GLfloat Specular []= {1.0 f , 1.0 f , 1.0 f , 1.0 f };
158
159
160
161
162
163
164
165
g l E n a b l e (GL_LIGHT0) ;
g l E n a b l e (GL_LIGHTING) ;
166
167
168
169
170
171
172
173
174
175
OColor [ 0 ] =
/255.0 f ;
OColor [ 1 ] =
/255.0 f ;
OColor [ 2 ] =
/255.0 f ;
OColor [ 3 ] =
176
177
178
g l H i n t (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) ;
120
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
i f (BMPTex1)
{
BMPTex1>S e t Al p h a ( 1 2 8 ) ;
g l P i x e l S t o r e i (GL_UNPACK_ALIGNMENT, 1) ;
g l T e x P a r a m e t e r i (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP
);
g l T e x P a r a m e t e r i (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP
);
g l T e x P a r a m e t e r i (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_LINEAR) ;
g l T e x P a r a m e t e r i (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR) ;
g l T e x E n v i (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL) ;
glTexImage2D (GL_TEXTURE_2D, 0 , BMPTex1>GetComponents ( ) ,
BMPTex1>GetWidth ( ) , BMPTex1>G e t H e i g h t ( ) , 0 ,
BMPTex1>GetFormat ( ) ,BMPTex1>GetType ( ) ,
BMPTex1>G e t P i x e l s ( ) ) ;
}
195
196
197
198
199
200
201
202
203
// GLUquadricObj q o b j ;
G L f l o a t mat_ambient [ ] = { 0 . 5 , 0 . 5 , 0 . 5 , 1 . 0 } ;
G L f l o a t mat_specular [ ] = { 1 . 0 , 1 . 0 , 1 . 0 , 1 . 0 } ;
GLfloat mat_shininess [ ] = { 50.0 };
GLfloat l i g h t _ p o s i t i o n [ ] = { 1.0 , 1.0 , 1.0 , 0.0 };
G L f l o a t model_ambient [ ] = { 0 . 5 , 0 . 5 , 0 . 5 , 1 . 0 } ;
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
s t a r t L i s t = glGenLists (101) ;
q o b j = gluNewQuadric ( ) ;
B.1. PRINCIPAL
220
221
222
121
g l u Q u a d r i c D r a w S t y l e ( q o b j , GLU_FILL) ;
gluQuadricNormals ( q o b j , GLU_SMOOTH) ;
g l u Q u a d r i c T e x t u r e ( q o b j , GL_TRUE) ;
223
224
225
226
/ D e f i n i c i o n de l a s formas
/
//Formas para cadena
227
228
229
230
231
232
nEC=f i g . nElementosCadenas ( ) ;
{
Temp = f i g . Cadena ( i ) ;
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
//Formas para o b j e t o s i n d e p e n d i e n t e s
{
Temp = f i g . G r a f i c a r O b j e t o ( i ) ;
255
256
257
258
259
260
// D e f i n i e n d o Formas
i f (Temp . Tipo == E s f e r a )
{
g l N e w L i s t ( s t a r t L i s t+i , GL_COMPILE) ;
g l u S p h e r e ( qobj , Temp . par1 , 5 0 , 1 5 ) ;
// par1 r a d i o
122
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
B.1. PRINCIPAL
123
298
299
300
301
302
// E s f e r a de a r t i c u l a c i o n
303
304
305
306
g l N e w L i s t ( s t a r t L i s t +100 , GL_COMPILE) ;
g l u S p h e r e ( qobj , 5 , 1 5 , 5 ) ;
glEndList () ;
307
308
309
310
311
312
313
314
315
}
//
{
g l C l e a r (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;
g l C l e a r C o l o r ( Background [ 0 ] , Background [ 1 ] , Background [ 2 ] ,
Background [ 3 ] ) ;
g l C l e a r (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;
316
317
318
319
glPushMatrix ( ) ;
/ Navegacin de l a camara v i r t u a l
/
320
321
322
323
324
325
326
g l R o t a t e f (RotX , 1 . 0 , 0 . 0 , 0 . 0 ) ;
// Rotacion en e l e j e x
g l R o t a t e f (RotY , 0 . 0 , 1 . 0 , 0 . 0 ) ;
// Rotacion en e l e j e y
g l R o t a t e f ( RotZ , 0 . 0 , 0 . 0 , 1 . 0 ) ;
// Rotacion en e l e j e z
g l T r a n s l a t e f (Tx , Ty , Tz ) ;
// T r a s l a c i o n xy
g l S c a l e f (Zoom/ 1 0 0 ,Zoom/ 1 0 0 ,Zoom/ 1 0 0 ) ; //Zoom
g l C o l o r 4 f ( OColor [ 0 ] , OColor [ 1 ] , OColor [ 2 ] , OColor [ 3 ] ) ;
327
328
329
330
331
332
333
334
/ Ejes
/
/
g l B e g i n (GL_LINES) ;
glVertex3i (0.0 ,0.0 ,0.0) ;
glVertex3i (100.0 ,0.0 ,0.0) ;
glColor3f (1.0 ,0.0 ,0.0) ;
glEnd ( ) ;
335
336
337
338
339
g l B e g i n (GL_LINES) ;
glClearColor (1.0 ,1.0 ,0.0 ,0.0) ;
glVertex3i (0.0 ,0.0 ,0.0) ;
glVertex3i (0.0 ,100.0 ,0.0) ;
124
glEnd ( ) ;
340
341
342
343
344
345
346
347
348
g l B e g i n (GL_LINES) ;
glColor3f (0.0 ,0.0 ,1.0) ;
glVertex3i (0.0 ,0.0 ,0.0) ;
glVertex3i (0.0 ,0.0 ,100.0) ;
glEnd ( ) ;
/
/ Dibujado de l a s Formas
/
349
350
351
352
g l E n a b l e (GL_LIGHTING) ;
glShadeModel (GL_SMOOTH) ;
353
354
355
/ Dibujado de Cadenas
/
356
357
358
nCmax = f i g . nCa ( ) ;
359
360
361
dibujada
nVca = f i g . nVC(nC) ;
en l a cadena
//nmero de l a cadena
// C a l c u l o de numero de v i n c u l o s
362
363
364
365
366
367
368
369
370
371
372
373
glPushMatrix ( ) ;
//nVa numero de v i n c u l o
a c t u a l ; nVca numero de v i n c u l o s de l a cadena a c t u a l
{
nE = f i g . nElemento (nC , nV) ;
i f (nV == 1 )
{
Origen = f i g . GetO (nC) ;
g l T r a n s l a t e f ( Origen . y , Origen . z , Origen . x ) ;
Coordenada i n i c i a l de l a cadena
}
374
375
376
377
378
g l R o t a t e f (Temp . par2 , 0 . 0 , 0 . 0 , 1 . 0 ) ;
g l T r a n s l a t e f ( 0 , 0 , Temp . par1 ) ;
// a l f a ( x )
// a ( x )
//
B.1. PRINCIPAL
g l T r a n s l a t e f ( 0 , Temp . par3 , 0 ) ;
g l R o t a t e f (Temp . par4 , 0 . 0 , 1 . 0 , 0 . 0 ) ;
379
380
125
// d ( z )
// t e t a ( z )
381
g l C a l l L i s t ( s t a r t L i s t+nE) ;
g l C a l l L i s t ( s t a r t L i s t +100) ;
// O b j e t o 100 e s f e r a de
enlace entre vinculos
gl u Q ua d r ic D r aw S t y le ( qobj , GLU_FILL) ;
gluQuadricNormals ( qobj , GLU_SMOOTH) ;
g l u Q u a d r i c T e x t u r e ( qobj , GL_TRUE) ;
382
383
384
385
386
387
i f (nV == nVca )
388
389
390
391
392
393
{
g l T r a n s l a t e f ( 0 , Temp . par3 , Temp . par1 ) ;
esfera del ultimo eslabon
g l C a l l L i s t ( s t a r t L i s t +100) ;
}
//
394
glPopMatrix ( ) ;
395
396
397
/ Dibujado de O b j e t o s Simples
/
398
399
400
401
402
k = f i g . nElementosCadenas ( ) ;
for ( k ; k<=99 ; k++)
// o > numero de O b j e t o d i b u j a d o
{
Temp = f i g . G r a f i c a r O b j e t o ( k ) ;
403
404
405
406
407
408
409
410
411
glPushMatrix ( ) ;
g l T r a n s l a t e f (Temp . y , Temp . z , Temp . x ) ;
Coordenada d e l o b j e t o
g l R o t a t e f (Temp . Rx , 0 . 0 , 0 . 0 , 1 . 0 ) ;
Giro s o b r e e j e x
g l R o t a t e f (Temp . Ry , 1 . 0 , 0 . 0 , 0 . 0 ) ;
Giro s o b r e e j e y
g l R o t a t e f (Temp . Rz , 0 . 0 , 1 . 0 , 0 . 0 ) ;
Giro s o b r e e j e z
g l C a l l L i s t ( s t a r t L i s t+k ) ;
glPopMatrix ( ) ;
412
413
/ Tapas de l a Palma /
414
415
416
g l B e g i n (GL_QUADS) ;
g l V e r t e x 3 i ( 8 , 2 ,5) ;
//
//
//
//
126
417
418
419
420
421
g l B e g i n (GL_QUADS) ;
g l V e r t e x 3 i ( 8, 2, 5) ;
g l V e r t e x 3 i (48 , 2 , 5) ;
g l V e r t e x 3 i (48 , 58 , 5) ;
g l V e r t e x 3 i ( 8 , 58 , 5) ;
glEnd ( ) ;
}
422
423
424
425
426
427
428
429
430
// Piso de r e j i l l a
431
432
433
434
435
436
437
g l B e g i n (GL_LINES) ;
for ( i L i n e = f E x t e n t ; i L i n e <= f E x t e n t ; i L i n e += f S t e p )
{
glVertex3f ( iLine , y , fExtent ) ;
g l V e r t e x 3 f ( i L i n e , y, f E x t e n t ) ;
438
439
440
441
442
443
g l V e r t e x 3 f ( fExtent , y , i L i n e ) ;
g l V e r t e x 3 f ( f E x t e n t , y , i L i n e ) ;
444
445
}
glEnd ( ) ;
446
447
448
449
450
451
452
453
454
455
456
457
458
459
glPopMatrix ( ) ;
glFlush () ;
}
//
int w, h ;
w = OpenGLPanel1>Width ;
h = OpenGLPanel1>Height ;
460
461
g l V i e w p o r t ( 0 , 0 , ( G L s i z e i ) w, ( G L s i z e i ) h ) ;
B.1. PRINCIPAL
462
463
464
465
glMatrixMode (GL_PROJECTION) ;
glLoadIdentity () ;
i f (w <= h )
466
467
127
else
468
469
470
471
472
473
glMatrixMode (GL_MODELVIEW) ;
glLoadIdentity () ;
}
//
474
475
476
477
478
479
480
481
482
{
enR = on ;
enT = o f f ;
enZ = o f f ;
f i g . Camara (LIBRE) ;
}
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
//
enM = on ;
i f ( enR == on )
{
Mirx = Mfrx + Y;
Miry = Mfry + X;
// Mirz = Mfrz + Y s i n ( Mfrx RADtoDEG) + X s i n ( Mfry RADtoDEG) ;
Form1>StatusBar1 >Panels >Items [0] > Text = " Rotando " ;
}
i f ( enT == on )
{
Mitx
=
Mity
=
= Mftx
Mftx +
= Mfty
Mfty +
+
X
+
Y
X;
// c o s ( RotY DOSPI/360) >= 0 ? Mitx
: Mitx = Mftx X;
Y;
// c o s ( RotX DOSPI/360) >= 0 ? Mity
: Mity = Mfty Y;
128
503
504
505
506
507
i f ( enZ == on )
{
Miz = Y + Mfz ;
Form1>StatusBar1 >Panels >Items [0] > Text = "Zoom" ;
}
508
509
510
511
512
513
514
515
516
517
518
519
520
521
}
//
522
523
524
525
Mfrx = RotX ;
Mfry = RotY ;
// Mfrz = RotZ ;
526
527
528
529
530
531
532
533
534
535
536
OpenGLPanel1>Repaint ( ) ;
Form1>StatusBar1 >Panels >Items [3] > Text = " P o s i c i n d e l
Eje ( " + F l o a t T o S t r (Tx) + " , " + F l o a t T o S t r (Ty) + " , "
+ F l o a t T o S t r ( Tz ) + " ) " ;
Form1>StatusBar1 >Panels >Items [2] > Text = " ngulo d e l
Eje ( " + F l o a t T o S t r ( RotX ) + " , " + F l o a t T o S t r ( RotY ) + "
, " + F l o a t T o S t r ( RotZ ) + " ) " ;
537
538
539
540
541
542
B.1. PRINCIPAL
129
543
544
545
OpenGLPanel1>Repaint ( ) ;
Form1>StatusBar1 >Panels >Items [3] > Text = " P o s i c i n de
Cmara ( " + F l o a t T o S t r (Tx) + " , " + F l o a t T o S t r (Ty) + " , "
+ F l o a t T o S t r ( Tz ) + " ) " ;
Form1>StatusBar1 >Panels >Items [2] > Text = " ngulo de
Cmara ( " + F l o a t T o S t r ( RotX ) + " , " + F l o a t T o S t r ( RotY ) +
")" ;
546
547
548
549
550
551
552
553
554
556
557
558
559
else
560
{
Zoom = 0 . 1 ;
Mfz = Zoom ;
}
Form1>StatusBar1 >Panels >Items [3] > Text = "Zoom : " +
F l o a t T o S t r (Zoom/ 1 0 0 ) + "x" ;
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
i f ( Mfz > 0 )
{
Miz Y < 0 ? Zoom = 0 : Zoom = MizY;
Mfz = Zoom ;
OpenGLPanel1>Repaint ( ) ;
}
555
}
}
//
enM = o f f ;
RotX = int ( RotX ) % 3 6 0 ;
RotY = int ( RotY ) % 3 6 0 ;
RotZ = int ( RotZ ) % 3 6 0 ;
Mfrx = RotX ;
Mfry = RotY ;
Mfrz = RotZ ;
580
581
582
130
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
}
//
{
enR = o f f ;
enT = o f f ;
enZ = on ;
f i g . Camara (LIBRE) ;
}
//
void _ _ f a s t c a l l TForm1 : : Timer1Timer ( TObject Sender )
{
/ Encargado de Generar l o s i n t e r v a l o s de animacin y de
redibujar las posiciones
a c t u a l e s en modo de S i m u l a c i n /
int n=0;
//Nmero e l e m e n t o de movimento
int gMa=1;
//Grupo de Movimiento A c t u a l
f l o a t d i f f = 0 ; //Rango de d i f e r e n c i a e n t r e e l a n g u l o o b t e n i d o
para d e t e n e r animacin
604
605
606
607
608
609
Timer1>I n t e r v a l = TA;
i f ( grupom [ n]==gMa)
{
f i g . MovimientoTeta ( dedom [ n ] , falangem [ n ] ,mA[ n ] , tiempom [ n ] ,
grupom [ n ] ) ;
d i f f = abs ( angulom [ n] mA[ n ] ) ;
/ Form1>StatusBar1 >Panels >Items [0] > Text = d i f f ;
Form1>StatusBar1 >Panels >Items [1] > Text = mA[ n ] ;
Form1>StatusBar1 >Panels >Items [2] > Text = grupom [ n ] ;
Form1>StatusBar1 >Panels >Items [3] > Text = gMa ;
/
610
611
612
613
614
615
616
617
i f ( d i f f > STOPANI)
618
619
else
620
621
622
623
gMa++;
B.1. PRINCIPAL
624
625
626
627
628
629
OpenGLPanel1>Repaint ( ) ;
}
//
630
631
632
633
634
635
636
638
640
641
642
643
}
//
644
645
646
}
//
637
639
131
647
648
649
650
651
//
652
653
654
655
656
657
658
659
660
661
662
663
}
//
}
//
132
664
665
666
667
668
669
670
671
672
674
676
677
678
679
680
681
}
//
673
675
}
//
void _ _ f a s t c a l l TForm1 : : D i m t r i c a 1 C l i c k ( TObject Sender )
{
Form1>StatusBar1 >Panels >Items [3] > Text = " V i s t a
Dimtrica " ;
f i g . Camara (DIMETRICA) ;
}
682
683
684
685
//
686
687
688
689
690
691
692
693
694
695
696
697
698
}
//
{
enR = o f f ;
enT = on ;
enZ = o f f ;
f i g . Camara (LIBRE) ;
}
//
699
700
701
702
703
704
int V i s t a ;
Cam = f i g . Camara ( ) ;
B.1. PRINCIPAL
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
V i s t a = Cam.V;
i f ( V i s t a == FRONTAL)
i f ( RotX < 0 )
RotX++;
i f ( RotX > 0 )
RotX;
i f ( RotY < 0 )
RotY++;
i f ( RotY > 0 )
RotY;
i f ( RotZ < 0 )
RotZ++;
i f ( RotZ > 0 )
RotZ ;
Mfrx = RotX ;
Mfry = RotY ;
OpenGLPanel1>Repaint ( ) ;
}
i f ( V i s t a == POSTERIOR)
{
i f ( RotX < 0 )
RotX++;
i f ( RotX > 0 )
RotX;
i f ( RotY < 1 8 0 )
RotY++;
i f ( RotY > 1 8 0 )
RotY;
i f ( RotZ < 0 )
RotZ++;
i f ( RotZ > 0 )
RotZ ;
Mfrx = RotX ;
Mfry = RotY ;
OpenGLPanel1>Repaint ( ) ;
}
i f ( V i s t a == SUPERIOR)
{
i f ( RotX < 9 0 )
RotX++;
i f ( RotX > 9 0 )
RotX;
i f ( RotY < 0 )
133
134
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
RotY++;
i f ( RotY > 0 )
RotY;
i f ( RotZ < 0 )
RotZ++;
i f ( RotZ > 0 )
RotZ ;
Mfrx = RotX ;
Mfry = RotY ;
OpenGLPanel1>Repaint ( ) ;
}
i f ( V i s t a == INFERIOR)
{
i f ( RotX < 90)
RotX++;
i f ( RotX > 90)
RotX;
i f ( RotY < 0 )
RotY++;
i f ( RotY > 0 )
RotY;
i f ( RotZ < 0 )
RotZ++;
i f ( RotZ > 0 )
RotZ ;
Mfrx = RotX ;
Mfry = RotY ;
OpenGLPanel1>Repaint ( ) ;
}
i f ( V i s t a == DERECHA)
{
i f ( RotX < 0 )
RotX++;
i f ( RotX > 0 )
RotX;
i f ( RotY < 9 0 )
RotY++;
i f ( RotY > 9 0 )
RotY;
i f ( RotZ < 0 )
RotZ++;
i f ( RotZ > 0 )
RotZ ;
Mfrx = RotX ;
Mfry = RotY ;
B.1. PRINCIPAL
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
OpenGLPanel1>Repaint ( ) ;
}
i f ( V i s t a == IZQUIERDA)
{
i f ( RotX < 0 )
RotX++;
i f ( RotX > 0 )
RotX;
i f ( RotY < 90)
RotY++;
i f ( RotY > 90)
RotY;
i f ( RotZ < 0 )
RotZ++;
i f ( RotZ > 0 )
RotZ ;
Mfrx = RotX ;
Mfry = RotY ;
OpenGLPanel1>Repaint ( ) ;
}
i f ( V i s t a == ISOMETRICA)
{
i f ( RotX < 30)
RotX++;
i f ( RotX > 30)
RotX;
i f ( RotY < 4 5 )
RotY++;
i f ( RotY > 4 5 )
RotY;
i f ( RotZ < 0 )
RotZ++;
i f ( RotZ > 0 )
RotZ ;
Mfrx = RotX ;
Mfry = RotY ;
OpenGLPanel1>Repaint ( ) ;
}
i f ( V i s t a == DIMETRICA)
135
136
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
i f ( RotY < 3 0 )
RotY++;
i f ( RotY > 3 0 )
RotY;
i f ( RotZ < 0 )
RotZ++;
i f ( RotZ > 0 )
RotZ ;
Mfrx = RotX ;
Mfry = RotY ;
OpenGLPanel1>Repaint ( ) ;
}
i f ( V i s t a == TRIMETRICA)
{
i f ( RotX < 20)
RotX++;
i f ( RotX > 20)
RotX;
i f ( RotY < 2 0 )
RotY++;
i f ( RotY > 2 0 )
RotY;
i f ( RotZ < 0 )
RotZ++;
i f ( RotZ > 0 )
RotZ ;
Mfrx = RotX ;
Mfry = RotY ;
OpenGLPanel1>Repaint ( ) ;
}
870
871
872
}
//
873
874
875
876
877
878
879
880
881
882
883
884
B.1. PRINCIPAL
885
886
887
888
889
fig
fig
fig
fig
fig
. MovimientoTeta ( 1 , 2 , t e t a [ 2 ]
. MovimientoTeta ( 1 , 3 , t e t a [ 3 ]
. MovimientoTeta ( 1 , 4 , t e t a [ 4 ]
. MovimientoTeta ( 1 , 5 , t e t a [ 5 ]
. MovimientoTeta ( 1 , 6 , t e t a [ 6 ]
137
,0
,0
,0
,0
,0
,0)
,0)
,0)
,0)
,0)
;
;
;
;
;
890
891
secuencia = 1;
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
OpenGLPanel1>Repaint ( ) ;
}
//
912
913
914
915
OpenGLPanel1>Repaint ( ) ;
}
916
917
918
919
920
921
922
923
924
925
926
927
//
void _ _ f a s t c a l l TForm1 : : A b r i r S c r i p t C l i c k ( TObject Sender )
{
i f ( S i m u l a c i o n >Checked )
{
A n s i S t r i n g Path , n E r r o r e s ;
i =0;
int n E r r o r e s i n t =0; //Numero de E r r o r e s e n c o n t r a d o s
int lAc =0;
// Linea A c t u a l
char l i n e a [ 5 0 ] ; // B u f f e r de Linea A c t u a l
ErrorCompilacion = false ;
928
929
//
138
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
i f ( OpenDialog1 >Execute ( ) )
{
Path = OpenDialog1 >FileName ;
d e l Archivo a Path
// Asigna l a D i r e c c i n
Se v e r i f i c a que l a d i r e c c i n d e l a r c h i v o s e a v l i d a
RichEdit1 >L i n e s >Add( ">>El a r c h i v o " + Path + " no
pudo s e r a b i e r t o " ) ;
//
else
{
RichEdit1 >L i n e s >Add( ">>El a r c h i v o " + Path + " ha
sido abierto ") ;
while ( ! f e o f ( S c r i p t ) )
// Rutina
para e x t r a e r l a s l i n e a s de un a r c h i v o una por una
{
lAc++;
fgets ( linea ,50 , Script ) ;
S a l i d a = t x t . mov( l i n e a ) ;
//
Funcion d e l I n t e r p r e t e
i f ( S a l i d a . p a l a b r a == 1)
{
RichEdit1 >L i n e s >Add( " E r r o r : Comando o
s i n t x i s i n v l i d a en l n e a " + I n t T o S t r (
lAc ) ) ;
E r r o r C o m p i l a c i o n = true ;
n E r r o r e s i n t ++;
}
i f ( S a l i d a . dedo == 0 )
{
RichEdit1 >L i n e s >Add( " E r r o r : Nombre de dedo
i n v l i d o en l n e a " + I n t T o S t r ( lAc ) ) ;
E r r o r C o m p i l a c i o n = true ;
n E r r o r e s i n t ++;
}
i f ( S a l i d a . f a l a n g e == 0 )
{
RichEdit1 >L i n e s >Add( " E r r o r : Nombre de
f a l a n g e i n v l i d o en l n e a " + I n t T o S t r (
lAc ) ) ;
E r r o r C o m p i l a c i o n = true ;
n E r r o r e s i n t ++;
B.1. PRINCIPAL
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
139
}
i f ( S a l i d a . a n g u l o == 1 0 0 0 0 0 0 )
{
RichEdit1 >L i n e s >Add( " E r r o r : Valor de n g u l o
i n v l i d o en l n e a " + I n t T o S t r ( lAc ) ) ;
E r r o r C o m p i l a c i o n = true ;
n E r r o r e s i n t ++;
}
i f ( S a l i d a . tiempo == 1 0 0 0 0 0 0 )
{
RichEdit1 >L i n e s >Add( " E r r o r : Valor de tiempo
i n v l i d o en l n e a " + I n t T o S t r ( lAc ) ) ;
E r r o r C o m p i l a c i o n = true ;
n E r r o r e s i n t ++;
}
i f ( S a l i d a . grupo == 1 0 0 0 0 0 0 )
{
RichEdit1 >L i n e s >Add( " E r r o r : Valor de grupo
i n v l i d o en l n e a " + I n t T o S t r ( lAc ) ) ;
E r r o r C o m p i l a c i o n = true ;
n E r r o r e s i n t ++;
}
i f ( S a l i d a . f a l a n g e == p r o x i m a l && ( S a l i d a . a n g u l o
140
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
t a=TA/ 1 0 0 0 . 0 ;
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
B.1. PRINCIPAL
}
I n s t r u c c i o n >Text = " " ;
} // w h i l e
fclose ( Script ) ;
} // e l s e
} // i f que a b r e e l open d i a l o g
1027
1028
1029
1030
1031
1032
1033
i f ( E r r o r C o m p i l a c i o n == true )
1034
{
t x t . i n i D a t o s ( dedom , falangem , angulom , tiempom , grupom ) ;
nErrores = nErroresint ;
Form1>StatusBar1 >Panels >Items [1] > Text = " E r r o r e s
encontrados : " + nErrores ;
Form1>StatusBar1 >Panels >Items [2] > Text = "" ;
}
1035
1036
1037
1038
1039
1040
else
1041
{
RichEdit1 >L i n e s >Add( " Compilacin E x i t o s a " ) ;
Form1>StatusBar1 >Panels >Items [1] > Text = " S c r i p t " +
Path + " c a r g a d o " ;
Form1>StatusBar1 >Panels >Items [2] > Text = I n t T o S t r ( lAc ) +
" movimientos c a r g a d o s " ;
Form1>Timer1>Enabled= f a l s e ;
}
1042
1043
1044
1045
1046
1047
1048
1049
141
else
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
Form1>Timer1>Enabled = true ;
}
//
Form1>Timer1>Enabled = f a l s e ;
}
//
1065
1066
1067
142
1068
1069
1070
i f ( C o l o r D i a l o g 1 >Execute ( ) )
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
/ Funciones de Compilador
/
t x t . i n i D a t o s ( dedom , falangem , angulom , tiempom , grupom ) ;
I n i c i a l i z a l o s parametros para e l movimiento
//
i f ( Key == VK_RETURN)
{
i f ( S i m u l a c i o n >Checked )
{
ErrorCompilacion = false ;
RichEdit1 >L i n e s >Add( ">>" + I n s t r u c c i o n >Text ) ;
char comando = new char [ I n s t r u c c i o n >Text . Length ( ) + 1
];
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
s t r c p y ( comando , I n s t r u c c i o n >Text . c _ s t r ( ) ) ;
// Copia
y c o n v i e r t e a char l a cadena de I n s t r u c c i o n en
comando
S a l i d a = t x t . mov( comando ) ;
//
Funcion d e l I n t e r p r e t e t x t e s l a i n s t a n c i a de c l a s e
i f ( S a l i d a . p a l a b r a == 1)
{
RichEdit1 >L i n e s >Add( " E r r o r : Comando o s i n t x i s
invlida ") ;
E r r o r C o m p i l a c i o n = true ;
}
i f ( S a l i d a . dedo == 0 )
{
RichEdit1 >L i n e s >Add( " E r r o r : Nombre de dedo i n v l i d o "
);
E r r o r C o m p i l a c i o n = true ;
}
B.1. PRINCIPAL
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
143
i f ( S a l i d a . f a l a n g e == 0 )
{
RichEdit1 >L i n e s >Add( " E r r o r : Nombre de f a l a n g e
invlido ") ;
E r r o r C o m p i l a c i o n = true ;
}
i f ( S a l i d a . a n g u l o == 1 0 0 0 0 0 0 )
{
RichEdit1 >L i n e s >Add( " E r r o r : Valor de n g u l o i n v l i d o
") ;
E r r o r C o m p i l a c i o n = true ;
}
i f ( S a l i d a . tiempo == 1 0 0 0 0 0 0 )
{
RichEdit1 >L i n e s >Add( " E r r o r : Valor de tiempo i n v l i d o
") ;
E r r o r C o m p i l a c i o n = true ;
}
i f ( S a l i d a . grupo == 1 0 0 0 0 0 0 )
{
RichEdit1 >L i n e s >Add( " E r r o r : Valor de grupo i n v l i d o "
);
E r r o r C o m p i l a c i o n = true ;
}
i f ( S a l i d a . f a l a n g e == p r o x i m a l && ( S a l i d a . a n g u l o >
144
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
i f ( E r r o r C o m p i l a c i o n == f a l s e )
{
f l o a t a0 , d i f f A n g u l o ;
f l o a t I ,M;
f l o a t t a =0; // I n t e r v a l o en s e g u n d o s
1151
1152
t a=TA/ 1 0 0 0 . 0 ;
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
B.1. PRINCIPAL
else
1176
1177
}
Form1>StatusBar1 >Panels >Items [1] > Text = "" ;
1178
1179
1180
1181
1182
1183
1184
1185
}
//
1186
i f ( C o l o r D i a l o g 1 >Execute ( ) )
{
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1205
1206
1207
1208
1209
1210
1211
GLfloat
Ambient [ 4 ] ;
L i g h t C o l o r >Brush>C o l o r = C o l o r D i a l o g 1 >C o l o r ;
Ambient [ 0 ] = GetRValue ( ColorToRGB ( L i g h t C o l o r >Brush>C o l o r ) )
/255.0 f ;
Ambient [ 1 ] = GetGValue ( ColorToRGB ( L i g h t C o l o r >Brush>C o l o r ) )
/255.0 f ;
Ambient [ 2 ] = GetBValue ( ColorToRGB ( L i g h t C o l o r >Brush>C o l o r ) )
/255.0 f ;
Ambient [ 3 ] = 1 . 0 f ;
OpenGLPanel1>MakeOpenGLPanelCurrent ( ) ;
g l L i g h t f v ( GL_LIGHT0, GL_AMBIENT, Ambient ) ;
OpenGLPanel1>MakeOpenGLPanelNotCurrent ( ) ;
OpenGLPanel1>Repaint ( ) ;
}
}
//
1203
1204
145
TMouseButton Button ,
T S h i f t S t a t e S h i f t , int X, int Y)
i f ( C o l o r D i a l o g 1 >Execute ( ) )
{
146
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
}
//
i f ( C o l o r D i a l o g 1 >Execute ( ) )
{
1222
1223
1224
1225
1226
1227
1228
1229
1230
OpenGLPanel1>Repaint ( ) ;
}
//
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
{
S i m u l a c i o n >Checked = True ;
I n t e r p r e t a c i o n >Checked = F a l s e ;
Generacion >Checked =F a l s e ;
Animacion >Enabled = True ;
I n t e r p r e t a c i o n T i m e r >Enabled = F a l s e ;
TabSheet3 >Enabled=F a l s e ;
Form1>StatusBar1 >Panels >Items [3] > Text = "" ;
else
1247
1248
1249
1250
1251
f p u t s ( "0" , HabEscritura ) ;
f c l o s e ( HabEscritura ) ;
}
//
B.1. PRINCIPAL
1252
1253
1254
1255
1256
1257
1258
1259
1260
{
I n t e r p r e t a c i o n >Checked = True ;
S i m u l a c i o n >Checked = F a l s e ;
Generacion >Checked =F a l s e ;
Animacion >Enabled = F a l s e ;
I n t e r p r e t a c i o n T i m e r >Enabled = True ;
TabSheet3 >Enabled=F a l s e ;
1261
1262
NULL)
RichEdit1 >L i n e s >Add( " E r r o r a l Generar Archivo de
Habilitacin ") ;
1263
else
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
147
f p u t s ( "1" , HabEscritura ) ;
f c l o s e ( HabEscritura ) ;
}
//
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
int lAcD=0;
// Linea a c t u a l d e l D r i v e r
char l i n e a [ 5 0 ] ;
// B u f f e r de Linea A c t u a l
f l o a t Angulo [ 1 6 ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
//
148
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
I n t e r p r e t a c i o n T i m e r >I n t e r v a l = 3 3 ;
else
{
Form1>StatusBar1 >Panels >Items [3] > Text = " D i s p o s i t i v o en
L ne a " ;
while ( ! f e o f ( D r i v e r ) )
// Rutina para
e x t r a e r l a s l i n e a s de un a r c h i v o una por una
{
f g e t s ( linea ,50 , Driver ) ;
Angulo [ lAcD ] = t x t . pos ( l i n e a ) ;
S a l i d a = t x t . puente ( lAcD , Angulo [ lAcD ] ) ;
// I n g r e s o de d a t o s a l a r r e g l o de e j e c u c i o n a c t u a l
dedom [ lAcD ] = S a l i d a . dedo ;
falangem [ lAcD ] = S a l i d a . f a l a n g e ;
angulom [ lAcD ] = S a l i d a . a n g u l o ;
tiempom [ lAcD ] = S a l i d a . tiempo ;
grupom [ lAcD ] = S a l i d a . grupo ;
f i g . MovimientoTeta ( dedom [ lAcD ] , falangem [ lAcD ] , angulom [
lAcD ] , tiempom [ lAcD ] , grupom [ lAcD ] ) ;
lAcD++;
}
}
f c l o s e ( Driver ) ;
i f ( lAcD == 1 6 )
OpenGLPanel1>Repaint ( ) ;
}
//
B.1. PRINCIPAL
1332
1333
1334
1335
1336
1337
149
char tempangulochar ;
float tempangulofloat ;
E r r o r C o m p i l a c i o n = true ;
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
{
RichEdit1 >L i n e s >Add( " E r r o r : No e s p o s i b l e a l c a n z a r e s e
ngulo " ) ;
E r r o r C o m p i l a c i o n = true ;
}
i f ( falangem [ 0 ] == 4 && ( angulom [ 0 ] > MaxAbduccion | | angulom [ 0 ]
< MinAbduccion ) )
{
RichEdit1 >L i n e s >Add( " E r r o r : No e s p o s i b l e a l c a n z a r e s e
ngulo " ) ;
E r r o r C o m p i l a c i o n = true ;
}
else
{
RichEdit1 >L i n e s >Add( " P o s i c i n Asignada " ) ;
ErrorCompilacion = false ;
}
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
i f ( E r r o r C o m p i l a c i o n == f a l s e )
else
150
1371
1372
1373
1374
1375
1376
1377
else
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
f p u t s ( "2" , HabEscritura ) ;
f c l o s e ( HabEscritura ) ;
f p u t s ( F l o a t T o S t r ( angulom [ 0 ] ) . c _ s t r ( ) , Emision ) ;
f p u t s ( " \ t " , Emision ) ;
f p u t s ( I n t T o S t r ( dedom [ 0 ] ) . c _ s t r ( ) , Emision ) ;
f p u t s ( " \ t " , Emision ) ;
f p u t s ( I n t T o S t r ( falangem [ 0 ] ) . c _ s t r ( ) , Emision ) ;
f p u t s ( " \ t " , Emision ) ;
f c l o s e ( Emision ) ;
1388
1389
1390
1391
1392
}
//
3
4
5
6
7
8
9
10
11
12
13
14
15
16
151
ob [ i ] . par4 = 0 ;
ob [ i ] . x = 0 ;
ob [ i ] . y = 0 ;
ob [ i ] . z = 0 ;
ob [ i ] . Rx = 0 ;
ob [ i ] . Ry = 0 ;
ob [ i ] . Rz = 0 ;
Cam. Rx = 0 ;
Cam. Ry = 0 ;
Cam. Rz = 0 ;
Cam. x = 0 ;
Cam. y = 0 ;
Cam. z = 0 ;
Cam. Zoom = 1 0 0 ;
Cam.V = ISOMETRICA ;
o r i g e n [ i ] . x=0;
o r i g e n [ i ] . y=0;
o r i g e n [ i ] . z =0;
}
nE=0; }
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Funcion para i n g r e s a r l o s d a t o s DH a e l e m e n t o s
int G r a f i c o s : : DH( int nC , int nV , f l o a t a , f l o a t a l f a , f l o a t d ,
f l o a t t e t a ) { e l e m e n t o [ nE ] . nC=nC ; e l e m e n t o [ nE ] . nV=nV ;
e l e m e n t o [ nE ] . a=a ; e l e m e n t o [ nE ] . a l f a=a l f a ; e l e m e n t o [ nE ] . d=d ;
e l e m e n t o [ nE ] . t e t a=t e t a ; nE++; return nE 1;
// Regresa e l numero
de e l e m e n t o i n g r e s a d o }
51
52
53
54
55
56
e l e m e n t o A c t u a l = e l e m e n t o [ nE ] ;
57
58
59
F i g u r a . Tipo = C i l i n d r o ; F i g u r a . par1 = e l e m e n t o A c t u a l . a ;
// Parametro a DH <L o n g i t u d d e l e s l a b n > D i s t a n c i a Sobre e l e j e
152
60
61
62
63
64
65
66
67
x
F i g u r a . par2 = e l e m e n t o A c t u a l . a l f a ;
// Parametro a l f a DH
Angulo s o b r e e l e j e x F i g u r a . par3 = e l e m e n t o A c t u a l . d ;
//
Paremetro d DH D i s t a n c i a Sobre e l e j e z F i g u r a . par4 =
elementoActual . teta ;
// Parametro t e t a DH <Angulo i n i c i a l >
Angulo Sobre e l e j e z
return F i g u r a ; }
68
69
f l o a t rx , f l o a t ry , f l o a t rz , f l o a t par1 ) {
z,
70
71
72
73
74
75
76
77
78
79
80
81
ob [ nE ] . i d = i d ;
ob [ nE ] . Tipo = t i p o ;
ob [ nE ] . x = x ;
ob [ nE ] . y = y ;
ob [ nE ] . z = z ;
ob [ nE ] . Rx = rx ;
ob [ nE ] . Ry = ry ;
ob [ nE ] . Rz = r z ;
ob [ nE ] . par1 = par1 ;
nE++;;
82
83
f l o a t rx , f l o a t ry , f l o a t rz , f l o a t par1 , f l o a t par2 ) {
z,
84
85
86
87
88
89
90
91
92
93
94
95
96
ob [ nE ] . i d = i d ;
ob [ nE ] . Tipo = t i p o ;
ob [ nE ] . x = x ;
ob [ nE ] . y = y ;
ob [ nE ] . z = z ;
ob [ nE ] . Rx = rx ;
ob [ nE ] . Ry = ry ;
ob [ nE ] . Rz = r z ;
ob [ nE ] . par1 = par1 ;
ob [ nE ] . par2 = par2 ;
nE++;;
97
98
z,
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
{
ob [ nE ] . i d = i d ;
ob [ nE ] . Tipo = t i p o ;
ob [ nE ] . x = x ;
ob [ nE ] . y = y ;
ob [ nE ] . z = z ;
ob [ nE ] . Rx = rx ;
ob [ nE ] . Ry = ry ;
ob [ nE ] . Rz = r z ;
ob [ nE ] . par1 = par1 ;
ob [ nE ] . par2 = par2 ;
ob [ nE ] . par3 = par3 ;
nE++;;
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
153
ob [ nE ] . i d = i d ;
ob [ nE ] . Tipo = t i p o ;
ob [ nE ] . x = x ;
ob [ nE ] . y = y ;
ob [ nE ] . z = z ;
ob [ nE ] . Rx = rx ;
ob [ nE ] . Ry = ry ;
ob [ nE ] . Rz = r z ;
ob [ nE ] . par1 = par1 ;
ob [ nE ] . par2 = par2 ;
ob [ nE ] . par3 = par3 ;
ob [ nE ] . par4 = par4 ;
nE++;;
154
142
143
144
S a l i d a . Ry = ob [ nE ] . Ry ;
S a l i d a . Rz = ob [ nE ] . Rz ;
return S a l i d a ; }
145
146
147
148
149
150
151
152
153
154
155
// Busqueda d e l numero de
e l e m e n t o [ nE 1 ] . t e t a = t e t a ;
a c t u a l i z a c i o n de a n g u l o
// S e l e c c i n d e l e l e m e n t o y
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
{
ob [ nE ] . Rx = a n g u l o ;
ob [ nE ] . Ry = 0 ;
ob [ nE ] . Rz = 0 ;
}
i f ( e j e == EjeY )
{
ob [ nE ] . Rx = 0 ;
ob [ nE ] . Ry = a n g u l o ;
ob [ nE ] . Rz = 0 ;
}
i f ( e j e == EjeZ )
{
ob [ nE ] . Rx = 0 ;
ob [ nE ] . Ry = 0 ;
ob [ nE ] . Rz = a n g u l o ;
}
}
Cam.V = v i s t a ;
return v i s t a ;
}
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
camRot G r a f i c o s : : Camara ( f l o a t Rx , f l o a t Ry , f l o a t Rz , f l o a t x ,
f l o a t y , f l o a t z , f l o a t Zoom) {
Cam. Rx = Rx ;
Cam. Ry = Ry ;
Cam. Rz = Rz ;
Cam. x = x ;
Cam. y = y ;
Cam. z = z ;
Cam. Zoom = Zoom ;
Cam.V = LIBRE ;
return Cam;
}
204
205
206
207
camRot G r a f i c o s : : Camara ( ) {
return Cam;
}
208
209
210
211
212
213
214
215
216
i f ( e l e m e n t o [ i ] . nC == nC)
217
218
219
220
221
222
223
224
225
226
nV = max(nV , e l e m e n t o [ i ] . nV) ;
return nV ;
227
228
229
155
156
int i ;
int nCad = 0 ;
230
231
232
233
234
235
236
237
238
{
nCad = max( nCad , e l e m e n t o [ i ] . nC) ;
}
return nCad ;
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
i f ( e l e m e n t o [ i ] . nC >= 1 )
271
272
nEC++;
157
return nEC ; }
275
276
277
278
279
// Regresa e l numero de O b j e t o s
int G r a f i c o s : : nOb ( ) {
int i ;
int nOb = 0 ;
280
281
282
283
284
285
286
{
nOb = max(nOb , ob [ i ] . i d ) ;
}
return nOb ;
287
288
289
290
291
292
293
294
return a n g u l o ; }
B.2.2. Gracos.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef GraficosClase_H
#define GraficosClase_H
typedef struct { int nC ;
int
nV ;
//Nmero de v i n c u l o o e s l a b n f l o a t a ;
// Parmetro a de DH f l o a t a l f a ;
// Parmetro a l f a de DH f l o a t
d;
// Parmetro d de DH f l o a t t e t a ;
// Parmetro t e t a
de
DH }defDH ;
// D e f i n i c i n D e n a v i t H a r t e n b e r g
Cadena
// I d e n t i f i c a d o r de forma i n t
Tipo ;
// Tipo de Forma f l o a t x ;
// Parametros d e l 1 a l 4 c o o r d e n a d a s
y
g i r o s por e j e f l o a t y ; f l o a t z ; f l o a t Rx ; f l o a t Ry ; f l o a t Rz ;
158
16
17
18
19
20
21
22
23
24
// Parametros de Forma
// Angulo de movimeinto a c t u a l f l o a t
M;
// I n t e r v a l o de movimiento }parAnim ;
25
26
27
28
29
30
31
32
// D e f i n i c i o n de c o n s t a n t e s para
// V i s t a s
#define LIBRE
100 #define
POSTERIOR
1 #d e f i n e SUPERIOR
2 #d e f i n e
4 #d e f i n e IZQUIERDA
5 #d e f i n e
TRIMETRICA
7 #d e f i n e DIMETRICA
8
las vistas
FRONTAL
0 #define
INFERIOR
ISOMETRICA
3 #d e f i n e DERECHA
6 #d e f i n e
33
34
35
36
37
// D e f i n i c i o n de formas
#define E s f e r a
1 #define C i l i n d r o
#define Cono
4 #define Piramide
#define S e m i d i s c o 7
2 #define Caja
5 #define D i s c o
3
6
38
39
40
// E j e s de r o t a c i o n para o b j e t o s
#define EjeX
1 #define EjeY
2 #define EjeZ
41
42
43
44
45
46
47
48
49
50
51
#define on 1 #define o f f 0
#define TA 50
52
53
// Asignar o r i g e n de l a cadena i
Obtener o r i g e n de l a cadena i
54
en
//
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
teta ) ;
// Parmetros de DH
parF Cadena ( int nE) ;
159
//
Parametros de l a forma para una cadena p a r t i e n d o de su
numero de e l e m e n t o
void Objeto ( int id , int t i p o , f l o a t x , f l o a t y , f l o a t z ,
f l o a t Rx , f l o a t Ry , f l o a t Rz , f l o a t par1 ) ; // O b j e t o que
admite un parametro
void Objeto ( int id , int t i p o , f l o a t x , f l o a t y , f l o a t z ,
f l o a t Rx , f l o a t Ry , f l o a t Rz , f l o a t par1 , f l o a t par2 ) ; //
O b j e t o que admite dos parametros
void Objeto ( int id , int t i p o , f l o a t x , f l o a t y , f l o a t z ,
f l o a t Rx , f l o a t Ry , f l o a t Rz , f l o a t par1 , f l o a t par2 , f l o a t
par3 ) ; // O b j e t o que admite t r e s parametros
void Objeto ( int id , int t i p o , f l o a t x , f l o a t y , f l o a t z ,
f l o a t Rx , f l o a t Ry , f l o a t Rz , f l o a t par1 , f l o a t par2 , f l o a t
par3 , f l o a t par4 ) ; // O b j e t o que admite c u a t r o parametros
parF G r a f i c a r O b j e t o ( int nE) ;
// Recupera l o s
parametros de un o b j e t o
void MovimientoAlfa ( int nC , int nV , f l o a t a l f a , f l o a t tiempo ,
int gM) ; // Parmetros para l a animacin
void MovimientoTeta ( int nC , int nV , f l o a t t e t a , f l o a t tiempo ,
int gM) ; // Parmetros para l a animacin
void MovimientoObjeto ( int id , f l o a t angulo , int e j e , int
tiempo ) ;
// Parmetros para l a animacin de o b j e t o s
int Camara ( int v i s t a ) ;
//Cmara
vista fija
camRot Camara ( f l o a t Rx , f l o a t Ry , f l o a t Rz , f l o a t x , f l o a t y ,
f l o a t z , f l o a t Zoom) ; // U b i c a c i n de l a cmara
camRot Camara ( ) ;
int nVC( int nC) ;
//
Encuentra e l numero de v i n c u l o s de una cadena
int nCa ( ) ;
// Encuentra e l numero de cadenas d e f i n i d a s
int nElemento ( int nC , int nV) ;
// Encuentra e l
numero de e l e m e n t o c o r r e s p o n d i e n t e
int nElemento ( int i d ) ;
//
Encuentra e l numero de e l e m e n t o c o r r e s p o n d i e n t e
int nElementosCadenas ( ) ;
160
72
73
// Encuentra
// Encuentra e l numero de o b j e t o s s i m p l e s
// Regresa e l
n g u l o d e l v i n c u l o s e l e c c i o n a d o de una cadena
74
75
private :
76
77
78
79
80
81
defDH e l e m e n t o [ 2 0 ] ; // D e f i n i c i o n e s DH de l o s e l e m e n t o s
oC o r i g e n [ 2 0 ] ;
// Origen de l a s Cadenas
parF ob [ 1 0 0 ] ;
// O b j e t o s G e n e r a l e s
int nE ;
//Nmero de e l e m e n t o a c t u a l g e n e r a l
inidice irrepetible )
camRot Cam;
// Parmetros de l a cmara v i r t u a l
82
83
84
85
};
#endif
8
9
10
11
12
13
14
15
16
17
18
19
Interprete : : Interprete () {
s a l i d a . p a l a b r a =0;
s a l i d a . dedo =0;
s a l i d a . f a l a n g e =0;
s a l i d a . a n g u l o =0;
s a l i d a . tiempo =0;
s a l i d a . grupo =0;
}
DatosLinea I n t e r p r e t e : : mov( char cadena ) {
int i =0;
// Contador para l a p o s i c i n a c t u a l d e l c u r s o r
25
26
27
int l o n p a l [ 6 ] ; // L o g i t u d de p a l a b r a s en l a l n e a a a n a l i z a r
int j =0;
// Contador de p r o p o s i t o g e n e r a l
int A, B, C ;
char b u f f e r ; // B u f f e r de a n a l i s i s de l i n e a
int p a l a b r a , dedo , f a l a n g e ; // I d e n t i f i c a d o r de l a p a l a b r a
reservada
bool n o d i g=true ;
28
29
30
31
32
33
36
37
38
39
40
41
42
43
44
45
else
46
p a l a b r a = 1;
47
50
51
52
53
54
55
//Numero de c a r a c t e r e s de l a p a l a b r a
{
b u f f e r = ( char ) m a l l o c ( 1 0 0 ) ;
// A s i g n a c i n de
memoria para e l b u f f e r
for ( j =0; j <i ; j ++)
b u f f e r [ j ] = cadena [ j ] ;
// E x t r a c c i n de l a
palabra reservada
b u f f e r [ j ]=0;
i ++;
// S a l t o d e l c a r a c t e r
"("
j = 1;
j = strcmp ( b u f f e r , "mov" ) ;
//En c a s o de que l o
almacenado en b u f f e r s e a mov j s e r 0
j = j ==0?0:1;
// N o r m a l i z a c i o n l o g i c a
de j
p a l a b r a = j ==0?1: 1;
// S i l a comparacion
f u e a t i n a d a e n t o n c e s p a l a b r a s e r e l c a s o de mov
}
35
49
// D e t e c t o r de No d i g i t o
i f ( i <50)
34
48
161
i f ( p a l a b r a ==1)
{
s a l i d a . palabra = 1;
lonpal [ 0 ] = i ;
/ DEDO
/
while ( cadena [ i ] != ' , ' )
{
162
56
57
58
59
60
61
62
63
64
65
66
67
E x t r a c c i n d e l parametro dedo
b u f f e r [ j ] = cadena [ j+l o n p a l [ 0 ] ] ;
b u f f e r [ j ]=0;
//
//
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
j = 1;
j = strcmp ( b u f f e r , " p u l g a r " ) ;
Pulgar
j = j ==0?0:1;
dedo = j ==0?p u l g a r : 0 ;
i f ( j == 1 )
{
j = strcmp ( b u f f e r , " 1 " ) ;
j = j ==0?0:1;
dedo = j ==0?p u l g a r : 0 ;
}
i f ( j == 1 )
{
j = strcmp ( b u f f e r , " i n d i c e " ) ;
Indice
j = j ==0?0:1;
dedo = j ==0? i n d i c e : 0 ;
}
i f ( j == 1 )
{
j = strcmp ( b u f f e r , " 2 " ) ;
j = j ==0?0:1;
dedo = j ==0? i n d i c e : 0 ;
}
i f ( j == 1 )
{
j = strcmp ( b u f f e r , " medio " ) ;
medio
j = j ==0?0:1;
dedo = j ==0?medio : 0 ;
//Dedo
//Dedo
//Dedo
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
}
i f ( j == 1 )
{
j = strcmp ( b u f f e r , " 3 " ) ;
j = j ==0?0:1;
dedo = j ==0?medio : 0 ;
}
i f ( j == 1 )
{
//Dedo
Anular
j = strcmp ( b u f f e r , " a n u l a r " ) ;
j = j ==0?0:1;
dedo = j ==0?a n u l a r : 0 ;
}
i f ( j == 1 )
{
j = strcmp ( b u f f e r , " 4 " ) ;
j = j ==0?0:1;
dedo = j ==0?a n u l a r : 0 ;
}
i f ( j == 1 )
{
j = strcmp ( b u f f e r , " meique " ) ;
//Dedo
Meique
j = j ==0?0:1;
dedo = j ==0?menique : 0 ;
}
i f ( j == 1 )
{
j = strcmp ( b u f f e r , " 5 " ) ;
j = j ==0?0:1;
dedo = j ==0?menique : 0 ;
}
i f ( j ==1)
{
s a l i d a . dedo=1;
}
i ++; // S a l t o d e l c a r a c t e r ' , '
s a l i d a . dedo = dedo ;
/ FALANGE
/
while ( cadena [ i ] != ' , ' )
{
i ++;
i f ( i >255)
163
164
138
139
140
141
142
{
s a l i d a . p a l a b r a = 1;
break ;
}
143
144
145
146
147
148
149
150
151
152
l o n p a l [1]++;
// Se a g r e g a a l a l o n g i t u d de l a p a l a b r a l a " ,"
lonpal [ 2 ] = i lonpal [ 1 ] lonpal [ 0 ] ;
//
// E x t r a c c i n d e l parametro f a l a n g e
b u f f e r [ j ] = cadena [ j+l o n p a l [ 0 ] + l o n p a l [ 1 ] ] ;
b u f f e r [ j ]= 0 ;
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
j = 1;
j = strcmp ( b u f f e r , " p r o x i m a l " ) ;
// Falange Proximal
j = j ==0?0:1;
f a l a n g e = j ==0?p r o x i m a l : 0 ;
i f ( j == 1 )
{
j = strcmp ( b u f f e r , " 1 " ) ;
j = j ==0?0:1;
f a l a n g e = j ==0?p r o x i m a l : 0 ;
}
i f ( j == 1 )
{
j = strcmp ( b u f f e r , " media " ) ;
Falange media
j = j ==0?0:1;
f a l a n g e = j ==0?media : 0 ;
}
i f ( j == 1 )
{
j = strcmp ( b u f f e r , " 2 " ) ;
j = j ==0?0:1;
f a l a n g e = j ==0?media : 0 ;
}
i f ( j == 1 )
{
//
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
165
166
219
220
221
222
223
224
225
226
227
E x t r a c c i n d e l parametro f a l a n g e
b u f f e r [ j ] = cadena [ j+l o n p a l [ 0 ] + l o n p a l [ 1 ] + l o n p a l
[2]];
b u f f e r [ j ]= 0 ;
230
231
232
233
234
// D e t e c c i o n de
d i g i t o s en l o s parametros
{
i f ( ( i s d i g i t ( b u f f e r [ j ] ) | | b u f f e r [ j ]== ' . ' | |
b u f f e r [ j ]== ' ' ) && n o d i g == true )
n o d i g=true ;
else
228
229
//
n o d i g= f a l s e ;
i f ( nodig )
else
s a l i d a . angulo = a t o f ( b u f f e r ) ;
s a l i d a . angulo = 1000000;
//Numero mgico
para a s i g n a r e r r o r de numero i n v a l i d o
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
l o n p a l [3]++;
//
Se a g r e g a a l a l o n g i t u d de l a p a l a b r a l a " ,"
lonpal [ 4 ] = i lonpal [ 3 ] lonpal [ 2 ] lonpal [ 1 ]
lonpal [ 0 ] ;
E x t r a c c i n d e l parametro f a l a n g e
b u f f e r [ j ] = cadena [ j+l o n p a l [ 0 ] + l o n p a l [ 1 ] + l o n p a l
[2]+ lonpal [ 3 ] ] ;
//
167
b u f f e r [ j ]= 0 ;
255
256
257
258
259
260
261
d i g i t o s en l o s parametros
{
i f ( ( i s d i g i t ( b u f f e r [ j ] ) | | b u f f e r [ j ]== ' . ' ) &&
n o d i g == true )
n o d i g=true ;
else
262
263
264
265
266
267
268
// D e t e c c i o n de
n o d i g= f a l s e ;
i f ( nodig )
else
s a l i d a . tiempo = a t o f ( b u f f e r ) ;
s a l i d a . tiempo = 1 0 0 0 0 0 0 ;
//Numero mgico
para a s i g n a r e r r o r de numero i n v a l i d o
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
l o n p a l [4]++;
//
Se a g r e g a a l a l o n g i t u d de l a p a l a b r a l a " ,"
lonpal [ 5 ] = i lonpal [ 4 ] lonpal [ 3 ] lonpal [ 2 ]
lonpal [ 1 ] lonpal [ 0 ] ;
E x t r a c c i n d e l parametro f a l a n g e
b u f f e r [ j ] = cadena [ j+l o n p a l [ 0 ] + l o n p a l [ 1 ] + l o n p a l
[2]+ lonpal [3]+ lonpal [ 4 ] ] ;
b u f f e r [ j ]= 0 ;
//
168
291
292
d i g i t o s en l o s parametros
{
i f ( i s d i g i t ( b u f f e r [ j ] ) && n o d i g == true )
n o d i g=true ;
293
294
295
else
296
297
298
299
301
else
302
303
305
306
307
n o d i g= f a l s e ;
i f ( nodig )
300
304
// D e t e c c i o n de
s a l i d a . grupo = a t o f ( b u f f e r ) ;
s a l i d a . grupo = 1 0 0 0 0 0 0 ;
//Numero mgico
para a s i g n a r e r r o r de numero i n v a l i d o
} else
s a l i d a . p a l a b r a = 1;
f r e e ( b u f f e r ) ; return s a l i d a ; }
308
309
310
311
312
313
314
315
316
317
318
{
nA = a r r e g l o [ i ] ;
nA>nP ? max = nA : max = nP ;
}
return max ; }
319
320
321
322
323
324
// I n i c i a l i z a e l a r r e g l o de d a t o s de Movimiento
325
326
327
328
329
330
331
332
{
dedo [ i ] = 0 ;
falange [ i ]=0;
angulo [ i ]=0;
tiempo [ i ] = 0 ;
grupo [ i ] = 0 ;
}
336
337
338
v a l o r = a t o f ( cadena ) ;
// C o n v i e r t e e l v a l o r l e i d o en un
nmero de punto f l o t a n t e
return v a l o r ;
// Se r e g r e s a e l v a l o r de punto
flotante
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
i f ( Elemento == 0 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = p u l g a r ;
s a l i d a . f a l a n g e = proximal ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
i f ( Elemento == 1 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = p u l g a r ;
s a l i d a . f a l a n g e = media ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
i f ( Elemento == 2 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = p u l g a r ;
salida . falange = distal ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
i f ( Elemento == 3 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = p u l g a r ;
s a l i d a . f a l a n g e = abduccion ;
s a l i d a . a n g u l o = Angulo ;
169
170
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
// I n d i c e
i f ( Elemento == 4 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = i n d i c e ;
s a l i d a . f a l a n g e = proximal ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
i f ( Elemento == 5 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = i n d i c e ;
s a l i d a . f a l a n g e = media ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
i f ( Elemento == 6 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = i n d i c e ;
salida . falange = distal ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
i f ( Elemento == 7 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = i n d i c e ;
s a l i d a . f a l a n g e = abduccion ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
// Medio
i f ( Elemento == 8 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = medio ;
s a l i d a . f a l a n g e = proximal ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
i f ( Elemento == 9 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = medio ;
s a l i d a . f a l a n g e = media ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
i f ( Elemento == 1 0 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = medio ;
salida . falange = distal ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
i f ( Elemento == 1 1 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = medio ;
s a l i d a . f a l a n g e = abduccion ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
// Anular
i f ( Elemento == 1 2 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = a n u l a r ;
s a l i d a . f a l a n g e = proximal ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
i f ( Elemento == 1 3 )
{
s a l i d a . palabra = 1;
171
172
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
s a l i d a . dedo = a n u l a r ;
s a l i d a . f a l a n g e = media ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
i f ( Elemento == 1 4 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = a n u l a r ;
salida . falange = distal ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
i f ( Elemento == 1 5 )
{
s a l i d a . palabra = 1;
s a l i d a . dedo = a n u l a r ;
s a l i d a . f a l a n g e = abduccion ;
s a l i d a . a n g u l o = Angulo ;
s a l i d a . tiempo = 0 ;
s a l i d a . grupo = 0 ;
}
return s a l i d a ; }
B.3.2. Interprete.h
1
2
3
4
5
6
7
8
10
11
12
13
#ifndef I n t e r p r e t e C l a s e _ H
#define I n t e r p r e t e C l a s e _ H
typedef struct {
int
palabra ;
int
dedo ;
int
falange ;
float angulo ;
// I n d i c a l a p a l a b r a r e s e r v a d a
// I n i d i c a e l Dedo a Animar
// I n d i c a l a Falange a Animar
// I n d i c a e l n g u l o f i n a l d e l e l e m e n t o
i n d i c a d o que s e ha de a n c a l z a r
f l o a t tiempo ;
// I n d i c a e l tiempo en que ha de r e a l i z a r e l
movimento
int
grupo ;
// I n d i c a e l grupo de movimiento en e l que s e
hara e l movimiento p o d i e n d o h a c e r movimientos
simuultneos
} DatosLinea ;
// Tipo de d a t o s de que d e f i n e una Linea de
c d i g o de movimiento
173
#define error 1
#define
#define
#define
#define
#define
pulgar
indice
medio
anular
menique
#define
#define
#define
#define
proximal
media
distal
abduccion
#define
#define
#define
#define
MaxProximal
MaxMedia
MaxDistal
MaxAbduccion
90
90
90
25
#define
#define
#define
#define
MinProximal
MinMedia
MinDistal
MinAbduccion
0
0
0
25
4
3
2
1
5
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
1
3
4
2
39
40
41
42
43
44
45
46
47
48
49
50
c l a s s I n t e r p r e t e { public :
Interprete () ;
DatosLinea mov( char cadena ) ;
// Funcion para l a
e x t r a c c i n de i n f o r m a c i n de momiento
int maxgM( int a r r e g l o ) ;
// Regresa e l nmero maximo
de grupo de Movimiento de un a r r e g l o de d a t o s t i p o
DatosLinea
void i n i D a t o s ( int dedo [ nDatos ] , int f a l a n g e [ nDatos ] , f l o a t
a n g u l o [ nDatos ] , f l o a t tiempo [ nDatos ] , int grupo [ nDatos ] ) ;
f l o a t pos ( char cadena ) ; // Funcion d e l D r i v e r que a s i g n a l o s
v a l o r e s de l a s p o s i c i o n e s f i n a l e s en cada i n t e r v a l o de
actualizacin
DatosLinea puente ( int Elemento , f l o a t Angulo ) ; // Genera l a
l i n e a a p a r t i r d e l elemento y e l angulo l e i d o d e l archivo
private :
DatosLinea s a l i d a ;
174
51
52
53
};
#endif
175
176
Apendice
Instalacin de Paquetes
C.1. Instalacin del panel OpenGL a Bulider C++ 5.0
Para obtener el componente se puede obtener en la siguiente direccin de Internet:
http://www.cobweb.net/ dplakosh/components/OpenGLv0.5BCB5.zip
donde una vez que se descargue el archivo se procede a su descompresin lo que generar
dos carpetas, en la carpeta llamada Component se encuentra una serie de archivos
los cuales son el componente en s y la instalacin se hace siguiendo los pasos que a
continuacin se presentan:
1. Dar doble clic en OpenGLPanel_DP.bpk (este abrir el C++ Builder 5.0)
2. En el men Project de la ventana principal dar clic en Build OpenGLPanel_DP
.
3. En la ventana package dar clic en el botn install.
4. Vea que el componente ha sido instalado y presione ok.
5. En el men le seleccione close all les.
6. Responda Yes a la pregunta Save changes to OpenGLPanel_DP.
7. El componente del Panel OpenGL esta ahora instalado.
8. Copie la carpeta del componente al directorio donde se instalo el C++ Builder
(tpicamente es C:/Archivos de programa/Borland/CBuilder5).
9. Ponga sus rutas de para el Include en BCB5 para incluir la ruta de los archivos
fuente del componente. En el men Project - Options d un clic en la pestaa
Directories/Condicionals (Figura C.1) de un clic en los tres puntos de Include
path y en el campo de nueva direccin (Figura C.2) poner:
177
178
Nota: esto funciona teniendo instalado la versin 5 del Borland Builder C++.
179
180
Apendice
Contacto
Para una copia de la aplicacin o cualquier informacin referente a este proyecto dirjase con:
Dr. Marco Antonio Oliver Salazar
Correo Electrnico: moliver@cenidet.edu.mx
Dr. Ral Pinto Elas
Correo Electrnico: rpinto@cenidet.edu.mx
Alberto Ibarra Domnguez
Correo Electrnico: a.ibarra@ieee.org
181
182
APNDICE D. CONTACTO