ROS es la abreviatura de Robot Operating System Este artículo presenta la introducción del desarrollo de aplicaciones ROS, la programación de la transmisión y el monitoreo del sistema de coordenadas TF. Hay 2 tortugas en la simulación de la pequeña tortuga. El teclado controla la primera tortuga para moverse y ambas tortugas transmiten sus coordenadas. El monitor escucha las coordenadas de las dos tortugas, obtiene la posición relativa y controla a la segunda tortuga para que siga a la primera. El código es Python. La verificación de la prueba adopta el método roslaunch.
Creación de paquetes de proyectos
Este artículo es una continuación del artículo Programación de la transmisión y monitoreo del sistema de coordenadas tf en la introducción al desarrollo de la aplicación ROS Si ha realizado ese experimento, el paquete del proyecto se ha establecido, así que omita esta sección.
El espacio de trabajo de ROS se establece en el artículo Desarrollo de ROS y preparación de aplicaciones: crear un espacio de trabajo . Ahora, cree un paquete funcional:
cd ~ / catkin_ws / src
catkin_create_pkg learning_tf roscpp rospy tf turtlesim
La primera línea es para volver al directorio src del espacio de trabajo La creación del paquete de funciones debe ejecutarse en este directorio.
La segunda línea es el comando para crear el paquete de funciones, el primer parámetro es el nombre del paquete de funciones, aquí está learning_tf, y la siguiente es la biblioteca de dependencias del paquete de funciones, aquí hay un total de 4 bibliotecas de dependencias de roscpp rospy tf turtlesim.
Después de ejecutar el comando anterior, puede ver un directorio llamado learning_tf en el directorio src con el siguiente contenido:
CMakeLists.txt incluye package.xml src
Código de emisora
En el directorio del proyecto, que también es el directorio ~ / catkin_ws / src / learning_tf /, cree una nueva carpeta scripts y cree un archivo turtle_tf_broadcaster.py,
cd ~ // catkin_ws / src / learning_tf /
scripts mkdir
guiones de cd
nano turtle_tf_broadcaster.py
El contenido es:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import roslib
roslib.load_manifest('learning_tf')
import rospy
import tf
import turtlesim.msg
def handle_turtle_pose(msg, turtlename):
br = tf.TransformBroadcaster()
br.sendTransform((msg.x, msg.y, 0),
tf.transformations.quaternion_from_euler(0, 0, msg.theta),
rospy.Time.now(),
turtlename,
"world")
if __name__ == '__main__':
rospy.init_node('turtle_tf_broadcaster')
turtlename = rospy.get_param('~turtle')
rospy.Subscriber('/%s/pose' % turtlename,
turtlesim.msg.Pose,
handle_turtle_pose,
turtlename)
rospy.spin()
Primero defina una función de devolución de llamada, que incluye el establecimiento de una transmisión
El programa principal, primero define un nodo de suscriptor, establece la función de devolución de llamada
Una vez que se reciben los datos, llama a la función de devolución de llamada
Visita de contenido más detallado: http://wiki.ros.org/tf2/Tutorials/Writing%20a%20tf2%20broadcaster%20%28Python%29
Código de escucha
En el directorio de scripts del directorio del proyecto, que también es el directorio ~ / catkin_ws / src / learning_tf / scripts, cree un archivo turtle_tf_listener.py,
cd ~ // catkin_ws / src / learning_tf / scripts
nano turtle_tf_listener.py
El contenido es:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import roslib
roslib.load_manifest('learning_tf')
import rospy
import math
import tf
import geometry_msgs.msg
import turtlesim.srv
if __name__ == '__main__':
rospy.init_node('turtle_tf_listener')
listener = tf.TransformListener()
rospy.wait_for_service('spawn')
spawner = rospy.ServiceProxy('spawn', turtlesim.srv.Spawn)
spawner(4, 2, 0, 'turtle2')
turtle_vel = rospy.Publisher('turtle2/cmd_vel', geometry_msgs.msg.Twist,queue_size=1)
rate = rospy.Rate(10.0)
while not rospy.is_shutdown():
try:
(trans,rot) = listener.lookupTransform('/turtle2', '/turtle1', rospy.Time(0))
except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException):
continue
angular = 4 * math.atan2(trans[1], trans[0])
linear = 0.5 * math.sqrt(trans[0] ** 2 + trans[1] ** 2)
cmd = geometry_msgs.msg.Twist()
cmd.linear.x = linear
cmd.angular.z = angular
turtle_vel.publish(cmd)
rate.sleep()
El código se presenta en http://wiki.ros.org/tf/Tutorials/Writing%20a%20tf%20listener%20%28Python%29
lanzar archivo para iniciar la prueba
No es necesario compilar el código Python, pero debe configurarse como un archivo ejecutable
chmod + x * .py
Aquí usamos roslaunch para comenzar la prueba:
cd ~ // catkin_ws / src / learning_tf /
lanzamiento de mkdir
lanzamiento de cd
nano start_tf_demo_py.launch
<launch>
<!-- Turtlesim Node-->
<node pkg="turtlesim" type="turtlesim_node" name="sim"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>
<node name="turtle1_tf_broadcaster" pkg="learning_tf" type="turtle_tf_broadcaster.py">
<param name="turtle" type="string" value="turtle1" />
</node>
<node name="turtle2_tf_broadcaster" pkg="learning_tf" type="turtle_tf_broadcaster.py">
<param name="turtle" type="string" value="turtle2" />
</node>
<node pkg="learning_tf" type="turtle_tf_listener.py" name="listener" />
</launch>
Guardar y Salir
Inicie roslaunch con el siguiente comando
roslaunch start_tf_demo_py.launch
Este comando está en la carpeta donde se encuentra el lanzamiento; de lo contrario, se requiere el nombre de la ruta delante de él.
También puede comenzar con un paquete de proyecto:
roslaunch learning_tf start_tf_demo_py.launch
Vea la interfaz de la tortuga simulada, regrese a la terminal de inicio y use las teclas de flecha para controlar el movimiento de la primera tortuga, puede ver la segunda tortuga siguiente.
El efecto es el siguiente:
Eso es todo para la introducción.