运动控制与机器视觉融合编程案例介绍:工件抓取

欢迎来到广州研为官方频道!我们将在频道中不断更新运动控制案例讲解、小型项目代码讲解、运动控制知识科普、机器视觉知识科普等内容,只为与您一起交流分享运动控制的那些事。


目录

抓取实现功能

1 项目分析

1.1 相机标定(获取相机参数并优化)

1.2 设定坐标系(世界坐标系)

1.2.1 设定坐标系

1.2.2 视觉与运功控制融合——修改坐标系(坐标系偏移)

1.3 图像获取

1.4 坐标获取

1.5 结果显示

1.6 控制卡操作


@广州研为发布

抓取实现功能

  • 获取当前图像的目标工件中心坐标与工件数量,将位置传输至控制卡
  • 控制卡操作轴0、轴1(X轴、Y轴)运动,抓取工件至设定位置

演示视频:正在施工中~,可前往个人主页查看文章

 @广州研为发布

1 项目分析

        项目效果可被拆分为几个小的功能:相机标定、设定坐标系、图像获取、工件坐标获取、结果显示、控制卡操作,如图1.1所示。下文将对上述功能进行简要介绍。

图1.1

 

1.1 相机标定(获取相机参数并优化)

        相机标定在机器视觉中是一个基础且关键知识,想要从原理掌握这门知识是有难度的,但使用这一技巧进行开发较为简单的,网络上不乏关于这一方面的讲解与介绍。

        简要地说,相机标定的作用是:确定相机参数。通过拍摄的图像中多点的像素坐标值与这些点在实际中已知坐标值进行比较,从而计算出未知的相机参数(畸变、像点等)。

        相机标定完成后可以获得相机的一些列参数,这些参数可用于矫正因相机/镜头引起的图像畸变、转换坐标单位等,这对于图像测量以及机器视觉产生的坐标结果有很大影响。

        使用编程平台中的功能模块“相机标定”可一键生成代码,并插入其他Halcon开发项目中进行使用。本节中相机标定代码以Halcon为例,使用圆点标定板进行相机标定,生成相机参数,参考Halcon官方示例:3d_vision/camera_calibration_internal.hdev

*声明图像路径、打开/设置图像窗口
ImgPath := '3d_machine_vision/calib/'
dev_close_window ()
dev_open_window (0, 0, 652, 494, 'black', WindowHandle)
dev_update_off ()
dev_set_draw ('margin')
dev_set_line_width (3)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')

*相机标定
**生成面阵相机参数
gen_cam_par_area_scan_division (0.016, 0, 0.0000074, 0.0000074, 
326, 247, 652, 494, StartCamPar)
**相机参数:
****焦距Focus(mm),畸变系数Kappa,像元宽度(um),像元高度(um)
****像点坐标Cx(pixel),像点坐标Cy(pixel)
****图像宽度ImageWidth(pixel),图像高度ImageHeight(pixel)
**默认值:Kappa=0,Cx=ImageWidth/2,Cy=ImageHeight/2
**此处生成的仅为初步参数,在后续标定时会进行优化
**像元尺寸可在相机的参数手册上查询

**创建标定ID
create_calib_data ('calibration_object', 1, 1, CalibDataID)

**设置标定ID参数:相机参数
set_calib_data_cam_param (CalibDataID, 0, [], StartCamPar)

**设置标定ID参数:标定板参数
set_calib_data_calib_object (CalibDataID, 0, 'caltab_30mm.descr')

**遍历相机所拍摄的标定板图片,以此优化相机参数
NumImages := 10
for I := 1 to NumImages by 1
    **读取图像
    read_image (Image, ImgPath + 'calib_' + I$'02d')
    **显示图像
    dev_display (Image)

    **寻找图像中的标定板
    find_calib_object (Image, CalibDataID, 0, 0, I, [], [])
    **获取标定板边缘
    get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, I)

    **设置显示颜色为绿
    dev_set_color ('green')
    **显示标定板边缘
    dev_display (Caltab)
endfor

**根据读取的图像优化标定ID
calibrate_cameras (CalibDataID, Error)

**获取标定ID参数:相机参数(此时相机参数已被优化)
get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)

**将相机参数保存至文件,文件格式为dat
write_cam_par (CamParam, 'camera_parameters.dat')

**图像窗口信息
Message := 'Interior camera parameters have'
Message[1] := 'been written to file'
disp_message (WindowHandle, Message, 'window', 12, 12, 'red', 'false')
clear_calib_data (CalibDataID)

1.2 设定坐标系(世界坐标系)

        图像处理中输出的数据值一般是基于图像建立的像素坐标系进行表达,像素坐标系的原点一般建立在输入图像的左上角顶点,以图像左上角至右上角作为X轴正方向,以图像左上角至左下角作为Y正方向。像素坐标系如图1.2所示。因此,在像素坐标系下表达点的位置、两点距离等数据时,数据的单位是像素pixel。

        可以发现,图像处理中输出的数据与我们所熟悉的以毫米或米表达的坐标值、距离并不相同,因此我们需要对输出的数据进行单位转换,让数据以我们熟知的单位进行表达

图1.2

1.2.1 设定坐标系

        数据转换的核心是:确定当前点的像素坐标 <=> 需要表达的坐标,这两者之间的转换关系。明确两者的关系,我们除了需要知道相机参数,还需要设定一个坐标系用于表达转换后的坐标值,该坐标系称为世界坐标系

        设定自定义原点的世界坐标系是为了能够指定坐标原点的位置,使得转换后的坐标值都以该原点为基础进行表达。自定义坐标系步骤:

  1. 取多个在图像中且已知实际相对距离 (X / Y方向) 的固定点 (假设单位为mm)
  2. 获取这几个点在图像中的像素坐标
  3. 设定这些点中的某一点A为坐标原点(0,0) mm,将其余点根据该原点生成对应坐标值(Xn,Yn)mm
  4. 将这些坐标值与点对应的像素坐标值进行关联,从而生成以点A为原点的世界坐标系

        通过生成的世界坐标系对像素坐标进行转换:(X1, Y1)pixel => (X1`, Y1`)mm,转换获得的值单位为mm。同理,若在取已知点时坐标值设定的单位为m,则生成坐标系后转换所得的值单位也为m。

1.2.2 视觉与运功控制融合——修改坐标系(坐标系偏移)

        此时生成的世界坐标系已经能够正常转换像素坐标了,但要坐标还不能够被设备直接利用(例如电机),因为坐标系原点与电机机械原点的位置关系未知,所以我们需要进一步修改坐标系。

        确认两点位置关系需要将电机的执行末端移动至坐标系原点,记录该坐标值(单位与坐标系单位对应),再将该坐标值用于偏移坐标系转换所得的值后,它才能直接被电机使用,坐标值的偏移如图1.3所示。

图1.3

        偏移坐标值的方式有很多,例如在运动控制的函数中对坐标点进行距离补偿,在坐标系转换坐标后对所有值进行补偿,在坐标系设定之初就将坐标点的相对位置位置关系变为绝对位置关系......,此处仅为大家实现坐标偏移提供一些思路,具体实操方法不在此处展开说明。

        使用编程平台中的功能模块“坐标位姿”可一键生成代码,在程序中运行时可直接使用鼠标获取像素坐标,坐标数据也将自动根据偏移值对坐标进行偏移。

1.3 图像获取

         图像资源可通过本地导入或相机采集图像输入至程序。只有拥有图像资源,才能进行视觉处理并输出对应数据反馈至控制卡

       使用相机采集图像一般是通过使用相机品牌的函数库进行,通过调用方法对相机进行操作。具体操作方法不同品牌相机有不同操作,在后续的文章中将会更新海康相机的图像采集示例讲解,可以前往账户页面寻找文章:Halcon开发教程:输入图像资源

        使用编程平台中的功能模块“相机采集图像”可一键生成代码,代码中包含打开相机、配置相机、使用相机进行实时采图或触发采图、图像生成HObject变量等一系列操作,同时在工具的配套说明中包含有相机的开发环境配置讲解。

1.4 坐标获取

        视觉定位目标物体时首先需要确定目标物体的具体特征,通过比对特征辨别图像中目标是否存在,以及存在的数量与位置。不同的匹配方法间同样存在着各自的优劣势,因此在进行目标定位前,有必要根据工件的表面特征、形状特征,以及拍摄条件,节拍等选择处符合当前情况的最优方法。

        关于目标定位所涉及的模板,可在文章模板参数详解(上),模板参数详解(下)了解。

       编程平台中附带的模板快速生成软件使用的是基于形状的匹配方法:在模板图像中生成目标对应的特征边缘,在匹配时通过查找满足这些边缘特征的像素,并且定位在潜在目标上,潜在目标是否与实际目标一致则需要通过调试匹配参数进行确认。此匹配方法适合于边缘清晰且带有一定特征的物体。

         编程平台中的功能模块“搜索目标”,“定位目标”,“获取目标轮廓坐标”是基于形状匹配所整合的功能,所使用的特征文件也是与形状匹配相关。使用编程平台可一键生成对应的功能代码,组合代码即可实现:定位目标、获取目标轮廓等功能,配合运动控制模块可实现:工件抓取,沿工件轮廓运动

1.5 结果显示

         结果显示是对处理过程进行可视化处理,是使用图像窗口显示视觉处理结果,处理结果可视化是调试视觉程序的关键要素。

        以Halcon为例,在使用Halcon函数库进行开发时可以使用Halcon的窗口类HWindow创建图像窗口。关于图像窗口的创建于使用可在文章Halcon开发教程:创建图像窗口找到。

        使用编程平台中的功能模块“打开图像窗口”可一键生成代码,代码中针对图像窗口的创建、与窗口属性的设置、窗口显示尺寸等进行了优化操作。

1.6 控制卡操作

        控制卡操作一共有三个部分:控制卡打开并初始化,执行直线插补运动,执行点到点运动。

        在项目启动时,可同时将控制卡进行初始化,控制卡的初始化需要根据使用场景的不同对控制卡参数进行设置 ,控制卡设置参数的大体分为:

  • 控制卡控制设置
  • 脉冲输出/输入
  • 轴错误停止
  • 开关量输入/输出
  • 极限设置
  • 运动设置

        当运动需要进行多轴联动控制时,可使用插补功能对轴进行控制;操作单轴运动指定距离。可使用点到点运动。本项目中,操作多轴执行抓取一共分为以下几步:

  1. 映射轴0、轴1为轴X、轴Y,
  2. 接收视觉处理发送的坐标数据并进行单位转换(用户单位转控制卡单位)
  3. 将转换后的数据输入插补空间中,执行直线插补功能,即控制X/Y轴运动至坐标点
  4. 到达指定点后执行点到点运动,操作轴3(轴Z)运动指定距离到达工件上方(此时插入抓取程序)
  5. 抓取完成后,执行点到点运动回到设定高度
  6. 再次执行直线插补功能,控制轴运动至设定位置准备放置工件
  7. 到达位置后,执行点到点运动操作轴3(轴Z)运动至放置高度(此时插入释放程序)
  8. 放置完成后,执行点到点运动回到设定高度,随后移动至下一坐标点执行抓取(即步骤3)

总结:

        本文中介绍了通过运动控制卡+机器视觉的方式实现目标的定位与抓取。文章介绍了项目的主要流程与功能:相机标定、世界坐标系设定( WCSPose )、使用相机采集图像、获取工件坐标、如何使用Halcon显示处理结果、配置控制卡参数、执行直线插补、点到点运动等。

        至此文章就以接近尾声,十分感谢大家观看,如果大家觉得文章有帮助不妨点赞收藏,你们的关注既是对我们最大的鼓励!

        使用编程平台中的功能模块:“打开控制卡”、“配置控制卡”、“普通插补”、“点到点运动”可一键生成代码,可直接在项目中直接调用方法进行控制卡操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值