当前位置: 首页>前端>正文

opencv 手臂检测 opencv应用于机械臂抓取


机器人工程实践

  • 1.实验题目:基于opencv的木块分拣实验
  • 1.1实验目的:掌握编写c++程序脚本并部署到硬件设备的能力;内置API配合opencv来操作机械臂进行物块的分拣
  • 2.实验软件环境的搭建
  • 2.1 所需要安装的软件
  • 3.关于手眼标定
  • 3.1 原理
  • 3.2 实验脚手架搭建
  • 3.3 角点检测与旋转矩阵求解
  • 3.4 寻找分类物体的中心
  • 4.实验用到重要的参考材料
  • 5. Source Code Access


1.实验题目:基于opencv的木块分拣实验

1.1实验目的:掌握编写c++程序脚本并部署到硬件设备的能力;内置API配合opencv来操作机械臂进行物块的分拣

2.实验软件环境的搭建

2.1 所需要安装的软件

由于实验使用的是实验室所提供的电脑,所以操作系统使用的是windows,我们需要在其上部署visual studio和Dobot studio(已经安装过),并配置opencv的环境和Dobot的API环境,

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_深度学习,第1张

出于稳定性和配置出现问题的可查性考虑,我下载的是Dobot Demo v2.0版本的文件

压缩包的内容,可供我使用的Dobot Magicain Demo说明的pdf文件,这里我可以查看关于机械臂操作的一些API,还有就是DobotDll/Precompiled/Windows/x64下的DobotDll压缩文件,

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_机械臂_02,第2张

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_API_03,第3张

在实验和配置过程中会出现如下的错误:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_opencv 手臂检测_04,第4张

可以知道这是Dobot的sdk的问题,经过查询网络和实验指导书,通过修改两个地方最终成功通过编译运行: 需要注释掉#include "dobotdll_global.h"头文件 并删掉该文件所有的 DOBOTDLLSHARED_EXPORT 虽然后来证实这是关于dobot提供的摄像头的相关配置文件,我们在实验中并不会用到,但是这确实阻碍了我去在整个visual studio项目中配置我的Dobot API

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_机械臂_05,第5张

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_opencv 手臂检测_06,第6张

opencv的安装:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_角点检测_07,第7张

需要将安装好的环境在visual studio中设置环境变量,修改的地方包括系统环境变量、包含目录、库目录、链接器,步骤较多,简单展示部分的配置:

环境变量:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_opencv 手臂检测_08,第8张

包含目录:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_深度学习_09,第9张

库目录:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_API_10,第10张

链接器:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_opencv 手臂检测_11,第11张

我将环境配置在我的用户名下,所以最终会包含的文件展示如下:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_机械臂_12,第12张

3.关于手眼标定

3.1 原理

核心思想的公式:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_角点检测_13,第13张

首先明确坐标系:机械臂项目一般存在四个坐标系

基坐标系:机械臂的基座为原点的坐标系

末端关节坐标系:一般机械臂末端关节会覆盖一层法兰,因此机械臂末端关节坐标系又为法兰末端坐标系,实际上,末端关节坐标系在基坐标系下的位姿,就是我们常说的机械臂位姿

工具末端坐标系:显然机械臂在工作过程中,机械臂末端会搭载工具,而我们往往希望工具移动到某个位置,而不是机械臂末端运动到某个位置,这时我们就需要为工具建立一个它自己的坐标系,也就是工具末端坐标系

相机坐标系:一般机械臂AI项目,会搭载相机作为视觉传感器,搭载位置可以放在机械臂末端上,称为“眼在手上(on hand)”;搭载在机械臂之外的固定位置,称为“眼在手下(off hand)”

所以上述的公式翻译过来就是: 物体在基坐标系下的位姿 = 手在基坐标系下的位姿 * 相机在末端坐标系下的位姿 * 物体在相机中的位姿

我们这里受限于实验的设备,使用基于2D相机的手眼标定,通过棋盘格的方式,通过相机拍摄的图像检测棋盘格的角点,来得到棋盘格在相机中的位姿

3.2 实验脚手架搭建

我们需要通过计算标定矩阵来将相机坐标系下的坐标转化为机械臂基坐标系下的坐标

我们选取手机的拍摄的图像作为标定依据,由于手机的位置并不固定,所以我们需要将木块和被标定的点放在同一张图像中,可以有效地避免重复标定

但是在这之前,我们需要先根据Dobot的API搭建起初始化和操作机械臂的脚手架代码:

首先,连接机械臂:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_角点检测_14,第14张

初始化机械臂:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_API_15,第15张

机械臂归零

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_opencv 手臂检测_16,第16张

设置ptp模式下各笛卡尔坐标轴的速度和加速度

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_opencv 手臂检测_17,第17张

设置JUMP运动方式的参数

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_API_18,第18张

确定抓取点和放置点的坐标

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_角点检测_14,第14张

根据Dobot-Magician-API-V1.2.3手册可以找到对于气泵收放状态的操作函数API

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_深度学习_20,第20张

先运行了一点基础函数,来检测是否正常运行:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_API_21,第21张

3.3 角点检测与旋转矩阵求解

接下来进行角点检测

首先将输入的图像转变为灰度图,为了让角点更加准确,我们对其进行开操作,在最后使用goodFeaturesToTrack()进行Shi-Tomasi角点检测,得到的图像如下图所示

选取棋盘格的左上角左下角和右下角作为我们的标定点

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_深度学习_22,第22张

在这之前尝试对于goodFeaturesToTrack()只传3个检测角点,但是因为我的棋盘格本来就设计的不大,相对于机械臂末端吸盘的大小而言,在后面进行坐标数据采集的时候差别太小,导致误差过大

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_opencv 手臂检测_23,第23张

连接Dobot studio,移动机械臂到对应的标定点,软件自动记录相应坐标:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_深度学习_24,第24张

按照格式将上述的自动记录坐标写入到data.txt文件中去,计算对应的旋转矩阵,具体代码展示如下:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_API_25,第25张

这样,我们就得到了一个固定的旋转矩阵X

3.4 寻找分类物体的中心

类似于上面的角点检测的做法,我会先对输入的图像颜色转化为灰色并进二值化,得到二值图像,接着进行开操作。

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_opencv 手臂检测_26,第26张

借助opencv的findContours函数进行物体的轮廓描绘。定义contours为“vector

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_机械臂_27,第27张

而hierarchy定义为“vector hierarchy”,Vec4i的定义:typedef Vec

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_深度学习_28,第28张

当我得到对象轮廓后,用boundingRect()得到包覆此轮廓的最小正矩形,minAreaRect()得到包覆轮廓的最小斜矩形,通过设定阈值rect.size.height * rect.size.width 和 10000的比较,来最终求解得到分类物体的中心的坐标

这里对图像处理的效果展示,这里的效果很大程度上取决于我的阈值设置,其实效果不很理想

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_角点检测_29,第29张

这样,机械臂就会依次移动到给定的位姿,然后将物块吸取移动到要放置的位姿这样的任务

在实验中会发现z轴坐标值的选取也对实验的成功与否有比较重要的影响。还有通过手动调试,发现计算的机械臂坐标系下的坐标是正确的,但机械臂无法移动到计算的位置抓取木块的情况,这个时候机械臂就会在初始位置开始吸取。推测可能是因为机械臂无法自动移动到该坐标。

最后附一张没啥意义的实验图:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_机械臂_30,第30张

我的main函数的大致流程如下所示:

opencv 手臂检测 opencv应用于机械臂抓取,opencv 手臂检测 opencv应用于机械臂抓取_深度学习_31,第31张

4.实验用到重要的参考材料

Dobot-Magician-API-V1.2.3.pdf

视觉套件实验指导书.pdf

实验指导:垃圾分拣实验.ppt

5. Source Code Access

Github Link for source code: Dobot Experiment Feel free to fork and star.



https://www.xamrdz.com/web/2w81942391.html

相关文章: