我是靠谱客的博主 酷酷荔枝,最近开发中收集的这篇文章主要介绍ROS2系列(03):ROS1和ROS2的区别【01/2】1 提要2 从架构上说 3 从代码上看4 通信体上看 5 从节点的生命周期6 Launch文件的对比,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

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文件的对比所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部