機器人抓取流程介紹與實現——機器人抓取系統基礎系列(七)


機器人抓取系統基礎系列文章目錄
1. UR機械臂的ROS驅動安裝官方教程詳解——機器人抓取系統基礎系列(一)
2. MoveIt控制機械臂的運動實現——機器人抓取系統基礎系列(二)
3. 機器人(機械臂)的相機選型與安裝——機器人抓取系統基礎系列(三)
4. Realsense相機驅動安裝及其ROS通訊配置——機器人抓取系統基礎系列(四)
5. 機器人的手眼標定——機器人抓取系統基礎系列(五)
6. 機器人夾爪的選型與ROS通訊——機器人抓取系統基礎系列(六)
7. 機器人抓取流程介紹與實現——機器人抓取系統基礎系列(七)


機器人抓取流程介紹與實現——機器人抓取系統基礎系列(七)

  • 前言
  • 一、抓取路線介紹
  • 二、物體的定位
  • 三、物體位姿和抓取位姿估計
  • 四、坐標系轉換與運動規劃
  • 五、抓取實施
  • 總結
  • Reference


前言

本文介紹了機器人抓取的流程和具體實施過程,主要包括物體的定位、位姿估計、坐標系轉換、抓取系統硬件與抓取實施。不僅提供了關鍵步驟的示例函數和代碼,也提供了整個基于ROS的抓取系統運行步驟。為機器人相關工作人員提供參考。


一、抓取路線介紹

機器人的抓取實施的主要流程包括 [1]:

1)相機發布視覺相關信息;
2)訂閱視覺信息并計算物體在像素坐標系下的信息(如位置,關鍵點,角度等);
3)根據物體的初步信息計算物體在相機坐標系下的物體位姿和抓取位姿;
4)將相機坐標系下的抓取位姿轉換為機器人坐標系下的抓取位姿,進一步轉換為機器人末端執行位姿,然后規劃路徑;
5)機器人通過運動規劃算法控制末端執行器的抓取。

本文假設讀者已經根據前述系列教程完成了基礎配置工作,包括機械臂的ROS驅動配置、相機的驅動與通訊配置、夾爪的通訊配置和手眼標定相關工作。接下來,就是具體物體的識別和抓取規劃實現了。

基于視覺的抓取估計分為2D抓取和6D抓取,2D抓取適用于垂直水平面的特定角度抓取(需要確定2D位置和1個抓取角),6D抓取則實現任意角度抓取(需要確定3D位置和3D姿態)。本文為便于說明抓取的實施流程,以簡單的2D抓取為例。

二、物體的定位

根據相關資料 [2, 3],基于視覺的抓取檢測包含三個子任務:物體定位,物體位姿估計,抓取位姿估計。對于具體的抓取任務,這三個子任務可以通過不同的組合方式來實現抓取。

第一步的物體定位又分為三種方法:
? 只定位不識別:獲取目標物體的區域,但不知道目標物體的類別;
? 目標檢測:獲取目標物體的區域,同時識別出物體的類別;
? 目標實例分割:識別物體的同時,獲得像素級/點云級物體區域。

以下表格為DeepSeek總結的三種物體定位方法的具體區別,根據表格內容,以下為簡單選擇建議:
? 追求極致速度和簡單場景(單一物體):只定位不識別
? 需要區分抓取多種物體且定位要求不極致:目標檢測 (性價比之選)。
? 需要極高抓取精度、處理復雜堆疊/遮擋、抓取特定部位:目標實例分割 (性能最優,但成本/計算量最高)。

用于機器人抓取的物體定位方法對比

給定機器人抓取場景,目前總能找到合適的技術方案來定位目標物體的位置,進而執行后續的物體位姿估計以及機器人抓取位姿估計等任務。

以目標檢測為例,流行的算法如YOLO [4] 就可以獲得物體的類別和位置信息(可以是四個識別框的角點,也可以是識別框的中心點、長、寬和角度)。

三、物體位姿和抓取位姿估計

對于桌面上的物體位姿估計,如中心對稱物體(如圓形橡皮)為例,YOLO本身的輸出信息就足夠確定其物體位姿。比如其物體位置由YOLO識別的中心點確定,物體角度可以假設。

對于非中心對稱物體(如長方形橡皮),除了YOLO確定的抓取中心點位置之外,還需要確定其抓取角度。比如可以再通過該物體分割區域最小外接矩形的角度來指定其抓取角度。

需要指出的是,YOLO的位置信息只有2D位置,而且是像素坐標系下的位置信息(單位為像素)。在實際的抓取任務中,我們需要先將其位置信息轉換為相機坐標系下的位置信息(單位為米)。其中Z坐標上的值可以根據深度計算,也可以設定特定的數值(如果抓取高度已知)。

然后物體位姿就是在相機坐標系下的位姿信息和物體的角度定義的,其定義可以通過以下函數實現。

def pose3d(center3d, object_angle):"""根據物體的位置和角度定義物體的位姿參數:如下center3d: 相機坐標系下的物體3D位置object_angle: 物體的角度返回: 相機坐標系下的物體位姿"""center_pose = PoseStamped()center_pose.header.frame_id = "camera_color_frame"center_pose.header.stamp = rospy.Time.now()center_pose.pose.position = center3droll = 0pitch = 0yaw = math.radians(object_angle) q = quaternion_from_euler(roll, pitch, yaw)center_pose.pose.orientation = Quaternion(*q)return center_pose

對于形狀規則的物體,其抓取位姿可以根據其物體位姿直接定義,只需要設置特定的對應關系即可。而對于一些不規則物體或者工具類物體,其抓取位姿還需要考慮其具體形狀和任務需求。

本文的重點在于說明整個抓取Pipeline的工作流程,選擇了形狀規則的物體如長方形橡皮為抓取對象。對于長方形的橡皮,只需要保證執行器的末端位姿(即抓取位姿)和橡皮的位姿重合即可。

四、坐標系轉換與運動規劃

1 相機坐標系下的物體位姿TObjectCamera\mathbf{T}_{\text{Object}}^{\text{Camera}}TObjectCamera?到機器人坐標系的物體位姿TObjectRobotBase\mathbf{T}_{\text{Object}}^{\text{RobotBase}}TObjectRobotBase?轉換原理如以下公式所示。
TObjectRobotBase=TObjectCamera?TCameraRobotBase\mathbf{T}_{\text{Object}}^{\text{RobotBase}}=\mathbf{T}_{\text{Object}}^{\text{Camera}} \cdot \mathbf{T}_{\text{Camera}}^{\text{RobotBase}} TObjectRobotBase?=TObjectCamera??TCameraRobotBase?
其中,TCameraRobotBase\mathbf{T}_{\text{Camera}}^{\text{RobotBase}}TCameraRobotBase?為提前手眼標定好的結果,存儲在特定文件中,使用時將其標定結果發布出去即可,發布指令如下,參考基礎系列博客(五)。

roslaunch easy_handeye publish.launch

在位姿轉換時,可以直接使用TF坐標轉換函數:

def transformCoor(msg, max_retries=3):tfBuffer = get_tf_buffer()  # Initializing TF system...for attempt in range(max_retries):try:# 使用最新可用變換(不指定特定時間)transform = tfBuffer.lookup_transform("base_link", "camera_color_frame",rospy.Time(0),  # 最新可用時間rospy.Duration(1.0))# 應用變換到目標坐標系pose_in_camera = PoseStamped()pose_in_camera.pose = msg.posepose_in_camera.header.frame_id = "camera_color_frame"pose_in_camera.header.stamp = rospy.Time.now()# 使用transform進行坐標變換pose_in_base = tf2_geometry_msgs.do_transform_pose(pose_in_camera, transform)return pose_in_base.poseexcept (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException) as e:rospy.logwarn(f"TF轉換嘗試 {attempt+1}/{max_retries} 失敗: {str(e)}")rospy.sleep(0.1)  # 短暫等待后重試rospy.logerr("坐標變換失敗,達到最大重試次數")return None

2 機器人坐標系下的物體位姿TObjectRobotBase\mathbf{T}_{\text{Object}}^{\text{RobotBase}}TObjectRobotBase?到機器人末端的可執行位姿TTool0RobotBase\mathbf{T}_{\text{Tool0}}^{\text{RobotBase}}TTool0RobotBase?的轉換過程如下所示。
物體位姿到機器人末端位姿(可執行位姿)的坐標系轉換
根據上圖中機器人抓取系統的坐標關系,可得坐標系之間的關系如下:
TTool0RobotBase?TToolEndTool0=TObjectRobotBase?TToolEndObject\mathbf{T}_{\text{Tool0}}^{\text{RobotBase}} \cdot \mathbf{T}_{\text{ToolEnd}}^{\text{Tool0}} = \mathbf{T}_{\text{Object}}^{\text{RobotBase}} \cdot \mathbf{T}_{\text{ToolEnd}}^{\text{Object}} TTool0RobotBase??TToolEndTool0?=TObjectRobotBase??TToolEndObject?
移項可得如下公式:
TTool0RobotBase=TObjectRobotBase?TToolEndObject?(TToolEndTool0)?1\mathbf{T}_{\text{Tool0}}^{\text{RobotBase}} = \mathbf{T}_{\text{Object}}^{\text{RobotBase}} \cdot \mathbf{T}_{\text{ToolEnd}}^{\text{Object}} \cdot (\mathbf{T}_{\text{ToolEnd}}^{\text{Tool0}})^{-1} TTool0RobotBase?=TObjectRobotBase??TToolEndObject??(TToolEndTool0?)?1
其中:
TObjectRobotBase\mathbf{T}_{\text{Object}}^{\text{RobotBase}}TObjectRobotBase?為上一步求出的物體在機器人坐標系下的表示;
TToolEndObject\mathbf{T}_{\text{ToolEnd}}^{\text{Object}}TToolEndObject?為抓取位姿到物體位姿的關系,為提前設定的;
TToolEndTool0\mathbf{T}_{\text{ToolEnd}}^{\text{Tool0}}TToolEndTool0?為夾爪末端坐標系和機械臂末端的關系,由夾爪的長度和安裝方式決定;

實際執行時,我們可以專門定義一個坐標轉換函數,如下所示,其中eelink表示tool0:

def transform_end(pos):# eelink_to_robot, object_to_robot, toolend_to_object, toolend_to_eelinkrealEnd = Pose()object_to_robot = tf.transformations.quaternion_matrix([pos.orientation.x, pos.orientation.y, pos.orientation.z, pos.orientation.w]) # the order of xyzwobject_to_robot[:, 3] = [pos.position.x, pos.position.y, pos.position.z, 1]toolend_to_object = tf.transformations.quaternion_matrix([0, 0, 0, 1]) # the order of xyzwtoolend_to_object[:, 3] = [0, 0, 0, 1]toolend_to_eelink = tf.transformations.quaternion_matrix([0, 0, 0, 1]) # the order of xyzwtoolend_to_eelink[:, 3] = [0.0, 0.0, 0.22, 1]eelink_to_robot = numpy.dot( numpy.dot(object_to_robot, toolend_to_object), numpy.linalg.inv(toolend_to_eelink))realEnd.position.x = eelink_to_robot[0, 3]realEnd.position.y = eelink_to_robot[1, 3]realEnd.position.z = eelink_to_robot[2, 3]q = tf.transformations.quaternion_from_matrix(eelink_to_robot)realEnd.orientation.x = q[0]realEnd.orientation.y = q[1]realEnd.orientation.z = q[2]realEnd.orientation.w = q[3]return realEnd

3 運動規劃
在實際抓取過程中,我們可能還會設置接近位姿、抓取位姿、拾起位姿、home位姿等,只需要讓機器人在這些位姿之間移動并配合夾爪的開合即可完成抓取任務。

運動規劃使用MoveIt實現,在默認配置下,使用OMPL提供的RRTConnect算法來完成機械臂的運動規劃任務。當然可以選擇其他算法,也可以用自定義規劃算法。

五、抓取實施

本文是在前述系列教程的基礎上撰寫的,在前述系列教程中,我們使用的機械臂為UR5e,相機為Realsense相機,夾爪為Rochu夾爪,控制系統使用的是ROS。整個硬件系統的如下圖所示,其中,黃色線路表示氣體驅動線路,紫色線路表示信號傳輸線路。

機器人抓取硬件系統

根據前述系列博客和本文的內容,在抓取和操作實施時,需要啟動的節點依次如下所示:

1 Realsense相機相關節點啟動:
發布包括/camera/color/image_raw話題在內的所有圖像相關話題 [5],關于Realsense相機的ROS通訊配置參考基礎系列博客(四)。

# 啟動相機節點并發布相關圖像話題
roslaunch realsense2_camera rs_camera.launch
# 如果需要深度圖與彩色圖像素精確匹配時(如RGB-D融合、點云生成、SLAM),對齊深度
roslaunch realsense2_camera rs_camera.launch align_depth:=true

2 視覺計算節點啟動:
接收從相機傳過來的RGB圖像并做初步處理,獲取像素坐標系中的物體位置,角度等信息。

# 根據任務需求自定義視覺處理算法,本案例中使用基于YOLO的視覺處理算法
rosrun ultralytics_ros yolo_ros_node.py

3 夾爪通訊相關節點啟動:
基礎系列博客(六)詳細說明了夾爪的ROS通訊控制。

# 啟動夾爪的通訊節點,等待接收夾爪控制指令
roslaunch serial_msgs gripper_control.launch 

4 機械臂相關節點啟動:
啟動UR5e工作所需要的所有相關節點,其配置過程參考基礎系列博客(一)。

# 本文使用的是ur5e機械臂
roslaunch ur_robot_driver ur5e_work_all.launch

5 手眼標定結果發布節點啟動:
發布手眼標定計算出的標定結果,基礎系列博客(五)詳細說明了手眼標定的原理和實操步驟。

# 本文使用easy_handeye標定功能包
roslaunch easy_handeye publish.launch

6 抓取或操作規劃器節點啟動:
啟動抓取或者操作規劃器,執行物體位姿計算與坐標系轉換,發布路徑點和夾爪控制指令。

# 根據任務需要自定義抓取或者操作規劃器
rosrun ur_work TaskPlanner.py

上述節點中,需要自定義完成的是視覺計算節點和抓取規劃器節點,在完成這些節點的定義后按照上述順序依次啟動節點,即可完成機械臂的抓取或操作任務。

當然,以上所有節點可以寫在launch文件中,以減少啟動窗口,在測試初期可以分別啟動以測試不同節點的運行情況。


總結

以上就是今天要講的內容,本文主要講了機器人抓取流程和抓取實現,首先簡單介紹了抓取的路線,然后重點講解物體的識別和定位、物體的位姿和抓取位姿估計、抓取實施時的坐標系轉換,最后介紹了抓取系統和抓取實施需要啟動的節點。為機器人相關工作人員提供參考。

Reference

[1] 視覺機械臂自主抓取全流程:https://blog.csdn.net/knightsinghua/article/details/125328920?spm=1001.2014.3001.5501
[2] Du G, Wang K, Lian S, et al. Vision-based robotic grasping from object localization, object pose estimation to grasp estimation for parallel grippers: a review[J]. Artificial Intelligence Review, 2021, 54(3): 1677-1734
[3] 機器人抓取中物體定位算法概述:https://blog.csdn.net/dsoftware/article/details/105936927?spm=1001.2014.3001.5502
[4] Ultralytics YOLO 文件:https://docs.ultralytics.com/zh/
[5] Realsense-ROS1通訊配置:https://github.com/IntelRealSense/realsense-ros/tree/ros1-legacy

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91740.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91740.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91740.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Qt】QObject::startTimer: Timers cannot be started from another thread

QTimer對象的 start 函數調用必須和創建QTimer對象是同一個線程。 #include "QtTimerTest.h" #include <QDebug>QtTimerTest::QtTimerTest(QWidget *parent): QMainWindow(parent),m_timer(nullptr),m_timerThread(nullptr), m_workingThread(nullptr) {ui.set…

社會治安滿意度調查:為城市安全治理提供精準參考(滿意度調查公司)

在社會治理不斷深化的背景下&#xff0c;公眾對社會治安的感知與評價已成為衡量城市治理水平的重要維度&#xff08;社會治安滿意度調查&#xff09;&#xff08;公眾滿意度調查&#xff09;&#xff08;滿意度調查&#xff09;。為全面掌握市民對治安狀況的真實反饋&#xff0…

Python篇--- Python 的加載、緩存、覆蓋機制

要理解 import 與 if __name__ "__main__": 的關系&#xff0c;以及 Python 的加載、緩存、覆蓋機制&#xff0c;我們可以從 “模塊的兩種身份” 和 “導入的全過程” 入手&#xff0c;用通俗的例子一步步拆解。一、核心&#xff1a;模塊的 “雙重身份” 與 __name_…

Java設計模式之行為型模式(訪問者模式)應用場景分析

訪問者模式&#xff08;Visitor Pattern&#xff09;作為Java設計模式中的“隱形冠軍”&#xff0c;常被開發者低估其價值。這一模式通過“雙分派”機制巧妙解耦數據結構與操作&#xff0c;為復雜系統的擴展提供了強大武器。在大廠項目中&#xff0c;訪問者模式往往出現在業務邏…

【IDEA】JavaWeb自定義servlet模板

方法一&#xff1a;&#xff08;推薦去使用方法二&#xff0c;還能創建其它代碼模板&#xff09;使用servlet模板創建Servlet類如果創建時找不到servlet模板&#xff1a;File -> Project Structure然后應用 -> OK&#xff0c;如果還是找不到Servlet模板&#xff0c;看看項…

Linux選擇

在內存中運行著的進程稱為&#xff08; 服務 &#xff09;。負責控制systemd系統和服務管理器的工具為&#xff08; systemctl &#xff09;命令。systemd管理系統服務的基本單位是&#xff08; unit &#xff09;。分配和管理資源的基本單位是&#xff08; 進程 &#xf…

【Redis學習路|第一篇】初步認識Redis

概要: 深入探討NoSQL數據庫的核心特性&#xff0c;對比傳統關系型數據庫的差異&#xff0c;重點介紹Redis作為內存數據庫的優勢與應用場景。 文章目錄認識 NoSQLNoSQL vs SQL 對比1?? 結構化 vs 非結構化2?? 關聯 vs 非關聯3?? 查詢方式對比4?? 事務特性5?? 存儲方式…

java局域網聊天室小項目架構思路

java局域網聊天室小項目架構思路 項目需求 創建一個局域網聊天系統&#xff0c;要求&#xff1a;用戶在登錄界面登錄后進入聊天窗口界面&#xff0c;能實現多用戶同時在線聊天&#xff0c;并且用戶之間可以進行私聊 項目用到的技術棧 java網絡編程java多線程java面向對象編…

vulhub-corrosion2靶機

1.安裝靶機 https://download.vulnhub.com/corrosion/Corrosion2.ovahttps://download.vulnhub.com/corrosion/Corrosion2.ova 2.掃描IP 3.掃描端口 4.訪問端口 首先訪問一下80端口 訪問一個8080端口發現是一個apache的頁面 5.掃描目錄與漏洞探測 那么我們掃描一下目錄 80…

Mysql深入學習:慢sql執行

目錄 慢查詢日志 慢查詢主要步驟 11種慢查詢的場景分析 場景一&#xff1a;SQL 沒有建立索引 場景二&#xff1a;索引未生效的典型原因 場景三&#xff1a;LIMIT 深分頁導致性能下降 場景四&#xff1a;單表數據量過大導致 SQL 性能下降 場景五&#xff1a;ORDER BY 出現…

李宏毅深度學習教程 第8-9章 生成模型+擴散模型

【2025版】12 生成式對抗網絡GAN 一 – 基本概念介紹_嗶哩嗶哩_bilibili 目錄 1. GAN生成式對抗網絡 2. GAN的訓練 散度差異 3.WGAN 4.訓練GAN 5. 如何客觀評估GAN 6. 條件型生成&#xff08;按照要求&#xff09; 7. Cycle GAN&#xff08;互轉配對&#xff09; 8. d…

1.8 axios詳解

Axios的定義與核心特性Axios是一個基于Promise的現代化HTTP客戶端庫&#xff0c;主要用于在瀏覽器和Node.js 環境中發送HTTP請求&#xff0c;旨在簡化異步數據交互流程。其核心特性如下&#xff1a;跨平臺支持&#xff1a;在瀏覽器中通過XMLHttpRequest對象發送請求&#xff0c…

41.安卓逆向2-frida hook技術-過firda檢測(五)-利用ida分析app的so文件中frida檢測函數過檢測

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a;圖靈Python學院 工具下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取碼&#xff1…

安卓調javaScript Not find method “forceLogout“ implementatidsignature or namesp

核對一下是否實現對應的javaScript或者javaScript的方法參數對不對&#xff0c; 在這里插入圖片描述我這里一開始實現了這個方法但是沒有給參數&#xff0c;一直報異常&#xff0c;后臺說token沒給就查token的問題&#xff0c;最后發現是搞偏了&#xff0c;兩個原因&#xff0c…

【Linux網絡】:UDP(傳輸層協議)

目錄 一、鋪墊知識 1、傳輸層 2、端口號 2.1、五元組表示 一個進程通信 2.2、端口號范圍劃分 2.3、知名端口 2.4、查看端口號 2.5、問題 3、pidof & netstat 命令 ①netsate 命令 ②pidof命令 二、UDP協議 1、UDP協議格式 2、UDP報文 1.1、UDP數據封裝的過…

Effective C++ 條款19: 設計class猶如設計type

Effective C 條款19&#xff1a;設計class猶如設計type核心思想&#xff1a;設計新的class時&#xff0c;應當像語言設計者設計內置類型一樣慎重&#xff0c;考慮對象的創建、銷毀、初始化、拷貝、類型轉換等所有方面。 ?? 1. 類設計的關鍵問題域 對象生命周期管理&#xff1…

《匯編語言:基于X86處理器》第11章 MS-Windows編程(3)

本章展示的是如何用32 位Microsoft Windows API進行控制臺窗口編程。應用編程接口(API:ApplicationProgramming Interface)是類型、常數和函數的集合體&#xff0c;它提供了一種用計算機代碼操作對象的方式。本章將討論文本I/O、顏色選擇、時間與日期、數據文件I/O&#xff0c;…

在 macOS 上通過 Docker 部署DM8 (ARM 架構)

概述 達夢數據庫 (DM8) 無法直接在 Apple macOS 操作系統上原生安裝&#xff0c;通常需要通過虛擬機&#xff08;如 Parallels Desktop、VMware Fusion&#xff09;進行部署。另一種更輕量級且受 macOS 支持的方案是利用 Docker 容器技術來構建開發與測試環境。本文檔將詳細介…

網絡協議之路由是怎么回事?

寫在前面 要想去外面的世界看看, 就離不了路由器&#xff0c;而路由器工作的原理就是路由&#xff0c;那么具體是怎么路由的呢&#xff1f;本文就一起來看下這部分內容。 1&#xff1a;路由的配置 配置一條路由無非就是在配置以下三個信息&#xff1a; 1:包要去哪里&#x…

2106. 摘水果,梳理思路

文章目錄題目概要java 解法詳解題目概要 在一個無限的 x 坐標軸上&#xff0c;有許多水果分布在其中某些位置。給你一個二維整數數組 fruits &#xff0c;其中 fruits[i] [positioni, amounti] 表示共有 amounti 個水果放置在 positioni 上。fruits 已經按 positioni 升序排列…