Desarrollo del prototipo de un brazo captor para la manipulación

Anuncio
PROYECTO INTEGRADOR
CARRERA DE INGENIERÍA MECÁNICA
DESARROLLO DEL PROTOTIPO DE UN BRAZO CAPTOR
PARA LA MANIPULACIÓN REMOTA DE UN BRAZO
ROBÓTICO
Ezequiel Ruiz Nicolini
Ing. Luis Alfredo Rovere
Director
Ing. Enrique Boroni
Co-Director
Instituto Balseiro
Universidad Nacional de Cuyo
Comisión Nacional de Energía Atómica
Argentina
Junio 2012
Contenido
Resumen...........................................................................................................................4
Abstract............................................................................................................................5
Capítulo 1: El Proyecto CAREM...................................................................................6
1.1 Algo de historia.......................................................................................................6
1.2 Características generales .......................................................................................6
1.3 Características técnicas...........................................................................................7
Capítulo 2: La utilización de un robot en el Proyecto CAREM..................................9
2.1 Los generadores de vapor : tareas de inspección....................................................9
2.2 El robot a utilizar: características generales..........................................................10
Capítulo 3: Sobre el control del robot. Objetivos generales del grupo de Robótica14
3.1 Propuesta de manipulador.....................................................................................14
3.2 Primeros objetivos................................................................................................14
Capítulo 4: Sobre los objetivos específicos de este proyecto integrador...................16
4.1 Propuesta: Realización de un primer prototipo ....................................................16
4.2 Primeras consideraciones .....................................................................................16
4.3 El desarrollo de esta tesis......................................................................................18
4.4 Las herramientas a utilizar....................................................................................19
Capítulo 5: Diseño y fabricación del prototipo...........................................................21
5.1 Sensores disponibles.............................................................................................21
5.2 Dimensiones generales..........................................................................................22
5.3 Materiales..............................................................................................................22
5.4 Articulaciones.......................................................................................................22
5.5 Equilibrio indiferente............................................................................................23
5.6 Geometrías de eslabones y contrapesos................................................................25
5.7 Diseño final del prototipo y fabricación...............................................................27
5.8 Balanceo ...............................................................................................................27
Capítulo 6: Generación del modelo virtual ................................................................29
6.1 Sobre cuerpos y geometrías..................................................................................29
6.2 Vínculos................................................................................................................29
6.3 Detección de colisiones.........................................................................................30
6.4 Funciones Callback ..............................................................................................30
6.5 Adquisición de datos.............................................................................................30
2
6.6 Representación gráfica..........................................................................................31
6.7 Esquema del código utilizado...............................................................................32
Capítulo 7: Desarrollo e implementación de la electrónica.......................................34
7.1 Comunicación PC- Arduino.................................................................................34
7.2 Arduino: adquisición de datos de los encoders....................................................35
Capítulo 8: Resultados y propuestas............................................................................39
8.1 Propuestas para encarar en el futuro.....................................................................41
Apéndice A: Planos constructivos del prototipo diseñado y fabricado.....................43
Apéndice B: Códigos de programación desarrollados...............................................56
B.1 Código desarrollado para implementar la simulación utilizando las librerías ODE y
Drawstuff....................................................................................................................56
B.2 Código desarrollado para realizar la comunicación a través de un puerto USB
entre la PC que ejecutara la simulación y la placa Arduino........................................60
B.3 Código de la función implementada para la creación y configuración de cuerpos, geometrías
y vínculos dentro de la simulación realizada con las librerías ODE y Drawstuff......62
Referencias.....................................................................................................................63
Agradecimientos............................................................................................................64
3
Resumen
Para la realización de tareas no rutinarias que involucren la operación de un brazo robótico
industrial, para las cuales no es posible programar en forma exacta los movimientos que se deben
realizar, se vuelve necesario contar con un dispositivo que permita el control manual del equipo.
Los robots adquiridos por el Proyecto CAREM para inspeccionar los generadores de vapor y
el recipiente de presión de la central nuclear no poseen un sistema de telecontrol manual. La única
alternativa de que se dispone es la manipulación individual de cada grado de libertad mediante un
control a botonera, lo que convierte cada tarea en un proceso lento y de alta complejidad. Por ese
motivo se planteó desarrollar un brazo-sensor articulado, de topología similar a la del brazo
industrial disponible pero en escala compatible con las dimensiones de un brazo humano, que sea
capaz de codificar y transmitir al sistema de control del robot los movimientos que le imponga un
operador.
En este trabajo se pretendía dar los primeros pasos para abordar el diseño de ese dispositivo.
Para ganar experiencia sobre los aspectos (tanto mecánicos como electrónicos) del diseño, se
propuso la realización de un primer prototipo funcional que fuera capaz de manipular un modelo
virtual del robot. El proceso se desarrolló en tres grandes etapas: el diseño mecánico y la
fabricación del manipulador, la generación del modelo virtual del robot, y el desarrollo y la
implementación de la electrónica asociada al prototipo.
Completadas las tres etapas se ensambló el lazo completo y se realizaron pruebas de su
funcionamiento. Se sacaron algunas conclusiones sobre el diseño mecánico del dispositivo y sobre
la electrónica utilizada. Finalmente, se hicieron recomendaciones para optimizar el diseño y
propuestas para la continuidad de la línea de trabajo propuesta.
Palabras clave: CAREM, manipulador, robot, brazo, tele manipulación
4
Abstract
For non-routine tasks involving the operation of an industrial robotic arm that cannot be
programmed to perform the required movements, the use of a device for manual control of the
equipment becomes necessary
Robots acquired by Proyecto CAREM for inspection tasks in the steam generators and pressure
vessel of the nuclear plant, do not have a manual tele-control system. The only alternative available
is the individual handling of each degree of freedom with a keypad control, making each task a slow
and highly complex process. It was raised to develop an articulated sensor arm which topology
would be similar to the available industrial arm, but compatible with the dimensions of a human
arm. It should be able to encode and transmit to the robot’s control system, the movements that an
operator imposes
This study aimed to take the first steps to start with the design of this device. To gain experience on
the design issues (both mechanical and electronic) it was proposed to build a first functional
prototype that would be able to manipulate a virtual model of the robot. The process consisted on
three stages: the mechanical design and manufacture of the manipulator, the creation of the virtual
model of the robot, and the development and implementation of the electronics associated with the
prototype.
Once the three stages were completed the hole loop was assembled and tested for operation. This
led to some conclusions about the mechanical design of the device and it’s electronics. Finally,
recommendations to optimize the design and proposals for the future development of this study
were made.
Key words: CAREM, manipulator, robot, arm, telecontrol
5
Capítulo 1: El Proyecto CAREM[1]
1.1 Algo de historia
A principios de la década de 1980 -y buscando aprovechar la experiencia recogida a través
de los reactores de investigación y las centrales Atucha I y Embalse- la Comisión Nacional de
Energía Atómica (CNEA) decidió avanzar sobre el primer diseño de un reactor nuclear de potencia
propio. En 1984 presentó oficialmente el proyecto CAREM (Central Argentina de Elementos
Modulares) en una conferencia del Organismo Internacional de Energía Atómica (OIEA) sobre
pequeños y medianos reactores, que se realizó en la ciudad de Lima, Perú.
Desde entonces, en ciertos períodos con más ritmo que en otros, el proyecto fue
desarrollándose. Con participación de la empresa rionegrina INVAP se diseñaron y construyeron
varias instalaciones de soporte al diseño. También se avanzó con actividades de desarrollo y
modelado. Hacia el año 2002 el CAREM fue seleccionado -entre más de 100 presentaciones
internacionales- como “proyecto viable” en la publicación de un reporte del “Generation IV
International Forum”. Se destacó especialmente en aspectos de seguridad y de rentabilidad
económica. Cuatro años más tarde, mediante un Decreto del Poder Ejecutivo Nacional, se declaró
de Interés Nacional “la construcción y puesta en marcha del Prototipo de Reactor CAREM para la
generación nucleoeléctrica de energía”
En 2008 CNEA ya había creado la Gerencia CAREM y se resolvió que dependiera
directamente de la Presidencia de la entidad. Se inició entonces un proceso de recuperación y
clasificación de la información de ingeniería; se identificaron grupos técnicos de CNEA, se contrató
el personal necesario para completar especialidades y se concretó el primer costeo del reactor.
Además, se establecieron cronogramas y se reformuló el Plan de Gastos e Inversiones. En paralelo
se llevaba adelante una importante recuperación general de actividades asociadas a la CNEA: el
enriquecimiento de uranio; la producción de radioisótopos y otros desarrollos en medicina nuclear,
y actividades de exploración y minería.
En 2009 el Congreso Nacional sancionó la Ley N°26.566 que declara “de interés nacional”
el Prototipo de Reactor CAREM (llamado hoy CAREM25) y “encomienda a la CNEA el diseño,
ejecución y puesta en marcha.
1.2 Características generales
Como se mencionó, la puesta en servicio del prototipo CAREM25 significará tener en
6
operación la primera central nuclear de potencia íntegramente diseñada y construida en el país.
Además, permitirá reafirmar a la Argentina su capacidad para desarrollar y poner en marcha
centrales nucleares, y la perfilará como uno de los líderes mundiales en el segmento de reactores de
baja y media potencia, qué tienen gran proyección para el abastecimiento eléctrico de zonas
alejadas de los grandes centros urbanos o polos fabriles con alto consumo de energía.
Actualmente, en la ciudad de Lima (provincia de Buenos Aires), ya se encuentran avanzadas
las obras de infraestructura del predio donde se emplazará el reactor. Este generará una potencia de
25MW eléctricos. Está previsto que al menos el 70% de los insumos, los componentes y los
servicios vinculados a las centrales CAREM sean provistos por empresas nacionales seleccionadas
según estándares internacionales de calidad.
1.3 Características técnicas
Por algunos de sus rasgos principales, el CAREM podría considerarse una central de tercera
generación (una evolución de los reactores llamados PWR -Reactor de Agua Presurizada, en
inglés). Estas características son las siguientes:
1. la utilización de recipiente de presión
2. el uso como combustible de uranio levemente enriquecido
3. la refrigeración y la moderación por medio de agua liviana
4. el doble circuito de refrigeración
5. el control de la potencia térmica mediante el empleo de barras de absorción
Sin embargo, en el diseño de CAREM se incluyeron elementos innovadores que lo colocan
en una categoría superior, la de reactores de cuarta generación, como por ejemplo, los siguientes:
1. La refrigeración del núcleo estableciendo un circuito primario gobernado por el fenómeno
de convección natural
2. la integración de todo el circuito primario, parte del secundario (generadores de vapor) y
mecanismos de control en un solo recipiente de presión auto presurizado. Esta característica
minimiza la posibilidad de accidentes severos por pérdida de refrigerante. En la Figura 1.1
se esquematizan un PWR típico y el diseño del CAREM.
7
FIGURA 1.1 En la imagen de la izquierda se representan los componentes más importantes de un PWR típico. A la
derecha se muestra un esquema del CAREM, se ve la integración de sus componentes y lo compacto del sistema.
3. la utilización de sistemas pasivos de seguridad. Es decir, mecanismos que no requieren la
acción de un operador ni mecanismos adicionales porque son activados por leyes físicas.
Estas características hacen del CAREM un sistema considerablemente más compacto,
elimina la necesidad de bombas y otros dispositivos externos, y disminuye la cantidad y el tamaño
de cañerías del sistema, convirtiéndolo en un reactor de diseño simple y seguro. Además es de
construcción sencilla en planta, dado que la mayoría de los componentes son ensamblados en
fábrica .
8
Capítulo 2: La utilización de un robot en el Proyecto CAREM
En este capítulo se explica de manera somera la razón por la cuál se utiliza un robot en el
marco del Proyecto CAREM. Para información más detallada se puede consultar [2].
2.1 Los generadores de vapor (GV): tareas de inspección
Como se mencionó en el Capítulo 1, el prototipo CAREM25 tiene los GV (componentes
del circuito secundario) integrados dentro del recipiente de presión. En total son 12 y están
distribuidos angularmente de manera uniforme y ubicados junto a la pared del recipiente. Como se
esquematiza en la Figura 2.1, cuentan con pequeños tubos que sobresalen hacia el exterior del
recipiente y se acoplan con la el resto del circuito secundario mediante conexiones bridadas.
Camisa tubos
Ingreso
agua
Primario
Vapor
Condensado
Carcasa
externa
Salida agua
Primario
FIGURA 2.1 La imagen de la izquierda muestra el exterior recipiente de presión del CAREM, se pueden observar las
bridas de los GV distribuidas angularmente. En la imagen del centro se representa un corte del mismo recipiente. Se
observan algunos componentes en el interior del mismo, entre ellos las carcasas de dos GV. En la imagen de la derecha
se esquematiza un GV. Sus tubos descienden rectos y ascienden adoptando una forma helicoidal.
Cada GV está constituido por 52 tubos de Inconel 690 que en un primer tramo transportan
agua (“condensado”) proveniente del condensador del secundario. Ésta, tomará calor del
refrigerante del primario y saldrá de los GV en forma de vapor. Tanto el ingreso de condensado
como el egreso de vapor se hacen a través de una placa tubo cilíndrica que reúne los flujos de
ingreso en su región central y los de egreso en su periferia. Los tubos se encuentran en el interior de
una carcasa, y el conjunto ofrece la posibilidad de, eventualmente, ser extraído para tareas de
mantenimiento.
Los tubos están diseñados para una presión interna de 7,8MPa y una presión externa de
9
14,5MPa. Una eventual falla estructural provocaría, al menos, el ingreso de agua del circuito
primario al secundario. Esta situación podría llevar aparejada una parada completa (no programada
y de una importante extensión en el tiempo) de la operación para reparar el conjunto GV que
hubiera fallado. Por este motivo se requiere un monitoreo periódico, durante paradas programadas,
de la integridad estructural de los tubos para la detección de corrosión, adelgazamientos de sus
paredes, etc. En caso de detectarse algún tipo de inconveniente, los tubos son taponados para
sacarlos de servicio. De esta forma, solo será necesario extraer el conjunto GV y repararlo cuando
se exceda un cierto número máximo de tubos fuera de servicio.
La evaluación del estado de los tubos se realiza introduciendo sondas comerciales diseñadas
para este propósito. Éstas basan su funcionamiento en el fenómeno de corrientes parásitas o de
Foucault. En síntesis, la tarea de inspección consiste en desajustar las bridas externas de cada GV,
abrirlas, insertar la sonda en cada tubo para realizar el monitoreo, retirar la sonda, cerrar y ajustar la
brida.
Se decidió automatizar esta tarea, porque otorgaba las siguientes ventajas:
1. gran reducción en los tiempos de sondeo y tiempos de exposición de operarios.
2. eliminación de errores humanos en la inspección
3. sistematización de la tarea y seguimiento más adecuado del procedimiento
A partir de esta decisión y debido a algunos requerimientos básicos de diseño para el sistema
automático (detallados en [2]), se optó por utilizar un robot comercial articulado (de 6 ejes)
montado en un carro que lo traslade sobre un riel y lo ubique en posiciones estratégicas para la
realización de sus tareas.
2.2 El robot a utilizar: características generales
Entre los aspectos que se tuvieron en cuenta para la elección del robot, se explican
brevemente los siguientes:
1. cargas a soportar. Las tareas de inspección que deben efectuarse en los GV no exigen que
el robot soporte cargas muy significativas. Las masas de los equipos a manipular son
inferiores a una pocas decenas de kilogramos.
2. limitaciones geométricas. Este aspecto fue bastante determinante en la elección dado que
las tareas deben realizarse en espacio reducidos y con obstáculos. La interferencia con
dichos obstáculos es inadmisible. La altura de las bridas respecto del nivel del piso es de
10
aproximadamente 1,60m. Además, el recipiente de presión estará rodeado de columnas. La
distancia entre el exterior de las columnas (donde se posicionaría el robot) y las bridas se
aproxima también a 1,60m. En la Figura 3.2 se muestra un modelo simplificado del entorno
de trabajo del robot.
FIGURA 3,2 Se muestra un modelo simplificado del entorno de trabajo del robot. En el centro se observa el recipiente
y, a su alrededor, un conjunto de columnas detrás de las cuáles se debe posicionar al robot.
3. soporte comercial del fabricante en Argentina. Esta variable fue muy tenida en cuenta a
la hora de elegir el proveedor del robot. La empresa KUKA cuenta con muchas facilidades
en relación con este tema.
Después de analizar estos y otros puntos, y de realizar algunas comparaciones entre distintos
modelos, el Proyecto CAREM optó por utilizar el robot KUKA modelo KR 500 L340-2 (Figura
3.3).
11
FIGURA 2.2 Imagen del modelo KUKA adquirido por Proyecto CAREM. A la derecha se esquematizan las
dimensiones generales del robot. Para el modelo KR 500 L340-2: A=3621, B=4297, C=3076, D=1856, E=1220,
F=1612 y G=1275.
Algunas de sus características son:
Cargas
Carga útil nominal:
Carga máx. total:
340kg
840kg
Zona de trabajo
Máx. Alcance:
3326mm
Otros datos
Número de ejes:
Repetitibilidad <
Peso: 2385kg
Posición de montaje:
Unidad de control:
6
±0,08mm
Suelo
KR C2
Como casi todos los equipos de este tipo, admite una relativamente sencilla programación de
tareas y movimientos, inclusive en el caso de procedimientos complejos. Sin embargo, es de gran
importancia, en el marco de este trabajo, destacar que la única posibilidad de operación manual de
12
los robots adquiridos es manejando individualmente cada grado de libertad mediante un control a
botonera.
13
Capítulo 3: Sobre el control del robot. Objetivos generales del
grupo de Robótica
Pese a que las tareas y movimientos rutinarios del robot son fácilmente programables, es
preciso contar con una forma de control adecuada de dichos movimientos para los casos en los que
sea necesario realizar tareas o desplazamientos diferentes a los habituales y que requieran ser
realizados manualmente. Si bien, como se mencionó, se dispone de un control a botonera para
manejar individualmente cada grado de libertad (GDL), la tarea se vuelve altamente compleja y
muy lenta debido al elevado número de GDL. Ello ha motivado el interés en desarrollar una forma
de control más rápida y simple para el operador.
3.1 Propuesta de manipulador
Como alternativa de control manual del brazo robótico, se busca desarrollar un brazo
articulado de topología similar al modelo KUKA, en escala compatible con las dimensiones de un
operador humano, que sirva de manipulador remoto del brazo industrial. Se pretende que tenga un
diseño ergonómico y que sea de operación sencilla.
Dado que el KUKA se encontrará en un entorno físico complejo, se debe limitar su campo
de trabajo manteniéndolo a distancia segura de columnas, tuberías, componentes del reactor, etc.
Para ello, el operador encargado de su manipulación debe recibir algún tipo de información sobre la
posición relativa del robot y de los obstáculos. Se plantea, como idea inicial, que el manipulador
cuente con mecanismos de retroalimentación de fuerzas. Es decir, establecido el campo de trabajo
permitido para el KUKA, lograr -por medio de algoritmos de control y sensado de posiciones- que
el manipulador “se oponga” a movimientos inducidos por el operador que impliquen aproximarse
más de lo permitido a un obstáculo (o, lo que es lo mismo, que se resista a salir del campo de
trabajo permitido ejerciendo una fuerza contraria a la del operador).
3.2 Primeros objetivos
Se mencionaron dos características que se buscan otorgar al manipulador del brazo robótico
industrial: Sensado y retroalimentación de fuerzas. En primera instancia, se planteó avanzar en
paralelo con el desarrollo de ambas. Por un lado, dar los primeros pasos para realizar el diseño
conceptual de lo que sería el brazo manipulador, incluyendo la parte de sensado y adquisición de
datos. En este aspecto se centra el presente trabajo y es lo que se desarrolla en adelante y hasta el
14
final del mismo.
Por otro lado, se pretende determinar la factibilidad de aplicar la retroalimentación de
fuerzas y, si fuera posible, avanzar con su desarrollo. Este aspectoes excede a este trabajo, pero se
lleva a cabo en forma paralela dentro del Proyecto CAREM. Se busca que en el futuro se conjugen
ambos desarrollos en un único prototipo.
15
Capítulo 4: Sobre los objetivos específicos de este proyecto
integrador
Habiéndose descripto el marco, las necesidades y los objetivos generales que motivan el
presente trabajo, se detallarán los objetivos específicos del proyecto y cómo se buscó avanzar sobre
ellos.
4.1 Propuesta: Realización de un primer prototipo
Cómo se mencionó en el Capítulo 3, en este proyecto se pretendía realizar los primeros
avances y sacar conclusiones sobre el diseño mecánico conceptual del dispositivo manipulador. Se
buscaba también, abordar el problema de la adquisición y procesamiento de datos recogidos de
sensores. Para conjugar ambas pretensiones se propuso, en primera instancia, realizar la fabricación,
montaje y caracterización de un primer prototipo, de diseño sencillo y económico, que permitiera
recoger información y experiencia sobre los aspectos de diseño y, paralelamente, abordar la
implementación de la electrónica asociada al manipulador.
4.2 Primeras consideraciones
Grados de libertad
Buscando no complicar demasiado el prototipo, pero sí lograr el desarrollo suficiente para
que fuera fácilmente extendible a uno de 6 GDL, se optó por diseñarlo con 3 GDL. Estos definirían
3 coordenadas que permitirían posicionar, pero no orientar. el extremo del robot en un punto de su
espacio de trabajo. De manera semejante, una persona puede mover su brazo para cambiar la
posición de su mano pero, si mantiene su muñeca inmóvil respecto de su brazo, evita modificar la
orientación de su mano. En la Figura 4.1 se muestra un esquema para comprender este concepto
con más facilidad.
16
S
Z'
Z
S
S'
Z'
Z
S'
Y'
X'
Y'
O'
X'
c
O
X
O'
Y
a
b
O
X
c
Y
a
b
FIGURA 4.1 En ambas imágenes, el sistema coordenado S' se encuentra posicionado en el mismo punto del espacio, de
coordenadas (a,b,c). Sin embargo, se observa que el sistema S' tiene orientaciones relativas diferente en un caso y en el
otro.
Configuración
Por facilidad de diseño y fabricación, y por la forma particular del robot, se optó por utilizar
una configuración denominada antropomórfica (Figura 4.2). Lleva ese nombre por simular los
movimientos de un brazo humano.
Articulación 2
Articulación 3
Articulación 1
FIGURA 4.2 Configuración angular o antropomórfica. Se esquematizan las rotaciones permitidas por las
articulaciones.
Dicha configuración presenta tres articulaciones: la primera (Articulación 1) simularía el
giro de la cintura, rotando respecto de un eje vertical. La segunda (Articulación 2) y la tercera
(Articulación 3) -de rotación respecto de ejes paralelos entre sí y horizontales- corresponderían al
hombro y al codo humanos. Esta configuración aporta accesibilidad y facilidad de maniobra.
En adelante, llamaremos Eslabón 1, Eslabón 2 y Eslabón 3 a las barras que representarían el
torso, brazo y antebrazo humano respectivamente.
17
Sensores
Existen distintos sensores de desplazamiento angular relativo. Entre los más utilizados se
encuentran los potenciómetros, los encoders y los resolvers. Las prestaciones de los potenciómetro
son bastante más pobres que la de los dos. Encoders y resolvers son más sofisticados. La diferencia
fundamental entre uno y otro radica en el tipo de señal que entregan a la salida. La de los encoders
es del tipo digital mientras que la de los resolvers es analógica. Tradicionalmente, se ha considerado
al resolver más robusto desde el punto de vista mecánico, pero sensible a introducir errores por
presencia de señales electromagnéticas en su entorno. A su vez el encoder suele ser más sensible
desde el punto de vista mecánico pero a su vez más preciso.
Porque ofrecían prestaciones suficientes para lo que se deseaba hacer y por una cuestión de
disponibilidad, se optó por la utilización de encoders absolutos para esta tarea. Se llaman absolutos
porque codifican y trasmiten directamente la posición angular de su eje rotante, a diferencia de los
denominados incrementales, que, simplemente envían un tren de pulsos de frecuencia variable,
dependiente de la velocidad de rotación de su eje. Para determinar una posición angular con los
incrementales se debe llevar la cuenta de cuántos pulsos fueron enviados desde que el eje paso por
una posición conocida. En el capítulo siguiente se expondrán con más detalle las características de
los encoders a utilizar.
Implementación de la electrónica
Como se mencionó, se busca dar los primeros pasos en la implementación de la electrónica
asociada al manipulador. Para acotar un poco -por motivos de tiempo- los objetivos en esa
dirección, se eligió que el procesamiento de los datos adquiridos se utilizara para manipular un
modelo virtual de un robot similar al KUKA. Más adelante se darán detalles de como se realizó
dicho modelo; por ahora, lo importante es entender que, de esta manera, el trabajo se centra solo en
el manipulador. Se evita, de esta forma, estudiar todo el sistema de control del KUKA dejando
dicha tarea pendiente para un trabajo complementario a este proyecto integrador.
4.3 El desarrollo de esta tesis
En esta sección se sintetiza lo que se había propuesto desarrollar a lo largo del trabajo:
•
elección y aprendizaje de las herramientas a utilizar (Software, Hardware, etc.)
•
diseño y fabricación del prototipo
•
generación de un modelo virtual.
18
•
desarrollo e implementación de la electrónica necesaria
•
armado del lazo completo. (Figura 4.3)
•
caracterización y recolección de información para la definición de aspectos de diseño.
Propuestas para el futuro.
1
2
3
FIGURA 4.3 Se esquematiza el lazo que conforma el prototipo. 1)Manipulador 2) Sistema electrónico de adquisición
3) Utilización de datos para alimentar la simulación física y representación gráfica de la misma.
4.4 Las herramientas a utilizar
Existe una gran variedad de herramientas en las cuales resulta muy práctico apoyarse para
realizar tareas como las que se buscó llevar a cabo. A continuación se explicará brevemente cuáles y
porqué se eligieron.
Para el diseño: CATIA [3]
Es un software de diseño mecánico, basado en “elementos”, muy robusto y poderoso.
Concretamente, un documento de CATIA se compone de elementos que se van agregando; pueden
ser orificios, empalmes, sólidos extruidos o de revolución, etc. A medida que estos se crean, son
aplicados directamente a la pieza de trabajo.
El diseño se basa en el modelado de sólidos, un tipo de modelado geométrico muy
completo. Contiene todas las aristas y superficies necesarias para describir completamente los
bordes y caras de un modelo. Además, trasmite la topología del objeto, relacionando las distintas
geometrías entre sí. Por ejemplo, el software identifica qué caras (superficies) se encuentran con
cuáles bordes (curvas), otorgando simplicidad a la incorporación de nuevos elementos y a la hora de
referenciar objetos.
Una características importante que posee es que trabaja en forma paramétrica para crear los
distintas partes que conformarán el elemento diseñado. Es decir, para construir una parte recibe
parámetros. Éstos pueden eventualmente ser modificados y el objeto final se actualizará
automáticamente. Por ejemplo: Al construir un cilindro recibirá y guardará los parámetros radio y
19
altura. Si alguno es redefinido posteriormente, el cilindro se modificará. Esta característica otorga
mucha flexibilidad al diseñador.
Esta herramienta otorga un gran número de facilidades al usuario. Se eligió para ser
utilizada en todo el Proyecto CAREM, y en este trabajo se buscó aprender a utilizarla y
aprovecharla como soporte para el diseño del prototipo.
Para la simulación y representación gráfica : ODE + Drawstuff [4]
El nombre ODE proviene de la sigla en inglés para “Open Dynamics Engine”. Su creador
(Russel Smith) lo define como una librería de alto rendimiento, de código abierto, para realizar
simulaciones dinámicas de cuerpos rígidos. Es independiente de la plataforma en la cual se trabaja y
fácilmente programable en lenguaje C/C++. Entre otras facilidades, incorpora en las simulaciones
uniones/articulaciones avanzadas y detección de colisiones con fricción, características sumamente
útiles en el marco de este proyecto.
Drawstuff es una librería dedicada al renderizado de objetos tridimensionales simples en un
entorno virtual. Mediante su utilización se buscó realizar las demostraciones gráficas de las
simulaciones llevadas a cabo con ODE. Se eligieron estas herramientas por ser de uso libre y
fácilmente adaptables en la etapa de adquisición-transmisión de datos.
Para la electrónica asociada : placa Arduino UNO [5]
Es un pequeño sistema embebido basado en el microcontrolador ATmega 328, del fabricante
Atmel. Hay creadas numerosas librerías de código abierto para ser utilizadas con esta placa, que
permiten programar el microcontrolador de manera sencilla. Se usa comúnmente como una placa
experimental, ya que, una vez probado el funcionamiento de la electrónica, es relativamente
sencillo migrarla a una placa desarrollada para realizar una tarea específica. Se la eligió por las
facilidades que aporta, porque todas las librerías existentes son abiertas y por contar con un
microcontrolador ya estudiado por ciertos grupos de la CNEA que, eventualmente, pueden servir de
soporte.
20
Capítulo 5: Diseño y fabricación del prototipo
El primer paso para abordar el diseño fue familiarizarse con CATIA. Se invirtió una
considerable cantidad de tiempo en la realización de ejercicios que permitieran aprender a utilizar
las funciones del software que iban a ser necesarias. Habiéndose hecho el primer contacto con esta
herramienta, se establecieron las primeras pautas que era necesario tener en cuenta para avanzar
con el diseño:
5.1 Sensores disponibles
Como se adelantó en el Capítulo 4, la disponibilidad y las buenas prestaciones fueron los
principales motivos de la elección de los sensores. De los accesibles en el laboratorio de Robótica
se seleccionaron para este proyecto tres encoders del tipo absoluto, del fabricante NEMICON
(modelo ASC-SP). Para el diseño era importante conocer algunas de sus características:
dimensiones, peso, torque y tipo de eje, entre otras. A continuación se presenta información más
detallada de los sensores.
En la Figura 5.1 se muestran las dimensiones externas del encoder. Se trata de un sensor de
eje saliente con un torque de arranque menor a 0.0098Nm (aproximadamente 10 -3kgm). Tiene una
masa menor a 0.25kg -sin considerar el cable-. Determina la posición angular del eje con una
resolución de 10 bits (1 en 1024 cuentas) y la codifica en Gray con lógica negativa, con salidas
200
paralelas.
FIGURA 5.1 Dimensiones externas del encoder ASC-SP (NEMICON), obtenidas de la hoja de datos del fabricante.
21
5.2 Dimensiones generales
El siguiente paso fue establecer un criterio para definir las distancias entre las articulaciones
del prototipo. Se decidió, en primera instancia, respetar las proporciones originales del KUKA pero
en una escala menor, compatible con las dimensiones de un brazo humano. Se eligió un factor de
escala (F.E.) de manera que la distancia entre la segunda articulación (hombro) y el extremo del
prototipo (mano) fuera algo menor a la longitud de un brazo humano promedio (680mm a 720mm).
De esta manera se determinaron las distancias hombro-codo (Dh-c) y codo-mano (Dc-m) del prototipo,
y se obtuvieron 325mm y 340mm respectivamente (F.E. ~ 4.7).
5.3 Materiales
La fabricación del prototipo iba a estar a cargo del taller de electromecánica del Centro
Atómico Bariloche (CAB). Para agilizarla se decidió seleccionar materiales entre los que
habitualmente dispone dicho taller.
Más adelante se describirá la necesidad del uso de contrapesos en el diseño; ahora es
importante notar que para minimizarlos se decidió elegir, para los eslabones, un material resistente
pero no demasiado pesado. Se optó por una aleación de aluminio de la serie 2000 (duraluminio). Se
consideraron diferentes opciones en cuánto a su forma. Se planteó la eventual utilización de perfiles
estructurales (Tipo U, Tipo L y cilíndricos), de caños estructurales de distintas formas y tamaños, y
de placas de espesores variados. Finalmente, y principalmente por cuestiones de disponibilidad y
simplicidad en el diseño y en la fabricación, se optó por utilizar placas, en su gran mayoría de 5mm
de espesor. Esta dimensión otorgaba suficiente rigidez y resultaba cómoda para la realización de los
asientos de los sensores.
Era preciso definir qué material se usaría para realizar los ejes de rotación, que debían
contar con roscas para incorporar tuercas. Se descartó el aluminio pues suele presentar problemas
de atascamientos de tuercas, debido a la dificultad de realizar en él roscas de buena calidad. Como
alternativa se utilizaron dos ejes de bronce (fácilmente mecanizable) y uno de acero. Éste último, de
mayor tamaño, fue construido en acero porque iba a presentar mayores solicitaciones mecánicas.
5.4 Articulaciones
A continuación se debía definir el diseño de las articulaciones. Se pretendía que los
movimientos provocados por el operario sean suaves, sin sobresaltos o aceleraciones discontinuas.
Para ello se buscó minimizar el rozamiento en las articulaciones mediante la utilización de
22
rodamientos en los vínculos entre eslabones. Se buscaron rodamientos para los cuales la relación
entre su espesor y el diámetro de su pista interna fuera reducida. Es decir, se pretendía que tengan
un espesor reducido, lo que permitiría utilizar menor cantidad de placas de aluminio para realizar su
alojamiento pero, a su vez, se buscaba no disminuir demasiado el diámetro del eje de rotación para
no perder rigidez. Se seleccionaron a partir de catálogos de fabricantes que tuvieran proveedores en
la ciudad de San Carlos de Bariloche. Se eligieron dos del fabricante SKF [6] (modelo 6002-Z) y el
restante, del fabricante NSK [7] (modelo 6906ZZ). Se decidió utilizar el modelo NSK, de diámetro
de pista interna mayor, en la articulación más solicitada: la de rotación respecto del eje vertical.
Era necesario establecer la manera de incorporar los sensores. Considérese que, utilizando
los encoders seleccionados, se desea medir la rotación relativa entre dos eslabones consecutivos del
prototipo. Ello requiere que uno de los eslabones (en contacto con la pista externa del rodamiento)
sea solidario al cuerpo/carcasa del encoder y que el otro lo sea al eje de rotación de la
correspondiente articulación. Este eje estará en contacto con la pista interna del rodamiento
correspondiente, y estará alineado y acoplado al eje del encoder. Se esquematiza esta idea en la
Figura 5.2 y se presenta en detalle en los planos constructivos (Apéndice A).
Eslabón 2
Eslabón 3
Carcaza de
Encoder
(solidaria a Eslabón 3)
Eje a acoplar con
eje de encoder
(encastra en pista
interna del rodamiento)
Eje a acoplar con
eje de Eslabón 2
Rodamiento
FIGURA 5.2 Se muestra el diseño de las articulaciones. En este caso el Eslabón 3 es solidario al cuerpo del Encoder. El
eje del Eslabón 2 debe atravesar el rodamiento, haciendo contacto con su pista interna, para acoplarse al eje del encoder.
5.5 Equilibrio indiferente
Otra característica que se pretendía lograr en el prototipo era que, en todo momento y
siempre que no se lo este operando, se encuentre en equilibrio estático indiferente. Esto quiere decir
que, sin importar la posición/orientación de ninguno de los eslabones, las fuerzas actuantes sobre el
prototipo fueran tales que los momentos resultantes, tomados respecto de cualquiera de los tres ejes
de rotación, siempre fueran nulos. A continuación se hará un breve análisis teórico de una forma de
23
abordar este requerimiento.
Establecida la configuración antropomórfica para el brazo articulado y asumiendo que la
rotación permitida por la primera articulación se realiza respecto de un eje perfectamente vertical,
es claro que, al no imponer fuerzas externas para la operación (solo hay presente fuerzas verticales
debidas a pesos propios), el torque respecto a dicho eje es siempre cero.
En cambio, los ejes correspondientes al hombro y al codo del prototipo poseen movimientos
rotacionales respecto de ejes horizontales. Esto implica que los pesos propios de los eslabones son
capaces de generar momentos distintos de cero respecto de dichos ejes, en función de las posiciones
adoptadas por los eslabones y de la ubicación de sus centros de masa (CM). Sin embargo, existen
posiciones particulares de los CM para las cuales todo el sistema se mantiene en equilibrio
indiferente.
Considérese, en primera instancia, el Eslabón 3. Si su CM coincidiera con su eje de
rotación, la línea de acción del peso propio del eslabón lo haría también (por definición) y el
momento respecto de dicho eje siempre sería nulo.
Considérese ahora el eje sobre el cuál gira el Eslabón 2. Al determinar el torque respecto de
este hay que considerar, no sólo que el Eslabón 2 tiene peso propio, sino que también soporta el
peso del Eslabón 3 en su extremo. En este caso, para anular el momento respecto del eje
mencionado, el CM del sistema compuesto Eslabón 2+Eslabón 3 debe ser coincidente con dicho
eje.
En la práctica no es tan sencillo “decidir” donde ubicar los CM. Éstos son más bien una
herramienta teórica para simplificar ciertos análisis de dinámica de cuerpos rígidos. Además los
materiales nunca son perfectamente homogéneos y los sistemas completos suelen ser el resultado de
la unión de varios componente, posiblemente de distintos materiales. De todas formas, el análisis
realizado tiene su utilidad cuándo uno lo plantea sobre el sistema real. En particular, si bien en el
prototipo se utilizan rodamientos para reducir el rozamiento, éste no se anula por completo. Para
provocar la rotación siempre se debe vencer cierto torque (torque de arranque), por más pequeño
que sea. A este hay que sumarle el torque de arranque del encoder acoplado (que también es muy
pequeño). Como se explicó, no es trivial ubicar el CM en una posición; sin embargo se podría
intentar ubicarlo lo suficientemente cerca del eje de rotación para que el torque producido por las
fuerzas gravitatorias no supere los pequeños torques de arranque.
Esta discusión da pie a la explicación de la siguiente etapa del diseño del prototipo.
24
5.6 Geometrías de eslabones y contrapesos
La elección de la geometría de los eslabones es una de las herramientas disponibles para
acercar el CM a una posición deseada. Sin embargo, era deseable realizar esta elección
manteniendo acotadas las dimensiones de los eslabones, principalmente para reducir el espacio
requerido para la operación del manipulador. Una forma de lograrlo era recurrir a la utilización de
contrapesos, fabricados a partir de un material más pesado, para desplazar el CM. En este caso se
decidió incorporar contrapesos de acero.
Teniendo en cuenta estos conceptos y con la ayuda de CATIA se procedió a definir la forma
geométrica de los eslabones. CATIA permite asociar materiales (con sus propiedades) a los modelos
y, de acuerdo a las geometrías y esas propiedades calcular las posiciones de los centros de masa.
Teniendo en cuenta estos cálculos realizados por el software, y buscando no utilizar aluminio en
exceso y no complicar demasiado el proceso de fabricación, se definieron las geometrías del
Eslabón 2 y Eslabón 3. Estas se muestran en la Figura 5.3. Una vez ensamblado el brazo se
regularían los contrapesos según fuera necesario.
FIGURA 5.3 Se muestran las geometrías del Eslabón 2 (Izquierda) y Eslabón 3 (Derecha), tanto los modelos virtuales
3D generado en la etapa de diseño (Arriba) como los modelos reales (Abajo).
A continuación se muestran las posiciones de CM calculadas por CATIA, tanto del Eslabón
3 (Arriba) como del sistema compuesto Eslabón 2 + Eslabón 3 (Abajo)
25
Ubicación del
CM
Ubicación del
CM
FIGURA 5.4 Se muestran las posiciones de los CM, calculadas por CATIA, en la intersección de las líneas de colores
verde, rojo y azul. Se calcularon con los contrapesos (en negro) incluidos en el modelo.
Dado que el equilibrio del Eslabón 1, en principio, no se ve afectado por su forma, los
criterios de su diseño se basaron en otras cuestiones. Por un lado, se buscó facilitar la
implementación de las articulaciones (1 y 2) según se discutió en la Sección 5.4. Esto se hizo
disponiendo un par de placas enfrentadas. En una se fijaría el encoder y la otra el rodamiento, El
diseño del Eslabón 1 se muestra en la Figura 5.5.
Alojamiento
de rodamiento
para
articulación 2
Alojamiento de
rodamiento para
articulación 1
Asiento del
encoder
de articulación 2
Asiento del encoder
de articulación 1
FIGURA 5.5 Se muestra el Eslabón 1 fabricado (Izquierda) y su modelo virtual 3D obtenido en la etapa de diseño
Se buscó que la longitud de este eslabón no fuera demasiado grande para intentar disminuir
las incertezas debidas al juego entre el eje vertical y el rodamiento correspondiente.
26
5.7 Diseño final del prototipo y fabricación
La suma de todo lo discutido a lo largo de este capítulo derivó en el diseño definitivo del
prototipo. Toda esta etapa se encaró buscando un diseño sencillo, fácil de materializar y económico,
tanto en insumos materiales como en tiempo de desarrollo. Los detalles del diseño (planos
constructivos) se muestran en el Apéndice A.
Finalizada esta etapa, el personal del taller de electromecánica se dispuso a fabricar y
ensamblar el brazo articulado (Ver Figura 5.6). Todas las piezas, excepto bulones y sensores,
fueron producidas en dicho taller a partir de placas y barras. En particular, las placas de aluminio
correspondientes a los eslabones 2 y 3 (de formas más complejas) se mecanizaron en un CNC.
FIGURA 5.5 Se muestra el conjunto armado, incluidos sensores y contrapesos. La imagen se la izquierda es el modelo
virtual 3D obtenido en la etapa de diseño. La imagen de la derecha es una fotografía del modelo real.
5.8 Balanceo
Ensamblado completamente el prototipo, se procedió a realizar un balanceo estático de todo
el sistema. Primero se debía equilibrar el Eslabón 3. Se ajustaron masa y posición del contrapeso
hasta notar que había equilibrio indiferente. Sin embargo, al incorporar el sensor en la tercera
articulación (que teóricamente no debía afectar demasiado el balance logrado, pues estaba alineado
al eje), no sólo se produjo un desbalance sino que corregirlo resultaba muy complicado (el peso del
cable del encoder producía un desbalance considerable). Observado esto, y sabiendo que dicho
efecto se vería amplificado en la segunda articulación, se decidió incrementar el torque de arranque
incorporando en las articulaciones unos anillos pequeños fabricado con felpa. Se eligió este material
para que produjera una resistencia a la rotación suficiente para lograr el equilibrio, pero sin afectar
27
la condición de obtener movimientos suaves y sin sobresaltos.
28
Capítulo 6: Generación del modelo virtual [4]
En el Capítulo 4 se mencionó que se utilizarían las librerías ODE y Drawstuff para generar
el modelo virtual de un robot. Era necesario conocerlas en profundidad y aprender a utilizarlas, para
lo cual se usaron como apoyo el manual y el tutorial de ODE disponibles [4].
ODE está escrita en lenguaje C++, sin embargo su interfaz pública no utiliza clases (C++)
sino simples funciones en C. Está pensado para simular la evolución, en el tiempo, de sistemas
dinámicos. Estos sistemas pueden estar formados por varios cuerpos rígidos y la evolución
temporal de cada uno de los cuerpos dependerá de su condición inicial y de su interacción con los
demás. El proceso de simular el sistema de cuerpos rígidos en el tiempo se llama integración. En
cada paso de integración (denominado step) el usuario puede “aplicar” fuerzas sobre los cuerpos y
(consideradas también las fuerzas debido a las interacciones con otros cuerpos) utilizarlas para
redefinir el estado de cada cuerpo del sistema para el próximo valor de la variable independiente (y
discretizada) “tiempo”. El usuario puede definir el tamaño de paso (step size) de la simulación; esto
es, elegir cuál es la diferencia entre dos valores consecutivos de la variable independiente.
6.1 Sobre cuerpos y geometrías
Desde el punto de vista de la simulación, un cuerpo rígido posee varias propiedades.
Algunas de ellas suelen mantenerse constantes en el tiempo (por ejemplo, la masa) mientras que
otras se ven modificadas por la misma evolución de la simulación (por ejemplo, posición y
velocidad lineal). Por otro lado, un cuerpo rígido por si solo no tiene forma. Es usual asociarle una
o más geometrías. Los cuerpos y las geometrías son objetos diferentes e independientes dentro de
ODE. Es decir, a un mismo cuerpo (de determinada masa y en ciertas condiciones iniciales) se le
podría asociar, por ejemplo, un cubo, una esfera, o cualquier geometría compuesta.
Las colisiones dentro de un espacio virtual se detectan a partir de las posiciones relativas
entre geometrías de diferentes cuerpos, mientras que para la integración también se toman en cuenta
las propiedades de los cuerpos.
6.2 Vínculos
En ODE se llama vínculo a una relación establecida entre dos cuerpos, que les permite
adoptar solamente ciertas posiciones y orientaciones relativas entre ellos. En cada paso de
integración los vínculos establecen fuerzas de vínculo sobre los correspondientes cuerpos,
29
calculadas de forma que la dinámica del sistema sea tal que preserve las relaciones de vínculos
definidas. Un ejemplo sería una unión tipo bisagra, que solo permite la rotación de un cuerpo
respecto a otro alrededor de un único eje definido.
La librería tiene definida una gran variedad de vínculos, con una cantidad de parámetros
variables para ser controlados por el usuario, incluso dinámicamente. Durante el proceso de
simulación los vínculos pueden ser creados, modificados y destruidos. Esta cualidad es
aprovechada en la detección de colisiones de geometrías.
6.3 Detección de colisiones
Antes de cada step de la simulación, el código del usuario realiza un llamado a las funciones
de detección de colisiones para determinar y listar los puntos de contactos entre geometrías de
cuerpos diferentes. Para cada punto de contacto se especifica una posición en el espacio de
colisiones, un vector normal a las superficies a las que pertenece y una profundidad de penetración.
En cada punto se crea, además, una condición de vínculo especial -la llamaremos vínculo debido a
colisión (VDC)- que será removida una vez concretado el step. Este vínculo contiene información
extra sobre el contacto (fricción, elasticidad, etc.)
6.4 Funciones Callback
Luego de haberse creado el mundo virtual y el sistema que evolucionará en él, se utilizan
ciertas funciones de la librería para manipular la simulación. Se denominan funciones Callback
(FC) y son invocadas para dar inicio, llevar a cabo y finalizar el lazo (loop) de simulación. En el
marco de este trabajo se utilizan cuatro, sus características se detallan en la Tabla 6.1.
Características
Nombre de FC
FC Start
FC Step
FC Command
FC Stop
Se llama una única
Esta función es Esta función es
El código definido
vez. Da inicio al loop
llamada a partir del llamada para que se
dentro de esta
de simulación. Este
evento de presionar ejecuten las últimas
función se ejecutará
continuará hasta que
una tecla y ejecuta funciones antes de
al inicio de cada
se llame a la FC
un código definido provocar el fin de la
step.
Stop.
por el usuario.
simulación
TABLA 6.1 Se caracterizan la distintas funciones Callback usadas en la simulación
6.5 Adquisición de datos
Si bien en el siguiente capítulo se detallará todo lo relacionado a la electrónica del prototipo,
30
se adelanta que, para alimentar la simulación con la información de los sensores, se decidió utilizar
una comunicación serie asincrónica (Puerto USB). La información que recibe la simulación es el
Set Point (SP) de cada una de las articulaciones (posición angular). Este SP es utilizado en el código
para calcular las velocidades angulares (W) a imponer en los eslabones siendo:
W =SP− PI  K
donde PI es la posición angular al inicio del step de la correspondiente articulación y K una
constante de proporcionalidad.
6.6 Representación gráfica
Para poder visualizar la simulación se utilizaron las siguientes funciones de la librería
Drawstuff:
1. dsSetTexture(): permite seleccionar distintas texturas para el renderizado (por ejemplo:
“madera”, “cielo”)
2. dsSetColor(): permite seleccionar los colores que se utilizaran para las distintas geometrías
3. drawGeom(): esta función toma la geometría a renderizar y “averigua” a que clase
pertenece (caja, cilindro, etc), cuáles son sus parámetros (radio y altura, por ejemplo),
posición y orientación para finalmente realizar la representación gráfica.
En la Figura 6.1 se muestran imágenes de algunas representaciones gráficas de
simulaciones realizadas para entender el funcionamientos de las librerías.
FIGURA 6.1 Se muestran las representaciones gráficas de dos simulaciones es un dado instante.
31
6.7 Esquema del código utilizado
Dentro del código utilizado se pueden diferenciar dos componentes principales. Por un lado,
la configuración inicial y por otro el loop de simulación. En esta sección se muestran en forma
muy simple y esquemática ambos. Cabe aclarar que se decidió simular un robot de configuración y
dimensiones idénticas a la del prototipo construido. Esto facilitaba algunas cuestiones de
procesamiento de datos. El código completo puede encontrarse en el Apéndice B.1.
Configuración inicial
Definición de rutinas para las FC
•
•
Definición de rutina para FC Step
Definición de rutina para FC Command
Creación de un Mundo Virtual (MV)
•
Configuración de parámetro de
simulación (Ej.: coeficientes de
rozamiento, aceleración gravitatoria)
Creación del plano del suelo
•
Incorporación de cuerpos al MV
•
•
•
•
•
•
•
Configuración y establecimiento de
comunicación serie (puerto USB)
•
Creación de cuerpos
Configuración masas
Creación de geometrías
Asociación
cuerpos-geometrías
Posicionamiento y orientación de
geometrías
Creación y configuración de vínculos
Asociación vínculos-cuerpos
Utilización de funciones de la librería
termios.h
Creado el MV donde debe evolucionar la simulación y configurados todos los parámetros se
inicia el loop de simulación a partir del llamado a la FC Start(). Mientras la FC Stop() no sea
llamada, el programa continuará ejecutando el lazo que se muestra a continuación.
32
Llamado a FC Start()
Inicio de nuevo Step
¿Hubo
colisión?
No
Si
Creación de Vínculos debido
a colisiones (VDC)
Cálculo de los estados de
objetos en el siguiente step
Actualización de los estados
de los objetos
Rutina
FC Step()
Lectura de Set Points de
Las articulaciones
Actualización de las
velocidades angulares
Eliminación de las VDC
Renderizado de objetos
(Funciones de Drawstuff)
No
¿Se presionó
la tecla 'q'?
Si
Eliminación del Mundo Virtual
Finalización de la
comunicación
Rutina
FC Command()
Llamado a FC Stop()
33
Capítulo 7: Desarrollo e implementación de la electrónica
En este capítulo se brindarán detalles de la electrónica implementada como acople entre el
brazo articulado fabricado y el mundo virtual generado.
El objetivo era enviar la información entregada por cada unos de los tres encoders a la
computadora (PC) donde se estuviera ejecutando la simulación, para poder actuar sobre la misma.
Cómo se mencionó en el Capítulo 4, se decidió utilizar una placa Arduino UNO para este
fin. Se pretendía que esta placa constituyera el enlace entre los sensores y la PC.
7.1 Comunicación PC- Arduino
En el capítulo anterior se adelantó que, para alimentar la simulación con información
externa a la PC, se iba a recurrir a una comunicación serie asincrónica, a realizarse a través de un
puerto USB. Se tomó esta decisión luego de comprobarse que Arduino incorporaba una librería
muy bien lograda para este fin [5]. Para configurar y controlar la comunicación del lado de la PC se
recurrió a la librería termios.h. Se utilizó la configuración por defecto de Arduino para
comunicación serie. (9600 baudios, 8N1). El código utilizado para este desarrollo se encuentra en el
Apéndice B.2
Llegado el punto de la simulación en el que se requiera conocer la posición de algún
encoder, la PC realiza una consulta a la placa indicándole el sensor del cuál precisa información. Se
eligió, para no afectar demasiado la velocidad de la representación gráfica, que se realice solo una
consulta por step de simulación. Es decir, luego de tres steps se actualiza la información de todos
los encoders.
Antes de detallar cuál es la trama de datos trasmitida, se aclaran ciertas cuestiones sobre las
interacciones entre los dispositivos:
•
La placa Arduino se programó para estar siempre a la espera de una petición por parte de la
PC. Sólo después de recibir en el puerto de comunicación USB, alguno de los caracteres '0',
'1' o '2' (mediante los cuáles la PC distingue los tres encoders) realiza un nuevo conjunto de
acciones: obtener los datos necesarios, armar la trama y trasmitirla.
•
La trama recibida por la PC es pasada como parámetro por la función atoi() (librería
stdlib.h). Esta función toma una cadena de caracteres numéricos y los transforma, en una
variable tipo entero, al valor correspondiente. Si la cadena recibida tiene caracteres no
numéricos, es truncada a partir del primero de estos caracteres.
34
La trama armada en la placa, luego de recibir la petición, se forma de la siguiente manera:
'L'
'x'
'x'
'W'
?
?
'\n'
El primer caracter ('L') indica el inicio de la trama. A continuación se envían los caracteres
correspondientes al número de cuentas provenientes del sensor (x). Estos pueden ser entre uno y
cuatro caracteres (de 0 a 1024 cuentas). Luego se incluye un caracter no numérico ('W') para
asegurar el truncado de la cadena en ese punto (a través de la función atoi()) evitando la posible
aparición de datos numéricos parásitos. El caracter '\n' indica el final de la trama.
La aparición de los datos parásitos se da porque se utilizan de “relleno” cuándo se forma una
cadena en la que la cantidad de caracteres x es menor a cuatro.
7.2 Arduino: adquisición de datos de los encoders
Para poder armar la trama, el microcontrolador de la placa debe, de alguna manera, obtener
el número de cuentas a la salida del encoder correspondiente. Dado que cada encoder posee doce
conectores (10 bits + Alimentación) y que el microcontrolador utilizado tiene disponibles 23 pines,
se debía buscar una alternativa indirecta de acoplar los sensores a la placa.
Se optó por desarrollar pequeños drivers -uno por encoder- que reciban y procesen la señal
de los 10 conectores, para luego enviar el número de cuenta correspondiente mediante una
comunicación serie a la placa Arduino:
Protocolo utilizado[8]
Se eligió implementar dicha comunicación utilizando el protocolo I2C (I cuadrado C). Este
protocolo permite interconectar hasta 128 dispositivos diferentes utilizando solo un bus de dos
líneas (bidireccionales), una para señal de clock (SCL) y otra para datos (SDA) (Ver Figura 7.1).
En este caso particular se utilizan cuatro dispositivos: 1 maestro (Arduino) y 3 esclavos (drivers de
encoders). Cada esclavo tiene una dirección única y diferente a las del resto (un número entre 0 y
127).
Para establecer la comunicación, el maestro envía un primer mensaje con la dirección del
esclavo con el que se quiere comunicar. Cada esclavo verifica si coincide con su propia dirección y,
el que corresponda, envía una señal de respuesta para confirmar el establecimiento de la
comunicación. Una vez trasmitidos todos los datos, el maestro envía una señal para terminar la
comunicación y el proceso vuelve a iniciarse.
35
Arduino
Driver 2
SDA
SCL
Driver 1
Driver 3
FIGURA 7.1 Esquema de un bus de comunicación mediante protocolo I2C.
Drivers (Hardware)
El hardware de los drivers desarrollados consiste en un placa de circuito impreso (PCB) que
incorpora un microcontrolador del fabricante Microchip (PIC 16F886), divisores resistivos que
adaptan la tensión de salida del sensor (12V) al nivel de tensión lógico (5V), un regulador de
tensión (7805) para alimentar el microcontrolador (la fuente utilizada es de 12V) y los conectores
necesarios para acoplar, de manera modular, un driver con otro (extendiendo las líneas del bus + las
líneas de alimentación). (Ver Figura 7.2)
FIGURA 7.2 En la imagen de la izquierda se ve el modelo 3D de la placa diseñada con todos sus componentes. En la
imagen de la derecha se observa como se unen al Bus de comunicación dos de los drivers ya fabricados. En amarillo se
esquematizan las líneas SDA y SCL (ver Figura 7.1)
36
Drivers (software)
Los microcontroladores de los drivers tienen programados cada uno una dirección de
esclavo. Cada vez que la placa Arduino les hace una consulta, estos leen las diez entradas asociadas
a los conectores de salida del encoder correspondiente. Los estados de dichas entradas representan
un valor entero codificado en Gray (con lógica negativa). Este valor es decodificado por software y
enviado (en 2 bytes) por la línea SDA. El maestro recibirá los datos y armará con ellos la trama
para trasmitirla a la PC.
A continuación se muestra un esquema del proceso de comunicación completo
(PC+Arduino+Drivers) durante tres steps de simulación:
37
PC(ODE)
Inicio simulación
ARDUINO
Inicio Step 1
Simulación en curso
Espera por consulta
ESCLAVO 1
Consulta de datos de E1
Espera de respuesta
Recepción de consulta
Envío de consulta a E1
Espera de respuesta
Espera por consulta
Recepción de consulta
Envío de datos
Recepción de respuesta
Simulación en curso
Fin Step 1
Recepción de datos de E1
Inicio Step 2
Envío de datos de E1
Simulación en curso
Espera por consulta
ESCLAVO 2
Consulta de datos de E2
Espera de respuesta
Espera por consulta
Recepción de consulta
Recepción de consulta
Envío de consulta a E2
Envío de datos
Espera de respuesta
Recepción de respuesta
Simulación en curso
Fin Step 2
Recepción de datos de E2
Inicio Step 3
Envío de datos de E2
Simulación en curso
Espera por consulta
ESCLAVO 3
Consulta de datos de E3
Espera por consulta
Espera de respuesta
Recepción de consulta
Recepción de consulta
Envío de consulta a E3
Envío de datos
Espera de respuesta
Recepción de respuesta
Simulación en curso
Fin Step 2
Recepción de datos de E3
Envío de datos de E3
Espera por consulta
38
Capítulo 8: Resultados y propuestas
Este proyecto integrador tenía como principal objetivo (como se mencionó en el Capítulo 4)
dar los primeros pasos para el diseño de un brazo-sensor articulado capaz de manipular un brazo
robótico industrial. Se propuso realizar un lazo completo de manipulación a partir de un prototipo
sencillo que debía diseñarse y fabricarse. Además, se debía crear el modelo virtual del robot que se
pretendía manipular, y desarrollar la electrónica necesaria para acoplarlo con el prototipo. El
proceso pudo realizarse satisfactoriamente y se cumplieron los objetivos establecidos. En la Figura
8.1 y en la Figura 8.2 se muestra fotografías que retratan los resultados obtenidos.
FIGURA 8.1 Se muestran fotografías del manipulador siendo operado. Estas imágenes dan una idea al lector de las
proporciones del prototipo.
39
FIGURA 8.2 Se muestran fotografías tomadas durante las pruebas de funcionamiento del prototipo. Se observa la
incorporación de una pequeña caja, tanto virtual como real, para la realización de las pruebas.
Además de la materialización del primer prototipo funcional del manipulador, el desarrollo
del proyecto implicó, para el grupo de Robótica del Proyecto CAREM, sumar experiencia en el uso
de algunas herramientas útiles. Por un lado, se aprendió a utilizar librerías para la creación y
simulación de modelos virtuales, en particular de sólidos articulados (ODE+Drawstuff). Durante el
proceso se pudieron detectar y se aprendió a corregir algunos errores que típicamente se cometen al
elaborar el código. Además, para lograr implementar completamente las comunicaciones entre los
dispositivos que conforman el lazo, se incorporaron nuevos conocimientos relacionados con el
protocolo I2C y se desarrollaron drivers para los encoders. Se aprendió a utilizar las funciones de la
librería termios.h, dedicada a la implementación de comunicación a través de puertos Serie, y se
logró que la codificación de la trama (Arduino) y su interpretación (PC) fueran adecuadas. Se
estimó que el tiempo de retardo existente desde que la PC realiza la petición de datos hasta que los
recibe está entre 10ms y 15ms.
Si bien, por cuestiones de tiempo, no se logró realizar una profunda caracterización del
40
diseño mecánico del dispositivo, se pudieron sacar algunas conclusiones sobre él. Por un lado, la
configuración elegida (antropomórfica) fue satisfactoria en cuanto a accesibilidad. Además, el
diseño de las articulaciones y el balanceo realizado (sumado también a la configuración) influyeron
de manera
positiva en la maniobrabilidad del prototipo. Los materiales seleccionados se
comportaron según lo esperado, otorgando rigidez suficiente al manipulador sin elevar demasiados
el peso total del equipo.
Algunos aspectos que sería conveniente mejorar en el futuro son:
•
La ergonomía del diseño: existen ciertas posiciones del manipulador que afectan la
comodidad en la operación. Se sugiere una redefinición de las longitudes de los eslabones
del prototipo.
•
La minimización de juegos entre ejes y rodamientos. El más importante se da entre el eje
vertical y el rodamiento de la articulación 1. Se sugiere la utilización de ejes con doble
rodamiento, ubicados en sus extremos.
8.1 Propuestas para encarar en el futuro
Caracterización
Si bien se hicieron pequeñas pruebas de su funcionamiento, como se mencionó, no se logró
hacer una caracterización completa del prototipo. Se propone realizar una profunda evaluación de
su comportamiento y de las precisiones que se pueden lograr en las trayectorias generadas en las
simulaciones. Una alternativa para realizar dicho estudio es fijar, en la mesa de trabajo en la que se
encuentre montado el manipulador, objetos regulares (cubos o prismas, por ejemplo). Si se
aproximara a ellos el extremo del manipulador y se obtuviera el estado del modelo virtual en el
instante en que se produce el contacto (incorporando un microswitch, por ejemplo), se podría
establecer la discrepancia entre las coordenadas de un punto del espacio real y el correspondiente en
el espacio virtual.
Manipulación de otras configuraciones
Se propone también incorporar a este prototipo la posibilidad de manipular otras
configuraciones de robots (sean virtuales o reales). Con ese fin, será necesario aplicar el método de
Cinemática Directa para determinar, en todo momento, las coordenadas del punto del espacio
ocupado por el extremo del manipulador. Luego habría que aplicar el método de Cinemática Inversa
para determinar los ángulos que deben adoptar las articulaciones del robot, de manera que su
extremo alcance el correspondiente punto en su espacio de trabajo.
41
A más largo plazo, cómo continuación de la línea de trabajo planteada, se sugiere tener en
cuenta dos aspectos:
1. realizar mejoras al diseño propuesto: buscar la manera de reducir los juegos, mejorar la
ergonomía del diseño y estudiar alternativas para sincronizar la comunicación PC-Arduino
buscando mejorar (reducir) los tiempos de respuesta, etc.
2. avanzar en el grado de desarrollo del prototipo: empezar a considerar la incorporación de
servomotores, tanto para implementar los mecanismos de retroalimentación por fuerzas
como para realizar una compensación dinámica de los eslabones según su posición. Se busca
con ello contrarrestar la fuerza gravitatoria, de forma que el manipulador pueda permanecer
estático si el operador no ejerce fuerzas sobre él. Se propone también estudiar la posibilidad
de incluir controles adicionales (pulsadores, perillas,) y elevar el número de GDL del nuevo
prototipo para aproximar su flexibilidad al del brazo robótico industrial a utilizar en el
Proyecto CAREM.
42
Apéndice A: Planos constructivos del prototipo diseñado y
fabricado.
A continuación se presenta el conjunto de planos generados con CATIA. Si bien son
presentadas todas las piezas, cabe aclarar que el mecanizado de las placas principales del Eslabón 2
y Eslabón 3 se realizó en un CNC. Para ello, se presentaron al operador los modelos 3D de las
piezas en formato digital.
43
Apéndice B: Códigos de programación desarrollados.
B.1 Código desarrollado para implementar la simulación utilizando las librerías
ODE y Drawstuff
#include <unistd.h>
#include <math.h>
#include <ode/ode.h>
#include "drawstuff.h"
#include "parameters.h"
#include "Adq.h"
static dWorldID mundo;
static dSpaceID espacio;
static dJointGroupID GrupoContactos;
static Robot robot;
/*SE DEFINEN RUTINAS PARA USAR DENTRO DE LA FC STEP*/
/*****Para detección de colisiones...*****/
static void CercaCallback(void *data,dGeomID objeto1,dGeomID objeto2){
int i;
//-- Obtener ID del cuerpo
dBodyID b1 = dGeomGetBody(objeto1);
dBodyID b2 = dGeomGetBody(objeto2);
//-- Están vinculados?..entoces no hay colisión. Terminar
if (b1 && b2 && dAreConnectedExcluding (b1,b2,dJointTypeContact)) {
return;
}
//-- Configura propiedades para puntos de contacto
dContact contact[MAX_CONTACTS];
for (i=0; i<MAX_CONTACTS; i++) {
contact[i].surface.mode = dContactBounce | dContactSoftCFM;
contact[i].surface.mu = MU;
contact[i].surface.mu2 = MU2;
contact[i].surface.bounce = BOUNCE;
contact[i].surface.bounce_vel = BOUNCE_VEL;
contact[i].surface.soft_cfm = SOFT_CFM;
}
//-- Obtener puntos de contacto
int numc = dCollide (objeto1,objeto2,MAX_CONTACTS,&contact[0].geom, sizeof(dContact));
//-- Si hay al menos un punto de contacto...
if (numc!=0) {
//-- Para cada punto de contacto se debe crear un vínculo
for (i=0; i<numc; i++) {
//-- Se crea y se agrega a "GrupoContactos"
dJointID c = dJointCreateContact (mundo,GrupoContactos,&contact[i]);
//-- Setea la articulación entre los 2 cuerpos
dJointAttach (c,b1,b2);
}
}
/*****Para adquisición de datos de encoders y
actualización de velocidad angular de colisiones...*****/
56
void servos_sim()
{
int i;
// Lee Encoder y modifica Set Point
adquis(&robot);
(Ver Sección
for(i=0; i<3; i++)
{
//Obtiene Posicion "actual"
dReal pos = dJointGetHingeAngle(robot.joint[i]);
//Calcula la distancia que hay al Set Point
dReal error = pos - DEG2RAD(robot.PosicRef[i]);
//Define una velocidad proporcional a esa distancia
dReal velocity = -error*KP;
if (velocity > WMAX) velocity = WMAX;
if (velocity < -WMAX) velocity = -WMAX;
//-- Seta velocidad angular de "servo"
dJointSetHingeParam(robot.joint[i], dParamVel, velocity);
}
}
B.2)
/*****Para llevar a cabo el proceso de integración...*****/
static void simLoop (int pause){
if (!pause)
{
//-- Detección de colisiones, si dos geoms están por chocar llama a
//-- "CercaCallback"
dSpaceCollide (espacio,0,&CercaCallback);
//-- Realiza un STEP
dWorldStep(mundo,STEP);
//LLama a "servos_sim" definida arriba: adquisic. y
// actualización de velocidad angular
servos_sim();
//-- Remueve vínculos debido a colisiones
dJointGroupEmpty (GrupoContactos);
usleep(PAUSE);
}
//Renderiza todas las geometrías
Body_render(&robot);
}
/*SE DEFINE LA RUTINA PARA USAR DENTRO DE LA FC START*/
static void start()
{
// Posición Camara.
static float xyz[3] = {-9.3792,13.3030,10.7700};
//-- Orientación Camara. Los tres valores son "Pan, Tilt and Roll".
//-- Valor (0,0,0) significa camara paralela al suelo y en direccion de semieje positivo "x"
static float hpr[3] = {-52.7500,-17.0000,0.0000};
//-- Seteo de posición y orientación de camara
dsSetViewpoint(xyz, hpr);
//Configuracion y apertura del puerto USB
ConfigAdq();
(Ver Sección B.2)
printf ("q: Quit\n");}
/*SE DEFINEN LA RUTINA PARA USAR DENTRO DE LA FC COMMAND*/
57
static void command (int cmd)
{
if (cmd=='q') {
dsStop();
}
/*SE DEFINEN LA RUTINA PARA USAR DENTRO DE LA FC STOP*/
static void stop(void)
{
CloseAdq();
}
(Ver Sección B.2)
//PROGRAMA PRINCIPAL
int main (int argc, char **argv)
{
/* SE ASOCIAN LAS RUTINAS DEFINIDAS A LAS FC DENTRO
/* DE UNA ”Struct Function”
Functions fn;
//-- La start...
fn.start = &start;
//-- La Step
fn.step = &simLoop;
//-- La Command
fn.command = &command;
//-- La Stop ( y otras)
fn.version = DS_VERSION;
fn.stop = &stop;
fn.path_to_textures = (char *)"./textures";
dInitODE();
//-- CREACIÓN DEL MUNDO VIRTUAL
mundo = dWorldCreate();
//-- Seteo de gravedad
dWorldSetGravity (mundo,0,0,GRAVITY_CTE);
//-- Seteo de parametros.
dWorldSetCFM (mundo,CFM);
dWorldSetContactMaxCorrectingVel (mundo,MAX_CORRECTING_VEL);
dWorldSetContactSurfaceLayer (mundo,SURFACE_LAYER);
//-- Se Crea un espacio de colisiones
espacio = dHashSpaceCreate (0);
//-- Se crea una estructura para guardar VDCs
GrupoContactos = dJointGroupCreate (0);
//--Se crea plano del piso z=0
dCreatePlane (espacio,0,0,1,0.);
//--SE LLAMA A LA FUNCIÓN QUE CREA CUERPOS Y GEOMS.
NuevoRobot(&robot,mundo,espacio);
(Ver Sección B.3)
//-- INICIO DEL LOOP..SE MANDAN COMO PARÁMETRO LAS FC
//-- Y LAS DIMENSIONES DE PANTALLA. SE LLAMA A FC START
//-- QUE EN SU RUTINA ESTABLECE LA COMUNIC. USB
58
dsSimulationLoop(argc, argv, 2400, 1800, &fn);
//-- CUANDO SE LLAME A FC STOP (al presionar 'q')
//-- SALE DEL LOOP, EJECUTA LA RUTINA ASOCIADA
//-- A FC STOP, Y ELIMINA EL MUNDO VIRTUAL.
dJointGroupDestroy (GrupoContactos);
dSpaceDestroy (espacio);
dWorldDestroy (mundo);
return 0;
}
59
B.2 Código desarrollado para realizar la comunicación a través de un puerto
USB entre la PC que ejecutara la simulación y la placa Arduino.
Del lado de la PC (utilizando funcines de la librería termios):
/***************************************************************************/
int ConfigAdq(void)
{ int fd;
//Abrir puerto “fd”.Si fallo apertura...
if((fd=serialport_init("/dev/ttyACM0", (int)9600)) == -1)
{
//Escribe mensaje indicándolo
printf("Error al abrir puerto serie...\n");
return 0;
}
return 1; }
/***************************************************************************/
int adquis(*robot)
{
char buf[10], num[2];
int rc, cuentas;
static int encoder=0;
float grados;
//Se guarda como “caracter” el entero correspondientes
//a unos de los encoder
sprintf(num, "%d", encoder);
//se escribe en el puerto serie “fd” dicho caracter
rc = serialport_write(fd, num);
if(rc==-1) return -1;
//Se esperan 15mS para que Arduino realice la consulta
//al esclavo correspondiente y responda
usleep(1000*15);
//Se lee el puerto hasta que aparezca una 'l' (inicio
//de trama) y se desecha la lectrua...
serialport_read_until(fd, buf, 'l');
//inmediatamente se realiza una nueva lectura hasta que
//aparezca un '\n' (fin de trama) y se guarda en “buf”
serialport_read_until(fd, buf, '\n');
//Se convierte en entero (0 a 1024)
cuentas = atoi(buf);
//Se normaliza
grados = ((360.0/1024.0)*cuentas -180);
//Se modifica el SetPoint
robot->PosicRef[encoder]=-grados;
//Se incrementa la vble encoder para consultar
//otro encoder en el siguiente step
encoder++;
//Cuando llegue al último encoder reinicializa la vble.
if(encoder==CANT_POTE)
encoder=0;
return(atoi(buf)); }
/***************************************************************************/
void CloseAdq(void)
{
close(fd); //Ciera el puerto “fd”
}
Del lado de Arduino:
60
#include <Wire.h>
uint8_t PBaja,PAlta;
//Vbles donde se guardan los dos bytes recibidos del Esclavo.
int sensorValue = 0;
//Vble donde se juntan los dos bytes para formar el entero.
char c;
//Vble donde se guarda lo recibido por el USB(PC)
int valido;
//Bandera seteada al recibir '0','1' o '2' por el USB (PC).
/*-----------CONFIGURACIÓN INICIAL-----------*/
void setup() {
Wire.begin();
//Establece comunicación por I2C (con esclavos)
Serial.begin(9600);
//Establece comunicación por USB (con PC) (9600 baudios)
}
/*--------------------------------------------------------*/
/*---------------------BUCLE(LOOP)----------------*/
void loop()
{
c = Serial.read();
//Guarda en "c" lo que se lee en puerto USB
valido=0;
//Reseta bandera
switch(c)
//Si lo guardado en "c" es '0','1' o '2'...
{
case '0':
Wire.requestFrom(0b01010000,2);
//Realiza petición a esclavo A, 2 bytes
while(Wire.available())
{
PBaja = Wire.read();
//Guarda el 1° Byte
PAlta = Wire.read();
//Guarda el 2° Byte
sensorValue = (PAlta<<8)|PBaja;
//Construye el número Entero
}
valido=1;
//Setea Bandera
break;
case '1':
Wire.requestFrom(0b01011000,2);
//Realiza petición a esclavo B, 2 bytes
while(Wire.available())
{
PBaja = Wire.read();
//Guarda el 1° Byte
PAlta = Wire.read();
//Guarda el 2° Byte
sensorValue = (PAlta<<8)|PBaja;
//Construye el número Entero
}
valido=1;
//Setea Bandera
break;
case '2':
Wire.requestFrom(0b01100000,2);
//Realiza petición a esclavo C, 2 bytes
while(Wire.available())
{
PBaja = Wire.read();
//Guarda el 1° Byte
PAlta = Wire.read();
//Guarda el 2° Byte
sensorValue = (PAlta<<8)|PBaja;
//Construye el número Entero
}
valido=1;
//Setea Bandera
break;
}
if(valido)
//Si "Bandera" fue seteada...
{
valido=0;
//Reseta Bandera
Serial.print('l');
//Armado y
Serial.print(sensorValue);
//envío de
Serial.println('w');
//trama por USB (PC)
}
}
61
B.3 Código de la función implementada para la creación y configuración de
cuerpos, geometrías y vínculos dentro de la simulación realizada con las
librerías ODE y Drawstuff.
Se muestra a modo de ejemplo el código para la creación de solo un cuerpo. Se generan los demás
de manera análoga.
#include "kbody.h"
//Función que crea los cuerpos. Recibe como parámetro una “struct Robot”
// que contiene los cuerpos, geometrías y vínculos a usar
void NuevoRobot(Robot *robot, dWorldID mundo, dSpaceID espacio)
{
dMatrix3 R;
dMass m;
//Se crea el cuerpo
robot->Brazo1 = dBodyCreate(mundo);
//Se configura posic. de CM
dBodySetPosition(robot->Brazo1, 0., 0., Br1c/2 + Br1a/2.0 + MesaAlto + BaseEsp);
//Se guarda el valor de “masa” en la vble. “m”
//mediante una func. Que recibe: Densidad y dimensiones
dMassSetBox(&m,DENSITY,Br1a+Br1a+Br1c,Br1c+Br1c+Br1d,Br1b+Br1b+Br1b);
//Se asocia la “masa” con el cuerpo
dBodySetMass(robot->Brazo1,&m);
//Se crean las geometrías para dar forma al cuerpo
//Geomet. 1
robot->B1geom1 = dCreateBox (espacio,Br1c,Br1b,Br1a);
//Geomet.2
robot->B1geom2 = dCreateBox (espacio,Br1c,Br1b,Br1a);
//Geomet.3
robot->B1geom3 = dCreateBox (espacio,Br1d,Br1b,Br1c);
//Se asocian las Geometrías con el cuerpo correspondiente.
dGeomSetBody(robot->B1geom1,robot->Brazo1);
dGeomSetBody(robot->B1geom2,robot->Brazo1);
dGeomSetBody(robot->B1geom3,robot->Brazo1);
//Se posicionan las geometrías respecto a la posición del cuerpo
dGeomSetOffsetPosition(robot->B1geom1,Br1d/2-Br1c/2,0.0,Br1c/2.0);
dGeomSetOffsetPosition(robot->B1geom2,-Br1d/2+Br1c/2,0.0,Br1c/2.0);
dGeomSetOffsetPosition(robot->B1geom3,0.0,0.0,-Br1a/2.0);
//Eventualmete se calcula y seguarda en una variable una matriz de rotación...
dRFromAxisAndAngle(R,0,1,0,-(M_PI/2));
//para orientar alguna geometría
dGeomSetOffsetRotation(robot->B1geom1,R);
/*VINCULOS*/
// Se guarda en un vble. un vínculo tipo Bisagra(Hinge)
robot->joint[1]=dJointCreateHinge (mundo,0);
//Se asignan los cuerpos a vincular
dJointAttach (robot->joint[1],robot->Brazo1,robot->Brazo2);
//Se define un punto de anclaje (posición) de la articulación
dJointSetHingeAnchor (robot->joint[1], 0, 0,DistEjes1+MesaAlto+BaseEsp);
//Se definie la dirección en la que actúa el vínculo
dJointSetHingeAxis (robot->joint[1], 1,0,0);
//Se definen algunos parámetro del vínculo
dJointSetHingeParam(robot->joint[1], dParamFMax, TORQUE);
}
62
Referencias
[1] Comisión Nacional de Energía Atómica (CNEA) (s.f.). Sitio web oficial:
http://www.cnea.gov.ar/proyectos/carem
[2] Quispe Mamaní, A. (2010). Automatización de las tareas de mantenimiento de los tubos de los
generadores de vapor del reactor CAREM. Argentina: Instituto Balseiro.
[3] Dassault Systems (2007). CATIA V5 Fundamentals.Tutorial
[4] Open Dynamics Engine (s.f.). Manual del usuario de ODE. Disponible en: http://odewiki.org/wiki
[5] Arduino (s.f.). Manual del usuario de placa Arduino. Sitio web oficial: http://www.arduino.cc
[6] SKF(s.f). Catálogos de rodamientos SKF. Disponibles en: http://www.skf.com
[7] NSK (s.f.). Catálogos de rodamientos NSK. Disponibles en: http://www.nsk.com
[8] Atmel (s.f.). Hoja de datos de microcontrolador Atmega328P. Disponible en:
http://www.atmel.com
63
Agradecimientos
Primero quiero agradecer a mi familia por todo el apoyo, interés y preocupación. A mis
padres, a mis tíos, a mis abuelos muchas gracias!. Muy especialmente a mis hermanos que siempre
fueron (y seguramente seguirán siendolo) un ejemplo para mi, y sobre todo un gran apoyo durante
toda mi vida. Gracias por tantos momentos.
Quiero agradecer a mis amigos en Tucumán. El día que decidí venir a Bariloche pensaba
que, durante tres años, me iba a perder miles de momentos allá, y fue duro. Gracias por hecerme
recuperar algunos, cada vez que iba de visita, y por hacerme sentir que seguía en mi casa y abrirme
las puertas de las suyas.
Gracias a mis compañeros del IB y a todas las personas con las que compartí este tiempo en
Bariloche. A mis compañeros de cursada por el enorme compañerismo y apoyo en momentos
difíciles. Por todo el tiempo y todos los momentos que pasamos juntos. Salud!
Hace mucho que no se de ellos, pero no quiero dejar de agradecer a dos grandes maestros
que tuve: Gracias Ricky y JP (jotapé).
Valoro muchisimo las oportunidades de acceso a la educación que tuve. Desde que llegúe al
IB me sentí un privilegiado y soy consciente que todo lo que recibí se lo debo a la sociedad
argentina, y espero de alguna manera poder pagarle esa deuda.
Quiero agradecer a todas las personas que me ayudaron con el desarrollo del proyecto
integrador. Muchas gracias a mis directores (Luis, Quique y Ale) y tutor (Enzo) por toda la
predisposición y el tiempo dedicado para sacar las cosas adelante, y a todos en la oficina por la
buena onda. Muchisimas gracias Seba por las infinitas veces que me ayudaste y por toda la
paciencia, aprendí mucho por tu culpa. Gracias Pancho, Bernard, Ricky, Hernán, Carlitos, Fritz,
Rolo por el trabajo que hicieron, por compartir el mate y por enseñarme tanto. Gracias Alfredo y
René por su colaboración. Gracias Fabián, Enzo, Leo, Eduardo y Horacio por su ayuda, y a todo el
grupo de Electrónica por la buena onda. Gracias Gonza y Trapo por darme una mano con las
normas. Gracias Rodri, Vieja y Pilón por ayudarme tanto con la Tesis. Gracias Marce, Negro y Gigi
por saber inglés. Muchas gracias a la Marce, a mis compañeros, a mis hermanos, familia, y amigos
por el aliento en los momentos complicados. Gracias Salteño por mantenerme alimentado mientras
escribía.
Quiero agradecer también a aquellos que colaboraron con mi formación académica y
64
humana durante estos años. Muchas gracias a todos los docentes y no docentes del IB por su
enorme predisposición. Especialmente a Claudio, Kay, Seba, Marcelo y Pablo. Enzo, Fede, Horacio,
Fabián, Leo y Eduardo. Alejandro, Graciela y Hugo. Juan Carlos, Agustń C., Matias G y Ignacio R.
Por último te quiero agradecer enormemente a vos Marce, sos una persona muy importante
para mí. Durante siete años, y especialemente durante los últimos tres, has sido el soporte más
grande que he tenido. Muchas gracias por estar conmigo en todas. En los momentos más lindos, en
los más difíciles y en los imposibles. Gracias por todo lo que te has bancado este tiempo. Gracias
por sacrificar tanto para hacer esta carrera conmigo. Gracias por compartir tanto conmigo y
enseñarme tantas cosas. Es impagable! Muchas Gracias! +Qbxjl3 ;-).
65
Descargar