/robot_grasp

机械臂定位抓取

Primary LanguagePython

机械臂定位抓取目标物体(v1.2)

0. 版本信息

代码结构更新请参考./core/README.md

版本 主要更新内容 时间 作者
v1.0 基础框架 2023/11/21 cedric
v1.1 新增"自动标定"代码
(使用参考第4部分)
2023/12/24 cedric
v1.2 新增"抓取"代码
(使用参考第4部分)
2023/12/25 cedric

1. 介绍

    为了减少机械臂在产品分类、抓取过程中的执行时间,降低定位误差,以提高生产效率。针对传统机器人仅能执行预定义轨迹任务的局限性,本文提出一种结合视觉识别系统的机械臂抓取方案。执行抓取任务的执行装置采用六轴机械臂xArm;最后,使用眼在手上(Eye-in-Hand)视觉-机械臂方案实现对多个物体的识别与抓取,并根据设定规则进行码垛,测试结果验证了所提方案的有效性和鲁棒性。

1.1 本项目提供两种模式下的抓取演示(自上而下,不涉及旋转):

Eye-in-hand 眼在手上 Eye-to-hand 眼在手外

1.2 智能抓取系统构成

硬件设施(Eye-in-Hand) 软件框架

2. 配置

2.1 项目file文件中已包含大部分使用说明文档:

CR5用户手册 CR5硬件使用手册V2.3 DobotSCStudio用户手册(CR机器人) Lua脚本编程用户手册(CR机器人) 机械爪 如何使用末端的485

xArm开发者手册 xArm技术规格参数表 xArm用户手册 xArm技术参数手册 xArm机械爪用户手册

2.2 其他相关信息,请点击下方所需链接自行下载(链接包括文档、sdk、.exe、code等):

硬件模块 文档地址 软件下载地址
工业机械臂(CR/xArm) CR5 or xArm6 cr5.exe or xarm6.exe
RealSense(官网) Download / Documentation / Github .exe
上位机(windows) 10,11 /

3. 整体流程

3.1 视觉(略)

这部分内容暂时略,默认同学们会使用视觉检测算法,无论采取何种检测算法,输出图像的二维坐标(抓取点)即可。
推荐yolo系列算法——Official YOLOv7 - https://github.com/WongKinYiu/yolov7

Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors

PWC Hugging Face Spaces Open In Colab arxiv.org

3.2 抓取目标物体

这部分内容可参考相关博客和论文,这里做大致的流程讲解(Eye_in_hand)

3.2.1 说明

  • 总的来说,机械臂定位抓取目标物体,其实就是将获取的二维图像的抓取坐标点位(x,y)转化成机器人空间中的(x,y,z)三维坐标,我们通常将整个过程称为 坐标变换
  • 首先,明确机器人空间中存在的四个坐标系:base-机器人的基坐标系、tool / gripper-机器人末端工具坐标系、cam-相机坐标系、cal / target-标定板坐标系
  • 坐标变换 就是利用上述四个坐标系进行 刚性位姿变换,获取坐标系之间的 相对位姿(位置和姿态)矩阵 T
  • 其次,空间中存在已知的相对位姿矩阵和未知的相对位姿矩阵,需要利用到特定的方法获取: 手眼标定、相机标定 等。

手眼标定 - See opencv - calibrateHandEye()函数部分.

联立AX=XB矩阵方程,求解未知量矩阵X,X在不同模式下:
(Eye_in_hand):即相机固定在机器人末端,求解cam与tool的相对位姿矩阵X。
(Eye_to_hand):即相机固定在机器人外部,求解cam与base的相对位姿矩阵X。

相机标定 - See opencv Camera Calibration and 3D Reconstruction - Detailed Description 模块描述部分.

为获取相机的内参矩阵、畸变矩阵、外参矩阵。
标定方法 优点 缺点 常用方法
传统相机标定法 可使用于任意的相机模型、 精度高 需要标定物、算法复杂 Tsai两步法、张氏标定法
主动视觉相机标定法 不需要标定物、算法简单、鲁棒性高 成本高、设备昂贵 主动系统控制相机做特定运动
相机自标定法 灵活性强、可在线标定 精度低、鲁棒性差 分层逐步标定、基于Kruppa方程

*表中黄色字体所选的方法为我们所采用的方法,其他方法请自行查阅。


3.2.2 大致流程(Eye_in_hand):

  1. 相机标定:获取相机的内参矩阵相机畸变矩阵外部参数
  2. 步骤1同步进行,获取相机标定过程中记录机器人末端工具坐标系相对于机器人基坐标系的变换矩阵
  3. 求解公式AX=XB,其中X在Eye_in_hand中为机器人末端工具坐标系相对于相机坐标系的变换矩阵,在Eye_to_hand中为标定板坐标系相对于相机坐标系的变换矩阵,具体按所求参数决定
  4. 结合机器人刚性变换公式,求解出目标物体坐标系相对于机器人基坐标系的变换矩阵,控制机器人末端坐标系与之坐标重合,实现自上而下的定位抓取

3.2.3 具体操作(Eye_in_hand):

  • a static calibration pattern is used to estimate the transformation between the target frame and the camera frame
  1. 打印A4纸大小的标定纸张(标定板可以直接从opencv官网下载:标定板
2. 打印完成后,测量实际打印出的网格边长(注意单位)。将打印纸贴附在硬纸板上(粘贴的尽可能平整)。

  • the robot gripper is moved in order to acquire several poses
  • for each pose, the homogeneous transformation between the gripper frame and the robot base frame is recorded using for instance the robot kinematics
  1. 固定好相机,连接相机,使用realsense api获取的相机内参矩阵和畸变系数(默认为0,realsense相机没有畸变)。
  2. 改变机器人末端位姿,拍摄不同角度下的标定板并记录不同角度下机械臂末端工具坐标系的位姿矩阵。
  3. 重复第2个步骤14-20次左右。
  4. 完成上述流程,共获取N对 工具坐标系tool / gripper2base 以及对应的 标定板图片,注意一一对应的命名。

  • for each pose, the homogeneous transformation between the calibration target frame and the camera frame is recorded using for instance a pose estimation method (PnP) from 2D-3D point correspondences
  1. 利用opencv内置的solvePnP()函数,获取N个 cal / target2cam矩阵。

  • The Hand-Eye calibration procedure returns the following homogeneous transformation
  1. 利用opencv内置的calibrateHandEye()函数,求解AX=XB。

  • Kinematic transformation pose matrix of rigid body motion of robot
  1. 位姿变换求解 目标物体坐标系相对于机器人基座系 obj2base = tool2base * cam2tool * cam *obj
  2. 控制机器人的api函数运动到指定位置,实时抓取动作。

Note:

  • A minimum of 2 motions with non parallel rotation axes are necessary to determine the hand-eye transformation. So at least 3 different poses are required, but it is strongly recommended to use many more poses.
  1. 确定手眼变换至少需要2个非平行旋转轴的运动。因此,至少需要3个不同的姿势,但强烈建议使用更多的姿势。

3.2.4 相关算子:

上述具体操作中还包含其他算子,包括标定版角点检测,亚像素角点细化,手动设定三维坐标等参数,需要同学们自己去查看相应算子,see OpenCV

  • convertPointsToHomogeneous(): 非齐次坐标转换齐次坐标
  • convertPointsFromHomogeneous(): 齐次坐标转换非齐次坐标
  • findChessboardCorners(): 检测标定板角点
  • find4QuadCornerSubpix(): 亚像素角点细化
  • findCirclesGrid(): 寻找圆形标定板角点
  • drawChessboardCorners(): 绘制检测到的角点
  • calibrateCamera(): 从校准图案的多个视角中找出摄像机内部和外部参数(内置solvePnP())
  • initUndistortRectifyMap(): 计算矫正图像需要的映射矩阵
  • remap(): 去掉原始图像中的畸变
  • undistort(): 对原始图像进行矫正
  • projectPoints(): 用于计算世界坐标系的三位点投影到像素坐标系中的二维坐标
  • solvePnP(): 计算世界坐标系到相机坐标系的旋转向量和平移向量
  • solvePnPRansac(): 同上并引入Ransac算法消除含有较大误差的数据
  • Rodrigues(): 实现旋转向量和旋转矩阵的相互转换
  • stereCalibrate(): 双目视觉标定

4. 标定

4.1 自动标定(目前代码只适用于xarm6+D435i)

其他版本的机械臂或者相机,请参考core文件,自行增补适用自己的代码

# Using Conda or Miniconda to install a virtual environment.
conda create -n robot python=3.8
# apt install required packages
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

windows端,请将Terminal终端格式切换至: ./Git/bin/sh.exe
若未安装,请去https://www.git-scm.com/ ,自行安装git bash

# go to code folder
bash ./experiments/scripts/run_calibration.sh --dis_img

以下命令中的test可以替换至./output/imgSave/中的新的标定文件名,默认为deom的test文件名
当前识别限制了类别: --苹果--,可修改./core/grasp.py中的代码,识别其他种类物体

# test grasp
bash ./experiments/scripts/online_grasp.sh test

4.2 其他说明

夹爪坐标系:在xarm6夹爪沿z轴方向最远处+1cm

代码:./core/

脚本:./experiments/scripts/

5. 结语

对于机械臂定位抓取目标物体,涉及到视觉,相机,机械臂方面的知识
视觉的相关知识,简单的demo就使用传统视觉算法,对抓取物体有要求的可使用深度学习目标检测算法
相机的相关知识,请查看博客和官网文档自行学习
机械臂的相关知识,可翻阅书籍 机器人学基础 中空间描述坐标变换,运动学,轨迹规划等章节
项目中的代码只是提供一个大致的逻辑框架,同学们需要自行查漏补缺,写出适合自己的代码
整个过程中的每一步操作都会对最后抓取结果的精确度造成不同程度的影响,理想结果是 在消除定长误差下保持x,y,z轴±1mm的误差
对结果造成影响的可能:工具坐标系的标定,SolvePnP算子的解AX=XB的方法等
尽可能保证每一步计算的三维空间坐标逼近真实值,可利用类似于重投影误差算子进行验算,matlab工具箱验算等
当实现对指定目标物体进行自上而下的抓取后,可拓展更多自由度的抓取...