Dibuja un círculo usando Turtlesim en ROS-Python

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *