Lab2 Robotica
Lab2 Robotica
Medellín - Colombia
RESUMEN
En el actual informe se presentan los resultados obtenidos en la segunda práctica del curso Robótica
Industrial, allí se afianzaron conceptos fundamentales de ROS que ya habían sido abordados y se
tocaron otros nuevos tales como mensajes y servicios.
Primero que todo se plantea una base teórica en la que se definen términos de vital importancia en el
manejo de ROS, luego de esto se realiza el desarrollo de la parte experimental indicando paso a paso lo
que se pide en la guía de laboratorio, adicional se adjuntan las respectivas capturas. Finalmente, a partir
de los resultados obtenidos se realiza una serie de conclusiones.
PALABRAS CLAVES
Tópico, mensaje, servicio, nodo, robótica
ABSTRACT
In the current report, the results obtained in the second practice of the Industrial Robotics
course are presented, there fundamental concepts of ROS that have already been addressed
were consolidated and other new stories such as messages and services were played.
First of all, a theoretical basis is proposed in which terms of vital importance in the
management of ROS are defined, after this the development of the experimental part is
carried out indicating step by step what is requested in the laboratory guide, additional is
attach the respective captures. Finally, based on the results obtained, a series of conclusions
is made.
1. INTRODUCCIÓN
Actualmente, el uso de los robots ha tomado demasiada fuerza con la gran característica de que
poseen múltiples campos de aplicación y operación. Desde las industrias hasta las oficinas
podemos encontrar actividad de estos seres artificiales; sin embargo, siempre ha existido una
variable con la que los ingenieros han batallado buscando mejorar. Cómo hacer que estos
seres piensen y actúen más como humanos y no como simples máquinas. La respuesta,
mediante la programación, con un sistema operativo llamado ROS.
La programación es relevante porque hace que los robots ejecuten tareas complejas sin más
contratiempo. El problema con esto radica en la complejidad de la tarea misma, es decir
mientras más difícil y/o laboriosa fuese la actividad, la codificación es un dolor de cabeza
para el desarrollador. Eso sin contar con los múltiples problemas de compatibilidad de
hardware que siempre se llegan a encontrar cuando queremos implementar características
adicionales a nuestro robot. Con todo esto en mente, en 2007 se desarrolló en la Universidad
de Stanford el proyecto switchyard ahora conocido como ROS (Robotic Operating System).
[1]
2. MARCO TEÓRICO
Se definirán conceptos propios de ROS que serán utilizados en el desarrollo de la actual práctica.
ROS: ROS se describe como un framework (entorno de trabajo) flexible, con una amplia
variedad de herramientas, librerías y paquetes que busca la creación de software complejo
para tener robots robustos y con un comportamiento variado.
msg : los archivos msg son simples archivos de texto que describen los campos de un
mensaje ROS. Se usan para generar código fuente para mensajes en diferentes tipos de
lenguajes.
srv : un archivo srv describe un servicio. Está compuesto de dos partes: una solicitud y una
respuesta.
Ficheros ROS:
Packages: son la unidad principal de organización de software. Pueden contener procesos
ROS, librerías, datos, archivos de configuración o cualquier agrupación de información
coherente.
Manifests: archivos XML que contienen información sobre packages (información de licencia,
dependencias, etc).
Master: proceso con funcionalidades de registro y consulta a los nodos. Permite que estos se
encuentren y se comuniquen.
Ejercicio 1.
Planteamiento
Crear una red de comunicación entre 3 nodos; los cuales permitan, como primer requisito
generar un vector de 3 números agregados de manera aleatoria, que posteriormente sean
elevados al cuadrado y puedan ser visualizados, además es necesario que un nuevo nodo genere
la suma de los números que componen este último vector.
Solución
En un principio se crea la carpeta contenedora por medio del comando mkdir, después se
inicializa el espacio de trabajo haciendo uso de catkin_init_workspace, posterior a ello se
compila con el comando catkin_make.
A continuación, se muestra dicha ejecución.
Ahora, se crea un paquete que contendrá las variables de entorno a partir de la utilización del
comando catkin_create_pkg, después, se crea un archivo llamado Ejer1.msg por medio del
comando touch dentro de una carpeta llamada msg contenida dentro del mencionado paquete.
Posterior a esto, se le da permisos y se hace ejecutable a Ejer1.msg con el comando chmod a+x.
A continuación se muestra el procedimiento mencionado.
Posterior a ello, se ejecutan los tres nodos a partir del comando rosrun. Se obtiene, para el
primer nodo, vectores de 3 números aleatorios del 1 al 9, para el segundo nodo, vectores que
contienen el cuadrado de las componentes del anterior vector y por último, para el tercer nodo,
se obtuvo la suma de las componente del vector justamente anterior, es decir, el resultante en el
segundo nodo.
Ejercicio 2.
Planteamiento
Solución
Se crea un mensaje para mostrar que estará contenido en Ejer2.msg, posteriormente se crean
dos nodos, Nod1ejer2.py y Nod2ejer2.py, que serán tipo publicador y suscriptor
respectivamente. Se les hace ejecutable para
posteriormente ser codificados de manera pertinente.
Posterior a ello, se ejecuta nodo 1 y se introducirán los datos a proporcionar, ya finalizado este
proceso, se ejecuta el nodo 2 y se puede observar la impresión de los datos proporcionados
anteriormente.
Ejercicio 3.
Planteamiento
Se pretende establecer una comunicación entre servicios de ROS y primero vamos a crear un
servicio que realizará una operación de suma de dos números enteros el cual consistirá en pasar
de dos números enteros desde el cliente al servidor y éste realizará la operación de suma y
retornará el resultado correspondiente.
Solución
Ahora, se verifica la correcta generación del servicio por medio del comando rossrv show, no
sin antes haber ejecutado en otra terminal el comando roscore.
A continuación se muestra lo obtenido después de esta ejecución.
Se crea el servicio servidor de ROS a través del comando node_service_server.py, después se
hace ejecutable y se introduce el código pertinente. Posterior a ello, se ejecuta el servicio
servidor, para esto, en principio ejecutamos roscore y después rosrun. A continuación se
muestra lo mencionado.
Ahora, con el fin de garantizar el funcionamiento correcto del servicio, se ejecuta el comando
rosservice list y posteriormente el comando rosservice info para mostrar la información del
servicio. Posterior a esto, se hace el llamado al servicio y se prueba su funcionamiento a través
de rosservice call y el digitalizado de dos números para ser sumados. A continuación se exhibe
la verificación, la información y el funcionamiento óptimo.
Con el fin de confirmar si el servicio servidor está listo para realizar la suma, se ejecuta dicho
nodo por medio de rosrun, obteniendo como resultado lo siguiente.
Ya teniendo certeza del funcionamiento de servicio servidor, se ejecuta el servicio cliente de la
misma forma que se acaba de ejecutar el servicio servidor, es decir, con rosrun y se obtiene
como resultado la respuesta de la suma de los números proporcionados a través del cliente.
Ejercicio 3.
Planteamiento
Se pretende establecer una comunicación entre ROS y un dispositivo externo, en este caso un
joystick que funcione en modo teleoperado y de esta manera poder controlar los movimientos
de la tortuga perteneciente al nodo Turtlesim.
Solución
Primero se instalan los drivers necesarios por medio del comando $sudo apt-get install ros-
kinetic-joy, el cual instala los drivers para el funcionamiento del joystick y su comunicación
con ROS.
4. RESULTADOS
La ejecución del nodo Nod1ejer1.py, se obtuvo como resultado 3 números aleatorios del 1 al 9.
A continuación se muestra
La ejecución del nodo Nod2ejer1.py, se obtuvo como resultado el cuadrado de los vectores de 3
números resultantes del nodo 1. A continuación se muestra.
La ejecución del nodo Nod3ejer1.py, se obtuvo como resultado la suma de los vectores de 3
números resultantes del nodo 2. A continuación se muestra.
La ejecución de este primer nodo, es decir, Nod1ejer2.py, tiene como resultado el requerimiento
de ciertos datos, a continuación se muestra los datos requeridos e introducidos.
La ejecución del nodo Nod2ejer2.py, muestra los datos proporcionados en el primer nodo,
exhibiendo una comunicación entre el nodo publicador y el suscriptor.
Resultados obtenidos en el ejercicio 3.
Cuestionario
1) Para cada uno de los ejercicios anteriores realizar un análisis de los nodos con la herramienta
rqt_graph.
Ejercicio 1
Podemos observar como el nodo Nod1ejer1 publica sus mensajes al topic1, seguidamente el
nodo Nod2ejer1 escucha los mensajes ya que está suscrito al topic1. Nod2ejer1 también publica
sus mensajes al topic2 y Nod3ejer1 está suscrito al topic2.
Ejercicio 2
Nod1ejer2 publica sus mensajes a topic y Nod2ejer2 está suscrito a los mensajes de topic.
Ejercicio 3
Para este ejercicio el nodo se ejecuta como un servicio, observamos que no se hace uso de
suscriptores, publicadores o tópicos, solo hacemos llamado del nodo servidor en otro nodo
cliente.
Ejercicio 4
El nodo joy_node publica sus mensajes al tópico Joy, el nodo Joy está suscripto al tópico Joy y
el nodo Joy publica sus mensajes al tópico turtle1/cmd_vel, donde el nodo turtlesim esta
suscrito al tópico turtle1/cmd_vel.
2) Dar un ejemplo práctico del uso de cada una de las herramientas mensajes y servicios.
Ejemplo mensajes:
Se tienen tres nodos, el primero nodo entrega información del sensor de proximidad de un robot
que se acerca a un obstáculo, el segundo nodo recibe esta información y la procesa para hacer el
cálculo de qué tan cerca está el robot del obstáculo y toma decisión de si frenar el robot o
hacerlo girar en otra dirección, además pública dependiendo de la decisión tomada información
acerca de si detener el motor del robot o darle giro en otra dirección. El tercer nodo recibe la
información del segundo nodo y la aplica al motor directamente.
Ejemplo servidor:
Transportar datos desde un robot hacia un computador remoto.
Mensajes
Admiten diferentes tipos de datos como enteros, punto flotante, booleano, matrices y
estructuras, lo que permite una comunicación muy flexible, pero su transporte unidireccional de
muchos a muchos no es apropiado para las interacciones de solicitud / respuesta de RPC, que a
menudo se requieren en un sistema distribuido[4].
Servicios
Un cliente puede realizar una conexión persistente a un servicio, lo que permite un mayor
rendimiento a costa de una menor solidez a los cambios de proveedor de servicios[4].
5) Mejorar el código del nodo Joy del Joystics para del turtlesim para dar un movimiento más
fluido y veloz.
La única mejora que logramos en el código fue en el aumento de la velocidad de la tortuga, el
cual se consigue agregando un factor multiplicador en las líneas 12 y 13.
6. CONCLUSIONES
- El uso de nodos permite una programación más modular de los robots permitiendo en
caso de errores poderlos encontrar más fácilmente, analizando cada nodo.
- Se dio un mayor entendimiento en el funcionamiento de los mensajes entre los nodos, lo
que hacen para comunicarse es que inicialmente hay un nodo que publica sus mensajes a
un topic, y para que otro nodo lea estos mensajes este debe suscribirse al mismo topic.
Además un mismo nodo puede tanto publicar como suscribirse.
- Para ejecución de las aplicaciones con nodos en ROS siempre debemos ejecutar un nodo
maestro(comando roscore), este permite a los nodos en ROS localizarse unos a otros ya
que este nodo registra todos los nodos, servicios y topics que se encuentran en
ejecución.
- Una de las principales ventajas de ROS radica en que proporciona
funcionalidad para abstracción de hardware, controladores de dispositivo,
comunicación entre procesos en máquinas múltiples, herramientas para
pruebas y visualización. A nivel industrial esto es demasiado útil y puede
contribuir a mejorar los tiempos de ejecución de los procesos y aumentar la
productividad.
7. REFERENCIAS
[1] “ROS - ¿Un sistema operativo diseñado para robots?” Tomado de : http://www.autracen.com/ros/
joy.py
#!/usr/bin/env python
import rospy
from sensor_msgs.msg import Joy
from geometry_msgs.msg import Twist
#from functool import partial
def callback(data):
global pub
print data.axes
vel=4
msg = Twist()
msg.linear.x = data.axes[1]*vel
msg.angular.z = data.axes[0]*vel
pub.publish(msg)
def function():
global pub
rospy.init_node('Joy', anonymous=True)
pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)
rospy.Subscriber('joy', Joy, callback)
rospy.spin()
print "---0----"
if __name__ =="__main__":
try:
function()
except rospy.ROSInterruptException:
pass
Nod1ejer1.py
#!/usr/bin/env python
import rospy
from random import randint
from lab2.msg import Ejer1
def function():
if __name__ =="__main__":
try:
function()
except rospy.ROSInterruptException:
pass
Nod2ejer1.py
#!/usr/bin/env python
import rospy
from lab2.msg import Ejer1
def callback(data):
global pub
vec = []
for x in data.ran:
vec.append(x*x)
print vec
pub.publish(vec)
def function():
global pub
rospy.init_node('Nod2ejer1', anonymous=True)
rospy.Subscriber('topic1', Ejer1, callback)
pub = rospy.Publisher('topic2', Ejer1, queue_size=10)
rospy.spin()
if __name__ =="__main__":
try:
function()
except rospy.ROSInterruptException:
pass
Nod3ejer1.py
#!/usr/bin/env python
import rospy
from lab2.msg import Ejer1
def callback(msg):
suma = 0
for x in msg.ran:
suma=suma+x
print "suma total:", str(suma)
def function():
rospy.init_node('nod3ejer1', anonymous=True)
rospy.Subscriber('topic2', Ejer1, callback)
rospy.spin()
if __name__ =="__main__":
try:
function()
except rospy.ROSInterruptException:
pass
Nod1ejer2.py
#!/usr/bin/env python
import rospy
from lab2.msg import Ejer2
def function():
if __name__ =="__main__":
try:
function()
except rospy.ROSInterruptException:
pass
Nod2ejer2.py
#!/usr/bin/env python
import rospy
from lab2.msg import Ejer2
global cont
cont=1
def callback(data):
global cont
print "estudiante No. %s" %cont
print "Nombre: %s" %data.nombre
print "Apellido: %s" %data.apellido
print "Edad: %s" %data.edad
print "%s le guste la robotica" %data.robotica
print "%s le guste ROS" %data.ros
f = open ("Archivo.txt", "a")
f.write("Estudiante No. %s" %cont +'\n')
f.write("Nombre: %s " %data.nombre +'\n')
f.write("Apellidos: %s " %data.apellido +'\n')
f.write("Edad: %s " %data.edad +'\n')
f.write("Le gusta la robotica: %s " %data.robotica +'\n')
f.write("Le gusta ROS: %s" %data.ros +'\n')
f.close()
cont= cont +1
def function():
rospy.init_node('nod2ejer2', anonymous=True)
rospy.Subscriber('topic', Ejer2, callback)
rospy.spin()
if __name__ =="__main__":
function()
node_service_cliente.py
#!/usr/bin/env python
# encoding: utf-8
import rospy
from lab2.srv import SumaTwoInts
node_service_server.py
#!/usr/bin/env python
# encoding: utf-8
import rospy
from lab2.srv import SumaTwoInts, SumaTwoIntsResponse #Importamos módulos
generados por nuestro servicio
if __name__ == "__main__":
try:
nodo() # Llamamos a la función nodo
except rospy.ROSInterruptException: #Check si hay una excepción Ctrl-C para
terminar la ejecución del nodo
pass