当前位置: 首页 > article >正文

ROS通信机制全解析

ROS的通信方式是ROS最为核心的概念,ROS系统的精髓就在于它提供的通信架构。ROS的通信方式有以下四种:

  • Topic 主题

  • Service 服务

  • Parameter Service 参数服务器

  • Actionlib 动作库

Topic(发布/订阅)

ROS中的通信方式中,topic是常用的一种。对于实时性、周期性的消息,使用topic来传输是最佳的选择。topic是一种点对点的单向通信方式,这里的“点”指的是node,也就是说node之间可以通过topic方式来传递信息。topic要经历下面几步的初始化过程:首先,publisher节点和subscriber节点都要到节点管理器进行注册,然后publisher会发布topic,subscriber在master的指挥下会订阅该topic,从而建立起sub-pub之间的通信。注意整个过程是单向的。其结构示意图如下:

Subscriber接收消息会进行处理,一般这个过程叫做回调(Callback)。所谓回调就是提前定义好了一个处理函数(写在代码中),当有消息来就会触发这个处理函数,函数会对消息进行处理。

注意整个过程是单向的。

  • Talker向ROS Master注册

  • Listener向ROS Master注册

  • ROS Master通过RPC向Listener发送Talker的地址信息

  • Listener接收到地址信息,通过RPC向Talker发送连接请求

  • Talker确认连接请求,通过RPC向Listener确认连接

  • Listener与Talker建立网络连接

  • Talker向Listener发布数据

总结:前五步的通信协议都是RPC,最后两步传输数据才用TCP

通信示例

怎么样来理解“异步”这个概念呢?在node1每发布一次消息之后,就会继续执行下一个动作,至于消息是什么状态、被怎样处理,它不需要了解;而对于node2图像处理程序,它只管接收和处理/camera_rgb上的消息,至于是谁发来的,它不会关心。所以node1、node2两者都是各司其责,不存在协同工作,我们称这样的通信方式是异步的。

ROS是一种分布式的架构,一个topic可以被多个节点同时发布,也可以同时被多个节点接收。比如在这个场景中用户可以再加入一个图像显示的节点,我们在想看看摄像头节点的画面,则可以用自己的笔记本连接到机器人上的节点管理器,然后在自己的电脑上启动图像显示节点。

这就体现了分布式系统通信的好处:扩展性好、软件复用率高。

总结三点

  1. topic通信方式是异步的,发送时调用publish()方法,发送完成立即返回,不用等待反馈。

  2. subscriber通过回调函数的方式来处理消息。

  3. topic可以同时有多个subscribers,也可以同时有多个publishers。ROS中这样的例子有:/rosout、/tf等等。

操作命令

在实际应用中,我们应该熟悉topic的几种使用命令,下表详细的列出了各自的命令及其作用。

如果你一时忘记了命令的写法,可以通过rostopic helprostopic command -h查看具体用法。

topic的通信方式是ROS中比较常见的单向异步通信方式,它在很多时候的通信是比较易用且高效的。但是有些需要交互的通信时该方式就显露出自己的不足之处了,后续我们会介绍双向同步的通信方式service

Message

topic有很严格的格式要求,比如上节的摄像头进程中的rgb图像topic,它就必然要遵循ROS中定义好的rgb图像格式。这种数据格式就是Message。Message按照定义解释就是topic内容的数据类型,也称之为topic的格式标准。这里和我们平常用到的Massage直观概念有所不同,这里的Message不单单指一条发布或者订阅的消息,也指定为topic的格式标准。

结构与类型

基本的msg包括bool、int8、int16、int32、int64(以及uint)、float、float64、string、time、duration、header、可变长数组array[]、固定长度数组array[C]。那么具体的一个msg是怎么组成的呢?我们用一个具体的msg来了解,例如上例中的msg sensor_msg/image,位置存放在sensor_msgs/msg/image.msg里,它的结构如下:

std_msg/Header header
    uint32    seq
    time    stamp
    string    frame_id
uint32    height
uint32    width
string    encoding
uint8    is_bigendian
uint32    step
uint8[]    data

观察上面msg的定义,是不是很类似C语言中的结构体呢?通过具体的定义图像的宽度,高度等等来规范图像的格式。所以这就解释了Message不仅仅是我们平时理解的一条一条的消息,而且更是ROS中topic的格式规范。或者可以理解msg是一个“类”,那么我们每次发布的内容可以理解为“对象”,这么对比来理解可能更加容易。 我们实际通常不会把Message概念分的那么清,通常说Message既指的是类,也是指它的对象。而msg文件则相当于类的定义了。

操作命令

rosmsg的命令相比topic就比较少了,只有两个如下:


http://www.kler.cn/a/510363.html

相关文章:

  • Ubuntu 24.04 LTS linux 文件权限
  • 【视觉惯性SLAM:十七、ORB-SLAM3 中的跟踪流程】
  • 如何选择合适的服务器?服务器租赁市场趋势分析
  • CV与NLP经典大模型解读
  • win32汇编环境,窗口程序中基础列表框的应用举例
  • Matplotlib基础
  • 免签支付工具分享
  • Redis延迟队列详解
  • Mysql InnoDB B+Tree是什么?
  • Spring Boot 3.4.x 和 Micrometer 2.0 的结合 案例 以及使用方法
  • Git下载安装
  • C# 中的 HashSet<T>
  • Java调用C/C++那些事(JNI)
  • 【算法】算法基础课模板大全——第二篇
  • 各种获取数据接口
  • 基于python的财务数据分析与可视化设计与实现
  • Python Pyside6 加Sqlite3 写一个 通用 进销存 系统 初型
  • Unity3D BEPUphysicsint定点数3D物理引擎详解
  • 在 Windows 下利用 `.pem` 文件配置 VS Code Remote-SSH 连接远程服务器
  • 基于协方差交叉(CI)的多传感器融合算法matlab仿真,对比单传感器和SCC融合
  • 用sklearn运行分类模型,选择AUC最高的模型保存模型权重并绘制AUCROC曲线(以逻辑回归、随机森林、梯度提升、MLP为例)
  • 【威联通】FTP服务提示:服务器回应不可路由的地址。被动模式失败。
  • 如何下载对应城市的地理json文件
  • springboot医院信管系统
  • MYSQL学习笔记(二):基本的SELECT语句使用(基本、条件、聚合函数查询)
  • 蓝桥杯3526 子树的大小 | 数学规律