【ros/ros2】ros1和ros2的区别-要点记录

news2024/12/29 14:02:14

 

dds = data distribution service,数据分发服务

rcl = ros client libraries,ros客户端库文件

rmw = ros middle ware interface,ros中间件接口

lcn = life cycle node,生命周期节点,受控节点

lmn = lifecycle management node,生命周期管理节点,控制节点

qos = quality of service,服务质量

idl = interface definition language,接口定义语言

 

1. 操作系统

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

2. 系统架构

  • 系统架构可以分为三层:系统层、中间层、应用层
  • 主要区别体现在中间层:

(1)DDS = DDS实现层
DDS实现层,由各个厂商提供相应的DDS软件产品;
该层的目的是为了让用户可以根据自己实际需求选择不同厂商

(2)RMW = 抽象的DDS层
中间接口层,由C语言实现,直接和DDS交互,并向ros2 client层提供API接口;
该层的目的是让用户程序可以在不同供厂商的DDS之间进行无感移植

(3)RCL = ROS2 Client层
该层包含ROS2核心概念如Node、Action等的具体实现,以及不同编程语言如C++、Python和Java等API接口:rclcpp/rclpy/rcljava;
包含RCL库和不同的编程语言API,RCL库是一致的由C语言实现,编程语言API接口 是独立的,从而保证了不同编程语言下程序运行的一致性

3. 通信模型

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

4. 构建系统

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

5. 节点发现

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

6. 进程节点数

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

7. 生命周期节点

  • 为了解决ros1中节点启动顺序无法控制的问题,ros2引入了生命周期节点的概念;

  • ros2提供了两种节点类型:
    (1) Node:和ros1中一样的节点基类
    (2) LifecycleNode:可管理状态的节点基类

  • 声明周期节点有4个基础状态和6个切换状态,不同状态之间转换关系如下

  • 不同状态之间的转换需要调用对应的回调函数如OnConfigure()等来实现,这些函数在对节点进行LCN改写时需要重新实现,即将不同功能划分到不同函数进行控制
  • LMN和LCN之间通过service模式进行通信,LMN作为client,LCN作为server,LMN发起service request给LCN请求LCN状态转移操作
  • 节点运行时ros2会为每个节点配置默认的service,LCN会有特殊的service配置如
    change_state、get_state等
  • 命令行进行节点状态切换:

8. 节点launch启动

  • ros1使用xml编写launch启动文件,roslaunch package_name launch_file.launch

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

9. 服务service动作action和参数parameters

9.1 服务
  • ros1中service是同步的,当客户端向服务器发起请求时,等待响应期间会强行阻塞程序,直到服务器响应/或失败,完全无法获知服务端的处理进度,更不能取消或变更请求

  • ros2中的service是异步的,一个server可支持多个client,但每次只能响应一个request。client在调用服务请求时会添加一个回调函数,在服务端response时触发,在这期间主线程不会阻塞

9.2 动作
  • ros1中action机制是运行服务端和客户端异步请求,采用无阻塞的编程方式;

  • ros2中action是一个上层的沟通机制,action包括三个部分:目标、结果和反馈。由topic和service共同构建

9.2 参数
  • ros1中的参数由参数服务器处理,而参数服务器本身由master处理;
  • ros2的参数是由service构建出来,因为ros2中没有master,也就没有参数服务器。ROS2不再有全局参数,每个参数都特定于一个节点,每个节点声明和管理自己的参数,这些参数在节点被杀死时被销毁

10. 服务质量QoS

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

11. 服务质量QoS

  • ros1中msg、srv和action并没有统一定义为接口;
  • ros2引入通信接口的概念,接口用来描述不同节点之间交换信息的数据结构,这些数据结构以与编程语言无关的方式进行定义。ros2的通信接口包含topic+msg+srv+action,这些接口都通过对应接口文件进行定义。通过IDL来映射通信接口,IDL可以自动地生成不同目标语言的接口类型的源码
  • ros2使用json文件格式定义ros消息内容、topic和qos配置
  • 使用同样的json文件,通过统一脚本可实现代码生成并完成qos的设置,不同编程语言可以生成不同的接口文件,完成msg->hpp的转换;另外,相同的json文件使用不同的ros2版本编译生成的接口文件是有区别的,跨版本直接拷贝接口文件使用会报错

12. 工具

12.1 命令行
  • ros1的命令行语法:rosbag play xxx, rostopic xxx, rosnode xxx等

  • ros1常用命令汇总

  • ros2的命令行语法:ros2 bag play xxx, ros2 topic xxx, ros2 node xxx等

  • ros2常用命令汇总

12.2 rqt可视化工具+rviz
  • rqt工具ros1和ros2命令保持一致;ros1是rviz,ros2是rviz2,名称变了,其他保持一致
12.3 仿真平台
  • ros1采用Gazebo作为仿真平台,Gazebo 11为最终版将于2025年停止维护;
  • ros2采用Ignition作为仿真平台,Ignition为Gazebo新一代版本

13. 代码结构

  • ros1代码到ros2的迁移,需要修改代码结构、cmakelists.txt、package.xml、ros2头文件库文件替换等,这部分会在后续文章中进行总结 - To Do

 


【参考文章】
ros1和ros2区别概述
ros1和ros2的区别
ros1和ros2对比
ros1和ros2对比

created by shuaixio, 2023.05.11

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

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

相关文章

C++二叉树递归方法存入和三种递归方法读出(前序,中序,后序)

#include <stdio.h> #include <malloc.h> typedef struct op //定义子树结构 { int data; struct op *lchild; struct op *rchild; }treestruct; treestruct *createtree() //这里这种表达形式意思是bittree类型的函数 最终要返回bitt…

【Linux】版本管理器Git

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;Linux的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、Git是什么二、Git有什么…

开源C#代码生成器,专注.NET,Sqlserver,最简单,最干净,支持自编码的开源工具,SmartSoftHelp 开发辅助优化工具

开源C#代码生成器&#xff0c;专注.NET&#xff0c;Sqlserver&#xff0c;最简单&#xff0c;最干净&#xff0c;支持自编码的开源工具&#xff0c;SmartSoftHelp 开发辅助优化工具&#xff01; 下载地址&#xff1a;https://pan.baidu.com/s/1XLL_fLxVTw4erYZLj8-MzA?pwd888…

搭建python运行环境

安装Miniconda3 清华镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/ 下载 安装 next————agree————这俩选哪个都行&#xff0c;他选的第二个————安装路径———— 配置系统环境变量 Path miniconda3所在的路径 D:\Autils\miniconda3 Scri…

ChatGPT 最有可能取代哪些职业?

ChatGPT 的应用场景ChatGPT 最可能取代哪些职业&#xff1f;写在最后 ChatGPT 的应用场景 ChatGPT 的应用场景大体上可以归类为三大模块。 第一类是 代码相关 的任务场景。包含程序语言之间的相互转换&#xff08;如 python 转 java&#xff09;、程序命令的生成、代码 bug 的…

Gateway新一代网关

Gateway功能&#xff1a;路由 过滤 一、概述 官网地址 不使用网关存在的问题&#xff1a; 1、客户端需要记录不同微服务地址&#xff0c;增加客户端的复杂性 2、每个后台微服务都需要认证 3、http 发请求&#xff0c;涉及到跨域 4、后台新增微服务&#xff0c;不能动态知道地…

【持久层框架】mybatis-plus超详细讲解

文章目录 一、简介二、愿景三、特性四、支持数据库五、快速指南步骤1、创建数据库 mybatis_plus2、导入相应的依赖3、连接数据库4、编写代码5、小结 六、配置日志七、常用注解八、CRUD扩展Insert 插入参数说明主键生成策略分布式系统唯一id生成雪花算法主键自增 更新操作参数说…

纪念一下自己做的第一款开发板

文章目录 1. 硬件电路2. 成品展示3. 遇到的问题4. HelloWorld 前言&#xff1a;之前乐鑫搞活动白嫖了10个ESP32-S2模组&#xff0c;想着把它给利用了&#xff0c;然后先从一个开发板做起&#xff0c;等玩明白了再去做一些自己的设计&#xff0c;从网上找了一些资料就开始干&…

【★前后端的交互★】Servlet API

欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#xff1a;重难点★✔ 蓝色文字表示&#…

了解一下Spring核心概念——IOC IOC容器 DI Bean

文章目录 1 Spring家族2 Spring发展史3 Spring系统架构3.1 系统架构图3.2 学习路线 4 Spring核心概念4.1 目前项目中的问题4.2 IOC、IOC容器、Bean、DI4.2.1 IOC&#xff08;Inversion of Control&#xff09;控制反转4.2.2 DI&#xff08;Dependency Injection&#xff09;依赖…

(免费分享)springboot,vue物业管理系统

一、项目技术 后端框架&#xff1a;springboot 前端框架&#xff1a;elementUIvue 主要实现了用户登录、社区信息展示、物业公告、社区设施、物业人员信息。 进入物业系统管理后端。实现了社区的管理&#xff0c;包括基本信息管理、周边设施管理、物业公告管理。楼盘管理包括楼…

AI对话-Free Chat免费无限制

目录 前言 使用方法 提问 推荐线路 前言 chat.4 和 chat.5 线路的响应改成通过在 Netlify 的部署来响应了。Netlify 不像 Vercel 那样还限制 Edge Function 的调用次数,很适合部署本项目。现在这两个线路的成本最低了,最优先推荐大家使用。 使用方法 提问 比如我问他:…

docker学习笔记(3)

目录 Docker命令 进程相关命令 镜像相关命令 查看镜像 Docker 数据管理 数据卷 大家在使用Xftp的时候&#xff0c;千万要先用本地端ping一下虚拟机IP&#xff0c;不然你在那里创建几次都没有用。 Docker命令 进程相关命令 # 启动Docker命令 systemctl start docker # 停…

网络基础学习:ip地址的知识

网络基础学习&#xff1a;ip地址的知识 IP地址是什么&#xff1f;如何查询计算机ipip分为几类IPv4和IPv6IPv4和IPv6的通信 IP地址是什么&#xff1f; IP地址是指用于标识在网络上的设备或节点的一组数字&#xff0c;它是Internet协议&#xff08;IP&#xff09;中使用的一种地…

【C++】C++入门知识

&#x1f601;作者&#xff1a;日出等日落 &#x1f514;专栏&#xff1a;C 不要去等谁&#xff0c;所有的不期而遇都在路上。 前言 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&…

通过点云获取碰撞向量

T&#xff1a;what Y&#xff1a;why W&#xff1a;how Y 针对点云的无序性&#xff0c;无法通过坐标索引进行查询&#xff0c;常常将点云地图转换其他类型的地图&#xff0c;如Octomap&#xff0c;从而进行碰撞检测&#xff1b; W 为快速进行机器人与障碍物的位置计算&…

C高级day3

1.编写一个名为myfirstshell.sh的脚本&#xff0c;它包括以下内容。 1、包含一段注释&#xff0c;列出您的姓名、脚本的名称和编写这个脚本的目的 2、和当前用户说“hello 用户名” 3、显示您的机器名 hostname 4、显示上一级目录中的所有文件的列表 5、显示变量PATH和HOM…

【前端技术】Vue3 02:基础语法

接下来介绍下 Vue 的基础语法&#xff0c;包括渐进式框架、单文件组件、组合式 API 和选项式 API等基础要点和 v-xx 指令和其余基础语法&#xff0c;这和官方教程的顺序不大一致&#xff0c;我认为先学习 v-xx 指令可能更有助于大家的理解及学习。 目录 1 前言 1.1 单文件组件…

【Linux】Linux中的编辑器vim

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;Linux的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、vim的概念二、命令模式2…

SpringBoot【开发实用篇】---- 数据层解决方案

SpringBoot【开发实用篇】---- 数据层解决方案 1. SQL数据源技术持久化技术数据库技术 2. NoSQLSpringBoot整合Redis安装基本操作整合 SpringBoot整合MonggoDB安装基本操作整合 SpringBoot整合ES安装基本操作整合 开发实用篇前三章基本上是开胃菜&#xff0c;从第四章开始&…