编写简单的发布者和订阅者(C++)---ROS学习第9篇
文章目录
- 1.编写发布者节点
- 2. 编写订阅者节点
- 3.构建节点
- 4.运行节点
1.编写发布者节点
在之前创建的study/src目录下创建talker.cpp文件并粘贴以下内容进去
#include "ros/ros.h"
#include "std_msgs/String.h"#include <sstream>/*** This tutorial demonstrates simple sending of messages over the ROS system.*/
int main(int argc, char **argv)
{/*** The ros::init() function needs to see argc and argv so that it can perform* any ROS arguments and name remapping that were provided at the command line.* For programmatic remappings you can use a different version of init() which takes* remappings directly, but for most command-line programs, passing argc and argv is* the easiest way to do it. The third argument to init() is the name of the node.** You must call one of the versions of ros::init() before using any other* part of the ROS system.*/ros::init(argc, argv, "talker");/*** NodeHandle is the main access point to communications with the ROS system.* The first NodeHandle constructed will fully initialize this node, and the last* NodeHandle destructed will close down the node.*/ros::NodeHandle n;/*** The advertise() function is how you tell ROS that you want to* publish on a given topic name. This invokes a call to the ROS* master node, which keeps a registry of who is publishing and who* is subscribing. After this advertise() call is made, the master* node will notify anyone who is trying to subscribe to this topic name,* and they will in turn negotiate a peer-to-peer connection with this* node. advertise() returns a Publisher object which allows you to* publish messages on that topic through a call to publish(). Once* all copies of the returned Publisher object are destroyed, the topic* will be automatically unadvertised.** The second parameter to advertise() is the size of the message queue* used for publishing messages. If messages are published more quickly* than we can send them, the number here specifies how many messages to* buffer up before throwing some away.*/ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);ros::Rate loop_rate(10);/*** A count of how many messages we have sent. This is used to create* a unique string for each message.*/int count = 0;while (ros::ok()){/*** This is a message object. You stuff it with data, and then publish it.*/std_msgs::String msg;std::stringstream ss;ss << "hello world " << count;msg.data = ss.str();ROS_INFO("%s", msg.data.c_str());/*** The publish() function is how you send messages. The parameter* is the message object. The type of this object must agree with the type* given as a template parameter to the advertise<>() call, as was done* in the constructor above.*/chatter_pub.publish(msg);ros::spinOnce();loop_rate.sleep();++count;}return 0;
}
这部分代码的解读,可参考:添加链接描述
2. 编写订阅者节点
在src目录下创建listener.cpp文件并粘贴以下内容进去:
#include "ros/ros.h"
#include "std_msgs/String.h"/*** This tutorial demonstrates simple receipt of messages over the ROS system.*/
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{ROS_INFO("I heard: [%s]", msg->data.c_str());
}int main(int argc, char **argv)
{/*** The ros::init() function needs to see argc and argv so that it can perform* any ROS arguments and name remapping that were provided at the command line.* For programmatic remappings you can use a different version of init() which takes* remappings directly, but for most command-line programs, passing argc and argv is* the easiest way to do it. The third argument to init() is the name of the node.** You must call one of the versions of ros::init() before using any other* part of the ROS system.*/ros::init(argc, argv, "listener");/*** NodeHandle is the main access point to communications with the ROS system.* The first NodeHandle constructed will fully initialize this node, and the last* NodeHandle destructed will close down the node.*/ros::NodeHandle n;/*** The subscribe() call is how you tell ROS that you want to receive messages* on a given topic. This invokes a call to the ROS* master node, which keeps a registry of who is publishing and who* is subscribing. Messages are passed to a callback function, here* called chatterCallback. subscribe() returns a Subscriber object that you* must hold on to until you want to unsubscribe. When all copies of the Subscriber* object go out of scope, this callback will automatically be unsubscribed from* this topic.** The second parameter to the subscribe() function is the size of the message* queue. If messages are arriving faster than they are being processed, this* is the number of messages that will be buffered up before beginning to throw* away the oldest ones.*/ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);/*** ros::spin() will enter a loop, pumping callbacks. With this version, all* callbacks will be called from within this thread (the main one). ros::spin()* will exit when Ctrl-C is pressed, or the node is shutdown by the master.*/ros::spin();return 0;
}
3.构建节点
前面的介绍使用了catkin_create_pkg,它创建了一个和一个package.xml和CMakeLists.txt文件。只需将这几行添加到CMakeLists.txt文件的底部:
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker study_generate_messages_cpp)add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener study_generate_messages_cpp)
这将创建两个可执行文件talker和listener,默认情况下,它们将被放到软件包目录下的devel空间中,即~/catkin_ws/devel/lib/。
现在可以运行catkin_make:
# 在你的catkin工作空间下
$ cd ~/catkin_ws
$ catkin_make
4.运行节点
打开一个终端,运行roscore;
再打开一个新的终端,运行接收节点:rosrun study listener
再打开一个新的终端,运行发布节点:rosrun study talker
再打开一个新的终端,运行rqt_graph,可以看到:
编写简单的发布者和订阅者(C++)---ROS学习第9篇相关推荐
- ROS学习——2编写简单的发布者和订阅者
ros官网教程:编写简单的发布者和订阅者 目录 c++版 python版 注意 c++版 在新建好的catkin_ws工作空间下建立. cd catkin_ws/src 在该目录下创建自己的功能包:c ...
- ROS-WIKI——编写简单的发布者和订阅者(C++和Python版本)
参考:ROS Tutorials C++ 1.编写发布者节点 2.编写订阅者节点 3.CMakeLists.txt Python 1.编写发布者节点 2.编写订阅者节点
- ros如何编译python文件_Python为ROS编写一个简单的发布者和订阅者
Python为ROS编写一个简单的发布者和订阅者 1.创建工作空间 1.1建立文件夹hello_rospy,再在该目录下建立子目录src,并创建工作空间 mkdir -p ~/hello_rospy/ ...
- 编写简单的服务和客户端(C++)---ROS学习第10篇
文章目录 1. 编写服务节点 2. 编写客户端节点 3. 构建节点 4. 运行可执行文件 1. 编写服务节点 这里,我们将创建简单的服务(Service)节点add_two_ints_server,该 ...
- 2021-08-09-ROS学习-消息创建,发布者和订阅者实现及测试
2.ROS中创建msg 在软件包里定义一个新的消息 $ roscd beginner_tutorials $ mkdir msg $ echo "int64 num" > m ...
- ROS学习笔记-ROS订阅和发布节点
一个简单的ROS包,一个发布者,一个订阅者 刚开始学习ROS,参考网上的资料完成了测试节点的编写,记录一下. 个人习惯在home/Develop目录中做开发,于是在Develop目录下面创建了一个RO ...
- ROS 创建msg和srv 编写发布者和订阅者节点 编写服务端和客户端节点(python版本)
ROS 创建msg和srv 编写发布者和订阅者节点 编写服务端和客户端节点-python版本 rosed msg和srv 创建msg 使用rosmsg 创建srv 使用rossrv 重新make一下软 ...
- eventbus多个订阅_番石榴的EventBus –简单的发布者/订阅者
eventbus多个订阅 在查看Google的Guava库版本10的最新添加内容时,我注意到EventBus的添加. 这是发布-订阅样式消息传递系统的轻量级实现. 这类似于JMS提供的发布-订阅模型, ...
- 番石榴的EventBus –简单的发布者/订阅者
在查看Google的Guava Libraries 版本10的最新版本时,我注意到EventBus的添加. 这是发布-订阅样式消息传递系统的轻量级实现. 这类似于JMS提供的发布-订阅模型,但是消息保 ...
最新文章
- File,FileInputStream,FileReader,InputStreamReader,BufferReader 的区别使用
- LInux 下文件包的使用
- 祝贺本刊编委石勇教授入选2016年汤森路透全球高被引科学家
- 分布式SESSION一致性
- Dropping tests
- 启动、停止、重启 MySQL 常见的操作方法:
- python安装及运行环境_Python 安装及环境搭建
- android创建数据库封装,SQLiteUtils
- python创建数据集_python 生成环形人工数据集
- 104种木马手工清除方法
- linux系统工具栏调整,Ubuntu 7.10任务栏不见了的解决办法
- 9.2 iptables主机防火墙
- win安装android系统,电脑可以装安卓系统啦!windows 安卓双系统安装详细教程
- python——获取矩形四个角点的坐标
- 德国互联网现状,缺人,4万元每月的收入,可以考虑移民了
- 拥有一本CISP证书,我的工资会翻倍吗?
- vue的生命周期函数
- 机械革命蛟龙p一堆小问题
- 【人因工程】熵值法求权重正反向化的分析
- 【问题收集】slam中常见make问题错误 相关总结
热门文章
- zblog php标签,201502200101 zblogphp调整“显示常用标签”个数方法
- 以太坊 node data write error_以太坊的新时代将要到来,DeFi会是最大的收益吗?
- 如何编写php解析器_用于PHP的HL7解析器/编写器
- mysql8中怎么增删一列_关于MySQL的增删改查知识
- webstorm配置环境变量_webstorm中配置nodejs环境及npm步骤详细解说
- 国内pinterest发展介绍------瀑布流效果
- Android反编译
- Premiere Pro CS4软件安装教程
- vue xlsx 导入导出_只需三步vue实现excel文件数据提取并存为json数据
- 利用计算机进行自动控制 控制对象主要指,计算机试卷10