Étapes pour publier et s'abonner à des sujets
Écrivez le fichier lidarpub.cpp pour publier des sujets
#include "ros/ros.h" //引入核心ROS库头文件
#include "std_msgs/String.h" //引入描述对象类型std_msgs::String的头文件
#include <sstream>
int main(int argc, char **argv)
//argc argument count 保存运行时传递给main函数的参数个数
//argv argument vector 保存运行时传递给main函数的参数
{
ros::init(argc, argv, "lidarpub"); //定义"lidarpub"节点名称
ros::NodeHandle n; //建立节点间的网络通信,通常用于初始化通信对象
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
//实例化名为chatter_pub的对象(名字自定),在名为chatter的话题上发布std_msgs::String类型的消息
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
std_msgs::String msg;
//创建了一个std_msgs::String类型对象,并命名为msg,相当于int i
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str(); //赋值
ROS_INFO("%s", msg.data.c_str()); //打印
chatter_pub.publish(msg); //将赋值后的数据发布到名为chatter的话题上,以供订阅
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
Configurer le fichier CMakeLists.txt
Les programmes de terrain suivants ont été automatiquement générés lors de l'exécution de la commande catkin_package_create :
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)
include_directories(
${catkin_INCLUDE_DIRS}
)
Vous devez également ajouter de nouveaux nœuds et bibliothèques de liens
include_directories(include ${catkin_INCLUDE_DIRS})
##发布器新节点
add_executable(lidarpub src/lidarpub.cpp)
target_link_libraries(lidarpub ${catkin_LIBRARIES})
##lidarpub生成的可执行文件自定义名字,这里定为与cpp文件同名
##src/lidarpub.cpp源代码的存放位置目录
##订阅器新节点(编写订阅程序后添加,这里暂时不必添加)
add_executable(lidarsub src/lidarsub.cpp)
target_link_libraries(lidarsub ${catkin_LIBRARIES})
Remarque : Après avoir configuré le fichier CMakeLists.txt, exécutez catkin_make pour compiler le nouveau code.
Exécuter le nœud éditeur
Exécutez l'instance roscore et démarrez le service principal
$ roscore
Démarrer un nouveau nœud éditeur (saisir depuis un nouveau terminal)
$ rosrun autorc lidarpub
Remarque : $ rosrun package_name (nom du package) executable_name (nom du fichier exécutable)
pour afficher les informations sur le sujet récemment publié (exécutez d'abord les deux premières étapes)
$ rostopic info chatter
Remarque : $rostopic info topic (nom du sujet)
imprime le message du sujet (exécutez d'abord les deux premières étapes)
$ rostopic echo chatter
Remarque : $rostopic echo topic (nom du sujet)
Planification des points temporels
Ajustez la fréquence de mise à jour des données de l'éditeur.
Ajoutez deux nouvelles lignes de code au fichier lidarpub.cpp.
ros::Rate naptime(1);
…
…
naptime.sleep();
Remarque : cela équivaut à ajouter un délai pour la boucle while, à appeler la fonction sleep() pour suspendre temporairement le nœud, puis à le démarrer après un délai de 1 s, réduisant ainsi le temps de consommation du processeur.
Modifiez le fichier lidarsub.cpp pour vous abonner aux sujets
#include "ros/ros.h"
#include "std_msgs/String.h"
//回调函数(当关联的话题中有新数据可用时,回调函数会被唤醒,同时已发布的数据会出现在参数msg中)
void chatterCallback(const std_msgs::String::ConstPtr& msg)
//msg为指向std_msgs::String类型对象的引用指针参数(由&符号标识),msg名字在发布器程序中自定义
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
//回调函数做的唯一的事情就是显示接收到的数据
int main(int argc, char **argv)
{
ros::init(argc, argv, "lidarsub");
//初始化,自定义订阅器节点名称lidarsub
ros::NodeHandle n;
ros::Subscriber chatter_sub = n.subscribe("chatter", 1000, chatterCallback);
// chatter订阅的话题名,由发布器命名并发布
//1000为队列大小。如果回调函数无法跟上发布数据的频率,数据就需要排队。队满,则队头消息被新消息覆盖而丢失
ros::spin();
//每当话题上有新消息时,回调函数就被唤醒。可以通过spin()命令让主程序挂起,为回调函数的响应提供一些时间。
return 0;
}
Ajouter une référence au nouveau nœud de l'abonné dans le fichier CMakeLists.txt
##订阅器新节点
add_executable(lidarsub src/lidarsub.cpp)
target_link_libraries(lidarsub ${catkin_LIBRARIES})
Une fois la configuration terminée, recompilez le package autorc
Exécutez le nœud d'abonné
Exécutez l'instance roscore et démarrez le service principal
$ roscore
Démarrer un nouveau nœud éditeur (saisir depuis un nouveau terminal)
$ rosrun autorc lidarpub
Démarrer un nouveau nœud d'abonné (entrer depuis un nouveau terminal)
$ rosrun autorc lidarsub
Générer un affichage graphique du système en cours d'exécution (saisir à partir d'un nouveau terminal)
$ rqt_graph