【ROS2概念】系列(七)——微控制器上用于 ROS2 的 micro-ROS

  • 一、概念
  • 二、功能和架构
    • 2.1 Micro-ROS核心架构
    • 2.2 Micro-ROS Agent
  • 三、如何使用Micro-ROS
    • 3.1 硬件平台
    • 3.2 烧写程序步骤
    • 3.3 在ubuntu上运行程序
  • 四、如何自己写嵌入式固件的程序
  • 五、Micro-ROS嵌入式平台案例
    • 5.1 Kobuki
    • 5.2 Demo Box
    • 5.3 MoveIt 2
  • 六、附录
    • 6.1 项目官方支持的三个 RTOS
      • 6.1.1 Free RTOS
      • 6.1.2 Zephyr
      • 6.1.3 NuttX
    • 6.2 支持Micro-ROS的第三方工具
      • 6.2.1 构建系统
      • 6.2.2 特定平台的 micro-ROS 独立模块有:
    • 6.3 支持Micro-ROS的嵌入式平台
      • 6.3.1 官方支持的硬件平台
      • 6.3.2 社区支持的硬件平台
      • 6.3.3 第三方平台
  • 七、其它嵌入式DDS

一、概念

micro-ROS是一组软件库,可以将机器人应用程序的开发部署到通常计算资源有限的微控制器上。micro-ROS 框架专为与 ROS 2 一起使用而设计,可用于在单独计算上运行的 ROS 2 节点与在微控制器(例如 Arduino)上运行的 micro-ROS 应用程序之间进行双向通信。

二、功能和架构

Micro-ROS 由完善的组件组成:著名的开源 RTOS标准化中间件标准 ROS 2 客户端支持库 (rcl)

下图为Micro-ROS与ROS2 节点通信的架构图,图中左侧为ROS2 节点,图中间为Micro-ROS节点,其中深蓝色组件专为 micro-ROS 开发,浅蓝色组件取自标准 ROS 2 堆栈。

micro-ROS与主ROS 2系统之间通过client-server模式连结,通过一些标准的串口协议(UART,USB,Network等)以及DDS-XRCE( eXtremely Resource Constrained Environments)标准的RTPS(Real-time Pub/sub)协议实现micro-ROS与主Agent(ROS 2系统)的topic通信。

2.1 Micro-ROS核心架构

图中间为Micro-ROS核心架构,最下面Microcontroller代表微控制器,如STM32,接着在微控制器上运行RTOS(Real-Time Operating System),如FreeRTOS、Zephyr或NuTTX这类具有POSIX接口的RTOS,值的一提的是,由于Arduino已经集成了Micro-ROS的库,Arduino不需要运行RTOS,裸机也可以使用Micro-ROS。

Micro-ROS与ROS2类似,采用DDS作为中间件,同样具有ROS Middleware Interface(RMW)层,通过不同的DDS 适配器(Adapter),可实现无感切换DDS厂商。

Micro-ROS默认采用的DDS是Micro XRCE-DDS,该DDS是由eProsima公司针对嵌入式系统对中间件的要求定制化开发的一种中间件。

eProsima Micro XRCE-DDS( eXtremely Resource Constrained Environments DDS)是一个实现由 OMG 定义和维护的DDS-XRCE 协议的库,其目的是允许资源受限的设备(例如微控制器)像任何其他 DDS参与者一样与DDS世界进行通信。它遵循客户端/服务器范例,由两个库组成,Micro XRCE-DDS Client和Micro XRCE-DDS Agent。Micro XRCE-DDS Client是轻量级实体,旨在在极受资源约束的环境上编译,而Micro XRCE - DDS Agent则是 Micro XRCE-DDS与DDS世界的Bridge。

Micro XRCE-DDS中间件内置了对串行传输、以太网上的 UDP、Wi-Fi 和 6LoWPAN 以及蓝牙的支持

Micro-ROS的ROS API为C语言接口,提供了标准 ROS 2 客户端支持库 (rcl)和rclc。

通常,rcl接口提供的功能不特定于具体编程语言模式,也不特定于具体的消息类型。rclc是在rcl基础上,根据rcl的API利用C语言定义了一些函数,如线程操作pthread,node,graph等函数功能。

最后使用调用该ROS API自定义开发的应用组件程序(C 编程语言)。

2.2 Micro-ROS Agent

图左侧最下面Up代表物理机,如x86或ARM等,接着配上OS,如ubuntu系统,然后在ubuntu上运行ROS2 Stack,并运行Micro-ROS Agent,最后使用自定义开发的应用组件程序。

Micro-ROS Agent是一个封装了Micro XRCE-DDS Agent的 ROS 2 节点(Micro-ROS Agent是micro-ROS在维护,Micro XRCE-DDS Agent是eProsima在维护)。

该节点在ROS2的DDS 网络层充当和 MCU上运行 Micro-ROS 节点之间信息交互的服务器。它通过串口或网口从 Micro-ROS 节点接收和发送消息,并将这些消息暴露给 ROS 2 网络的其它节点。

该节点代表MCU上的Micro-ROS 节点与 DDS 全局数据空间进行交互。


Micro XRCE-DDS Agent从Micro XRCE-DDS Client接收包含请求操作的消息,以发布和订阅 DDS 全局数据空间中的主题。还支持由DDS-RPC 标准定义的远程过程调用,允许根据请求/回复范式进行通信。然后,Agent处理这些请求,并在订阅/回复操作的情况下发回带有操作状态结果和请求数据的响应。

上图中展示了Micro XRCE-DDS Client和Micro XRCE-DDS Agent之间的通信是通过几种内置传输方式实现的:UDPv4、UDPv6、TCPv4、TCPv6和串行通信。此外,用户还可以生成自己的自定义传输。可以通过构建项目时生成的独立可执行文件来启动使用任何这些内置传输的代理,该可执行文件带有内置 CLI 工具,可以在上面列出的传输中进行选择。

三、如何使用Micro-ROS

3.1 硬件平台

一般地,micro-ROS是跑在一块独立的嵌入式控制板上,而标准的ROS 2系统跑在通用型主板上。控制板跟主板之间通过一些标准的串口总线(如Ethernet,BT, UART等)连结,在ROS 2 Agent模块作为桥梁,将控制板跟主板的标准ROS 2系统之间贯通。

下图虚线左侧为嵌入式控制板,右侧为通用型主板,一般为PC。

3.2 烧写程序步骤

  1. 创建一个 micro-ROS 工作空间并安装micro_ros_setup包:
    mkdir uros_ws && cd uros_ws
    git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup

  2. 创建micro-ROS + Olimex STM32-E407 + Zephyr 固件:
    ros2 run micro_ros_setup create_firmware_ws.sh zephyr olimex-stm32-e407

  3. 配置固件以使用openmanipulator_tof预安装的应用程序和通过 USB 传输的串行
    ros2 run micro_ros_setup configure_firmware.sh openmanipulator_tof --transport serial-usb

  4. 构建固件:
    ros2 run micro_ros_setup build_firmware.sh

  5. 烧录固件
    ros2 run micro_ros_setup flash_firmware.sh

总结:上述步骤中2和3是针对特定嵌入式平台的程序,步骤1,4,5是micro-ROS固定的脚本,如何编写自己的嵌入式平台固件程序可以参考第四章节

3.3 在ubuntu上运行程序

1.启动ROS2程序
ros2 launch open_manipulator_x_controller open_manipulator_x_controller.launch.py

2.启动Agent
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/serial/by-id/usb-ZEPHYR_Zephyr_CDC_ACM_sample_3536510100290035-if00 -v6

3.启动嵌入式控制器上的程序(在PC上运行命令,节点在嵌入式平台上运行)
ros2 run open_manipulator_x_tof open_manipulator_x_tof

启动micro-ROS的程序包含三个步骤总结:

  • 1.启动自己的ROS2程序,用来处理与嵌入式平台上节点的信息交互和指令传输

  • 2.启动ROS2 Agent,作为server,将嵌入式平台的micro-ROS Client的 XRCE-DDS数据转成ROS2 DDS的数据,以便自己的ROS2程序能够正常交互。

  • 3.从PC上运行启动指令,唤醒嵌入式平台上的ROS2节点运行。

四、如何自己写嵌入式固件的程序

可以参考下,自己暂时没有实际需求,搁置!

五、Micro-ROS嵌入式平台案例

5.1 Kobuki

该演示的基本思想和工作原理如下: Kobuki 运行 STM32F4 微控制器,这个 STM32F4 运行 micro-ROS 堆栈和Thin_kobuki 驱动程序的端口,它与机器人的固件(在内置微控制器上运行)交互。STM32F4 通过 DDS-XRCE 将传感器数据传送到运行标准 ROS 2 堆栈、micro-ROS 代理和 rviz 的远程笔记本电脑。同时,使用另一个通讯方向,可以遥控Kobuki。

5.2 Demo Box

该用例包括一个 ROS2 控制的Raspberry Pi 4、一个 micro-ROS 控制的Olimex STM32-E407板、一个TFMini传感器,以及一个INA219传感器和一个平板显示器。TFMini用于测量到目标物体的距离,INA219传感器可以测量Raspberry Pi 4和Olimex STM32-E407 板的功耗。该演示探索了由微 ROS 控制的 Olimex STM32-E407 板测量物体距离或板载功耗数据,然后通过micro-ROS传回给Raspberry Pi 4,并在上面,使用标准 ROS 2 工具 (rqt) 可视化测量结果。

Raspberry Pi 4 运行 Linux 和 ROS 2 应用程序,而 Olimex STM32-E407 板运行 NuttX 和 micro-ROS 应用程序。它们都通过以太网 LAN 上的 UDP 发布传感器消息,将距离和功率数据发送到显示器。平板电脑运行 Linux、ROS 2 和一个micro-ROS Agent来接收这些消息。

5.3 MoveIt 2

该演示展示了 micro-ROS 和MoveIt 2之间的集成,MoveIt 2 是由PickNik创建和维护的机器人应用程序操作框架。

通过运行此演示,可以看到 MoveIt 2 操作和平面化算法如何由在 micro-ROS 中运行的姿势估计器中计算的位置(姿态)提供。这个姿势是通过使用来自惯性传感器的数据来计算的。最终结果使用 ROS 可视化工具 RViz 显示。

micro-ROS 在与Zephyr结合使用的STM32L4 开发物联网套件板中运行。该板提供了几个通用 I/O 引脚和外围设备,以将其 32 位微控制器与外部世界通信。它还包括许多传感器。在这个演示中,用了一个 6 自由度惯性测量单元 (LSM6DSL),它由一个加速度计和一个陀螺仪以及一个 3 自由度磁力计 (LIS3MDL) 组成。这些传感器获取的测量值的融合输出了板子相对于固定参考框架的位姿或相对方向。

然后将姿势数据转发到 ROS 2 世界,由 RViz 和 MoveIt 2 使用。RViz 在其图形界面中直接使用它来表示棋盘的位置和方向,而 MoveIt 2 使用它来计算运动根据其运动学算法,虚拟手臂必须执行才能“触摸”它。然后将产生的运动集成到 RViz 中,并通过其虚拟机械臂表示。

案例参考:https://micro.ros.org/docs/tutorials/demos/overview/

六、附录

6.1 项目官方支持的三个 RTOS

Micro-ROS 可以移植到任何带有 POSIX (可移植操作系统接口,Portable Operating System Interface,缩写为POSIX,X表明其对Unix API的传承)接口的 RTOS 上。

POSIX 是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO / IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由理查德·斯托曼(RMS)应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统接口)的缩写,而X则表明其对Unix API的传承。

Linux基本上逐步实现了POSIX兼容,但并没有参加正式的POSIX认证

项目官方支持的三个 RTOS:Free RTOS、Zephyr、NuttX

6.1.1 Free RTOS

FreeRTOS的设计小巧且简易,整个核心代码只有3到4个C文件,为了让代码容易阅读、移植和维护,大部分的代码都是以C语言编写,只有一些函数(多数是架构特定排班副程序)采用汇编语言编写。

FreeRTOS提供许多方法以实现多线程(threads)、多作业(task)、互斥锁(mutex)、信号量(semaphore)和软件计时器(software timer),有个为低耗电应用程序提供的无嘀嗒(tick-less)模式,线程的优先权管理也有支持

FreeRTOS中没有一些像Linux、Microsoft Windows等典型操作系统具有的先进特征,例如设备驱动程序、先进存储器管理机制、用户管理和网络管理,FreeRTOS着重在执行的简洁与速度,FreeRTOS有时会被视为是一个‘线程库’而非‘操作系统’,尽管可以找到命令行接口和类似POSIX I/O 接口的插件。

FreeRTOS实现了多线程,主程序会在规律的短时间区间内调用一个线程时计方法,这个方法会以循环制依照任务的优先级进行任务切换,一般来说,这个短时间区间介于 1/1000 秒与 1/100 秒之间,透过一个硬件时计中断来计时,但这个区间经常随着特定的应用而改变。

6.1.2 Zephyr

Zephyr 是一个相当新的开源 RTOS,在 Linux 基金会项目中开发。该项目的成员包括多家知名半导体公司。Zephyr 力求获得功能安全认证,这将使其成为第一个获得此类认证的开源 RTOS。

Zephyr 可以在本机 Linux、macOS 和 Windows 开发。

6.1.3 NuttX

NuttX 强调其符合标准(包括 POSIX)和占用空间小。它可以安装在 8 到 32 位微控制器上。POSIX 和 ANSI 标准的使用,以及它对 UNIX API 的模仿,使得它对习惯于 Linux 的开发人员很友好。NuttX 在 BSD 许可下获得许可,并使用 GNU 工具链。请注意,与 NuttX 一起使用的 uClib++ 库遵循更严格的 GNU LGPL 版本 3 许可证。

实时行为:完全可抢占;固定优先级、循环和“零星”调度

6.2 支持Micro-ROS的第三方工具

micro-ROS 提供的为嵌入式平台构建应用程序的方法有两种,第一种是采用专门的构建系统(build system)。构建系统集成了Micro-ROS相关模块,这些模块可在支持的平台上交叉编译基于ROS API开发的应用程序。另一种方法是生成独立的模块和组件,允许将 micro-ROS 集成到外部或自定义开发框架中,这可以通过专用于将 micro-ROS 编译为独立库的工具来实现。

6.2.1 构建系统

  • Vulcanexus

Vulcanexus是一个一体化的 ROS 2 工具集,用于轻松和定制化机器人开发。它在性能改进、模拟、云/边缘通信和微控制器集成方面为 ROS 2 网络提供原生集成解决方案。后者依赖于 micro-ROS。Vulcanexus 是免费和开源的,可作为 Galactic 和 Humble 的 Docker 映像使用。所有组件都享受持续更新,因此用户始终受益于最新功能。

  • ESP-IDF

ESP-IDF 是 ESP32、ESP32-S 和 ESP32-C 系列 SoC 的官方开发框架。迄今为止,它已经在 ESP-IDF v4.1 和 v4.2 中使用 ESP32 和 ESP32-S2 进行了测试。ESP-IDF的micro-ROS 组件允许用户通过克隆或复制文件夹将 micro-ROS API 和实用程序集成到已创建的 ESP-IDF 项目中。当前端口支持串行 (UART)、 WiFi和以太网。

  • Zephyr build system

Zephyr 是一种可扩展的 RTOS,其构建时考虑到了安全性,并且基于设计用于资源受限系统的小尺寸内核。Zephyr 内核支持多种硬件架构,包括 ARM Cortex-M、Intel x86、ARC、Nios II、Tensilica Xtensa 和 RISC-V,并且可以计算大量支持的板卡。Zephyr的micro-ROS 模块允许将 micro-ROS API 和实用程序集成到现有的基于 Zephyr 的项目中,只需克隆或复制文件夹即可。

  • Arduino IDE

Arduino 是一个基于 I/O 板和实现处理/布线语言的开发环境的开源平台,旨在使用户能够轻松生成交互式项目。还提供了一个 CLI,旨在成为一个一体化解决方案,提供从命令行使用任何 Arduino 兼容平台所需的工具。Arduino支持包的micro-ROS 是 micro-ROS的特殊裸机端口,作为一组针对特定平台的预编译库提供。

  • STM32CubeMX

STM32CubeMX 是 ST 的图形工具,用于配置 STM32 微控制器和微处理器。借助一组有助于设置引脚排列、外围设备和中间件堆栈的实用程序,它可以优化编程和操作软件。 STM32CubeMX 的micro-ROS基于Dockerfile ,允许STMicroelectronics提供的全套板虚拟支持 micro-ROS,从而将 micro-ROS 无缝集成到任何基于 STM32 控制器的项目中。

6.2.2 特定平台的 micro-ROS 独立模块有:

  • 用于 Renesas e studio和RA6M5的独立micro-ROS 组件:此软件包支持将 micro-ROS 集成到 Renesas e studio 和 RA6M5 MCU 系列中。
  • 用于 ESP-IDF的独立micro-ROS 组件:此软件包可将 micro-ROS 集成到任何 Espressif ESP32 IDF 项目中。
  • 用于 Zephyr RTOS的独立micro-ROS 模块:此软件包可将 micro-ROS 集成到任何 Zephyr RTOS 工作空间中。
  • 用于 Mbed RTOS的独立micro-ROS 模块:此软件包可将 micro-ROS 集成到任何 Mbed RTOS 工作空间中。
  • NuttX RTOS的独立micro-ROS 模块:此软件包可将 micro-ROS 集成到任何 NuttX RTOS 工作空间中。
    用于 Microsoft Azure RTOS的独立micro-ROS 模块:此包支持将 micro-ROS 集成到 Microsoft Azure RTOS 工作区中。
  • 适用于 TI Tiva™ C 系列的独立micro-ROS 应用程序:此软件包可将 micro-ROS 集成到 exas Instruments Tiva™ C 系列中。
  • 一组用于 STM32CubeMX 和 STM32CubeIDE 的 micro-ROS 实用程序:该软件包可以将 micro-ROS 集成到 STM32CubeMX 和 STM32CubeIDE 中。
  • PlatformIO的库构建器:此包支持在 PlatformIO 中集成 micro-ROS。
  • 一组预编译的Arduino IDE 库:该软件包可以在某些硬件平台的 Arduino IDE 中集成 micro-ROS。
  • 一组预编译的Raspberry Pi Pico SDK 库:此包支持在 Raspberry Pi Pico SDK 中集成 micro-ROS。

参考链接:https://micro.ros.org/docs/overview/ext_tools/

6.3 支持Micro-ROS的嵌入式平台

micro-ROS 硬件支持分为三类:

  • 官方支持的硬件平台
  • 社区支持的硬件平台
  • 第三方平台

官方支持的板是那些已经正式执行或测试的板,并且保证了LTS。

6.3.1 官方支持的硬件平台

  • Renesas EK RA6M5 and e2studio
  • Espressif ESP32
  • Crazyflie 2.1
  • Olimex STM32-E407
  • ST B-L475E-IOT01A
  • Zephyr emulator
  • ST B-L475E-IOT01A

6.3.2 社区支持的硬件平台

  • ST Nucleo F446RE
  • ST Nucleo F446ZE
  • ST Nucleo F746ZG
  • ST Nucleo F767ZI
  • ST Nucleo F446RE
  • ST Nucleo H743ZI

6.3.3 第三方平台

  • Arduino Portenta H7
  • Arduino Due
  • Arduino Zero
  • Raspberry Pi Pico RP2040
  • ROBOTIS OpenCR 1.0
  • Teensy 3.2
  • Teensy 4.0/4.1

七、其它嵌入式DDS

以开源飞行控制器PIX4为例(基于STM32开发),其使用Fast DDS在嵌入式平台上通讯,该通信体系结构的主要元素是下面图中所示的客户端 (client) 和代理 (agent) 进程。

参考:https://dev.px4.io/v1.11_noredirect/zh/middleware/micrortps.html

参考链接:
https://github.com/micro-ROS/micro_ros_setup
https://micro.ros.org/docs/overview/hardware/
https://zhuanlan.zhihu.com/p/443549592

你可能感兴趣的:(【ROS2概念】系列(七)——微控制器上用于 ROS2 的 micro-ROS)