Dobot机械臂木块分拣

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

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

2.实验软件环境的搭建

2.1 所需要安装的软件

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

Dobot下载中心

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

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


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

在这里插入图片描述

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

opencv的安装:

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

环境变量:

包含目录:

库目录:

链接器:

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

3.关于手眼标定

3.1 原理

核心思想的公式:

T o b j e c t − i n − b a s e = T h a n d − i n − b a s e ⋅ T c a m e r a − i n − h a n d ⋅ T o b j e c t − i n − c a m e r a T_{object-in-base} = T_{hand-in-base}·T_{camera-in-hand}·T_{object-in-camera} Tobjectinbase=ThandinbaseTcamerainhandTobjectincamera

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

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

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

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

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

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

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

3.2 实验脚手架搭建

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

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

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

首先,连接机械臂:

初始化机械臂:

机械臂归零

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

设置JUMP运动方式的参数

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

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

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

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

接下来进行角点检测

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

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

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

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

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

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

3.4 寻找分类物体的中心

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

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

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

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

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

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

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

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

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

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.

  • 12
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值