Halcon pick_and_place_scara_stationary_cam.hdev程序学习
此示例显示如何基于由SCARA手眼校准确定的校准信息,使用SCARA机器人执行拾取和放置应用程序。 在第一步骤中,根据模型图像定义形状模型。 然后,基于该形状模型,在每个图像中搜索对象。 对于一个选定的对象,计算可用于掌握该对象的机器人坐标。 为了使该示例适用于实际应用,必须从相机获取图像(而不是从文件读取),并且必须实施机器人的控制(而不是在本示例中被注释掉的相应行)。 通常,图像必须在匹配之前校正。 如果摄像机完全正交于测量平面,则此步骤可以仅被省略。 要使用提供的示例图像运行示例程序,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)
CamInBasePose:=[0.05592166548,0.19497621789,0.48025117245,180.09816119,29.85593363,179.94389014,]
CameraParam := [0.0165251,-642.277,.65521e-,.65e-,595.817,521.75,, ]
MPInCamPose := [0.0045679683065,-0.0028695297318,0.4088853425,359.78658429,29.7320275 ,0.22946472765,]
endtry
//准备校准map以消除图像的失真
if (RectifyImages)
prepare_rectification_map (Map, CameraParam, MPInCamPose, MappingScale,MPInCamPoseMapping)
image_points_to_world_plane (CameraParam, MPInCamPoseMapping, , , 'm',MapUpperLeftX, MapUpperLeftY)
endif
dev_update_off ()
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, , , , , WindowHandle)
set_display_font (WindowHandle, , 'mono', 'true', 'false')
dev_clear_window ()
dev_display (ModelImage)
dev_set_line_width ()
//创建形状模型
gen_rectangle1 (ModelROI, , , , )
gauss_filter (ModelImage, ImageGauss, )
reduce_domain (ImageGauss, ModelROI, ImageReduced)
create_shape_model (ImageReduced, 'auto', rad(), rad(), 'auto', 'auto', 'use_polarity', [,], 'auto', ModelID)
area_center (ModelROI, ModelROIArea, ModelROIRow, ModelROIColumn)
dev_display_shape_matching_results (ModelID, 'green', ModelROIRow, ModelROIColumn, , , , )
//指定对象的抓取点
//它要在图像中(只有当对象可以由工具以任何方向拾取时)
//或者通过用机器人抓取它并记录相应的机器人姿态
DefineGraspingPointByRobot := true
if (DefineGraspingPointByRobot)
dev_set_colored ()
GraspingPointModelInBasePose := [0.2592,0.1997,0.1224,,,1.2572,]
pose_invert (CamInBasePose, BaseInCamPose)
pose_to_hom_mat3d (BaseInCamPose, BaseInCamHomMat3D)
affine_trans_point_3d (BaseInCamHomMat3D,GraspingPointModelInBasePose[], GraspingPointModelInBasePose[], GraspingPointModelInBasePose[], Qx, Qy, Qz)
project_3d_point (Qx, Qy, Qz, CameraParam, GraspingPointModelRow,GraspingPointModelColumn)
GraspingPointModelAngle := GraspingPointModelInBasePose[]
if (RectifyImages)
//计算校正图像坐标
image_points_to_world_plane (CameraParam, MPInCamPoseMapping, GraspingPointModelRow, GraspingPointModelColumn, MappingScale, GraspingPointModelXMP, GraspingPointModelYMP)
GraspingPointModelRow := GraspingPointModelYMP - MapUpperLeftY / MappingScale
GraspingPointModelColumn := GraspingPointModelXMP - MapUpperLeftX / MappingScale
//在以校正模型图片中显示抓取点
get_image_size (ModelImage, WidthM, HeightM)
CamParamRect := [,,MappingScale,MappingScale,-MapUpperLeftX / MappingScale,-MapUpperLeftY / MappingScale,WidthM,HeightM]
GraspingPointModelXMP := MapUpperLeftX + GraspingPointModelColumn * MappingScale
GraspingPointModelYMP := MapUpperLeftY + GraspingPointModelRow * MappingScale
PoseCoordSystemVis := [GraspingPointModelXMP,GraspingPointModelYMP,,,,GraspingPointModelA ngle,]
dev_set_colored ()
disp_3d_coord_system (WindowHandle, CamParamRect,PoseCoordSystemVis, 0.02)
else
//在原始模型图像中显示抓取点
pose_invert (CamInBasePose, BaseInCamPose)
pose_compose (BaseInCamPose, GraspingPointModelInBasePose,PoseCoordSystemVis)
dev_set_colored ()
disp_3d_coord_system (WindowHandle, CameraParam,PoseCoordSystemVis, 0.02)
endif
disp_message (WindowHandle, 'Model contours and grasping pose', 'window', , , 'black', 'true')
else
binary_threshold (ImageReduced, Region, 'max_separability', 'light', UsedThreshold)
fill_up (Region, RegionFillUp)
erosion_rectangle1 (RegionFillUp, RegionErosion, , )
smallest_rectangle2 (RegionErosion, GraspingPointModelRow,GraspingPointModelColumn, Phi, Length1, Length2)
gen_cross_contour_xld (GraspingPointModel, GraspingPointModelRow,GraspingPointModelColumn, , 0.785398)
dev_set_color ('yellow')
dev_display (GraspingPointModel)
disp_message (WindowHandle, 'Model contours and grasping point', 'window',, , 'black', 'true')
endif
area_center (ModelROI, ModelROIArea, ModelROIRow, 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 := to 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(), rad(), 0.5, , 0.5, 'least_squares', [,], 0.9, Row, Column, Angle, Score)
if (|Row| < )
disp_message (WindowHandle, 'No objects found', 'window', , , 'black', 'true')
continue
endif
//选择一个指定的实例,这儿是最左边的
LeftmostIdx := sort_index(Column)[]
GraspingPointRow := Row[LeftmostIdx]
GraspingPointColumn := Column[LeftmostIdx]
GraspingPointAngle := Angle[LeftmostIdx]
//显示匹配结果和指出要抓取的物体
dev_display_shape_matching_results (ModelID, 'blue', Row, Column, Angle, , , )
dev_display_shape_matching_results (ModelID, 'green', GraspingPointRow, GraspingPointColumn, GraspingPointAngle, , , )
disp_message (WindowHandle, |Row| + ' objects found (Green: Object to be grasped)', 'window', , , 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop()
//计算需要靠近的点
calculate_point_to_approach_scara_stationary (GraspingPointRow, GraspingPointColumn, GraspingPointAngle + rad(GraspingPointModelAngle), RectifyImages, MapUpperLeftX, MapUpperLeftY, MappingScale, MPInCamHomMat3DMapping, CameraParam, MPInCamPose, CamInBasePose, ObjInBasePose)
//显示要被抓取的物体和抓取点
dev_clear_window ()
dev_display (SearchImage)
dev_display_shape_matching_results (ModelID, 'green', GraspingPointRow, GraspingPointColumn, GraspingPointAngle, , , )
dev_set_colored ()
if (RectifyImages)
get_image_size (SearchImage, Width, Height)
CamParamRect := [,,MappingScale,MappingScale,-MapUpperLeftX / MappingScale,-MapUpperLeftY / MappingScale,Width,Height]
GraspingPointXMP := MapUpperLeftX + GraspingPointColumn * MappingScale
GraspingPointYMP := MapUpperLeftY + GraspingPointRow * MappingScale
PoseCoordSystemVis := [GraspingPointXMP,GraspingPointYMP,,,,-deg(GraspingPointAngle) + GraspingPointModelAngle,]
disp_3d_coord_system (WindowHandle, CamParamRect, PoseCoordSystemVis, 0.02)
else
pose_invert (CamInBasePose, BaseInCamPose)
pose_compose (BaseInCamPose, ObjInBasePose, PoseCoordSystemVis)
disp_3d_coord_system (WindowHandle, CameraParam, PoseCoordSystemVis, 0.02)
endif
disp_message (WindowHandle, 'Press F5 to pick and place indicated object', 'window', , , 'black', 'true')
disp_message (WindowHandle, ['ObjInBasePose:','Tx: ','Ty: ','Tz: ','Alpha: ','Beta: ','Gamma: '] + ['',ObjInBasePose[:]$'.3f' + [' m',' m',' m',' deg',' deg',' deg']], 'window', , , 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
//转换目标位置为mm
ToolInBasePoseMM := [ObjInBasePose[:] * ,ObjInBasePose[:]]
//抓取和放置物体
endfor
//这儿机器人连接被关闭
clear_shape_model (ModelID)
set_system ('border_shape_models', 'false')
dev_clear_window ()
Halcon pick_and_place_scara_stationary_cam.hdev程序学习的更多相关文章
- 通过反汇编C语言小程序学习Liunx汇编语言
大家好! 我是来自山东师范大学的吴乐. 今天在<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...
- Halcon的应用程序 打开后 弹出没有帮助文件错误提示
问题: Halcon的应用程序 打开后 弹出没有帮助文件错误提示 解决方法: 建立(C:\ProgramFiles\MVTec\halcon)目录,将halcon安装目录下的help文件夹复制过来即可 ...
- 微信小程序 学习资料
微信小程序 学习资料 资料名称 网址 官方教程 https://developers.weixin.qq.com/miniprogram/dev/index.html?t=18110517
- Tuxedo安装、配置、以及演示样例程序 (学习网址)
Tuxedo安装.配置.以及演示样例程序 (学习网址): 1.http://liu9403.iteye.com/blog/1415684 2.http://www.cnblogs.com/fnng/a ...
- Java开发桌面程序学习(一)——JavaFx+Jfoenix初始以及搭建
Java开发桌面程序学习(一)--JavaFx+Jfoenix初始以及搭建 前言 想做一个Java的桌面程序,但是,使用原生的Swing感觉又十分麻烦,那个布局都是拿代码设置,看着十分的乱,偶然的情况 ...
- 【微信小程序学习笔记】入门与了解
[微信小程序学习笔记(一)] IDE 下载安装 下载地址 官方工具:https://mp.weixin.qq.com/debug/w … tml?t=1476434678461 下载可执行文件后,可按 ...
- 微信小程序学习笔记二 数据绑定 + 事件绑定
微信小程序学习笔记二 1. 小程序特点概述 没有DOM 组件化开发: 具备特定功能效果的代码集合 体积小, 单个压缩包体积不能大于2M, 否则无法上线 小程序的四个重要的文件 *js *.wxml - ...
- 微信小程序学习笔记一 小程序介绍 & 前置知识
微信小程序学习笔记一 1. 什么是小程序? 2017年度百度百科十大热词之一 微信小程序, 简称小程序, 英文名 Mini Program, 是一种不需要下载安装即可使用的应用 ( 张小龙对其的定义是 ...
- 【C#】1.3 WPF应用程序学习要点
分类:C#.VS2015 创建日期:2016-06-14 使用教材:十二五国家级规划教材<C#程序设计及应用教程>(第3版) 一.要点概述 <C#程序设计及应用教程>(第3版) ...
随机推荐
- HDU 1513 最长子序列
Palindrome Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- D1.1.利用npm(webpack)构建基本reactJS项目
前提: 已经安装nodejs和npm #全局安装webpack 自动构建化工具,职能管理项目:webpack-dev-server是开发工具,提供 Hot Module Replacement 功能# ...
- 在Django中进行注册用户的邮件确认
之前利用Flask写博客时(http://hbnnlove.sinaapp.com),我对注册模块的逻辑设计很简单,就是用户填写注册表单,然后提交,数据库会更新User表中的数据,字段主要有用户名,哈 ...
- 在CDH5.5.0上安装Phoenix1.2
1.下载CLABS版本的Phoenix CLABS_PHOENIX-4.5.2-1.clabs_phoenix1.2.0.p0.774-el6.parcel和manifest.json文件 2.将文件 ...
- ubuntu13.04下建立嵌入式开发平台
linux下建立嵌入式交叉开发平台,需要三个基本部分:编辑工具.交叉工具链以及平台相关库. 一.编辑工具: 一般Linux系统本身都带有编辑工具,比如VI.VIM.gedit等.这里记录的是第三方编辑 ...
- UliPad ----python 开发利器
安装wxPython ...
- BAT技巧
FOR使用 枚举input.txt里的每一行,执行call :dosth %%i(以换行符为分割,默认是空格) for /f "delims=" %%i in (input.txt ...
- HeadFirst 设计模式
一.设计原则 封装变化 多用组合,少用继承 针对接口编程,不针对实现编程 为交互对象之间的松紧耦合设计而努力 对扩展开放,都修稿关闭 依赖抽象,不要依赖具体类 最少知识原则:之和朋友交谈 好莱坞原则: ...
- fzu2028
//Accepted 7324 KB 203 ms /* source:fzu2028 time :2015.5.29 by :songt */ /*题解: 树链剖分 单点更新,求路径和 */ #in ...
- 802.11MAC基础
做无线网络测试已经大半年了,在这过程中发现<802.11权威指南>真是以本好书,在这里分享一下学习到的知识,也帮助我记忆. 1.MAC: mac(媒介访问控制层),它位于物理层之上,控制着 ...