- 收藏
- 加入书签
基于opencv的ABB工业机器人视觉调试实例分析
摘要:作者采用visualstudio开发平台为基础,使用视觉辨别插件opencv3.0调用摄像头进行图像识别工作。然后在ABB工业机器人仿真软件robotstudio中使用PC软件开发工具包PC SDK,开通机器人控制器二次开发的接口。通过把ABB工业机器人的动态数据链文件导入visualstudio开发平台,visualstudio开发平台的视觉识别程序把摄像头拍摄的两张图片进行识别,得出偏移数据后以socket套接字通信方式送给ABB工业机器人,工业机器人通过接收XY轴的偏移数据,执行动作偏移程序。达成摄像头识别工件变化位置,机器人自动过去拾取的机器视觉工程测试案例。
关键词:visualstudio、opencv、ABB工业机器人、robotstudio、socket套接字、机器视觉
引言:
在工业检测中利用视觉系统的非接触、速度快、精度合适、现场抗干扰能力强等突出的优点,自动视觉识别检测目前已经用于产品外形和表面缺陷检验,如木材加工检测、金属表面视觉检测、二极管基片检查、印刷电路板缺陷检查、焊缝缺陷自动识别等。这些检测识别系统属于二维机器视觉,技术已经较为成熟,其基本流程是用一个摄像机获取图像,对所获取的图像进行处理及模式识别,检测出所需的内容。
为了能达到工程实际应用效果,本人使用VS程序与ABB工业机器人仿真软件robotstudio进行数据传输,自动捕捉搬运动作,体现了机器视觉工程技术的整个编程调试流程。
正文:
软件介绍
1.1 Visual Studio
Visual Studio 是一套完整的开发工具集,用于生成ASP.NET Web 应用程序、XML Web Services、桌面应用程序和移动应用程序。创建SQL Server解决方案,使用Visual Studio SDK创建可以扩展VisualStudio IDE的工具。首先安装visualstudio软件。
1.2 OpenCV
OpenCV是一个用于图像处理、分析、机器视觉方面的开源函数库,提供友好的机器视觉接口函数,从而使得复杂的机器视觉产品可以加速面世。
在win10系统中安装visualstudio软件和opencv软件,然后设置win10系统环境,找到安装OpenCV4.1.0下的相应安装目录的的bin路径,编辑开发软件的环境变量,如图1所示。
然后打开VisualStudio2017软件,源文件选择为C++类型,创建程序。在程序的属性管理器中导入Opencv的dll动态数据库文件,如图2所示。
在程序属性页中配置包含目录,如图3所示。配置库目录。
添加依赖项组件后,然后安装ABB工业机器人仿真软件robotstudio6.08。
1.3 RobotStudio
RobotStudio是一款非常强大的ABB机器人仿真软件,技术人员可以用RobotStudio开发新的机器人程序,特别是焊接和喷涂用途的机器人程序。
ABB工业机器人是瑞士ABB集团出品的工业用机械臂,常用于制造车间的焊接、喷涂、搬运与切割等作业过程。ABB工业机器人采用通用化模块化语言RAPID。RAPID语言类似于VB高级机器语言,包含了基本数据类型、组合数据类型和化名数据类型。RAPID语言中的进程程序没有返回值,只能用于构成指令内容;函数可以返回某一类型的数据值,可以用作指令参数;中断程序提供了中断原有程序,跳转到其他程序段并优先执行的逻辑功能。
RobotStudio是建立在ABB VirtualController控制系统上的,技术人员可以使用该软件在办公室轻易地模拟现场生产过程。
安装软件插件PC SDK。PC SDK是ABB工业人的PC软件开发工具包,使技术人员能够开通机器人控制器二次开发的接口。打开visual studio软件,在软件的引用管理器项目导入ABB机器人仿真软件安装路径中的dll动态数据库文件ABB.Robotics.Controllers、ABB.Robotics.Controllers.Discovery、ABB.Robotics.Controllers.RapidDomain。
2.通信程序范例
2.1 visualstudio图像识别程序
编程通信程序,以套接字socket通信方式连接visualstudio和robotstudio两款软件,程序具体程序如下:
// Server01.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include<iostream>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
using namespace cv;
//计算二值图中白色像素数量,输入为二值图
int countPixelNum(Mat src)
{
//二值化后,像素点是0或者255
int counter = 0;
//迭代器访问像素点
Mat_<uchar>::iterator it = src.begin<uchar>();
Mat_<uchar>::iterator itend = src.end<uchar>();
for (; it != itend; ++it)
{
if ((*it) > 0) counter += 1;//像素点大于0(即白色的像素点),则counter加1
}
return counter;
}
//对工件进行分类识别,返回值为int类型
int partDetected(int cam_flag)
{
int result = 0;
Mat inputImage;//原图像
Mat roiImage;//输出ROI图像
Mat grayImage, binaryImage, displayImg;
std::vector<std::vector<Point>> contours;
Rect partRect;
std::vector<Vec3f> circles;
char fileName[100];
int num;
std::cout << "请输入图片序号:";
std::cin >> num;
sprintf_s(fileName, "partImgs\\C%d.jpg", num);
inputImage = imread(fileName);//将相机获取的图像存储到inputImage原图像里面
if (inputImage.empty())//如果相机未获取到图像,结束程序
{
std::cout << "获取图像为空!!!\n";
exit(0);//退出
}
resize(inputImage, inputImage, Size(640, 480));
imshow("获取的图像", inputImage);//显示相机获取的图像
grayImage = inputImage.clone();
bitwise_not(grayImage, grayImage);//图像反差
cvtColor(grayImage, grayImage, CV_BGR2GRAY);//灰度化
threshold(grayImage, binaryImage, 150, 255, CV_THRESH_BINARY);//依据阈值对图像进行二值化分割
imshow("二值图", binaryImage);//显示二值化图像
findContours(binaryImage, contours, RETR_EXTERNAL,
CHAIN_APPROX_SIMPLE);//提取检测轮廓
float maxArea = 0;//存储最大轮廓面积
int maxIndex = 0;//存储最大轮廓对应的序号
for (int j = 0; j < contours.size(); j++)//遍历所有轮廓,提取最大轮廓
{
float area = contourArea(contours.at(j));//获得轮廓面积大小
if (area > maxArea)//比较轮廓大小
{
maxIndex = j;//将较大轮廓对应的序号存储在maxIndex
maxArea = area;//将较大轮廓面积存储在maxArea
}
}
void initialization();
int main() {
//int result = partDetected(0);
//printf("%d\n", result);
//定义长度变量
int send_len = 0;
int recv_len = 0;
int len = 0;
//定义发送缓冲区和接受缓冲区
char send_buf[100];
char recv_buf[100];
//定义服务端套接字,接受请求套接字
SOCKET s_server;
SOCKET s_accept;
//服务端地址客户端地址
SOCKADDR_IN server_addr;
SOCKADDR_IN accept_addr;
initialization();
//填充服务端信息
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(5010);
//创建套接字
2.2 ABB机器人软件端的动作程序
MODULE Module1
VAR socketdev a;
VAR string string1:="";
PROC main()
!Add your code here
SocketClose a;
SocketCreate a;
SocketConnect a, "127.0.0.1", 5010;
WHILE TRUE DO
SocketSend a\Str:="hello";
SocketReceive a\Str:=string1;
TPWrite string1;
on_True := StrToVal(string1,strVal);
IF strVal = 1 THEN
Path_10;
ENDIF
IF strVal = 2 THEN
Path_20;
ENDIF
IF strVal = 0 THEN
Path_30;
ENDIF
SocketReceive a\Str:=string1;
ENDWHILE
ENDPROC
PROC Path_10()
MoveL Target_10,v1000,z100,tool0\WObj:=wobj0;
MoveL Target_20,v1000,z100,tool0\WObj:=wobj0;
MoveL Target_10_2,v1000,z100,tool0\WObj:=wobj0;
ENDPROC
PROC Path_20()
MoveL Target_10_3,v1000,z100,tool0\WObj:=wobj0;
MoveL Target_30,v1000,z100,tool0\WObj:=wobj0;
MoveL Target_10_3_2,v1000,z100,tool0\WObj:=wobj0;
ENDPROC
PROC Path_30()
MoveL Target_40,v1000,z100,tool0\WObj:=wobj0;
MoveL Target_50,v1000,z100,tool0\WObj:=wobj0;
MoveL Target_40_2,v1000,z100,tool0\WObj:=wobj0;
ENDPROC
ENDMODULE
结束语
本文采用visualstudio开发平台为基础,使用视觉辨别插件opencv3.0调用摄像头进行图像识别工作。然后在ABB工业机器人仿真软件robotstudio中使用PC软件开发工具包PC SDK,开通机器人控制器二次开发的接口。通过把ABB工业机器人的动态数据链文件导入visualstudio开发平台,visualstudio开发平台的视觉识别程序把摄像头拍摄的两张图片进行识别,得出偏移数据后以socket套接字通信方式送给ABB工业机器人,工业机器人通过接收XY轴的偏移数据,执行动作偏移程序。达成摄像头识别工件变化位置,机器人自动过去拾取的机器视觉工程测试案例。
参考文献
【1】[美]Adrian Kaehler Gary学习OpenCV 3(中文版)[M]清华大学出版社 2018年
【2】曾建华 VisualStudio2015C#Windows数据库项目开发[M] 电子工业出版社 2018年
【3】龚仲华 ABB工业机器人从入门到精通[M] 化学工业出版社 2020年
【4】陈瞭 ABB工业机器人二次开发与应用[M] 电子工业出版社 2021年
【5】张明文 工业机器人视觉技术及应用[M] 人民邮电出版社 2020年
【6】陈海 工业机器人应用技术[M] 电子工业出版社 2018年
【7】工控帮教研组 机器视觉原理与案例详解[M] 电子工业出版社 2020年
作者简介:
吴嘉浩(1981-)男 讲师 电气工程在职研究生 广州市机电技师学院工业机器人专业教师