一、Publisher节点
“节点” 是一个连接着ROS框架的可执行文件,这里我们用C++写一个publisher节点 (命名为”talker”) ,不断地发布一条信息。
首先进入包目录的src文件夹:
roscd beginner_tutorials
cd src
然后创建一个名为'talker.cpp'
的文件,内容为:
/*
"ros/ros.h"里面包含了ROS系统内最常用的一些头文件,包含此文件,便可以使用ROS的核心功能。
*/
#include "ros/ros.h"
/*
"std_msgs/String"是由std_msgs包自动生成的头文件,定义了String信息类型,包含此文件,我们就可以使用String类型
*/
#include "std_msgs/String.h"
#include <sstream>
/**
* This tutorial demonstrates simple sending of messages over the ROS system.
*/
int main(int argc, char **argv)
{
/**
* ros::init()函数需要两个系统命令行参数argc和argv,
* 由此可以执行命令行传来的任何ROS参数和节点的重命名
* 第三个参数是节点的名字,
* 注意这里只能使用基本命名,
* 即名字里不能含有'/'
* 在使用ROS的其他部分之前,你必须调用ros::init()
**/
ros::init(argc, argv, "talker");
/**
* NodeHandle 是节点同ROS系统交流的主要接口
* NodeHandle 在构造的时候会完整地初始化本节点
* NodeHandle 析构的时候会关闭此节点
*/
ros::NodeHandle n;
/**
* 我们通过advertise() 函数指定我们如何在给定的topic上发布信息
* 它会触发对ROS master的调用,master会记录话题发布者和订阅者
* 在advertise()函数执行之后,master会通知每一个订阅此话题的节点
* 两节点间由此可以建立直接的联系
* advertise()会返回一个Publisher对象,使用这个对象的publish方法我们就可以在此话题上发布信息
* 当返回的Publisher对象的所有引用都被销毁的时候,本节点将不再是该话题的发布者
* 此函数是一个带模板的函数,需要传入具体的类型进行实例化
* 传入的类型就是要发布的信息的类型,在这里是String
* 第一个参数是话题名称
* 第二个参数是信息队列的长度,相当于信息的一个缓冲区
* 在我们发布信息的速度大于处理信息的速度时
* 信息会被缓存在先进先出的信息队列里
*/
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
/**
* Rate loop_rate()构造了一个Rate类的对象
* 用来指定我们发布信息的频率,单位为hz,即每秒多少次
* 在我们调用Rate对象的sleep()方法之前,信息发布的频率不会发生变化
**/
ros::Rate loop_rate(10);
/**
* 一个记录我们发布的信息数量的计数器
* 它用来为每条信息产生不一样的字符串
* 如'1 message','2 message'这样
*/