ROS: Publisher and Subscriber

2023-05-16

通过上一节编写ROS的第一个程序hello_world,我们对ROS的整个编程开发过程有了基本的了解,现在我们就来编写真正意义上的使用ROS进行节点间通信的程序。由于之前已经建好了catkin_ws这样一个工作空间,以后开发的功能包都将放在这里面,这里给新建的功能包取名为topic_example,在这个功能包中分别编写两个节点程序publish_node.cpp和subscribe_node.cpp,发布节点(publish_node)向话题(chatter)发布std_msgs::String类型的消息,订阅节点(subscribe_node)从话题(chatter)订阅std_msgs::String类型的消息,这里消息传递的具体内容是一句问候语“how are you …”,通信网络结构如图。
在这里插入图片描述

(1)功能包的创建

在catkin_ws/src/目录下新建功能包topic_example,并在创建时显式的指明依赖roscpp和std_msgs。打开命令行终端,输入命令:

在这里插入图片描述

2)功能包的源代码编写

功能包中需要编写两个独立可执行的节点,一个节点用来发布消息,另一个节点用来订阅消息,所以需要在新建的功能包topic_example/src/目录下新建两个文件publish_node.cpp和subscribe_node.cpp,并将下面的代码分别填入。

首先,介绍发布节点publish_node.cpp,代码内容如下:
在这里插入图片描述
对发布节点代码进行解析。

#include “ros/ros.h”

这一句是包含头文件ros/ros.h,这是ROS提供的C++客户端库,是必须包含的头文件。

#include “std_msgs/String.h”

由于代码中需要使用ROS提供的标准消息类型std_msgs::String,所以需要包含此头文件。

ros::init(argc, argv, “publish_node”);

这一句是初始化ros节点并指明节点的名称,这里给节点取名为publish_node,一旦程序运行后就可以在ros的计算图中被注册为publish_node名称标识的节点。

ros::NodeHandle nh;

这一句是声明一个ros节点的句柄,初始化ros节点必须的。

ros::Publisher chatter_pub = nh.advertise<std_msgs::String>(“chatter”, 1000);

这句话告诉ros节点管理器我们将会在chatter这个话题上发布std_msgs::String类型的消息。这里的参数1000是表示发布序列的大小,如果消息发布的太快,缓冲区中的消息大于1000个的话就会开始丢弃先前发布的消息。

ros::Rate loop_rate(10);

这句话是用来指定自循环的频率,这里的参数10 表示10Hz频率,需要配合该对象的sleep()方法来使用。

while (ros::ok()) {…}

roscpp会默认安装以SIGINT句柄,这句话就是用来处理由ctrl+c键盘操作、该节点被另一同名节点踢出ROS网络、ros::shutdown()被程序在某个地方调用、所有ros::NodeHandle句柄都被销毁等触发而使ros::ok()返回false值的情况。

std_msgs::String msg;

定义了一个std_msgs::String消息类型的对象,该对象有一个数据成员data用于存放我们即将发布的数据。要发布出去的数据将被填充到这个对象的data成员中。

chatter_pub.publish(msg);

利用定义好的发布器对象将消息数据发布出去,这一句执行后,ROS网络中的其他节点便可以收到此消息中的数据。

ros::spinOnce();

这一句是让回调函数有机会被执行的声明,这个程序里面并没有回调函数,所以这一句可以不要,这里只是为了程序的完整规范性才放上来的。

loop_rate.sleep();

前面讲过,这一句是通过休眠来控制自循环的频率的。

接着,介绍订阅节点subscribe_node.cpp,代码内容如下:
在这里插入图片描述

对订阅节点代码进行解析。

之前解释过的类似的代码就不做过多的解释了,这里重点解释一下前面没遇到过的代码。

void chatterCallback(const std_msgs::String::ConstPtr& msg)

{

ROS_INFO(“I heard: [%s]”,msg->data.c_str());

}

这是一个回调函数,当有消息到达chatter话题时会自动被调用一次,这个回调函数里面就是一句话,用来打印从话题中订阅的消息数据。

ros::Subscriber chatter_sub = nh.subscribe(“chatter”, 1000,chatterCallback);

这句话告诉ros节点管理器我们将会从chatter这个话题中订阅消息,当有消息到达时会自动调用这里指定的chatterCallback回调函数。这里的参数1000是表示订阅序列的大小,如果消息处理的速度不够快,缓冲区中的消息大于1000个的话就会开始丢弃先前接收的消息。

ros::spin();

这一句话让程序进入自循环的挂起状态,从而让程序以最好的效率接收消息并调用回调函数。如果没有消息到达,这句话不会占用很多CPU资源,所以这句话可以放心使用。一旦ros::ok()被触发而返回false,ros::spin()的挂起状态将停止并自动跳出。简单点说,程序执行到这一句,就在这里不断自循环,与此同时检查是否有消息到达并决定是否调用回调函数。

(3)功能包的编译配置及编译

创建功能包topic_example时,显式的指明依赖roscpp和std_msgs,依赖会被默认写到功能包的CMakeLists.txt和package.xml中,所以只需要在CMakeLists.txt文件的末尾行加入以下几句用于声明可执行文件就可以了:

在这里插入图片描述
(4)功能包的启动运行

首先,需要用roscore命令来启动ROS节点管理器,ROS节点管理器是所有节点运行的基础。

打开命令行终端,输入命令:
在这里插入图片描述
看到有输出“how are you …”,就说明发布节点已经正常启动并开始不断向chatter话题发布消息数据,如图。
在这里插入图片描述

最后,用source devel/setup.bash激活catkin_ws工作空间,用rosrun <package_name> <node_name>启动功能包中的订阅节点。

再打开一个命令行终端,分别输入命令:

在这里插入图片描述
看到有输出“I heard:[how are you …]”,就说明订阅节点已经正常启动并开始不断从chatter话题接收消息数据,如图18。
在这里插入图片描述
到这里,我们编写的消息发布器和订阅器就大功告成了,为了加深对整个程序工作流程的理解,我再把消息发布与订阅的ROS通信网络结构图拿出来,加深一下理解。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS: Publisher and Subscriber 的相关文章

  • 思岚RPLIDAR A2 在ubuntu 16.04上的测试

    1 下载雷达ROS包 首先在github上下载rplidar的ros包 下载指令为 默认安装了git git clone https github com Slamtec rplidar ros git 在ubuntu上创建工作空间 并将该
  • ROS与navigation教程——ACML参数配置

  • 无人飞行器智能感知竞赛--模拟器安装

    开发环境 win11 wsl2 注意事项 请配合视频使用 如果不看视频会对下面的配置过程迷惑 因为一开始我是想安装在ubuntu18 04的 中途发现ubuntu18 04没有ros noetic 所以转入ubuntu20 04配置 视频链
  • ROS诸多调试工具总结1

    ROS有许多调试工具来为ROS调试你的工具 1 rosnode 参数 用法 作用 list rosnode list 查看当前运行了哪些节点 info rosnode info node name 查看该节点发布 接受哪些话题以及服务 ki
  • 无人驾驶论坛

    1 百度Apollo论坛 http www 51apollo com 2 人工智能中文资讯网 http www ailab cn
  • 关于相机与激光雷达数据采集与标定

    最近在做一个关于车路协同的项目 需要做一个路侧系统 传感器有摄像头和激光雷达 相机和激光雷达联合标定费了老半天劲 在此记录一下 雷达时间戳不对 导致摄像头和雷达的数据无法对齐 解决办法 修改雷达驱动发布点云消息时的时间戳 相机内参标定可以使
  • GG-CNN代码学习

    文章目录 1 源码网址 https github com dougsm ggcnn 2 数据集格式转化 下载后的康奈尔数据集 解压完之后里面的格式 里面的 tiff图像通过 txt文件转化得到 python m utils dataset
  • ROS rosdep update 出错方法 不需要翻墙切换之类的解决方法 ‘https://raw.githubusercontent.com/ros/rosdistro/master/inde

    系统 ubuntu18 rosdep update参考的这篇文章 https blog csdn net weixin 43311920 article details 114796748 utm source app app versio
  • 在Ubuntu 14.04.2 LTS上安装Qt

    Qt是一个跨平台的应用程序框架 广泛用于开发具有GUI界面的应用软件以及命令行工具 几乎所有操作系统都可以使用Qt 如Windows Mac OS X Android等 用于开发Qt应用程序的主要编程语言是C 但是可以使用诸如Python
  • 服务数据的定义和使用

    1 自定义数据服务 在包下创建srv文件夹 在文件夹下创建Person srv 在Person srv下输入以下内容 代表数据类型 string name uint8 age uint8 sex uint8 unknown 0 uint8
  • 【ROS】usb_cam相机标定

    1 唠叨两句 当我们要用相机做测量用途时 就需要做相机标定了 不然得到的计算结果会有很大误差 标定的内容包括三部分 内参 外参还有畸变参数 所以标定的过程就是要求得上面这些参数 以前弄这个事估计挺麻烦 需要做实验和计算才能得到 现在通过ro
  • 《学习篇》学会这18个常用ROS命令集合就能入门ROS了

    常用ROS命令概述 ROS常用命令可以按照其使用场景分为ROSshell命令 ROS执行命令 ROS信息命令 ROS catkin命令与ROS功能包命令 虽然很难从一开始就很熟练地使用所有的命令 但是随着使用的次数增多 你会发现常用的几个R
  • 《机器人操作系统入门》课程代码示例安装出错解决方法

    问题描述 学习 机器人操作系统入门 课程时 在Ubuntu 16 04 上安装了kinetic 安装ROS Academy for Beginners时依赖总是报错 如下所示 rosdep install from paths src ig
  • 如何将从 rospy.Subscriber 数据获得的数据输入到变量中?

    我写了一个示例订阅者 我想将从 rospy Subscriber 获得的数据提供给另一个变量 以便稍后在程序中使用它进行处理 目前 我可以看到订阅者正在运行 因为当我使用 rospy loginfo 函数时 我可以看到打印的订阅值 虽然我不
  • 在 Python 3 中导入 Rosbag

    我正在尝试从 Python 3 读取 rosbag 文件 我安装了 ROS2 Eloquent Elusor 它应该支持 Python 3 当我跑步时 import rosbag bag rosbag Bag test bag 从Pytho
  • 我的代码的 Boost 更新问题

    我最近将 boost 更新到 1 59 并安装在 usr local 中 我的系统默认安装在 usr 并且是1 46 我使用的是ubuntu 12 04 我的代码库使用 ROS Hydro 机器人操作系统 我有一个相当大的代码库 在更新之前
  • Caught exception in launch(see debug for traceback)

    Caught exception in launch see debug for traceback Caught exception when trying to load file of format xml Caught except
  • 在 ROS - Python 中使用来自多个主题的数据

    我能够显示来自两个主题的数据 但无法在 ROS 中实时使用和计算这两个主题的数据 用 Python 代码编写 您有想法存储这些数据并实时计算吗 谢谢 usr bin env python import rospy import string
  • 安装 ROS 时 Cmake 未检测到 boost-python

    我一直在尝试在我的 Mac 上安装 ROS 并根据不同版本的 boost 使用不同的库解决了错误 然而 似乎有一个库甚至没有检测到 boost python 这是我得到的错误 CMake Error at usr local share c
  • 如何在Windows上安装机器人操作系统ROSJava?

    ROS 的文档很糟糕 一个很大的讽刺是 ROS 的 Groovy 和 ROSJava 版本的创建是为了让 Windows 等平台上的开发人员能够利用出色的机器人 SDK 而所有安装说明仍然面向 Linux ubuntu 用户 The ROS

随机推荐

  • 链路聚合详解

    链路聚合 链路聚合产生原因 xff1a 1 随着网络中部署的业务量不断增长 xff0c 对于全双工点对点链路 xff0c 单条物理链路的带宽已不能满足正常的业务流量需求 2 如果将当前接口板替换为具备更高带宽的接口板 xff0c 则会浪费现
  • Python113(循环基础04—死循环的概念及解决方法)

    死循环 由于程序员的原因 xff0c 忘记在循环内部修改循环的判断条件 xff0c 导致循环持续执行 xff0c 程序无法终止 xff01
  • matlab小课堂01—向量的建立

    1 直接输入 xff1a x 61 a b c d e f 创建 包含指定元素 的 行向量 注意 xff1a 间隔为空格 xff0c 或者逗号 2 冒号表达式法 xff1a xff08 1 xff09 x 61 first last 创建
  • python193(字符串09—拆分和拼接字符串)

    拆分和连接 方法说明string partition str 把字符串string分成一个3元素的元组 xff08 str前 xff0c str xff0c str后 xff09 string rpartition str 类似于parti
  • python238(全局变量03—函数内部不允许修改全局变量的值)

    函数不能直接修改全局变量的引用 在函数内部 xff0c 可以通过全局变量的引用获取对应的数据但是 xff0c 不允许直接修改全局变量的引用 使用赋值语句修改全局变量的值
  • python007(游戏窗口04—创建游戏窗口和游戏循环)

    创建游戏主窗口 pygame专门提供了一个模块pygame display用于创建 管理游戏窗口 方法说明pygame display set mode 初始化游戏显示窗口pygame display update 刷新屏幕内容显示 xff
  • imu内参标定

    imu内参标定 前言1 imu噪声模型介绍2 imu data和 imu data raw的区别3 px4飞控imu标定 以及遇到的问题kalibr allan标定imu内参 4 使用mintar修改的imu utils进行zed2相机im
  • imu噪声的建模理解

    imu噪声的建模理解 前言一 IMU噪声模型简述二 两篇文档中关于imu噪声模型的描述三 Allan standard deviation AD 读取imu内参 前言 参考An introduction to inertial naviga
  • Airsim环境下的px4硬件在环仿真

    文章目录 前言1 Airsim和硬件在环介绍2 硬件在环测试的准备工作 xff08 硬件和软件 xff09 2 1 usb ttl转接线的制作 xff1a 2 2 px4的ttl端口波特率设置 3 硬件在环测试过程中的问题4 AirSim
  • 使用Kalibr标定相机和IMU(ZED+px4)外参

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 使用Kalibr标定相机和IMU xff08 ZED 43 px4 xff09 外参 前言一 Kalibr介绍二 CAM IMU外参标定1
  • php curl digest,php curl with digest返回两个响应

    如果对标头使用 I选项 则看起来curl具有相同的行为 xff1a curl I digest u root somepassword http localhost digest test 收益 xff1a HTTP 1 1 401 Aut
  • SET PASSWORD FOR ‘root‘@localhost=PASSWORD(‘XXXX‘);报错

    原因 xff1a 数据库版本较高 老版本 SET PASSWORD FOR root 64 localhost 61 PASSWORD XXXXX 新版本 SET PASSWORD FOR root 64 localhost 61 XXXX
  • ROS学习笔记之小乌龟跟随

    ROS学习笔记之小乌龟跟随 说明 xff1a 整个案例是跟着赵虚左老师的视频和文档资料学习的 xff0c 特此感谢赵虚左老师和Autolabor官方 文档地址 视频地址 学习案例之前的预备知识 xff1a TF坐标变换 大体实现流程 xff
  • MPC,PID,LQR,DDP算法

    算法原理 xff1a
  • 对‘image_transport::ImageTransport::~Image Transport()’未定义的引用

    这是因为cmakelist文件没配置好 xff0c 一般的cmakelist文件配置如下 xff1a cmake minimum required VERSION 2 8 3 project first test pkg Compile a
  • 【VIO笔记(学习VINS的必备基础)】第六讲 视觉前端

    文章目录 前端工作的综述特征点提取 匹配和光流为什么需要角点角点的提取光流的计算光流的总结 关键帧与三角化关键帧三角化三角化程序实现 系列教程来自某学院 xff0c 侵权删除 学习完这一系列课程再去看VINS才能做到不吃力 xff0c 不然
  • windows开机自启动frp教程

    https wp gxnas com 12153 html
  • ubuntu20.08下获取realsense内参

    ubuntu20 08下使用realsense过程记录 介绍一 安装SDK1 注册公钥2 将服务器添加到存储库列表中3 安装库4 安装开发者和调试包5 测试SDK 二 下载realsense2 camera包1 下载包2 测试包3 激活相关
  • 深度视场角(Depth Field of View)

    深度视场角 Depth Field of View Realsense相机深度图的建立依赖双目立体成像原理 xff0c 其有效视场是左 右成像器视场的重叠部分 xff0c 如下图所示 顺带一提 xff0c 这张图不能用于计算双目相机深度成像
  • ROS: Publisher and Subscriber

    通过上一节编写ROS的第一个程序hello world xff0c 我们对ROS的整个编程开发过程有了基本的了解 xff0c 现在我们就来编写真正意义上的使用ROS进行节点间通信的程序 由于之前已经建好了catkin ws这样一个工作空间