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