openeuler-riscv / oerv-team

OERV 实习生工作中心
6 stars 35 forks source link

micro-ros2 组件调研 #843

Open Jer6y opened 1 week ago

Jer6y commented 1 week ago

说明

问题背景:

需要完成的内容

涉及软件包:

涉及软件包地址:

所需技能:

其它:

1291945816 commented 2 days ago

一、相关背景(ROS)

考虑到micro-ros组件的设计,其实也参考了ROS2的抽象层源码,此处简单地对ROS相关内容做个介绍。

ROS2的前身是ROS,它的英文全称为“Robot Operating System”,是一个适用于机器人的开源的元操作系统。利用ROS提供的软件库、工具能够帮助开发者更好地实现机器人各部件之间的高效控制与管理。

image-20240625223636626

1 ROS2 发行版

下面主要列出当前支持的发行版。

Distro Release date EOL date
Jazzy Jalisco May 23rd, 2024 May 2029
Iron Irwini May 23rd, 2023 November 2024
Humble Hawksbill May 23rd, 2022 May 2027

2 ROS2与ROS1

系统架构

ROS2是对ROS1的改进,两者的架构区别如下所示:

image-20240625224041334

DDS通信

ROS2相比ROS1变化比较大的地方,通信系统可以说是其一,因为基于TCP/UDP的通信系统频繁诟病于延迟、丢数据、无法加密等问题,故在ROS2中选择了DDS,它能够在通信层面提供更为丰富的功能支持。DDS(Data Distribution Service)是一种以数据为中心的分布式通信协议,它采用的通信方式是多对多的单向数据交互,通信模型为分布式结构,没有中心节点,在同一个数据空间任何两个节点之间都能直接通信

ROS2的整体架构概览如下图所示:

image-20240625231646360

因为DDS仅仅是一个标准,不同公司有不同的代码实现,如Fast DDS (eProsima)、Micro XRCE-DDS (eProsima)等,为了保证替换不同厂家提供的DDS,不用修改上层的ROS2代码,ROS2设计了一个ROS Middleware,简称RMW,提供了一个标准接口(比如收数据、读数据以及属性配置等),后续厂家的接入只需要按照标准写对应的接口即可。

而在RMW之上就是RCL(ROS Client Library),因为RMW提供了标准接口,底层具体的DDS实现被替换时,RCL是无感知。此外,RCL可以向上层提供多种语言的支持,比如Python、Java、C++。

从这个架构可以分析到:如果一个RTOS想要移植ROS2,那么就需要提供一个具体的DDS实现,和对应的RMW

二、micro-ros组件

micro-ros组件的目标是:puts ROS 2 onto microcontrollers(将ROS2放到微控制器上)

它具备如下的特点:

  1. 是运行于MCU硬件平台上的ROS2,提供主要的ROS2 API支持
  2. 支持多种RTOS并提供通用的构建系统
  3. 是极度资源受限但灵活的中间件

1 micro-ros 分层模块架构

下图中的ROS 2 stack可以参考第一节中ROS的架构图。

image-20240627232202957

上图的浅蓝色模块是参考自ROS2,而深蓝色部分则是micro-ros所特有的部分。

在前面提到过,假设针对某一个平台移植ROS2(主要由RCL、RMW、DDS组成),就需要实现一套RMW+DDS组合。RCL不用考虑的原因在于ROS2已经提供了一个针对不同DDS实现的一个抽象层了(RMW)。

而在micro-ros中,它一样是类似于ROS2的分层结构:

2 eProsima Micro XRCE-DDS

从整个micro-ros的层级结构来看,其实更为关键的是对RMW的实现,也即 DDS-XRCE protocol 的实现。通过这个协议,micro-ros可以加入到DDS世界中,进而得以与一些像ROS2这样的节点进行通信。

micro-ros组件的中间件构成中采用的DDS是专门针对微控制器优化的DDS-XRCE协议,该协议能够允许资源受限的设备(如微控制器)像任何其他 DDS 参与者一样与 DDS 世界进行通信。它采用通信模型 是Client/Server架构,分别由Micro XRCE-DDS ClientMicro XRCE-DDS Agent扮演对应的角色提供相应的功能。

它们之间的关系见下图: Concept

其中,Micro XRCE-DDS Client(下文称Client)比较轻量,可以在资源有限的环境中编译,而Micro XRCE-DDS Agent(下文称Agent)是一个负责连接Client与DDS 世界的代理。

所以在运行了ROS2的常规系统中,需要运行一个Agent来负责MCU上运行的micro-ros与ROS2的连接。

从上图可以看到,Agent相当于一个代理,Client通过向Agent发起请求操作来发布/订阅来自DDS世界中的topic,符合DDS标准的RPC也是可以支持的。而Agent会处理这些请求,并返回对应的状态以及请求数据。为了实际代理客户端的请求操作,Agent会在DDS世界创建一个负责跟踪代理的客户端的实体,也通过它来与其他参与者进行通信。

ClientAgent之间的通信借助于内置的几种通信方式:

  1. UDPv4, UDPv6
  2. TCPv4, TCPv6
  3. Serial
  4. 自定义

而针对不同的平台,对于这种通信协议的实现也是不一样的,故针对这些通信方式协议的实现是移植的关键

General

三、移植可行性分析

结合第一、二部分的内容易知,micro-rosROS2轻量级实现,提供了主要的ROS2功能,此外,两者的层级也是非常类似的。在第一部分提到,ROS2为了尽可能地适配不同DDS的实现,提供了抽象层RMW,负责规定主要的读数据、写数据以及属性配置的接口,进而使得移植ROS2只需要提供DDS的实现以及对接RMW接口即可。

分析micro-ros的层级结构:

层级结构

micro-ros专门针对资源有限的嵌入式平台实现了DDS-XRCE protocol,即Micro XRCE DDS,以及RMW的对接,简单来说,micro-ros已经规定了DDS协议以及提供了实现,故尽管micro-ros类似于ROS2,但无需满足移植ROS2的要求。

而从第二部分中针对eProsima Micro XRCE-DDS的分析提到,ClientAgent之间的通信于底层的TCP/UDP/Serial等协议的支持,所以需要在移植的平台提供对应的协议实现

针对来自micro-ros在arduino上的移植分析易知,它的主要工作如下:

涉及到的依赖库:

https://github.com/ament/ament_cmake.git ad972e113c9c561bf32280b3baefe484ef684589
https://github.com/ament/ament_index.git 0ed743ad9e3b583d975ffcde0b57de8a0b1204ae
https://github.com/ament/ament_lint.git 1dc1dd14af5edf52bb9c18e5453eff4d2ddc0ad6
https://github.com/ament/ament_package.git 35b15ae4d8c5e1dbb6ab622ff95d046aa3ca1b28
https://github.com/ament/googletest.git 449327bfc17e58db5ce53955b8e250427909a1c8
https://github.com/ament/uncrustify_vendor.git 84edaca76d32c3ed20ce7097ed91784029530306
https://github.com/eProsima/Micro-CDR.git ed4fd513a24a53b93d548d342cb7aa0a18716f04
https://github.com/eProsima/Micro-XRCE-DDS-Client.git 83f129a80770a09aac9e823896ecbf6a0eddf0fc
https://github.com/micro-ROS/micro_ros_msgs.git 4594d9db17db735b1e655141fb4afb4cdcfc5789
https://github.com/micro-ROS/micro_ros_utilities aa799eea0a63edfc1665cdcb1e9053827b69c730
https://github.com/micro-ROS/rcl eacfc8543ff11ea3f9bf5e30246c6793c5e352d2
https://github.com/micro-ROS/rcutils 9b5bd96bf22c1934c82692c17ea8bbef1bd4d980
https://github.com/micro-ROS/rmw-microxrcedds.git 554445fe739e4c5bcb27753ffbe21e03bb2c3c1f
https://github.com/micro-ROS/rosidl_typesupport.git 23f15cd3897f81f7e4938c303a7abbe7d06801ec
https://github.com/micro-ROS/rosidl_typesupport_microxrcedds.git 6243b9f89e40ba4742c757951d7195f3d7745819
https://github.com/ros-controls/control_msgs 1416954c31432c192ff95a06559847e87386cf60
https://github.com/ros2/ament_cmake_ros.git 15f835d0e31354c4ac958a32b5f1caa4246596a5
https://github.com/ros2/common_interfaces.git 784c48971ed8e95d27f86df26d4e893adddf433d
https://github.com/ros2/example_interfaces.git 4d7d086e4791e1839fecb9c50a1291d4056b916f
https://github.com/ros2/libyaml_vendor.git dbba913fdbdcfb5388c335619ca66eb4d891e59e
https://github.com/ros2/rcl.git 00c29cd6e72caae36e1e749a8c02558ee709a275
https://github.com/ros2/rcl_interfaces.git 003987ecb81a32802ab27dd6d325b8c6b8b813cc
https://github.com/ros2/rcl_logging.git 128d88e6e4ad6df97405564afbdffa2ebc167814
https://github.com/ros2/rclc 995cda8c68456c7477ed103d9419a161fd068960
https://github.com/ros2/rcpputils.git 747b92f911cc3b338b6a73ad880e95c6be17075d
https://github.com/ros2/rmw.git c90c29700291eb975688326a31f8915803cf277d
https://github.com/ros2/rmw_implementation.git 1dee258b57112326fd0e1f9a36f12731e0aaa25f
https://github.com/ros2/ros2_tracing.git d7ce54b35c4442a5ddaf7e45ca3c1caee0d9e8f2
https://github.com/ros2/rosidl.git 15785db2423a4dd665ae8eb208e001368e2952c9
https://github.com/ros2/rosidl_core.git 84fa73d3974fe31fbe397e41e4449a31c2fb6ce4
https://github.com/ros2/rosidl_dds.git 8d6fdb365792c81861cf1d49da2d265e91dca86d
https://github.com/ros2/rosidl_defaults.git 65d0e79a6f477e22b7213590bc8d2465e16cedbf
https://github.com/ros2/rosidl_dynamic_typesupport.git cb8c54d12c678daa70410bb0626ed8626f561e45
https://github.com/ros2/test_interface_files.git c5941d36e977b75c8949c9d30883248246a84693
https://github.com/ros2/unique_identifier_msgs.git ced22ce6e0d197357b27157f35107f5b7173b272

进一步总结涉及的过程,可用下图描述:

移植涉及过程

其中浅绿色的是在移植过程需要关注的,而深蓝色的则是一些依赖库。

在Uniproton的驱动中是具备对串口、网卡支持的,结合以上分析,目前来看micro-ros的移植是可行的。

四、参考

  1. ROS: Home
  2. eProsima/Micro-XRCE-DDS: An XRCE DDS implementation. Looking for commercial support? Contact info@eprosima.com (github.com)
  3. 在 RTOS 上移植 MicroROS (ROS2) - CodiMD (wuhanstudio.cc)
  4. micro-ROS/micro_ros_arduino: micro-ROS library for Arduino (github.com)
  5. UniProton: A lightweight real-time operating system (gitee.com)