En este artículo vamos a ver cómo dibujar un círculo usando Turtlesim en ROS-Python.
ROS significa Sistema Operativo de Robot. ROS es un conjunto de bibliotecas y herramientas que ayudan a crear aplicaciones robóticas. Es ampliamente utilizado en proyectos de robótica. ROS es un metasistema operativo de código abierto para robots. El software en el ecosistema ROS tiene herramientas tanto dependientes como independientes del idioma. ROS es compatible con Python, C++, Lisp y otros lenguajes.
rospy es una biblioteca de cliente Python pura ROS. Haremos uso de esta biblioteca para implementar nuestro código. Turtlesim es una herramienta común hecha específicamente para enseñar ROS y paquetes ROS.
La idea es importar Twist desde la biblioteca geometric_msgs.msg y asignar valores apropiados para los componentes de velocidad. Twist expresa la velocidad de la Turtle en el espacio 3D dividido en 3 componentes lineales y 3 componentes angulares. Turtle aquí es 2D y se rige por 1 componente lineal (componente x) y 1 componente angular (componente z). Esto se debe a que la Turtle no puede moverse en las direcciones y o z. Por eso. todos los demás componentes se igualan a 0.
Implementación paso a paso:
Paso 1: Primero, importa todos los paquetes usados en el programa. rospy es una biblioteca de ROS-python que contiene diferentes funciones como crear un Node, obtener tiempo, crear un editor, etc. La biblioteca geometric_msgs contiene una variable útil tipo Twist que se usa para describir la velocidad en 3D.
Python3
import rospy from geometry_msgs.msg import Twist import sys
Paso 2: A continuación, definimos nuestra función turtle_circle, dentro de la cual iniciamos nuestro Node turtlesim y nuestro editor. También especificamos una tasa igual a 10 Hz, es decir, el programa pasa por el bucle 10 veces por segundo. También se crea una variable Twist ‘vel’.
Python3
def turtle_circle(radius): rospy.init_node('turtlesim', anonymous=True) pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10) rate = rospy.Rate(10) vel = Twist()
Paso 3: ahora creamos un ciclo while que permite que la Turtle corra en círculos indefinidamente. Dentro del ciclo while, proporcionamos los componentes de velocidad de la Turtle de manera adecuada, como se discutió anteriormente en el enfoque, y luego los publicamos en la Turtle. También imprimimos el radio de cada bucle usando la función rospy.loginfo() . rate.sleep() se agrega al final. El objeto rate realiza un seguimiento del tiempo transcurrido desde que se ejecutó el último rate.sleep() y duerme durante la cantidad de tiempo correcta para mantener una frecuencia de 10 Hz.
Python3
rospy.loginfo("Radius = %f", radius) pub.publish(vel) rate.sleep()
Paso 4: finalmente, tenemos el bucle principal que llama a la función y maneja las excepciones, si las hay:
Python3
if __name__ == '__main__': try: turtle_circle(float(sys.argv[1])) except rospy.ROSInterruptException: pass
Pasos para la Ejecución del Turtlesim:
Inicie ROS en la terminal usando el comando:
$ roscore
Inicie el Node Turtlesim en una nueva terminal usando el comando:
$ rosrun turtlesim turtlesim_node
Ejecute el programa usando el siguiente comando:
$ rosrun my_package turtlesim.py 2.0
A continuación se muestra la implementación:
Python3
#!/usr/bin/env python # author : Sumanth Nethi import rospy from geometry_msgs.msg import Twist import sys def turtle_circle(radius): rospy.init_node('turtlesim', anonymous=True) pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10) rate = rospy.Rate(10) vel = Twist() while not rospy.is_shutdown(): vel.linear.x = radius vel.linear.y = 0 vel.linear.z = 0 vel.angular.x = 0 vel.angular.y = 0 vel.angular.z = 1 rospy.loginfo("Radius = %f", radius) pub.publish(vel) rate.sleep() if __name__ == '__main__': try: turtle_circle(float(sys.argv[1])) except rospy.ROSInterruptException: pass
Producción:
Publicación traducida automáticamente
Artículo escrito por nsumanth107 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA