ROS八股总结

1. 概述

  • ROS系统是为了提高机器人研发中的软件复用率,每个模块可以被单独设计与编译,运行时以松耦合的方式结合在一起。
  • 提供硬件抽象、底层驱动、消息传递、程序管理、应用原型等功能和机制。且集成了大量工具、库、协议

2.特点

  • 点对点
    • 节点单元
    • 分布式网络
    • RPC+TCP/UDP通信系统
    • 多机协同

在这里插入图片描述

  • 多语言支持
    • 支持C++、Python、Java等编程语言
    • 语言无关的接口定义
  • 架构精简、集成度高
    • 每个功能节点可以单独编译
    • 集成众多开源项目
    • 接口统一、提高软件复用性
  • 组件化工具包丰富
    • 3D可视化工具—— rviz
    • 物理仿真环境——gazebo
    • 数据记录工具——rosbag
    • Qt工具箱——rqt
  • 免费且开源

3. ROS系统实现

3.1 ROS计算图

  • 节点(Node)—— 软件模块
    • ROS系统由多个节点组成,每个节点代表一个进程,可以是传感器、控制算法等
    • 节点之间通过messages进行通信
  • 节点管理器(ROS Master)—— 控制中心,提供参数管理
  • 话题(Topic)—— 异步通信机制,传输消息(msg),一个节点可以publish消息到一个主题,其他节点可以通过subscribe该主题来接收相关消息
    • Talker注册
    • Listener注册
    • ROS Master进行信息匹配
    • Listener发生连接请求
    • Talker确认连接请求
    • 建立网络连接
    • Talker向Listener发布数据

在这里插入图片描述

  • 服务(Service)—— 同步通信机制,传输请求/应答数据。一个节点可以提供一个服务,其他节点可以请求该服务来获取特定的信息或执行特定的操作
    • Talker注册
    • Listener注册
    • ROS Master进行信息匹配
    • 建立网络连接
    • Talker向Listener发布服务器应答数据

在这里插入图片描述

  • 参数服务器是一个分布式的键值存储系统,用于存储和共享配置参数和运行时参数。节点可以从参数服务器中读取和写入参数
    • Talker设置变量
    • Listener查询参数值
    • ROS Master向Listener发布参数值

在这里插入图片描述

3.2 文件系统

  • 功能包清单:记录功能包的基本信息,包括作者信息、许可信息、依赖选型、编译标志等。
  • 消息类型:消息是ROS节点之间发布/订阅的通信信息,可以使用ROS系统提供的消息类型,也可以使用.msg文件在功能包msg文件下自定义类型。
  • 服务类型:定义了ROS服务器/客户端通信模型下的请求与应答数据类型,可以使用ROS系统提供的服务类型,也可以使用.srv文件在功能包srv文件夹中定义。
  • 代码:放置功能包节点源代码的文件夹。
  • 启动文件:用于配置同时启动多个节点的描述文件

在这里插入图片描述

4. ROS1和ROS2的区别

4.1 操作系统

  • ros1:只能运行在linux
  • ros2:可以运行在linux/windows/macos甚至嵌入式实时操作系统

4.2 系统架构

在这里插入图片描述

  • 系统架构可以分为三层:系统层、中间层、应用层
  • 主要区别体现在中间层:
    • DDS:DDS实现层,由各个厂商提供相应的DDS软件产品;该层的目的是为了让用户可以根据自己实际需求选择不同厂商
    • RMW:抽象的DDS层,中间接口层,由C语言实现,直接和DDS交互,并向ros2 client层提供API接口; 该层的目的是让用户程序可以在不同供厂商的DDS之间进行无感移植
    • RCL:ROS2 Client层,该层包含ROS2核心概念如Node、Action等的具体实现,以及不同编程语言如C++、Python和Java等API接口:rclcpp/rclpy/rcljava;包含RCL库和不同的编程语言API,RCL库是一致的由C语言实现,编程语言API接口是独立的,从而保证了不同编程语言下程序运行的一致性

在这里插入图片描述

4.3 通信模型

  • ros1:
    • 有master节点:在ROS1中,需要开启中央节点管理器Master,统一管理所有节点。如果Master节点出现故障,将严重影响ROS系统功能
    • 支持TCP和UDP通信,默认采用TCP。UDP适合网络不可靠的无线网络
  • ros2:
    • 取消了master节点
    • 基于DDS分布式架构进行通信

4.4 构建系统

  • ros1:
    • ros1采用catkin进行编译。catkin是cmake的进一步封装和拓展;catkin_make是cmake和make命令的包装
    • ros1编译后生成build/devel文件夹
  • ros2:
    • ros2采用colcon进行编译,支持不同的构建系统如catkin和ament等
    • ros2编译后生成build/install/log文件夹

4.5 节点发现

  • ros1:
    • 不同节点在master注册后,通过master拿到其他节点并建立通信进行数据收发
  • ros2:
    • 通过DDS实现不同节点的相互发现,当一个节点启动后, 它会向其他拥有相同ROS域名的节点进行广播,其他节点在收到广播后返回自己的相关信息来建立通信,节点会定时广播它的信息,在下线前它也会广播其他节点自己要下线了,只会和具有相兼容的QoS设置的节点进行通信

4.6 进程节点数

  • ros1中节点和可执行文件紧密相关,一个可执行文件只能存在一个ros1节点;而ros2中同一可执行文件可以存在多个ros2节点

4.7 生命周期节点

  • 为了解决ros1中节点启动顺序无法控制的问题,ros2引入了生命周期节点的概念;
  • ros2提供了两种节点类型:
    (1) Node:和ros1中一样的节点基类
    (2) LifecycleNode:可管理状态的节点基类
  • 声明周期节点有4个基础状态和6个切换状态

在这里插入图片描述

4.8 节点launch启动

  • ros1使用xml编写launch启动文件,roslaunch package_name launch_file.launch
  • ros2默认使用python编写launch启动文件,也可以使用xml进行编写

4.9 服务service 动作action 参数parameters

  • ros1:
    • service是同步的,当客户端向服务器发起请求时,等待响应期间会强行阻塞程序,直到服务器响应/或失败,完全无法获知服务端的处理进度,更不能取消或变更请求
    • action机制是运行服务端和客户端异步请求,采用无阻塞的编程方式
    • 参数由参数服务器处理,而参数服务器本身由master处理
  • ros2:
    • service是异步的,一个server可支持多个client,但每次只能响应一个request。client在调用服务请求时会添加一个回调函数,在服务端response时触发,在这期间主线程不会阻塞
    • action是一个上层的沟通机制,action包括三个部分:目标、结果和反馈。由topic和service共同构建
    • 参数是由service构建出来,因为ros2中没有master,也就没有参数服务器。ROS2不再有全局参数,每个参数都特定于一个节点,每个节点声明和管理自己的参数,这些参数在节点被杀死时被销毁

4.10 服务质量QoS

  • ros1未考虑不稳定网络情况下的通信可靠性
  • ros2通过不同的qos以适应不同的网络情况,可以像TCP一样可靠,也可以像UDP一样尽力而为,进而优化带宽和时延
  • 如果两个ros2节点的qos设置不兼容,将无法通信

5. DDS

  • DDS是基于订阅-发布的模型,但是去中心化,避免中间服务器出现问题而导致各个节点的通讯瘫痪,取而代之的是DataBus。FastDDS是DDS的一种以C++的具体实现
  • ROS2为了更加专注于应用层,也引入DDS通讯,同时增加了中间件RMW(Middleware)以兼容多种DDS实现,而且避免应用层与通讯层的耦合。

6. 什么是RPC?

  • RPC全称Remote Procedure Call,即远程过程调用,就是要像调用本地的函数一样去调远程函数,屏蔽远程调用的复杂性。
  • 为什么需要RPC?
    • 微服务、分布式应用的开发越来越常见,RPC可以解决各个节点之间的服务调用以及通信问题
    • 治理功能,比如连接管理、健康检测、负载均衡、优雅启停机、异常重试、业务分组以及熔断限流等等
  • RPC过程
    • 1.序列化:RPC是一个远程调用,所以必须要通过网络来传输数据。调用方的请求出入参数都是对象,就需要序列化对象为可传输的二进制。
    • 2.传输数据:调用方将二进制数据传输给服务提供方,RPC 一般默认采用 TCP 来传输,因为其可靠性。
    • 3.反序列化:根据特定的协议,服务提供方可以从二进制数据中正确的分割出不同的请求来,同时根据请求类型和序列化类型,把二进制的消息体逆向还原成请求对象。
    • 4.方法调用:根据反序列化得到的请求对象,找到对应的类,完成方法调用。
    • 5.返回请求:将执行结果序列化后,回写到对应的 TCP 通道里面。调用方获取到应答的数据包后,再反序列化成应答对象,这样调用方就完成了一次 RPC 调用。

在这里插入图片描述

在这里插入图片描述

  • 目前常用的RPC框架
    • gRPC
    • Dubbo
    • Spring Cloud

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

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

相关文章

动态规划——路径问题:LCR 166.珠宝的最高价值

文章目录 题目描述算法原理1.状态表示(题目经验)2.状态转移方程3.初始化4.填表顺序5.返回值 代码实现CJava 题目描述 题目链接:LCR 166.珠宝的最高价值 算法原理 1.状态表示(题目经验) 对于这种路径类的问题&…

【全开源】Java外卖霸王餐免费吃外卖小程序+APP+公众号+H5多端霸王餐源码

一、特色功能 霸王餐活动管理:允许商家发布和管理霸王餐活动,包括设置活动时间、具体优惠、活动规则等。用户参与与浏览:用户可以在小程序中浏览霸王餐活动列表,查看活动的详情信息,如商品或服务的免费赠送、活动规则…

zookeeper启动 FAILED TO START

注意:启动zookeeper时,需要使用zkServer.sh start命令将所有主机启动后,再查看状态 如果,启动一台主机,查看当前主机状态,则会报错 如果出错,进入到$ZOOKEEPER_HOME/logs,查看日志 …

【C++】深入剖析C++11 initializer_list 新的类功能 可变模板参数

目录 一、std::initializer_list 1、std::initializer_list是什么类型 2、std::initializer_list 的应用场景 ①给自定义容器赋值 ② 传递同类型的数据集合 二、新的类功能 1、默认成员函数 2、关键字default 3、关键字delete 三、可变参数模板 一、std::initialize…

信创基础软件之中间件

信创基础软件之中间件 中间件概述 中间件是一种应用于分布式系统的基础软件,位于应用与操作系统、数据库之间,主要用于解决分布式环境下数据传输、数据访问、应用调度、系统构建和系统集成、流程管理等问题,是分布式环境下支撑应用开发、运…

读取打包到JAR中的文件:常见问题与解决方案(文件在但是报错not find)

读取打包到JAR中的文件:常见问题与解决方案 喝淡酒的时候,宜读李清照;喝甜酒时,宜读柳永;喝烈酒则大歌东坡词。其他如辛弃疾,应饮高梁小口;读放翁,应大口喝大曲;读李后主…

android init进程启动流程

一,Android系统完整的启动流程 二,android 系统架构图 三,init进程的启动流程 四,init进程启动服务的顺序 五,android系统启动架构图 六,Android系统运行时架构图 bool Service::Start() {// Starting a service removes it from the disabled or reset state and// imme…

【redis】redis持久化分析

目录 持久化Redis持久化redis持久化的方式持久化策略的设置1. RDB(快照)fork(多进程)RDB配置触发RDB备份自动备份手动执行命令备份(save | bgsave)flushall命令主从同步触发动态停止RDB RDB 文件恢复验证 RDB 文件是否被加载 RDB …

c++:(map和set的底层简单版本,红黑树和AVL树的基础) 二叉搜索树(BST)底层和模拟实现

文章目录 二叉搜索树的概念二叉搜索树的操作二叉搜索树的查找find 二叉搜索树的模拟实现构造节点insertfinderase(细节巨多,面试可能会考)a.叶子节点b.有一个孩子左孩子右孩子 c.有两个孩子注意: erase代码 中序遍历 二叉搜索树的应用k模型k模型模拟实现的总代码 k-value模型k-…

代码随想录算法训练营第六十天| LeetCode647. 回文子串 、516.最长回文子序列

一、LeetCode647. 回文子串 题目链接/文章讲解/视频讲解:https://programmercarl.com/0647.%E5%9B%9E%E6%96%87%E5%AD%90%E4%B8%B2.html 状态:已解决 1.思路 这道题我只想出来了暴力解法,动规解法并没有想出来。根据视频讲解才把它想出来。…

聚观早报 | 苹果新款iPad Pro发布;国产特斯拉4月交付量

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 5月9日消息 苹果新款iPad Pro发布 国产特斯拉4月交付量 iOS 18新功能爆料 真我GT Neo6续航细节 三星Galaxy Z F…

智慧公厕,小民生里的“大智慧”!

公共厕所是城市社会生活的基础设施,而智慧公厕则以其独特的管理模式为城市居民提供更优质的服务。通过智能化的监测和控制系统,智慧公厕实现了厕位智能引导、环境监测、资源消耗监测、安全防范管理、卫生消杀设备、多媒体信息交互、自动化控制、自动化清…

uniapp——弹出键盘遮挡住输入框 textarea,处理方法

案例 在写输入框的时候会遇见 键盘遮挡住部分textarea框的一部分&#xff0c;使用cursor-spacing处理即可 修改后&#xff1a; 其他问题&#xff1a; 调起键盘输入时&#xff0c;不希望上方的内容被顶上去 代码 <view class"commentBox" :style"botto…

什么是HTTP?

什么是HTTP&#xff1f; HTTP基本概念HTTP 是什么&#xff1f;HTTP 常见的状态码有哪些&#xff1f;HTTP 常见字段有哪些&#xff1f; HTTP特性HTTP/1.1 的优点有哪些&#xff1f;HTTP/1.1 的缺点有哪些&#xff1f; HTTP基本概念 HTTP 是什么&#xff1f; HTTP 是超文本传输…

基于Springboot的果蔬作物疾病防治系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的果蔬作物疾病防治系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

4.【Orangepi Zero2】Linux定时器(signal、setitimer),软件PWM驱动舵机(SG90)

Linux定时器&#xff08;signal、setitimer&#xff09;&#xff0c;软件PWM驱动舵机&#xff08;SG90&#xff09; signalsetitimer示例 软件PWM驱动舵机&#xff08;SG90&#xff09; signal 详情请看Linux 3.进程间通信&#xff08;shmget shmat shmdt shmctl 共享内存、si…

内容安全(DPI和DFI解析)

内容安全前言&#xff1a; 防火墙的本质其实就是包过滤&#xff0c;我们通常所说的安全设备&#xff08;如&#xff1a;IPS、IDS、AV、WAF&#xff09;的检测重心是应用层。下一代防火墙基于传统防火墙的拓展能力&#xff0c;就是可以将以上的安全设备模块集成在一起&#xff0…

HackMyVM-Animetronic

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 feroxbuster steghide exiftool hydra ssh连接 提权 系统信息收集 socat提权 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 08:00:27:9d:6d:7…

anaconda虚拟环境pytorch安装

1.先创建conda的虚拟环境 conda create -n gputorch python3.102.激活刚刚创建好的虚拟环境 conda activate gputorch3.设置国内镜像源 修改anaconda的源&#xff0c;即修改.condarc配置文件 .condarc在 home/用户/user/ conda config --add channels https://mirrors.tuna.…

题目----力扣--移除链表元素

题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; 输入&…