ROS发布和订阅节点内容的C++程序模板,不用再一个个敲代码了。。。

mac2024-05-25  29

ROS发布和订阅节点内容的C++程序模板,不用再一个个敲代码了。。。

在这之前默认大家已经会编译包、编译节点和调用了哦

节点发布

#include "ros/ros.h" //包含了使用ROS节点的必要文件 #include "std_msgs/String.h" //包含了使用的数据类型,自己可以替换哦 #include <sstream> int main(int argc, char **argv) { ros::init(argc, argv, "node_a"); //初始化ROS,节点名命名为node_a,节点名必须保持唯一 ros::NodeHandle n; //实例化节点, 节点进程句柄 ros::Publisher pub = n.advertise<std_msgs::String>("str_message", 1000); //告诉系统要发布话题了,话题名为“str_message”,类型为std_msgs::String,缓冲队列为1000。 ros::Rate loop_rate(10); //设置发送数据的频率为10Hz //ros::ok()返回false会停止运行,进程终止。 while(ros::ok()) { std_msgs::String msg; std::stringstream ss; ss<<"Hello World"; msg.data = ss.str(); ROS_INFO("node_a is publishing %s", msg.data.c_str()); pub.publish(msg); //向话题“str_message”发布消息 ros::spinOnce(); //不是必须,若程序中订阅话题则必须,否则回调函数不起作用。 loop_rate.sleep(); //按前面设置的10Hz频率将程序挂起 } return 0; }

订阅节点

#include "ros/ros.h" #include "std_msgs/String.h" //话题回调函数 void chatterCallback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("node_b is receiving [%s]", msg->data.c_str()); } int main(int argc, char **argv) { ros::init(argc, argv, "node_b"); //初始化ROS,节点命名为node_b,节点名必须唯一。 ros::NodeHandle n; //节点句柄实例化 ros::Subscriber sub = n.subscribe("str_message", 1000, chatterCallback); /*向话题“str_message”订阅,一旦发布节点(node_a)在该话题上发布消息,本节点就会调用 chatterCallbck函数。*/ ros::spin(); //程序进入循环,直到ros::ok()返回false,进程结束。 return 0; }

 

最新回复(0)