消息发布器和订阅器 (C++)
本博客总结绍如何用 C++ 编写消息发布器节点和订阅器节点。
1.编写发布器节点
节点(Node) 是指 ROS 网络中可执行文件。接下来,将会创建一个发布器节点(“talker”),它将不断的在 ROS 网络中广播消息。切换到之前创建的 beginner_tutorials package 路径:
$ cd ~/catkin_ws/src/beginner_tutorials
在 beginner_tutorials package 路径下创建一个src文件夹,这个文件夹将会用来放置 beginner_tutorials package 的所有源代码:
mkdir -p ~/catkin_ws/src/beginner_tutorials/src
1.1 src/talker.cpp代码
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv){
ros::init(argc, argv, "talker");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
1.2 代码解释说明
#include "ros/ros.h"
ros/ros.h 是一个实用的头文件,它引用了 ROS 系统中大部分常用的头文件。
#include "std_msgs/String.h"
引用了 std_msgs/String 消息, 它存放在 std_msgs package 里,是由 String.msg 文件自动生成的头文件。
ros::init(argc, argv, "talker");
初始化 ROS 。它允许 ROS 通过命令行进行名称重映射——然而这并不是现在讨论的重点。在这里,我们也可以指定节点的名称——运行过程中,节点的名称必须唯一。这里的名称必须是一个 base name ,也就是说,名称内不能包含 / 等符号。