當前位置: 華文星空 > 心靈

人人都能玩得起AI機器人!HuggingFace開源低成本解決方案

2024-08-30心靈

編輯:alan

【新智元導讀】近日,HuggingFace開源了低成本AI機器人LeRobot,並指導大家從頭開始構建AI控制的機器人,包括組裝、配置到訓練控制機器人的神經網絡。

當前的AI機器人,已經可以上躥下跳後空翻、再接閃電五連鞭,代替人類承擔各種工作。

哪怕是當大號手辦,咱也想整一個玩玩。

但無奈目前大多公司還在研發階段,少數能量產的又有億點小貴。

當然了,小編相信AI和機器人最終會走進千家萬戶。

而現在,我們可以玩到一個低成本的解決方案——LeRobot:

——不知諸位可還記得「炒菜大師」 ALOHA

而這個LeRobot,就是我們自己可以擁有的ALOHA,能夠模仿人類完成一些簡單的任務。

單個機械臂的成本在200美元左右,而後端的模型訓練在自己的筆記本上就可以搞定。

官方開源了全部的硬件和軟件,包括訓練和控制程式、AI模型、SolidWorks檔等。

我們可以從零組裝出機械臂,並行揮想象教會它一些事情。

LeRobot專案由前特斯拉工程師Remi Cadene(現在是HuggingFace的principal research scientist)所領導,並給出了一份詳細的指南,

包括如何從頭開始構建AI控制的機器人,——組裝、配置,以及訓練控制機器人的神經網絡。

專案基於開源的Koch v1.1機器人套件(也可以是別的硬件或者虛擬平台),包含兩個六電機的機械臂,可使用一個或多個網絡攝影機作為視覺傳感器。

專案地址:https://github.com/huggingface/lerobot

LeRobot還計劃在未來開發更具性價比的Moss v1版本,定價僅為150美元。

連𝐌𝐨𝐛𝐢𝐥𝐞 𝐀𝐋𝐎𝐇𝐀的作者也表示「Amazing」:

對於AI機器人,專業人士認為它將成為這個時代的PC:

我一直在等待兩個平台的轉變:

-相當於早期PC的AR/VR

-相當於早期個人電腦的機器人

而大多數網友則更加直接:這是我過去十年來一直想要的機械手,必須得到它!

說到開源的力量,專案剛剛釋出就有網友玩了起來:

因為他表示自己的影片沒有加速,所以小編也沒給他加速。

目前的HuggingFace上給出了四種模型,以及98個數據集,開發者還可以選擇在訓練過程中上傳自己的數據集。

制作自己的AI Robot

LeRobot目前使用的機械臂來源於Alexander Koch在幾個月前開源的專案:

下圖是前輩的樣子,總體的硬件差別不大,但為了方便大家復刻和使用,LeRobot做了一些改進。

Koch v1.1拿掉了之前硬件模型中一些幹擾材料,讓尺寸標準化,並為引導臂添加了一個平台,允許從動臂從地面拾取物體。

透過更換直流轉換器,Koch v1.1無需使用烙鐵進行組裝,也無需手動調節電壓轉換器。

專案還添加了機械臂的SolidWorks模型、接線圖以及裝配影片。

材料清單

以引導臂(Leader Arm)為例,

下表是需要購買的部件,主要的開銷在6個 舵機 上面,剩下的包括電機驅動板、固定裝置、電源、杜邦線之類的。

而手臂結構的塑膠片,則需要根據給出的檔透過3D打印獲得。

實際上對於相關愛好者來說,這些零件基本都能湊出來,而且咱們國內買這些東西也要便宜得多。

另外,如果需要平替或者升級伺服電機的話,記得修改控制程式。

他這裏給出的兩種電機扭矩都不大,但精度和轉速倒是都挺高,不知道替換後會有多大影響,感興趣的小夥伴不妨一試。

配置和校準

首先安裝Koch v1.1所需的依賴:

pip install -e ".[koch]"

然後按照接線圖給驅動板和電機供電,USB連線到電腦:

註意從動臂這邊有倆大一點的電機需要12V供電,以及USB不能作為電源。

透過以下命令進行電機的配置和校準:

python lerobot/scripts/control_robot.py teleoperate \

--robot-path lerobot/configs/robot/koch.yaml \

--robot-overrides '~cameras' # do not instantiate the cameras

程式例項化一個類來呼叫SDK操作電機(port改為自己器材上檢測到的埠):

DynamixelMotorsBus(port="/dev/tty.usbmodem575E0031751")

接下來配置每個電機的索引(相當於在總線上控制時的地址):

follower_arm = DynamixelMotorsBus(

port=follower_port,

motors={

# name: (index, model)"shoulder_pan": (1, "xl430-w250"),

"shoulder_lift": (2, "xl430-w250"),

"elbow_flex": (3, "xl330-m288"),

"wrist_flex": (4, "xl330-m288"),

"wrist_roll": (5, "xl330-m288"),

"gripper": (6, "xl330-m288"),

},

)

DynamixelMotorsBus會自動檢測當前電機索引,如果電機中保存的索引與配置檔中不匹配,會觸發一個配置過程,需要拔掉電機的電源,按順序重新連線電機。

讀寫測試

執行以下程式碼:

leader_pos = leader_arm.read("Present_Position")

follower_pos = follower_arm.read("Present_Position")

print(leader_pos)

print(follower_pos)

配置成功後可以得到所有12個電機的當前位置:

array([2054, 523, 3071, 1831, 3049, 2441], dtype=int32)

array([2003, 1601, 56, 2152, 3101, 2283], dtype=int32)

校準

手動調節機械臂到幾個固定的位置,相當於給電機一個相對的歸零位置,同時也保證引導臂和從動臂的靜止位置大致對齊。

透過校準程式之後,這幾個位置會被寫入配置檔,作為之後執行的基準。

——溫馨提示:記得不要在Torque_Enable的情況下硬掰。

開玩!

準備就緒,下面可以開始控制機械臂了,比如讓從動臂模仿引導臂,設定采樣頻率200Hz,操作30秒:

import tqdm

seconds = 30

frequency = 200

for _ in tqdm.tqdm(range(seconds*frequency)):

leader_pos = robot.leader_arms["main"].read("Present_Position")

robot.follower_arms["main"].write("Goal_Position", leader_pos)

——是不是很簡單?

那麽由此可知,訓練機械臂模仿人類的原理就是,在從動臂模仿引導臂的同時,加上一個網絡攝影機的即時畫面,

在模仿(訓練)的過程中,模型收集了手臂位置和對應的影像數據,之後(推理)就可以根據當前網絡攝影機看到的畫面來預測各個電機需要到達的角度。

小編翻了一下專案的程式碼,發現這個「模仿遊戲」所用的AI模型居然就是ALOHA用的Action Chunking with Transformers (ACT)。

論文地址:https://arxiv.org/pdf/2304.13705

除了ACT,你也可以使用或者訓練自己的模型,可以改成ALOHA那樣的雙臂模式,或者在虛擬環境中進行訓練和驗證。

加入網絡攝影機

專案使用opencv2庫來操作camera,以下程式碼同時配置了機械臂和網絡攝影機:

robot = KochRobot(

leader_arms={"main": leader_arm},

follower_arms={"main": follower_arm},

calibration_path=".cache/calibration/koch.pkl",

cameras={

"laptop": OpenCVCamera(0, fps=30, width=640, height=480),

"phone": OpenCVCamera(1, fps=30, width=640, height=480),

},

)

robot.connect()

使用下面的程式碼嘗試以60 fps錄制影片30秒(busy_wait負責控制幀率):

import time

from lerobot.scripts.control_robot import busy_wait

record_time_s = 30

fps = 60

states = []

actions = []

for _ in range(record_time_s * fps):

start_time = time.perf_counter()

observation, action = robot.teleop_step(record_data=True)

states.append(observation["observation.state"])

actions.append(action["action"])

dt_s = time.perf_counter() - start_time

busy_wait(1 / fps - dt_s)

網絡攝影機拍攝的影像幀會以執行緒的形式保存在磁盤上,並在錄制結束時編碼為影片。

也可以將影片流顯示在視窗中,以方便驗證。

還可以使用命令列參數設定數據記錄流程,包括錄制開始前、錄制過程和錄制結束後停留的時間。

視覺化

python lerobot/scripts/visualize_dataset_html.py \

--root data \

--repo-id ${HF_USER}/koch_test

以上命令將啟動一個本地Web伺服器,如下所示:

建議

一旦您熟悉了數據記錄,就可以建立更大的數據集進行訓練。一個好的開始任務是在不同位置抓取一個物體並將其放入箱子中。

建議至少錄制50集,每個地點10集。在整個錄制過程中保持攝影機固定並保持一致的抓取行為。

實作可靠的抓取效能後,您可以開始在數據收集過程中引入更多變化,例如額外的抓取位置、不同的抓取技術以及改變相機位置。

避免過快地添加太多變化,因為這可能會影響您的結果。