L'étude ROS en note cinq
Modèle de sujet
L'image ci-dessous est tirée de Gu Yue "Introduction aux conférences ROS 21"
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
Le 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.
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:
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
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)