dev_update_off()dev_set_color('green')* Open a window if the correct size.dev_close_window()
WindowWidth :=512
WindowHeight :=384* Directories containing images and data files.
ImagesDir := '3d_machine_vision/hand_eye/robot_gripper_gray_'
dev_open_window(0, WindowWidth +10, WindowWidth, WindowHeight,'black', ImageWindowHandle)dev_open_window(0,0, WindowWidth, WindowHeight,'black', WindowHandle)set_display_font(WindowHandle,14,'mono','true','false')set_display_font(ImageWindowHandle,14,'mono','true','false')
Instruction :=['Rotate: Left button','Zoom: Shift + left button','Move: Ctrl + left button']*1.读取点云模型
read_object_model_3d('hand_eye/robot_gripper_3d_model.om3',1,[],[], OM3DModel, Status)*创建点云模型
create_surface_model(OM3DModel,0.03,[],[], SurfaceModelID)
Message :='Surface model to be searched'*显示点云模型
sample_object_model_3d(OM3DModel,'fast',0.0009,[],[], SampledObjectModel3D)visualize_object_model_3d(WindowHandle, SampledObjectModel3D,[],[],'color_0','gray', Message,[], Instruction, PoseOut)* The number of files.
NumCalibrationScenes :=15* 创建手眼标定模型,同时多个角度匹配事实的点云数据
create_calib_data('hand_eye_stationary_cam',0,0, HECCalibDataID)* 设置优化速度
set_calib_data(HECCalibDataID,'model','general','optimization_method','nonlinear')for I :=1 to NumCalibrationScenes by 1read_image(ImageRobotGripperGray, ImagesDir + I$'02d')* 读取位姿,工具坐标相对于机器人坐标的姿态
*read_pose('tool_in_base_pose_'+ I$'02d'+'.dat', ToolInBasePose)read_pose('C:/Users/Public/Documents/MVTec/HALCON-17.12-Progress/examples/hdevelop/Calibration/Hand-Eye/tool_in_base_pose_'+ I$'02d' + '.dat',ToolInBasePose)*物体相对于传感器的位姿
filename :='hand_eye/robot_gripper_3d_scene_'+ I$'02d'*读取模型
read_object_model_3d(filename,1,[],[], OM3DScene, Status1)find_surface_model(SurfaceModelID, OM3DScene,0.05,1,0,'false',[],[], ObjInCamPose, Score, SurfaceMatchingResultID)refine_surface_model_pose(SurfaceModelID, OM3DScene, ObjInCamPose,0,'false',[],[], ObjInCamPose, Score, SurfaceMatchingResultID1)if(|Score|)*如果有得分设置到模型里面
set_calib_data(HECCalibDataID,'tool', I,'tool_in_base_pose', ToolInBasePose)set_calib_data_observ_pose(HECCalibDataID,0,0, I, ObjInCamPose)
endif
*仿射运算显示
pose_to_hom_mat3d(ObjInCamPose, HomMat3D)affine_trans_object_model_3d(SampledObjectModel3D, HomMat3D, OM3DModelTrans)*显示场景图片
if(I <4)* Clear both windows.dev_clear_window()dev_set_window(ImageWindowHandle)dev_display(ImageRobotGripperGray)disp_message(ImageWindowHandle,'Image from pinhole camera','window',12,12,'black','true')dev_set_window(WindowHandle)
Message := 'Surface model is matched in the 3D scene.'
Message[1]:= 'Points of the current scene are gray.'
Message[2]:= 'Points of the matched model are green.'
* For better visualization, reduce the point density of the model.sample_object_model_3d(OM3DScene,'fast',0.0009,[],[], SampledOM3DScene)disp_message(WindowHandle, Message,'window',12,12,'black','true')
Message :='Scene: '
Message[1]:= I +' of '+ NumCalibrationScenes
disp_message(WindowHandle, Message,'window',80,12,'white','false')* Visualize matching result with user interaction.visualize_object_model_3d(WindowHandle,[SampledOM3DScene,OM3DModelTrans],[],[],['color_0','color_1','disp_background'],['gray','green','true'],[],[], Instruction, PoseOut)
endif
endfor
clear_object_model_3d([OM3DScene,OM3DModelTrans,SampledOM3DScene])*3 手眼标定
calibrate_hand_eye(HECCalibDataID, HECPoseError)*4.获取姿态
* 基础坐标系对于传感器(机械手)的姿态
get_calib_data(HECCalibDataID,'camera',0,'base_in_cam_pose', BaseInSensorPose)* 物体相对于传感器的姿态
get_calib_data(HECCalibDataID,'calib_obj',0,'obj_in_tool_pose', ObjInToolPose)