前言
本文將介紹如何利用單板電腦 BeagleY-AI(DigiKey 零件編號:2820-102991834-ND)控制工業級機械手臂 igus ReBeL 6DOF(DigiKey 零件編號:4903-REBEL-6DOF-02-ND),作為機器人分類系統專案的一部分。
文中將簡要介紹所使用的技術與軟體,包括:
- ROS2
- iRC(igus Robot Control)
- CRI-Python-Lib
同時也會記錄開發過程中遇到的問題與解決方式。
本文分為三個部分:
- 選擇合適的硬體與軟體
- 使用 ROS2 建立機器人控制系統
- 改用 CRI-Python-Lib 控制機械手臂
對於希望自行實現類似專案的讀者,本文亦會提供相關操作說明。
第一部分:選對零件與工具
此專案最初且最重要的目標,是透過程式碼直接控制機械手臂,使其能夠自主執行動作。
在達成這個目標之前,首先必須決定使用的硬體與軟體。
硬體選擇
我們採用了 BeagleY-AI,最初選擇它的原因是其具備 AI 推論能力。
在整個系統中,Beagle 預期扮演控制中心角色,負責:
- 與機械手臂內建控制器通訊
- 連接外部攝影機模組 Arducam(4679-B0292-ND)
- 執行 AI 推論
為方便敘述,後續將機械手臂內部控制器直接簡稱為「機械手臂」。
軟體選擇
控制機械手臂共有三種方案:
1. iRC(igus Robot Control)
這是 igus 官方提供的機器人控制軟體。
主要功能包括:
- 建立機器人程式
- 使用 igus 專屬腳本語言
- 建立運動軌跡(Path)
- 執行機器人動作
2. ROS2
ROS2 是由學術界主導開發的開源機器人框架,目前在研究領域與工業界皆廣泛使用。
它提供高度抽象化的架構,可協助開發複雜的機器人行為。
3. CRI-Python-Lib
CRI-Python-Lib 是一套 Python 函式庫,透過 TCP 上運行的 CRI(Commonplace Robotics Interface)應用層通訊協定與機械手臂控制器互動。
由於 iRC 必須執行於 Windows PC,而我們希望以 BeagleY-AI 作為控制平台,因此無法直接使用 iRC 作為最終控制方案。
ROS2 所標榜的抽象化與易用性看起來十分符合需求,因為我們只需要能夠:
用最簡單的方式指令機械手臂移動到指定位置。
理論上若 ROS2 運作良好,就不需要使用 CRI-Python-Lib。
因此最初決定採用:
- BeagleY-AI
- ROS2
- igus ReBeL
作為技術堆疊(Tech Stack)。
第二部分:使用 ROS2 建構系統
ROS2 是用來建立複雜機器人軟體的開源框架。
若機器人支援 ROS2,開發人員便可專注於功能邏輯,而不必直接處理:
- 多執行緒(Multithreading)
- 伺服馬達電流
- 底層控制細節
本文採用 TruPhysics 提供的 igus ReBeL ROS2 套件。
安裝 ROS2 環境
為了讓 ROS2 在 Beagle 上運行,需要執行下列步驟:
- 下載並建置 ROS2 Docker 映像
- 建立 Docker Container
- 執行 ROS2 範例程式
所有操作皆於 Beagle 的 Terminal 進行。
下載程式庫
首先確認 Beagle 已連線至網際網路。
git clone https://bitbucket.org/truphysics/igus_rebel_ros2.git
建立 Docker 映像
進入專案目錄後執行:
sudo docker compose build
此命令會:
- 下載基礎映像檔
- 建立客製化 Docker Image
建置過程可能需要較長時間。
啟動 Docker Container
sudo docker compose up -d
接著進入 Container:
sudo docker exec -it ros2_jazzy_rebel_dev bash
設定乙太網路連線
ReBeL 機械手臂必須透過 Ethernet 連接。
使用網路線將:
- BeagleY-AI
- ReBeL
直接連接。
查看目前 IP
ip a
設定固定 IP
機械手臂使用:
192.168.3.11
因此 Beagle 必須位於同一子網:
192.168.3.xxx
但不能使用:
192.168.3.11
例如:
192.168.3.100
先刪除原 IP:
sudo ip addr del 192.168.X.X/X dev eth0
再新增自訂 IP:
sudo ip addr add 192.168.3.100/X dev eth0
建議同時關閉 Wi-Fi,以避免網路衝突。
啟動 ROS2
執行:
ros2 launch igus_rebel rebel.launch.py
這個命令會啟動:
igus_rebel/rebel.launch.py
遇到的第一個問題
第一次執行時,終端機出現大量錯誤訊息:
解析機器人狀態封包失敗。
問題來自:
stoi()
函式無法將某些 Digital Output 字串轉換成整數。
經除錯後發現:
Digital Output 字串實際包含十六進位資料,但程式仍以十進位方式解析。
原始程式:
dout = std::stoi(doutString);
修正後:
dout = std::stoi(doutString, nullptr, 16);
指定使用十六進位解析。
重新編譯
修改原始碼後需重新建置:
colcon build --symlink-install --cmake-clean-cache --packages-select igus_rebel --cmake-args -DCMAKE_BUILD_TYPE=Release
啟動 ROS2 各模組
機械手臂控制共需同時啟動三個程序。
Terminal 1
ros2 launch igus_rebel rebel.launch.py
Terminal 2
ros2 launch igus_rebel_moveit_config igus_rebel_motion_planner.launch.py
Terminal 3
ros2 run igus_rebel_moveit_config rebel_servo_teleop_keyboard
操作機械手臂
在 Teleop 視窗內:
輸入:
j
進入關節控制模式(Joint Mode)。
務必將急停按鈕(E-Stop)放在觸手可及的位置。
因為手臂有可能撞擊桌面。
控制方式:
| 按鍵 | 功能 |
|---|---|
| 1~6 | 控制 A1~A6 關節 |
| r | 反轉關節運動方向 |
ROS2 的效能問題
測試過程中發現:
手臂運動一段時間後開始出現:
- 卡頓(Jitter)
- 延遲
- 反應變慢
使用 btop 監控系統後發現:
整體 CPU 使用率約:
95%
其中主要耗用來自:
- ROS Control Node:29%
- MoveIt:19%
除此之外,我們還需要額外執行:
- 攝影機控制
- AI 推論
因此 CPU 資源明顯不足。
更嚴重的是:
控制 Digital Output
(夾爪開啟/關閉)
每次竟可能需要:
約 5 秒
這對即時控制來說難以接受。
最終我們認為:
ROS2 雖然提供良好的抽象層,
但帶來了:
- 過高複雜度
- 效能負擔
- 學習曲線過陡
因此決定放棄 ROS2。
第三部分:改用 CRI-Python-Lib
我們重新回到較底層的方案:
其優點包括:
- 輕量化
- 不需 Docker
- 可直接控制機械手臂
- 完整掌握 CRI 通訊內容
只需要建立 Python Virtual Environment 即可。
安裝 CRI-Python-Lib
下載套件:
git clone https://github.com/CommonplaceRobotics/CRI-Python-Lib.git
建立虛擬環境:
python -m venv venv
啟用:
source venv/bin/activate
安裝套件:
pip install .
初始化問題
最棘手的問題來自:
範例程式執行後,機器人雖然成功 Enable,卻不會移動。
然而接回 Windows 上使用 iRC 時又能正常操作。
經過反覆測試後我們發現:
iRC 在啟動時其實執行了一系列初始化命令。
因此透過分析 iRC 的 Robot Control Log,建立出完整初始化流程。
進一步除錯時又發現:
reference_all_joints()
並未成功校正所有關節。
原因是:
初始化流程執行過快。
加入適當延遲後:
- Enable
- Reference
- Re-enable
才能穩定完成。
最終成功建立:
- 初始化腳本
- 座標移動腳本
- 關節控制腳本
- 夾爪控制腳本
import logging
from time import sleep
from cri_lib import CRIController
# constants for arm orientation
A, B, C = -179, 0, 179
# configure logger to INFO level - change to DEBUG to see CRI Messages
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)
controller = CRIController()
# connect Beagle to Robot Arm (192.168.3.11) via Ethernet
if not controller.connect("192.168.3.11"):
logger.info("Unable to connect to robot!")
quit()
# request the passive connection to be an active one
controller.set_active_control(True)
logger.info("Acquired active control...")
# motors must be enabled to reference
controller.enable()
logger.info("Enabling Motors...")
sleep(2)
# wait for referencing to finish
ref_state = controller.reference_all_joints()
if not ref_state:
logger.info("Error with referencing, exiting...")
controller.disable()
controller.close()
quit()
sleep(2)
#controller.get_referencing_info() # uncomment to view reference status in DEBUG mode
# reenable because referencing disables the robot
controller.enable()
# wait for kinematics to be ready
kine_state = controller.wait_for_kinematics_ready()
if not ref_state:
logger.info("Error with kinematics, exiting...")
controller.disable()
controller.close()
quit()
# moving the arm to a certain XYZ coord at speed 100 in "base" mode
controller.move_cartesian(300, 0, 100, A, B, C, 0,0,0, 100, '#base', True)
# exit the robot
logger.info("Disabling motors and Disconnecting...")
controller.disable()
controller.close()
logger.info("Script execution completed successfully.")
robot_example.py (1.7 KB)
能完成:
移動到指定位置
開啟夾爪
關閉夾爪
夾取物體
放置物體
韌體版本問題
ReBeL 出廠時搭載:
Version 14.6
之後我們利用 CPRog 升級至:
Version 15
在 iRC v15 中操作正常。
然而改用 CRI-Python-Lib 時卻出現大量錯誤訊息。
雖然 CRI-Python-Lib 說明中提到:
支援 iRC V14-004-1 以上版本
但實測發現最新版程式庫與 V15 韌體之間仍存在相容性問題。
若要修正將耗費大量時間,因此最終決定:
將機器人降級回 Version 14 韌體。
降級後恢復正常。
最終成果
完成上述調整後,
我們成功撰寫程式控制:
- 手臂移動至指定座標
- 末端夾爪開啟與關閉
- 夾取小型物件
- 放置小型物件
並能穩定執行自動化操作。
結論
在完成硬體選型後,我們探索了多種軟體方案,也深入了解它們各自的限制。
對於本專案而言,主要瓶頸是:
- 系統複雜度
- 執行效能
因為我們不只要控制機器手臂,還需要同時整合:
- 攝影機
- 電腦視覺
- AI 推論
- 自動分類邏輯
整個專案初期最困難但也最有收穫的部分,就是學習新工具。
例如:
- 使用 ROS2 迫使我學習 Docker
- 使用 CRI-Python-Lib 迫使我理解非同步 I/O(Asynchronous I/O)
每學會一項技術,就會引出更多需要學習的新知識。
由於除錯必須深入理解系統運作原理,因此整個過程不斷在未知問題與新機制之間探索。
本文除了記錄專案進展之外,也希望能為有興趣打造類似系統的開發者提供經驗分享與解決方案。
至此,專案中偏重硬體的部分已完成。
下一篇文章《單板電腦於電腦視覺應用的建置指南(Setting up a Single-Board Computer for Computer Vision)》將進一步介紹專案中的電腦視覺與 AI 辨識系統。











