原文连接:链接
一、n.advertise<std_msgs::String>的含义
#include "ros/ros.h" //该头文件必须包含
#include "std_msgs/String.h" //ros标准消息里面的字符串消息
#include <sstream>
/**
* 在一个话题上发布一个简单的字符串消息
*/
int main(int argc, char *argv[])
{
/**
* ros::init()初始化节点函数需要使用argc和argv,不能缺少这两个参数,与话题重映射等有关的
*/
ros::init(argc, argv, "study"); //节点名为study,随便取
/**
*NodeHandle是与ROS系统通信的主要访问点(句柄),有了它节点就可以“说话了”(在话题上发布消息)
* 构造的第一个NodeHandle将完全初始化该节点,最后一个被析构的NodeHandle将关闭该节点。
*/
ros::NodeHandle n;
/**
* advertise()函数是你告诉ROS你想在给定的话题名上发布特定类型的消息。
* 在这个advertise()调用之后,master节点将通知任何试图订阅这个话题名称的节点,然后他们将与这个节点建立一个对等网络(peer to peer/P2P)连接。
* advertise()括号里面的第一个参数是话题名字,第二个参数是用于发布消息的消息队列的大小。
* <>里面指定消息的类型
*/
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
/**
* 循环频率10Hz
*/
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
/**
* 先创建一个消息对象。然后用数据填充它,最后发布它。
* 要查看消息结构在命令行使用rosmsg show std_msgs/String,其它消息类似
*/
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
/**
* 在终端打印字符串的内容,消息在ROS里面封装成类,类公有函数这些请去wiki上看API文档
*/
ROS_INFO("%s", msg.data.c_str());
/**
* publish()函数是发送消息的函数,参数是消息对象。
* 消息类型要与n.advertise<>里面声明的一致。
*/
chatter_pub.publish(msg);
ros::spinOnce();//触发回调函数的,不订阅消息的话可删
loop_rate.sleep();//以10Hz循环,循环跑太快就在这里睡一会儿
++count;
}
return 0;
}