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