文章目录

  • 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篇相关推荐

  1. ROS学习——2编写简单的发布者和订阅者

    ros官网教程:编写简单的发布者和订阅者 目录 c++版 python版 注意 c++版 在新建好的catkin_ws工作空间下建立. cd catkin_ws/src 在该目录下创建自己的功能包:c ...

  2. ROS-WIKI——编写简单的发布者和订阅者(C++和Python版本)

    参考:ROS Tutorials C++ 1.编写发布者节点 2.编写订阅者节点 3.CMakeLists.txt Python 1.编写发布者节点 2.编写订阅者节点

  3. ros如何编译python文件_Python为ROS编写一个简单的发布者和订阅者

    Python为ROS编写一个简单的发布者和订阅者 1.创建工作空间 1.1建立文件夹hello_rospy,再在该目录下建立子目录src,并创建工作空间 mkdir -p ~/hello_rospy/ ...

  4. 编写简单的服务和客户端(C++)---ROS学习第10篇

    文章目录 1. 编写服务节点 2. 编写客户端节点 3. 构建节点 4. 运行可执行文件 1. 编写服务节点 这里,我们将创建简单的服务(Service)节点add_two_ints_server,该 ...

  5. 2021-08-09-ROS学习-消息创建,发布者和订阅者实现及测试

    2.ROS中创建msg 在软件包里定义一个新的消息 $ roscd beginner_tutorials $ mkdir msg $ echo "int64 num" > m ...

  6. ROS学习笔记-ROS订阅和发布节点

    一个简单的ROS包,一个发布者,一个订阅者 刚开始学习ROS,参考网上的资料完成了测试节点的编写,记录一下. 个人习惯在home/Develop目录中做开发,于是在Develop目录下面创建了一个RO ...

  7. ROS 创建msg和srv 编写发布者和订阅者节点 编写服务端和客户端节点(python版本)

    ROS 创建msg和srv 编写发布者和订阅者节点 编写服务端和客户端节点-python版本 rosed msg和srv 创建msg 使用rosmsg 创建srv 使用rossrv 重新make一下软 ...

  8. eventbus多个订阅_番石榴的EventBus –简单的发布者/订阅者

    eventbus多个订阅 在查看Google的Guava库版本10的最新添加内容时,我注意到EventBus的添加. 这是发布-订阅样式消息传递系统的轻量级实现. 这类似于JMS提供的发布-订阅模型, ...

  9. 番石榴的EventBus –简单的发布者/订阅者

    在查看Google的Guava Libraries 版本10的最新版本时,我注意到EventBus的添加. 这是发布-订阅样式消息传递系统的轻量级实现. 这类似于JMS提供的发布-订阅模型,但是消息保 ...

最新文章

  1. File,FileInputStream,FileReader,InputStreamReader,BufferReader 的区别使用
  2. LInux 下文件包的使用
  3. 祝贺本刊编委石勇教授入选2016年汤森路透全球高被引科学家
  4. 分布式SESSION一致性
  5. Dropping tests
  6. 启动、停止、重启 MySQL 常见的操作方法:
  7. python安装及运行环境_Python 安装及环境搭建
  8. android创建数据库封装,SQLiteUtils
  9. python创建数据集_python 生成环形人工数据集
  10. 104种木马手工清除方法
  11. linux系统工具栏调整,Ubuntu 7.10任务栏不见了的解决办法
  12. 9.2 iptables主机防火墙
  13. win安装android系统,电脑可以装安卓系统啦!windows 安卓双系统安装详细教程
  14. python——获取矩形四个角点的坐标
  15. 德国互联网现状,缺人,4万元每月的收入,可以考虑移民了
  16. 拥有一本CISP证书,我的工资会翻倍吗?
  17. vue的生命周期函数
  18. 机械革命蛟龙p一堆小问题
  19. 【人因工程】熵值法求权重正反向化的分析
  20. 【问题收集】slam中常见make问题错误 相关总结

热门文章

  1. zblog php标签,201502200101 zblogphp调整“显示常用标签”个数方法
  2. 以太坊 node data write error_以太坊的新时代将要到来,DeFi会是最大的收益吗?
  3. 如何编写php解析器_用于PHP的HL7解析器/编写器
  4. mysql8中怎么增删一列_关于MySQL的增删改查知识
  5. webstorm配置环境变量_webstorm中配置nodejs环境及npm步骤详细解说
  6. 国内pinterest发展介绍------瀑布流效果
  7. Android反编译
  8. Premiere Pro CS4软件安装教程
  9. vue xlsx 导入导出_只需三步vue实现excel文件数据提取并存为json数据
  10. 利用计算机进行自动控制 控制对象主要指,计算机试卷10