scare机器人如何手眼标定_SCARA机器人手眼标定之目标抓取

发布时间:2023-06-16 13:00

SCARA机器人手眼标定之目标抓取的例子:

显示如何基于由SCARA手眼校准确定的校准信息,使用SCARA机器人执行拾取和放置应用程序。 在第一步骤中,根据模型图像定义形状模型。 然后,基于该形状模型,在每个图像中搜索对象。 对于一个选定的对象,计算可用于掌握该对象的机器人坐标。 为了使该示例适用于实际应用,必须从相机获取图像(而不是从文件读取),并且必须实施机器人的控制(而不是在本示例中被注释掉的相应行)。 通常,图像必须在匹配之前校正。 如果摄像机完全正交于测量平面,则此步骤可以仅被省略。 要使用提供的示例图像运行示例程序,RectifyImages必须设置为true。

RectifyImages := true

\"\"*使用实例图像

RectifyImages := true

***********读取手眼标定结果***********************************

try

* 读取机器人坐标系下摄像机位姿

read_pose (\'cam_in_base_pose.dat\', CamInBasePose)

*读取摄像机内参

read_cam_par (\'camera_parameters.dat\', CameraParam)

*读取摄像机坐标系下测量平面位姿

read_pose (\'measurement_plane_in_cam_pose.dat\', MPInCamPose)

catch (Exception)

*当没有找到时,可以通过SCARA机械手有眼标定来获取位姿和摄像机内参

CamInBasePose := [0.05592166548,0.19497621789,0.48025117245,180.09816119,29.85593363,179.94389014,0]

CameraParam := [0.0165251,-642.277,4.65521e-006,4.65e-006,595.817,521.75,1280,1024]

MPInCamPose := [0.0045679683065,-0.0028695297318,0.4088853425,359.78658429,29.732027579,0.22946472765,0]

endtry

if (RectifyImages)

*获取摄像机坐标系下测量平面位姿校正后的映射关系

prepare_rectification_map (Map, CameraParam, MPInCamPose, MappingScale, MPInCamPoseMapping)

*将图像坐标系下圆点[0,0]坐标转换为世界坐标系下MapUpperLeftX, MapUpperLeftY坐标

image_points_to_world_plane (CameraParam, MPInCamPoseMapping, \\

0, 0, \'m\', MapUpperLeftX, MapUpperLeftY)

endif

*

dev_update_off ()

*该参数确定使用find_shape_model查找的形状模型可以部分在图像外面,允许

set_system (\'border_shape_models\', \'true\')

***************对含标定板图像进行校正********************

//这里,应该建立与机器人的连接,并且机器人应该移动到一个定义的待机姿态,允许获取测量平面的未被遮挡的图像

//定义要抓取的对象形状模型

//获取模型的图像

* 读取图像模板

read_image (Image, \'3d_machine_vision/handeye/scara_stationary_cam_setup_01_metal_parts_01\')

if (RectifyImages)

*通过映射投影图对图像进行校正

map_image (Image, Map, ModelImage)

else

copy_image (Image, ModelImage)

endif

*关闭打开的窗口

dev_close_window ()

*打开一个新窗口

dev_open_window_fit_image (ModelImage, 0, 0, 600, 600, WindowHandle)

*设置字体信息:字体大小14,字体类型:mono,粗体

set_display_font (WindowHandle, 16, \'mono\', \'true\', \'false\')

*清除窗口内容

dev_clear_window ()

*显示变换后的图像

dev_display (ModelImage)

*设置字宽度

dev_set_line_width (2)

********创建形状模板*********************************

*产生一个标准矩形

gen_rectangle1 (ModelROI, 400, 500, 1100, 1300)

*对图像进行高斯滤波

gauss_filter (ModelImage, ImageGauss, 5)

*剪切矩形里图像

reduce_domain (ImageGauss, ModelROI, ImageReduced)

*用剪切图像创建形状模板

create_shape_model (ImageReduced, \'auto\', rad(0), rad(360), \'auto\',\\

\'auto\', \'use_polarity\', [10,50], \'auto\', ModelID)

*获取模板矩形区域的面积,中心坐标;

area_center (ModelROI, ModelROIArea, ModelROIRow, ModelROIColumn)

*显示模板轮廓

dev_display_shape_matching_results (ModelID, \'green\', ModelROIRow, ModelROIColumn, 0, 1, 1, 0)

*通过记录相应的机器人姿势来定义物体上的抓取点

DefineGraspingPointByRobot := true

//指定对象的抓取点

//它要在图像中(只有当对象可以由工具以任何方向拾取时)

//或者通过用机器人抓取它并记录相应的机器人姿态

if (DefineGraspingPointByRobot)

dev_set_colored (12)

*机器人坐标系下模板抓取点位姿

GraspingPointModelInBasePose := [0.2592,0.1997,0.1224,0,0,1.2572,0]

*位姿反转,获取摄像机坐标系下机器人位姿

pose_invert (CamInBasePose, BaseInCamPose)

*将摄像机坐标系下机器人位姿转换为其次变换矩阵

pose_to_hom_mat3d (BaseInCamPose, BaseInCamHomMat3D)

*将仿射三维变换应用于点【GraspingPointModelInBasePose[0], \\

*GraspingPointModelInBasePose[1], GraspingPointModelInBasePose[2]】

affine_trans_point_3d (BaseInCamHomMat3D, GraspingPointModelInBasePose[0], \\

GraspingPointModelInBasePose[1], GraspingPointModelInBasePose[2], Qx, Qy, Qz)

*把点【Qx, Qy, Qz】投影到图像坐标系

project_3d_point (Qx, Qy, Qz, CameraParam, GraspingPointModelRow, GraspingPointModelColumn)

*抓取模板角度,位姿格式:[TransX; TransY ; TransZ; RotX; RotY; RotZ]

GraspingPointModelAngle := GraspingPointModelInBasePose[5]

*将图像坐标系下抓取位置点转换为世界坐标下,参数Scale可以缩放得到的三维坐标

image_points_to_world_plane (CameraParam, MPInCamPoseMapping, GraspingPointModelRow,\\

GraspingPointModelColumn, MappingScale, GraspingPointModelXMP, GraspingPointModelYMP)

*当前抓取坐标减去原点坐标

GraspingPointModelRow := GraspingPointModelYMP - MapUpperLeftY / MappingScale

GraspingPointModelColumn := GraspingPointModelXMP - MapUpperLeftX / MappingScale

endif

*显示模板矩形的面积和中心坐标

area_center (ModelROI, ModelROIArea, ModelROIRow, ModelROIColumn)

*设置模板原点坐标,该原点相对于形状模板重心的位置[GraspingPointModelRow - ModelROIRow,

* GraspingPointModelColumn - ModelROIColumn]

*设置手眼抓取零件位置与零件重心偏移量

set_shape_model_origin (ModelID, GraspingPointModelRow - ModelROIRow, \\

GraspingPointModelColumn - ModelROIColumn)

disp_continue_message (WindowHandle, \'black\', \'true\')

stop ()

*******循环读取机器人要抓取的物体的图像*********************

*将摄像机坐标系下测量平面位姿转换为其次变换矩阵

pose_to_hom_mat3d (MPInCamPoseMapping, MPInCamHomMat3DMapping)

//在下列图像中找被抓取的物体

for ImageIdx := 2 to 6 by 1

* 获取图像

read_image (Image,\\

\'3d_machine_vision/handeye/scara_stationary_cam_setup_01_metal_parts_\'+ ImageIdx$\'02d\')

*校正图像

if (RectifyImages)

map_image (Image, Map, SearchImage)

else

copy_image (Image, SearchImage)

endif

dev_clear_window ()

dev_display (SearchImage)

*在校正图像中寻找工件模板

find_shape_model (SearchImage, ModelID, rad(0), rad(360), 0.5, 0, 0.5,\\

\'least_squares\', [0,3], 0.9, Row, Column, Angle, Score)

if (|Row| 

disp_message (WindowHandle,\'No objects found\', \'window\', 12, 12, \'black\', \'true\')

continue

endif

*

* 获取最左边工件的抓取坐标和角度

LeftmostIdx := sort_index(Column)[0]

GraspingPointRow := Row[LeftmostIdx]

GraspingPointColumn := Column[LeftmostIdx]

GraspingPointAngle := Angle[LeftmostIdx]

*

* 显示匹配结果和待抓取的零件

dev_display_shape_matching_results (ModelID, \'blue\', Row, Column, Angle, 1, 1, 0)

dev_display_shape_matching_results (ModelID, \'green\', GraspingPointRow,\\

GraspingPointColumn, GraspingPointAngle, 1, 1, 0)

disp_message (WindowHandle, |Row| + \' objects found (Green: Object to be grasped)\',\\

\'window\', 12, 12, \'black\', \'true\')

disp_continue_message (WindowHandle, \'black\', \'true\')

*

* 计算出机器人坐标系下校正对象的位姿

calculate_point_to_approach_scara_stationary (GraspingPointRow, GraspingPointColumn, \\

GraspingPointAngle + rad(GraspingPointModelAngle), RectifyImages, \\

MapUpperLeftX, MapUpperLeftY,\\

MappingScale, MPInCamHomMat3DMapping, CameraParam, MPInCamPose, \\

CamInBasePose, ObjInBasePose)

*

*将摄像机坐标系下校正对象位姿中X,Y,Z偏移量转换为mm

ToolInBasePoseMM := [ObjInBasePose[0:2] * 1000,ObjInBasePose[3:6]]

* Pick and place the object

*在这里,机器人应该移动到上面确定的对象的位置(ToolInBasePoseMM),在那里对象应该被拾取,

*然后放置在某个预定位置(像PlacePositionInBasePoseMM)。

*最后,机器人应该再次移动到备用姿势,以便拍摄测量平面的未被遮挡的图像。

stop ()

endfor

//这儿机器人连接被关闭

*清除形状模板

clear_shape_model (ModelID)

**该参数确定使用find_shape_model查找的形状模型可以部分在图像外面,禁止

set_system (\'border_shape_models\', \'false\')

dev_clear_window ()

#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。如果需要本贴图片源码等资源,请向勇哥索取。

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号