ROS的消息发布者与订阅者示例

news2024/10/5 20:28:32

前言

        Topic话题,是节点之间信息交换的方法,在向话题发生送消息的节点叫做发布者,接收消息的节点叫做订阅者。

        一个ROS程序中话题可以有很多个,一个话题中也可以有多个发布者和订阅者。一个订阅者可以订阅多个话题。同样 ,一个发布者也可以同时在多个话题中发送消息。

在ROSindex网站查看消息的类型有哪些

①进入ROSindex网站,在搜索栏搜索std_msgs,找到你使用的ROS版本。

②点击website

 ③下滑可以找到消息类型,我们点进Int16看看具体的内容

 

编写代码 

 我们编写代码,在同一个包中建立两个节点作为两个发布者。分别发送string类型和int16类型的消息到两个不同的话题中。而另一个包中只建立一个节点作为订阅者,同时接收两个话题中的内容。

目录结构如下:

 abc.cpp的代码

#include <ros/ros.h>
#include <std_msgs/String.h>
int main(int argc, char  *argv[])
{
    ros::init(argc,argv,"abc_node");//abc1_node节点
    ros::NodeHandle nh;
    ros::Publisher pub=nh.advertise<std_msgs::String>("abc_test",5);//string消息类型   发布到话题abc2_test中  缓冲区长度5
    ros::Rate loop_rate(10);//与loop_rate.sleep();配合实现一秒发十次
   
    while (ros::ok())
    {
             printf("adc_node running\n");//打印信息到所在的运行终端
             std_msgs::String msg;//创建消息变量
             msg.data="adc的消息";//给消息赋值
             pub.publish(msg);//发送
             loop_rate.sleep();
    }
    
    return 0;
}

  abc2.cpp的代码

#include <ros/ros.h>
#include <std_msgs/Int16.h>
int main(int argc, char  *argv[])
{
    ros::init(argc,argv,"abc2_node");//abc2_node节点
    ros::NodeHandle nh;
    ros::Publisher pub=nh.advertise<std_msgs::Int16>("abc2_test",5);//int16消息类型   发布到话题abc2_test中  缓冲区长度5
    ros::Rate loop_rate(10);//与loop_rate.sleep();配合实现一秒发十次
   
    while (ros::ok())
    {
             printf("adc2_node running\n");//打印信息到所在的运行终端
             std_msgs::Int16 msg;//创建消息变量
             msg.data=222;//给消息赋值
             pub.publish(msg);//发送
             loop_rate.sleep();
    }
    
    return 0;
}

 abc包的cmakelist添加的代码

 add_executable(abc_node src/abc.cpp)

 target_link_libraries(abc_node
   ${catkin_LIBRARIES}
 )

 add_executable(abc2_node src/abc2.cpp)

 target_link_libraries(abc2_node
   ${catkin_LIBRARIES}
 )

efg.cpp代码

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <std_msgs/Int16.h>
void rc_callback1(std_msgs::String msg)//订阅者回调函数         参数为接收的消息类型
{
    ROS_INFO(msg.data.c_str());//字符转字符数组
}
void rc_callback2(std_msgs::Int16 msg)
{
   ROS_INFO("%d",msg.data);//相当于带时间戳的print

}
int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"zh_CN.UTF-8");//中文编码
    ros::init(argc,argv,"efg_node");//第三个参数是节点名
    ros::NodeHandle nh;
    ros::Subscriber sub=nh.subscribe("abc_test",5,rc_callback1);//订阅者1       订阅abc_test话题      缓冲区长度5   回调函数为rc_callback1
    ros::Subscriber sub2=nh.subscribe("abc2_test",5,rc_callback2); //订阅者2    订阅abc2_test话题
    while (ros::ok())
    {
        ros::spinOnce();//监听消息包
    }
    
    return 0;
}

 efg包的cmakelist添加的代码

add_executable(efg_node src/efg.cpp)

target_link_libraries(efg_node
  ${catkin_LIBRARIES}
)

运行

在程序运行时我们可以

用rostopic+list    来查看活跃的话题

用rostopic+echo+话题名     监听话题内容

用rostopic+hz+话题名  查看话题消息的频率

也可以用rqt_graph来查看正在运行的节点的网络情况 (椭圆形是节点,矩形或/是话题,箭头表示消息流通方向)

launch文件一次启动多个节点 

launch只要包含了节点的描述就会自动启动roscore

launch可存放在任意目录下,没有对源码和支持文件目录的依赖,但是放在包的目录下可以通过roslaunch 包名 launch文件名运行。如果放在其它目录下需要先在终端中进入这个目录再运行,否则会提示找不到launch文件。

<launch>
        <node pkg="abc_pkg" type="abc_node" name="abc_node"  launch-prefix="gnome-terminal -e"/>

        <node pkg="abc_pkg" type="abc2_node" name="abc2_node"/> 

        <node pkg="efg_pkg" type="efg_node" name="efg_node" output="screen"/>
</launch>

 其中launch-prefix="gnome-terminal 表示新建一个终端并运行。output="screen"表示在终端输出,否则ROS_INFO不会打印信息到launch运行的终端。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1508059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 地址空间

目录 一、程序地址空间 1、虚拟地址 Makefile新写法 2、进程地址空间分布 3、栈&堆 4、static修饰局部变量 5、字符串常量不可修改 6、虚拟地址与物理地址的联系 二、CPU读取程序全过程 1、形成可执行程序 2、生成虚拟地址 3、程序的启动 4、创建进程 5、地…

MyBatis-Plus生成sql语句时怎么知道表名和表的字段名,表的主键名的

MyBatis-Plus通过反射获取实体类的信息。 实体类的类名驼峰转下划线为表名 实体类的属性名驼峰转下划线为字段名 表的主键名默认为id selectById就是基于这个id&#xff0c;select 查询字段 from user where id &#xff1f; 自定义告诉mybatisplus数据库的表名&#xff0c…

SpringMVC10、拦截器

10、拦截器 10.1、概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。 过滤器与拦截器的区别&#xff1a;拦截器是AOP思想的具体应用。 过滤器 servlet规范中的一部分&…

AWS Database Migration Service 助力数据库搬迁

在业务出海的过程中&#xff0c;少不了的就是云迁移&#xff0c;但在云迁移的过程中其中最重要的一环就是数据库。通常迁移的成功就取决于数据&#xff0c;如果应用成功搬迁&#xff0c;数据库没过来也是无用功。因此如何快速、安全的进行数据库搬迁也成为一大难题。九河云公司…

8.5 Springboot项目实战 Redis缓存热点数据

文章目录 前言一、缓存与数据库一致性二、Repository层 -- Cache Aside模式实操BookRepositoryBookRepositoryImpl2.1 查询2.2 修改2.3 删除2.4 扩展Mapper修改三、Service层调用修改四、测试前言 前两文我们讲解了如何在SpringBoot中整合Redis,接下来我们将进行

智慧水务大数据,信息化云平台建设,综合运营管理平台

一、水务信息化的建设方向 1、完善基础设施构建软件定义的数据中心 基础设施&#xff0c;建设新一代软件定义的数据中心;逐步整合水务和海洋资源、统一、规范化各业务系统,按照一体化、一站式的服务进行建设。 2、整合信息资源建立智慧决策体系 统一信息采集方式&#xff0c;…

STM32CubeIDE基础学习-STM32CubeIDE软件工程文件拷贝粘贴

STM32CubeIDE基础学习-STM32CubeIDE软件工程文件拷贝粘贴 前言 在后面开发程序时&#xff0c;往往不需要再重新新建工程的了&#xff0c;可以直接在原有的工程基础上直接复制粘贴新增功能就可以了。 具体的操作方法步骤如下介绍&#xff1a; 第一步&#xff1a;找到一个原有的…

中医中的虚是什么?虚的分类?如何治疗气虚?

目录 中医中虚的分类气虚&#xff08;此处指脾气虚&#xff09;症状舌象&#xff1a;舌头中间区域有裂痕 或者 舌胖有齿痕身体上 解决方法其它脏腑气虚的情况及解决方法 血虚津液不足阴虚阳虚 中医中虚的分类 图片来源于微信视频的名为 路广林主任 的视频。 气虚&#xff08;此…

九州金榜|孩子厌学怎么引导?

孩子在成长的过程中&#xff0c;尤其在上学的时候&#xff0c;孩子出现厌学情绪这是非常常见的事情&#xff0c;当孩子出现厌学情绪时&#xff0c;家长要采取什么样的方法才能帮助孩子找回学习兴趣和动力呢&#xff1f;九州金榜家庭教育给出建议&#xff0c;首先父母不应该过于…

代码随想录day17(3)二叉树:二叉树的中序遍历(leetcode94)

题目要求&#xff1a;实现二叉树的中序遍历。 思路&#xff1a;对于二叉树的中序遍历&#xff0c;通常可以使用递归算法与非递归&#xff08;迭代&#xff09;算法两种。 对于递归算法的处理与前序、后序基本相同&#xff0c;只是本次应先访问其左节点&#xff0c;然后进行pu…

计算机网络—以太网接口和链路配置

目录 1.拓扑图 2.以太网交换机基础配置 3.配置手动模式的链路聚合 4.配置静态 LACP 模式的链路聚合 5.配置文件 1.拓扑图 2.以太网交换机基础配置 华为交换机接口默认开启了自协商功能&#xff0c;需要手动配置S1与 S2上G0/0/9和G0/0/10接口的速率。 首先修改交换机的设…

【力扣100】【好题】322.零钱兑换 || 01背包完全背包

添加链接描述 思路&#xff1a; dp[j]数组表示的是在金额达到 j 的时候所需要的最小硬币数金额&#xff1a;背包容量&#xff0c;每个硬币的个数都为1&#xff1a;背包中物品的价值&#xff0c;硬币面额&#xff1a;物品重量dp[j]min(dp[j],dp[j-coin]1) class Solution:def …

什么是智慧公厕?智慧公厕的应用价值有哪些?

在现代社会&#xff0c;城市的发展与人民生活质量息息相关。作为城市基础设施中的重要一环&#xff0c;公共厕所的建设及管理一直备受关注。智慧公厕作为一种公共厕所使用、运行、管理的综合应用解决方案&#xff0c;正逐渐在智慧城市的建设中崭露头角。那么&#xff0c;智慧公…

Flutter does not exist

Flutter does not exist 原因&#xff1a;Generated.config 配置文件内路径缺失 原因&#xff1a;Flutter SDK缺失 通过配置文件查到Flutter SDK在本地的存放位置FLUTTER_FRAMEWORK_DIR/Users/haijunyan/Documents/flutter/bin/cache/artifacts/engine/ios 真机所需&#xf…

11---数字温度 OR 湿度传感器电路设计

视频链接 数字温度or湿度传感器电路设计02_哔哩哔哩_bilibili 数字温度 OR 湿度传感器电路设计 1、温湿度传感器 DHT11 DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度-5%RH&#xff0c; 温度-2℃&#xff0c;量程湿度20-90%RH&#xff0c; 温度0~50℃。 D…

一、什么是 HarmonyOS ?

HarmonyOS 是华为开发的一款面向未来的全场景分布式智慧操作系统&#xff0c;将逐步覆盖 18N 全场景终端设备。 对消费者而言&#xff0c;HarmonyOS 用一个“统一的软件系统”&#xff0c;从根本上解决消费者面对大量智能终端体验割裂的问题&#xff0c;为消费者带来统一、便利…

使用OpenCV实现两张图像融合在一起

简单介绍 图像融合技术是一种结合多个不同来源或不同传感器捕获的同一场景的图像数据&#xff0c;以生成一幅更全面、更高质量的单一图像的过程。这种技术广泛应用于遥感、医学影像分析、计算机视觉等多个领域。常见的图像融合技术包括基于像素级、特征级和决策级的融合方法&a…

Oracle VM VirtualBox安装Ubuntu桌面版

背景&#xff1a;学习Docker操作 虚拟机软件&#xff1a;Oracle VM VirtualBox 7.0 系统镜像&#xff1a;ubuntu-20.04.6-desktop-amd64.iso 在Oracle VM VirtualBox新建一个虚拟电脑 选择好安装的目录和选择系统环境镜像 设置好自定义的用户名、密码、主机名 选择一下运行内…

携手亚信安慧AntDB,在数智化浪潮中乘风破浪

随着大数据时代的到来&#xff0c;对数据库的需求愈发强烈。在这一背景下&#xff0c;国产数据库逐渐崭露头角&#xff0c;亚信安慧AntDB作为重要的代表产品之一正积极参与到激烈的市场竞争中。亚信安慧AntDB不仅追求技术的革新和突破&#xff0c;同时也致力于满足用户日益增长…

VPN应用场景典型案例-GRE over IPSec组网应用

组网需求 由于IPSec在对等体间连接性有固有的局限性,包括1、IPSec只能加密/解密IP数据流;2、IPSec无法处理多播或广播IP数据流;但是GRE隧道对于多协议、组播等无法传输在承载路由协议可以更方便;而GRE隧道不能提供加密保障,因此需要和IPSec进行结合;GRE OVER IPSEC的优点…