ROS学习--(十二)编写一个简单的发布器(publisher)
2015-08-02 21:36
309 查看
1.
先在beginner_tutorials下创建一个src。 -p的意思是如果路径中有不存在的文件夹,则创建
2。在新建的文件夹里面新建cpp文件,talker.cpp,将一下内容复制进去。
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。
计算发布消息的次数,按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
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
相关文章推荐
- Java集合 -Collection
- 20150802
- Search Insert Position
- re模块常用函数
- FILE总结
- Dos命令查看端口占用及关闭进程
- 写在开始
- 编程能力与编程年龄
- iOS咱们一起学吧
- Sum Root to Leaf Numbers
- IOS NavigationBar 背景色
- 吐槽下 一个多月的实验
- 收集的55个Linux系统管理中常用的一些shell命令
- css系列-间隔与间距实例
- bower failed: UNABLE_TO_VERIFY_LEAF_SIGNATURE
- Category,protocol,Block总结对比
- esxi的时间同步问题
- 使用Jedis无法访问Redis的问题
- HDU1570水题
- 《C++游戏开发》笔记十二 战争迷雾:初步实现