1.ROS基本框架

ROS架构如下图所示,可以将其分为三个层次:OS层、中间层和应用层。

1.1 应用层

应用层是用户直接交互的部分,包含以下核心组件:

  • Master:

    ROS的核心协调者,负责节点(Node)的注册、发现和通信管理。节点启动时向Master注册自身信息(如话题、服务名称),Master帮助节点建立直接连接(如发布者-订阅者)。

  • Node:

    节点的多个实例,代表系统中的独立功能单元。每个节点负责执行特定任务(如传感器数据处理、运动控制),通过ROS通信机制(话题、服务、动作)与其他节点交互。

  • ...:

    表示应用层可能包含的其他组件,如可视化工具(Rviz)、仿真环境(Gazebo)或用户自定义的功能包。

1.2 中间层

中间层是ROS的核心功能实现层,提供通信、编程接口和优化机制:

  • ClientLibrary:

    ROS客户端库(如roscpp、rospy、roslisp),为开发者提供编程接口。这些库封装了ROS通信的底层细节,简化节点的开发。

  • TCPROS/UDPROS:

  • --TCPROS:基于TCP协议的通信方式,提供可靠、有序的数据传输,适用于大多数场景(如传感器数据流)。

  • --UDPROS:基于UDP协议的通信方式,支持低延迟、高效率的数据传输,适用于实时性要求高的场景(如控制指令)。

    节点间通过这两种协议直接通信(无需Master转发),Master仅负责初始连接的建立。

  • Nodelet API:

    用于在同一进程中运行多个节点(Nodelet),避免进程间通信的开销,显著提升数据密集型任务(如图像处理)的性能。

1.3 OS层

OS层是ROS运行的底层操作系统支持:

  • Linux:

    ROS1主要依赖Linux(尤其是Ubuntu),其底层功能(如进程管理、网络通信、硬件驱动)由Linux操作系统提供。ROS2已扩展支持更多操作系统(如Windows、macOS),但传统ROS1架构通常与Linux深度绑定。

2.功能包

1)config:放置功能包中的配置文件,由用户创建,文件名可以不

同。

2)include:放置功能包中需要用到的头文件。

3)scripts:放置可以直接运行的Python脚本。

4)src:放置需要编译的C++代码。

5)launch:放置功能包中的所有启动文件。

6)msg:放置功能包自定义的消息类型。7)srv:放置功能包自定义的服务类型。

8)action:放置功能包自定义的动作指令。

9)CMakeLists.txt:编译器编译功能包的规则。

10)package.xml:功能包清单

3.ROS常用命令

3.1话题通信机制

在ROS中有两个节点:一个是发布者Talker,另一个是订阅者

Listener。两个节点分别发布、订阅同一个话题,启动顺序没有强制要

求,此处假设Talker首先启动,可分成图中所示的七步来分析建立通信

的详细过程。

  • 1.Talker注册

    Talker启动,通过1234端口使用RPC向ROS Master注册发布者的信息,包含所发布消息的话题名;ROS Master会将节点的注册信息加入注册列表中。

  • 2.Listener注册

    Listener启动,同样通过RPC向ROS Master注册订阅者的信息,包含需要订阅的话题名。

  • 3.ROS Master进行信息匹配

    Master根据Listener的订阅信息从注册列表中进行查找,如果没有找到匹配的发布者,则等待发布者的加入;如果找到匹配的发布者信息,则通过RPC向Listener发送Talker的RPC地址信息。

  • 4.Listener发送连接请求

    Listener接收到Master发回的Talker地址信息,尝试通过RPC向Talker发送连接请求,传输订阅的话题名、消息类型以及通信协议

    (TCP/UDP)。

  • 5.Talker确认连接请求

    Talker接收到Listener发送的连接请求后,继续通过RPC向Listener确认连接信息,其中包含自身的TCP地址信息。

  • 6.Listener尝试与Talker建立网络连接

    Listener接收到确认信息后,使用TCP尝试与Talker建立网络连接。

  • 7.Talker向Listener发布数据

    成功建立连接后,Talker开始向Listener发送话题消息数据。

从上面的分析中可以发现,前五个步骤使用的通信协议都是RPC,最后发布数据的过程才使用到TCP。ROS Master在节点建立连接的过程中起到了重要作用,但是并不参与节点之间最终的数据传输。节点建立连接后,可以关掉ROS Master,节点之间的数据传输并不会受到影响,但是其他节点也无法加入这两个节点之间的网络。

3.2服务通信机制

服务是一种带有应答的通信机制,通信原理如下图所示。与话题的通信相比,其减少了Listener与Talker之间的RPC通信。

  • 1.Talker注册

    Talker启动,通过1234端口使用RPC向ROS Master注册发布者的信息,包含所提供的服务名;ROS Master会将节点的注册信息加入注册列表中。

  • 2.Listener注册

    Listener启动,同样通过RPC向ROS Master注册订阅者的信息,包含需要查找的服务名。

  • 3.ROS Master进行信息匹配

    Master根据Listener的订阅信息从注册列表中进行查找,如果没有找到匹配的服务提供者,则等待该服务的提供者加入;如果找到匹配的服务提供者信息,则通过RPC向Listener发送Talker的TCP地址信息。

  • 4.Listener与Talker建立网络连接

    Listener接收到确认信息后,使用TCP尝试与Talker建立网络连接,并且发送服务的请求数据。

  • 5.Talker向Listener发布服务应答数据

    Talker接收到服务请求和参数后,开始执行服务功能,执行完成后,向Listener发送应答数据。

DAY1--ROS基本认知的更多相关文章

  1. 2015-2016机器人操作系统(ROS)及其应用暑期学校资料汇总 ROS Summer School 持续更新

    综合信息:2015    2016 课程资料:2015     2016 其他重要机器人.ROS相关学习活动 知乎关于ROS的话题 1 ROS的开发流程?http://www.zhihu.com/qu ...

  2. 如何使用ROS查找rgbdslam代码包框架的输入

    我想这是一个天大的错误,在没有对整个ROS下的代码有一个整体理性的认知时,我使用感性认知. 由于在跑他的测试代码时,只替换了两个节点的名称,相当于remap了它,以为就可以跑了,结果是不行的. 然后用 ...

  3. %iowait和CPU使用率的正确认知

    resources 理解 %IOWAIT (%WIO) LINUX系统的CPU使用率和LOAD Linux Performance Observability Tools How Linux CPU ...

  4. 【AI开发第一步】微软认知服务API应用

    目录 介绍 API分类 使用‘视觉’API完成的Demo 点击直接看干货 介绍 从3月份Google家的阿尔法狗打败韩国围棋冠军选手李世石,到之后微软Build2016大会宣布的“智能机器人”战略.种 ...

  5. 阿里云VPS服务器,ROS内网穿透

    Aliyun Windows Server 2008 R2中建立vpn服务器,ros中使用pptp拨号连接 2.在Aliyun服务器中,修改hosts,将内网分配的ip映射到指定的域名,在Aliyun ...

  6. NOIp2016 Day1&Day2 解题报告

    Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...

  7. QT下调试基于ros的catkin项目

    1.首先告诉qt ros的搜索路径,通过修改qt creator 桌面启动程序来实现 sudo    gedit ~/.local/share/applications/DigiaQtOpenSour ...

  8. ROS学习(三)—— ROS文件系统

    一.预备工作 使用ros0tutorials程序包,先下载: sudo apt-get install ros-<distro>-ros-tutorials 其中<distro> ...

  9. ROS学习(二)—— 配置ROS环境

    一.管理环境 p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 如果你在查找和使用ROS软件包方面遇到了问题,请确保你已经正确配置了脚 ...

  10. ROS学习(一)—— 环境搭建

    一.配置Ubuntu软件仓库且选择ROS正确版本 二.添加source.list sudo sh -c 'echo "deb http://packages.ros.org/ros/ubun ...

随机推荐

  1. Dibble pg walkthrough Intermediate

    nmap 21/tcp open ftp vsftpd 3.0.3 | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_Can't get ...

  2. [文件格式/数据存储] Parquet:开源、高效的列式存储文件格式协议

    序:缘起 => 用 java 读取 parquet 文件 生产环境有设备出重大事故,又因一关键功能无法使用,亟需将生产环境的原始MQTT报文(以 parquet 文件格式 + zstd 压缩格式 ...

  3. Doris端口列表

    实例名称 端口名称 默认端口 通讯方向 说明 BE be_port 9060 FE --> BE BE 上 thrift server 的端口,用于接收来自 FE 的请求 BE webserve ...

  4. Luogu P11553 ROIR 2016 Day 1 奇怪的字符串 题解 [ 绿 ] [ 后缀自动机 ] [ 枚举 ] [ 观察 ]

    奇怪的字符串:需要一点观察的 SAM 小清新题. 观察 我们首先观察什么样的字符串才是奇怪的,可以发现,首先类似 AAAAAAA 之类全部相等的字符串是奇怪的. 继续观察,如果字符种类变为两种或者三种 ...

  5. python接入百度智能云API实现ai对话

    python接入百度智能云API实现ai对话 千帆大模型平台-百度智能云千帆 代码段: import requests import json # 获取访问令牌的函数 def get_access_t ...

  6. OpenLayers 修改 Feature 的 Style 后不实时更新问题,解决惹~~~

    比如我修改了 字体 feature.getStyle().getText().setFont('12px sans-serif') 地图上没有及时更新,需要缩放或者进行其他操作才可以 这个时候调用 l ...

  7. ML树构建简明教程

    数据准备 Teamviewer登录实验室服务器,访问http://172.17.128.86:8501/CleanData,按照页面对应的格式要求分别从NCBI和GISAID数据库下载数据,拖拽到对应 ...

  8. mybatis - [12] 日志工厂

    题记部分 001 || 日志工厂 如果一个数据库操作出现了异常,需要通过日志定位问题. 002 || Log4j Log4j是Apache的一个开源项目,通过使用Log4j,可以控制日志信息输送的目的 ...

  9. Linux - 批量清除失效软连接

    红底白字,并且一闪一闪的都是失效的软连接,需要批量清除它们... 1.打印所有失效软连接 find ./* -type l -exec test ! -e {} \; -exec echo {} \; ...

  10. 【由技及道】在wsl容器中进行远程java开发【人工智障AI2077的开发日志003】

    指令接收:「需要万能开发环境」 系统警报:检测到主人即将陷入"环境配置地狱" 启动救赎协议:构建量子化开发容器 终极目标:让"在我机器上能跑"成为历史文物 需求 ...