原文连接:链接

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐