以下是完整的 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)
bashmkdir -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)
bashros2 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
bashros2 topic list
ros2 topic echo /imu
若你有在 firmware 端編寫:
crcl_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 端執行
bashros2 topic pub /led_ctrl std_msgs/Bool "data: true"
Pico firmware 內部 subscriber 寫法
cvoid 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 正常連線
bashros2 topic list ros2 node list
🔍 查看 Agent 訊息
bashros2 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:bashros2 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
你遇到的錯誤訊息:
bashNon valid RTOS/Platform: freertos/rpi_pico
表示 micro-ROS 官方的 create_firmware_ws.sh
腳本中,
尚未內建對 freertos/rpi_pico
的支援平台定義,所以目前無法這樣直接使用。
✅ 原因解析
micro-ROS 的 create_firmware_ws.sh
是依據已支援的「RTOS + 開發板平台組合」產生對應的 firmware scaffold,
你可以用:
bashros2 run micro_ros_setup create_firmware_ws.sh freertos olimex-stm32-e407
但不能用:
bashros2 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 專案模版
bashgit clone https://github.com/micro-ROS/micro_ros_raspberrypi_pico_sdk.git
cd micro_ros_raspberrypi_pico_sdk
2️⃣ 初始化子模組(含 micro-ROS client)
bashgit submodule update --init --recursive
3️⃣ 編譯範例 firmware
bashmkdir build && cd build
cmake ..
make
4️⃣ 燒錄 .uf2
到 Pico(按 BOOTSEL 插上)
將編譯產出的 .uf2
拖進「RPI-RP2」磁碟即可燒錄。
✅ 測試方法
然後在 ROS 2 主機端(如 RPi4 + Docker)執行:
bashros2 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 的腳本?
沒有留言:
張貼留言