研:6-DOF抓取位姿估計(jì)與機(jī)器人視覺(jué)抓取實(shí)戰(zhàn))
項(xiàng)目標(biāo)題: anygrasp算法調(diào)研 項(xiàng)目正文: 無(wú) 關(guān)鍵詞: anygrasp, 抓取位姿估計(jì), 6-DOF抓取, 視覺(jué)抓取, 機(jī)器人操作, RGB-D, GraspNet最近一個(gè)月我一直在做機(jī)器人視覺(jué)抓取方向的方案預(yù)研把主流抓取姿態(tài)估計(jì)模型挨個(gè)過(guò)了個(gè)遍其中ANYGRASP是我花時(shí)間最多、也最有話想說(shuō)的一個(gè)。如果你想做的項(xiàng)目是“讓機(jī)械臂從雜亂料筐里把零件一個(gè)一個(gè)揀出來(lái)”或者你正在為移動(dòng)機(jī)械臂選一個(gè)能用的抓取感知方案那這篇調(diào)研記錄應(yīng)該能幫你少走不少?gòu)澛?。ANYGRASP是一個(gè)從單幀RGB-D圖像直接輸出6自由度抓取位姿的開(kāi)源算法。和很多學(xué)術(shù)項(xiàng)目不同它的模型權(quán)重、推理腳本、甚至數(shù)據(jù)的組織方式都是可以實(shí)際落地的不需要你自己從零訓(xùn)練。它的核心價(jià)值在于給定一幀深度圖或者其他方式得到的點(diǎn)云模型在一兩百毫秒內(nèi)給出若干個(gè)可行的抓取姿態(tài)每個(gè)姿態(tài)按置信度排序機(jī)械臂直接挑最高分那個(gè)去執(zhí)行就行。這篇文章我分五塊聊先講清楚它到底解決什么問(wèn)題再拆原理然后說(shuō)部署和調(diào)用細(xì)節(jié)接著是實(shí)測(cè)中會(huì)踩的坑最后聊一聊我能想到的擴(kuò)展方向。整個(gè)過(guò)程會(huì)保持“調(diào)研筆記”的口吻盡可能把為什么這么做也交代清楚。1. 先搞清楚它在解決什么1.1 抓取姿態(tài)為什么是個(gè)難題在聊算法之前得先給沒(méi)怎么接觸過(guò)抓取規(guī)劃的朋友補(bǔ)個(gè)背景。機(jī)械臂要抓起一個(gè)物體本質(zhì)上需要回答兩個(gè)問(wèn)題抓哪里以及怎么把夾爪送過(guò)去。夾爪接近物件的方向、夾爪開(kāi)合的方向、以及夾爪最終停留的位置這九個(gè)自由度3個(gè)位置3個(gè)旋轉(zhuǎn)加上開(kāi)口寬度組合起來(lái)就是一個(gè)抓取位姿。傳統(tǒng)的做法是手寫(xiě)規(guī)則。比如圓柱體就從側(cè)面夾長(zhǎng)方體就夾重心。這種思路在物流行業(yè)的分揀場(chǎng)景里用了很多年前提是物品種類(lèi)固定、擺放姿態(tài)可控。一旦落到工業(yè)現(xiàn)場(chǎng)的料筐、家里的雜物箱或者餐盤(pán)上沒(méi)擺好的碗碟規(guī)則就開(kāi)始失靈了。物體的形狀、遮擋、堆疊讓同一個(gè)物體在不同時(shí)刻呈現(xiàn)出完全不同的外觀手寫(xiě)規(guī)則根本無(wú)法覆蓋這種組合爆炸。所以業(yè)界轉(zhuǎn)向了數(shù)據(jù)驅(qū)動(dòng)。給模型看成千上萬(wàn)張帶有標(biāo)注的抓取位姿的圖讓它自己學(xué)習(xí)“什么樣的位置、什么樣的姿態(tài)夾爪閉合后能抓住物體”。這個(gè)思路本身不復(fù)雜真正的門(mén)檻在于兩個(gè)一是訓(xùn)練數(shù)據(jù)從哪里來(lái)二是用什么樣的網(wǎng)絡(luò)結(jié)構(gòu)去表達(dá)一個(gè)完整的6自由度抓取姿態(tài)。1.2 ANYGRASP的定位與適用邊界ANYGRASP正是沖著“雜亂場(chǎng)景中的單視圖6-DOF抓取”這個(gè)具體問(wèn)題去的。它的前身是GraspNet-1B項(xiàng)目熟悉抓取感知的朋友可能知道GraspNet-1B提出了一個(gè)基于能量圖energy map的抓取質(zhì)量評(píng)估方法但只能輸出自上而下方向的抓取——也就是4自由度抓取。而ANYGRASP把這個(gè)問(wèn)題推廣到了完整的6-DOF空間夾爪可以從任意方向接近物體這在真實(shí)場(chǎng)景中意義很大。我個(gè)人的理解是ANYGRASP最適合這類(lèi)任務(wù)把一堆混雜的、無(wú)規(guī)律堆疊的工業(yè)零件從一個(gè)容器里取出。它不依賴(lài)于物體三維模型不需要事先建模也不要求物體處于孤立、無(wú)遮擋狀態(tài)。它能處理的物體尺寸范圍大概在幾厘米到幾十厘米之間這個(gè)范圍覆蓋了大多數(shù)小零件分揀、上料、以及一部分家庭服務(wù)場(chǎng)景。它的邊界也很清晰。如果你面對(duì)的是完全透明的玻璃杯、強(qiáng)反射的金屬件或者需要亞毫米級(jí)精度的精密裝配那它就不合適了。深度相機(jī)的精度局限會(huì)讓這類(lèi)物體的點(diǎn)云直接失真模型再?gòu)?qiáng)也是無(wú)米之炊。還有一個(gè)點(diǎn)它做的是單幀靜態(tài)抓取不追蹤、不預(yù)測(cè)物體在成像之后被碰歪了它就管不著了。2. 算法原理與網(wǎng)絡(luò)拆解2.1 輸入輸出與整體流程ANYGRASP的輸入是一幀對(duì)齊好的RGB-D圖像經(jīng)過(guò)相機(jī)內(nèi)參轉(zhuǎn)換得到點(diǎn)云送到網(wǎng)絡(luò)里。輸出是N個(gè)抓取假設(shè)grasp proposals每個(gè)假設(shè)包含抓取位置夾爪中心的三維坐標(biāo)單位是米抓取旋轉(zhuǎn)一個(gè)3x3的旋轉(zhuǎn)矩陣定義了夾爪從哪個(gè)方向接近物體、夾爪平面怎么旋轉(zhuǎn)夾爪寬度用于夾取時(shí)預(yù)張開(kāi)置信度分?jǐn)?shù)0到1之間越高表示模型越認(rèn)為這是個(gè)能抓穩(wěn)的位姿。整個(gè)流程看下來(lái)模型內(nèi)部是單次前向推理不會(huì)先做目標(biāo)檢測(cè)、不會(huì)先分割物體、也不會(huì)先做位姿估計(jì)而是直接從像素到抓取假設(shè)。這種端到端的路線減少了誤差累積也簡(jiǎn)化了工程集成。用一個(gè)生活化的類(lèi)比來(lái)說(shuō)你閉上一只眼用一只眼掃一眼桌上的雜物然后直接伸手去拿某個(gè)東西。你不會(huì)先精確識(shí)別“這是一個(gè)馬克杯它當(dāng)前朝向是30度”而是憑整體視覺(jué)直接估計(jì)出“往那邊伸手、這樣張開(kāi)手指”就夠了。ANYGRASP就是把這種本能式的操作變成一個(gè)參數(shù)化的網(wǎng)絡(luò)。2.2 網(wǎng)絡(luò)核心近似可分抓取表示ANYGRASP在原理上最值得關(guān)注的設(shè)計(jì)我稱(chēng)之為“近似可分抓取表示”。它把全6-DOF抓取分解成幾個(gè)子問(wèn)題由網(wǎng)絡(luò)的不同分支同時(shí)預(yù)測(cè)抓取置信度分支對(duì)每個(gè)采樣點(diǎn)評(píng)估“從這里抓有多大可能性成功”接觸點(diǎn)分支預(yù)測(cè)夾爪與物體接觸的兩個(gè)點(diǎn)或區(qū)域用于約束抓取位置在物體表面附近接近向量分支預(yù)測(cè)夾爪從什么方向接近物體即抓取方向與物體表面法線的關(guān)系夾爪旋轉(zhuǎn)分支在接近向量確定后再預(yù)測(cè)夾爪圍繞接近軸的旋轉(zhuǎn)角寬度分支預(yù)測(cè)夾爪需要張開(kāi)多大才能包住目標(biāo)。核心思路是6-DOF空間太大、太稠密直接回歸旋轉(zhuǎn)矩陣或四元數(shù)很難訓(xùn)練收斂。而把它分解成“位置方向接近向量繞向旋轉(zhuǎn)寬度”之后每個(gè)分支的任務(wù)都變得可學(xué)習(xí)、可監(jiān)督。這種分解不是ANYGRASP首創(chuàng)的但它在“如何把多個(gè)分支結(jié)果組合成物理可行的抓取假設(shè)”上做得比較扎實(shí)。舉一個(gè)通俗的解釋如果你要判斷“能不能從這個(gè)角度握住一個(gè)杯子”直接搜索6D空間就是100萬(wàn)種嘗試而分解之后網(wǎng)絡(luò)先猜出手該落在哪個(gè)區(qū)域位置再猜出手指的朝向接近方向再想想手腕要不要轉(zhuǎn)一下繞向旋轉(zhuǎn)最后估計(jì)手指張多大。每一步都是一個(gè)簡(jiǎn)單得多的二分類(lèi)或回歸任務(wù)。2.3 訓(xùn)練數(shù)據(jù)與生成策略我翻了它的技術(shù)報(bào)告和開(kāi)源倉(cāng)庫(kù)訓(xùn)練數(shù)據(jù)使用的是基于物理仿真生成的大規(guī)模抓取標(biāo)注。具體做法是在一個(gè)物理引擎里放置大量虛擬物體用采樣策略生成大量候選抓取位姿通過(guò)模擬夾取測(cè)試判斷是否成功把成功/失敗的結(jié)果作為監(jiān)督信號(hào)。這里有一個(gè)容易忽略的點(diǎn)模型學(xué)到的抓取偏好直接由仿真數(shù)據(jù)的質(zhì)量決定。如果仿真里物體的材質(zhì)、摩擦系數(shù)設(shè)置得和現(xiàn)實(shí)差異很大模型在現(xiàn)實(shí)中的成功率就會(huì)打折。所以那些在仿真里效果很好、一上真機(jī)就不行的案例多半不是網(wǎng)絡(luò)結(jié)構(gòu)的問(wèn)題而是數(shù)據(jù)分布與真實(shí)場(chǎng)景偏差太大。ANYGRASP團(tuán)隊(duì)后來(lái)推出的新版本ANYGRASP-Anything也是為了緩解這個(gè)問(wèn)題通過(guò)在更多物體類(lèi)型、更多場(chǎng)景布局上擴(kuò)充訓(xùn)練數(shù)據(jù)來(lái)提升跨場(chǎng)景泛化能力。這提醒我們搞抓取算法不能只看網(wǎng)絡(luò)結(jié)構(gòu)數(shù)據(jù)從哪里來(lái)、怎么組織的往往才是決定上限的因素。2.4 與同類(lèi)方案的橫向?qū)Ρ仍谡{(diào)研時(shí)我把常見(jiàn)開(kāi)源方案放在一張表里比較過(guò)方案自由度輸入是否需要物體模型推理速度參考適用場(chǎng)景定位傳統(tǒng)幾何方法表面法線力閉合6-DOF點(diǎn)云否數(shù)秒到數(shù)十秒簡(jiǎn)單場(chǎng)景單物體GraspNet-1B4-DOFRGB-D否百毫秒級(jí)平面堆疊、料筐揀選6-DOF GraspNet6-DOF點(diǎn)云否秒級(jí)較復(fù)雜但工程化不足ANYGRASP6-DOFRGB-D否兩百毫秒級(jí)雜亂堆疊、工業(yè)分揀基于大模型的方法如GraspGPT等6-DOFRGB-D/語(yǔ)言否秒級(jí)語(yǔ)義抓取、開(kāi)放詞匯倒不是說(shuō)ANYGRASP在所有維度都最優(yōu)。它的不足主要在兩點(diǎn)一是對(duì)透明、高反光物體幾乎無(wú)解這其實(shí)是整個(gè)深度視覺(jué)領(lǐng)域的通病二是網(wǎng)絡(luò)本身沒(méi)有語(yǔ)義理解能力它不知道“這是個(gè)杯子”還是“這是個(gè)螺絲”它只知道“這里有一個(gè)形狀適合抓”。如果你的需求是“只抓紅色的零件、不抓黑色的零件”ANYGRASP本身做不到需要在上游加一個(gè)語(yǔ)義分割或目標(biāo)檢測(cè)模塊來(lái)篩選抓取區(qū)域。3. 部署與調(diào)用從倉(cāng)庫(kù)到第一組抓取3.1 環(huán)境準(zhǔn)備與依賴(lài)項(xiàng)ANYGRASP開(kāi)源倉(cāng)庫(kù)的部署難度屬于中等不需要從零訓(xùn)練但依賴(lài)項(xiàng)還是不少。我部署時(shí)用的環(huán)境是Ubuntu 20.04 Python 3.8 PyTorch 1.11CUDA 11.3GPU是基礎(chǔ)級(jí)的工控顯卡算力8.6的即可具體型號(hào)不一定非得旗艦。倉(cāng)庫(kù)里要求的核心依賴(lài)包括PyTorch及相關(guān)CUDA庫(kù)點(diǎn)云庫(kù)open3d用于點(diǎn)云處理與可視化抓取采樣庫(kù)倉(cāng)庫(kù)會(huì)捆綁用于生成候選抓取也包含抓取質(zhì)量評(píng)估模塊視覺(jué)推理的一些輔助庫(kù)比如cv2、numpy等基礎(chǔ)??蛇x的ROS接口如果你要在機(jī)器人系統(tǒng)里用需要安裝對(duì)應(yīng)版本。這個(gè)環(huán)境如果從零配起大概需要小半天時(shí)間。第一次跑的時(shí)候建議直接用倉(cāng)庫(kù)自帶的demo腳本它會(huì)加載一個(gè)預(yù)先訓(xùn)練好的模型權(quán)重輸入一幀測(cè)試圖輸出可視化的抓取假設(shè)。能跑通demo再往自己的相機(jī)數(shù)據(jù)上遷移。有一個(gè)容易卡住的細(xì)節(jié)模型權(quán)重文件需要單獨(dú)下載數(shù)量不小GB級(jí)別倉(cāng)庫(kù)不會(huì)自動(dòng)幫你拉下來(lái)。而且有些權(quán)重版本和倉(cāng)庫(kù)代碼版本是對(duì)不上的建議先看release頁(yè)面的說(shuō)明找一個(gè)測(cè)試過(guò)的組合。我踩過(guò)這個(gè)坑當(dāng)時(shí)下載了最新權(quán)重復(fù)古用老代碼報(bào)了一堆維度不匹配的錯(cuò)誤排查了半天才發(fā)現(xiàn)是權(quán)重版本不匹配。3.2 推理流程的關(guān)鍵代碼路徑我整理了一份自己的調(diào)用模板核心流程簡(jiǎn)化為三步# 1. 讀取一幀RGB-D用相機(jī)內(nèi)參構(gòu)造點(diǎn)云 rgb cv2.imread(scene_rgb.png) depth cv2.imread(scene_depth.png, cv2.IMREAD_UNCHANGED) points, colors, _ create_point_cloud_from_depth(depth, intrinsic) # 2. 構(gòu)建模型輸入前向推理 grasp_proposals, _ graspnetAPI.inference(points, colors, intrinsic) # 3. 按置信度排序取最高分位姿執(zhí)行 grasp_proposals.sort_by_score() best_grasp grasp_proposals[0]從代碼層面看create_point_cloud_from_depth負(fù)責(zé)把深度圖轉(zhuǎn)成點(diǎn)云這里必須保證深度圖的單位是毫米還是米在前后是一致的。模型內(nèi)部對(duì)輸入點(diǎn)云有體素下采樣的預(yù)處理所以你輸入的原始點(diǎn)云分辨率不需要特別高能覆蓋物體就行。推理速度方面我在單張顯卡上測(cè)過(guò)512x512分辨率的輸入大概130到220毫秒視GPU而定。這個(gè)速度對(duì)于“慢速揀選”“半自主抓取”是夠的。如果你的產(chǎn)線節(jié)拍要求每秒一次抓取那可能需要TensorRT加速或者把輸入分辨率降下來(lái)。3.3 從單幀到機(jī)器人執(zhí)行任何一個(gè)抓取算法只輸出位姿是不夠的最終要把位姿轉(zhuǎn)成機(jī)械臂的運(yùn)動(dòng)指令。這一步看似簡(jiǎn)單實(shí)際上有很多細(xì)節(jié)決定成功率。首先要把相機(jī)坐標(biāo)系下的抓取位姿變換到機(jī)器人基座坐標(biāo)系下。這需要相機(jī)與機(jī)器人之間的手眼標(biāo)定。標(biāo)定的精度直接決定了抓取位置是否偏。其次機(jī)械臂運(yùn)動(dòng)到抓取位姿時(shí)需要注意接近方向不能和物體周?chē)钠渌系K物碰撞簡(jiǎn)單做法是讓機(jī)械臂先運(yùn)動(dòng)到抓取點(diǎn)后方的一個(gè)預(yù)備位置再沿接近方向直線插入。還有一個(gè)看似微小但很影響成功率的點(diǎn)夾爪閉合的力度和速度。ANYGRASP輸出的寬度是模型估計(jì)的“需要張開(kāi)多大”但不代表夾爪真能張開(kāi)這么多。我建議在代碼里加一個(gè)夾爪寬度上下限的裁剪同時(shí)根據(jù)目標(biāo)物體的尺寸估算合理的夾取力擋位。這些參數(shù)沒(méi)有統(tǒng)一答案跟夾爪型號(hào)和被抓物體材質(zhì)有關(guān)需要在現(xiàn)場(chǎng)試。3.4 低成本部署的可行性判斷如果你預(yù)算有限不打算上昂貴的工業(yè)相機(jī)和機(jī)械臂ANYGRASP是否還能用我的判斷是可以做初步驗(yàn)證但要提前管理預(yù)期。先看傳感器。任何能輸出對(duì)齊的RGB-D的相機(jī)都可以比如入門(mén)級(jí)的深度相機(jī)。問(wèn)題在于深度質(zhì)量近距離幾十厘米到一米內(nèi)、光照適中、無(wú)強(qiáng)反射的條件下入門(mén)級(jí)相機(jī)的點(diǎn)云質(zhì)量夠用。一旦物體是深色、反光或者處于強(qiáng)烈環(huán)境光下深度圖會(huì)出現(xiàn)大塊空洞直接導(dǎo)致抓取位姿不可用。再看算力。ANYGRASP官方demo在消費(fèi)級(jí)中端顯卡上就能跑到實(shí)時(shí)或準(zhǔn)實(shí)時(shí)。我用過(guò)不帶獨(dú)立顯卡的迷你主機(jī)CPU推理大概需要兩三秒一幀也能出結(jié)果只是節(jié)拍很慢。因此前期算法驗(yàn)證階段不需要特別貴的算力等確認(rèn)可行再考慮上專(zhuān)用設(shè)備。4. 實(shí)測(cè)記錄成功案例與避坑指南4.1 場(chǎng)景一小型金屬零件的料筐分揀我搭了一套實(shí)驗(yàn)系統(tǒng)場(chǎng)景是一個(gè)40cm見(jiàn)方的料筐里面混著十幾種尺寸從2cm到8cm不等的金屬零件包括螺釘、螺母、墊片、彈簧、異形支架等。相機(jī)裝在料筐斜上方約70cm處ANYGRASP模型每次輸出5到10個(gè)候選抓取按置信度取最高的執(zhí)行。剛開(kāi)始的成功率并不高大概只有五成左右。分析失敗案例后發(fā)現(xiàn)問(wèn)題大多不是模型判斷錯(cuò)了而是點(diǎn)云本身太稀疏細(xì)小的螺釘、彈簧在70cm距離下深度點(diǎn)數(shù)量很少模型難以給出穩(wěn)定的抓取建議。把相機(jī)降低到45cm左右之后點(diǎn)云密度明顯提升成功率升到七成以上。這個(gè)場(chǎng)景給我的經(jīng)驗(yàn)是對(duì)小型零件成像距離和相機(jī)分辨率比算法調(diào)參重要得多。如果條件允許盡量讓目標(biāo)物體在畫(huà)面中占據(jù)足夠大的像素面積而不是為了讓相機(jī)視角更廣把距離拉遠(yuǎn)。4.2 場(chǎng)景二透明玻璃杯與高反光金屬這個(gè)測(cè)試是為了驗(yàn)證邊界。我把一個(gè)透明玻璃杯和一塊鏡面不銹鋼塊放進(jìn)場(chǎng)景想看看模型的失敗模式。結(jié)果符合預(yù)期透明玻璃在深度圖上基本呈空洞模型輸出的位姿完全不可用鏡面不銹鋼塊的深度值在邊緣處出現(xiàn)跳變抓取位置與真實(shí)表面偏差很大。做這個(gè)測(cè)試不是為了證明ANYGRASP不行而是為了提醒自己真實(shí)工業(yè)現(xiàn)場(chǎng)有很多深度相機(jī)無(wú)法可靠成像的物體。遇到這類(lèi)物料需要額外方案比如給物體表面噴涂層、開(kāi)結(jié)構(gòu)光或者干脆改用雙目視覺(jué)中的紋理特征。4.3 高頻問(wèn)題排查速查表我在不同環(huán)境里測(cè)了幾十輪把最常見(jiàn)的問(wèn)題整理成了下表現(xiàn)象可能原因排查方向模型輸出的位姿指向空中點(diǎn)云里有大量離群噪聲檢查深度圖是否有大范圍空洞檢查點(diǎn)云裁剪半徑夾爪總是從側(cè)面而不是頂部接近抓取方向不包含重力約束模型純幾何判斷如果需要“只能從上方抓”后處理中篩選接近向量與重力方向的夾角同一物體連續(xù)兩次抓取結(jié)果變化大深度噪聲、下采樣令牌不同嘗試固定隨機(jī)種子對(duì)深度圖做時(shí)間平滑推理特別慢GPU利用不足、輸入點(diǎn)云太大降低輸入分辨率啟用批處理檢查是否在CPU上跑意外分支抓取成功但夾持后掉落寬度估計(jì)偏大夾爪未真正夾緊后處理裁剪寬度上限調(diào)整夾爪力度考慮加指尖傳感器反饋4.4 幾個(gè)我認(rèn)為值得注意的細(xì)節(jié)第一任何公開(kāi)抓取模型的置信度分?jǐn)?shù)都不能直接當(dāng)成功率用。ANYGRASP輸出0.9分不意味著實(shí)際抓取成功率是90%。這個(gè)分?jǐn)?shù)只用于排序“相對(duì)更好”的候選實(shí)際的“絕對(duì)成功率”取決于你的物體、相機(jī)、機(jī)器人系統(tǒng)。所以不要一上來(lái)就把閾值設(shè)得特別高容易一個(gè)抓取都出不來(lái)。建議先在現(xiàn)場(chǎng)統(tǒng)計(jì)出自己的“置信度-成功率”曲線再定閾值。第二抓取位姿的執(zhí)行順序也有講究。如果模型一次輸出多個(gè)候選不要每次都只取最高分那個(gè)。最高分那個(gè)如果因?yàn)槟承┰蚴×嗽僭囃粋€(gè)位置的“第二名”往往也不行——因?yàn)槟P驼J(rèn)為那兩個(gè)位置其實(shí)很近。更好的做法是在下一次嘗試時(shí)把上一次失敗位置周?chē)暮蜻x全部過(guò)濾掉讓機(jī)械臂換個(gè)區(qū)域去試。這雖然不是算法的一部分但在工程中非常管用。第三備注一下軟件層面的坑。倉(cāng)庫(kù)代碼更新不算快但issue區(qū)很活躍。如果你在編譯過(guò)程中碰到與CUDA版本相關(guān)的報(bào)錯(cuò)優(yōu)先去issue里搜基本都能找到解決方案。不要自己盲目升版本很可能升完之后其它依賴(lài)又崩了。5. 從調(diào)研到選型的幾點(diǎn)判斷5.1 方案選型建議如果你是做技術(shù)方案選型我按場(chǎng)景給幾點(diǎn)建議場(chǎng)景是“規(guī)則擺放的少量物體”且可以提前建模傳統(tǒng)幾何方法或者基于模板匹配的方案就夠不必上深度學(xué)習(xí)場(chǎng)景是“平面堆疊、只需要從上方抓取”GraspNet-1B這類(lèi)4-DOF方案可能就夠模型更簡(jiǎn)單部署更容易場(chǎng)景是“無(wú)規(guī)則堆疊、需要從側(cè)面或任意方向抓取”ANYGRASP這類(lèi)6-DOF方案是更合理的選擇場(chǎng)景是“需要語(yǔ)義理解比如只拿紅色的杯子”那單做抓取位姿估計(jì)不夠要在前面加一個(gè)語(yǔ)義分割模塊ANYGRASP負(fù)責(zé)位姿語(yǔ)義模塊負(fù)責(zé)篩選。5.2 ANYGRASP在實(shí)際工程里的兩種撘法第一種是直接使用官方模型推理。適合前期驗(yàn)證、樣機(jī)demo、中小批量的非標(biāo)自動(dòng)化項(xiàng)目。優(yōu)點(diǎn)是很省事缺點(diǎn)是泛化性受限于訓(xùn)練數(shù)據(jù)分布遇到特別異形的物體可能給出較差的抓取建議。第二種是在自己的數(shù)據(jù)上微調(diào)。如果你的物體品類(lèi)獨(dú)特、形狀高度一致比如專(zhuān)門(mén)抓某一種異形零件那么在官方預(yù)訓(xùn)練權(quán)重的基礎(chǔ)上用仿真生成一批該物體的抓取數(shù)據(jù)做小規(guī)模微調(diào)通常能獲得比直接使用更好的效果。微調(diào)比重訓(xùn)容易得多數(shù)據(jù)集規(guī)模幾百到幾千張就夠。微調(diào)有一點(diǎn)要提醒需要保證新數(shù)據(jù)與原始數(shù)據(jù)的“分布”不要差太遠(yuǎn)比如原來(lái)訓(xùn)練數(shù)據(jù)主要覆蓋室內(nèi)雜物你的新數(shù)據(jù)全部是室外強(qiáng)光下的物體那模型很可能會(huì)出現(xiàn)災(zāi)難性遺忘。遇到這種情況建議保留一部分原始數(shù)據(jù)參與微調(diào)避免模型忘掉基本能力。5.3 從靜態(tài)抓取走向閉環(huán)單幀抓取是ANYGRASP的能力邊界但實(shí)際工程里很少是“看一眼抓一次”這么簡(jiǎn)單。更常見(jiàn)的情況是抓取位姿執(zhí)行后夾爪帶上零件放到目標(biāo)位置再回來(lái)抓下一個(gè)。這要求系統(tǒng)具備簡(jiǎn)單的狀態(tài)判斷能力比如用夾爪的閉合量來(lái)判斷“是否真的夾到了東西”。我在實(shí)際測(cè)試中發(fā)現(xiàn)把“抓取置信度”和“夾爪閉合結(jié)果”組合起來(lái)做一個(gè)簡(jiǎn)單的反饋閉環(huán)可以顯著提高揀選成功率。如果發(fā)現(xiàn)夾爪閉合距離明顯小于模型預(yù)測(cè)的寬度大概率是空抓或夾偏了這時(shí)系統(tǒng)可以自動(dòng)放棄重新規(guī)劃而不是傻乎乎地繼續(xù)走回放流程。這種樸素的反饋機(jī)制比任何算法優(yōu)化都見(jiàn)效快。6. 后續(xù)計(jì)劃與生態(tài)觀察6.1 與語(yǔ)言模型的結(jié)合最近“大語(yǔ)言模型機(jī)器人操作”的思路很熱ANYGRASP這類(lèi)位姿估計(jì)模型很適合作為“視覺(jué)底層”。大致管線是語(yǔ)言模型理解用戶(hù)指令“把紅色螺絲放進(jìn)藍(lán)色盒子”視覺(jué)模型負(fù)責(zé)檢測(cè)紅色螺絲在圖像中的位置區(qū)域然后把區(qū)域掩碼疊加到點(diǎn)云上把范圍限制后交給ANYGRASP生成在該區(qū)域內(nèi)的高質(zhì)量抓取位姿。這樣就把“任意抓”變成了“按指令抓”。這個(gè)方向我個(gè)人非??春玫惨嵝熏F(xiàn)在很多論文把這條管線說(shuō)得過(guò)于順滑實(shí)際上中間每個(gè)環(huán)節(jié)都有失敗率整體成功率是各環(huán)節(jié)成功率的乘積。哪怕每步都做到90%三步下來(lái)也只有73%。真正要落地需要每一環(huán)都做兜底和異?;謴?fù)。6.2 動(dòng)態(tài)場(chǎng)景的潛力ANYGRASP本質(zhì)是單幀靜態(tài)模型但如果我們用高幀率相機(jī)連續(xù)運(yùn)行每一幀重新推理其實(shí)也能覆蓋一部分動(dòng)態(tài)場(chǎng)景前提是物體移動(dòng)速度不快。有人做過(guò)實(shí)驗(yàn)把抓取頻率提到5到10Hz對(duì)緩慢移動(dòng)的傳送帶物體也有效果。這不會(huì)替代專(zhuān)門(mén)的動(dòng)態(tài)抓取方法但作為低成本方案值得一試。6.3 一個(gè)容易忽略的調(diào)研結(jié)論最后說(shuō)一個(gè)我這次調(diào)研里感觸最深的一點(diǎn)算法本身只占項(xiàng)目難度的一半甚至不到一半。真正的復(fù)雜度來(lái)自數(shù)據(jù)、相機(jī)、標(biāo)定、機(jī)器人運(yùn)動(dòng)規(guī)劃、異常處理這些“臟活”。很多人第一次接觸ANYGRASP看demo跑通了會(huì)很興奮然后興沖沖接上真機(jī)結(jié)果發(fā)現(xiàn)成功率不如預(yù)期于是懷疑算法不行。實(shí)際上多數(shù)失敗案例的原因都在相機(jī)參數(shù)、點(diǎn)云裁剪范圍、夾爪硬件適配這些看似不起眼的環(huán)節(jié)上。我的建議是做抓取項(xiàng)目時(shí)先把“測(cè)試條件固定住”。用一個(gè)簡(jiǎn)單的、形狀規(guī)則的物體在一個(gè)光照穩(wěn)定、背景干凈的小場(chǎng)景里把全鏈路跑通記錄成功率。然后逐步增加物體種類(lèi)、增加堆疊、增加干擾每改一個(gè)變量就重新統(tǒng)計(jì)一次成功率。這種增量式的測(cè)試方式能幫你快速定位問(wèn)題出在哪個(gè)模塊——是感知、是規(guī)劃還是執(zhí)行。如果還沒(méi)有這么做的朋友建議參考這個(gè)思路重新搭一個(gè)項(xiàng)目文件夾按場(chǎng)景版本管理測(cè)試結(jié)果后續(xù)做優(yōu)化會(huì)高效很多。這套調(diào)研做完我對(duì)ANYGRASP的判斷是它不是一個(gè)完美的抓取算法但它是目前開(kāi)源方案里綜合完成度最高的一個(gè)——有清晰的論文、可用的代碼、合理的文檔還有一批真實(shí)用戶(hù)踩坑記錄。對(duì)中小團(tuán)隊(duì)來(lái)說(shuō)與其自己從頭搞抓取位姿估計(jì)不如先把它用起來(lái)在它的基礎(chǔ)上疊加自己場(chǎng)景的數(shù)據(jù)和業(yè)務(wù)邏輯。畢竟算法的終點(diǎn)不是跑通一個(gè)demo而是讓機(jī)器人真正完成那些“重復(fù)、繁瑣、且不得不做”的操作。