welcom ! Handel home

顯示具有 microPython 標籤的文章。 顯示所有文章
顯示具有 microPython 標籤的文章。 顯示所有文章

2025年4月14日 星期一

什麼是 eProsima Micro XRCE-DDS?

 

🔍 一、什麼是 eProsima Micro XRCE-DDS?

名稱說明
XRCE-DDSeXtremely Resource Constrained Environment DDS,是 OMG DDS 的子協定
用途讓微控制器(如 STM32)這種資源有限的裝置,也能參與 DDS 資料流(如 ROS 2 中使用的 DDS)
架構採用 Client / Agent 模式,Client 跑在 MCU,Agent 跑在主機/樹莓派等具備 ROS 2 的系統上

🧱 二、Micro XRCE-DDS 的組成

📦 Micro XRCE-DDS Client(你在 STM32 上運行的程式)

  • 小巧輕便、可裁剪(可用 CMake 調整功能)

  • 透過序列埠(Serial)或網路(UDP)向 Agent 發送請求

  • 可執行的操作:

    • 建立 DDS Participant

    • 建立 Publisher / Subscriber

    • 傳送 topic 訊息 / 接收 topic 資料

📦 Micro XRCE-DDS Agent(跑在 PC / Linux 的「轉譯伺服器」)

  • 接收 Client 送來的請求

  • 幫 Client 在 DDS 中建立實體,如:

    • Participant

    • PublisherSubscriber

    • Topic

  • 是 ROS 2 和 micro-ROS 中的「中介者」

💬 支援的傳輸方式:

傳輸協定是否支援
Serial(UART) ✅
UDPv4 / UDPv6
TCPv4 / TCPv6
自訂 Transport ✅

🔄 三、資料流程概念圖

text
┌─────────────┐ UART / UDP ┌─────────────┐ DDS Middleware ┌──────────────┐ │ STM32 Client│ ─────────────────────▶ │ micro-ROS │ ────────────────────────▶ │ ROS 2 Nodes │ │ (micro-ROS) │ │ Agent │ │ │ └─────────────┘ XRCE-DDS 協定 └─────────────┘ └──────────────┘

⚙️ 四、如何應用在 RRC 控制板

✅ 對應情境:

動作XRCE-DDS 對應機制
接收 /cmd_vel 指令控制馬達create_subscriber("cmd_vel")
回傳 IMU 資料、馬達速度create_publisher("imu/data")
傳輸通道UART (/dev/ttyACM0)
傳送格式DDS-XRCE 編碼封包

🚀 五、實作指引關鍵工具

1. 使用 micro-ROS build system

快速產生 firmware:

bash
ros2 run micro_ros_setup create_firmware_ws.sh freertos stm32f4

2. 編譯與部署

bash
ros2 run micro_ros_setup configure_firmware.sh int32_publisher ros2 run micro_ros_setup build_firmware.sh st-flash write build/micro_ros_firmware.elf 0x8000000

3. 啟動 Agent

bash
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyACM0

🧰 六、學習資源與官方手冊

資源名稱連結
🔗 Start Pagehttps://micro-xrce-dds.readthedocs.io
🔗 GitHub Repohttps://github.com/eProsima/Micro-XRCE-DDS
🔗 ROS 2 Integration Docshttps://micro.ros.org/docs
📘 DDS 標準定義(XRCE)OMG XRCE-DDS

📣 小結

  • 🧠 Micro XRCE-DDS 是 micro-ROS 與 ROS 2 的資料橋梁,幫助資源受限的 STM32 類裝置參與 ROS 通訊

  • ⚙️ Client 在 MCU 上運行,Agent 在 ROS 主機上作為代理

  • 🔌 你在 RRC 上跑的 micro-ROS,實際上就是透過 XRCE-DDS 與 ROS 網路互動


/* === app.c === */
#include <rcl/rcl.h>
#include <rclc/rclc.h>
#include <rclc/executor.h>
#include <geometry_msgs/msg/twist.h>
#include "differential_chassis.h"

rcl_subscription_t cmd_vel_sub;
geometry_msgs__msg__Twist cmd_vel_msg;

void cmd_vel_callback(const void * msgin) {
    const geometry_msgs__msg__Twist * msg = (const geometry_msgs__msg__Twist *)msgin;
    float linear = msg->linear.x;
    float angular = msg->angular.z;
    diff_chassis_move(linear * 1000, 0, angular * 1000); // RRC 控制函式
}

void appMain(void * arg) {
    rcl_allocator_t allocator = rcl_get_default_allocator();
    rclc_support_t support;
    rcl_node_t node;
    rclc_executor_t executor;

    rclc_support_init(&support, 0, NULL, &allocator);
    rcl_node_init_default(&node, "rrc_chassis_node", "", &support);

    rcl_subscription_init_default(
        &cmd_vel_sub,
        &node,
        ROSIDL_GET_MSG_TYPE_SUPPORT(geometry_msgs, msg, Twist),
        "cmd_vel");

    rclc_executor_init(&executor, &support.context, 1, &allocator);
    rclc_executor_add_subscription(&executor, &cmd_vel_sub, &cmd_vel_msg, &cmd_vel_callback, ON_NEW_DATA);

    while (1) {
        rclc_executor_spin_some(&executor, RCL_MS_TO_NS(10));
        vTaskDelay(pdMS_TO_TICKS(10));
    }
}

2025年4月10日 星期四

一鍵 .py → .pyc 編譯工具(GUI 版本)

 這裡是 GUI 版本的一鍵 .py → .pyc 編譯工具,使用 tkinter 製作簡單介面,讓你可以點選資料夾後自動編譯所有 .py 檔案。


🖼️ GUI 版一鍵 .py 編譯器(使用 compileall

📄 pyc_gui_compiler.py

python
import tkinter as tk from tkinter import filedialog, messagebox import compileall import os def select_folder(): folder_path = filedialog.askdirectory() if not folder_path: return result = compileall.compile_dir(folder_path, force=True) if result: messagebox.showinfo("完成", f"✅ 已成功編譯:\n{folder_path}") else: messagebox.showerror("錯誤", f"❌ 編譯失敗,請檢查檔案內容\n{folder_path}") # 建立視窗 root = tk.Tk() root.title("Python 一鍵 .py → .pyc 編譯器") root.geometry("400x200") root.resizable(False, False) label = tk.Label(root, text="請選擇含有 Python 程式碼的資料夾", font=("Arial", 12)) label.pack(pady=20) button = tk.Button(root, text="選擇資料夾並開始編譯", command=select_folder, font=("Arial", 12), bg="#4CAF50", fg="white") button.pack(pady=10) footer = tk.Label(root, text="By ChatGPT|使用 compileall 編譯", font=("Arial", 9), fg="gray") footer.pack(side="bottom", pady=10) root.mainloop()

✅ 使用方式

1. 儲存上面程式為 pyc_gui_compiler.py

2. 執行:

bash
python pyc_gui_compiler.py

3. 點選資料夾,即會自動編譯裡面的 .py 檔案成 .pyc


🚀 若想打包成獨立 EXE(不需裝 Python)

pyinstaller 打包:

bash
pyinstaller -F -w pyc_gui_compiler.py
  • -F:打包成單一 EXE

  • -w:不顯示命令列視窗(適合 GUI)

產出後你會在 dist/pyc_gui_compiler.exe 找到它!



2025年2月16日 星期日

ROSMicroPy and ROS2 整合連線的範例

MicroROS and ROS2 整合連線的範例

要將 micro-ROS 與 ROS 2 整合,您可以按照以下步驟在微控制器和主機之間建立通信:

1. 在主機上安裝 ROS 2 和 micro-ROS Agent:

  • 首先,確保您的主機系統上已安裝 ROS 2。

  • 接著,安裝 micro-ROS Agent,這是連接微控制器(micro-ROS 客戶端)與 ROS 2 網路的橋樑。

    bash
    # 創建工作空間並下載 micro-ROS 工具 mkdir -p ~/micro_ros_ws/src cd ~/micro_ros_ws git clone -b humble https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup # 安裝依賴項 sudo apt update && rosdep update rosdep install --from-paths src --ignore-src -y # 編譯並安裝 micro-ROS colcon build source install/local_setup.bash # 創建 micro-ROS Agent 工作空間 ros2 run micro_ros_setup create_agent_ws.sh # 編譯 micro-ROS Agent colcon build source install/local_setup.bash

2. 在微控制器上設置 micro-ROS 客戶端:

  • 選擇適當的微控制器(如 Arduino、ESP32 等),並確保已安裝相應的開發環境(如 Arduino IDE)。

  • 在開發環境中,安裝 micro-ROS 客戶端庫。例如,對於 Arduino,您可以從庫管理器中安裝 micro_ros_arduino

  • 加載並上傳範例程式碼到微控制器,例如 micro-ros_publisher,該程式碼將定期發布訊息到 ROS 2 主機。

3. 建立主機與微控制器之間的通信:

  • 啟動 micro-ROS Agent,以建立主機與微控制器之間的通信橋樑。假設使用串列(Serial)通信,執行以下命令:

    bash
    ros2 run micro_ros_agent micro_ros_agent serial --dev [您的串列設備]

    請將 [您的串列設備] 替換為實際的設備路徑,例如 /dev/ttyUSB0

  • 啟動後,micro-ROS Agent 將開始監聽來自微控制器的訊息,並將其轉發到 ROS 2 網路。

4. 驗證通信:

  • 在主機上,您可以使用以下命令查看來自微控制器的主題(topic):

    bash
    ros2 topic list
  • 找到微控制器發布的主題後,使用以下命令查看其內容:

    bash
    ros2 topic echo [主題名稱]

    [主題名稱] 替換為實際的主題名稱,例如 /micro_ros_arduino_node_publisher

通過以上步驟,您可以成功地將 micro-ROS 客戶端與 ROS 2 主機整合,實現兩者之間的通信。


有關更詳細的資訊和範例,您可以參考 micro-ROS 官方網站上的教學


ROSMicroPy:整合 MicroROS 與 MicroPython

 

ROSMicroPy:整合 MicroROS 與 MicroPython

1. MicroROS:微型機器人的 ROS 解決方案

MicroROS(Micro Robot Operating System)是 ROS 2 的輕量級版本,專門設計用於微控制器(MCU)和資源受限的嵌入式系統。它允許嵌入式設備與 ROS 2 環境無縫連接,使微型機器人或 IoT 設備能夠與更大的 ROS 2 生態系統進行通訊。

MicroROS 特點:

  • 基於 ROS 2:可與完整的 ROS 2 生態系統整合。
  • 適用於嵌入式系統:支持如 STM32、ESP32、Arduino 這類的微控制器。
  • RTOS 兼容:常與 FreeRTOS、Zephyr OS 等即時作業系統一起使用。
  • 通訊協議:使用 DDS(Data Distribution Service)來進行通訊。

2. MicroPython:專為嵌入式設備設計的 Python 版本

MicroPython 是 Python 的輕量級實現,專為記憶體和計算資源有限的微控制器(如 ESP32、STM32)而設計。它提供了標準 Python 的語法和核心功能,使開發人員能夠用 Python 編寫嵌入式應用,而無需深入 C 語言開發。

MicroPython 特點:

  • 易於學習和使用:與標準 Python 類似,適合開發和快速原型設計。
  • 支援多種 MCU:如 ESP32、RP2040、STM32。
  • 內建 REPL 交互模式:可直接在微控制器上執行 Python 指令。
  • 高效能與低資源消耗:適用於小型嵌入式系統。

3. ROSMicroPy:MicroROS 與 MicroPython 的整合

ROSMicroPy 是一個將 MicroROS 與 MicroPython 整合的框架,使開發人員能夠在嵌入式系統中使用 Python 來操作 ROS 2 訊息和服務。這種組合的目的是降低開發門檻,讓使用者能夠更快速地在微控制器上部署 ROS 2 相關的應用程式。

#ROSMicroPy 的優勢:

  • 簡化開發流程:利用 Python 的易用性加速開發嵌入式 ROS 2 應用。
  • 適用於 IoT 和機器人應用:可用於感測器數據收集、遠端控制等場景。
  • 跨平台支援:可以運行於 ESP32、STM32 等主流 MCU。
  • 高效能通訊:利用 MicroROS 提供的 DDS 通訊協議進行 ROS 2 訊息傳輸。

#ROSMicroPy 可能的應用場景:

  • 使用 ESP32 控制 ROS 2 機器人
  • 在 IoT 設備上收集感測器數據並發送到 ROS 2 網路
  • 開發無線控制介面,讓微控制器與 ROS 2 主機通訊

#結論

ROSMicroPy 為嵌入式開發帶來了一種新方法,結合了 MicroPython 的易用性與 MicroROS 的強大通訊能力,使開發人員能夠更方便地在微控制器上運行 ROS 2 應用。

這對於小型機器人、IoT 設備或資源受限的嵌入式系統來說,

是一個強大且靈活的選擇。


2025年1月13日 星期一

MicroPython 与 ROS 的关系

 在 MicroPython 环境中,并没有直接支持 rospy 的库。rospy 是 ROS(Robot Operating System)中的一个 Python 客户端库,主要用于在 ROS 系统中创建节点、发布和订阅消息等功能。然而,MicroPython 主要是为资源受限的设备设计的,通常不支持完整的 ROS 功能集。

MicroPython 与 ROS 的关系

  1. MicroPython:是一个轻量级的 Python 实现,适用于微控制器和资源受限的环境。它不包含 ROS 的标准库,因此无法直接使用 rospy
  2. ROS:是一个功能丰富的机器人操作系统,提供了多种语言的客户端库,包括 rospy(Python)和 roscpp(C++)。这些库用于构建复杂的机器人应用。

可行的替代方案

如果希望在 MicroPython 环境中实现类似于 ROS 的功能,可以考虑以下几种方法:
  • 自定义通信协议:使用 MicroPython 的网络功能(如 MQTT 或 HTTP)来实现设备之间的通信,模拟 ROS 的发布/订阅模式。
  • 使用 micro-ROS:micro-ROS 是一个为微控制器设计的 ROS 2 实现,可以在资源受限的设备上运行。虽然它与 MicroPython 不同,但可以在某些微控制器上实现与 ROS 2 的集成。
  • 使用其他轻量级框架:可以考虑使用其他轻量级的消息传递框架,如 ZeroMQ 或 nanomsg,这些框架可以在 MicroPython 中实现更简单的通信机制。
总之,尽管 rospy 本身不适用于 MicroPython,但可以通过其他方式实现类似的功能或使用 micro-ROS 来与 ROS 进行集成。

MicroPython build ROS Noetic NODE by MQTT

 在 Raspberry Pi Pico W 上使用 MicroPython 构建一个与 ROS Noetic 通信的节点,需要通过某种方式桥接 MicroPython 和 ROS 网络协议(如 MQTT 或 REST API),因为 MicroPython 本身不直接支持 ROS。以下是通过使用 MQTT 协议与 ROS Noetic 通信的示例流程。

背景

  1. ROS Noetic 使用的主要通信协议是 ROS 1 TCPROS。
  2. MicroPython 无法直接运行 ROS 节点,但可以通过中间协议(如 MQTT)实现与 ROS 的通信。
  3. MQTT 是一种轻量级的消息队列协议,非常适合资源受限的设备。
  4. 在 ROS 中使用 rosbridgemqtt_bridge 将 MQTT 消息转换为 ROS 话题消息。

准备工作

  1. 安装 MQTT Broker
    在运行 ROS Noetic 的主机上,安装并配置 MQTT Broker(如 Mosquitto):


    sudo apt update sudo apt install mosquitto mosquitto-clients sudo systemctl enable mosquitto sudo systemctl start mosquitto
  2. 安装 mqtt_bridge
    使用 ROS 的 mqtt_bridge 实现 MQTT 与 ROS 话题的桥接:

    bash
    sudo apt install ros-noetic-mqtt-bridge
  3. 安装 MicroPython 和 MQTT 库
    在 Raspberry Pi Pico W 上安装 MicroPython,并通过 umqtt.simple 模块处理 MQTT 通信。


架构

  • Pico W:使用 MicroPython 发布传感器数据到 MQTT 主题(topic)。
  • ROS Noetic:通过 mqtt_bridge 订阅 MQTT 主题并将消息发布到 ROS 话题。

示例代码

1. Pico W 上的 MicroPython 代码

以下代码实现了 Pico W 连接 Wi-Fi 和发布 MQTT 消息:

python
import network import time from umqtt.simple import MQTTClient # 配置 Wi-Fi 网络 SSID = '你的SSID' PASSWORD = '你的密码' # MQTT 配置 BROKER = '主机IP地址' # 替换为运行 MQTT Broker 的主机 IP TOPIC = b'pico/sensor_data' # 连接 Wi-Fi 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()) # 初始化 MQTT 客户端 client = MQTTClient('pico_client', BROKER) # 连接到 MQTT Broker try: client.connect() print("已连接到 MQTT Broker") except Exception as e: print("无法连接到 MQTT Broker:", e) # 发布传感器数据 try: for i in range(10): message = f'{{"temperature": {20 + i}, "humidity": {50 + i}}}' client.publish(TOPIC, message) print(f"已发布: {message}") time.sleep(1) finally: client.disconnect() print("MQTT 客户端已断开连接")

将此代码上传到 Pico W 并运行。


2. ROS Noetic 的 mqtt_bridge 配置

配置 ROS 的 mqtt_bridge,使其订阅 pico/sensor_data 主题,并将消息发布到 ROS 话题 /sensor_data

  1. 创建 mqtt_bridge 配置文件 mqtt_bridge_config.yaml

    yaml
    mqtt: connection: host: "localhost" # MQTT Broker 地址 port: 1883 topics: - topic: "pico/sensor_data" type: "std_msgs/String" queue_size: 10 latching: false direction: "in" # MQTT -> ROS
  2. 启动 mqtt_bridge 节点:

    bash
    rosrun mqtt_bridge mqtt_bridge_node _config:=/path/to/mqtt_bridge_config.yaml

3. 在 ROS 中订阅话题

在终端中运行以下命令,订阅 /sensor_data 话题并查看从 Pico W 接收到的数据:

bash
rostopic echo /sensor_data

测试流程

  1. 启动 ROS Noetic 环境和 mqtt_bridge 节点。
  2. 确保 MQTT Broker 正常运行。
  3. 启动 Pico W 上的 MicroPython 脚本。
  4. 在 ROS 中通过 rostopic echo /sensor_data 查看数据。

输出结果

在 ROS 终端中,应该能看到类似以下的输出:

plaintext
data: '{"temperature": 20, "humidity": 50}' --- data: '{"temperature": 21, "humidity": 51}' ---

总结

通过使用 MicroPythonMQTT,可以轻松在 Raspberry Pi Pico W 上构建一个与 ROS Noetic 通信的节点。这种方法不仅适合 Pico W,还可以扩展到其他微控制器设备中,尤其适用于物联网(IoT)和嵌入式系统开发。

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 应用。