Suscriptor de entrada de desarrollo de aplicaciones ROS Programación de subscribler

ROS es la abreviatura de Robot Operating System Este artículo presenta la introducción del desarrollo de aplicaciones ROS y la programación de suscriptores. El programa es muy simple, el código tiene solo unas pocas líneas, pero la información de coordenadas de movimiento de la tortuga simulada siempre se obtiene y se muestra. Primero el código C ++, luego el código Python, también puede elegir ver solo uno con el que esté familiarizado.

Este artículo es  una continuación del artículo Programación del  editor de desarrolladores de aplicaciones ROS Publisher . Por tanto, se supone que se ha creado el paquete del proyecto. Por supuesto, los dos también somos independientes el uno del otro. La información suscrita proviene de la tortuga simulada. Si no se ha creado el paquete del proyecto, utilice el comando que se crea a continuación, pero si se ha creado, no lo vuelva a crear.

cd ~ / catkin_ws / src

catkin_create_pkg tema_aprendizaje std_msgs roscpp rospy geometry_msgs turtlesim

La siguiente es una introducción directa a la programación de c ++ y python.

código fuente c ++

Cree un archivo pose_subscriber.cpp en el directorio src del paquete de ingeniería learning_topic, que también es el directorio ~ / catkin_ws / src / learning_topic / src,

cd ~ / catkin_ws / src / learning_topic / src

Nano pose_subscriber.cpp

El contenido es:

/**
 * 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
 */
 
#include <ros/ros.h>
#include "turtlesim/Pose.h"

// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
    // 将接收到的消息打印出来
    ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}

int main(int argc, char **argv)
{
    // 初始化ROS节点
    ros::init(argc, argv, "pose_subscriber");

    // 创建节点句柄
    ros::NodeHandle n;

    // 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
    ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);

    // 循环等待回调函数
    ros::spin();

    return 0;
}

Este código tiene anotaciones claras. Este es un proceso básico para implementar suscriptores:

Inicializar el nodo ROS

Crear identificador de nodo

 Cree un suscriptor, suscríbase al tema llamado / turtle1 / pose y registre la función de devolución de llamada poseCallback

Espere el mensaje del tema en un bucle e ingrese a la función de devolución de llamada después de recibir el mensaje

Función de devolución de llamada poseCallback (const turtlesim :: Pose :: ConstPtr & msg)

Simplemente muestra la posición de la pequeña tortuga.

Configurar el archivo cmake

En el directorio ~ / catkin_ws / src / learning_topic /, hay un archivo CMakeLists.txt, necesitamos modificar este archivo

cd ~ / catkin_ws / src / learning_topic /

nano CMakeLists.txt 

Agregue las siguientes 2 líneas a este archivo,

add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})

La ubicación agregada se refiere a la siguiente ubicación, que está al frente de ## install ##, y luego, después del editor anterior, agrega 2 líneas:

# target_link_libraries(${PROJECT_NAME}_node
#   ${catkin_LIBRARIES}
# )

add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})

add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})

#############
## Install ##
#############

 Guardar la salida

Esto completa la compilación y configuración.

Compila y ejecuta la prueba

La compilación debe volver al directorio ~ / catkin_ws

cd ~ / catkin_ws

catkin_make

Debe obtenerse una vez después de la compilación:

fuente devel / setup.bash

Si hay un error en la compilación, debe eliminar el error y luego ejecutar la prueba.

Abra una terminal, inicie ros, ejecute

roscore

Abre otra terminal y ejecuta la tortuga.

rosrun turtlesim turtlesim_node

Lo anterior es para iniciar el entorno de prueba.Si hay un problema, puede consultar:  La tortuga de simulación en ROS , pero el control del teclado no se inicia ahora.

Finalmente ejecutamos en nuestra terminal:

rosrun learning_topic pose_subscriber

En este momento, la terminal sigue mostrando, muchas líneas

[ INFO] [1615853945.863184221]: Turtle pose: x:7.222570, y:9.893890
[ INFO] [1615853945.879153450]: Turtle pose: x:7.222570, y:9.893890

Pero la pose de la tortuga: x: 7.222570, y: 9.893890 no cambió porque la pequeña tortuga no se movió.

Ahora abrimos otra terminal y ejecutamos:

rosrun turtlesim turtle_teleop_key

Luego, las teclas de flecha del teclado controlan el movimiento de la tortuguita y podemos ver los cambios de coordenadas.

Por supuesto, si realiza la programación del editor, también puede iniciar el editor y dejar que la tortuga se mueva.

La siguiente imagen se usa para iniciar el editor, mientras se controlan los botones, mientras se toma una captura de pantalla, no es fácil de operar

Este es el final de la programación en C ++.

código python 

Para no confundirnos con el código C ++, creamos el directorio de scripts, ahora ingresamos a este directorio y creamos un archivo pose_subscriber.py

cd ~ / catkin_ws / src / learning_topic / scripts

nano pose_subscriber.py

El contenido del archivo es:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose

import rospy
from turtlesim.msg import Pose

def poseCallback(msg):
    rospy.loginfo("Turtle pose: x:%0.6f, y:%0.6f", msg.x, msg.y)

def pose_subscriber():
	# ROS节点初始化
    rospy.init_node('pose_subscriber', anonymous=True)

	# 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
    rospy.Subscriber("/turtle1/pose", Pose, poseCallback)

	# 循环等待回调函数
    rospy.spin()

if __name__ == '__main__':
    pose_subscriber()

 

Aquí se definen dos funciones:

poseCallback es una función de devolución de llamada que muestra las coordenadas x, y

pose_subscriber () se llama directamente función principal es la función principal
    # inicialización del nodo ROS
    # crear un suscriptor, suscripción llamada / turtle1 / pose el tema, para registrar una función de devolución de llamada poseCallback
    # bucle esperando la función de devolución de llamada
parte es la función principal llama a la pose_subscriber más atrás ()

if __name__ == '__main__':
    pose_subscriber ()

Ejecutar prueba

Cambie pose_subscriber.py para tener atributos de ejecución 

chmod + x * .py

Esto se puede verificar con ls -l:

leon @ ubuntu: ~ / catkin_ws / src / learning_topic / scripts $ ls -l
total 8
-rwxrwxrwx 1 leon leon 824 8 de mayo de 2020 pose_subscriber.py
-rwxrwxrwx 1 leon leon 1275 8 de mayo de 2020 velocity_publisher.py
leon @ ubuntu: ~ / catkin_untu : ~ / catkin / src / learning_topic / scripts $ 
python no necesita ser compilado, se puede ejecutar directamente

rosrun learning_topic pose_subscriber.py

Pero antes de la ejecución, una terminal debe iniciar roscore, luego rosrun turtlesim turtlesim_node, y luego iniciar el comando anterior.

Para ver cambiar las coordenadas de la tortuga, también debe controlar el movimiento de la tortuga.

Abra otra terminal y ejecute:

rosrun turtlesim turtle_teleop_key

Luego, las teclas de flecha del teclado controlan el movimiento de la tortuguita y podemos ver los cambios de coordenadas.

Por supuesto, si realiza la programación del editor, también puede iniciar el editor y dejar que la tortuga se mueva.

Para ver la tabla de efectos en ejecución, consulte la tabla de resultados en ejecución de c ++, que en realidad es la tabla de resultados de la ejecución del programa Python.

Mostrar relación de flujo de información

Abra una nueva terminal e ingrese el comando:

rqt_graph

Puede ver el siguiente diagrama de relación de información:

La última parte de la información es el tema / tortuga / pose, que es el flujo de información entre el suscriptor y la tortuga simulada. 

Estos 2 códigos fuente también se pueden  descargar en  https://github.com/huchunxu/ros_21_tutorials

El texto completo se presenta aquí.

 

 

Supongo que te gusta

Origin blog.csdn.net/leon_zeng0/article/details/114866447
Recomendado
Clasificación