welcom ! Handel home

2025年4月14日 星期一

RRC 控制板(STM32) 經由 UART 接入 micro-ROS Agent

 

RRC 控制板(STM32) 經由 UART 接入 micro-ROS Agent,在 ROS 2 中成為可接收 /cmd_vel 指令的底盤控制節點



📦 系統架構圖

csharp
[ROS 2 Host PC] | | /cmd_vel (Twist msg) | [micro-ROS Agent ←—— UART (USB-to-Serial)] | [STM32F407VET6 + FreeRTOS + RRC 控制程式] | └── 控制馬達轉動

🧱 1. 在 STM32 上建立 micro-ROS Node (FreeRTOS)

📁 micro-ROS 應用範例目錄:

bash
firmware/freertos_apps/micro_ros_app/ └── app.c ← 放置你的應用程式

📄 app.c:接收 /cmd_vel 並控制底盤

c
#include <rcl/rcl.h> #include <rclc/rclc.h> #include <geometry_msgs/msg/twist.h> #include "rmw_microros/rmw_microros.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; // 呼叫 RRC 提供的底盤函式(以差速底盤為例) diff_chassis_move(linear * 1000, 0, angular * 1000); // 單位放大為 PWM } void appMain(void * arg) { rcl_allocator_t allocator = rcl_get_default_allocator(); rclc_support_t support; rcl_node_t node; rclc_executor_t executor; // 初始化 micro-ROS rclc_support_init(&support, 0, NULL, &allocator); rcl_node_init_default(&node, "rrc_chassis_node", "", &support); // 建立 /cmd_vel 訂閱 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)); } }

🔌 2. micro-ROS Transport 設定(使用 UART)

📄 platformio.initransport.c 裡設定 UART

c
#define RCC_USART_TX_PIN GPIO_PIN_2 // 假設使用 USART2 #define RCC_USART_RX_PIN GPIO_PIN_3 #define RCC_USART_INSTANCE USART2

📄 rmw_microros_transport.c

c
bool rmw_uros_platform_serial_open(...) { return stm32_uart_open("/dev/serial0", 115200); // 實際底層 API }

🖥️ 3. 在 ROS 2 主機上啟動 micro-ROS Agent

bash
# 連接 ttyACM0、USB 或 UART ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyACM0

成功時顯示:

less
[INFO] [micro_ros_agent]: Client connected [INFO] [micro_ros_agent]: Successfully negotiated

🚀 4. 測試 ROS 2 發送 /cmd_vel

bash
ros2 topic pub /cmd_vel geometry_msgs/Twist "{linear: {x: 0.2}, angular: {z: 0.5}}"

STM32 應該會根據這個資料來執行馬達控制。


🧩 5. 整合到 RRC 的程式架構

你只需把上面 cmd_vel_callback() 中的 diff_chassis_move() 換成你原本的馬達控制介面即可,保留 micro-ROS 接收指令功能。


📁 參考資料與工具

資源說明
micro-ROS setup tool用來建立 firmware
RMW Micro XRCE-DDSmicro-ROS 使用的底層通訊
ROS 2 Twist msg/cmd_vel 格式參考

✅ 結語

你現在可以讓 RRC 控制板成為一個「接收 ROS 2 /cmd_vel 指令的底盤控制器」,並保有原本 FreeRTOS + 馬達控制邏輯,具備更高擴展性!

如果你想我幫你整合:

  • ✅ FreeRTOS 工程樣板

  • ✅ micro-ROS + UART transport

  • ✅ 差速或 Ackermann 控制介面封裝

我可以直接幫你產生一份工程目錄結構與範例。要我幫你建嗎?😎

沒有留言: