welcom ! Handel home

2025年4月15日 星期二

完整的 microcontroller (Pico / STM32) ↔ ROS 2 Humble on RPi4 (或 Docker) 測試流程

 以下是完整的 microcontroller (Pico / STM32) ↔ ROS 2 Humble on RPi4 (或 Docker) 測試流程,涵蓋從 firmware 燒錄、Agent 通訊、到 ROS 2 topic 測試的全環節。


✅ 系統結構圖

css
[Pico / STM32]──UART/USB──►[micro-ROS Agent on RPi4 or Docker]──DDS──►[ROS 2 Nodes] ▲ │ └──────Subscriber / Publisher◄────┘

🔧 Part 1:建置 micro-ROS firmware(以 Raspberry Pi Pico 為例)

🛠️ 建立 firmware 開發環境(x86 或 Pi4)

bash
mkdir -p ~/data/firmware_ws/src cd ~/data/firmware_ws git clone https://github.com/micro-ROS/micro_ros_setup src/micro_ros_setup rosdep update rosdep install --from-path src --ignore-src -y source /opt/ros/humble/setup.bash colcon build source install/local_setup.bash

⚙️ 創建並編譯 Pico 專案

bash
# 建立 firmware project ros2 run micro_ros_setup create_firmware_ws.sh freertos olimex-stm32-e407 # 編譯 firmware ros2 run micro_ros_setup build_firmware.sh # 將 firmware 燒錄到 stm32 ros2 run micro_ros_setup flash_firmware.sh

✅ Pico 插上 USB、按住 BOOTSEL → 插入後放開,即可進入燒錄模式


🧪 Part 2:啟動 micro-ROS Agent(在 RPi4 或 Docker)

✅ Serial 模式(/dev/ttyACM0)

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

你會看到:

arduino
[INFO] [Agent]: Client connected

表示 microcontroller 成功連接並透過 XRCE-DDS 開始溝通。


📡 Part 3:ROS 2 端與 MCU 溝通測試

🟢 範例:Pico 發布 IMU 狀態 topic /imu

bash
ros2 topic list ros2 topic echo /imu

若你有在 firmware 端編寫:

c
rcl_publisher_t imu_pub; std_msgs__msg__Float32 msg; msg.data = ...; rcl_publish(&imu_pub, &msg, NULL);

你會在 ROS 端收到資料。


📤 Part 4:從 ROS2 發送控制訊息給 MCU

🟢 例:從 ROS 2 發布 /led_ctrl 控制 GPIO

ROS 端執行

bash
ros2 topic pub /led_ctrl std_msgs/Bool "data: true"

Pico firmware 內部 subscriber 寫法

c
void led_callback(const void * msgin) { const std_msgs__msg__Bool * msg = (const std_msgs__msg__Bool *)msgin; gpio_put(LED_PIN, msg->data); // 控制 LED }

🧰 Part 5:Debug 工具

🔍 確認 Agent 正常連線

bash
ros2 topic list ros2 node list

🔍 查看 Agent 訊息

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

可列出詳細通訊紀錄、client discovery、topic 訂閱等。


🧱 STM32 特別補充(若使用 STM32F4)

  • 使用 create_firmware_ws.sh freertos olimex-stm32-e407 產生 STM32 firmware。

  • 串接 UART 須實作 rmw_microxrcedds_transport.c 對應 STM32 UART HAL。

  • 通常將 STM32 連到 /dev/ttyUSBx,再啟動 agent:

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

✅ 快速檢查清單(Checklist)

步驟是否完成
MCU firmware 成功 build + 燒錄
micro-ROS Agent 啟動成功
ROS2 topic 可列出 MCU 資料
可由 ROS2 控制 MCU 行為

如果你想要我幫你生成:

  • ✅ Pico / STM32 firmware 範例 code(LED 控制 + Topic 發布)

  • ✅ 測試用 ros2 topic pub / ros2 topic echo script

  • ✅ 完整 Docker 化微控制連線 demo


===============================================================

你遇到的錯誤訊息:

bash
Non valid RTOS/Platform: freertos/rpi_pico

表示 micro-ROS 官方的 create_firmware_ws.sh 腳本中,

尚未內建對 freertos/rpi_pico 的支援平台定義,所以目前無法這樣直接使用。


✅ 原因解析

micro-ROS 的 create_firmware_ws.sh 是依據已支援的「RTOS + 開發板平台組合」產生對應的 firmware scaffold,
你可以用:

bash
ros2 run micro_ros_setup create_firmware_ws.sh freertos olimex-stm32-e407

但不能用:

bash
ros2 run micro_ros_setup create_firmware_ws.sh freertos rpi_pico ❌(因為不支援)

✅ 可用的 Raspberry Pi Pico 支援方式

micro-ROS 官方對 Raspberry Pi Pico 的支援目前不是透過 freertos/rpi_pico,而是:

✅ 使用 Pico SDK 模式(非 freertos)

參考倉庫: 🔗 micro_ros_raspberrypi_pico_sdk


✅ 正確流程(針對 Pico 開發)

你可以改用這種方式開發 Raspberry Pi Pico 的 micro-ROS:

1️⃣ 下載 Pico SDK 專案模版

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

2️⃣ 初始化子模組(含 micro-ROS client)

bash
git submodule update --init --recursive

3️⃣ 編譯範例 firmware

bash
mkdir build && cd build cmake .. make

4️⃣ 燒錄 .uf2 到 Pico(按 BOOTSEL 插上)

將編譯產出的 .uf2 拖進「RPI-RP2」磁碟即可燒錄。


✅ 測試方法

然後在 ROS 2 主機端(如 RPi4 + Docker)執行:

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

會看到類似:

arduino
[INFO] [agent]: Client connected...

代表 Pico ↔ micro-ROS Agent ↔ ROS 2 連線成功!


✅ 總結建議

目標板使用方式
STM32F4 / ESP32使用 create_firmware_ws.sh(freertos)
Raspberry Pi Pico使用 micro_ros_raspberrypi_pico_sdk

是否要我幫你:

  • 產出一份 Pico 專用的 micro-ROS build 說明手冊?

  • 或產出自動 clone + build 的腳本?



沒有留言: