使用單板電腦控制工業機械手臂

前言

本文將介紹如何利用單板電腦 BeagleY-AI(DigiKey 零件編號:2820-102991834-ND)控制工業級機械手臂 igus ReBeL 6DOF(DigiKey 零件編號:4903-REBEL-6DOF-02-ND),作為機器人分類系統專案的一部分。

文中將簡要介紹所使用的技術與軟體,包括:

  • ROS2
  • iRC(igus Robot Control)
  • CRI-Python-Lib

同時也會記錄開發過程中遇到的問題與解決方式。

本文分為三個部分:

  1. 選擇合適的硬體與軟體
  2. 使用 ROS2 建立機器人控制系統
  3. 改用 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 上運行,需要執行下列步驟:

  1. 下載並建置 ROS2 Docker 映像
  2. 建立 Docker Container
  3. 執行 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)。

:warning: 務必將急停按鈕(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

我們重新回到較底層的方案:

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)

能完成:

:white_check_mark: 移動到指定位置
:white_check_mark: 開啟夾爪
:white_check_mark: 關閉夾爪
:white_check_mark: 夾取物體
:white_check_mark: 放置物體


韌體版本問題

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 辨識系統。