您的位置:首页 > 其它

ROS学习--(十二)编写一个简单的发布器(publisher)

2015-08-02 21:36 309 查看
1.
mkdir -p ~/catkin_ws/src/beginner_tutorials/src


先在beginner_tutorials下创建一个src。 -p的意思是如果路径中有不存在的文件夹,则创建

2。在新建的文件夹里面新建cpp文件,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。#include “ros/ros.h”

是最常用的使用ros系统必须包含进去的头文件

2。#include “std_msgs/String.h”

另一个头文件,由String.msg自动生成。

3。 ros::init(argc, argv, “talker”);

在使用ROS 系统之前都必须先初始化。参数有三个,前两个必须是argc argv,第三个是节点名字。ros::init()可以通过命令行进行名字的重映射。

4。ros::NodeHandle n;

创建一个talker的句柄,创建的第一个还会初始化节点,最后一个销毁的会清除node使用的资源(这里还没见过有创建多个的,不知道这里的销毁是不是多个节点的最后一个。

5。ros::Publisher chatter_pub = n.advertise(“chatter”, 1000);

告诉master我们要在chatter话题上发布std_msgs/String的消息,然后master会告诉所有正在收听cahtter的节点我们要发布消息了。第二个参数是我们发布队列的大小,如果我们发消息太快,超过了1000条信息,缓冲区会把之前的消息扔掉。

NodeHandle::advertise()返回一个ros::Publisher对象,有一个成员函数publish()可以让我们在topic上发布消息,如果类型不对,拒绝发布(不太懂)

6。ros::Rate loop_rate(10);

ros::Rate对象允许我们指定循环的频率。记录距离上一次Rate::sleep()调用的时间,然后休眠正确的时间,比如这里是10Hz一次循环。

7。

int count = 0;
while (ros::ok())
{


计算发布消息的次数,按ctrl+c将ros::ok()置为false

还有下面情况ros::ok()也会为false

-被另一同名节点踢出ROS网络

-ros::shutdown()被程序的另一部分调用

-所有的ros::NodeHandles都已经被销毁

8。chatter_pub.publish(msg);

发布消息

9。ROS_INFO(“%s”, msg.data.c_str());

就是printf在ROS中的代替

10。ros::spinOnce();

使得回调函数(callback)能够被调用,加上最好

11。loop_rate.sleep()

通过sleep休眠来使得发布频率为10hz
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: