清華大學 動力機械系25級 畢業專題(2024)
本人(pomelo925)負責項目為全軟體、部分韌體及部分電路。 非本人負責項目最終會清楚標註貢獻者。
TTennis Pickup Robot 目標是在任意的桌球場中,自動化完成拾取,並抬升內置球架供運動員使用或將桌球傾倒於球架中,使選手能專注於訓練本身。TTennis Pickup Robot 具備動態避障能力,同時用戶可透過遙控器或螢幕來操控機器人,並調整機器人運動參數。
TTennis Pickup Robot 從機構設計、電路板設計、單晶片調適至上層的視覺處理、AI 模型部署、建圖定位與導航避障系統等皆是我們針對特殊的應用場景做開發,並不直接使用市面上的套件。同時軟韌體算法全部開源,代碼已解藕封裝,所有運行節點以虛擬化容器形式運行,十分利於有程式背景的人對特定算法做二次開發。
以 Nextjs / Framer Motion / Tailwind CSS 製作的 Web 操控介面。
如下圖,本專題主要區分為以下四大部分。
外購硬體主要有相機 Intel® RealSense™ Depth Camera D435、Luxonis OAK-D 以及上位機 iKOOLCORE R2。
我們自行設計 PCB 以增加複雜電路的穩定性與減少過多明線帶來的困擾。包含以下三塊電路板:
-
電源分壓板:將 18V工具機鋰電池 降壓至12V、5V、3.3V,同時支援 PD 快充,並且防電源反接及短路保護。其中 DC-DC Bucker 皆採用可調式閉路電壓控制晶片,並充分考慮降噪濾波。PD 快充用以支援上位機的運作。
-
邏輯電路板:運算單元為 Cortex M7 內核的 STM32H723ZGT6,包含讀取直流馬達之增量式編碼器、閉路控制直流馬達、ROS1 節點通訊等等。並引出 USART 通訊引腳、編碼器端子座、外部晶振時間源、CP2102 TTL 轉 Type-C 通訊等等。
-
馬達驅動板:電力直接由電源分壓板供給 12V,PWM 控制訊號則由邏輯電路板經軟排線傳遞,馬達驅動晶片為 VNH5019。由於功率較大,與邏輯電路板做物理隔離,抗 EMI。
開發平台為 STM32CubeIDE,下圖為本專案資料夾架構與各自任務。
此為 C/C++ 混編專案,並將代碼封裝成以任務為導向的獨立資料夾,解藕並增加可移植性,架構圖中的箭頭部分,是針對底盤馬達PID調適中,ROS1、STM32、timer 間的變數傳遞關係。
軟體複雜度較高,因此會拆分成較多部分說明。
所有軟體的節點皆以 x86 arch Docker 容器形式啟動與結束,容器間共享網路與記憶體。
這裡簡述各區塊任務,並於底下補述細節。後端軟體幾乎運行於 ROS2 平台之上。開發工具主要使用 Visual Studio Code、Cursor、MobaXTerm 及 Foxglove 等。
-
前端 - Nextjs / Framer Motion / Tailwind CSS
- 與用戶最直接的交互接口,可點擊螢幕使機器人執行任務,亦顯示機器人即時運動訊息。
- 本專案模板與架構很大程度地參考 Cristian Mihai 的開源專案。
-
後端 - Coordinator 協調器
- 作為最上層的節點排程與協調器,依當前任務及情景動態調度必要資源。
-
後端 - Navigation 導航
- 基於官方開源 Nav2 導航堆棧,開發 AMR 的路徑規劃、動靜態避障、代價地圖堆疊等。
-
後端 - EdgeNN 神經網路邊緣運算
- Luxonis OAK-D,即時偵測桌球、桌球桌、置球架以及運動員,並回傳空間座標資訊。
-
後端 - RTAB-Map 建圖定位
- 使用開源 RTAB-Map 為室內環境作三維建模,為導航節點提供定位的依據。
-
後端 - Coomunication 通訊
- 基於 rosserial 實現 STM - ROS1 通訊。
- 基於 ROS1 Bridge 實現 ROS1 - ROS2 通訊。
機上搭載嵌入式 AI RGBD 相機 Luxonis OAK-D,大大減少了上位機的運算負擔。相機端給出偵測物件的空間座標資訊後,經過靜態與動態的座標轉換(基於 tf2)後映射至導航的全局代價地圖中。
本專案使用模型為 Ultralytics 發佈的 YOLOv8 模型。此為當前 depthai-experiments 能支援 on-device programming 的最新模型。部署時須將 yolov8n 模型變體之權重檔轉為輕量化格式,實測幀率浮動於 6 ~ 10 hz 間。
training set 主要由 Roboflow Universe 上已 annotated 的開源資料集 Ping Pong Detection Computer Vision Project 提供。資料再由 Roboflow 協助增強處理,並於本地端(RTX 4070、32GB RAM)滿載訓練。
最後,為了取得深度資訊,須使用 DepthAI 的 YoloSpatialDetectionNetwork,疊合相機原生深度資訊與 YOLO 物件屬性,計算出偵測物件合理的空間座標。
此部分詳情可參閱 機器人全端技術筆記 -【軟體】影像處理 -【物件偵測】Deploying 階段。
使用 RTAB-Map 的主因為歷史悠久、有即時性需求且支援 ROS2(rtabmap_ros),視覺來源為提供 RGBD 資訊的 Intel® RealSense™ Depth Camera D435、視覺里程計以及底盤從動輪的里程計資訊,並做 EKF 融合。
建圖定位狀況可由 foxglove real-time 觀察,遠端時的效果比 ROS 原生的 RViz 和 Gazebo 順暢許多。此外所有程序的 foxglove bridge port 皆錯開,避免端口阻塞。
通訊節點如上所述,執行任務明確有二,「STM32 - ROS1 通訊」與「ROS1 - ROS2 通訊」。其實合理的架構是將 microros 部署於 STM32 上,但礙於諸多測試錯誤且時間不夠。
關於 STM32 - ROS1 通訊,
STM32 - ROS1 通訊可參閱 機器人全端技術筆記 -【韌體】STM32CubeIDE - STM x ROS1。
關於 ROS1 - ROS2 通訊,十分感謝電資系朋友將 ROS2 Humble 版本的 ROS1 bridge 通訊之 Dockerfile 盡可能地做了容量優化,省下不少開發時間。這裡附上 Github:YuZhong-Chen/ros2-essentials、j3soon/ros2-essentials。