Académique Documents
Professionnel Documents
Culture Documents
DEPARTAMENTO DE INGENIERAS
FACULTAD DE ELECTRNICA
Tesis:
SISTEMA DE MANIPULACIN DE OBJETOS PARA
ROBOT DE SERVICIO DONAXI
Trabajo de Investigacin
que para obtener el Ttulo de
INGENIERO EN MECATRNICA
Presenta:
Victor Poisot Martnez
Asesor:
Dr. Hctor Simn Vargas Martnez
II
FACULTAD DE ELECTRNICA
III
FACULTAD DE ELECTRNICA
A mis padres
que esperaron, trabajaron y aguantaron.
IV
FACULTAD DE ELECTRNICA
AGRADECIMIENTOS.
Antes de empezar a aventar nombres a los cuatro puntos cardinales, quiero dejar en claro
que este trabajo no es el punto final de una etapa, al contrario, es un punto de partida para una
vida. Quiero decir: no espero que vean estas lneas como un pequeo gesto de agradecimiento
de lo que me ayudaron a terminar. No. Lo que quiero es que las entiendan como una muestra
de lo agradecido que estoy por su apoyo en el comienzo de la siguiente etapa que se
materializa el da de hoy.
Primero que nada, quiero agradecer a Dios por poner los medios para que yo haya
podido caminar hasta donde estoy y tener las fuerzas para enfrentar el camino que sigue. Sin
embargo, para poder caminar, por mucho que uno tenga los pies y el camino adecuados, es
importante un apoyo, que alguien sostenga nuestra mano y que nos ensee a dar los pasos, uno
a uno hasta que al fin logremos seguir por nuestro propio pie; por eso es tan importante
agradecer a mis paps: por estar ah siempre que hacan falta, por no abandonarme nunca, por
ensearme a caminar y a ser quien soy. Tambin a mi hermano, Paul, por estar presente en los
momentos importantes y ser mi apoyo desde hace casi trece aos.
Al resto de mi familia: tos, abuelos y primos, tambin quiero darles las gracias por su
apoyo y por su confianza. Agradezco en particular a mis tos: Juan Carlos, Jacqueline y Hugo;
por ofrecerme su mano en mltiples ocasiones a lo largo de estos aos.
Quiero agradecer a todos mis profesores que me apoyaron de diversas formas posibles al
compartirme sus conocimientos, sus experiencias y sus consejos, por la confianza que varias
veces depositaron en m y por los retos que me imponan sus tareas. No me gustara dejar a
nadie en el tintero, pero quiero hacer mencin particular a algunos profesores que por una o
por otra razn han sido importantes en mi formacin profesional: Dr. Hctor Vargas, Dr.
Casimiro Gmez, Mtro. Marco Antonio Ramrez, Dra. Luz Garca, Mtro. David Malpica, Dra.
Arllene Prez, Mtro. Francisco Calvo y Mtro. Enrique Snchez.
Agradezco a mis amigos y compaeros, principalmente a los que son ms mis amigos
que mis compaeros, por apoyarme cuando el trabajo apretaba, por acompaarme a disfrutar
enormemente la etapa universitaria, por soportar conmigo el estrs de las tareas, en fin, por
haber hecho que sta sea una etapa que valga la pena. Agradezco a Perroni, Jaime, Carlos,
V
FACULTAD DE ELECTRNICA
Jos Luis, Lauro, Peto, Aldo Daniel, a los que formaron parte del equipo de Donaxi@Home y
a todos los dems que no puedo mencionar por cuestiones de espacio, pero que sin ellos, este
trabajo no hubiera sido posible.
Tampoco puedo dejar fuera a todos aquellos que estuvieron ya sea en algn momento o
todo el tiempo, y que su presencia no era necesariamente en el aula ni en el laboratorio, pero
que sin duda han sido y son muy importantes para m. A Mara Jos, Melissa, Fernanda,
Juanito, Sainos, Elena, y por ltimo, pero no menos importante, a Brenda, que ha sido un gran
apoyo para m en esta recta final.
Quiero hacer un agradecimiento en particular a la Asociacin Periodstica Sntesis por el
fundamental apoyo que me ofrecieron a lo largo de toda mi carrera, sin el cual no me hubiera
sido posible llegar hasta donde estoy.
Tampoco puedo dejar fuera al Mtro. Carlos Martnez, a quien agradezco enormemente
por su apoyo tan valioso en mltiples ocasiones a lo largo de estos aos.
Espero no haber olvidado a nadie, y espero me perdonen si lo hice; de verdad estoy muy
agradecido con todos, y no queda ms que desearles lo mejor.
VI
FACULTAD DE ELECTRNICA
SUMARIO.
VII
FACULTAD DE ELECTRNICA
nodo programado en C++ que aporta todos los clculos correspondientes de posiciones y
velocidades de los motores. Se detallar en la arquitectura de control de la que se habla.
La parte crtica del software, la que toma las decisiones importantes, es decir la
cinemtica inversa que es donde se calculan los ngulos y las velocidades de los servomotores,
se desarroll comenzando por los clculos matemticos que se lograron por medio de la
convencin Denavit-Hartenberg, lo que permiti hacer los clculos referentes a la cinemtica
directa, y por extensin, de la inversa.
Los resultados obtenidos en este proyecto pueden ser mudados a otros prototipos, sin
embargo se debe tener en cuenta, que el modelo cinemtico del brazo debe ser replanteado, as
como los protocolos de comunicacin con los servomotores deben ajustarse a las necesidades
especficas del robot.
VIII
FACULTAD DE ELECTRNICA
ABSTRACT.
Nowadays there are many projects in current development in the Control and Robotics
Laboratory of UPAEP, among them the Project Donaxi@Home is found, in which coexist
many research areas that have to be treated separately. One of those research areas is precisely
the one meant for this work: object manipulation.
Donaxi Service Robot is designed based in the requirements of the @Home League
from the most important Robotics Competition in the world: RoboCup. In this league robots
are tested in the capacity of helping and interacting with people in daily life; like the ability to
follow a person; understand and obey spoken instructions, for example, in order to look for an
asked object, find it and take it to a specific location; helping people in emergency situations
as fires, earthquakes and so on. As a complement, Donaxi has a special emphasis in the
support for handicapped people and also elder people.
In order to fulfill these requirements, it was necessary to attach a robotic arm to the
prototype, which was designed and built by the Mechatronics Engineering student Jaime
Robles Ramos during the spring 2012 period. Since then, the programming of the control
system was begun. After a few previous versions of the software which were useful to get to
know and understand the way ROS, the CM-700 board and the Dynamixel motors work; so a
new and steadier system was proposed that includes Inverse Kinematics for Object
Manipulation. This control system is the described in the present work.
Dynamixel servomotors are developed by Robotis, which is a company responsible of
manufacturing materials for Robotics, from motors, control boards and even robotics kits. The
used models of servomotors utilize serial communication, with the RS-485 protocol to be
controlled, and the CM-700 board, also from Dynamixel, is meant to do that. This board
works with an Atmel microcontroller, which is able to communicate with all of the
servomotors and with the computer since it is programmed with the support of an SDK from
Robotis itself.
The communication with this board is by the serial communication libraries
implemented in Python, which are used inside ROS and interact with a node programmed in
C++ which provides all of the appropriate calculations of positions and velocities of the
servomotors. More details will be provided about the mentioned control architecture.
IX
FACULTAD DE ELECTRNICA
The most critical part of the software, the one that makes all important decisions, in
other words the Inverse Kinematics, which is where angles and velocities of servomotors are
calculated, it was developed starting with the Mathematical calculations that were achieved
with the Denavit-Hartenberg convention. This allowed to make the calculations about de
Direct Kinematics, and by extension, the Inverse Kinematics.
The obtained results in this project can be transferred to other prototypes, but it must be
considered that the kinematics model of the arm should be set again, and also the
communication protocols with the servomotors should adjust with the specific requirements of
the robot.
X
FACULTAD DE ELECTRNICA
NDICE.
Agradecimientos. .......................................................................................................... V
Abstract. ...................................................................................................................... IX
ndice. .......................................................................................................................... XI
Captulo 1. Introduccin................................................................................................. 1
XI
FACULTAD DE ELECTRNICA
XII
FACULTAD DE ELECTRNICA
Anexos....................................................................................................................... 126
XIII
FACULTAD DE ELECTRNICA
CAPTULO 1. INTRODUCCIN.
1
FACULTAD DE ELECTRNICA
2
1.1. ANTECEDENTES.
1.2. JUSTIFICACIN.
1.3. OBJETIVOS.
1.3.1. Generales.
Escribir un software que permita a un brazo robtico tomar objetos tras recibir
datos como las coordenadas de los mismos y su naturaleza y luego colocarlos en
algn otro lugar con sus respectivas coordenadas.
1.3.2. Especficos.
Generar un modelo matemtico del brazo que permita hacer clculos de
cinemtica directa e inversa.
Implementar en software los clculos de cinemtica directa y una propuesta de
cinemtica inversa.
Programacin de la interfaz que permita la comunicacin entre el brazo robtico
y el ordenador.
Diseo de interfaz de usuario para simplificar la operacin del Robot.
Integracin del software generado en los tres puntos anteriores con arquitectura
de control de Robot de Servicio Donaxi.
FACULTAD DE ELECTRNICA
8
1.4. PREGUNTA DE INVESTIGACIN.
Tal como se han planteado los objetivos de este trabajo, resulta evidente que lo que se
pretende disear y elaborar es un software de control para el brazo del Robot de Servicio
Donaxi que pueda ser funcional, a la vez que pueda ser base para posteriores desarrollos
propios del equipo de trabajo del proyecto. Es por eso que se puede plantear la siguiente
pregunta de investigacin:
Cmo se puede hacer un software eficiente, estable y de sencilla operacin que permita
manipular objetos al brazo del Robot de Servicio Donaxi con base en los actuales avances con
el resto del proyecto?
Como se menciona en la seccin 2.7, una de las razones por las que se ha diseado un
algoritmo de cinemtica inversa propio de Donaxi se debe al inconveniente de no poder
controlar directamente una de las seis dimensiones en las que se mueve el brazo debido a los
cinco grados de libertad, el diseo mecnico y el espacio de trabajo. sta limitante hizo pensar
en una alternativa: un nuevo algoritmo que buscara la posicin y que nos permitiera descartar
FACULTAD DE ELECTRNICA
10
sin problemas una o varias dimensiones, cuestin que se complica si se utilizara algn mtodo
matemtico conocido.
De esta forma, este algoritmo va a ser perfectamente funcional para dems brazos
robticos con limitantes similares, pues al implementarse no representar gran problema
eliminar las variables que no interesen del resultado final. Incluso el cdigo est diseado y
comentado de forma en que sera posible reutilizarlo cambiando nicamente ciertas variables
por otras que de una forma o de otra estn consideradas para casos de brazos con diseos,
capacidades y limitantes diferentes.
Del mismo modo, se espera que el presente trabajo sea de gran importancia para la
participacin del Robot de Servicio Donaxi en las futuras competencias RoboCup en la
categora @Home. Pues se pretende presentar el robot ahora con dos brazos, y sin duda, con el
avance actual slo sera necesario duplicar el modelo existente y aadir algunos motores ms
al sistema de control, tareas que no representarn gran problema.
A largo plazo, dentro del laboratorio se espera que se contine con la investigacin
dentro de este mismo proyecto, con el fin de que se obtengan funcionalidades completamente
nuevas que permitan un mejor desempeo en manipulacin de objetos dando pie a posteriores
trabajos de parte de ms estudiantes de la facultad.
El presente trabajo se estructur de una manera en que pueda resultar ms claro para el
lector el desarrollo del proyecto, pues la gran cantidad de elementos que el software considera
y la forma en que stos se relacionan entre s implica que las etapas de programacin tuvieron
que seguir un orden progresivo que optimizara el tiempo de escritura de cdigo y de
depuracin.
As se comenz por una investigacin y una serie de clculos que permitieran plantear
un modelo matemtico del brazo y que a la vez, conduzca a los clculos de cinemtica directa
e inversa, as como el planteamiento de un algoritmo que trace la ruta que debe seguir el brazo
para alcanzar los puntos deseados. Esta etapa es tratada en el Captulo 2. .
FACULTAD DE ELECTRNICA
11
Teniendo estos clculos y algoritmos planteados, se comenz la etapa de programacin
en ROS cuidando en todo momento que se mantenga acorde y compatible con la arquitectura
de Donaxi. Adems fue necesaria la construccin y programacin de un sencillo modelo
virtual del brazo que permita simular cmo se comportara el brazo real. El Captulo 3.
permite profundizar en estos temas.
Como la tercer etapa del proyecto, se implementaron los algoritmos y clculos que se
propusieron en la primera (Captulo 2. ), y se integraron a la plantilla de programacin y a la
simulacin generada en la etapa anterior. Esta etapa queda detallada en el Captulo 4.
La ltima etapa de programacin consiste en el desarrollo de la interfaz con los motores,
el diseo del entorno de usuario y la implementacin final del cdigo generado a lo largo de
todas las etapas. En el Captulo 5. se encuentra toda la informacin referente a esto.
Finalmente, en el Captulo 6. , se presentan las conclusiones generales del proyecto,
incluyendo observaciones, recomendaciones y advertencias del desempeo del sistema de
manipulacin de objetos presentado.
FACULTAD DE ELECTRNICA
12
FACULTAD DE ELECTRNICA
13
2.1. BRAZOS ROBTICOS.
Para el correcto control de los servomotores del manipulador es necesario conocer los
ngulos y la velocidad que necesita tener cada uno de dichos actuadores y as lograr ir a una
posicin especfica. En la resolucin de estos problemas, la robtica se vale de dos estudios
que permiten conocer el estado del robot bajo ciertas condiciones: cinemtica y dinmica.
La cinemtica es la rama de la ciencia que se encarga de estudiar la geometra del
movimiento sin tomar en cuenta los factores que lo causan, tales como las fuerzas o
momentos; es decir, se encarga del anlisis del desplazamiento del robot con relacin a un
sistema de referencia fijo y el tiempo en que el movimiento ocurre; se puede decir que en
particular estudia la relacin existente entre los valores de las articulaciones y la posicin del
elemento final (Fu, Gonzlez, & Lee, 1987).
A diferencia de la cinemtica, la dinmica ofrece herramientas para el anlisis de
sistemas que experimentan cambios en el tiempo, y que en el caso de los robots, se obtienen
ecuaciones de movimiento que describen tales cambios; estas ecuaciones son de gran
importancia para el diseo, el anlisis, el control del sistema, simulacin a computadora del
robot y evaluaciones de desempeo del diseo (Jazar, 2006). Adems Fu y otros (1987)
sostienen que se pueden encontrar ecuaciones reales de movimiento por medio de las leyes de
fsica newtoniana y lagrangiana, lo que nos permitira conocer el movimiento para cada
articulacin en trminos de los parmetros geomtricos e inerciales de los eslabones.
En el presente trabajo, la cinemtica juega un papel vital para el control del brazo. Sin
embargo, debido a la baja complejidad de los movimientos que debe efectuar el robot, el
estudio dinmico no ha sido requerido gracias a la implementacin de otros procesos mucho
ms sencillos que permiten solucionar los problemas de movimiento y que sern detallados
ms adelante. En lo que corresponde a la cinemtica, sta ofrece dos herramientas de
particular utilidad en robtica: la cinemtica directa y la cinemtica inversa.
En robtica, el problema de la cinemtica directa, que se explica a fondo en la Seccin
2.4, consiste en encontrar la posicin y orientacin del elemento terminal partiendo de que se
conocen los valores determinados de cada una de las articulaciones; mientras que la
cinemtica inversa, tambin explicada ms adelante, es un problema considerablemente ms
complejo, pues consiste en encontrar cada uno de los valores articulares partiendo de la
FACULTAD DE ELECTRNICA
20
posicin y orientacin deseada para el efector final (Barrientos, Pen, Balaguer, & Aracil,
2007); la complejidad del problema recae en el hecho de que no siempre es posible encontrar
una configuracin del manipulador que permita llegar a la posicin deseada debido a
limitantes propias de la geometra y la mecnica del brazo, o en caso contrario, que existen
infinidad de soluciones diversas para algunas posiciones.
Estos dos problemas se valen de herramientas matemticas, por medio del uso de
modelos cinemticos, los cuales son representaciones matemticas de la estructura mecnica a
controlar. Existen diversas formas de plantear estos modelos, lo que hace posibles distintas
representaciones de un mismo prototipo. Segn Fu y otros (1987, pgs. 13-14) Se utiliza
lgebra vectorial y matricial para desarrollar un mtodo generalizado y sistemtico para
describir y representar la localizacin de los elementos de un brazo con respecto a un sistema
de referencia fijo.
Como se mencion anteriormente, los clculos cinemticos se efectan con base en un
sistema de referencia. Esto cobra importancia debido a que se requiere especificar tanto
posicin como orientacin de los cuerpos rgidos que conforman un robot, por lo que existen
diversas herramientas para especificar estos parmetros con respecto al sistema de referencia;
para la representacin de la posicin existen las coordenadas polares , coordenadas
cilndricas , coordenadas esfricas y las coordenadas cartesianas
(Barrientos, Pen, Balaguer, & Aracil, 2007); siendo esta ltima la utilizada con el
manipulador concerniente a la presente investigacin debido a la propia estructura, pues al ser
un brazo antropomrfico, las dems coordenadas no resultan igual de prcticas en sus
clculos, adems de que el propio sistema de visin se basa en este tipo de coordenadas.
Barrientos y otros (2007) tambin hablan de las herramientas para la orientacin, que como
sabemos, son de vital importancia para la descripcin de la posicin, pues para el elemento
terminal no es suficiente con conocer nicamente su ubicacin en el espacio, sino tambin es
necesaria su orientacin; con este propsito se han planteado las matrices de rotacin, los
ngulos de Euler, los pares de rotacin y los cuaternios.
Para resolver las dos necesidades descritas en el prrafo anterior, existen las matrices de
transformacin homognea, que consisten en una solucin que engloba los parmetros de
posicin y de orientacin (Barrientos, Pen, Balaguer, & Aracil, 2007). Estas matrices estn
formadas por cuatro submatrices que indican rotacin, traslacin, perspectiva y escalado, cada
FACULTAD DE ELECTRNICA
21
una, tal como muestra la Ecuacin 2.1 que representa una matriz de
transformacin homognea para tres dimensiones (Barrientos, Pen, Balaguer, & Aracil,
2007):
[ ] [ ] Ecuacin 2.1
Las matrices de rotacin (3x3) y de traslacin (3x1) son de vital importancia en robtica,
mientras que las correspondientes de perspectiva (1x3) y escalado (1x1) es conveniente que se
pasen por alto, de modo que las componentes de perspectiva se mantengan en valores nulos y
la componente de escalado se mantenga en la unidad (Barrientos, Pen, Balaguer, & Aracil,
2007). Por tanto, slo ser necesario explicar las matrices de rotacin y de traslacin.
En lo que respecta a las de traslacin se cuenta con las tres componentes
correspondientes a los ejes X, Y, y Z. De modo que una transformacin de un vector r en un
sistema de referencia, se puede llevar a un vector r' en otro sistema de referencia si tenemos
un vector p que represente la distancia entre ambos sistemas de referencia (Barrientos, Pen,
Balaguer, & Aracil, 2007).
[ ] [ ][ ] [ ] Ecuacin 2.2
[ ] Ecuacin 2.3
[ ] Ecuacin 2.4
FACULTAD DE ELECTRNICA
22
[ ] Ecuacin 2.5
[ ] Ecuacin 2.6
[ ][ ][ ][ ]
[ ]
Ecuacin 2.8
Para la correcta determinacin de los cuatro parmetros D-H es necesario seguir ciertos
pasos concretos, los cuales estn especificados en el Anexo A.
En el caso que concierne al presente trabajo, tales parmetros fueron obtenidos con base
en el modelo del brazo tal como lo muestra la Fig. 2.3.
Fig. 2.3. Modelo simplificado del brazo. Muestra la nomenclatura de los pasos 1-3 del
Anexo A.
FACULTAD DE ELECTRNICA
27
La Fig. 2.3 muestra encerrados en crculos los nmeros asignados a los eslabones; los
cuadrados enumeran las articulaciones; y las lneas punteadas representan los ejes alrededor de
los cuales giran las articulaciones.
Habiendo identificado las articulaciones con que contar tal modelo matemtico, se
ubicaron y orientaron cada uno de los respectivos sistemas de referencia tal como el algoritmo
D-H lo establece. Siempre teniendo en cuenta las tres reglas que (Fu, Gonzlez, & Lee, 1987)
establecen:
1. El eje yace a lo largo del eje de la articulacin.
2. El eje es normal al eje y apunta hacia afuera de l.
3. El eje completa el sistema de coordenadas dextrgiro segn se requiera.
Fig. 2.4. Modelo simplificado del brazo mostrando los sistemas de referencias normalizados.
Izquierda vista lateral. Centro vista frontal. Derecha vista isomtrica. (Pasos 4-9 de Anexo A)
En este punto fueron calculados los cuatro parmetros D-H descritos anteriormente y
presentados en la Tabla 2.1:
FACULTAD DE ELECTRNICA
28
1 0 18.5
2 22.44 0
3 3.1 0
4 0 0
5 0 15.67
6 15 0
7 0 0
Tabla 2.1. Los cuatro parmetros D-H calculados para cada articulacin.
Tales parmetros se ajustaron, por una parte, tomando las medidas del modelo digital (en
SolidWorks) como del modelo en fsico, lo que nos permite una alta fiabilidad de su
proximidad a la situacin real. De los parmetros encontrados, se utiliz la Ecuacin 2.8 para
generar las matrices de transformacin , las cuales son desarrolladas en las ecuaciones:
Ecuacin 2.9, Ecuacin 2.10, Ecuacin 2.11, Ecuacin 2.12, Ecuacin 2.13, Ecuacin 2.14 y
Ecuacin 2.15:
[ ][ ][ ]
[ ]
[ ]
[ ]
Ecuacin 2.9
FACULTAD DE ELECTRNICA
29
[ ][ ][ ]
[ ]
[ ]
[ ]
Ecuacin 2.10
[ ][ ][ ]
[ ]
[ ]
[ ]
Ecuacin 2.11
FACULTAD DE ELECTRNICA
30
( ) ( )
[ ][ ][ ]
( ) ( )
[ ]
( ) ( )
( ) ( ) [ ]
( ) ( )
[ ]
[ ]
Ecuacin 2.12
[ ][ ][ ]
[ ]
[ ]
[ ]
Ecuacin 2.13
FACULTAD DE ELECTRNICA
31
( ) ( )
[ ][ ][ ]
( ) ( )
[ ]
( ) ( )
( ) ( ) [ ]
( ) ( )
[ ]
Ecuacin 2.14
[ ][ ][ ][ ]
[ ] [ ] [ ]
Ecuacin 2.15
Teniendo estas matrices de transformacin se vuelve sencillo llegar a la matriz de
transformacin T, pues basta con una multiplicacin de todas las matrices en un orden
consecutivo.
Ecuacin 2.16
Esta etapa, sin embargo, resulta bastante compleja para ser calculada en papel, por lo
que se recurri al software wxMaxima para obtener la matriz de transformacin T. El Anexo B
presenta el cdigo utilizado y que permiti encontrar cada una de las componentes de la matriz
T.
[ ]
Ecuacin 2.16 - 1
FACULTAD DE ELECTRNICA
32
Ecuacin 2.16 - 2
[ ]
Ecuacin 2.16 - 3
[ ]
Ecuacin 2.16 - 4
[ ]
Ecuacin 2.16 - 5
Ecuacin 2.16 - 6
[ ]
Ecuacin 2.16 - 7
FACULTAD DE ELECTRNICA
33
[ ]
Ecuacin 2.16 - 8
[ ]
Ecuacin 2.16 - 9
Ecuacin 2.16 - 10
[ ]
Ecuacin 2.16 - 11
[ ]
[ ]
Ecuacin 2.16 - 12
Ecuacin 2.16 - 13
Ecuacin 2.16 - 14
Ecuacin 2.16 - 15
FACULTAD DE ELECTRNICA
34
Ecuacin 2.16 - 16
Con la matriz obtenida en la Ecuacin 2.16 se vuelven bastante
sencillos los clculos de cinemtica directa que sern explicados en la siguiente seccin.
[ ][ ][ ]
[ ]
Ecuacin 2.17
Dado que la matriz de rotacin ya es conocida a estas alturas, se puede igualar a la
matriz presentada en la Ecuacin 2.17.
[ ] [ ]
Ecuacin 2.18
De esta forma, existen numerosas posibilidades para encontrar los ngulos roll, pitch y
yaw. Barrientos y otros (2007) proponen que se efecte un procedimiento como el siguiente
para encontrar tales ngulos.
Ecuacin 2.19
( ) Ecuacin 2.20
Ecuacin 2.21
( ) Ecuacin 2.22
Ecuacin 2.23
( ) Ecuacin 2.24
Es evidente que tal procedimiento pierde validez cuando pues tal condicin
tiene divisiones que no se pueden calcular, adems de la desventaja de las mltiples soluciones
de la funcin arcoseno. Para eso se puede utilizar el resto de los elementos de la matriz, y as
tener la certeza de los valores de los ngulos buscados. No fue necesario profundizar en esta
FACULTAD DE ELECTRNICA
36
etapa debido a que, como se mencion arriba, las funciones de la librera de OROCOS
permiten encontrar tales ngulos.
Teniendo la orientacin del actuador final, hace falta encontrar las coordenadas XYZ,
las cuales pueden ser conocidas evaluando los elementos que corresponden a la matriz de
traslacin de T. Tal que:
[ ] [ ] Ecuacin 2.25
De este modo se obtienen las seis variables que describen la posicin del gripper del
brazo robtico que interesa en el presente trabajo, a pesar de que tal proceso se simplific
bastante al ser programado gracias a las libreras utilizadas dentro de ROS, como se explica en
el Captulo 4.
[ ] Ecuacin 2.28
[ ]
Y dado que los valores numricos que toman los elementos de T pueden ser conocidos
con la cinemtica directa, se puede deducir que en el lado izquierdo de la
Ecuacin 2.26 se obtiene una expresin nicamente en trminos de , y en el lado
derecho est expresado nicamente en trminos de y , de este modo, al tenerlo aislado no
resulta complicado encontrar . De la Ecuacin 2.27, es sencillo
encontrar , pues se tiene despejado en el lado izquierdo ahora que se conoce , mientras
que en el lado derecho est slo en trminos de . Este ltimo puede ser calculado de manera
sencilla ahora que se conocen los otros dos trminos.
ste mtodo tambin es aplicable para encontrar las seis variables articulares tal como
Jazar (2006) lo describe utilizando n nmero de matrices inversas y de ecuaciones para
encontrar las articulaciones, el inconveniente de el uso de este mtodo de esta forma es la
complejidad que toman los clculos de esta manera. Es por eso que Barrientos y otros (2007)
proponen obtener las siguientes tres articulaciones por medio del desacoplo cinemtico.
En la seccin anterior se presentaron diversas propuestas que pueden ser utilizadas para
resolver el problema cinemtico inverso, sin embargo hay algunas consideraciones que deben
hacerse en cuanto al brazo en particular con el que se est trabajando.
Como se ha explicado, el manipulador cuenta con cinco grados de libertad, lo que limita
en cierta forma las posibilidades de sus movimientos, a diferencia de una cadena de seis
variables articulares. Matemticamente se puede observar a travs de las frmulas de
cinemtica directa, que el brazo tiene movimiento en X, Y y Z, adems de presentar rotaciones
que impliquen las tres variables utilizadas (roll-pitch-yaw). Sin embargo, a travs de la
observacin y la experiencia de programar tal brazo, se puede notar que una de las rotaciones
se altera solamente de manera indirecta y depende forzosamente de la configuracin del brazo
en general. Es decir que la variable pitch, que representa la rotacin con respecto al eje Y del
gripper, no puede ser controlada directamente por las articulaciones, sino que es la posicin
final quien obliga a tal variable a tomar algn valor determinado. Tal dificultad se debe al
diseo y distribucin mecnica de las articulaciones del brazo desde la etapa de diseo, lo que
condiciona la programacin y por ende el presente trabajo.
Esta dependencia del valor de pitch con respecto a la posicin final es un problema muy
complejo en s mismo. La lgica de la resolucin del problema cinemtico inverso implica que
se requiere como punto de partida la matriz de transformacin homognea con las posiciones y
rotaciones finales deseadas para el manipulador; sin embargo, por lo expresado en el prrafo
anterior, el pitch no puede ser calculado sino hasta que se conoce la configuracin general del
brazo; tal configuracin slo la podemos conocer a travs de la cinemtica inversa; esto
implica que la rotacin pitch se vuelve una ms de las variables que la resolucin de la
cinemtica inversa nos debe proporcionar.
Lo explicado en el prrafo anterior conduce a la premisa de que la eleccin de un
mtodo para resolver el problema cinemtico inverso debe forzosamente implicar una lgica y
una serie de ecuaciones en las cuales el valor de pitch pueda no ser requerido, y que una vez
que se resolvi la cinemtica, es cuando tal rotacin se vuelve conocida.
FACULTAD DE ELECTRNICA
42
En lo que respecta a los mtodos geomtricos, tienen el inconveniente de no ser
adecuados para robots con muchos grados de libertad, pues su planteamiento no est basado
en metodologas definidas, lo que para un robot de cinco grados de libertad implica una gran
complejidad en los clculos.
Para poder implementar el mtodo conocido como desacoplo cinemtico es
indispensable que el robot cuente con ciertas caractersticas en su morfologa; es decir, como
se explica en la Seccin 2.5.3, que las tres ltimas articulaciones coincidan en un mismo
punto, lo que resulta en una articulacin de tipo esfrica. Como se muestra en la Fig. 2.4, el
brazo del robot Donaxi no cumple con esta caracterstica, por lo que no es posible
implementar tal mtodo.
La cinemtica inversa por medio de la transformacin inversa, es un mtodo bastante
prctico y universal para lograr una resolucin directa, secuencial y con un bajo consumo de
recursos computacionales; sin embargo, tras lo explicado en prrafos anteriores, resulta
evidente que no puede ser implementado. Esto debido a que el mtodo exige conocer la matriz
de transformacin homognea (T) deseada al final del movimiento del robot, para la cual el
valor de pitch debe ser conocido antes de iniciar el proceso.
Esto conduce a nuevas condiciones para la seleccin del mtodo: debe ser un algoritmo
iterativo, pues las tcnicas matemticas directas para resolver el problema requieren por fuerza
del conocimiento previo de la matriz de rotacin. Se vuelve crucial, entonces, el comenzar a
evaluar los mtodos iterativos para la obtencin de las variables articulares del robot. Una de
las principales complicaciones de los mtodos de cinemtica inversa es el hecho de que todos
los existentes ofrecen ms de una solucin, y aunque para los mtodos directos, de una forma
o de otra pueden conocerse varias de esas soluciones, es posible seleccionar la ms adecuada o
econmica para el robot. Sin embargo, los mtodos iterativos tienen la complicacin de que si
logran converger en una configuracin para las articulaciones, stos entregan una sola
solucin, y no es posible determinar si es la mejor solucin posible para el brazo. As se llega
a un requisito ms: el mtodo debe poder orientarse hacia la posibilidad de converger en la
solucin ms econmica, no slo en cualquiera de las soluciones posibles.
Teniendo en cuenta tales consideraciones, se evaluaron las aproximaciones iterativas.
Una categora de stas son los mtodos basados en optimizacin, los cuales ofrecen una
caracterstica muy interesante que es la de aproximar una a una las articulaciones del robot que
FACULTAD DE ELECTRNICA
43
se estudia. Sin embargo, el mtodo no se puede implementar en su forma pura, pues
nuevamente exige el conocimiento de la matriz P final para cada iteracin. Es importante
mencionar que la idea de optimizar una sola articulacin por iteracin ofrece buenos
resultados como se explica en la siguiente seccin.
Para resolver la cinemtica inversa de robots se llegan a utilizar tambin algoritmos
genticos, los cuales si bien son bastante tiles en casos donde es necesario encontrar y
simplificar un modelo matemtico complejo, tienen diversos puntos en contra. Uno de ellos, es
el hecho de que no garantiza encontrar la solucin ms adecuada, pues para funcionar genera
mutaciones al azar derivadas de un conjunto previo de posibles soluciones que se tienen y
selecciona a las ms adecuadas, y el proceso se repite durante una cierta cantidad de
generaciones, as elige a la aproximacin ms apta. Esto adems implica una gran
cantidad de recursos computacionales, pues entre mejor se desee aproximar la solucin, ms
generaciones es conveniente procesar.
Tambin dentro de las aproximaciones iterativas estn los mtodos de la matriz
Jacobiana inversa y de la matriz Jacobiana transpuesta. Estos procedimientos fueron revisados
hasta que se tenan importantes avances con la propuesta de cinemtica inversa explicada en la
siguiente seccin. No se profundiz en su estudio, pues implicaba un retroceso en el desarrollo
a la par de que no se tiene garanta de la funcionalidad del mtodo en el brazo que se estudi.
Esto se debe a que existen casos particulares en que una matriz Jacobiana no tiene inversa, los
cuales estn condicionados por el diseo mecnico inicial del brazo, tales casos implican
eliminar grados de libertad de los clculos (Barrientos, Pen, Balaguer, & Aracil, 2007),
efecto indeseable para el robot. Tambin los clculos por medio de matrices Jacobianas exigen
el conocimiento de las funciones de velocidad articulares y del efector final, lo que incrementa
la cantidad de recursos computacionales requeridos para el robot.
FACULTAD DE ELECTRNICA
44
2.7. PROPUESTA DE CINEMTICA INVERSA PARA
MANIPULADOR DE DONAXI.
Algoritmo 2.1
KinematicsSolverDonaxi con parmetros de entrada: previous (tipo
InstruccionesInterfaz), goal (tipo Frame), freq (tipo double).
1. Definicin e inicializacin de variables, estructuras, clases y matrices
a utilizar:
1.1. Definicin de present, iteration y trial de tipo Frame.
1.2. Definicin de clase chain como la cadena cinemtica representativa
del brazo y sus respectivos segmentos.
1.3. Definicin de clase fksolver para cinemtica directa con parmetros
de entrada chain.
1.4. Definicin de presentpos, iterapos, trialpos de tipo arreglo de
articulaciones.
2. Inicializar presentpos con los valores de previous por ser la posicin
inicial.
3. Calcular cinemtica directa con parmetro de entrada presentpos y guardar
resultados en present.
4. Definir iterapos e iteration iguales a presentpos y present
respectivamente.
5. Calcular errores iniciales y sumarlos en errsum.
FACULTAD DE ELECTRNICA
46
6. Repetir mientras terminar sea falso y numero_de_pasos sea menor que
numero_de_columnas:
6.1. Comparar los distintos errores en X, Y, Z, Roll y Yaw y elegir el
mayor.
6.2. Incrementar nmero de pasos.
6.3. Prueba de casos.
6.4. Si hubo casos que reduzcan el error:
6.4.1. Identificar el costo menor.
6.4.2. Aplicar_caso con parmetros de entrada iterapos y el ltimo
paso del camino con el costo menor.
6.4.3. Evaluar_caso con parmetros de entrada iterapos.
6.4.4. Guardar caso en matriz itepath, que es el camino de la
iteracin actual y se borra de paths, pues como se explorar en
la siguiente iteracin ya no ser necesario guardarlo.
6.4.5. Evaluar y sumar todos los errores.
6.4.6. Si la suma de errores es menor que una tolerancia:
6.4.6.1. Activar bandera de solucin encontrada y activar bandera
de terminar iteraciones.
6.5. Si no:
6.5.1. Repetir Mientras romper_ciclo sea falso:
6.5.1.1. Descartar ruta.
6.5.1.2. Decrementar nmero de pasos.
6.5.1.3. Si el nmero de pasos es cero o igual a
numero_de_columnas:
6.5.1.3.1. Terminar, pues no se puede encontrar una solucin.
6.5.1.4. Si no:
6.5.1.4.1. Seleccionar el menor costo de los caminos restantes
en la matriz.
6.5.1.4.2. Si la fila del menor costo es distinta al mximo de
columnas:
6.5.1.4.2.1. Aplicar los pasos del camino elegido a
presentpos y guardarlos en iterapos, luego
eliminarlos de la matriz paths.
6.5.1.4.2.2. Evaluar la cinemtica directa para el camino
elegido.
6.5.1.4.2.3. Evaluar y sumar los errores.
6.5.1.4.2.4. Romper_ciclo igual a verdadero.
6.5.1.4.3. Si no:
6.5.1.4.3.1. Romper_ciclo igual a falso.
7. Solucin igual a previous.
8. Si solucin encontrada es igual a verdadero:
8.1. Solucin igual a iterapos.
8.2. Calcular velocidades y guardarlas en solucin.
9. Regresar solucin.
Es importante observar el paso 6.1 del Algoritmo 2.1, que consiste en una pequea
secuencia de condicionales para guardar en una variable un valor entero que se identifica
como el eje que tiene un error mayor, y donde el error en pitch es ignorado por todo lo que se
ha explicado previamente.
FACULTAD DE ELECTRNICA
47
Existen algunos pasos que en s mismos no dejan muy clara su funcin, tal es el caso del
paso 6.3 Prueba de casos, el cual se encarga de escribir en la matriz paths todos los casos
que reducen el error. El Algoritmo 2.2 explica su funcionamiento.
Los llamados casos son tipos de cambios discretos que pueden ser aplicados a las
articulaciones, e implican incrementos o decrementos de una o dos articulaciones nicamente,
siguiendo el ejemplo de los mtodos basados en optimizacin; se tiene un total de 22 casos,
los cuales estn pensados para reducir el nmero de iteraciones requeridas para lograr la
convergencia. Adems, los casos consideran la necesidad de nunca exceder los lmites de
movimiento de los servomotores. El Algoritmo 2.3 explica los casos y su implementacin.
Algoritmo 2.2
6.3. Prueba de casos.
6.3.1. Inicializar ndice_de_filas, ndice_de_casos y bandera que
indica si algn caso mejora el error.
6.3.2. Repetir mientras ndice_de_casos sea menos que 22:
6.3.2.1. Incremento al ndice de casos.
6.3.2.2. Aplicar_caso con parmetros de entrada iterapos y
case_index y guardar en trialpos.
6.3.2.3. Evaluar trialerror, que es el error de trialpos con
respecto a goal en el eje seleccionado en 6.1.
6.3.2.4. Si trialerror es menor que error mximo encontrado en 6.1:
6.3.2.4.1. Guardar que hubo casos que mejoran.
6.3.2.4.2. Buscar una fila en blanco de la matriz costs, si no
hubiera filas en blanco, terminar.
6.3.2.4.3. Evaluar_costo con parmetros de entrada trialpos y
goal.
6.3.2.4.4. Escribir en la matriz paths el camino que corresponde
al caso.
En el paso 6.3.2.1, se llama a una funcin que no slo incrementa el valor del caso, sino
que adems evita que se evalen casos que hagan la funcin contraria a la que se efectu en la
iteracin previa, esto es importante para reducir la posibilidad de que el algoritmo se cicle
evaluando una y otra vez los mismos casos.
En el paso 6.3.2.2 ocurre un llamado a la funcin aplicar_caso, la cual se encarga de
hacer los incrementos o decrementos correspondientes al caso seleccionado a un determinado
arreglo de articulaciones. Esta etapa corresponde al Algoritmo 2.3.
FACULTAD DE ELECTRNICA
48
Algoritmo 2.3
Aplicar_caso con parmetros de entrada: arreglo de articulaciones
jointconfig, entero case_index.
1. Segn case_index hacer:
1.1. Caso 1:
1.1.1. Incrementar jointconfig(0) en MIN_CHANGE.
1.2. Caso 2:
1.2.1. Decrementar jointconfig(0) en MAX_CHANGE.
1.3. Caso 3:
1.3.1. Incrementar jointconfig(1) en MIN_CHANGE.
1.4. Caso 4:
1.4.1. Decrementar jointconfig(1) en MAX_CHANGE.
1.5. Caso 5:
1.5.1. Incrementar jointconfig(2) en MIN_CHANGE.
1.6. Caso 6:
1.6.1. Decrementar jointconfig(2) en MAX_CHANGE.
1.7. Caso 7:
1.7.1. Incrementar jointconfig(3) en MIN_CHANGE.
1.8. Caso 8:
1.8.1. Decrementar jointconfig(3) en MAX_CHANGE.
1.9. Caso 9:
1.9.1. Incrementar jointconfig(4) en MIN_CHANGE.
1.10. Caso 10:
1.10.1. Decrementar jointconfig(4) en MAX_CHANGE.
1.11. Caso 11:
1.11.1. Incrementar jointconfig(0) en MIN_CHANGE.
1.11.2. Incrementar jointconfig(2) en MIN_CHANGE.
1.12. Caso 12:
1.12.1. Decrementar jointconfig(0) en MAX_CHANGE.
1.12.2. Decrementar jointconfig(2) en MAX_CHANGE.
1.13. Caso 13:
1.13.1. Incrementar jointconfig(0) en MIN_CHANGE.
1.13.2. Incrementar jointconfig(2) en MAX_CHANGE.
1.14. Caso 14:
1.14.1. Decrementar jointconfig(0) en MAX_CHANGE.
1.14.2. Incrementar jointconfig(2) en MIN_CHANGE.
1.15. Caso 15:
1.15.1. Incrementar jointconfig(3) en MIN_CHANGE.
1.15.2. Incrementar jointconfig(4) en MIN_CHANGE.
1.16. Caso 16:
1.16.1. Decrementar jointconfig(3) en MAX_CHANGE.
1.16.2. Decrementar jointconfig(4) en MAX_CHANGE.
1.17. Caso 17:
1.17.1. Incrementar jointconfig(3) en MIN_CHANGE.
1.17.2. Decrementar jointconfig(4) en MAX_CHANGE.
1.18. Caso 18:
1.18.1. Decrementar jointconfig(3) en MAX_CHANGE.
1.18.2. Incrementar jointconfig(4) en MIN_CHANGE.
1.19. Caso 19:
1.19.1. Incrementar jointconfig(1) en MIN_CHANGE.
1.19.2. Incrementar jointconfig(2) en MIN_CHANGE.
1.20. Caso 20:
1.20.1. Decrementar jointconfig(1) en MAX_CHANGE.
1.20.2. Decrementar jointconfig(2) en MAX_CHANGE.
1.21. Caso 21:
1.21.1. Incrementar jointconfig(1) en MIN_CHANGE.
FACULTAD DE ELECTRNICA
49
1.21.2. Decrementar jointconfig(2) en MAX_CHANGE.
1.22. Caso 22:
1.22.1. Decrementar jointconfig(1) en MAX_CHANGE.
1.22.2. Incrementar jointconfig(2) en MIN_CHANGE.
2. Verificar lmites de articulaciones:
2.1. jointconfig(0):
2.1.1. Lmite superior 156.
2.1.2. Lmite inferior 6.
2.2. jointconfig(1):
2.2.1. Lmite inferior 90.
2.2.2. Lmite superior 186.
2.3. jointconfig(2):
2.3.1. Lmite inferior 270.
2.3.2. Lmite superior 116.
2.4. jointconfig(3):
2.4.1. Lmite inferior 216.
2.4.2. Lmite superior 148.
2.5. jointconfig(4):
2.5.1. Lmite inferior 73.
2.5.2. Lmite superior 214.
3. Si articulacin_modificada es menor a 360:
3.1. Restar 360 a la articulacin.
4. Si articulacion_modificada <0:
4.1. Sumar 360 a la articulacin.
En tal funcin es observable que no solamente se cuidan los lmites de las distintas
articulaciones, sino que tambin se cuida no tener valores de ngulos negativos ni mayores a
360. Esto es muy importante, pues al mantener los ngulos dentro de rangos controlados es
considerablemente ms sencillo efectuar el control de los servomotores. Por otra parte, durante
la depuracin, se observ que ocurran ocasiones en que el algoritmo se ciclaba tras una serie
compleja e impredecible de casos contrarios, regresando a estados de iteraciones previas; por
tales razones se opt por el uso de dos constantes distintas, una de un valor mayor que la otra,
utilizando una para incrementos y la otra para decrementos, causando que en tales casos, sea
mucho ms improbable que el cdigo se cicle, pues se vuelve mucho ms complicado hacer
que se regrese a un estado de iteraciones previas.
Para el caso 6.3.2.4.3 se llama a una funcin llamada evaluar_costo. Esta funcin recibe
tal nombre porque se origin a raz de la inquietud de optimizar el algoritmo por medio del
concepto de costo propio del algoritmo de bsqueda A*, el cual se forma de la suma de la
distancia del punto origen a un punto intermedio en el camino, ms la distancia del punto
intermedio al punto objetivo (Popirlan & Dupac, 2009); esto en teora, permitira que cada
iteracin mantuviera lo ms cerca posible al desplazamiento del manipulador en el camino
ms corto al objetivo. Sin embargo, en la prctica se observ que tal suma no resultaba
FACULTAD DE ELECTRNICA
50
conveniente, pues el hecho de incluir la distancia del punto inicial al de la iteracin, causa en
ocasiones que el algoritmo regrese a estados de iteraciones anteriores, esto se debe a que de
esa manera no hay forma de reconocer cul de los dos parmetros es el que disminuye y cual
aumenta. Por esa razn, se opt por eliminar el clculo del parmetro de distancia del punto
inicial al de la iteracin, y qued nicamente como la evaluacin de la distancia del punto de
la iteracin al punto objetivo, es decir, la suma de los valores absolutos de los errores.
Ya se explic cmo se calcula la cinemtica inversa del manipulador del robot, sin
embargo tales clculos funcionan para valores puntuales. Con esto, si nicamente se mandan
los valores articulares a los servomotores, es lgico que el brazo alcance la posicin deseada;
sin embargo, no es suficiente con hacer eso, pues dado que cada servomotor se mover una
distinta cantidad de grados, la trayectoria que se seguira sera impredecible. Esto representa
un peligro para tanto el robot como para su entorno, pues puede ocasionar colisiones. Para
evitar estos problemas, en robtica se utilizan mtodos de planificacin de rutas para
manipulacin, que permiten calcular el camino que debe seguir el manipulador y que le
permita cumplir con su objetivo de manipulacin as como hacerlo de una manera segura.
El problema del control del manipulador se puede dividir en dos partes: planeacin de la
trayectoria y control del movimiento (Fu, Gonzlez, & Lee, 1987). Estas dos partes estn
fuertemente relacionadas, sin embargo, en esta seccin se hablar de la planeacin de
trayectorias.
Jazar (2006) explica que la planeacin implica tres etapas: primero est la definicin de
una curva geomtrica para el elemento terminal entre dos puntos, en segundo lugar, se define
un movimiento rotacional y finalmente la definicin de una funcin de tiempo para
variaciones en las coordenadas. Tambin Lewis y otros (2004) defienden que la planificacin
implica encontrar una ruta prescrita, que en ocasiones se trata por separado e incluye evasin
de colisiones, saturacin de actuadores y dems.
FACULTAD DE ELECTRNICA
51
Las funciones del control cinemtico, de acuerdo con Barrientos y otros (2007), deben
ser la conversin del movimiento a una trayectoria en el espacio cartesiano y su relacin con el
tiempo; la obtencin de un nmero finito de puntos de tal trayectoria; conversin de tales
puntos a coordenadas articulares por medio de cinemtica inversa siguiendo con la generacin
de una funcin del tiempo para cada articulacin; y finalmente un muestreo de tal trayectoria
articular para generar referencias al control dinmico. Todo esto teniendo siempre en cuenta el
espacio de trabajo y las velocidades mximas de los actuadores. Tales funciones son de una
vital importancia, pues como se ver en los mtodos de planificacin explicados adelante, para
evitar movimientos caticos en los manipuladores es importante cubrir tales clculos.
Algoritmo 2.4
1. Llevar el gripper a una posicin inicial conocida.
2. Realizar un movimiento vertical en lnea recta (eje Y) hasta la altura
especificada a la que se encuentra el objeto. Esta altura debe tener en
cuenta las dimensiones particulares del objeto que se pretende tomar y
las dimensiones del manipulador para evitar colisiones con la
FACULTAD DE ELECTRNICA
55
superficie.
3. Abrir el gripper.
4. Llevar el gripper en un movimiento en lnea recta sobre el plano
horizontal en que se encuentra (a lo largo de los ejes X y Z) hasta la
coordenada del objeto que se desea tomar.
5. Cerrar gripper.
6. Realizar un movimiento vertical en lnea recta (eje Y) de algunos
centmetros para levantar el objeto tomado.
7. Realizar un movimiento en lnea recta sobre el plano horizontal en que se
encuentra el gripper hasta la posicin inicial de los ejes X y Z.
Tras realizar esa serie de pasos, el manipulador habr tomado el objeto de inters.
Teniendo en cuenta el patrn de comportamiento, es posible analizarlo como una secuencia,
para la cual los pasos se pueden agrupar en dos tipos:
Movimientos fijos: los cuales consisten en cambios en los valores articulares
siempre constantes a velocidades igualmente constante. Se pueden apreciar en
los pasos 1, 3 y 5 del Algoritmo 2.4, pues ellos no dependen en nada de la
posicin del objetivo.
Trayectorias en lnea recta: las cuales estn presentes en los pasos 2, 4, 6 y 7
del Algoritmo 2.4, y cuyas series de coordenadas dependen estrictamente de la
posicin del objetivo, por tanto no sern valores articulares siempre constantes,
sino que variarn y debern ser calculados en tiempo real.
Para el primer tipo, los movimientos fijos, resulta evidente que al ser posiciones
conocidas, el programador especificar manualmente las coordenadas articulares antes de la
ejecucin de la tarea. Este tipo de movimientos es bastante sencillo y se explicar en el
siguiente captulo, en la Seccin 3.5.
El segundo tipo, las trayectorias en lnea recta, deben ser calculadas automticamente
por el robot, por lo que se plante un sencillo algoritmo para interpolar esta serie de puntos
sobre una lnea recta desde un punto inicial a uno final. Teniendo en cuenta el Algoritmo 2.4,
se puede observar que para los pasos 2, 4, 6 y 7 se tienen puntos iniciales y finales conocidos,
es decir que se conocen sus coordenadas cartesianas.
Tales puntos en el espacio sirven matemticamente para encontrar la ecuacin vectorial
de una recta. Tal como explica Grossman (1992), es posible obtener una ecuacin de la forma:
FACULTAD DE ELECTRNICA
56
Ecuacin 2.33
Donde representa el vector del origen a un punto cualquiera, el vector del origen
a un punto inicial conocido, un nmero real y un vector paralelo a la recta. Por tanto, si se
tiene un punto inicial:
Ecuacin 2.34
Y un punto final:
Ecuacin 2.35
Es posible encontrar un vector director con una simple resta entre el punto inicial y final,
sin embargo, dado que la nica caracterstica til del vector es su direccin, es decir, debe ser
paralelo a la recta sin importar su magnitud (Grossman, 1992), se opt por calcular el vector
unitario que tenga la misma direccin, el cual es multiplicado por una constante c:
(
) Ecuacin 2.36
(
) Ecuacin 2.40
Con tal ecuacin resulta bastante sencillo el clculo de los puntos de la trayectoria por
medio de iteraciones en las cuales, se comienza igualando el punto A a la posicin inicial y
durante el resto de las iteraciones, A simplemente cambia por el punto O de la iteracin
FACULTAD DE ELECTRNICA
57
anterior. Teniendo en cuenta esto, y el Algoritmo 2.4 se plante el Algoritmo 2.5 que es ms
especfico.
En el Algoritmo 2.5 se tienen ciertas variables que es importante mencionar. La
estructura brazo_obj contiene los parmetros para cada uno de los servomotores a los cuales se
pretende llegar, de mismo modo, brazo_actual, contiene los parmetros del estado de las
articulaciones en se momento especfico de la ejecucin; ambas estructuras son de tipo
InstruccionesInterfaz, los cuales son explicados en la seccin 2.7. Aparecen tambin clases de
tipo Frame: frpresent, frstep y frgoal; las cuales representan posicin (un vector) y orientacin
(una matriz de rotacin); en el caso de frpresent guarda las coordenadas en las que se
encuentra el brazo en cada momento de las distintas etapas, mientras que frstep, indica la
posicin que se pretende alcanzar al finalizar la etapa correspondiente; de la misma forma,
frgoal, guarda las coordenadas donde se encuentra el objeto. Tambin hay vectores utilizados:
distancia guarda el vector que va desde la posicin actual del gripper a la que se pretende
llegar en un momento determinado de la ejecucin.
Algoritmo 2.5
1. Definir brazo_obj igual a valores conocidos.
2. FaseSecuencia con parmetros de entrada brazo_actual, brazo_obj, 5 y
guardar resultado en brazo_actual.
3. Definir posicin actual conocida (coincidente con las coordenadas del
gripper que se alcanzaron con el paso 1) y guardarla en frpresent.
4. Definir frstep igual a frpresent.
5. Ajustar coordenadas a alcanzar:
5.1. Definir la coordenada en y de frstep igual a la coordenada en y de
frgoal.
6. Calcular vector distancia igual a la resta de los vectores de posicin de
frstep frpresent.
7. EvalMagnitude con parmetros de entrada distancia y guardar en magnitud.
8. Calcular vector director con parmetros de entrada distancia y magnitud.
9. Trazar movimiento desde frpresent hasta frstep.
10. Secuencia para abrir gripper:
10.1. Definir brazo_obj igual a brazo_actual.
10.2. Definir valor de servo 6 en abierto.
10.3. FaseSecuencia con parmetros de entrada brazo_actual, brazo_obj, 3
y guardar resultado en brazo_actual.
11. Definir frstep igual a frpresent.
12. Ajustar coordenadas a alcanzar:
12.1. Definir la coordenada en x de frstep igual a la coordenada en x de
frgoal.
12.2. Definir la coordenada en z de frstep igual a la coordenada en z de
frgoal.
13. Calcular vector distancia igual a la resta de los vectores de posicin
de frstep frpresent.
FACULTAD DE ELECTRNICA
58
14. EvalMagnitude con parmetros de entrada distancia y guardar en magnitud.
15. Calcular vector director con parmetros de entrada distancia y magnitud.
16. Trazar movimiento desde frpresent hasta frstep.
17. Secuencia para cerrar gripper:
17.1. Definir brazo_obj igual a brazo_actual.
17.2. Definir valor de servo 6 en cerrado.
17.3. FaseSecuencia con parmetros de entrada brazo_actual, brazo_obj, 3
y guardar resultado en brazo_actual.
18. Definir frstep igual a frpresent.
19. Ajustar coordenadas a alcanzar:
19.1. Definir la coordenada en y de frstep igual a la coordenada en x de
frgoal + 4.
20. Calcular vector distancia igual a la resta de los vectores de posicin
de frstep frpresent.
21. EvalMagnitude con parmetros de entrada distancia y guardar en magnitud.
22. Calcular vector director con parmetros de entrada distancia y magnitud.
23. Trazar movimiento desde frpresent hasta frstep.
24. Definir frstep igual a frpresent.
25. Ajustar coordenadas a alcanzar:
25.1. Definir la coordenada en x de frstep igual a 0 (posicin inicial).
25.2. Definir la coordenada en z de frstep igual a 18.5 (posicin
inicial).
26. Calcular vector distancia igual a la resta de los vectores de posicin
de frstep frpresent.
27. EvalMagnitude con parmetros de entrada distancia y guardar en magnitud.
28. Calcular vector director con parmetros de entrada distancia y magnitud.
29. Trazar movimiento desde frpresent hasta frstep.
30. Fin de movimiento.
Algoritmo 2.6
1. Repetir mientras magnitud sea mayor o igual a PASO_RUTA.
1.1. Definir el vector frpresent igual a la suma del vector de frpresent
y director.
1.2. KinematicsSolverDonaxi con parmetros de entrada brazo_actual,
frpresent, FREQUENCY y guardar resultados en brazo_actual.
1.3. Si se recibi mensaje del paro de emergencia entonces
1.3.1. Apagar servomotores.
1.3.2. Fin de Si
1.4. Enviar datos de brazo_actual a interfaz y a simulador.
1.5. Calcular vector distancia igual a la resta de los vectores de
posicin de frstep frpresent.
1.6. EvalMagnitude con parmetro de entrada distancia y guardar en
FACULTAD DE ELECTRNICA
59
magnitud.
1.7. Verificar mensajes.
1.8. Esperar tiempo requerido por la frecuencia de la interfaz.
1.9. Fin de repetir.
CAPTULO 3. ROS.
60
FACULTAD DE ELECTRNICA
61
3.1. ARQUITECTURAS DE CONTROL PARA ROBOTS.
Si se toma en cuenta que los robots se diferencian del resto de las mquinas por su
capacidad de salir de lo repetitivo y adaptarse al problema particular que debe resolver,
implica que sern mquinas con una serie de elementos que les permitan conocer su entorno, a
la par de algunos otros sistemas que les capaciten para actuar sobre todo lo que lo rodea. Esto
deja entrever la necesidad de inteligencia de un robot, tal como lo han expresado distintos
autores: (Murphy, 2000), (Fu, Gonzlez, & Lee, 1987), y (Siciliano, Sciavicco, Villani, &
Oriolo, 2009) definen a la robtica como la ciencia que estudia la conexin inteligente entre
la percepcin y la accin, e incluso (Jazar, 2006) que sugiere que los robots inteligentes sean
una clasificacin.
Esta inteligencia debe venir por fuerza de su sistema de control, el cual, de acuerdo con
(Siciliano, Sciavicco, Villani, & Oriolo, 2009) debe tener las siguientes funciones: capacidad
de mover objetos fsicos; capacidad de obtener informacin sobre el propio sistema as como
el entorno; capacidad de aprovechar la informacin y modificar el comportamiento del
sistema; y capacidad de almacenar y presentar informacin de las actividades del sistema.
Murphy (2000) explica estas mismas funciones llamndoles primitivas de robtica. Para
eso es importante primero abordar el concepto de paradigma, que lo define como la filosofa
o conjunto de suposiciones y/o tcnicas que caracterizan una aproximacin a una clase de
problemas. Este concepto se refiere a una forma particular de abordar un problema,
abarcando tanto la forma de estudiarlo como las herramientas utilizadas. As, para organizar la
inteligencia de un robot, se proponen tres paradigmas principales: jerrquico, reactivo e
hbrido. Con esto, Murphy (2000) tambin sugiere dos formas de describir los paradigmas en
robtica: 1) Por la relacin entre las tres primitivas de robtica: sensar, planificar y actuar y 2)
por la forma en la que la informacin es procesada y distribuida en el sistema. Como se
observa, estas dos descripciones engloban las funciones descritas en el prrafo anterior, por
tanto, es posible abordar el sistema de control como el paradigma de inteligencia del robot.
El paradigma jerrquico consiste en que el robot primero sensa su entorno, con base en
esa informacin, en una segunda etapa, planifica la accin a realizar, y finalmente ejecuta la
accin planeada sin recaudar informacin nueva sobre el entorno (Murphy, 2000). Estos tres
pasos se repetiran tantas veces el robot est funcionando. Este paradigma no resulta muy
FACULTAD DE ELECTRNICA
62
prctico para todos los robots o tareas, pues dan por sentado que el entorno sera esttico y
constante.
En cuanto al paradigma reactivo, Murphy (2000) explica que surgi en oposicin al
paradigma jerrquico, pues en esta nueva aproximacin el robot tiene una serie de
comportamientos, los cuales se deciden con base en cierta informacin recibida de los
sensores, por tanto la actuacin es el resultado de la combinacin de los distintos
comportamientos dictados por los sensores. Este paradigma carece de consideracin ante
cualquier etapa de planificacin, se limita completamente a generar la interaccin entre las
primitivas de sensado y actuacin.
Esta carencia de planificacin desemboc en la aparicin del tercer paradigma:
Paradigma hbrido deliberativo reactivo. El cual delibera, en una etapa inicial, cul sera la
forma ptima de dividir una tarea para su solucin y cules seran los comportamientos que
permitiran lograr cada subtarea y dems; para que en una segunda etapa, se realice el sensado
y la actuacin de manera simultnea tal como ocurre en el paradigma reactivo (Murphy,
2000). Este paradigma entonces puede considerarse una combinacin de los paradigmas
jerrquico y reactivo.
Es importante definir entonces una arquitectura. Mientras Siciliano y otros (2009),
definen una arquitectura funcional como la superposicin de varios niveles de actividades
organizados en una estructura jerrquica. Murphy (2000) propone, a travs de citar a otros
autores (ver fuente), una definicin que implica que la arquitectura ofrece una manera de
organizar el sistema de control, adems de la descripcin del conjunto de componentes y la
forma en que estos interactan.
Es muy importante diferenciar el paradigma de la arquitectura. Mientras el paradigma se
refiere a la forma de abordar o resolver un problema, la arquitectura es la manera de organizar
la solucin propuesta por el paradigma en particular. Esto quiere decir que para un mismo
paradigma existen diversas arquitecturas que lo resuelven.
As, para el caso del paradigma jerrquico, Murphy (2000) propone dos arquitecturas
populares:
Control jerrquico anidado (Nested hierarchical controller), en el cual se
pueden identificar claramente las tres etapas: sensado, planificacin, y actuacin.
En la primer etapa, los sensores reconocen el mundo y generan un modelo virtual
FACULTAD DE ELECTRNICA
63
de ste, para lo cual se requieren ciertos conocimientos a priori que
complementen la informacin adquirida por los sensores. Luego se pasa a la
etapa de planificacin que consiste en tres partes: el planeador de misin, el
navegador y el piloto; la primera determina a grandes rasgos lo que el robot debe
hacer para cumplir la tarea; y as el navegador toma esa informacin, y en
conjunto con el modelo del mundo traza una ruta para lograr lo establecido por el
planeador de misin; y finalmente el piloto toma cada segmento de la ruta y
define la serie de acciones especficas que permiten ejecutar cada uno de tales
segmentos. As, por ltimo en la etapa de actuacin, se traduce a seales de
actuadores cada una de las acciones indicadas por el piloto.
Sistema de Control en tiempo Real (RCS), que presenta un sistema que agrupa
las actividades en las tres etapas de las que se ha hablado: sensar, planificar y
actuar. En la etapa de sensado se agrupan varias etapas, entre las cuales, las
lecturas de los sensores pasan a un mdulo de preprocesamiento de la
informacin y de ste al de modelado del mundo virtual; luego, en la etapa de
planificacin se encuentra el mdulo de juicio de valor el cual planifica y simula
lo planeado para asegurar que sea funcional, para que entonces, el mdulo de
FACULTAD DE ELECTRNICA
64
generacin de comportamientos traduzca el plan en acciones que el robot pueda
generar, lo que constituye la etapa de actuacin.
Para el caso del paradigma reactivo, es importante tener en cuenta que las arquitecturas
presentadas deben contar con mecanismos para activar comportamientos y para determinar
qu ocurre cuando varios comportamientos estn activos al mismo tiempo (Murphy, 2000). De
igual manera Murphy (2000) propone tres arquitecturas representativas:
Subsumption architecture. En estas arquitecturas se agrupan mdulos
esquemticos en capas de competencia o comportamientos abstractos. Los
FACULTAD DE ELECTRNICA
65
niveles altos de estas capas pueden incluir o suprimir comportamientos de
niveles inferiores, y los comportamientos de niveles inferiores no pueden ser
reescritos ni reemplazados; adems de que no existe planificacin alguna, los
comportamientos surgen por la presencia de estmulos en el entorno. Al no
elaborar un modelo virtual del mundo, no utiliza mecanismos para recordar el
pasado ni para monitorear cambios en el entorno, pues se limita a atender a
estmulos. A pesar de sus ventajas, estas arquitecturas son muy complicadas de
disear de modo que el robot pueda recibir la orden en algn momento de hacer
una tarea distinta sin ser reprogramado.
Metodologas de campos potenciales. Se utilizan vectores para representar
comportamientos, de modo que una suma de vectores produce un
comportamiento emergente. Tales vectores se organizan en arreglos de
vectores que equivalen a fuerzas en cada punto del espacio en que el robot puede
moverse. Las fuerzas pueden configurarse en cinco perfiles bsicos (uniforme,
perpendicular, atractivo, repulsivo y tangencial) los cuales se pueden combinar
para generar campos potenciales ms complejos. Adems se recurre a perfiles de
magnitud, que se refiere a los cambios que tienen tales vectores en su magnitud
dependiendo la distancia al objeto que causa tal campo.
Fig. 3.3. Ejemplo de combinacin de campos potenciales: uno atractivo y uno repulsivo.
Tomado de (Murphy, 2000).
FACULTAD DE ELECTRNICA
66
Rule encoding. En este estilo de arquitecturas los componentes de los
comportamientos y el mecanismo de combinacin son implementados como
reglas lgicas.
Por ltimo, para el paradigma hbrido deliberativo/reactivo, Murphy (2000) explica que
este paradigma surgi a raz de la necesidad de cierta inteligencia y capacidad de deliberar
para hacer planes y ejecutarlos. As se lleg a la idea de que los robots hbridos cuentan con
las mejores arquitecturas debido a que utilizan procesamientos asncronos para que las
funciones deliberativas se ejecuten de manera independiente de los comportamientos
reactivos; adems de que al tener un software modular, permite que los subsistemas puedan
ser mezclados y combinados para las aplicaciones que se requieran.
Las arquitecturas hbridas, segn Murphy (2000) tienen componentes comunes, como
agentes secuenciadores, que se presentan como redes de dependencias o mquinas de
estados, las cuales generan los comportamientos o secuencias para lograr subtareas; un gestor
de recursos, que se encarga de la distribucin de las fuentes de informacin para los
comportamientos, as como la seleccin de libreras; un cartgrafo responsable de crear,
almacenar y mantener un mapa de informacin espacial; un planificador de misin que se
encarga de la interaccin con el humano a la vez que la traduccin de sus instrucciones a
trminos en que el robot pueda comprender sus tareas para as construir un plan para la
misin; y por ltimo un agente encargado de monitorear el desempeo y de resolver
problemas, el cual permite analizar si el robot est progresando o no en el cumplimiento de su
tarea. Adems se han establecido tres estilos de arquitecturas hbridas: estilos de gestin,
jerarquas de estados y estilos orientados a modelos.
En cuanto a los estilos de gestin, Murphy (2000) presenta como las principales:
Arquitectura de robot autnomo (AuRA), que consiste en cinco subsistemas
agrupados en las dos porciones propias de una arquitectura hbrida: la parte
deliberativa comprende un planificador y el cartgrafo, mientras que la porcin
reactiva est formada por el subsistema sensorial y el motriz; as el ltimo
subsistema Homeostatic control est en un rea intermedia entre ambas
porciones. Estas arquitecturas se apoyan en los mtodos de campos potenciales y
en un planificador jerrquico anidado.
FACULTAD DE ELECTRNICA
67
Efectos de fusin de sensores (SFX), que inicialmente fue concebida como una
extensin de AuRA y con el paso del tiempo se convirti en una reorganizacin
de los mismos componentes de AuRA, utilizando un modelo sensorial
neurofisiolgico.
Murphy (2000) presenta una nica arquitectura para explicar las de jerarquas de
estados, que es la de 3-niveles (3-Tiered) o 3T. La principal caracterstica de estas
arquitecturas es la presencia de tres capas en la arquitectura de control, es por eso que se limita
a explicar 3T. En la capa superior se encuentra el planificador, que implica un planificador de
misin y un cartgrafo que generan los planes estratgicos de acuerdo a los objetivos. De ellos
se pasa a la capa intermedia, que est formada por un secuenciador, que utiliza una tcnica de
planificacin reactiva y que genera un conjunto de comportamientos, adems de estar a cargo
de monitorear las funciones de tales comportamientos. stos ltimos forman la capa inferior y
que por definicin son llamados habilidades.
Las arquitecturas orientadas a modelos ms importantes son (Murphy, 2000):
Saphira. Se apoya en el principio de las claves de un robot mvil: coordinacin,
coherencia y comunicacin. El robot debe ser capaz de coordinar no slo sus
actuadores y sensores, sino tambin sus objetivos en un perodo de tiempo; as, la
coherencia es importante para un buen comportamiento; y la comunicacin para
interactuar con humanos y comunicarse con otros robots. La planificacin es lo
ms importante para estas arquitecturas, y para ello se valen de un planificador
llamado PRS-lite (Procedural Reasoning System-lite), el cual se apoya bastante
en el modelo virtual del mundo, que es considerado un proveedor de sensores
virtuales.
FACULTAD DE ELECTRNICA
68
En la seccin anterior se habl de las ventajas del uso de ROS, de la existencia de los
nodos, de los tpicos, de libreras y dems herramientas que favorecen el desarrollo de
arquitecturas robticas.
Es importante mencionar que ROS ofrece dos opciones primordiales en cuanto a
lenguajes de programacin. Es posible programar tanto en Python como en C++ pudiendo
aprovechar las ventajas propias de cada uno de esos lenguajes. Todas las funciones bsicas de
ROS estn disponibles para los mdulos programados en cualquiera de los dos lenguajes, sin
embargo, como es evidente, existen ciertas ventajas ms puntuales en alguno de ellos que en el
otro; por ejemplo, la existencia de ciertas libreras nicamente para alguno de los dos
lenguajes. Es por eso que el sistema de mensajes de ROS ofrece la ventaja de permitir la
comunicacin entre nodos sin importar el lenguaje con que hayan sido hechos, es decir, un
nodo en Python puede enviar mensajes a otro en C++ y viceversa. Estas dos opciones plantean
la posibilidad de la coexistencia de ambos lenguajes en el sistema de control, como termina
por ocurrir tanto en el robot Donaxi en general como en el presente trabajo (brazo
manipulador).
A continuacin se presentarn algunas caractersticas de ROS que permitirn explicar
cmo fue que se desarroll todo el software.
Todos los programas y libreras desarrolladas para correr sobre ROS, se organizan en
dos niveles segn (Navigating the ROS Filesystem, 2013):
FACULTAD DE ELECTRNICA
75
Stacks. Los stacks son vistos como carpetas que almacenan diversos paquetes,
los cuales favorecen una mejor organizacin de los paquetes en proyectos
extensos.
Paquetes. Que son el nivel bajo donde se almacenan las libreras, ejecutables y
herramientas.
Cada uno de los dos niveles posee un archivo manifiesto el cual contiene la descripcin
del contenido, es decir, define los contenidos del paquete o stack y sus respectivas
dependencias de otros paquetes.
As cada mdulo o grupo de mdulos de Donaxi se organiza en paquetes a conveniencia
de acuerdo a sus respectivas dependencias y comodidad en las etapas de desarrollo con el
objetivo de no sacrificar la correcta organizacin de los archivos. En la Fig. 3.6 se observa de
manera sintetizada la estructura de los nodos que conforman el sistema de control de Donaxi.
Y como es posible observar, no es una estructura que termine siendo simple, pues cada nodo
tiene necesidades e incluso tipos de datos distintos de los dems. Esto condujo a que los nodos
implicados en la manipulacin de objetos, por comodidad, estn agrupados en un mismo
paquete debido a sus dependencias y libreras; para dicho paquete al momento de ser creado,
se consider utilizar dependencias de: libreras de mensajes estndares (std_msjs), libreras de
cliente de ROS para C++ (roscpp), libreras de cliente de ROS para Python (rospy) y KDL,
que es la librera en C++ de cinemtica y dinmica y que se explicar en el siguiente captulo.
Estas dependencias se pueden observar en el cdigo del archivo manifiesto del paquete
manipulacin que se muestra en el Anexo C- A.
Como explica la Seccin 3.3, un nodo implica un mdulo de la arquitectura, esto es un
programa ejecutable que funciona por s mismo, pero que a la vez se comunica con otros. De
esta forma, se plante la existencia de dos nodos encargados de la manipulacin: el
nodoManipulacion, el cual se encarga de comunicarse directamente con el nodoMaestro,
tomar las decisiones de alto nivel y enviarlas al programa de bajo nivel encargado de controlar
los servomotores; est programado en C++. El otro ejecutable es representado por el
nodoInterfaz; cuya funcin principal es recibir las instrucciones del nodoManipulacion y
con ellas hacer el control de los servomotores, y que por motivos de comodidad en el
desarrollo y pruebas, cumple algunas otras funciones como tener una interfaz grfica cmoda
para que el usuario pudiera verificar parmetros de los servomotores; est programado en
FACULTAD DE ELECTRNICA
76
Python. En cuanto a los tpicos utilizados son: Manipulacion, que sirve para los reportes de
estado del nodoManipulacion hacia el nodoMaestro; ControlMaestro/Manipulacion, en el
cual el nodoMaestro publica las instrucciones para el nodoManipulacion, as como todos los
parmetros que requiere para su correcto funcionamiento; ManipData, que es donde el
nodoManipulacion publica las instrucciones que debe llevar a cabo InterfazManipulacion (o
nodoInterfaz); /brazo_donaxi_plugin/ArticulacionesGazebo es el tpico donde se publican
las instrucciones para la simulacin de los movimientos del brazo, lo cual ser explicado en la
seccin 3.6; y en cuanto a los tpicos rosout y rosout_agg son tpicos generales que ROS
requiere para su funcionamiento. La Fig. 3.7 muestra los nodos encerrados en elipses, y los
tpicos marcados por rectngulos, todos involucrados con la ejecucin de la manipulacin de
objetos.
Como se observa, para construir una secuencia, es tan simple como repetir dos pasos las
veces que sean necesarias. Esos dos pasos son: primero la configuracin de valores para los
servomotores en la estructura brazo_obj (6.1.2.3.1 y 6.1.2.3.3), y segundo una llamada a la
funcin FaseSecuencia, cuyos parmetros de entrada son siempre los mismos (6.1.2.3.2 y
6.1.2.3.4). En cuanto a la configuracin de los valores, es tan simple como asignar el valor del
ngulo al que se desea llegar a la variable correspondiente al servomotor que se pretende
mover; para simplificar la programacin de esta etapa, las unidades de ngulos utilizadas son
grados, pues resulta ms sencillo de comprender para una persona.
Para el caso de la funcin FaseSecuencia lleva una mayor complejidad, pues
internamente itera durante el tiempo que se le solicita en los parmetros de entrada, y va
cambiando gradualmente a un ritmo constante los valores de los servomotores que se
pretendan mover. A la par que almacena en una variable el estado de los servomotores en cada
momento. El Algoritmo 3.2 Explica de manera sintetizada cmo trabaja esta funcin.
Algoritmo 3.2.
FaseSecuencia, con parmetros de entrada act de tipo InstruccionesInterfaz,
obj de tipo InstruccionesInterfaz y time de tipo double. Entrega como
resultado una estructura de tipo InstruccionesInterfaz.
1. Inicializar variable iteracion en el nmero de iteraciones que la funcin
debe dar al multiplicar time por la frecuencia de iteracin.
2. Repetir mientras iteracion sea mayor que 0:
2.1. Decrementar iteracion.
2.2. Llamar a funcin StepServo para cada uno de los servomotores, con
parmetros de entrada valor correspondiente del servomotor de la
estructura act y obj, adems de la constante STEP. Y guardar
resultados en act.
2.3. Definir VELOCIDAD_CONSTANTE para cada uno de los servomotores.
2.4. Verificar recepcin de mensajes del maestro.
2.5. Si el mensaje recibido es EMERGENCIA entonces:
2.5.1. Apagar el torque de todos los motores.
2.6. Fin de Si.
FACULTAD DE ELECTRNICA
81
2.7. Enviar datos de servomotores al nodoInterfaz.
2.8. Enviar datos de servomotores al simulador Gazebo.
3. Fin de Repetir.
4. Regresar act.
Se puede observar en el paso 2.2 la presencia de una funcin llamada StepServo. Esta
funcin, que se encuentra en la librera de funciones_secuencias.h, es una serie de
condiciones, en las cuales se modifica la posicin de un solo servomotor, considerando su
estado y el ngulo al que se pretende llegar, generando un cambio de incremento o decremento
de un valor constante definido previamente en relacin a la velocidad a la que se desea hacer
el movimiento. Por motivos de configuraciones y particularidad de cada articulacin, se
desarroll una funcin distinta para cada uno, las cuales toman en cuenta los lmites y el rango
de accin de cada servomotor.
Es importante recordar que una estructura de tipo InstruccionesInterfaz guarda
informacin de ngulo y velocidad para cada uno de los servomotores, y es la que se enva por
medio de los tpicos de ROS al nodoInterfaz. Esta estructura es codificada con la funcin
codInstruccionesInterfaz, la cual se encuentra en la librera mensajes_interfaz.h, y la cual se
encarga de convertir todos los valores numricos de los servomotores y las velocidades a
cadena y concatenarlos para que viajen en un mismo mensaje. Evidentemente, el nodoInterfaz
realiza la decodificacin para poder interpretar esas instrucciones, tal como se explica ms
adelante en el presente trabajo.
La idea de que los mensajes sean codificados en una cadena de caracteres es tomada de
la disposicin general de comunicacin de todos los nodos con el nodoMaestro, pues el
mecanismo es muy similar: todos los valores de una estructura se concatenan dentro de una
misma matriz para ser enviados, el receptor se encarga de separar tales valores y reconstruir la
estructura original. En el caso de estas funciones de codificacin y decodificacin, as como
las definiciones de las estructuras, se encuentran definidas dentro de las libreras
EnvioMsgaMaestro.h, EnvioMsgaNodo.h y mensajes.h.
Como breve conclusin de esta seccin, cabe destacar que aunque el desarrollo de
secuencia fijas no es el objetivo primordial del presente trabajo, esta estructura sirvi de base
para el desarrollo de las trayectorias donde la cinemtica inversa es utilizada. Recordar que la
planeacin de trayectorias para la cinemtica inversa consiste en una secuencia mezcla de
etapas fijas y etapas variables.
FACULTAD DE ELECTRNICA
82
El Anexo D- A muestra un ejemplo de la programacin de una secuencia ya en C++. Se
observa que el uso de funciones de libreras desarrolladas para este producto simplifica
bastante el proceso de programacin de secuencias fijas, pues consiste en algunos pasos
sencillos y puntuales. Para la comprensin completa de las funciones como FaseSecuencia,
StepServo o las de codificacin y decodificacin de mensajes, se recomienda revisar el cdigo
fuente adjunto a este documento.
Fig. 3.8. Captura de pantalla del modelo virtual del brazo de Donaxi para efectos de
pruebas en simulacin previas a la ejecucin de los cdigos en el brazo real.
Como se observa, en el modelo virtual se utilizaron cilindros para representar
articulaciones y prismas cuadrangulares para simular los eslabones rgidos, lo que aument
ligeramente la complejidad del modelo al requerir la programacin del doble de elementos,
pero que sin duda ayuda considerablemente a la comprensin de la cadena cinemtica. Luego
de representada tanto la parte visual como la parte con propiedades fsicas, se hizo el desglose
FACULTAD DE ELECTRNICA
84
de articulaciones dentro del mismo cdigo, las cuales obedecen a las posiciones de cada uno
de los servomotores del robot. Para ver el XML generado consultar el Anexo D- B.
Dentro del funcionamiento de Gazebo, un modelo no puede ser representado por s
mismo si no est contenido dentro de un entorno o mundo. Para esto fue necesario generar
un XML ms para crear y configurar el mundo donde estar el modelo del brazo. Este mundo
se dise completamente vaco, y se agreg nicamente el modelo del brazo, pues para los
alcances de la simulacin buscada no era necesaria ninguna otra interaccin con otros
elementos. Para generar tal cdigo se recurri al apoyo de los tutoriales propios de Gazebo, en
particular: (Make a Simple Gripper, 2014).
Para la segunda etapa del desarrollo de la simulacin se gener un plugin para Gazebo,
el cual tiene la capacidad de suscribirse a un tpico de ROS. En (Tutorials/1.3/ros enabled
model plugin, 2012) hay documentacin suficiente para el desarrollo de tal plugin. Como se
menciona en la seccin anterior, el nodoManipulacin publica las instrucciones para el brazo
en dos tpicos al mismo tiempo, un tpico destinado a ser ledo por el nodoInterfaz, el cual
incluye tanto los ngulos como las velocidades a las que deben moverse los motores, y un
segundo tpico que es ledo por el plugin de Gazebo, que contiene nicamente las posiciones
puntuales en cada instante de tiempo. De manera general, el desarrollo del complemento que
permite la comunicacin fue como se explica a continuacin.
Una vez que se tena creado el XML del modelo del brazo y el mundo para poder
visualizarlo, se gener el archivo de plugin de ejemplo del tutorial (Tutorials/1.3/ros enabled
model plugin, 2012), el cual fue compilado e instalado. Tras la verificacin de su
funcionamiento, se procedi con una revisin de la documentacin de la librera
physics/physics.hh propia de Gazebo (gazebo::physics::JointController Class Reference, s.f.),
en donde se hallaron las funciones requeridas para que el plugin fuera capaz de manipular las
posiciones de cada una de las articulaciones.
Para facilitar la programacin del plugin con las funciones de la librera
physics/physics.hh, se complement con funciones de codificacin y decodificacin de los
mensajes, estas ltimas programadas en la librera mensajes_gazebo.h, de este modo, se utiliz
el mismo principio de envo y recepcin de mensajes que se utiliza entre el resto de los nodos.
As nodoManipulacion es capaz de publicar los mensajes codificados a Gazebo, el cual al
mismo tiempo es capaz de decodificarlos.
FACULTAD DE ELECTRNICA
85
El cdigo del plugin, con la ayuda de la librera mensajes_gazebo.h, se limita a unas
pocas lneas de cdigo, como se puede observar en el Anexo D- C.
Finalmente, es importante mencionar que para el correcto funcionamiento del simulador,
una vez lanzado se requiere de un ajuste de la frecuencia de iteracin para que coincida con la
frecuencia del nodoManipulacion, es decir 10 hertz.
En este punto del desarrollo es posible programar secuencias de cdigo, las cuales
pueden ser visualizadas en el simulador sin la necesidad de conectar el brazo. De la misma
forma, se prev que para cuando se haga la ejecucin con el brazo en una prueba real, con el
fin de reducir el coste computacional, el simulador puede no ser ejecutado sin necesidad de
cambios en el cdigo, pues al no incluir un control que asegure la conexin entre nodos, el
nico efecto sera que los mensajes publicados en el tpico de Gazebo no sern ledos por
ningn nodo.
FACULTAD DE ELECTRNICA
86
FACULTAD DE ELECTRNICA
87
4.1. LIBRERA DE CINEMTICA Y DINMICA (KDL) DE
OROCOS.
Como se puede observar, hay dos niveles de clases. En el nivel ms bajo se encuentran
los vectores y las rotaciones mientras que en el siguiente estn los Frames, giros y torsiones.
Se dice que estos tres ltimos son de nivel superior porque contienen elementos de nivel
inferior, es decir vectores y rotaciones.
De la misma manera existen otros cuatro niveles de clases, que permiten explotar an
ms las capacidades de la librera. Estas clases estn explicadas en (Kinematic Trees - KDL
1.1.x, s.f.), y son las siguientes:
FACULTAD DE ELECTRNICA
89
Articulacin. Es la clase que representa a un grado de libertad y puede estar
formada por una rotacin o una traslacin entre dos segmentos. Pueden ser
aplicadas a Frames o a giros.
Segmento. Un segmento se puede explicar como un cuerpo rgido que contiene
una articulacin y un Frame. Es decir, es la representacin matemtica de un
eslabn de la cadena cinemtica como los explicados en el Captulo 2.
Cadena. Es sencillo de deducir que representa a una cadena cinemtica; es decir
que se construye como un conjunto de segmentos o de otras cadenas dadas,
siendo la representacin matemtica de un conjunto de slidos unidos por
articulaciones, es decir un brazo.
rbol. Un rbol es tambin un conjunto de cuerpos slidos unidos por
articulaciones, pero representan una clase de nivel mayor que las cadenas porque
pueden estar formados por segmentos, cadenas u otros rboles dados. Adems de
que su construccin implica la declaracin de una raz para cada nuevo
elemento; esto permite ramificaciones y conexiones entre cadenas, ofreciendo
cuerpos mucho ms complejos.
Como se puede observar, con estas clases es posible realizar modelados matemticos y
clculos dinmicos desde simples robots mviles, brazos de n grados de libertad tanto lineales
como paralelos, e incluso robots humanoides, insectoides y dems, pues los modelos pueden
ser tan simples o complejos como se requiera.
Por ltimo, KDL ofrece solvers de cinemtica directa (Kinematic and Dynamic Solvers,
s.f.), los cuales son clases capaces de encontrar soluciones de velocidad o de posicin para
arreglos de articulaciones dados. Por el momento KDL slo cuenta con solvers de cinemtica
directa, an no estn desarrollados los de cinemtica inversa; sin embargo, para el presente
proyecto, y recordando el Captulo 2. , el contar con un solver para cinemtica directa es
bastante ayuda, ya que el de cinemtica inversa es resultado de la presente investigacin.
FACULTAD DE ELECTRNICA
90
4.2. PROGRAMACIN DE CINEMTICA DIRECTA.
en el programa para simplificar la conversin de los datos a los valores de los servomotores.
FACULTAD DE ELECTRNICA
92
Como se observa que casi todos los parmetros de rotacin en Z estn en cero, se
obtiene una configuracin del brazo que no puede alcanzar en la realidad, como se observa en
la Fig. 4.1.A. Sin embargo, dentro de otras secciones del cdigo se ajustan los ngulos para
coincidir con los parmetros de Denavit-Hartenberg en cuanto a los ngulos de las
articulaciones, lo que permiten llevar al brazo a la posicin inicial tras los primeros clculos;
la posicin de inicializacin del brazo queda como muestra la Fig. 4.1.B.
Fig. 4.1. A) Izquierda. Configuracin del brazo con todas las articulaciones en cero. B)
Derecha. Configuracin del brazo en la posicin inicial que implica los valores Denavit-
Hartenberg.
En este punto ya se tiene la cadena cinemtica declarada para poder crear el solver que
calcule la cinemtica directa, por tanto las siguientes lneas de cdigo son las que se muestran
en el Cdigo 4.2 y representan la declaracin del solver, la declaracin del arreglo de
articulaciones que sern los parmetros para cada vez que se desee obtener la solucin de la
cinemtica directa de cierta configuracin de los servomotores, y finalmente la extraccin de
los valores de inters de la matriz de transformacin obtenida (Frame).
Cdigo 4.2
8. // Create solver based on kinematic chain :
9. ChainFkSolverPos_recursive fksolver = ChainFkSolverPos_recursive(chain);
10. // Create joint array
11. unsigned int nj = chain.getNrOfJoints();
12. //arreglo de joints de posicin presente (constante durante algoritmo):
13. KDL::JntArray presentpos = JntArray(nj);
14. //arreglo de joints de posicin de la iteracin:
15. KDL::JntArray iterapos = JntArray(nj);
16. //arreglo de joints de prueba para definir cul conviene:
17. KDL::JntArray trialpos = JntArray(nj);
FACULTAD DE ELECTRNICA
93
18. //inicializar Joint Array con valores de los servos hasta el momento:
19. presentpos(0)=degtorad(previous.servo1);
20. presentpos(1)=degtorad(previous.servo2);
21. presentpos(2)=degtorad(previous.servo3);
22. presentpos(3)=degtorad(previous.servo4);
23. presentpos(4)=degtorad(previous.servo5);
24. // Calculate forward position kinematics
25. bool kinematics_status;
26. kinematics_status = fksolver.JntToCart(presentpos,present);
27. present.M.GetRPY(presentrpy.roll, presentrpy.pitch, presentrpy.yaw);
28. if(kinematics_status>=0)
29. {
29.1. printf("present: pos: x: %f y: %f z: %f ", present.p.x(),
present.p.y(), present.p.z());
29.2. printf("rot: x: %f y: %f z: %f\n",radtodeg(presentrpy.roll),
radtodeg(presentrpy.pitch), radtodeg(presentrpy.yaw));
30. }
31. else
32. {
32.1. printf("%s\n","Error: could not calculate forward kinematics);
32.2. return previous;
33. }
34. //calcular el roll-pitch-yaw de la rotacin de goal
35. goal.M.GetRPY(goalrpy.roll, goalrpy.pitch, goalrpy.yaw);
En las secciones anteriores se ha explicado cmo se han puesto en lenguaje C++ los
clculos y los algoritmos desarrollados, as como los recursos utilizados en el presente
proyecto tanto para el uso de ROS, como de la simulacin de secuencias fijas del brazo en
Gazebo.
La simulacin en Gazebo fue planeada con miras a poder simular cualquier tipo de
movimiento controlado por el nodoManipulacion. Para el caso de las secuencias, que se
explicaron en el Captulo 3. , seccin 3.5, se mencion la existencia de la funcin
FaseSecuencia y se explic su funcionamiento en el Algoritmo 3.2. Es justamente la lnea
2.8 del Algoritmo 3.2 donde se menciona la existencia de las instrucciones de envo de datos a
Gazebo. FaseSecuencia ya incluye, por tanto, en su funcionamiento, las instrucciones
necesarias para el envo de los mensajes a Gazebo; a diferencia del caso de trazado de rutas,
donde se utiliza la cinemtica inversa para hacer los movimientos flexibles, que son secciones
que no utilizan una funcin dada que se encargue de gestionar este flujo de la informacin, y
que por tanto se deben incluir las instrucciones para el envo de datos a Gazebo.
Se ha venido mencionando a lo largo del presente trabajo que se desarrollaron libreras
de codificacin y decodificacin de mensajes. Esto se debe a que para facilitar y estandarizar
el envo y recepcin de mensajes, se utilizan los mensajes de tipo cadena de caracteres; de
modo que todos los datos a enviar se convierten en tipo String para luego concatenar todas las
variables en una misma. En este caso, las funciones correspondientes a codificacin y
decodificacin de los mensajes que se envan a Gazebo se encuentran en la librera
mensajes_gazebo.h, esto se puede apreciar en las lneas 31.14, 51.11, 70.11 y 84.14 del
Anexo E- B, que son especficamente los llamados a la funcin de codificacin del mensaje,
es decir que se prepara la cadena de caracteres con los valores angulares de todas las
articulaciones del brazo, esto para la posterior publicacin de los mismos.
En cuanto a la publicacin, sta se lleva a cabo en la lnea siguiente a la codificacin,
esto es en las lneas 31.15, 51.12, 70.12 y 84,15, tambin del Anexo E- B, las cuales
simplemente publican el mensaje en el tpico al cual se encuentra suscrito el plugin de
Gazebo.
FACULTAD DE ELECTRNICA
99
De esta manera, si se garantiza el tener las publicaciones al tpico cada vez que se
requiera que el brazo haga un movimiento, se asegura que el simulador va a responder ante los
ngulos requeridos.
Finalmente, si se analizan los algoritmos presentados en la seccin 2.9, particularmente
el Algoritmo 2.4, se puede comprobar la existencia de una serie finita de movimientos
claramente definidos. Los cuales, de una manera ms grfica, se aprecian tal como la Fig. 4.2
muestra en la siguiente pgina.
FACULTAD DE ELECTRNICA
100
Este ltimo captulo describe a grandes rasgos el diseo del brazo, el funcionamiento de
los servomotores que lo hacen moverse y la electrnica que lo compone. Se explican entonces
los requerimientos del cdigo de la interfaz que se comunica con la computadora central de
Donaxi y cmo se hizo este programa. Tambin es tema del presente captulo el diseo del
entorno de usuario y de las ventajas que este ofrece, y finalmente la integracin general del
programa.
101
FACULTAD DE ELECTRNICA
102
5.1. SERVOMOTORES DYNAMIXEL.
5.2. CM700
Se ha hablado mucho, tanto en este captulo como en los anteriores, de los medios por
los cuales se comunican las distintas partes del control de la manipulacin, as como de la
transferencia de datos entre el ordenador y la tarjeta controladora de los servomotores. Por
tanto, al ser tres programas simultneos que se encargan de la manipulacin y varios otros para
el resto del control completo del robot, parecera que ni el lanzamiento ni el uso de los
programas son sencillos. Es lo que se tratar de explicar en la presente seccin.
Desde el principio de las etapas de desarrollo se observ la complejidad que implicaba el
lanzamiento de los nodos, pues eran varios comandos que deban ser recordados, rutinas de
encendido y apagado que deban ser respetadas y dems. La experiencia del uso y depuracin
del sistema de control del brazo fue la propia fuente de ideas para la optimizacin del proceso.
El proceso, de manera general, para lanzar las pruebas quedaba como se explica a
continuacin:
1. Primero deba conectarse y encenderse la tarjeta CM-700 para preparar el puerto
serial y evitar la recepcin de datos basura del nodoInterfaz al no haber un
elemento conectado.
2. Luego el ncleo de ROS, seguido del nodoManipulacin se inicializa para que
prepare los tpicos de ROS, y quede en espera de instrucciones.
3. Le segua el nodoInterfaz, hecho as para que pueda inicializar el puerto serial y
comenzar la comunicacin con la CM-700, as como quedar el canal de ROS en
espera de que el nodoManipulacin comience a publicar.
4. Es entonces cuando debe comenzar a ejecutarse el nodoMaestro para que enve
las respectivas instrucciones al nodoManipulacion y toda la cadena pueda
funcionar.
FACULTAD DE ELECTRNICA
116
De la misma forma, para detener la ejecucin, el orden no deba ser tan estricto, pero
deban detenerse forzosamente todos los nodos y apagarse la tarjeta CM-700, dejando el
ncleo de ROS para el final. Era necesario que todo fuera detenido para evitar problemas en la
comunicacin, pues era muy probable que si se volva a ejecutar el sistema sin reiniciar todos
los mdulos ocurriera un error en la sincrona, ocasionando que los datos enviados y recibidos
por el puerto serial fueran incorrectos.
Sin duda tal proceso resultaba engorroso para el usuario, sobre todo en etapas de
calibraciones de pruebas, porque usualmente se requieren mltiples ejecuciones de los
programas. Por eso fue que se tomaron medidas para simplificar un poco este proceso. Tales
medidas fueron implementadas sobre el nodoInterfaz, pues por ocupar un punto intermedio en
la comunicacin ofreca el suficiente campo de accin para tales mejoras.
En primer lugar, ya se ha explicado en la seccin 5.4 la inclusin de un bloque de cdigo
que le permite al nodoInterfaz publicar mensajes para el nodoManipulacion cual si fuera el
nodoMaestro. Tal caracterstica permite una mejor integracin, pues permite que el usuario
pueda controlar el brazo como lo hace el nodoMaestro desde un cmodo e intuitivo entorno
grfico. Ver Fig. 3.7 de la seccin 3.4, donde se muestra en esquemtico los nodos y los
tpicos por los cuales se comunican.
En segundo lugar, est la ejecucin de los dos nodos de ROS que implican el control de
la manipulacin. Si bien el orden en que se ejecutan no es riguroso, es muy importante que
ambas aplicaciones sean lanzadas correctamente. Para eso se gener un archivo launch como
se explica tambin en la seccin 3.4, el cual especifica que ambos nodos deben ser ejecutados.
Esto representa una nueva ventaja, pues los dos comandos para ejecutar cada uno de los nodos
se redujeron a una sola instruccin.
Lo ms delicado en la ejecucin es el hecho de que la tarjeta CM-700 debe estar
encendida antes de comenzar con la ejecucin de los nodos, y se es un factor que no puede
ser modificado debido al propio funcionamiento electrnico de la tarjeta CM-700 y el
adaptador LN-101; pues se generan seales basura que interfieren con el funcionamiento del
programa si se ejecuta primero el nodo interfaz y en segundo lugar se enciende la tarjeta
controladora. Sin embargo, s fue posible el desarrollo de una optimizacin en sa rea. Se
observ que los problemas de sincrona que ocurran se deban a que si uno de los dos
programas cesaba su ejecucin, ya sea la CM-700 o el nodoInterfaz, pero el otro no, la
FACULTAD DE ELECTRNICA
117
comunicacin serial se quedaba en alguna etapa de espera que no necesariamente coincide con
la etapa con que comenzara el otro programa nuevamente su ejecucin. Dado que las
funciones de comunicacin serial de la tarjeta CM-700 no cuentan con un timeout, sino que se
quedan en espera todo el tiempo que sea necesario hasta recibir el dato, la solucin propuesta
fue sencilla: El botn salir del entorno grfico no tiene como nica funcin el terminar la
ejecucin, sino que su tarea se vuelve tambin el ejecutar una funcin de finalizacin de la
conexin; de modo que si al ser activado, la seccin de comunicacin serial se encuentra en
alguna etapa de la transferencia de datos, se le da al hilo en curso la oportunidad de terminar
sus operaciones, es decir, terminar el ciclo completo de comunicacin, y entonces, con la
iteracin completada, ya resulta seguro detener la ejecucin del programa. Esta accin causa
que el programa de la CM-700 tambin complete una iteracin del programa y quede
nuevamente en espera del primero de los datos de la cadena, lo que permite recuperar de
inmediato la conexin con el nodoInterfaz en cuanto este se vuelva a ejecutar sin la necesidad
de reiniciar la tarjeta. Una importante ventaja de esto es el hecho de que si ROS debiera
detenerse por alguna razn, el brazo no requiere ser reiniciado, pues puede reanudar la
comunicacin en cuanto ROS se reestablezca. En cambio, si durante la ejecucin la tarjeta
controladora sufriera un reinicio imprevisto, s ser necesario reiniciar la ejecucin del
nodoInterfaz, pues no se implementaron medidas para la recuperacin de la conexin ante tal
situacin.
Recordando que si fuera necesario hacer un reinicio del sistema de control, es
conveniente detener todo para volverlo a lanzar despus, se tom una medida ms para
simplificar los procesos. Dado que en este punto se vuelve necesario el terminar la ejecucin
del nodoInterfaz por medio de un click en el botn salir y no de ninguna otra manera, se
aprovecha tal accin para aadir un mensaje extraordinario a la librera mensajes.h. Este
mensaje es enviado, durante la ejecucin rutina de finalizacin, por el nodoInterfaz al
nodoManipulacin, el cual representa la instruccin de terminar su ejecucin. Esto hace que
un solo click del operador cause la finalizacin de los dos programas de control.
En este punto la ejecucin de los nodos correspondientes a la manipulacin y la
correspondiente preparacin de pruebas se ve simplificado y optimizado de manera
importante, pues puede decirse que los pasos requeridos son en resumen:
FACULTAD DE ELECTRNICA
118
1. Encender tarjeta controladora de brazo. Alimentacin por bateras, conexin de
los motores y encendido de interruptor fsico.
2. Ejecucin de archivo launch para manipulacin. El cual contiene instrucciones
para lanzar el ncleo de ROS, el nodoManipulacion y el nodoInterfaz. Esto con
el comando: roslaunch Manipulacion manipulacion.launch
3. Envo de instrucciones a travs del entorno grfico. Llenar Actividad,
coordenada en X, coordenada en Y y coordenada en Z y dar click en publicar.
Con la optimizacin del proceso de ejecucin y detencin del sistema de control del
brazo se concluye toda una serie de etapas de desarrollo que, como se ha observado a lo largo
del presente trabajo, abarcan diversos aspectos cuidando estabilidad, funcionalidad,
optimizacin de uso de recursos, simplificacin de operacin, normalizacin de vas de
comunicacin y reduccin del cdigo utilizado en los programas.
FACULTAD DE ELECTRNICA
Este ltimo captulo presenta gran parte de las observaciones que se lograron con el
desarrollo del proyecto, teniendo en cuenta siempre la relacin con el cumplimiento de los
objetivos propuestos. Tambin es importante mencionar ciertos caminos a considerarse para
trabajos futuros en manipulacin tanto en Donaxi como en proyectos distintos.
119
FACULTAD DE ELECTRNICA
120
6.1. CONCLUSIONES.
El presente trabajo muestra los resultados del desarrollo del sistema de control del brazo
manipulador del robot de servicio Donaxi. Para la ltima etapa se requiri de un trabajo de
varios meses, a pesar de que el tiempo de desarrollo total de este software fue de dos aos
aproximadamente, pues se haban programado otras propuestas de solucin del problema, las
cuales de una o de otra manera no cumplan con lo necesario para tener un correcto y verstil
control; sin embargo, ofrecan las posibilidades de probar y evaluar ciertos recursos de
programacin, a la par que probar el funcionamiento del brazo y analizar los movimientos que
ste puede hacer, as como los que no puede hacer.
Tales experiencias previas, sin duda fueron de gran ayuda para el desarrollo de lo
explicado a lo largo de todo este trabajo, pues una gran parte de los comportamientos del
brazo, as como de los requisitos del software y las posibilidades de programacin se pudieron
tener en cuenta desde una etapa previa a la escritura del cdigo, lo que aceler en gran parte
las etapas de depuracin del programa, pues se pudieron obtener mejores resultados gracias a
que el conocimiento previo sent las bases para el desarrollo que en versiones previas del
software de control no se tenan.
En primera instancia, los clculos de cinemtica directa fueron comparados con clculos
realizados por otras herramientas de software (como LabView) observndose valores, modelos
y resultados iguales en ambas plataformas, lo que dio la pauta para continuar con el trabajo.
El desarrollo del algoritmo de cinemtica inversa fue un proceso muy complejo, el cual
implic una considerable cantidad de tiempo de depuracin, pues como se explica en la
seccin 2.7, tras la realizacin de una prueba que consuma considerable tiempo para el
anlisis de resultados, fueron surgiendo distintos errores o imprecisiones del algoritmo, los
cuales deban ser corregidos, y por consiguiente nuevas pruebas deban efectuarse. A pesar de
estas complicaciones, como tambin se termin de explicar en el Captulo 2. , se obtuvieron
muy buenos resultados, pues se observ que en la mayora de los problemas que se le pedan,
lograba converger en una solucin, aunque an existan algunos casos en los que no hallaba la
solucin con ningn motivo aparente.
FACULTAD DE ELECTRNICA
121
Esta propuesta de cinemtica inversa result ser un aporte muy importante para el
funcionamiento del sistema de control, pues en etapas previas del desarrollo del proyecto
Donaxi, no se haban tenido mtodos completos para realizar tales clculos. Pues aunque se
haban hecho algunas pruebas con solvers genricos, stos no ofrecan lo que el desarrollado
en el presente trabajo puede ofrecer al manipulador de Donaxi. Esto se debe a que se trata de
un algoritmo construido especial y especficamente para funcionar con el brazo de Donaxi,
teniendo en cuenta en todo momento las capacidades y limitantes del diseo mecnico, los
requerimientos para que el robot pudiera cumplir sus tareas, el estado actual del resto de
componentes del robot, y dems. En general, una solucin que favorece enormemente el
desarrollo del proyecto.
En cuanto a la planificacin de rutas, la simpleza con la que se dio solucin al problema,
represent una gran ventaja en la ejecucin, pues ofrece una gran estabilidad, precisin y
repetibilidad de los movimientos; adems de que partiendo de los puntos expresados en la
seccin 2.9, se puede garantizar que el objeto ser tomado y sin colisiones siempre y cuando
ste se encuentre dentro del espacio de trabajo del brazo. Adems de la gran compatibilidad
entre ste proceso con el algoritmo de cinemtica inversa.
En cuanto a la arquitectura de control implementada en ROS, ha demostrado, desde
principios del 2012 que se implement ROS oficialmente en el proyecto, que es una
arquitectura muy poderosa, verstil, econmica en recursos y principalmente se destaca su
estabilidad, que es algo muy importante en el control de un robot de servicio como Donaxi,
debido a que se enfrentan a entornos dinmicos y problemas complejos, de modo que si la
estabilidad se viera comprometida en algn momento, el resultado sera una tarea incompleta,
un riesgo para la integridad del robot, o incluso un riesgo para las personas que interactan
con l. Por eso es que la arquitectura implementada de esa forma permite gran fluidez en las
comunicaciones entre nodos, por lo que el nodoMaestro, que tiene acceso a toda la
informacin de alto nivel, puede tomar decisiones preventivas para correccin de errores, o
incluso evitar accidentes.
La simulacin en Gazebo de los movimientos del brazo ha sido una herramienta de gran
ayuda que ha permitido simular de una manera sencilla la ejecucin de los movimientos del
brazo en un ambiente ideal. La puesta en marcha, que aunque no fue fcil ni trivial, termin
siendo un proceso muy sencillo una vez lograda la simulacin por primera vez; lo que la
FACULTAD DE ELECTRNICA
122
convirti en una herramienta que permiti ahorrar tiempo de depuracin, pues se hacan las
primeras pruebas en virtual para evitar el tiempo de conexin y verificacin de los motores
para cada prueba, adems eso permita al resto de los compaeros del equipo seguir trabajando
con el robot en el resto de sus funcionalidades, y limitando el uso del brazo para las pruebas
finales. Otra de las ventajas que se pudo apreciar fue el hecho de que para una gran parte de
las pruebas de depuracin no fue necesario el uso del brazo, pues alguna rutina nueva para el
brazo tena un factor de riesgo muy grande debido a la posibilidad del error humano; as, se
podan detectar estos errores a nivel simulacin para corregirlos antes de echarlos a andar con
el prototipo fsico.
Por ltimo, la interfaz de usuario provee al operador una herramienta invaluable que le
permite poner en marcha el control del brazo del robot, as como realizar pruebas de una
manera muy sencilla, sin la necesidad del conocimiento a fondo del cdigo, es decir, cualquier
persona, con un mnimo de informacin sobre el software de control, es capaz de gestionar el
sistema de control del brazo de Donaxi. Esto parte de la premisa de que para obtener un
software eficiente en el cumplimiento de su objetivo, resulta necesario que se simplifique lo
ms posible su interaccin con el usuario, pues finalmente, si ste no es capaz de comprender
la gran cantidad de informacin que el software despliega, o simplemente los comandos de
control resultan engorrosos, es poco probable que el sistema de control llegue a ser exitoso.
El uso de la interfaz en las etapas de depuracin y calibracin de los movimientos del
manipulador ha probado que realmente es un medio de gran ayuda para el operador, pues
permite que la interaccin hombre-mquina se lleve con mucha mayor fluidez, de una manera
ms natural y sencilla.
FACULTAD DE ELECTRNICA
123
6.2. PERSPECTIVAS Y TRABAJO FUTURO.
[] para que la matriz [] relacione los sistemas y {S}, es necesario que los
sistemas se hayan escogido de acuerdo a unas determinadas normas. stas, junto con la
definicin de los 4 parmetros de Denavit Hartenberg, conforman el siguiente algoritmo para
la resolucin del problema cinemtico directo (Barrientos, Pen, Balaguer, & Aracil, 2007):
DH 1. Numerar los eslabones comenzando con 1 (primer eslabn mvil de la cadena) y
acabando con n (ltimo eslabn mvil). Se numerar como eslabn 0 a la base
fija del robot.
DH 2. Numerar cada articulacin comenzando por 1 (la correspondiente al primer grado
de libertad) y acabando en n.
DH 3. Localizar el eje de cada articulacin. Si sta es rotativa, el eje ser su propio eje
de giro. Si es prismtica, ser el eje a lo largo del cual se produce el
desplazamiento.
DH 4. Para i de 0 a n-1 situar el eje sobre el eje de la articulacin i+1.
DH 5. Situar el origen del sistema de la base en cualquier punto del eje . Los ejes
e se situarn de modo que formen un sistema dextrgiro con .
DH 6. Para i de 1 a n-1, situar el origen del sistema (solidario al eslabn i) en la
interseccin del eje con la lnea normal comn a y . Si ambos ejes se
cortasen se situara en el punto de corte. Si fuesen paralelos se situara
en la articulacin i+1.
DH 7. Situar en la lnea normal comn a y .
DH 8. Situar de modo que forme un sistema dextrgiro con y .
DH 9. Situar el sistema en el extremo del robot de modo que coincida con la
direccin de y sea normal a y .
DH 10. Obtener como el ngulo que hay que girar en torno a para que y
queden paralelos.
FACULTAD DE ELECTRNICA
127
DH 11. Obtener como la distancia, medida a lo largo de , que habra que
desplazar para que y quedasen alineados.
DH 12. Obtener como la distancia medida a lo largo de (que ahora coincidira con
) que habra que desplazar el nuevo para que su origen coincidiese
con .
DH 13. Obtener como el ngulo que habra que girar entorno [sic] a , para que el
nuevo coincidiese totalmente con .
DH 14. Obtener las matrices de transformacin definidas en [4.10].
DH 15. Obtener la matriz de transformacin que relaciona el sistema de la base con el
del extremo del robot
DH 16. La matriz T define la orientacin (submatriz de rotacin) y posicin (submatriz
de traslacin) del extremo referido a la base, en funcin de las n coordenadas
articulares.
Anexo C- A
El siguiente cdigo representa el contenido del archivo manifiesto del paquete de
manipulacin.
<package>
<description brief="Manipulacion">
Manipulacion
</description>
<author>Victor Poisot Martinez</author>
<license>BSD</license>
<review status="developing" notes=""/>
<url>http://ros.org/wiki/brazo_donaxi</url>
<depend package="std_msgs"/>
<depend package="rospy"/>
FACULTAD DE ELECTRNICA
132
<depend package="roscpp"/>
<depend package="kdl"/>
</package>
Anexo C- B
El archivo manipulacion.launch, que permite ejecutar los dos nodos correspondientes a
manipulacin de objetos con una sola lnea de comando, contiene lo siguiente:
<launch>
<node pkg="Manipulacion" name="NodoManipulacion"
type="nodoManipulacion" output="screen">
</node>
<node pkg="Manipulacion" name="interfaz" type="interfaz.py">
</node>
</launch>
Anexo D- A
El siguiente cdigo es un ejemplo de programacin de una secuencia fija. En este caso
es una secuencia utilizada para realizar el movimiento de acercar el gripper a una persona,
quien le entrega al robot un objeto, el robot lo toma y lo acerca a su cuerpo para transportarlo:
case MANIPULACION_OPEN_TOMAOBJ:
brazo_obj.servo1=40;
brazo_obj.servo2=180;
brazo_obj.servo3=70;
brazo_obj.servo4=352;
brazo_obj.servo5=125;
brazo_obj.servo6=0;
brazo_actual=TorqueON(brazo_actual);
brazo_actual=FaseSecuencia(brazo_actual, brazo_obj, 5);
//hasta aqu sube el brazo y lo mantiene retraido
brazo_obj.servo1=120;
brazo_actual=TorqueON(brazo_actual);
brazo_actual=FaseSecuencia(brazo_actual, brazo_obj, 2);
brazo_obj.servo3=45;
brazo_obj.servo5=80;
brazo_actual=TorqueON(brazo_actual);
brazo_actual=FaseSecuencia(brazo_actual, brazo_obj, 4);
//se acerca el brazo a quien le va a dar la botella
brazo_obj.servo6=100;
brazo_actual=TorqueON(brazo_actual);
brazo_actual=FaseSecuencia(brazo_actual, brazo_obj, 4);
FACULTAD DE ELECTRNICA
133
//abre gripper
brazo_obj.servo6=20; //ajustar valor para la botella
brazo_actual=TorqueON(brazo_actual);
brazo_actual=FaseSecuencia(brazo_actual, brazo_obj, 3);
ros::Duration(4.0).sleep();
//cierra gripper
brazo_obj.servo1=40;
brazo_obj.servo2=180;
brazo_obj.servo3=70;
brazo_obj.servo4=352;
brazo_obj.servo5=125;
brazo_actual=TorqueON(brazo_actual);
brazo_actual=FaseSecuencia(brazo_actual, brazo_obj, 7);
//se retrae nuevamente
Break;
Se observa que este cdigo es una secuencia de seis etapas de duraciones distintas. Cada
etapa resulta ser muy sencilla de programar gracias al respaldo de las slidas libreras de
funciones que permiten simplificar la programacin de esta etapa a nicamente la asignacin
de ngulos de los servomotores de inters, activacin del torque y el llamado a la funcin
FaseSecuencia que es quien se encarga del resto.
Anexo D- B
El siguiente cdigo es un tanto extenso, pero muestra la creacin del modelo para
Gazebo, separando claramente los distintos eslabones (links) empezando por una base y
terminando en el gripper. Cada eslabn est formado por ms de una geometra y sus
respectivas propiedades fsicas:
<?xml version='1.0'?>
<sdf version="1.3">
<model name="brazo">
<link name="base">
<pose>0 0.0 0.25 0 0 0</pose>
<inertial>
<pose>0 0 -0.15 0 0 0</pose>
<inertia>
<ixx>4</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>4</iyy>
<iyz>0</iyz>
<izz>4</izz>
</inertia>
<mass>20.0</mass>
</inertial>
<collision name="collision-base">
<geometry>
<box>
<size>0.5 0.5 0.5</size>
FACULTAD DE ELECTRNICA
134
</box>
</geometry>
</collision>
<visual name="visual-base">
<geometry>
<box>
<size>0.5 0.5 0.5</size>
</box>
</geometry>
<material>
<script>Gazebo/Purple</script>
</material>
</visual>
<collision name="collision-torso">
<pose>0 0.0 0.8 0 0 0</pose>
<geometry>
<box>
<size>0.03 0.03 1.1</size>
</box>
</geometry>
</collision>
<visual name="visual-torso">
<pose>0 0.0 0.8 0 0 0</pose>
<geometry>
<box>
<size>0.03 0.03 1.1</size>
</box>
</geometry>
<material>
<script>Gazebo/Purple</script>
</material>
</visual>
</link>
<link name="hombro">
<gravity>false</gravity>
<pose>0.0 0.0 1.5 1.570796327 0 0</pose>
<inertial>
<pose>0 0 0 0 0 0</pose>
<inertia>
<ixx>0.001</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>0.001</iyy>
<iyz>0</iyz>
<izz>0.001</izz>
</inertia>
<mass>0.1</mass>
</inertial>
<collision name="collision-torso-hombro">
<geometry>
<cylinder>
<radius>.03</radius>
<length>.035</length>
</cylinder>
</geometry>
</collision>
FACULTAD DE ELECTRNICA
135
<visual name="visual-torso-hombro">
<geometry>
<cylinder>
<radius>.03</radius>
<length>.035</length>
</cylinder>
</geometry>
<material>
<script>Gazebo/Red</script>
</material>
</visual>
<collision name="collision-hombro">
<pose>0 0 0.0925 0 0 0</pose>
<geometry>
<box>
<size>0.03 0.03 0.185</size>
</box>
</geometry>
</collision>
<visual name="visual-hombro">
<pose>0 0 0.0925 0 0 0</pose>
<geometry>
<box>
<size>0.03 0.03 0.185</size>
</box>
</geometry>
<material>
<script>Gazebo/Purple</script>
</material>
</visual>
</link>
<link name="brazo">
<gravity>false</gravity>
<pose>0.0 -0.185 1.5 3.141592654 0 0</pose>
<inertial>
<pose>0 0 0 0 0 0</pose>
<inertia>
<ixx>0.001</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>0.001</iyy>
<iyz>0</iyz>
<izz>0.001</izz>
</inertia>
<mass>0.1</mass>
</inertial>
<collision name="collision-hombro-brazo">
<geometry>
<cylinder>
<radius>.03</radius>
<length>.035</length>
</cylinder>
</geometry>
</collision>
<visual name="visual-hombro-brazo">
<geometry>
FACULTAD DE ELECTRNICA
136
<cylinder>
<radius>.03</radius>
<length>.035</length>
</cylinder>
</geometry>
<material>
<script>Gazebo/Red</script>
</material>
</visual>
<collision name="collision-brazo">
<pose>0.11 0 0 0 0 0</pose>
<geometry>
<box>
<size>0.22 0.03 0.03</size>
</box>
</geometry>
</collision>
<visual name="visual-brazo">
<pose>0.11 0 0 0 0 0</pose>
<geometry>
<box>
<size>0.22 0.03 0.03</size>
</box>
</geometry>
<material>
<script>Gazebo/Purple</script>
</material>
</visual>
</link>
<link name="codo">
<gravity>false</gravity>
<pose>0.22 -0.185 1.5 -1.570796327 0 0</pose>
<inertial>
<pose>0 0 0 0 0 0</pose>
<inertia>
<ixx>0.001</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>0.001</iyy>
<iyz>0</iyz>
<izz>0.001</izz>
</inertia>
<mass>0.1</mass>
</inertial>
<collision name="collision-brazo-codo">
<geometry>
<cylinder>
<radius>.03</radius>
<length>.035</length>
</cylinder>
</geometry>
</collision>
<visual name="visual-brazo-codo">
<geometry>
<cylinder>
<radius>.03</radius>
FACULTAD DE ELECTRNICA
137
<length>.035</length>
</cylinder>
</geometry>
<material>
<script>Gazebo/Red</script>
</material>
</visual>
<collision name="collision-codo">
<pose>0.035 0 0 0 0 0</pose>
<geometry>
<box>
<size>0.07 0.03 0.03</size>
</box>
</geometry>
</collision>
<visual name="visual-codo">
<pose>0.035 0 0 0 0 0</pose>
<geometry>
<box>
<size>0.07 0.03 0.03</size>
</box>
</geometry>
<material>
<script>Gazebo/Purple</script>
</material>
</visual>
</link>
<link name="codo-antebrazo">
<gravity>false</gravity>
<pose>0.29 -0.185 1.5 3.141592654 0 0</pose>
<inertial>
<pose>0 0 0 0 0 0</pose>
<inertia>
<ixx>0.001</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>0.001</iyy>
<iyz>0</iyz>
<izz>0.001</izz>
</inertia>
<mass>0.1</mass>
</inertial>
<collision name="collision">
<geometry>
<cylinder>
<radius>.03</radius>
<length>.035</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>.03</radius>
<length>.035</length>
</cylinder>
FACULTAD DE ELECTRNICA
138
</geometry>
<material>
<script>Gazebo/Red</script>
</material>
</visual>
</link>
<link name="antebrazo">
<gravity>false</gravity>
<pose>0.29 -0.185 1.42 0 0 0</pose>
<inertial>
<pose>0 0 0 0 0 0</pose>
<inertia>
<ixx>0.001</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>0.001</iyy>
<iyz>0</iyz>
<izz>0.001</izz>
</inertia>
<mass>0.1</mass>
</inertial>
<collision name="collision">
<geometry>
<box>
<size>0.03 0.03 0.16</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>0.03 0.03 0.16</size>
</box>
</geometry>
<material>
<script>Gazebo/Purple</script>
</material>
</visual>
</link>
<link name="muneca">
<gravity>false</gravity>
<pose>0.29 -0.185 1.34 -1.570796327 0 0</pose>
<inertial>
<pose>0 0 0 0 0 0</pose>
<inertia>
<ixx>0.001</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>0.001</iyy>
<iyz>0</iyz>
<izz>0.001</izz>
</inertia>
<mass>0.1</mass>
</inertial>
<collision name="collision-antebrazo-muneca">
<geometry>
FACULTAD DE ELECTRNICA
139
<cylinder>
<radius>.03</radius>
<length>.035</length>
</cylinder>
</geometry>
</collision>
<visual name="visual-antebrazo-muneca">
<geometry>
<cylinder>
<radius>.03</radius>
<length>.035</length>
</cylinder>
</geometry>
<material>
<script>Gazebo/Red</script>
</material>
</visual>
<collision name="collision-muneca">
<pose>0.045 0 0 0 0 0</pose>
<geometry>
<box>
<size>0.09 0.03 0.03</size>
</box>
</geometry>
</collision>
<visual name="visual-muneca">
<pose>0.045 0 0 0 0 0</pose>
<geometry>
<box>
<size>0.09 0.03 0.03</size>
</box>
</geometry>
<material>
<script>Gazebo/Purple</script>
</material>
</visual>
</link>
<link name="gripper">
<gravity>false</gravity>
<pose>0.38 -0.185 1.34 3.141592654 0 0</pose>
<inertial>
<pose>0 0 0 0 0 0</pose>
<inertia>
<ixx>0.001</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>0.001</iyy>
<iyz>0</iyz>
<izz>0.001</izz>
</inertia>
<mass>0.05</mass>
</inertial>
<collision name="collision-gripper">
<geometry>
<cylinder>
<radius>.03</radius>
FACULTAD DE ELECTRNICA
140
<length>.035</length>
</cylinder>
</geometry>
</collision>
<visual name="visual-gripper">
<geometry>
<cylinder>
<radius>.03</radius>
<length>.035</length>
</cylinder>
</geometry>
<material>
<script>Gazebo/Red</script>
</material>
</visual>
<collision name="collision-1-1">
<pose>0.03 -0.017320581 0 0 0 -0.5235957756</pose>
<geometry>
<box>
<size>0.0692820323 0.015 0.015</size>
</box>
</geometry>
</collision>
<visual name="visual-1-1">
<pose>0.03 -0.017320581 0 0 0 -0.5235957756</pose>
<geometry>
<box>
<size>0.0692820323 0.015 0.015</size>
</box>
</geometry>
<material>
<script>Gazebo/Purple</script>
</material>
</visual>
<collision name="collision-1-2">
<pose>0.09 -0.017320581 0 0 0 0.5235957756</pose>
<geometry>
<box>
<size>0.0692820323 0.015 0.015</size>
</box>
</geometry>
</collision>
<visual name="visual-1-2">
<pose>0.09 -0.017320581 0 0 0 0.5235957756</pose>
<geometry>
<box>
<size>0.0692820323 0.015 0.015</size>
</box>
</geometry>
<material>
<script>Gazebo/Purple</script>
</material>
</visual>
</link>
<link name="gripper2-1">
<gravity>false</gravity>
FACULTAD DE ELECTRNICA
141
<pose>0.41 -0.202320581 1.34 0 0 0</pose>
<inertial>
<pose>0 0 0 0 0 0</pose>
<inertia>
<ixx>0.001</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>0.001</iyy>
<iyz>0</iyz>
<izz>0.001</izz>
</inertia>
<mass>0.04</mass>
</inertial>
<collision name="collision-2-1">
<pose>0 0 0 0 0 -0.5235957756</pose>
<geometry>
<box>
<size>0.0692820323 0.015 0.015</size>
</box>
</geometry>
</collision>
<visual name="visual-2-1">
<pose>0 0 0 0 0 -0.5235957756</pose>
<geometry>
<box>
<size>0.0692820323 0.015 0.015</size>
</box>
</geometry>
<material>
<script>Gazebo/Purple</script>
</material>
</visual>
<collision name="collision-2-2">
<pose>0.06 0 0 0 0 0.5235957756</pose>
<geometry>
<box>
<size>0.0692820323 0.015 0.015</size>
</box>
</geometry>
</collision>
<visual name="visual-2-2">
<pose>0.06 0 0 0 0 0.5235957756</pose>
<geometry>
<box>
<size>0.0692820323 0.015 0.015</size>
</box>
</geometry>
<material>
<script>Gazebo/Purple</script>
</material>
</visual>
</link>
<static>false</static>
<joint name="joint1" type="revolute">
<pose>0 0 0 1.570796327 0 0</pose>
<child>hombro</child>
FACULTAD DE ELECTRNICA
142
<parent>base</parent>
<axis>
<limit>
<lower>0.0</lower>
<upper>6.243185307</upper>
</limit>
<xyz>0 -1 0</xyz>
</axis>
</joint>
<joint name="joint2" type="revolute">
<pose>0 0 0 1.570796327 0 0</pose>
<child>brazo</child>
<parent>hombro</parent>
<axis>
<limit>
<lower>0.0</lower>
<upper>6.243185307</upper>
</limit>
<xyz>0 0 -1</xyz>
</axis>
</joint>
<joint name="joint3" type="revolute">
<pose>0 0 0 0 3.141592654 0</pose>
<child>codo</child>
<parent>brazo</parent>
<axis>
<limit>
<lower>0.0</lower>
<upper>6.243185307</upper>
</limit>
<xyz>0 1 0</xyz>
</axis>
</joint>
<joint name="joint3-2" type="revolute">
<pose>0 0 0 -1.570796327 0 0</pose>
<child>codo-antebrazo</child>
<parent>codo</parent>
<axis>
<limit>
<lower>0.0</lower>
<upper>6.243185307</upper>
</limit>
<xyz>0 -1 0</xyz>
</axis>
</joint>
<joint name="joint4" type="revolute">
<pose>0 0 0 1.570796327 0 0</pose>
<child>antebrazo</child>
<parent>codo-antebrazo</parent>
<axis>
<limit>
<lower>0.0</lower>
<upper>6.243185307</upper>
</limit>
<xyz>0 0 -1</xyz>
</axis>
FACULTAD DE ELECTRNICA
143
</joint>
<joint name="joint5" type="revolute">
<pose>0 0 0 -1.570796327 0 0</pose>
<child>muneca</child>
<parent>antebrazo</parent>
<axis>
<limit>
<lower>0.0</lower>
<upper>6.243185307</upper>
</limit>
<xyz>0 1 0</xyz>
</axis>
</joint>
<joint name="joint6" type="revolute">
<child>gripper</child>
<parent>muneca</parent>
<axis>
<limit>
<lower>0.0</lower>
<upper>6.243185307</upper>
</limit>
<xyz>0 0 1</xyz>
</axis>
</joint>
<joint name="joint6-2" type="revolute">
<pose>-0.03 0.01732050808 0 0 0 0</pose>
<child>gripper2-1</child>
<parent>muneca</parent>
<axis>
<limit>
<lower>0.0</lower>
<upper>6.243185307</upper>
</limit>
<xyz>0 0 -1</xyz>
</axis>
</joint>
<plugin name="ControlGazebo" filename="libControlGazebo.so"/>
</model>
</sdf>
Este modelo simplemente fue insertado tal cual dentro de un mundo de Gazebo. No es
necesaria ninguna compilacin o similar previa, Gazebo lo dibuja al momento.
FACULTAD DE ELECTRNICA
144
Anexo D- C
Cdigo del plugin de Gazebo para su comunicacin con ROS. El siguiente cdigo fuente
contiene las instrucciones adecuadas que permiten a Gazebo leer el tpico de mensajes de
ROS; una vez ledos los mensajes los decodifica y ajusta las posiciones de las articulaciones
de modo que coincidan con las indicadas.
//Estos primeros encabezados son requerimientos de Gazebo para sus
plugins
#include <boost/bind.hpp>
#include <gazebo.hh>
#include <physics/physics.hh>
#include <common/common.hh>
#include <stdio.h>
//estos siguientes son los requerimientos de ROS para los mensajes
#include "ros/ros.h"
#include "std_msgs/Float64.h"
#include "mensajes_gazebo.h" //hecho por el usuario, contiene estructuras
para mensajes y sus codificaciones
#include "std_msgs/String.h"
namespace gazebo
{
//clase que hereda de ModelPlugin porque pretendemos manipular un
modelo con este plugin
class ROSModelPlugin : public ModelPlugin
{
public: ROSModelPlugin()
{
// inicializacin de ROS y nombre para el nodo
std::string name = "brazo_donaxi_plugin";
int argc = 0;
ros::init(argc, NULL, name);
}
public: ~ROSModelPlugin()
{
delete this->node;
}
public: void Load(physics::ModelPtr _parent, sdf::ElementPtr
/*_sdf*/)
{
// indicacin del apuntador al modelo
this->model = _parent;
// ROS NodeHandle
this->node = new ros::NodeHandle("~");
// ROS Subscriber para el tpico "ArticulacionesGazebo"
// y llamada a la funcion cuando se dispare.
this->sub = this->node-
>subscribe<std_msgs::String>("ArticulacionesGazebo", 1,
&ROSModelPlugin::ROSCallback, this );
//Suscripcin al evento de actualizacin del "mundo" en
Gazebo, esto es lo que define el ritmo de iteraciones
this->updateConnection =
event::Events::ConnectWorldUpdateBegin(
boost::bind(&ROSModelPlugin::OnUpdate, this, _1));
FACULTAD DE ELECTRNICA
145
//inicializacion de la estructura de escucha
escuchado=InitBrazo(escuchado);
//apuntadores a cada una de las articulaciones
joint_1 = model->GetJoint("joint1");
joint_2 = model->GetJoint("joint2");
joint_3 = model->GetJoint("joint3");
joint_3_2 = model->GetJoint("joint3-2");
joint_4 = model->GetJoint("joint4");
joint_5 = model->GetJoint("joint5");
joint_6 = model->GetJoint("joint6");
joint_6_2 = model->GetJoint("joint6-2");
}
//esta funcin se llama cuando hay una actualizacin del mundo
public: void OnUpdate(const common::UpdateInfo & /*_info*/)
{
ros::spinOnce();
//declaramos una clase para controlar el model llamada
"controlin"
physics::JointController controlin(model);
//llamamos al mtodo miembro de controlin llamada
SetJointPosition,
//el cual pondr en el modelo la posicin que pidamos
controlin.SetJointPosition(joint_1,escuchado.servo1);
controlin.SetJointPosition(joint_2,escuchado.servo2);
controlin.SetJointPosition(joint_3,escuchado.servo3);
controlin.SetJointPosition(joint_3_2,0.785398163);
controlin.SetJointPosition(joint_4,escuchado.servo4);
controlin.SetJointPosition(joint_5,escuchado.servo5);
controlin.SetJointPosition(joint_6,escuchado.servo6);
controlin.SetJointPosition(joint_6_2,escuchado.servo6);
}
//interrupcin de mensaje recibido
void ROSCallback(const std_msgs::String::ConstPtr& msgRecibido)
{
//guardamos el mensaje en "escuchado"
escuchado=decEstructuraBrazo(msgRecibido->data);
ROS_INFO("leido: s1: %f s2: %f s3: %f s4: %f s5: %f
s6: %f", escuchado.servo1, escuchado.servo2, escuchado.servo3,
escuchado.servo4, escuchado.servo5, escuchado.servo6);
escuchado.servo1=(escuchado.servo1*3.141592654)/180;
escuchado.servo2=(escuchado.servo2*3.141592654)/180;
escuchado.servo3=(escuchado.servo3*3.141592654)/180;
escuchado.servo4=(escuchado.servo4*3.141592654)/180;
escuchado.servo5=(escuchado.servo5*3.141592654)/180;
escuchado.servo6=(escuchado.servo6*3.141592654)/180;
}
// declaracin de un apuntador al modelo
private: physics::ModelPtr model;
// declaracin de apuntador al evento de actualizacin del mundo
private: event::ConnectionPtr updateConnection;
// ROS Nodehandle
private: ros::NodeHandle* node;
// ROS Subscriber
ros::Subscriber sub;
//Declaracin de la estructura donde guardaremos el mensaje
private: EstructuraBrazoDonaxi escuchado;
FACULTAD DE ELECTRNICA
146
//declaramos apuntadores a cada una de las articulaciones
physics::JointPtr joint_1;
physics::JointPtr joint_2;
physics::JointPtr joint_3;
physics::JointPtr joint_3_2;
physics::JointPtr joint_4;
physics::JointPtr joint_5;
physics::JointPtr joint_6;
physics::JointPtr joint_6_2;
};
// Registro del plugin en el simulador
GZ_REGISTER_MODEL_PLUGIN(ROSModelPlugin)
}
Como se observa se utilizan apuntadores a las respectivas articulaciones para poder
manipularlas asignndoles los valores ledos del mensaje de ROS.
Anexo E- A
Cdigo de funcin apply_case, que ejecuta los cambios correspondientes a las
articulaciones dependiendo el caso que se desee aplicar, considerando los lmites de los
servomotores y las dos constantes distintas para incrementos y decrementos.
KDL::JntArray apply_case(KDL::JntArray jointconfig, int case_index)
{
switch (case_index)
{
case 1:
jointconfig(0)=jointconfig(0)+MIN_CHANGE;
if( radtodeg(jointconfig(0)) > 156.0 )
{
jointconfig(0)=jointconfig(0)-MIN_CHANGE;
}
break;
case 2:
jointconfig(0)=jointconfig(0)-MAX_CHANGE;
if( radtodeg(jointconfig(0)) < 6.0 )
{
jointconfig(0)=jointconfig(0)+MAX_CHANGE;
}
break;
case 3:
jointconfig(1)=jointconfig(1)+MIN_CHANGE;
if( radtodeg(jointconfig(1)) > 186.0 )
{
jointconfig(1)=jointconfig(1)-MIN_CHANGE;
}
FACULTAD DE ELECTRNICA
147
break;
case 4:
jointconfig(1)=jointconfig(1)-MAX_CHANGE;
if( radtodeg(jointconfig(1)) < 90.0 )
{
jointconfig(1)=jointconfig(1)+MAX_CHANGE;
}
break;
case 5:
jointconfig(2)=jointconfig(2)+MIN_CHANGE;
if( radtodeg(jointconfig(2)) > 360.0 )
{
jointconfig(2)=jointconfig(2)-(2*M_PI);
}
if( (radtodeg(jointconfig(2)) > 116.0) &&
(radtodeg(jointconfig(2)) < 265.0) )
{
jointconfig(2)=jointconfig(2)-MIN_CHANGE;
}
break;
case 6:
jointconfig(2)=jointconfig(2)-MAX_CHANGE;
if( radtodeg(jointconfig(2)) < 0.0 )
{
jointconfig(2)=(2*M_PI)+jointconfig(2);
}
if( (radtodeg(jointconfig(2)) < 270.0) &&
(radtodeg(jointconfig(2)) > 120.0) )
{
jointconfig(2)=jointconfig(2)+MAX_CHANGE;
}
break;
case 7:
jointconfig(3)=jointconfig(3)+MIN_CHANGE;
if( radtodeg(jointconfig(3)) > 360.0 )
{
jointconfig(3)=jointconfig(3)-(2*M_PI);
}
if( (radtodeg(jointconfig(3)) > 148.0) &&
(radtodeg(jointconfig(3)) < 216.0) )
{
jointconfig(3)=jointconfig(3)-MIN_CHANGE;
}
break;
case 8:
jointconfig(3)=jointconfig(3)-MAX_CHANGE;
if( radtodeg(jointconfig(3)) < 0.0 )
{
jointconfig(3)=jointconfig(3)+(2*M_PI);
}
if( (radtodeg(jointconfig(3)) < 213.0) &&
(radtodeg(jointconfig(3)) > 155.0) )
{
jointconfig(3)=jointconfig(3)+MAX_CHANGE;
}
break;
FACULTAD DE ELECTRNICA
148
case 9:
jointconfig(4)=jointconfig(4)+MIN_CHANGE;
if( radtodeg(jointconfig(4)) > 214.0 )
{
jointconfig(4)=jointconfig(4)-MIN_CHANGE;
}
break;
case 10:
jointconfig(4)=jointconfig(4)-MAX_CHANGE;
if( radtodeg(jointconfig(4)) < 73.0 )
{
jointconfig(4)=jointconfig(4)+MAX_CHANGE;
}
break;
case 11:
jointconfig(0)=jointconfig(0)+MIN_CHANGE;
if( radtodeg(jointconfig(0)) > 156.0 )
{
jointconfig(0)=jointconfig(0)-MIN_CHANGE;
}
jointconfig(2)=jointconfig(2)+MIN_CHANGE;
if( radtodeg(jointconfig(2)) > 360.0 )
{
jointconfig(2)=jointconfig(2)-(2*M_PI);
}
if( (radtodeg(jointconfig(2)) > 116.0) &&
(radtodeg(jointconfig(2)) < 265.0) )
{
jointconfig(2)=jointconfig(2)-MIN_CHANGE;
}
break;
case 12:
jointconfig(0)=jointconfig(0)-MAX_CHANGE;
if( radtodeg(jointconfig(0)) < 6.0 )
{
jointconfig(0)=jointconfig(0)+MAX_CHANGE;
}
jointconfig(2)=jointconfig(2)-MAX_CHANGE;
if( radtodeg(jointconfig(2)) < 0.0 )
{
jointconfig(2)=(2*M_PI)+jointconfig(2);
}
if( (radtodeg(jointconfig(2)) < 270.0) &&
(radtodeg(jointconfig(2)) > 120.0) )
{
jointconfig(2)=jointconfig(2)+MAX_CHANGE;
}
break;
case 13:
jointconfig(0)=jointconfig(0)+MIN_CHANGE;
if( radtodeg(jointconfig(0)) > 156.0 )
{
jointconfig(0)=jointconfig(0)-MIN_CHANGE;
}
jointconfig(2)=jointconfig(2)-MAX_CHANGE;
if( radtodeg(jointconfig(2)) < 0.0 )
FACULTAD DE ELECTRNICA
149
{
jointconfig(2)=(2*M_PI)+jointconfig(2);
}
if( (radtodeg(jointconfig(2)) < 270.0) &&
(radtodeg(jointconfig(2)) > 120.0) )
{
jointconfig(2)=jointconfig(2)+MAX_CHANGE;
}
break;
case 14:
jointconfig(0)=jointconfig(0)-MAX_CHANGE;
if( radtodeg(jointconfig(0)) < 6.0 )
{
jointconfig(0)=jointconfig(0)+MAX_CHANGE;
}
jointconfig(2)=jointconfig(2)+MIN_CHANGE;
if( radtodeg(jointconfig(2)) > 360.0 )
{
jointconfig(2)=jointconfig(2)-(2*M_PI);
}
if( (radtodeg(jointconfig(2)) > 116.0) &&
(radtodeg(jointconfig(2)) < 265.0) )
{
jointconfig(2)=jointconfig(2)-MIN_CHANGE;
}
break;
case 15:
jointconfig(3)=jointconfig(3)+MIN_CHANGE;
if( radtodeg(jointconfig(3)) > 360.0 )
{
jointconfig(3)=jointconfig(3)-(2*M_PI);
}
if( (radtodeg(jointconfig(3)) > 148.0) &&
(radtodeg(jointconfig(3)) < 216.0) )
{
jointconfig(3)=jointconfig(3)-MIN_CHANGE;
}
jointconfig(4)=jointconfig(4)+MIN_CHANGE;
if( radtodeg(jointconfig(4)) > 214.0 )
{
jointconfig(4)=jointconfig(4)-MIN_CHANGE;
}
break;
case 16:
jointconfig(3)=jointconfig(3)-MAX_CHANGE;
if( radtodeg(jointconfig(3)) < 0.0 )
{
jointconfig(3)=jointconfig(3)+(2*M_PI);
}
if( (radtodeg(jointconfig(3)) < 213.0) &&
(radtodeg(jointconfig(3)) > 155.0) )
{
jointconfig(3)=jointconfig(3)+MAX_CHANGE;
}
jointconfig(4)=jointconfig(4)-MAX_CHANGE;
if( radtodeg(jointconfig(4)) < 73.0 )
FACULTAD DE ELECTRNICA
150
{
jointconfig(4)=jointconfig(4)+MAX_CHANGE;
}
break;
case 17:
jointconfig(3)=jointconfig(3)+MIN_CHANGE;
if( radtodeg(jointconfig(3)) > 360.0 )
{
jointconfig(3)=jointconfig(3)-(2*M_PI);
}
if( (radtodeg(jointconfig(3)) > 148.0) &&
(radtodeg(jointconfig(3)) < 216.0) )
{
jointconfig(3)=jointconfig(3)-MIN_CHANGE;
}
jointconfig(4)=jointconfig(4)-MAX_CHANGE;
if( radtodeg(jointconfig(4)) < 73.0 )
{
jointconfig(4)=jointconfig(4)+MAX_CHANGE;
}
break;
case 18:
jointconfig(3)=jointconfig(3)-MAX_CHANGE;
if( radtodeg(jointconfig(3)) < 0.0 )
{
jointconfig(3)=jointconfig(3)+(2*M_PI);
}
if( (radtodeg(jointconfig(3)) < 213.0) &&
(radtodeg(jointconfig(3)) > 155.0) )
{
jointconfig(3)=jointconfig(3)+MAX_CHANGE;
}
jointconfig(4)=jointconfig(4)+MIN_CHANGE;
if( radtodeg(jointconfig(4)) > 214.0 )
{
jointconfig(4)=jointconfig(4)-MIN_CHANGE;
}
break;
case 19:
jointconfig(1)=jointconfig(1)+MIN_CHANGE;
if( radtodeg(jointconfig(1)) > 186.0 )
{
jointconfig(1)=jointconfig(1)-MIN_CHANGE;
}
jointconfig(2)=jointconfig(2)+MIN_CHANGE;
if( radtodeg(jointconfig(2)) > 360.0 )
{
jointconfig(2)=jointconfig(2)-(2*M_PI);
}
if( (radtodeg(jointconfig(2)) > 116.0) &&
(radtodeg(jointconfig(2)) < 265.0) )
{
jointconfig(2)=jointconfig(2)-MIN_CHANGE;
}
break;
case 20:
FACULTAD DE ELECTRNICA
151
jointconfig(1)=jointconfig(1)-MAX_CHANGE;
if( radtodeg(jointconfig(1)) < 90.0 )
{
jointconfig(1)=jointconfig(1)+MAX_CHANGE;
}
jointconfig(2)=jointconfig(2)-MAX_CHANGE;
if( radtodeg(jointconfig(2)) < 0.0 )
{
jointconfig(2)=(2*M_PI)+jointconfig(2);
}
if( (radtodeg(jointconfig(2)) < 270.0) &&
(radtodeg(jointconfig(2)) > 120.0) )
{
jointconfig(2)=jointconfig(2)+MAX_CHANGE;
}
break;
case 21:
jointconfig(1)=jointconfig(1)+MIN_CHANGE;
if( radtodeg(jointconfig(1)) > 186.0 )
{
jointconfig(1)=jointconfig(1)-MIN_CHANGE;
}
jointconfig(2)=jointconfig(2)-MAX_CHANGE;
if( radtodeg(jointconfig(2)) < 0.0 )
{
jointconfig(2)=(2*M_PI)+jointconfig(2);
}
if( (radtodeg(jointconfig(2)) < 270.0) &&
(radtodeg(jointconfig(2)) > 120.0) )
{
jointconfig(2)=jointconfig(2)+MAX_CHANGE;
}
break;
case 22:
jointconfig(1)=jointconfig(1)-MAX_CHANGE;
if( radtodeg(jointconfig(1)) < 90.0 )
{
jointconfig(1)=jointconfig(1)+MAX_CHANGE;
}
jointconfig(2)=jointconfig(2)+MIN_CHANGE;
if( radtodeg(jointconfig(2)) > 360.0 )
{
jointconfig(2)=jointconfig(2)-(2*M_PI);
}
if( (radtodeg(jointconfig(2)) > 116.0) &&
(radtodeg(jointconfig(2)) < 265.0) )
{
jointconfig(2)=jointconfig(2)-MIN_CHANGE;
}
break;
default:
printf("Unknown case...!!\n");
break;
}
return jointconfig;
}
FACULTAD DE ELECTRNICA
152
Anexo E- B
Cdigo de algoritmo de trazado de Rutas:
case MANIPULACION_PRUEBAS_CINEMATICA:
1. printf("Pruebas con cinemtica para determinar posiciones!!! \n");
2. //Primer paso poner el brazo en una posicin conocida usando la funcin
"FaseSecuencia"
3. brazo_obj.servo1=60;
4. brazo_obj.servo2=180;
5. brazo_obj.servo3=340;
6. brazo_obj.servo4=0;
7. brazo_obj.servo5=185;
8. brazo_actual=TorqueON(brazo_actual);
9. brazo_actual=FaseSecuencia(brazo_actual, brazo_obj, 5);
10. //definimos el punto actual
11. frpresent.p.x(0.0);
12. frpresent.p.y(-37.0);
13. frpresent.p.z(18.5);
14. frpresent.M=Rotation::RPY(degtorad(-90.0), degtorad(0.0),
degtorad(0.0));
15. //definimos frgoal
16. frgoal.p.x(menMaestro.x);
17. frgoal.p.y(menMaestro.y);
18. frgoal.p.z(menMaestro.z);
19. frgoal.M=Rotation::RPY(degtorad(-90.0),degtorad(0.0),degtorad(0.0));
20. //definiremos uno a uno slo los pasos que queremos hacer
21. frstep=frpresent;
22. frstep.p.y(frgoal.p.y());
23. //calculamos el vector director
24. distance = frstep.p - frpresent.p;
25. magnitude=evalMagnitude(distance);
26. director.x(PASO_RUTA*(distance.x()/magnitude));
27. director.y(PASO_RUTA*(distance.y()/magnitude));
28. director.z(PASO_RUTA*(distance.z()/magnitude));
29. //inicia ciclo que tabular los puntos y mandar las instruccines a los
servos
30. while(magnitude>=PASO_RUTA)
31. {
31.1. //tabulamos nuevo punto
31.2. frpresent.p = frpresent.p + director;
31.3. brazo_actual=KinematicsSolverDonaxi(brazo_actual, frpresent,
FREQUENCY);
31.4. art_actual=CopyInstrucciones(brazo_actual, art_actual);
31.5. ros::spinOnce();
31.6. if(flag==true)
31.7. {
31.7.1. if(menMaestro.actividad==MANIPULACION_EMERGENCIA)
31.7.2. {
31.7.2.1. brazo_actual=TorqueOFF(brazo_actual);
31.7.3. }
31.8. }
31.9. //Manda datos a interfaz.py
31.10. msg2.data=codInstruccionesInterfaz(brazo_actual);
31.11. printf("Enviando dato\n");
31.12. chatter_pub2.publish(msg2);
FACULTAD DE ELECTRNICA
153
31.13. //Manda datos a Gazebo
31.14. msg1.data=codEstructuraBrazo(art_actual);
31.15. chatter_pub1.publish(msg1);
31.16. //volvemos a evaluar la magnitud faltante
31.17. distance=frstep.p - frpresent.p;
31.18. magnitude=evalMagnitude(distance);
31.19. //mensaje vaco para el Maestro y
31.20. chat.publish(msg_vacio);
31.21. ros::spinOnce();
31.22. ros::Duration(1.0/FREQUENCY).sleep();
32. }
33. //abrimos el gripper
34. brazo_obj=brazo_actual;
35. brazo_obj.servo6=100;
36. brazo_actual=TorqueON(brazo_actual);
37. brazo_actual=FaseSecuencia(brazo_actual, brazo_obj, 3);
38. //definiremos el siguiente paso que queremos hacer
39. frstep=frpresent;
40. frstep.p.x(frgoal.p.x());
41. frstep.p.z(frgoal.p.z());
42. //calculamos el vector director
43. distance = frstep.p - frpresent.p;
44. magnitude=evalMagnitude(distance);
45. director.x(PASO_RUTA*(distance.x()/magnitude));
46. director.y(PASO_RUTA*(distance.y()/magnitude));
47. director.z(PASO_RUTA*(distance.z()/magnitude));
48. //inicia ciclo que tabular los puntos y mandar las instruccines a los
servos
49. while(magnitude>=PASO_RUTA)
50. {
50.1. //tabulamos nuevo punto
50.2. frpresent.p = frpresent.p + director;
50.3. brazo_actual=KinematicsSolverDonaxi(brazo_actual, frpresent,
FREQUENCY);
50.4. art_actual=CopyInstrucciones(brazo_actual, art_actual);
50.5. ros::spinOnce();
50.6. if(flag==true)
50.7. {
50.7.1. if(menMaestro.actividad==MANIPULACION_EMERGENCIA)
50.7.2. {
50.7.2.1. brazo_actual=TorqueOFF(brazo_actual);
50.7.3. }
50.8. }
50.9. //Manda datos a interfaz.py
50.10. msg2.data=codInstruccionesInterfaz(brazo_actual);
50.11. printf("Enviando dato\n");
50.12. chatter_pub2.publish(msg2);
50.13. //Manda datos a Gazebo
50.14. msg1.data=codEstructuraBrazo(art_actual);
50.15. chatter_pub1.publish(msg1);
50.16. //volvemos a evaluar la magnitud faltante
50.17. distance=frstep.p - frpresent.p;
50.18. magnitude=evalMagnitude(distance);
50.19. //mensaje vaco para el Maestro y
50.20. chat.publish(msg_vacio);
50.21. ros::spinOnce();
FACULTAD DE ELECTRNICA
154
50.22. ros::Duration(1.0/FREQUENCY).sleep();
51. }
52. //cierra gripper
53. brazo_obj=brazo_actual;
54. brazo_obj.servo6=0;
55. brazo_actual=TorqueON(brazo_actual);
56. brazo_actual=FaseSecuencia(brazo_actual, brazo_obj, 3);
57. //definiremos el siguiente paso que queremos hacer
58. frstep=frpresent;
59. frstep.p.y(frgoal.p.y()+4);
60. //calculamos el vector director
61. distance = frstep.p - frpresent.p;
62. magnitude=evalMagnitude(distance);
63. director.x(PASO_RUTA*(distance.x()/magnitude));
64. director.y(PASO_RUTA*(distance.y()/magnitude));
65. director.z(PASO_RUTA*(distance.z()/magnitude));
66. //inicia ciclo que tabular los puntos y mandar las instruccines a los
servos
67. while(magnitude>=PASO_RUTA)
68. {
68.1. //tabulamos nuevo punto
68.2. frpresent.p = frpresent.p + director;
68.3. brazo_actual=KinematicsSolverDonaxi(brazo_actual, frpresent,
FREQUENCY);
68.4. art_actual=CopyInstrucciones(brazo_actual, art_actual);
68.5. ros::spinOnce();
68.6. if(flag==true)
68.7. {
68.7.1. if(menMaestro.actividad==MANIPULACION_EMERGENCIA)
68.7.2. {
68.7.2.1. brazo_actual=TorqueOFF(brazo_actual);
68.7.3. }
68.8. }
68.9. //Manda datos a interfaz.py
68.10. msg2.data=codInstruccionesInterfaz(brazo_actual);
68.11. printf("Enviando dato\n");
68.12. chatter_pub2.publish(msg2);
68.13. //Manda datos a Gazebo
68.14. msg1.data=codEstructuraBrazo(art_actual);
68.15. chatter_pub1.publish(msg1);
68.16. //volvemos a evaluar la magnitud faltante
68.17. distance=frstep.p - frpresent.p;
68.18. magnitude=evalMagnitude(distance);
68.19. //mensaje vaco para el Maestro y
68.20. chat.publish(msg_vacio);
68.21. ros::spinOnce();
68.22. ros::Duration(1.0/FREQUENCY).sleep();
69. }
70. //definiremos el siguiente paso que queremos hacer
71. frstep=frpresent;
72. frstep.p.x(0.0);
73. frstep.p.z(18.5);
74. //calculamos el vector director
75. distance = frstep.p - frpresent.p;
76. magnitude=evalMagnitude(distance);
77. director.x(PASO_RUTA*(distance.x()/magnitude));
FACULTAD DE ELECTRNICA
155
78. director.y(PASO_RUTA*(distance.y()/magnitude));
79. director.z(PASO_RUTA*(distance.z()/magnitude));
80. //inicia ciclo que tabular los puntos y mandar las instruccines a los
servos
81. while(magnitude>=PASO_RUTA)
82. {
82.1. //tabulamos nuevo punto
82.2. frpresent.p = frpresent.p + director;
82.3. brazo_actual=KinematicsSolverDonaxi(brazo_actual, frpresent,
FREQUENCY);
82.4. art_actual=CopyInstrucciones(brazo_actual, art_actual);
82.5. ros::spinOnce();
82.6. if(flag==true)
82.7. {
82.7.1. if(menMaestro.actividad==MANIPULACION_EMERGENCIA)
82.7.2. {
82.7.2.1. brazo_actual=TorqueOFF(brazo_actual);
82.7.3. }
82.8. }
82.9. //Manda datos a interfaz.py
82.10. msg2.data=codInstruccionesInterfaz(brazo_actual);
82.11. printf("Enviando dato\n");
82.12. chatter_pub2.publish(msg2);
82.13. //Manda datos a Gazebo
82.14. msg1.data=codEstructuraBrazo(art_actual);
82.15. chatter_pub1.publish(msg1);
82.16. //volvemos a evaluar la magnitud faltante
82.17. distance=frstep.p - frpresent.p;
82.18. magnitude=evalMagnitude(distance);
82.19. //mensaje vaco para el Maestro y
82.20. chat.publish(msg_vacio);
82.21. ros::spinOnce();
82.22. ros::Duration(1.0/FREQUENCY).sleep();
83. }
84. break;
Anexo F- A
Cdigo de firmware de la tarjeta CM-700.
//cdigo de control de brazo derecho. Versin 2.0
//configuracin de servos 11, 14, 15, 16, 17, opciones para leer encoder
// de posicin, error, temperatura, carga, habilitar/deshabilitar el
// torque, corriente y moverse a una posicin "inicial".
// recibe goal_speed y goal_position.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/delay.h>
FACULTAD DE ELECTRNICA
156
#include "dynamixel.h"
#include "serial.h"
/// Control table address
#define TORQUE_ENABLE 24
#define CW_COMPLIANCE_MARGIN 26
#define CCW_COMPLIANCE_MARGIN 27
#define P_GOAL_POSITION_L 30
#define P_GOAL_POSITION_H 31
#define P_GOAL_SPEED_L 32
#define P_GOAL_SPEED_H 33
#define P_TORQUE_LIMIT_L 34
#define P_TORQUE_LIMIT_H 35
#define P_PRESENT_POSITION_L 36
#define P_PRESENT_POSITION_H 37
#define P_MOVING 46
#define PRESENT_LOAD_L 40
#define PRESENT_LOAD_H 41
// Defulat setting
#define DEFAULT_BAUDNUM 1 // 1Mbps
//funciones
int caL(int valor)
{
return valor%256;
}
int caH(int valor)
{
return valor/256;
}
int fil(int t)
{
if(t<=1023)
{
return t/10;
}
else
{
return ((t-1024)/10);
}
}
int main(void)
{
//posiciones leidas
int pos11=1001;
int pos12=1002;
int pos13=1003;
int pos14=1004;
int pos15=1005;
int pos16=1006;
int pos17=1007;
//cargas leidas
int load11=1001;
int load12=1002;
int load13=1003;//10
int load14=1004;
int load15=1005;
int load16=1006;
FACULTAD DE ELECTRNICA
157
int load17=1007;
//estados recibidos
int state11=0;
int state12=0;
int state13=0;
int state14=0;
int state15=0;
int state16=0;
int state17=0;
//posiciones objetivo l y h
int oposl11=0;
int oposh11=0;//30
int oposl12=0;
int oposh12=0;
int oposl13=0;
int oposh13=0;
int oposl14=0;
int oposh14=0;
int oposl15=0;
int oposh15=0;
int oposl16=0;
int oposh16=0;//40
int oposl17=0;
int oposh17=0;
//velocidades objetivo l y h
int vel11=0;
int vel12=0;
int vel13=0;
int vel14=0;
int vel15=0;
int vel16=0;
int vel17=0;
//posiciones convertidas para enviar
int posl11=0;
int posh11=0;
int posl12=0;
int posh12=0;//60
int posl13=0;
int posh13=0;
int posl14=0;
int posh14=0;
int posl15=0;
int posh15=0;
int posl16=0;
int posh16=0;
int posl17=0;
int posh17=0;//70
//cargas convertidas para enviar
serial_initialize(57600);
dxl_initialize( 0, DEFAULT_BAUDNUM ); // Not using device index
sei(); // Interrupt Enable
//inicializacion de servos!!
dxl_write_word(11, TORQUE_ENABLE, 0); //11
//dxl_write_word(26, TORQUE_ENABLE, 0); //12 servo faltante
//AQU IRA LA CONFIG DEL COMPLIANCE SI SE CONSIGUE EL SERVO FALTANTE
dxl_write_word(13, TORQUE_ENABLE, 0); //13
FACULTAD DE ELECTRNICA
158
dxl_write_word(14, TORQUE_ENABLE, 0); //14
dxl_write_word(15, TORQUE_ENABLE, 0); //15
dxl_write_word(16, TORQUE_ENABLE, 0); //16
dxl_write_word(17, TORQUE_ENABLE, 0); //17
while(1)
{
//lectura de posiciones de todos los servos
pos11 = dxl_read_word( 11, P_PRESENT_POSITION_L ); //11
//pos12 = dxl_read_word( 12, P_PRESENT_POSITION_L ); //12 servo
faltante
pos13 = dxl_read_word( 13, P_PRESENT_POSITION_L ); //13
pos14 = dxl_read_word( 14, P_PRESENT_POSITION_L ); //14
pos15 = dxl_read_word( 15, P_PRESENT_POSITION_L ); //15
pos16 = dxl_read_word( 16, P_PRESENT_POSITION_L ); //16
pos17 = dxl_read_word( 17, P_PRESENT_POSITION_L ); //17
//conversiones de todos los servos
posl11=caL(pos11);
posh11=caH(pos11);
posl12=caL(pos12);
posh12=caH(pos12);
posl13=caL(pos13);
posh13=caH(pos13);
posl14=caL(pos14);
posh14=caH(pos14);
posl15=caL(pos15);
posh15=caH(pos15);
posl16=caL(pos16);
posh16=caH(pos16);
posl17=caL(pos17);
posh17=caH(pos17);
//lectura de carga de todos los servos
load11 = dxl_read_word( 11, PRESENT_LOAD_L ); //11
//load12 = dxl_read_word( 12, PRESENT_LOAD_L ); //12 SERVO
FALTANTE
load13 = dxl_read_word( 13, PRESENT_LOAD_L ); //13
load14 = dxl_read_word( 14, PRESENT_LOAD_L ); //14
load15 = dxl_read_word( 15, PRESENT_LOAD_L ); //15
load16 = dxl_read_word( 16, PRESENT_LOAD_L ); //16
load17 = dxl_read_word( 17, PRESENT_LOAD_L ); //17
//convetrsiones de todos los servos
load11=fil(load11);
load12=fil(load12);
load13=fil(load13);
load14=fil(load14);
load15=fil(load15);
load16=fil(load16);
load17=fil(load17);
//recepcion de datos para servo 11
state11=getchar();
oposl11=getchar();
oposh11=getchar();
vel11=getchar();
//recepcion de datos para servo 12
state12=getchar();
oposl12=getchar();
oposh12=getchar();
FACULTAD DE ELECTRNICA
159
vel12=getchar();
//recepcion de datos para servo 13
state13=getchar();
oposl13=getchar();
oposh13=getchar();
vel13=getchar();
//recepcion de datos para servo 14
state14=getchar();
oposl14=getchar();
oposh14=getchar();
vel14=getchar();
//recepcion de datos para servo 15
state15=getchar();
oposl15=getchar();
oposh15=getchar();
vel15=getchar();
//recepcion de datos para servo 16
state16=getchar();
oposl16=getchar();
oposh16=getchar();
vel16=getchar();
//recepcion de datos para servo 17
state17=getchar();
oposl17=getchar();
oposh17=getchar();
vel17=getchar();
//Escritura de datos para servo 11
printf("%c%c%c",posl11,posh11,load11);
//Escritura de datos para servo 12
printf("%c%c%c",posl12,posh12,load12);
//Escritura de datos para servo 13
printf("%c%c%c",posl13,posh13,load13);
//Escritura de datos para servo 14
printf("%c%c%c",posl14,posh14,load14);
//Escritura de datos para servo 15
printf("%c%c%c",posl15,posh15,load15);
//Escritura de datos para servo 16
printf("%c%c%c",posl16,posh16,load16);
//Escritura de datos para servo 17
printf("%c%c%c",posl17,posh17,load17);
//Enviar velocidades a todos los servos
//dxl_write_word(26, P_GOAL_SPEED_L, (vel11*4)); //11
//dxl_write_word(26, P_GOAL_SPEED_L, (vel12*4)); //12
//dxl_write_word(26, P_GOAL_SPEED_L, (vel13*4)); //13 servo
faltante
//dxl_write_word(26, P_GOAL_SPEED_L, (vel14*4)); //14
//dxl_write_word(26, P_GOAL_SPEED_L, (vel15*4)); //15
//dxl_write_word(26, P_GOAL_SPEED_L, (vel16*4)); //16
//Enviar posiciones o desabilitar lo que corresponda a cada
servo
//servo 11
if (state11=='T')
{
dxl_write_word(11, P_GOAL_SPEED_L, (vel11*4)); //11
oposl11=oposl11+((oposh11-50)*256);
dxl_write_word(11, P_GOAL_POSITION_L, oposl11);
FACULTAD DE ELECTRNICA
160
}
else
{
dxl_write_word(11, TORQUE_ENABLE, 0);
}
//servo 12
/*if (state12=='T')
{
dxl_write_word(12, P_GOAL_SPEED_L, (vel12*4)); //12
oposl12=oposl12+(oposh12*256);
dxl_write_word(12, P_GOAL_POSITION_L, oposl12);
}
else
{
dxl_write_word(12, TORQUE_ENABLE, 0);
}*/
//servo 13
if (state13=='T')
{
dxl_write_word(13, P_GOAL_SPEED_L, (vel13*4)); //13
oposl13=oposl13+((oposh13-50)*256);
dxl_write_word(13, P_GOAL_POSITION_L, oposl13);
}
else
{
dxl_write_word(13, TORQUE_ENABLE, 0);
}
//servo 14
if (state14=='T')
{
dxl_write_word(14, P_GOAL_SPEED_L, (vel14*4)); //14
oposl14=oposl14+(oposh14*256);
dxl_write_word(14, P_GOAL_POSITION_L, oposl14);
}
else
{
dxl_write_word(14, TORQUE_ENABLE, 0);
}
//servo 15
if (state15=='T')
{
dxl_write_word(15, P_GOAL_SPEED_L, (vel15*4)); //15
oposl15=oposl15+(oposh15*256);
dxl_write_word(15, P_GOAL_POSITION_L, oposl15);
}
else
{
dxl_write_word(15, TORQUE_ENABLE, 0);
}
//servo 16
if (state16=='T')
{
dxl_write_word(16, P_GOAL_SPEED_L, (vel16*4)); //16
oposl16=oposl16+(oposh16*256);
dxl_write_word(16, P_GOAL_POSITION_L, oposl16);
}
FACULTAD DE ELECTRNICA
161
else
{
dxl_write_word(16, TORQUE_ENABLE, 0);
}
//servo 17
if (state17=='T')
{
dxl_write_word(17, P_GOAL_SPEED_L, (vel17*4)); //17
oposl17=oposl17+(oposh17*256);
dxl_write_word(17, P_GOAL_POSITION_L, oposl17);
}
else
{
dxl_write_word(17, TORQUE_ENABLE, 0);
}
}
return 0;
}
Se puede observar que hay algunas lneas con instrucciones convertidas en comentario
que hacen referencia a un servomotor 12. Esto se debe a que en un diseo original del sistema
se incluan siete servomotores, es decir, una de las articulaciones del hombro estaba formada
por dos EX-106+ acoplados para sumar sus torques y obtener una mayor fuerza, sin embargo,
uno de los motores experiment ciertos problemas y por cuestiones de recursos del proyecto
no pudo ser reemplazado. Se hicieron pruebas y se determin que un motor bastara para un
correcto funcionamiento del manipulador aunque el peso mximo que pudiera soportar se
viera ligeramente disminuido.
FACULTAD DE ELECTRNICA
162
BIBLIOGRAFA
About ROS. (s.f.). Recuperado el 26 de Agosto de 2014, de www.ros.org/about-ros/
Aleny, G., & Tellez, R. (2013). The Reem@IRI 2013 RoboCup@Home Team Description.
Institut de Robtica i Informtica Industrial, CSIC-UPC, http://robocup.pal-
robotics.com/.
Applications. (s.f.). Recuperado el 05 de Septiembre de 2014, de The Orocos Project:
http://orocos.org/orocos/applications
Barinka, L., & Berka, R. (s.f.). Inverse Kinematics - Basic Methods. Dept. of Computer
Science & Engineering, Czech Technical University.
Barrientos, A., Pen, L. F., Balaguer, C., & Aracil, R. (2007). Fundamentos de robtica
(Segunda ed.). Madrid, Espaa: S.A. McGraw-Hill/Interamericana de Espaa.
Basic Programming. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-
Manual v1.23.00:
http://support.robotis.com/en/software/embeded_c/cm510_cm700/programming/basic_
programming.htm
Bharatheesha, M., Rudinac, M., Chandarr, A., Gaisser, F., Bruinink, M., Pons Rueda, S., . . .
Jonker, P. (2012). Delft Robotics RoboCup@Home 2012 Team Description Paper.
Delft University of Technology, Department of Bio-Mechanical Engineering,
http://www.delftrobotics.nl.
Bodnar, J. (25 de Mayo de 2014). wxPython tutorial. Recuperado el 09 de Septiembre de
2014, de ZetCode.com: http://zetcode.com/wxpython/
Boot Loader. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual
v1.23.00:
http://support.robotis.com/en/software/embeded_c/cm510_cm700/programming/bootlo
ader.htm
Chen, X., Wang, F., Sun, H., Xie, J., Cheng, M., & Chen, K. (2013). KeJia: The Integrated
Intelligent Robot for RoboCup@Home 2013. Multi-Agent Systems Lab., Department
of Computer Science and Technology, University of Science and Technology of China,
http://wrighteagle.org/en/robocup/atHome.
FACULTAD DE ELECTRNICA
163
CM510/CM700. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual
v1.23.00: http://support.robotis.com/en/software/embeded_c/cm510_cm700.htm
CM-700. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual v1.23.00:
http://support.robotis.com/en/product/controller/cm700_manual.htm
Correa, M., Bernuy, F., Herrmann, D., Olave, G., Pavez, M., Tampier, C., . . . Ruiz-del-Solar,
J. (2013). UChile HomeBreakers 2013 Team Description Paper. Department of
Electrical Engineering - Advanced Mining Technology Center, Universidad de Chile,
http://www.robocup.cl/athome.htm.
Dwiputra, R., Fller, M., Hegger, F., Hochgeschwender, N., Paulus, J., Schneider, S., . . .
Kraetzschmar, G. K. (2013). The b-it-bots RoboCup@Home 2013 Team Description
Paper. Bonn-Rhein-Sieg University of Applied Sciences, Department od Computer
Science, http://www.b-it-bots.de.
Dynamixel. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual
v1.23.00: http://support.robotis.com/en/product/dxl_main.htm
Embedded C. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual
v1.23.00: http://support.robotis.com/en/software/embeded_c_main.htm
EX-106+. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual v1.23.00:
http://support.robotis.com/en/product/dynamixel/ex_series/ex-106.htm
Example. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual v1.23.00:
http://support.robotis.com/en/software/embeded_c/cm510_cm700/example.htm
EX-Series. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual
v1.23.00: http://support.robotis.com/en/product/dynamixel/dxl_ex_main.htm
Fu, K. S., Gonzlez, R. C., & Lee, C. S. (1987). Robotics: Control, Sensing, Vision and
Intelligence (primera ed.). Madrid, Espaa: McGraw-Hill.
Gazebo - Package Summary. (28 de Junio de 2013). Recuperado el 05 de Septiembre de 2014,
de http://wiki.ros.org/gazebo?distro=fuerte
Gazebo - Tutorials. (s.f.). Recuperado el 05 de Septiembre de 2014, de
http://gazebosim.org/tutorials
Gazebo. (2014). Recuperado el 09 de Septiembre de 2014, de http://gazebosim.org/
gazebo::physics::JointController Class Reference. (s.f.). Recuperado el 05 de Septiembre de
2014, de Classes for physics and dynamics: http://osrf-
FACULTAD DE ELECTRNICA
164
distributions.s3.amazonaws.com/gazebo/api/dev/classgazebo_1_1physics_1_1JointCo
ntroller.html
Geometric Primitives. (s.f.). Recuperado el 05 de Septiembre de 2014, de Orocos Kinematics
and Dynamics: http://orocos.org/kdl/usermanual/geometric-primitives
Gonzlez Duque, R. (s.f.). Python para todos. Espaa: http://mundogeek.net/tutorial-python/.
Gonzlez, V. R. (2002-03). Estructura de un robot industrial. Recuperado el 16 de Noviembre
de 2013, de
http://platea.pntic.mec.es/vgonzale/cyr_0204/ctrl_rob/robotica/sistema/morfologia.htm
Grossman, S. I. (1992). lgebra Lineal (Cuarta (tercera edicin en espaol) ed.). (C. M.
Snchez Trujillo, Trad.) Naucalpan de Jurez, Mxico: MGraw-Hill.
Hubert, U., Stckler, J., & Behnke, S. (2012). Bayesian Calibration of the Hand-Eye
Kinematics of an Anthropomorphic Robot. In Proceedings of the IEEE-RAS
International Conference on Humanoid Robots, Autonomous Intelligent Systems
Group, Computer Science Institute VI, University of Bonn.
Installing Atmel Studio. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-
Manual v1.23.00:
http://support.robotis.com/en/software/embeded_c/cm510_cm700/quickstart/atmel_stu
dio_install.htm
Installing WinAVR. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual
v1.23.00:
http://support.robotis.com/en/software/embeded_c/cm510_cm700/quickstart/winavr_in
stall.htm
Is ROS For Me? (s.f.). Recuperado el 26 de Agosto de 2014, de www.ros.org/is-ros-for-me/
Jazar, R. N. (2006). Theory of Applied Robotics: Kynematics, Dynamics and Control (Segunda
ed.). New York, USA: Springer.
Kinematic and Dynamic Solvers. (s.f.). Recuperado el 05 de Septiembre de 2014, de Orocos
Kinematics and Dynamics: http://orocos.org/kdl/UserManual/kinematic_solvers
Kinematic Trees - KDL 1.1.x. (s.f.). Recuperado el 05 de Septiembre de 2014, de Orocos Wiki:
http://orocos.org/wiki/main-page/kdl-wiki/user-manual/kinematic-chains/kinematic-
chains-kdl-11x
FACULTAD DE ELECTRNICA
165
Lewis, F. L., Dawson, D. M., & Abdallah, C. T. (2004). Robot Manipulator Control. Theory
and Practice (segunda ed.). New York, USA: Marcel-Dekker.
Llarena, A., Boldt, J. F., Steinke, N. S., Engelmeyer, H., & Rojas, R. (2013).
BerlinUnited@Home 2013 Team Description Paper. Department of Mathematics and
Computer Science, Freie Universitt Berlin, http://athome.berlinunited.org.
Lunenburg, J. J., Coenen, S. A., van den Dries, S., Elfring, J., Janssen, R. J., Sandee, J. H., &
van de Molengraft, M. J. (2013). Tech United Eindhoven Team Description 2013.
Eindhoven University of Technology,, http://www.techunited.nl, techunited@tue.nl.
Mahmoudi, F., Fathzadeh, R., Hosseini, A., Namazifar, M. J., Nabavi, N., Abdollahi, F., . . .
Bagheri, H. (2013). MRL @Home 2013 Team Description Paper. Mechatronics
Research Laboratory, Qazvin Islamic Azad University, http://www.mrl.ir.
Make a Model. (s.f.). Recuperado el 05 de Septiembre de 2014, de
http://gazebosim.org/tutorials?tut=build_model&cat=build_robot
Make a Simple Gripper. (2014). Recuperado el 05 de Septiembre de 2014, de
http://gazebosim.org/tutorials?tut=simple_gripper&cat=build_robot
Maneewarn, T., Sooktip, T., Thungod, K., Suparat, N., & Aurmyou, J. (2013). Team TRCC
RoboCup 2013 RoboCup@Home League Team Description Paper. Thonburi Robot
Contest Club, King Mongkuts University of Technology Thonburi (KMUTT),
http://trccrobotathome.blogspot.com/.
Murphy, R. R. (2000). Introduction to AI Robotics (Primera ed.). Cambridge, Massachusetts,
USA: The MIT Press.
Navigating the ROS Filesystem. (19 de Diciembre de 2013). Recuperado el 31 de Agosto de
2014, de http://wiki.ros.org/ROS/Tutorials/NavigatingTheFilesystem
Nieuwenhuisen, M., Stckler, J., Berner, A., Klein, R., & Behnke, S. (2012). Shape-Primitive
Based Object Recognition and Grasping. Computer Science Institute, University of
Bonn, Germany, 7th German Conference on Robotics (ROBOTIK).
Orocos Kinematics and Dynamics. (s.f.). Recuperado el 05 de Septiembre de 2014, de
http://orocos.org/kdl
Orocos Licenses. (s.f.). Recuperado el 05 de Septiembre de 2014, de
http://orocos.org/content/orocos-licenses
FACULTAD DE ELECTRNICA
166
Pineda, L. A. (2013). The Golem Team, RoboCup@Home 2013. Computer Sciences
Department, Instituto de Investigaciones en Matemticas Aplicadas y en Sistemas,
Universidad Nacional Autnoma de Mxico, http://golem.iimas.unam.mx.
Popirlan, C., & Dupac, M. (2009). An Optimal Path Algorithm for Autonomous Searching
Robots. Annals of University of Craiova, Math. Comp. Sci. Ser, 36(1), 37-48.
Qizhi, Z., Yali, Z., Xinxin, X., Ye, L., & Jun, Z. (2013). Sun - RoboCup@Home 2013 Team
Description Paper. School of Automation, Beijing Information Science & Technology
University, http://zt.bistu.edu.cn/RoboCupAtHome/.
Restoring RoboPlus. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-
Manual v1.23.00:
http://support.robotis.com/en/software/embeded_c/cm510_cm700/programming/firmw
are_recovery.htm
RoboPlus Manager. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual
v1.23.00:
http://support.robotis.com/en/software/roboplus/roboplus_manager_main.htm
RoboPlus Motion. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual
v1.23.00: http://support.robotis.com/en/software/roboplus/roboplus_motion_main.htm
RoboPlus Task. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual
v1.23.00: http://support.robotis.com/en/software/roboplus/roboplus_task_main.htm
RoboPlus Terminal. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual
v1.23.00:
http://support.robotis.com/en/software/roboplus/roboplus_terminal_main.htm
ROS - Core Components. (s.f.). Recuperado el 26 de Agosto de 2014, de www.ros.org/core-
components/
ROS - Integration with Other Libraries. (s.f.). Recuperado el 26 de Agsosto de 2014, de
http://www.ros.org/integration/
ROS Contributors. (14 de Julio de 2014). Recuperado el 26 de Agosto de 2014, de
www.ros.org/contributors/
RX-28. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual v1.23.00:
http://support.robotis.com/en/product/dynamixel/rx_series/rx-28.htm
FACULTAD DE ELECTRNICA
167
RX-64. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual v1.23.00:
http://support.robotis.com/en/product/dynamixel/rx_series/rx-64.htm
RX-Series. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-Manual
v1.23.00: http://support.robotis.com/en/product/dynamixel/dxl_rx_main.htm
Savage, J., Matamoros, M., Negrete, M., Figueroa, I., Cruz, J., Contreras, L., . . . Mrquez, J.
(2013). Pumas@Home 2013 Team Description Paper. Bio-Robotics Laboratory,
UNAM, http://biorobotics.fi-p.unam.mx.
Seib, V., Kathe, F., McStay, D., Manthe, S., Peters, A., Benedikt, J., . . . Paulus, D. (08 de 02
de 2013). RoboCup 2013 - homer@UniKoblenz (Germany). Active Vision Group,
University of Koblenz and Landau, http://robots.uni-koblenz.de/.
Setting Environment. (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS e-
Manual v1.23.00:
http://support.robotis.com/en/software/embeded_c/cm510_cm700/quickstart/etc_prepa
ration.htm
Siciliano, B., Sciavicco, L., Villani, L., & Oriolo, G. (2009). Robotics: Modelling, Planning
and Control (primera ed.). (M. J. Grimble, & M. A. Johnson, Edits.) Roma-Npoles,
Italia: Springer-Verlag.
Smithmaitrie, P., Hiransoog, C., Wichakool, W., Sangsaikeaw, S., Chanchaichujit, P.,
Rajawana, A., . . . Saekow, P. (2013). Team Description Paper: Team Dong Yang in
2013 RoboCup @Home League. Department of Mechanical Engineering, Faculty of
Engineering, Prince of Songkla University, www.me.psu.ac.th/robocup.
Stckler, J., & Behnke, S. (2012). Benchmarking Mobile Manipulation in Everyday
Environments. Autonomous Intelligent Systems, University of Bonn, In Proc. of the
IEEE Workshop on Advanced Robotics and its Social Impacts.
Stckler, J., Droeschel, D., Grve, K., Holz, D., Schreiber, M., & Behnke, S. (2013).
NimbRo@Home 2013 Team Description. Rheinische Friedrich-Wilhelms-Universitt
Bonn, Computer Science Institute VI: Autonomous Intelligent Systems,
http://www.NimbRo.net/@Home.
Sucar, E., Morales, E., Heyer, P., Vasquez, I., Palacios-Alonso, M. A., Escalante, H. J., . . .
Estevez, C. (2012). Markovito's Team Description RoboCup@Home 2012. National
Institute for Astrophysics, Optics and Electronics, Computer Science Department;
FACULTAD DE ELECTRNICA
168
Research Center in Mathematics, Computer Science Department; Guanajuato
University, http://ccc.inaoep.mx/~markovito.
Suthakorn, J., Onprasert, W., Nakdhamabhorn, S., Phuengsuk, R., Itsarachaiyot, Y.,
Moonjaita, C., . . . Patel, S. (2013). RoboCup@Home League 2013 <BART LAB
AssistBot (THAILAND)>. Center for Biomedical and Robotics Technology (BART
LAB), Faculty of Engineering, Mahidol University, http://www.bartlab.org.
The Orocos Project. (s.f.). Recuperado el 05 de Septiembre de 2014, de http://orocos.org/
Tutorials/1.3/ros enabled model plugin. (30 de November de 2012). Recuperado el 05 de
Septiembre de 2014, de
http://wiki.gazebosim.org/wiki/Tutorials/1.3/ros_enabled_model_plugin
Understanding ROS Topics. (05 de Marzo de 2014). Recuperado el 31 de Agosto de 2014, de
http://wiki.ros.org/ROS/Tutorials/UnderstandingTopics
USB Downloader (LN-101). (2010). Recuperado el 07 de Septiembre de 2014, de ROBOTIS
e-Manual v1.23.00:
http://support.robotis.com/en/product/auxdevice/interface/ln101_manual.htm
van Elteren, T., Neculoiu, P., Oost, C., Shantia, A., Snijders, R., van der Wal, E., & van der
Zant, T. (2013). BORG The RoboCup@Home team of the University of Groningen
Team Description Paper 2013. Faculty of Mathematics and Natural Sciences,
University of Groningen Dept. of Artificial Intelligence, http://www.ai.rug.nl.
Vargas M., H. S., Olmedo U., E., Martnez M., A. D., Poisot M., V., Perroni G., A. A.,
Rodrguez C., A., . . . Orozco E., A. (2013). "Project Donaxi@HOME Service Robot".
Applied Mechanics and Materials, 423-426,
doi:10.4028/www.scientific.net/AMM.423-426.2817.
Vargas, H. S., Olmedo, E., Martnez, D., Poisot, V., Perroni, A., Rodrguez, A., . . . Portillo,
A. (2013). Donaxi@HOME Project. Universidad Popular Autnoma del Estado de
Puebla, Department of Engineering.