Notes d'étude ROS 5 (implémentation de programmation de Publisher Publisher)

Modèle de sujet

L'image ci-dessous est tirée de Gu Yue "Introduction aux conférences ROS 21"
Insérez la description de l'image ici

Prenons l'exemple de Little Turtle. Deux nœuds sont gérés via ROS Master. L'abonné est le nœud du simulateur Turtlesim, et l'éditeur est le nœud de l'éditeur. Grâce au sujet de type / turtle1 / cmd_vel, l'éditeur et l'abonné communiquent entre eux pour atteindre l'objectif Le but de contrôler les tortues.

Créer un pack de fonctionnalités

Insérez la description de l'image iciLe nom du package de fonctions est learning_topic et les dépendances ajoutées sont roscpp rospy std_msgs geometry_msgs turtlesim.

Créer un fichier C ++ Publisher

Utilisez la commande touch pour créer un fichier .cpp dans le dossier src du package de fonctions learning_topic.
Insérez la description de l'image ici

Introduisez le fichier d'en-tête

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

Initialisation du nœud ROS

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

Créer une poignée de nœud

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

Créer un éditeur

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

Régler la fréquence du cycle

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

Empaqueter les données et les publier

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();
}

Code complet

/**
 * 该例程将发布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;
    
}

Peignage de processus

  • Initialiser le nœud ROS
  • Enregistrer les informations de nœud avec ROS Master, y compris le nom de la rubrique publiée et le type de message dans la rubrique
  • Créer des données de message
  • Diffuser les informations à une certaine fréquence

Configurer les règles de compilation du code éditeur

Comment configurer les règles de compilation dans CMakeLists.txt

  • Définissez le code à compiler et le fichier exécutable généré
  • Configurer la bibliothèque de liens
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher${catkin_LIBRARIES})
  • add_executable est utilisé pour décrire quel fichier programme est compilé dans quel fichier exécutable, c'est-à-dire que le fichier src / velocity_publisher.cpp est compilé dans un fichier exécutable velocity_publisher
  • target_link_libraries est utilisé pour lier nos fichiers exécutables avec les bibliothèques liées à ROS

Compilez et exécutez l'éditeur

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

Les résultats sont les suivants:
Insérez la description de l'image ici

Code d'implémentation 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


Lorsque vous exécutez des fichiers Python dans ROS, vous devez faire attention aux autorisations de fichier.
Comme le montre la figure: les
Insérez la description de l'image ici
fichiers Python n'ont pas besoin d'être compilés et utilisés directement

$ rosrun learning_topic velocity_publisher.py

Courir.

Une partie du code de cet article provient de Gu Yue "21 Lectures on ROS Introduction"

Lien précédent

L'étude ROS en note quatre (création d'espaces de travail et de packages fonctionnels) L'
étude ROS en note trois (utilisation des outils de ligne de commande ROS) L'
étude ROS en note deux (les concepts de base de ROS ) L'
étude ROS note un (fonctionnement de base du système Linux)

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44911075/article/details/114178580
conseillé
Classement