在ros中函数advertise()的作用

本文详细介绍了如何在ROS(Robot Operating System)中使用C++编写一个简单的程序,通过NodeHandle在chatter话题上发布std_msgs::String类型的字符串消息,并展示了消息的创建、填充和发布的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文连接:链接

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

ROS中,使用C++编写的代码通过创建和运行ROS节点来起作用。一个ROS节点是一个独立的可执行程序,可以执行各种任务,例如控制机器人的运动、处理传感器数据、执行算法等等。 以下是使用ROS C++代码的一般流程: 1. 创建ROS节点:在C++代码中,你需要创建一个ROS节点。这可以通过使用`ros::init()`函数来完成,该函数负责初始化ROS系统。你需要指定节点名称,并且可以选择传递命令行参数。例如: ```cpp #include <ros/ros.h> int main(int argc, char** argv) { // 初始化ROS节点 ros::init(argc, argv, "my_node"); // 创建节点句柄 ros::NodeHandle nh; // 在这里编写你的代码 return 0; } ``` 2. 发布和订阅话题:在ROS中,节点通过发布和订阅话题进行信息交换。你可以使用ROS提供的`ros::Publisher`和`ros::Subscriber`类来创建发布者和订阅者。发布者将数据发送到特定的话题,而订阅者从话题接收数据。例如: ```cpp #include <ros/ros.h> #include <std_msgs/String.h> int main(int argc, char** argv) { ros::init(argc, argv, "my_node"); ros::NodeHandle nh; // 创建发布者 ros::Publisher pub = nh.advertise<std_msgs::String>("my_topic", 10); // 创建订阅者 ros::Subscriber sub = nh.subscribe("my_topic", 10, callback); // 在这里编写你的代码 return 0; } void callback(const std_msgs::String::ConstPtr& msg) { // 处理接收到的消息 } ``` 3. 运行节点:在终端中,使用`rosrun`命令来运行你的ROS节点。例如,如果你的节点名称是`my_node`,则可以执行以下命令: ``` $ rosrun <package_name> my_node ``` 其中`<package_name>`是你的ROS包的名称。 这只是ROS C++代码起作用的基本流程。你可以在节点中执行各种任务,还可以使用ROS提供的其他功能,如服务调用、参数服务器等。请参考ROS官方文档和教程,以获取更多详细的信息和示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值