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

news2024/11/20 20:37:41

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 rospy

from std_msgs.msg import String

rospy.init_node("pub")

pub=rospy.Publisher("che",String,queue_size=10)

msg=String()

rate=rospy.Rate(1)

i=0

while not rospy.is_shutdown():

    msg.data="hello "+(str)(i)

    pub.publish(msg)

    i+=1

    rospy.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 rospy

from std_msgs.msg import String


def 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 rospy

from lesson2.msg import Person

rospy.init_node("pub_person")

pub=rospy.Publisher("che",Person)

p=Person()

p.name="奥特曼"

p.age=8

p.height=1.5

rate=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 Person

import rospy

def 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.coloradmin.cn/o/491665.html

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

相关文章

[Dubbo] 重要接口与类

文章目录 1.dubbo的整体调用链路2.dubbo的源码整体设计3.重要接口和类 1.dubbo的整体调用链路 消费者通过Interface进行方法调用,统一交由消费者的Proxy处理(Proxy通过ProxyFactory来进行代理对象的创建) Proxy调用Filter模块,做…

搞懂 API ,API 分类全知道

API,即应用程序编程接口,是为了方便应用程序之间的数据和功能交互而设计的一些标准方法。API 的分类可以从多个维度进行,我会对 API 的分类维度进行简单的介绍。 根据使用方式的不同 通常情况下,API 可以分为两种使用方式&#…

【LeetCode】1143. 最长公共子序列

1.问题 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff0…

Springboot 项目搭建

目录 一、new project 二、pom.xml 三、配置 resources/application.yml 四、CodeGenerator 代码生成 五、在项目主启动类中&#xff0c;添加MapperScan注解 六、编写 Controller 七、选择application类&#xff0c; 点击运行 一、new project: 二、pom.xml <?xml …

如何升级npm 和 安装nvm 及 升级node.js

1.NPM如何升级&#xff1f; 1.1.可以使用NPM自带的命令进行升级&#xff1a; npm install -g npm 注&#xff1a;这个命令会安装最新的&#xff0c;安装到全局。 2.查看NPM版本 npm -v 注&#xff1a;要是版本过低&#xff0c;可使用上面所说命令进行升级。 3.怎么把node.js升…

二级医院不良事件管理源码,事件审核处理、事件提醒、权限控制、外部上报等功能

医疗安全不良事件报告系统源码 技术架构&#xff1a;前后端分离&#xff0c;仓储模式 开发语言&#xff1a;PHP 开发工具&#xff1a;vscode 前端框架&#xff1a;vue2element 后端框架&#xff1a;laravel8 数 据 库&#xff1a;mysql5.7 文末获取联系&#xff01; 医疗…

供应链管理:理解供应链管理

什么是供应链 供应链便是环绕中心企业&#xff0c;从配套零件开始&#xff0c;制成中心产品直至最终产品&#xff0c;最后由出售网络把产品送到顾客手中的、将供应商&#xff0c;制造商&#xff0c;分销商直到最终用户连成一个整体的功用网链结构。 从这个角度讲&#xff0c;生…

实验9---SpringMVC控制器

实验九 SpringMVC 二 一、实验目的及任务 通过该实验&#xff0c;掌握SpringMVC实现供应商添加、查看、修改的方法。掌握SpringMVC控制器的编写方法。 二、实验环境及条件 主机操作系统为Win10&#xff0c;Tomcat,j2sdk1.6或以上版本。 三、实验实施步骤 略 四、实验报…

一个让人类窒息的AI工具,或许未来人工智能真的能代替人类!

时隔几周&#xff0c;「神采PromeAI」又更新了 不仅页面做了小小的调整 又增加了「背景生成」功能 害怕各位小伙伴找不到使用位置 今天小编就给大家分享一个超全的使用教程 极速出图效率翻倍 让神采PromeAI在应用性设计方面更具优势 温馨提示&#xff1a;目前手机适配端无…

接口自动化测试框架设计:数据驱动、Page Object、单例模式实战

B站首推&#xff01;2023最详细自动化测试合集&#xff0c;小白皆可掌握&#xff0c;让测试变得简单、快捷、可靠https://www.bilibili.com/video/BV1ua4y1V7Db 目录 一、前言 二、设计模式 2.1 数据驱动测试模式 2.2 Page Object 模式 2.3 单例模式 三、代码实现 四、总…

小米路由器4A,(R4A千兆版)刷openwrt系统(Linux的一种)

下载系统 第一步下载自己路由器型号的系统固件&#xff0c;https://openwrt.org/toh/views/toh_fwdownload 直接在页面搜索自己路由器品牌找到区域再找到自己的型号对应的&#xff0c;然后选第一个链接是稳定版系统固件&#xff0c;下载后改名为openwrt.bin 固件备用 下载程序 …

Facebook禁止推广的产品,你知道吗?

作为全球最大的社交媒体平台之一&#xff0c;Facebook一直在努力保护广告客户和用户的权益&#xff0c;以及确保平台上的广告内容合法、道德、安全。 在本文中&#xff0c;我们将深入了解Facebook禁止推广的产品&#xff0c;以及为什么它们被禁止。ClonBrowser多账号功能可以通…

Java基础(十七)File类与IO流

1. java.io.File类的使用 1.1 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆对象&#xff09;File 能新…

Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

本篇博客算是一个开头&#xff0c;接下来会持续更新使用Swift3.0开发服务端相关的博客。当然&#xff0c;我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现。Perfect框架是加拿大一个创业团队开发的&#xff0c;目前是Perfect2.0版本&#xff0c;关于Perfect框架&a…

OpenGL光照教程之 透光物

引言 我们目前使用的所有光照都来自于一个单独的光源&#xff0c;这是空间中的一个点。它的效果不错&#xff0c;但是在真实世界&#xff0c;我们有多种类型的光&#xff0c;它们每个表现都不同。一个光源把光投射到物体上&#xff0c;叫做投光。这个教程里我们讨论几种不同的投…

告别被拒,如何提升iOS审核通过率(上篇)

iOS审核一直是每款移动产品上架苹果商店时面对的一座大山&#xff0c;每次提审都像是一次漫长而又悲壮的旅行&#xff0c;经常被苹果拒之门外&#xff0c;无比煎熬。那么问题来了&#xff0c;我们有没有什么办法准确把握苹果审核准则&#xff0c;从而提升审核的通过率呢&#x…

ESP32-C2开发板简介

C2是一个芯片采用4毫米x 4毫米封装&#xff0c;与272 kB内存。它运行框架&#xff0c;例如ESP-Jumpstart和ESP造雨者&#xff0c;同时它也运行ESP-IDF。ESP-IDF是Espressif面向嵌入式物联网设备的开源实时操作系统&#xff0c;受到了全球用户的信赖。它由支持Espressif以及所有…

PtQt的使用与pycharm的结合

PtQt的使用与pycharm的结合 环境安装 pip install pyqt5 -i https://pypi.tuna.tsinghua.edu.cn/simple # 如果执行成功&#xff0c;没有任何错误提示&#xff0c;则表明环境搭建成功 from PyQt5 import QtWidgets# 当然也可以查看PyQt版本 from PyQt5.QtCore import * print…

Unity之OpenXR+XR Interaction Toolkit实现 移动和转向

一.前言 我们知道&#xff0c;在VR游戏中&#xff0c;我们除了可以通过传送来移动之外&#xff0c;还可以通过手柄的遥感进行移动&#xff0c;那么接下来&#xff0c;我们就介绍一下如果通过XR Interaction Toolkit来实现遥感控制任务移动和旋转 二.准备工作 我们需要准备好…

C. Maximum Subrectangle(思维 + 考察两个数组相乘得到的矩阵的含义)

Problem - C - Codeforces 给定两个正整数数组 a 和 b&#xff0c;长度分别为 n 和 m。 定义矩阵 c 为一个 nm 的矩阵&#xff0c;其中 ci,jai⋅bj。 你需要在矩阵 c 中找到一个子矩形&#xff0c;使得它的元素之和最多为 x&#xff0c;并且它的面积&#xff08;即元素总数&a…