welcom ! Handel home

2025年4月18日 星期五

成功安裝了 micro-ROS / ROS 2 ESP32 開發環境

 已經成功安裝了 micro-ROS / ROS 2 ESP32 開發環境所需的 Python 套件與 colcon 工具鏈,其中包括:

  • colcon 相關核心與擴充

  • empy(ROS2 build template 使用)

  • pytest(unit test 支援)

  • catkin_pkg(老式 ROS1 兼容用)

  • PyYAML 等支援性工具

這表示你的 Python 環境、虛擬環境與 micro-ROS toolchain 現在都已經準備好,可以進行後續的韌體建構、燒錄與 agent 通訊測試。


🔜 建議你下一步可以做的事:

✅ 建構韌體

bash
ros2 run micro_ros_setup build_firmware.sh

這會編譯 ESP32 韌體(FreeRTOS + micro-ROS)並輸出至 firmware/build/ 目錄。


✅ 確認 USB 串口後燒錄(ESP32 預設為 /dev/ttyUSB0

bash
export MICROROS_FIRMWARE_SERIAL_DEVICE=/dev/ttyUSB0 ros2 run micro_ros_setup flash_firmware.sh

✅ 執行 micro-ROS Agent(在主機端,連接到 ESP32)

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

你應該會看到 micro-ROS agent 開始通訊、顯示 INFO micro_ros_agent 類似的日誌輸出。


✅ 測試 ROS 2 通訊(主機)

bash
ros2 topic list ros2 topic echo /<你的 topic 名稱>

🛠 若你還沒寫 app.c 內容

你可以用預設範本:

bash
ros2 run micro_ros_setup configure_firmware.sh int32_publisher -t serial -d /dev/ttyUSB0

會建立一個簡單的 ROS publisher,固定頻率送 std_msgs/msg/Int32/int32_publisher topic。


如果你之後想改成自訂的 topic、subscriber、timer、executor 範本,我可以幫你快速產一份乾淨的 app.c 模板。

是否需要我幫你生成一份 ESP32 專用的 micro-ROS 範例 app.c?或整個專案初始化腳本?

在 ESP32 上使用 FreeRTOS 運行 micro-ROS 的操作步驟

 在 ESP32 上使用 FreeRTOS 運行 micro-ROS 的操作步驟

前置條件
  • 作業系統:Ubuntu 20.04 或 22.04(建議搭配 ROS 2 Humble)。
  • ROS 2:已安裝 ROS 2 Humble,並可透過 /opt/ros/humble/setup.bash 啟用。
  • ESP32 工具:已安裝 ESP-IDF(建議版本 v4.4 或更新,與 micro-ROS 相容)。
  • 依賴套件:已安裝 colconrosdepflex 等必要工具。
  • 硬體:ESP32 或 ESP32-S3,具備 USB 轉串口連線。

步驟 1:建立並編譯 ROS 2 工作空間
創建一個用於 micro-ROS 設置的工作空間,並編譯相關套件。
bash
mkdir -p ~/firmware_esp32_ws/src
cd ~/firmware_esp32_ws
git clone https://github.com/micro-ROS/micro_ros_setup src/micro_ros_setup
rosdep update
sudo apt install flex
rosdep install --from-path src --ignore-src -y
source /opt/ros/humble/setup.bash
colcon build
source install/local_setup.bash
說明與檢查
  • 這個步驟會下載 micro-ROS 的設置工具並編譯。
  • 確保 colcon build 執行無誤,無錯誤訊息。
  • 執行 source install/local_setup.bash 後,確認環境變數正確設置,可用 echo $ROS_DISTRO 檢查(應顯示 humble)。

步驟 2:建立 FreeRTOS 韌體工作空間
為 ESP32 創建基於 FreeRTOS 的 micro-ROS 韌體工作空間。
bash
ros2 run micro_ros_setup create_firmware_ws.sh freertos esp32
輸出結果
  • 執行後會在當前目錄下生成 firmware/ 資料夾,結構如下:
    firmware/
    ├── apps/
    ├── esp-idf/
    ├── mcu_ws/
    │   ├── src/
    │   └── install/
    ├── CMakeLists.txt
    ├── sdkconfig
  • 這裡明確指定 freertos 作為作業系統,esp32 作為目標平台(其他支援平台包括 nucleo_f446recrazyflie21 等)。
ESP32-S3 注意事項: 若使用 ESP32-S3,需在創建工作空間前設置以下環境變數:
bash
export IDF_TARGET=esp32s3
  • 這確保生成的工作空間適用於 ESP32-S3 的硬體配置。

步驟 3:編譯韌體
編譯針對 ESP32 的 micro-ROS 韌體。
bash
ros2 run micro_ros_setup build_firmware.sh
說明與檢查
  • 該指令會自動載入 ESP-IDF 環境並編譯韌體。
  • 編譯過程應無錯誤,否則檢查 ESP-IDF 版本或依賴套件。
  • 對於 ESP32-S3,確認 IDF_TARGET=esp32s3 已設置,並檢查 sdkconfig 檔案中的 UART 和快閃記憶體大小設置是否正確。
進階配置(選擇性): 若需調整 UART 引腳或快閃記憶體大小,可使用以下指令開啟配置介面:
bash
ros2 run micro_ros_setup configure_firmware.sh menuconfig
  • menuconfig 中調整相關參數(例如 UART 引腳、快閃記憶體大小),特別適用於 ESP32-S3。

步驟 4:燒錄韌體到 ESP32
將編譯好的韌體燒錄到 ESP32 硬體。
bash
export MICROROS_FIRMWARE_SERIAL_DEVICE=/dev/ttyUSB0
ros2 run micro_ros_setup flash_firmware.sh
說明與檢查
  • /dev/ttyUSB0 替換為實際的 USB 串口(可用 ls /dev/tty* 檢查)。
  • 確保 ESP32 已正確連接到電腦,且有寫入權限(可能需 sudo chmod 666 /dev/ttyUSB0)。
  • 燒錄完成後,檢查是否有錯誤訊息。

步驟 5:啟動 micro-ROS Agent
啟動 micro-ROS Agent 以與 ESP32 上的 micro-ROS 應用程式通訊。
bash
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0
說明與檢查
  • 確保串口與燒錄時一致(例如 /dev/ttyUSB0)。
  • Agent 啟動後應顯示連線訊息,表示與 ESP32 的 micro-ROS 節點成功通訊。
  • 若無反應,檢查 ESP32 是否正確燒錄,或確認 UART 設置是否正確。

ESP32-S3 特別注意事項
若使用 ESP32-S3,請額外注意以下事項:
  1. 設置 IDF 目標
    bash
    export IDF_TARGET=esp32s3
    • 在創建韌體工作空間前執行,確保生成正確的配置。
  2. 檢查 UART 和快閃記憶體
    • ESP32-S3 的 UART 引腳和快閃記憶體大小可能與標準 ESP32 不同。
    • 使用 menuconfig 檢查並調整 sdkconfig 中的設置:
      bash
      ros2 run micro_ros_setup configure_firmware.sh menuconfig
    • 常見調整包括 UART 引腳分配和快閃記憶體大小(例如 4MB 或 8MB)。
  3. 燒錄問題
    • ESP32-S3 的燒錄可能需要額外驅動程式,確保 USB 驅動(如 cp2102ch340)已安裝。
    • 確認燒錄工具(如 esptool)與 ESP-IDF 版本相容。

常見問題與解決方法
  1. 編譯失敗
    • 確認 ESP-IDF 版本與 micro-ROS 相容(建議 v4.4 或更新)。
    • 檢查是否遺漏依賴套件,可重跑 rosdep install
  2. 燒錄失敗
    • 確認串口正確(/dev/ttyUSB0 或其他)。
    • 檢查 ESP32 是否進入燒錄模式(可能需按住 BOOT 按鈕)。
  3. Agent 無法連線
    • 確認 UART 設置與 Agent 的串口一致。
    • 檢查韌體是否正確燒錄,可透過串口監控工具(如 minicom)查看 ESP32 輸出。

總結
以上步驟涵蓋了從建立 ROS 2 工作空間到在 ESP32 上運行 micro-ROS 的完整流程。對於 ESP32-S3,需特別注意 IDF_TARGET 設置和 sdkconfig 配置。完成後,你將能夠在 ESP32 上運行 micro-ROS 節點,並透過 micro-ROS Agent 與 ROS 2 系統通訊。
若有進一步問題或需要範例程式碼(如 micro-ROS 節點程式),請提供更多細節,我可協助補充!


以下是為 ESP32 + micro-ROS + FreeRTOS 平台設計的一份簡單但完整的 app.c 範例程式,它會:

  • 初始化 micro-ROS 節點(rclc_node

  • 建立一個 publisher,發佈 std_msgs/msg/Int32 訊息到 /int_topic

  • 每 500ms 發送一筆遞增的數字

  • 使用 rclc_executor 管理 timer callback


firmware/apps/microros_esp32_extensions/app.c

c
#include <stdio.h> #include <rcl/rcl.h> #include <rcl/error_handling.h> #include <rclc/rclc.h> #include <rclc/executor.h> #include <std_msgs/msg/int32.h> #include <freertos/FreeRTOS.h> #include <freertos/task.h> rcl_publisher_t publisher; std_msgs__msg__Int32 msg; int32_t count = 0; void timer_callback(rcl_timer_t * timer, int64_t last_call_time) { RCLC_UNUSED(last_call_time); if (timer != NULL) { msg.data = count++; rcl_publish(&publisher, &msg, NULL); } } void appMain(void * arg) { // === micro-ROS 初始化 === 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, "esp32_node", "", &support); rclc_publisher_init_default( &publisher, &node, ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32), "int_topic" ); // === Timer 500ms === rcl_timer_t timer; rclc_timer_init_default( &timer, &support, RCL_MS_TO_NS(500), timer_callback ); // === Executor === rclc_executor_t executor; rclc_executor_init(&executor, &support.context, 1, &allocator); rclc_executor_add_timer(&executor, &timer); // === 主循環 === while (1) { rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100)); vTaskDelay(pdMS_TO_TICKS(100)); } // 不會執行到這裡,但若需清理可加上: // rcl_publisher_fini(&publisher, &node); // rcl_node_fini(&node); }

📦 配套資訊

這份程式預設的 Topic 是:

bash
Topic: /int_topic Type: std_msgs/msg/Int32

你可以在主機端使用:

bash
ros2 topic echo /int_topic

來觀察資料。


🧩 接下來怎麼用這份 app.c?

  1. 把上面的內容存進你的 firmware app 目錄,例如:

    bash
    firmware/apps/microros_esp32_extensions/app.c
  2. 重新 build:

    bash
    ros2 run micro_ros_setup build_firmware.sh
  3. 確保 ESP32 連接 USB,燒錄:

    bash
    export MICROROS_FIRMWARE_SERIAL_DEVICE=/dev/ttyUSB0 ros2 run micro_ros_setup flash_firmware.sh
  4. 啟動 Agent:

    bash
    ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0
  5. 查看 ROS 2 topic:

    bash
    ros2 topic list ros2 topic echo /int_topic

如果你希望加上 subscriberparameterIMU / UART 傳感器整合,我可以幫你擴展這個 template。是否需要我也加上一個 subscriber 範例?