【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信

news/2024/5/19 2:06:42/文章来源:https://blog.csdn.net/qq_62839589/article/details/130504456

img

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。

目录

  • 0.ROS文件系统及常用指令
  • 1.话题通信概念
  • 2.利用标准消息类型实现话题通信实现(python)
    • 2.1发布方实现
    • 2.2订阅方实现
  • 3.利用自定义消息类型实现话题通信(python)
    • 3.1自定义消息类型话题通信发布方实现
    • 3.2自定义消息类型话题通信接收方实现

在这里插入图片描述

0.ROS文件系统及常用指令

roscore 启动ros核心节点

roscd 将工作空间切换到指定ros功能包

catkin_create_pkg 将工作空间切换到指定ros功能包

**rqt_graph 启动节点间的关系图在这里插入图片描述
rosrun 包名 节点名称 启动节点rosrun turtlesim turtlesim_node

roslaunch 包名 launch文件名称 启动Launch文件

比较常用的目前就这一些,之后的命令现用现学就好了

1.话题通信概念

在ros中,机器人的各个部件(雷达|摄像头等部件)相互之间通信需要用到一种通信方式:话题通信,其理论模型为在这里插入图片描述

这里有一个简单的定义:订阅方与发布方通过同一个话题连接起来相互,发布方提供消息,订阅方获得消息,是一个单向的过程,虽然在这过程中似乎没有出现ros master这个角色,但发布方向订阅方第一次发送消息需要经过rosmaster,再到订阅方.(从上图也可以看出),在此之后就不需要rosmaster了

订阅方与与发布方都可以有多个,启动也无先后顺序

2.利用标准消息类型实现话题通信实现(python)

这里我们采用python实现,在接触到的机器人二次开发中大多用的都是python
当然,二者思想差不多,且ros当中用不同语言写的各个节点之间也是可以直接互相通信的

2.1发布方实现

先来分析下需求

  1. 初始化ros节点
  2. 创建发布者对象
  3. 组织发布逻辑,编写发布数据

接下来总体描述下如何写这段程序,

  1. 导入rospy,其是一个ros python标准包,以及从标准消息中导入String这个类型
  2. 初始化当前节点init_node(节点名称)
  3. 实例化发布对象Publisher(话题名称,消息类型,等待消息队列(可不填 默认10))
  4. 创建消息对象
  5. 实例化Rate对象,设置消息频率Rate(HZ)
  6. 当节点不被关闭时循环执行 is_shutdown()
  7. 将消息对象赋值,利用pub发布对象发布信息publish(消息对象)
  8. 在屏幕上打印出发送信息,实现消息反馈loginfo(字符串)
  9. 设置休眠时间,与上文设置的Rate频率相关
import rospyfrom std_msgs.msg import Stringrospy.init_node("pub")pub=rospy.Publisher("che",String,queue_size=10)msg=String()rate=rospy.Rate(1)i=0while not rospy.is_shutdown():msg.data="hello "+(str)(i)pub.publish(msg)i+=1rospy.loginfo(msg.data)rate.sleep()

最后为这个py文件加上可执行权限,在当前功能包路径下的CMakelist中将刚刚的python文件添加到这里在这里插入图片描述
( 并在catkin_ws也就是ros根目录空间下执行source ./devel/setup.bash)在终端执行rosrun 包名 话题名即可运行
在这里插入图片描述

这就是话题通信的发布方实现,接下来我们再来看看订阅方是如何实现的

2.2订阅方实现

  1. 初始化ros节点
  2. 实例化订阅方对象
  3. 处理订阅到的消息

接下来总体描述下如何写这段程序,

  1. 导入rospy,其是一个ros python标准包,以及从标准消息中导入String这个类型
  2. 初始化当前节点init_node(节点名称)
  3. 实例化接受对象Subsrciber(话题名称,消息类型,回调函数,等待消息队列(可不填 默认10))
  4. 这里的回调函数相当于一个函数指针,实例化这个对象的时候会调用回调函数对消息进行一个处理
  5. 所以回调函数的传入参数就是收到的消息类型,我们把他在屏幕上打印出来就可以了
  6. 使节点一直处于活跃状态,能处理接收到的消息spin()

import rospyfrom std_msgs.msg import Stringdef callback(msg):rospy.loginfo(msg.data)rospy.init_node("sub")sub=rospy.Subscriber("che",String,callback,queue_size=10)rospy.spin()

最后为这个py文件加上可执行权限

在当前功能包路径下的CMakelist中将刚刚的python文件添加到这里(在noetic版本之前不需要执行这一步操作在这里插入图片描述

并在catkin_ws也就是ros根目录空间下执行source ./devel/setup.bash

在终端执行rosrun 包名 话题名即可运行并编译一下

我们也尝试运行下这个代码,方法与上文相同

  1. 先运行一下pub节点在这里插入图片描述

  2. 新打开一个终端,在运行一下sub节点在这里插入图片描述

成功啦,这就是利用标准消息参数进行话题通信。

3.利用自定义消息类型实现话题通信(python)

数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如: 激光雷达的信息… std_msgs 由于描述性较差而显得力不从心,这种场景下可以使用自定义的消息类型

这部分内容主要代码是与上文相同,仅将std_msgs.msg替换成了自己设定的库,所以主要是修改配置文件的过程。

  1. 首先在当前功能包下创建一个msg的文件夹,里面存放你的自定义消息类型在这里插入图片描述

  2. 创建一个.msg的消息类型,我这里的名字是Person.msg,里面有三个标准类型

    string name

    int32 age

    float32 height

  3. 在功能包目录下的package.xml中加入这两行(54与59)
    在这里插入图片描述

    其中54行的message_generation是编译时的消息软件包
    而59行message_runtime是运行时的消息软件包

  4. 在CMakeList中找到这些地方并修改

    find_package(catkin REQUIRED COMPONENTS
    rospy
    std_msgs
    message_generation
    )
    # 需要加入 message_generation,必须有 std_msgs## 配置 msg 源文件
    add_message_files(
    FILES
    Person.msg
    )# 生成消息时依赖于 std_msgs
    generate_messages(
    DEPENDENCIES
    std_msgs
    )#执行时依赖
    catkin_package(
    CATKIN_DEPENDS  rospy std_msgs message_runtime
    )
    
  5. 编译一下 可以在/工作空间/devel/lib/python3/dist-packages/包名/msg找到刚刚生成的消息类型
    在这里插入图片描述

  6. 之后要使用在这个消息包可以直接在代码中导入就可以了

    # from ros包名.msg import 消息名称
    from lesson2.msg import Person 
    

3.1自定义消息类型话题通信发布方实现

实现方法与之前的标准消息类型话题通信相同,仅在消息内容定义不同,所以这里就不过多赘述。
消息类型初始化的成员名与自定义消息类型中的成员名相同似乎有点废话hhhh

import rospyfrom lesson2.msg import Personrospy.init_node("pub_person")pub=rospy.Publisher("che",Person)p=Person()p.name="奥特曼"p.age=8p.height=1.5rate=rospy.Rate(1)while not rospy.is_shutdown():pub.publish(p)rate.sleep()rospy.loginfo("%s,%d,%f",p.name,p.age,p.height)

3.2自定义消息类型话题通信接收方实现


from lesson2.msg import Personimport rospydef doMsg(p):rospy.loginfo("%s,%d,%.2f",p.name,p.age,p.height)rospy.init_node("sub_person")#话题通信的话题必须与发布方相同
sub=rospy.Subscriber("che",Person,doMsg)rospy.spin()

最后配置下CMakeList就可以运行了(在noetic版本之前不需要执行这部操作)

rosrun lesson2 demo02_pub.py
rosrun lesson2 demo02_sub.py

在这里插入图片描述
在这里插入图片描述

成功啦,这就是利用自定义参数进行话题通信。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SPSS如何进行使用时间序列模型之案例实训?

文章目录 0.引言1.时间序列数据平稳处理2.指数平滑法建模3.ARIMA建模4.季节性分解 0.引言 因科研等多场景需要进行绘图处理,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对…

【Git】制造冲突以及解决冲突的详细方法

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

编译原理笔记(一)引论

文章目录 1.什么是编译程序2.编译过程和编译程序的结构2.1.编译过程概述2.2.编译程序的结构2.3.编译阶段的组合 3.解释程序和一些软件工具3.1.解释程序3.2.处理源程序的软件工具 4.PL/0语言编译系统 学习总结:这一部分是编译原理的绪论部分内容,对编译程…

神经网络结构搜索NAS

推荐课程:神经网络结构搜索 感谢博主ShusenWang提供的课程讲解! 目录 1. 为什么要学习神经网络结构搜索NAS? 2. 什么是神经网络结构搜索NAS? (1)随机搜素Random Search 1. 为什么要学习神经网络结构搜…

漫天花雨HTML特效+3D相册

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

or-tools 应用案例分析:复杂作业车间调度问题

作业调度问题是常见的线性规划(整数规划)问题,其中多个作业在多台机器上处理。每个作业由一系列任务组成,这些任务必须按给定的顺序执行,并且每个任务都必须在特定的机器上处理。如何有效的利用所有的机器在最短的时间内完成所有的作业任务&a…

调试别人的API,一般有哪些步骤?

当我们使用了一些由别人实现的API接口时,该如何进行调试呢?当我们使用的API返回一些意想不到错误时,该怎么办呢?这个问题可能是由于用户输入或者API本身,或者其他完全无关的内容等引起的。调试是我们进行定位并修复由单个API调用…

[杂谈]从《天堂2》到永恒之塔私服的感慨

不才在下是个老丫头了,平时喜欢潜水,还是在玩激战时注册的多玩论坛号,也不怎么说话,都是看别人说得多(害羞嘛……)。 想当年《天堂二》内测时,刚好在成都开了个内测号 首发会,我大清…

Linux 五种网络IO模式(阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO)

Linux网络编程中,有五种网络IO模式,分别是阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO; 虽然说不能全都认识得很透彻,但至少得都知道一点! 开始之前,先了解以下同步IO和异步IO; 1. 同步…

linux0.12-8-4-sys_call.s

[301页] 8-4 sys_call.s 程序 sys_call.s 程序简单总结: int 0x80 – _system_call int16 – 处理器错误中断 int7 – 设备不存在或协处理器不存在。 int32 – (int 0x20)时钟中断处理程序。 两个系统功能的底层接口,分别是 sys_execve 和 sys_fork 。…

【JVM】面试题总结

JVM 1、JVM 的运行时内存区域是怎样的2、堆和栈的区别3、Java 中的对象一定在堆上分配内存吗4、什么是 Stop The World5、JVM 如何判断对象是否存活6、JVM 有哪些垃圾回收算法7、什么是三色标记算法8、新生代和老年代的GC算法9、新生代和老年代的垃圾回收器有何区别10、Java 中…

MYSQL用户组管理

1:使用明文密码创建用户 使用密文密码创建用户 1.2 查看用户信息 1.3 重命名用户 rename 1.4 删除用户信息 drop 1.5 修改当前登录用户的密码 set password password(123456); 1.6 修改其他用户的密码 set password for nancylocalhost password(abc123); 1.7…

电子价签能给生鲜零售带来什么?

生鲜零售 变价难 超市中的水果、蔬菜、鱼肉海鲜等商品,往往会受季节变化、运输和储存成本、自然环境引起的生产成本、供需关系等因素影响,其商品价格变动比较频繁。如不能及时更新价格,容易影响商品的销售,进而影响超市的盈利能…

【致敬未来的攻城狮计划】第2期定向赠书《RT-Thread设备驱动开发指南》+ 《GD32 MCU原理及固件库开发指南》

开启攻城狮的成长之旅!这是我参与的由 CSDN博客专家 架构师李肯(超链接:http://yyds.recan-li.cn)和 瑞萨MCU (超链接:瑞萨电子 (Renesas Electronics Corporation)) 联合发起的「 致敬未来的攻…

测试用例覆盖不全面的解决方法

测试用例覆盖不全面的解决方法 问题分析 在测试用例设计过程中,容易出现思维受限或者需求盲区,我们不可能完全覆盖用户使用的所有场景,编写测试用例的时不可能把所有的场景都能想周全,把所有的场景下的情况都写成测试用例去模拟、…

儿童书写台灯哪个牌子比较好?盘点护眼学生用台灯品牌排行

想要拥有一个健康的视力对于我们多么重要,日常生活多么不便利,就是像家里孩子考学时视力也是对于未来专业选择的一个阻碍。 想要孩子不吃近视的苦,从小就要开始抓孩子对于视力和眼睛的呵护。 养成好习惯必须保持一个正确的学习姿势&#xff…

基于pytorch+transformers的车牌识别

目录 程序流程设计熟悉训练数据集CCPD2019数据集CCPD数据集标注信息单例再现 加载本地车牌数据集 程序流程设计 1,熟悉训练数据集; 2,加载本地车牌数据集; 3,定义网络模型; 4,输入数据集训练模…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的线性灰度变换ScaleImage算法增强(C#)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的线性灰度变换算法增强(C#) Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合Halcon使用线性灰度变换增强算法1.引用合适的类文件2.BGAPI SDK在…

「STC8A8K64D4开发板」——外部中断(INT0~INT4)

第2-4讲:外部中断(INT0~INT4) 学习目的学习中断的相关概念。掌握外部中断配置及中断优先级配置的程序设计。掌握中断服务程序的编写。 中断相关概念 什么是中断 中断系统是为使 CPU 具有对外界紧急事件的实时处理能力而设置的。 CPU在处理某一事件A时&#xff0c…

基于YOLOv5的儿童睡眠检测

注意: 由于SOPHGO SE5微服务器的CPU是基于ARM架构,部分步骤将在 基于x86架构CPU的开发环境中完成 一、初始化开发环境(基于x86架构CPU的开发环境中完成) 二、模型转换 (基于x86架构CPU的开发环境中完成) 三、YOLOv5模型部署测试(在SOPHGO SE5…