1、ros2和ros的区别

对比整个系统的话区别涉及到很多方面,从应用系统来说列举几个比较大的方面:

  • ros1 组件用c++/python,ros2 组件用c/python;
  • ros1 只支持Linux,而 ros2 支持Linux/Windows/MacOS/RTOS;
  • ros1 的通讯基于TCPROS/UDPROS,强依赖于master节点的处理,而 ros2 基于dds
  • ros2 使用了新的编译系统 Ament;

其中比较重要的就是ROS1中所有节点都需要在节点管理器ROS Master的管理下进行工作,一旦Master出现问题,系统就面临宕机的风险,ROS2实现了真正的分布式,不再有Master这个角色,借助一种全新的通信框架DDS,为所有节点的通信提供可靠保障。

2、ros2的架构

主要是介绍几个概念:

1)fastdds

fastdds是eProsima对OMG定义的DDS的实现,该通信主要是实现了跨域的发布订阅消息

2)RMW

由于Ros2的通信使用了dds通信,而dds是OMG制定的标准协议,OMG定义了dds的实体、关系和和功能,但是实际实现上各个dds的实现和管理不尽相同,更难的是各个实现的接口并不统一。ROS为了适配这些实现,ROS2提出来中间层接口的概念即RMW,是ROS2 软件堆栈和底层中间件实现之间的接口,让ros内核开发者不再关系底层通信的实现;

3)RMW_impl

相应的中间层接口提出后,dds实现者为了适配ROS2,同样需要将自身实现的功能接口对应到中间层的通用接口,于是有了RMW的的接口实现,通常该部分由dds实现者去实现

4)rcl

是一个级别稍高的 API,用于实现客户端库,不直接接触中间件实现,它调用RMW层,ROS客户端库接口(API)可以被上层客户端库(例如rclc,rclcpp,rclpy,等)使用,以避免重复逻辑和功能。 通过重用API,客户端库可以更小,彼此更一致。但由于一下特定于语言的实现的原因,客户端库还会应该提供一个语言惯用解决方案,如 C,in C++11 和 Python 中。 以上,RCL接口提供不特定于语言模式且不特定于特定消息类型的函数。

5)rclcpp

上一节说过了RCLros的客户端库,但是真正使用时,用户往往是基于特定语言编程,常用的rclcpp就是在rcl的基础上又扩展ros的线程和一些C++的类型库。

5)rcl_utils

在上层开发中,往往会遇到遇到一些和底层通信无关和系统无关。但是又经常用到的一些逻辑接口;ros为方便上层调用,实现了rcl_utils,它由整个 ROS 2 代码库中使用的宏、函数和数据结构组成。 它们主要用于错误处理、命令行参数解析和日志记录,它们不特定于客户端或中间件层,可以由两者共享;

如上图,直接的展示了ros2现有的代码架构,最上层是用户程序,在实现通信时,用户程序通过调用rcl,rcl调用rmw, rwm交由具体的dds实现去完成通信。

3、ros2的命令行是如何实现的

ros的强大,不光是因为ros提供了跨域的通信方案。更重要的是提供了几乎全面的调试工具,而这其中比较常用的就是ros的命令行。我们都知道ros1由于基于Mastor的软件运行环境和ros通信本身,所以开发命令行工具来说是比较简单的。

(对于ROS2来说,实现CLI工具的有两个阻碍:一是由于dds通信的发现机制不在依赖Master,往往需要PDP和EDP互相发现才能完成点对点的通信。如果CLI程序自行去发现节点和消息发送接收,需要等待一段时间,完成节点匹配;二是由于序列化的问题,CLI工具需要自行维护msg的定义或序列化库,导致程序臃肿)

ros1通信是基于守护进程的,虽然ros2的通信不在需要守护进程的参与,但是守护进程作为ros2的补充仍然存在于ros2中,这其中最重要的功能就是监听发现协议流量并记录哪些节点是活动的以及它们在哪里。然后,当一个新节点想知道其他节点在哪里时,它可以绕过自己的 DDS 发现过程,并联系已知端口上的 ROS 2 守护进程并询问它的节点信息。

正常来说,一个基于C++开发的ros2应用系统是如上图的程序架构。守护进程和CLI是基于python开发的。守护进程通过rclpy与系统内其他节点通信。

4、实现类似ros2的中间件系统,有哪些工作、有哪些阻塞点

1)开发cli,需要熟悉python开发

2)解决msg文件的共享和交叉编译调试问题

3)选用合适的dds qos适配上层应用程序

————————–以上内容仅为个人的浅显理解,如有错误,望提醒更正—————————-