welcom ! Handel home

2025年1月13日 星期一

micro-ROS 介绍

 

micro-ROS 介绍

micro-ROS 是 ROS 2 的轻量级实现,旨在将 ROS(Robot Operating System)的功能扩展到资源受限设备(如微控制器)。它让开发者能够在嵌入式设备上运行 ROS 2 节点,与更大的 ROS 2 系统无缝集成。

特点

  1. 轻量化:针对微控制器优化,资源占用极小。
  2. 扩展性:可与完整的 ROS 2 网络集成,实现复杂的分布式逻辑。
  3. 实时性能:支持实时操作,是实时系统的理想选择。
  4. 跨平台支持:兼容多种嵌入式平台(如 Raspberry Pi Pico、STM32 等)。

应用场景

  • 工业自动化:数据采集和控制。
  • 环境监测:分布式传感器网络。
  • 教育与科研:机器人系统的教学和实验。
  • 物联网(IoT):边缘设备与云服务的集成。

micro-ROS 安装方法

1. 准备环境

  • 一台运行 ROS 2 的主机(支持 Linux)。
  • 开发工具链:
    • CMake 构建系统。
    • arm-none-eabi-gcc 编译器。
  • Raspberry Pi Pico W 或其他支持 micro-ROS 的设备。

2. 下载 micro-ROS SDK

micro-ROS 提供了专门的 SDK 用于 Raspberry Pi Pico。可以从以下链接获取:

通过以下命令克隆 SDK 到本地:

git clone --recursive https://github.com/micro-ROS/micro_ros_raspberrypi_pico_sdk.git

3. 设置开发环境

  1. 安装依赖

    • 安装 CMake:
      sudo apt update sudo apt install cmake
    • 安装 ARM GCC 工具链:
      sudo apt install gcc-arm-none-eabi
  2. 初始化环境 在 SDK 目录中运行以下命令:

    source configure.sh

4. 编写 micro-ROS 程序

  • 创建一个 C 程序,例如 app.c

    #include <rcl/rcl.h> #include <rclc/rclc.h> #include <rclc/executor.h> void timer_callback(rcl_timer_t * timer, int64_t last_call_time) { (void) last_call_time; printf("Hello micro-ROS on Pico W!\n"); } int main() { rcl_allocator_t allocator = rcl_get_default_allocator(); rclc_support_t support; rclc_support_init(&support, 0, NULL, &allocator); rcl_node_t node; rclc_node_init_default(&node, "pico_node", "", &support); rcl_timer_t timer; rclc_timer_init_default(&timer, &support, RCL_MS_TO_NS(1000), timer_callback); while (1) { rclc_executor_spin_some(&timer, RCL_MS_TO_NS(100)); } }

5. 编译和部署

  1. 编译程序 在 SDK 根目录中运行以下命令:

    mkdir build cd build cmake .. make
  2. 将程序部署到 Pico W 将生成的 UF2 文件拖放到 Pico W 的存储设备中。

6. 安装 micro-ROS Agent

micro-ROS Agent 是运行在主机端的服务,用于管理 ROS 2 节点。

  1. 使用 Docker 安装

    docker pull microros/micro-ros-agent:humble docker run -it --rm --net=host microros/micro-ros-agent serial --dev /dev/ttyACM0
  2. 使用 Snap 安装

    sudo snap install micro-ros-agent --classic micro-ros-agent serial --dev /dev/ttyACM0

7. 测试连接

确保设备通过 USB 或串口与主机连接,然后启动 micro-ROS Agent。如果连接成功,设备将被识别为一个 ROS 2 节点,可以与其他 ROS 2 系统交互。


micro-ROS 使用建议

  • 调试工具:建议使用串口调试工具(如 Minicom 或 Screen)监控设备的输出日志。
  • 优化资源:针对微控制器的资源限制,合理配置节点功能和通信频率。
  • 实时性:结合 FreeRTOS 等实时操作系统,可以进一步提升系统性能。

通过这些步骤,您可以在 Raspberry Pi Pico W 上成功安装和运行 micro-ROS,实现与更大 ROS 2 网络的集成。

============= micro-ROS for microPython ================================

Raspberry Pi Pico W 上结合 micro-ROSMicroPython 使用,可以实现灵活的物联网(IoT)和嵌入式应用。虽然 micro-ROS 本身主要基于 C/C++,但可以通过某些方法使它与 MicroPython 集成,例如使用 MicroPython 的外部模块(绑定 C 函数)与 micro-ROS 通信。

以下是一个示例流程,展示如何通过 MicroPython 使用 micro-ROS。


准备工作

  1. 安装 MicroPython: 确保 Raspberry Pi Pico W 上已经安装 MicroPython,并配置好开发环境(例如 Thonny IDE)。

  2. 安装 micro-ROS Agent: 在主机端安装 micro-ROS Agent,用于管理 Pico W 的 ROS 2 节点(参考之前的安装说明)。

  3. 构建 micro-ROS 和 MicroPython 的桥接库: 需要将 micro-ROS 的核心功能封装为 MicroPython 模块。可以通过 ffictypes 加载已经编译好的 micro-ROS 动态链接库。


示例代码:MicroPython 与 micro-ROS 集成

以下示例展示了如何用 MicroPython 实现一个简单的 micro-ROS 节点,该节点发布消息到 ROS 2 网络:

1. 编写 micro-ROS 动态库

在主机上创建一个简单的 micro-ROS 节点(C 语言),并将其编译为动态库(.so 文件)。示例如下:

c>>
#include <rcl/rcl.h> #include <rclc/rclc.h> #include <rclc/executor.h> #include <stdio.h> void publish_message(rcl_publisher_t *publisher, const char *msg) { std_msgs__msg__String message; message.data.data = (char *)msg; message.data.size = strlen(msg); message.data.capacity = strlen(msg) + 1; rcl_publish(publisher, &message, NULL); }

将其编译为 micro_ros_publisher.so,并将 .so 文件拷贝到 MicroPython 的文件系统中。


2. MicroPython 调用动态库

使用 ffictypes 加载动态库并调用其功能。以下是示例代码:

python>>
import network import time import ctypes # 初始化网络连接 ssid = '你的SSID' password = '你的密码' sta_if = network.WLAN(network.STA_IF) sta_if.active(True) if not sta_if.isconnected(): print("正在连接网络...") sta_if.connect(ssid, password) while not sta_if.isconnected(): time.sleep(1) print("网络连接成功:", sta_if.ifconfig()) # 加载 micro-ROS 动态库 micro_ros = ctypes.CDLL('/micro_ros_publisher.so') # 初始化 micro-ROS 节点 micro_ros.init_node.argtypes = [] micro_ros.init_node.restype = ctypes.c_int micro_ros.init_publisher.argtypes = [] micro_ros.init_publisher.restype = ctypes.c_void_p node_status = micro_ros.init_node() if node_status == 0: print("micro-ROS 节点初始化成功") else: print("micro-ROS 节点初始化失败") # 创建 ROS 发布者 publisher = micro_ros.init_publisher() # 发布消息 for i in range(10): message = f"Hello ROS 2! Message {i}" micro_ros.publish_message(publisher, message.encode('utf-8')) print("已发布:", message) time.sleep(1) print("完成 micro-ROS 消息发布")

注意事项

  1. 动态库的编译

    • 使用 arm-none-eabi-gcc 编译 C 程序为动态库。
    • 确保目标架构与 MicroPython 运行环境匹配。
  2. 性能优化

    • 由于 MicroPython 的资源限制,尽量优化消息发布频率和 ROS 2 主题的复杂性。
  3. 环境配置

    • 确保 micro-ROS Agent 正在主机端运行,并与 Pico W 通过串口或 Wi-Fi 保持连接。

应用场景

  • 分布式传感器数据发布:Pico W 收集传感器数据,并通过 micro-ROS 将数据发布到 ROS 2 网络。
  • IoT 控制系统:通过 micro-ROS 实现设备间的实时通信和协调。
  • 教学和实验:将 MicroPython 与 micro-ROS 结合,用于机器人和嵌入式系统教学。

此流程可以帮助开发者将 MicroPython 和 micro-ROS 的优势结合起来,灵活地实现嵌入式 IoT 应用。


沒有留言: