企业网站制作设/seo网络公司

企业网站制作设,seo网络公司,网站搬家怎么做,wordpress做站群1. 简介 你是否曾有过这样的疑问:我按照文档安装了ROS,依照要求写了一些示例节点(node)、消息(msg)和话题(topic),但觉得过程既麻烦又繁琐。也许你开始怀疑:…

1. 简介

你是否曾有过这样的疑问:我按照文档安装了ROS,依照要求写了一些示例节点(node)、消息(msg)和话题(topic),但觉得过程既麻烦又繁琐。也许你开始怀疑:为什么需要ROS?它到底帮我解决了什么问题?

本文将通过一个简单的例子,介绍ROS的架构,阐明它解决了哪些问题,以及它如何帮助我们简化开发流程。

2. 移动案例

假设我们要编写一个能够控制机器人移动的程序。

  1. 随着程序的增多,我们需要进行模块化,方便分工合作和代码复用;
  2. 还需要开放移动接口,使得其他模块能够调用移动控制功能;
  3. 对应,需要选型一个通信机制来传递移动指令;
  4. 移动指令的格式,返回消息的格式需要规范化管理;
  5. 指令可能需要同时传给多个模块,如果下游模块没有及时收到可能需要缓存;
  6. 此外,我们还需要确保各个模块服务的持续运行,能够有效管理;
  7. 模块多了后,多对多的消息传递,日志,可能需要一种有效的监控和调试手段。

你会发现,一个简单的移动控制功能,背后可能涉及了大量的框架设计、标准化工作和大量代码量,如果全部手工实现,不同的人实现方案可能五花八门,也使得开发者很难专注于机器人的核心功能(如更好地移动、刹车、转弯等)。

在这种情况下,ROS的出现就解决了这些问题。下面是ROS中的一些关键概念:

  • 节点(node):每个节点对应一个功能模块,ROS会帮助你管理节点的生命周期,确保它们稳定运行并完成各自的任务,免去你手动管理进程或线程的麻烦。
  • 消息(message):消息定义了节点之间传递的数据结构,如运动指令、雷达数据、坐标数据等。ROS提供了许多常用的消息类型,你可以直接使用这些标准的消息类型,无需重复设计数据格式。如果你的团队其他成员或外部开源项目遵循相同的消息标准,那么这些模块可以无缝对接。
  • 话题(topic):话题是消息传递的方式之一。比如,假设你和其他模块约定使用cmd_vel话题来传递运动指令。所有需要发送或接收运动指令的节点都可以订阅或发布到cmd_vel话题。当遥控器节点发布指令时,移动控制节点只需订阅cmd_vel话题,接收到指令后即可控制机器人移动。和消息队列的概念很相似,这个机制有效的解决了分层解耦和模块化的问题。

3. ROS框架

3.1 整体架构

根据上述案例,ROS的架构可以简要概括为:编写节点(node),节点程序中通过话题(topic)或服务(service)与其他节点进行通信,完成机器人相关的逻辑控制。整体架构图如下,左侧是ROS1,右侧是ROS2,两者的架构类似。

ROS的框架大致分为三层:

  • 应用层:即我们编写的各个节点。
  • 中间层:ROS提供API以及内部通信机制,帮助开发者与ROS系统交互。
  • 操作系统层:ROS并不是独立的操作系统,而是依赖于现有操作系统运行。ROS1仅支持Linux,ROS2支持更多操作系统。

图中其他名词解释:

  • Master(主节点):负责管理系统中的节点,提供节点注册、发现和信息转发等服务。
  • Client Library(客户端库):提供开发者API,供节点编程、消息传递等操作。
  • TCPROS/UDPROS(TCP/UDP协议):ROS1中的通信协议,负责节点间数据传输。
  • Nodelet API(节点内API):允许多个节点在同一进程内运行,避免进程间通信的开销。
  • Abstract DDS Layer(抽象DDS层):ROS2的核心通信机制,基于DDS标准提供分布式通信能力。
  • Intra-process API(进程内通信API):用于高效的内部通信,避免跨进程通信的开销。
  • DDS(数据分发服务):ROS2的底层通信协议,负责实现节点间高效可靠的数据交换。

ROS1和2主要区别:

  • ROS1依赖Master节点来协调节点间的通信,而ROS2使用DDS协议实现去中心化的分布式通信。
  • ROS2引入了进程内通信(Intra-process API),减少了进程间通信的开销,提高了效率。
  • ROS2的DDS通信层使得它更加灵活,可以支持不同的操作系统和硬件平台。

3.2 通信机制

通信机制是ROS的核心,开发节点的主要目的是数据的流转和处理。充分利用ROS的通信框架是标准化、简化以及提升开发灵活性和健壮性的关键。

3.2.1 话题

话题通信是ROS中最常用的通信方式,类似于常见的消息队列。

如下图,假设有两个节点,node2订阅了/topic话题,它会监听这个话题是否有新消息。当node1发布消息到/topic话题时,node2会立即触发回调函数进行处理。

需要注意:

  1. 消息的格式由.msg文件定义,消息可以是简单或嵌套的复合结构。
  2. 发布和订阅节点是多对多的,多个节点可以同时发布到同一话题,也可以有多个节点同时订阅一个话题的数据。

例如,在机器人移动的场景中,node1负责发送移动指令(例如通过遥控器接收指令),而node2负责根据指令控制机器人的硬件(如电机)。

这种基于话题的开发方式将功能分层解耦,灵活且可靠,ROS会确保每个节点稳定运行,消息可靠传递。

3.2.2 服务

虽然话题的发布/订阅模型非常灵活,但在需要双向同步传输的场景下,服务(Service)更加合适。服务采用客户端/服务器模型,包含两个数据类型:一个用于请求,另一个用于应答,类似于HTTP请求。

如下图,node2作为服务方提供一个服务,调用地址为/service。当node1作为客户端调用该服务时,会向/service发送请求数据,node2收到请求后进行处理,并将结果返回给node1,完成一次服务调用。

总结:

  • 话题适用于异步通信,解耦信息的生产者和消费者,常用于实时更新的数据交换。
  • 服务适用于同步通信,采用客户端/服务器模式,常用于需要强逻辑处理的数据交换。

4. 开发文件结构

在ROS框架下,可以看到我们的主要任务是编写节点代码,并通过ROS命令启动节点,形成完整的系统。ROS支持多种编程语言(C、Python、Java),但代码必须遵循ROS的组织结构。

ROS文件结构:

  1. 工作空间(Workspace):顶级目录(图中的catkin workspace)为一个工作空间。
  2. 构建文件:二级目目录中的builddevelinstall为构建过程生成的文件。
  3. 功能包(Package):在工作空间.src目录下,是一系列的功能包,每个功能包可包含多个节点,具体取决于项目需求。

功能包是我们主要面向开发的内容,功能包内部目录结构:

  • config:存放配置文件。
  • include:存放头文件。
  • scripts:存放可直接运行的Python脚本。
  • src:存放C++源代码。
  • launch:存放启动文件。
  • msg:存放自定义消息类型。
  • srv:存放自定义服务类型。
  • CMakeLists.txt:编译规则。
  • package.xml:功能包清单。

5. 小结

ROS为机器人开发提供了一个强大的框架,简化了功能模块化设计、数据交换和服务通信。通过标准化的消息、话题和服务,ROS帮助开发者高效构建分布式、可扩展的机器人系统,减少了低层次的通信和管理工作,使开发者能够专注于机器人本身的核心功能。

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

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

相关文章

LeetCode算法题(Go语言实现)_07

题目 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复…

网络华为HCIA+HCIP 网络编程自动化

telnetlib介绍 telnetlib是Python标准库中的模块。它提供了实现Telnet功能的类telnetlib.Telnet。这里通过调用telnetlib.Telnet类里的不同方法实现不同功能。 配置云

查看GPU型号、大小;CPU型号、个数、核数、内存

GPU型号、大小 nvidia-smiCPU型号 cat /proc/cpuinfo | grep model name | uniqCPU个数 cat /proc/cpuinfo | grep "physical id" | uniq | wc -lCPU核数 cat /proc/cpuinfo | grep "cpu cores" | uniqCPU内存 cat /proc/meminfo | grep MemTotal参考…

Android Handler 通过线程安全的 MessageQueue 和底层唤醒机制实现跨线程通信

目录 一、MessageQueue 的线程安全实现 1. 消息队列的同步锁(synchronized) 2. 消息顺序与延时处理 二、底层唤醒机制:从 Java 到 Linux 内核 1. 消息插入后的唤醒逻辑 2. Native 层实现(基于 Linux 的 eventfd 和 epoll&am…

MySQL中的锁机制:从全局锁到行级锁

目录 1. 锁的基本概念 2. 全局锁 2.1 全局锁的定义 2.2 全局锁的类型 2.3 全局锁的使用场景 2.4 全局锁的实现方式 2.5 全局锁的优缺点 2.6 全局锁的优化 3. 表级锁 3.1 表级锁的类型 3.2 表级锁的使用场景 3.3 表级锁的优缺点 4. 意向锁(Intention Lo…

基于WebRTC的嵌入式音视频通话SDK:EasyRTC跨平台兼容性技术架构实时通信的底层实现

EasyRTC的核心架构围绕WebRTC技术构建,同时通过扩展信令服务、媒体服务器和NAT穿透机制,解决了WebRTC在实际部署中的痛点。其架构可以分为以下几个核心模块: 1)WebRTC基础层 媒体捕获与处理:通过getUserMediaAPI获取…

微服务架构中的API网关:Spring Cloud与Kong/Traefik等方案对比

微服务架构中的API网关:Spring Cloud与Kong/Traefik等方案对比 一、API 网关的概念二、API 网关的主要功能2.1 统一入口与路由转发2.2 安全与权限控制2.3 流量管理与容错2.4 API 管理与聚合2.5 监控与日志2.5 协议转换与适配2.6 控制平面与配置管理 三、API 网关选型…

NewStar CTF web wp

文章目录 week1headach3会赢吗智械危机谢谢皮蛋PangBai 过家家(1) week3include meblindsql1臭皮的计算机臭皮踩踩背这照片是你吗 week4Pangbai过家家四blindsql2chocolateezcmsssezpollute隐藏的密码 weeek5pangbai过家家(5)redissqlshell臭皮吹泡泡臭皮…

Linux驱动开发-①中断②阻塞、非阻塞IO和异步通知

Linux驱动开发-①中断②阻塞、非阻塞IO和异步通知 一,中断1.中断的流程2.上半部和下半部2.1上半部2.2下半部2.2.1 tasklet2.2.2 工作队列 3.按键延时消抖中断程序 二,阻塞和非阻塞IO和异步通知1.阻塞IO1.1 常见结构11.2 常见结构2 2.非阻塞IO2.1 驱动结构…

Docker和Dify学习笔记

文章目录 1 docker学习1.1 基本命令使用1.1.1 docker ps查看当前正在运行的镜像1.1.2 docker stop停止容器1.1.3 docker compose容器编排1.1.4 docker网络[1] 进入到容器里面敲命令[2] docker network ls[3] brige网络模式下容器访问宿主机的方式 2 Dify的安装和基础使用2.1 下…

探秘Transformer系列之(16)--- 资源占用

探秘Transformer系列之(16)— 资源占用 文章目录 探秘Transformer系列之(16)--- 资源占用0x00 概述0x01 背景知识1.1 数据类型1.2 进制&换算数字进制存储度量换算 1.3 参数显存占用有参数的层无参数的层所需资源 1.4 计算量 0…

jaeger安装和简单使用

文章目录 jaeger安装和使用什么是jaegerjaeger安装 jaeger安装和使用 什么是jaeger 官网:https://www.jaegertracing.io/ Jaeger 是一个分布式追踪系统。Jaeger的灵感来自 Dapper 和 OpenZipkin,是一个由 Uber 创建并捐赠给 云原生计算基金会&#xf…

【Mybatis-plus】在mybatis-plus中 if test标签如何判断 list不为空

博主介绍:✌全网粉丝22W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…

【递归,搜索与回溯算法篇】- 名词解释

一. 递归 1. 什么是递归? 定义: 函数自己调用自己的情况关键点: ➀终止条件: 必须明确递归出口,避免无限递归 ➁子问题拆分: 问题需能分解成结构相同的更小的子问题缺点: ➀栈溢出风险&#x…

大屏技术汇集【目录】

Cesium 自从首次发布以来,经历了多个版本的迭代和更新,每个版本都带来了性能改进、新功能添加以及对现有功能的优化。以下是 Cesium 一些重要版本及其主要特点: 主要版本概述 Cesium 1.0 (2012年) 初始版本发布,确立了Cesium作为…

图解AUTOSAR_CP_EEPROM_Abstraction

AUTOSAR EEPROM抽象模块详细说明 基于AUTOSAR标准的EEPROM抽象层技术解析 目录 1. 概述 1.1 核心功能1.2 模块地位2. 架构概览 2.1 架构层次2.2 模块交互3. 配置结构 3.1 主要配置容器3.2 关键配置参数4. 状态管理 4.1 基本状态4.2 状态转换5. 接口设计 5.1 主要接口分类5.2 接…

C++相关基础概念之入门讲解(下)

1. 引用 ​ int main() {const int a10;int& aaa;aa;cout<<aa<<endl; } 引用 不是新定义一个变量&#xff0c;而 是给已存在变量取了一个别名 &#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量 共用同一块内存空间&#xff08;初…

注意力机制,本质上是在做什么?

本文以自注意机制为例&#xff0c;输入一个4*4的矩阵 如下&#xff1a; input_datatorch.tensor([[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ],dtypetorch.float) 得到Q和K的转置如下。 此时&#xff0c;计算QK^T ,得到如下结果 第一行第一个位置就是第一条样本和第…

Windows搭建免翻墙的BatteryHistorian

文章参考 GitCode - 全球开发者的开源社区,开源代码托管平台 免翻墙的BatteryHistorian主要原理&#xff1a;修改go源码 1.安装Java环境 1.点击下载 Java JDK&#xff0c;并安装,一路next 2.java -version 检验是否安装成功 2.安装Git工具 1、点击下载 Git&#xff0c;并…

WRF/Chem 模式技术解读:为大气污染治理提供有力支撑

技术点目录 第一部分、WRF-Chem模式应用案例和理论基础第二部分、Linux环境配置及WRF-CHEM第三部分、WRF-Chem模式编译&#xff0c;排放源制作第四部分、WRF-Chem数据准备&#xff08;气象、排放、初边界条件等&#xff09;&#xff0c;案例实践第五部分、模拟结果提取、数据可…