|
ROS节点间可通过发布订阅topic来实现通信,这其中便涉及到publisher节点与subscriber节点的编写:
1、publisher模板:
#include "ros/ros.h"//ROS程序必备的头文件
#include "std_msgs/String.h"//传递的消息类型
#include "sstream"
int main(int argc, char **argv) // 写ROS程序需要加argc,argv,因为init需要传这两个参数
{
ros::init(argc, argv, "talker");// 初始化ros,向master注册一个叫“talker”的节点
ros::NodeHandle n; // 初始化一个句柄,就是将ROS实例化
ros::Publisher chatter_pub = n.advertise<std_msgs::String>(&#34;chatter&#34;, 1000);
//发布者注册一个叫“chatter”的话题,<消息类型>,1000是消息队列大小
//消息队列相当于缓存消息,如果处理速度不够快的话消息会被保存在队列中
ros::Rate loop_rate(10); // 执行循环的速率,可以理解为发布消息的频率,单位是Hz
int count = 0;
while (ros::ok()) // ros::ok()函数用来判断master节点是否正常
{
std_msgs::String msg;//声明变量
std::stringstream ss;
ss << &#34;hello world &#34; << count;
msg.data = ss.str();
ROS_INFO(&#34;%s&#34;, msg.data.c_str());//ROS_INFO()可以在终端打印数据
chatter_pub.publish(msg); // 发布该消息
ros::spinOnce(); // 动作执行一次
//ros::spin()是循环执行,在没有while的时候使用
loop_rate.sleep(); // 相当于delay函数,因为程序可能不需要0.1s,就是10Hz的频率就可以发送完成,所以sleep()函数可以让程序暂停一会,让消息的发送频率符合10Hz
}
return 0;
}
2、subscriber模板:
#include &#34;ros/ros.h&#34;
#include &#34;std_msgs/String.h&#34;//要和订阅的消息类型所匹配
void chatterCallback(const std_msgs::String::ConstPtr& msg) // 回调函数
{
ROS_INFO(&#34;I heard: [%s]&#34;, msg->data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, &#34;listener&#34;); //初始化ros,向master注册一个叫“listener”的节点
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe(&#34;chatter&#34;, 1000, chatterCallback);
//订阅者向master注册自己需要订阅的话题&#34;chatter&#34;,消息队列大小是1000,chatterCallback是回调函数
//回调函数的意义是,当订阅者从自己所订阅的话题上接收到消息,回调函数自动执行
ros::spin();//因为不在while循环体中,所以它要不断执行,而不是用spinOnce(),只执行一次
return 0;
}
主要参考: |
|