概述
目录
1 提要
2 从架构上说
2.1 通信协议不同
2.2 架构不同
2.3 ROS2多了一个rcl
3 从代码上看
3.1 依赖包区别
3.2 回调函数
3.3 主函数调用
4 通信体上看
5 从节点的生命周期
6 Launch文件的对比
1 提要
未来ROS2将越来越火,而ROS1将要退出历史;小米、华为都普遍用上ROS2了,然而,ROS2资料奇缺,我这里将从国外资料筛选出一些关键的信息,提供给那些能够快马加鞭的骑手们。
2 从架构上说
2.1 通信协议不同
ros1用的是TCP和UDP协议,而ROS2用DDS协议;DDS是专用总线协议,更快更明快的通信。
2.2 架构不同
ROS1需要Master也就是roscore那玩意;roscore可以理解成通信交换机,用户的通信全部集中在Master交换。从另一个角度上说roscore也是一个节点,与你自己编写的节点无等级差别。
2.3 ROS2多了一个rcl
用户依赖于rclpy和rclcpp包,这两个包负责与rcl通信,而rcl是由DDS协议支撑的。
在下图清楚地表达了他们之间区别。
3 从代码上看
以下我们从实现“number”题目的程序为例,看ros1和ros2的代码区别是什么。
3.1 依赖包区别
以上代码是我们自己的节点,从上面代码上看到,ros1不需要包含rcl类型,因为默认roscore(Master)已经启动,而ROS2没有Master的概念,因此,都必须将自己节点定义成rcl,而rcl节点之间是可以通信的。
3.2 回调函数
基于ROS1的回调函数框架:
import rospy
from std_msgs.msg import Int64
from my_robot_msg.srv import ResetCounter
counter = 0
def callback_number(msg):
global counter
counter += msg.data
rospy.loginfo("Counter: "+str(counter))
def callback_reset_counter(req):
if req.reset_value >=0:
global counter
counter = req.reset_value
rospy.loginfo("Counter: " +str(counter))
return True
return False
if __name__ == '__main__':
rospy.init_cnode('numner_counter')
sub = rospy.Subscriber("number",Int64,callback_number)
reset_service = rospy.Service("reset_counter",ResetCounter,callback_reset_counter)
rospy.loginfo("Number counter has been started")
rospy.spin()
基于ROS2的回调函数框架:
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from std_msgs.msg import Int64
from my_robot_msg.srv import ResetCounter
class NumberCounterNode(Node):
def __init__(self):
super().__init__("number_counter")
self.counter = 0
self.number_count_publisher_ = self.create_publisher(
Int64,"number_count",10)
self.number_subscriber=self.create_subscription(
Int64,"number",self.callback_number,10)
self.reset_counter_service = self.create_service(ResetCounter,"reset_counter",
self.callback_reset_counter)
self.get_logger().info("Number Counter has been started.")
def callback_number(self, msg):
counter += msg.data
self.get_logger().info("Counter: " + str(self.counter_))
def callback_reset_counter(self,request,response):
if request.reset_value >=0:
self.counter_ = request.reset_value
self.get_logger().info("Counter: " +str(counter))
response.success =True
else:
response.success = False
return response
def main(args = None):
rclpy.init(args = args)
node = NumberCounterNode()
rclpy.spin(node)
rclpy.shutdown()
if __name__ == '__main__':
mian()
3.3 主函数调用
4 通信体上看
ros1的最小运行单元是节点,从通信上看,ros1是节点机制,即节点之间都可以相互通信,因为每个节点可以与master通信;而ros2的最小运行单元是可执行对象,每个可执行对象内部可以包含若干个组件,组件与组件能实现通信。
5 从节点的生命周期
ros1中的节点是没有生命周期的,什么时候启动,什么时候退出,节点本身没有控制权,控制权在使用节点的那个主体上,节点是纯被动的。
ros2开始有了生命周期的概念,即节点有未配置状态,未激活状态,激活状态,以及冰冻状态;显然,ros2的节点已经是一个多线程管理机制,内部有状态机组织。
6 Launch文件的对比
对比看出,两种launch文件差别很大:
1)ros1的launch文件如下:
2)ros2的launch文件是个python脚本
后续内容:
ROS2系列(03):ROS1和ROS2的区别【02】
最后
以上就是酷酷荔枝为你收集整理的ROS2系列(03):ROS1和ROS2的区别【01/2】1 提要2 从架构上说 3 从代码上看4 通信体上看 5 从节点的生命周期6 Launch文件的对比的全部内容,希望文章能够帮你解决ROS2系列(03):ROS1和ROS2的区别【01/2】1 提要2 从架构上说 3 从代码上看4 通信体上看 5 从节点的生命周期6 Launch文件的对比所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复