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

这篇具有很好参考价值的文章主要介绍了【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

roscore 启动ros核心节点

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

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

**rqt_graph 启动节点间的关系图【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信
rosrun 包名 节点名称 启动节点rosrun turtlesim turtlesim_node

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

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

1.话题通信概念

在ros中,机器人的各个部件(雷达|摄像头等部件)相互之间通信需要用到一种通信方式:话题通信,其理论模型为【ROS】如何让ROS中节点实现数据交换Ⅰ--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文件添加到这里【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信
( 并在catkin_ws也就是ros根目录空间下执行source ./devel/setup.bash)在终端执行rosrun 包名 话题名即可运行
【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信

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

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版本之前不需要执行这一步操作【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信

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

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

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

  1. 先运行一下pub节点【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信

  2. 新打开一个终端,在运行一下sub节点【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信

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

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

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

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

  1. 首先在当前功能包下创建一个msg的文件夹,里面存放你的自定义消息类型【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信

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

    string name

    int32 age

    float32 height

  3. 在功能包目录下的package.xml中加入这两行(54与59)
    【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信

    其中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找到刚刚生成的消息类型
    【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信

  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

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

成功啦,这就是利用自定义参数进行话题通信。文章来源地址https://www.toymoban.com/news/detail-434285.html

到了这里,关于【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ROS】—— ROS通信机制——话题通信(二)

    📢本系列将依托赵虚左老师的ROS课程,写下自己的一些心得与笔记。 📢课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 📢讲义链接:http://www.autolabor.com.cn/book/ROSTutorials/index.html 📢 文章可能存在疏漏的地方,恳请大家指出。     机器人是一种高度复杂的系统性实现,在机器

    2023年04月18日
    浏览(39)
  • 【ROS】服务通信、话题通信的应用

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。 本章将来学习如何利用话题通信,服务通信两种种方式对turtlesim进行一个控制 利用话题通信发布一个位姿信息,让乌龟一直做圆周运动 首先,先启动 turtlesim 这个节点 现在可以直

    2024年02月06日
    浏览(34)
  • ROS:话题通信机制详解

    话题在ROS中使用最为频繁,其通信模型也较为复杂。在ROS中有两个节点:一个是发布者Talker,另一个是订阅着Listener。两个节点分别发布、订阅同一个话题,启动顺序没有强制要求,此处假设Talker首先启动,可分为如下七步分析建立通信的详细过程。 0、Talker注册 Talker启动,

    2024年02月11日
    浏览(35)
  • ROS学习——通信机制(话题通信③—注意事项)

    2.1.2 话题通信基本操作A(C++) · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程   043话题通信(C++)4_注意事项_Chapter2-ROS通信机制_哔哩哔哩_bilibili 1. int main(int argc, char const *argv[]){} vscode 中的 main 函数 声明 int main(int argc, char const *argv[]){},默认生成 argv 被 const 修饰,需要

    2024年02月08日
    浏览(46)
  • 【OpenCV】C++红绿灯轮廓识别+ROS话题实现

    目录 前言 一、背景知识 Opencv轮廓检测 ROS相关知识 二、环境依赖 三、具体实现 Step1:初始化ROS,订阅话题 Step2:接收话题,进入回调 1. 帧处理  2. 膨胀腐蚀处理 Step3:红绿特征处理 1. 提取绘制轮廓 2. 转换矩形、排序 3. 显示检测结果 四、完整代码 五、使用方法 CMakeLists.

    2024年02月16日
    浏览(41)
  • 【ROS2机器人入门到实战】话题之RCLCPP实现

    当前平台文章汇总地址:ROS2机器人从入门到实战 获取完整教程及配套资料代码,请关注公众号鱼香ROS获取 教程配套机器人开发平台:两驱版| 四驱版 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn 本节我们学习使用ROS2的RCLCPP客户端库来实现话题通信。 RCLCPP为

    2024年02月07日
    浏览(52)
  • 随手笔记——将ROS图像话题转为OpenCV图像格式处理后再转为ROS图像话题发布(C++版)

    将ROS图像话题转为OpenCV图像格式处理后再转为ROS图像话题发布,主要通过cv_bridge的toImageMsg()和toCvCopy()函数(C++版)。 ​ 代码来自wiki

    2024年02月12日
    浏览(44)
  • 【ROS2入门】理解 ROS 2 Topics 话题

            大家好,我是虎哥,从今天开始,我将花一段时间,开始将自己从ROS1切换到ROS2,在上一篇中,我们一起了解ROS 2中节点的功能以及与之交互的工具, 这一篇,我们主要会围绕ROS中另外一个重要的概念“Topic ”,详细其具体的操作指令。 目录 一、ROS2中话题(Top

    2023年04月08日
    浏览(44)
  • 【ROS2指南-4】理解ROS2话题

    目标: 使用 rqt_graph 和命令行工具来反思 ROS 2 主题。 教程级别: 初学者 时间: 20分钟 内容 背景 先决条件 任务 1 设置 2 rqt_graph 3 ros2主题列表 4 ros2主题回显 5 ros2 主题信息 6 ros2界面展示 7 ros2主题发布 8 ros2 主题赫兹 9 清理 概括 下一步 ROS 2 将复杂的系统分解为许多模块化节

    2023年04月19日
    浏览(47)
  • ROS学习笔记(二):ROS话题的发布与订阅

    第十讲  发布者Publisher的编程 1. 创建功能包 learning_topic  $ cd ~/test1/src  $ catkin_create_pkg learning_topic std_msgs rospy roscpp geometry_msgs turtlesim 2.执行C++文件程序如下:放在创建的功能包的/learning_topic/src里 程序名为velocity_publisher.cpp 2.如何实现一个发布者(发布到ros自带节点 ) (1)初

    2024年02月04日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包