Notas de estudio ROS 5 (implementación de programación de Publisher Publisher)

Modelo de tema

La siguiente imagen es de Gu Yue "Introducción a las conferencias ROS 21"
Inserte la descripción de la imagen aquí

Tome Little Turtle como ejemplo. Dos nodos se administran a través de ROS Master. El suscriptor es el nodo del simulador de Turtlesim y el editor es el nodo editor. A través del tema de tipo / turtle1 / cmd_vel, el editor y el suscriptor se comunican entre sí para lograr El propósito de controlar las tortugas.

Crear paquete de funciones

Inserte la descripción de la imagen aquíEl nombre del paquete de funciones es learning_topic y las dependencias agregadas son roscpp rospy std_msgs geometry_msgs turtlesim.

Crear archivo Publisher C ++

Utilice el comando touch para crear un archivo .cpp en la carpeta src del paquete de funciones learning_topic.
Inserte la descripción de la imagen aquí

Introduce el archivo de encabezado

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
//包含ros api文件
//包含Twist定义消息

Inicialización del nodo ROS

//ROS节点初始化
ros::init(argc, argv, "velocity_publisher");

Crear identificador de nodo

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

Crear editor

//创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度为10
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);

Establecer la frecuencia del ciclo

//设置循环的频率
ros::Rate loop_rate(10);

Empaquetar datos y publicar

int count = 0;
while (ros::ok())
{
    
    
    //初始化geometry_msgs::Twist类型的消息
    geometry_msgs::Twist vel_msg;
    vel_msg.linear.x = 0.5;
    vel_msg.angular.z = 0.2;
    	
    //发布消息
    turtle_vel_pub.publish(vel_msg);
    ROS_INFO("Publish turtle velocity command[%0.2f m/s, %0.2f raf/s]", vel_msg.linear.x, vel_msg.angular.z);
    	
    //按循环频率延时
    loop_rate.sleep();
}

Código completo

/**
 * 该例程将发布turtle1/cmd_vel话题,消息类型为geometry_msgs::Twist
 */

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
//包含ros api文件
//包含Twist定义消息

int main(int argc, char **argv)
{
    
    
    //ROS节点初始化
    ros::init(argc, argv, "velocity_publisher");
    
    //创建节点句柄
    ros::NodeHandle n;
    
    //创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度为10
    ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
    
    //设置循环的频率
    ros::Rate loop_rate(10);
    
    int count = 0;
    while (ros::ok())
    {
    
    
    	//初始化geometry_msgs::Twist类型的消息
    	geometry_msgs::Twist vel_msg;
    	vel_msg.linear.x = 0.5;
    	vel_msg.angular.z = 0.2;
    	
    	//发布消息
    	turtle_vel_pub.publish(vel_msg);
    	ROS_INFO("Publish turtle velocity command[%0.2f m/s, %0.2f raf/s]", vel_msg.linear.x, vel_msg.angular.z);
    	
    	//按循环频率延时
    	loop_rate.sleep();
    }
    
    return 0;
    
}

Proceso de peinado

  • Inicializar el nodo ROS
  • Registre la información del nodo con ROS Master, incluido el nombre del tema publicado y el tipo de mensaje en el tema.
  • Crear datos de mensajes
  • Circula las noticias con una determinada frecuencia.

Configurar las reglas de compilación del código del editor

Cómo configurar reglas de compilación en CMakeLists.txt

  • Configure el código que se compilará y el archivo ejecutable generado
  • Configurar la biblioteca de enlaces
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher${catkin_LIBRARIES})
  • add_executable se usa para describir qué archivo de programa se compila en qué archivo ejecutable, es decir, el archivo src / velocity_publisher.cpp se compila en un archivo ejecutable velocity_publisher
  • target_link_libraries se utiliza para vincular nuestros archivos ejecutables con bibliotecas relacionadas con ROS

Compilar y ejecutar el editor

$ cd~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_topic velocity_publisher

Los resultados son los siguientes:
Inserte la descripción de la imagen aquí

Código de implementación de Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist

import rospy
from geometry_msgs.msg import Twist

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

	# 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
    turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)

	#设置循环的频率
    rate = rospy.Rate(10) 

    while not rospy.is_shutdown():
		# 初始化geometry_msgs::Twist类型的消息
        vel_msg = Twist()
        vel_msg.linear.x = 0.5
        vel_msg.angular.z = 0.2

		# 发布消息
        turtle_vel_pub.publish(vel_msg)
    	rospy.loginfo("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
				vel_msg.linear.x, vel_msg.angular.z)

		# 按照循环频率延时
        rate.sleep()

if __name__ == '__main__':
    try:
        velocity_publisher()
    except rospy.ROSInterruptException:
        pass


Al ejecutar archivos de Python en ROS, debe prestar atención a los permisos de archivo.
Como se muestra en la figura: los
Inserte la descripción de la imagen aquí
archivos de Python no necesitan compilarse y usarse directamente

$ rosrun learning_topic velocity_publisher.py

Correr.

Parte del código de este artículo proviene de Gu Yue "21 conferencias sobre la introducción de ROS"

Enlace anterior

Notas de estudio de ROS cuatro (creación de espacios de trabajo y paquetes funcionales)
Notas de estudio de ROS tres (uso de herramientas de línea de comandos de
ROS ) Notas de estudio de ROS dos (los conceptos centrales de ROS )
Notas de estudio de ROS uno (operación básica del sistema Linux)

Supongo que te gusta

Origin blog.csdn.net/weixin_44911075/article/details/114178580
Recomendado
Clasificación