halcon手眼标定
alcon算子 calibrate_hand_eye
名稱
calibrate_hand_eye —執行手眼校準。
原型
calibrate_hand_eye( : : CalibDataID : Errors)
描述
操作員根據校準數據模型確定機器人(“手”)相對于相機或3D傳感器(“眼睛”)的3D姿勢。借助確定的3D姿態,可以將攝像機坐標系中的校準對象的姿態轉換為機器人的坐標系,然后可以例如抓取被檢零件。機器人攝像機(手眼)系統有兩種可能的配置:攝像機可以安裝在機器人上,也可以靜止不動并觀察機器人。請注意,機器人一詞代替了移動物體的機制。因此,您可以用來校準許多不同的系統,從旋轉云臺到多軸機械手。 calibrate_hand_eyeCalibDataIDcalibrate_hand_eye
本質上,適用于手眼校準的系統由四個歐幾里德變換的閉合鏈描述。在此鏈中,兩個非連續的變換要么從機器人控制器中獲悉,要么從攝像機數據(例如,攝像機觀測到的校準對象姿態)計算得出。這兩個未知的常數轉換是通過手眼校準程序計算的。
與外部相機參數的校準類似地執行手眼校準(請參閱“校準/多視圖”):在相機坐標系中獲取一組校準對象的姿態,以及該工具的相應姿態在機器人基本坐標中設置并在校準數據模型中進行設置。 CalibDataID
與攝像機校準相反,校準對象不是手動移動的。該任務委托給機器人?;旧?#xff0c;可以區分兩種手眼校準方案。機器人會移動相機(移動相機)或移動校準對象(固定相機)。假定機器人的動作是已知的。它們用作手眼校準的輸入,并使用在校準數據模型中進行設置。 CalibDataIDset_calib_data
手眼校準的結果有兩個姿勢:對于移動攝像機場景,工具在攝像機坐標系中的3D姿態(‘tool_in_cam_pose’)和在機器人基本坐標系中的校準對象的3D姿態(’ obj_in_base_pose’)。對于固定攝像機場景,計算攝像機坐標系中機器人基座的3D姿態(‘base_in_cam_pose’)和工具坐標系中校準對象的3D姿態(‘obj_in_tool_pose’)。它們的姿勢類型與輸入姿勢的姿勢類型相同。如果輸入的姿勢具有不同的姿勢類型,則返回類型0的姿勢。
下面將詳細討論這兩種手眼校準方案,然后是有關數據的一般信息以及校準數據模型的準備。
移動相機(安裝在機器人上)
在這種配置下,校準對象保持靜止。攝像機安裝在機器人上,并由機器人移動到不同的位置。手眼校準背后的主要思想是,從校準對象的觀察結果中提取的信息(即校準對象相對于相機的姿態)可以看作是校準中的一系列姿態或均勻變換矩陣通過機器人的基礎將物體對準其工具(末端執行器),最后到達攝像機:
根據校準對象姿態(‘obj_in_cam_pose’)和機器人基礎坐標系中工具的姿態(‘tool_in_base_pose’)的集合,操作員 確定鏈末端的兩個缺少的變換,即相機坐標系中的機器人工具(, ‘tool_in_cam_pose’)和機器人基礎坐標系中的校準對象的姿態(,‘obj_in_base_pose’)。這兩個姿勢是恒定的。 calibrate_hand_eye
相反,鏈中間的變換 是已知的,但是每次對校準對象的觀察都會改變,因為它描述了工具相對于機器人基礎坐標系的姿態。在方程式中,使用了逆變換矩陣。反轉在內部執行。
請注意,在校準SCARA機械手時,無法確定’obj_in_base_pose’的Z平移。為了消除這種歧義,Z轉換’obj_in_base_pose’在內部設置為0.0,并相應地計算’tool_in_cam_pose’。在校準之后,必須通過將機器人移動到攝像機坐標系中已知高度的姿勢來確定Z值的真實平移。為此,可以采用以下方法:將校準板放置在任意位置。然后移動機器人,使攝像機可以觀察校準板?,F在,獲取校準板的圖像并查詢當前的機器人姿勢(ToolInBasePose1)。根據圖像,可以確定相機坐標系中校準板的姿態(ObjInCamPose1)。之后,將機器人的工具手動移動到校準板的原點,并再次查詢機器人的姿態(ToolInBasePose2)。這三個姿勢和校準結果(ToolInCamPose)可通過使用以下幾行代碼來修復Z歧義:
pose_invert(ToolInCamPose,CamInToolPose)
pose_compose(CamInToolPose,ObjInCamPose1,ObjInToolPose1)
pose_invert(ToolInBasePose1,BaseInToolPose1)
pose_compose(BaseInToolPose1,ToolInBasePose2,Tool2InTool1Pose0 [InIn),InInPose1] ToolInCamPoseFinal)
固定式相機
在這種配置下,機器人將抓住校準對象并將其移到攝像機前面。同樣,這次從校準對象的觀測值中提取的信息(即,校準對象在相機坐標系中的姿態(例如,外部相機參數))等于一連串的姿態或齊次變換矩陣通過機器人工具將校準對象固定到其基座,最后到達攝像機:
類似于移動攝像機的配置,操作員 確定鏈末端的兩個變換,這里是攝像機坐標中的機器人基本坐標系的姿態(, ‘base_in_cam_pose’)和校準對象相對于攝像機坐標的姿態。機器人工具(, ‘obj_in_tool_pose’)。 calibrate_hand_eye
鏈中間的轉換 描述了工具相對于機器人基礎坐標系的姿勢。該變換 描述了校準對象相對于相機坐標系的姿態。
請注意,在校準SCARA機械手時,無法確定’obj_in_tool_pose’的Z平移。為了消除這種歧義,“ obj_in_tool_pose”的Z轉換在內部設置為0.0,并相應地計算“ base_in_cam_pose”。在校準之后,必須通過將機器人移動到攝像機坐標系中已知高度的姿勢來確定Z值的真實平移。為此,可以采用以下方法:將校準板(未安裝在機器人上)放置在任意位置,以便攝像機可以觀察到。然后必須在攝像機坐標系中確定校準板的姿態(ObjInCamPose)。之后,將機器人的工具手動移動到校準板的原點,并查詢機器人的姿態(ToolInBasePose)。這兩個姿勢和校準結果(BaseInCamPose)可通過使用以下幾行代碼來修復Z歧義:
pose_invert(BaseInCamPose,CamInBasePose)pose_compose(CamInBasePose,ObjInCamPose,ObjInBasePose)
ZCorrection:= ObjInBasePose [2] -ToolInBasePose [2]
set_origin_pose(BaseInCamPose,0、0,ZCorrection,BaseInCamPoseFinal)
準備校準輸入數據
調用之前,必須使用以下步驟創建并填充校準數據模型: calibrate_hand_eye
使用操作員 創建校準數據模型,指定設置中的攝像機數量和使用的校準對象的數量。根據您的情況, 必須將其設置為“ hand_eye_moving_camera”, “ hand_eye_stationary_camera”, “ hand_eye_scara_moving_camera”或 “ hand_eye_scara_stationary_camera”create_calib_dataCalibSetup。這四個場景一方面區分是由機器人移動相機還是校準對象,另一方面區分是對鉸接式機器人還是SCARA機器人進行了校準。鉸接式機器人的手臂具有三個旋轉關節,通常覆蓋6個自由度(3個平移和3個旋轉)。SCARA機器人具有兩個平行的旋轉關節和一個平行的四角形關節,僅覆蓋4個自由度(3個平移和1個旋轉)。松散地說,多關節機器人能夠傾斜其末端執行器,而SCARA機器人則不能。
用運算符 指定優化方法。對于參數 = “optimization_method”,對兩個選項 是可用的,= “非線性” 和= “線性”(見第“執行實際手眼校準”)。 set_calib_dataDataNameDataValueDataValueDataValue
指定校準對象的姿勢
對于每次觀察校準對象,都可以使用操作員直接設置3D姿態 。該操作器旨在與觀察校準對象的通用3D傳感器一起使用。 set_calib_data_observ_pose
校準對象的姿態也可以使用相機圖像進行估算。必須由操作員 在校準數據模型中設置校準對象。初始攝像機參數必須由操作員設置。如果使用標準的HALCON校準板,則操作員將 確定校準板相對于攝像機的姿態,并將其保存在校準數據模型中。在這種情況下,鉸接式(即非SCARA)機器人的操作員在進行手眼校準之前先對攝像機進行校準。如果提供的攝像機參數已經過校準,則可以通過以下方式關閉攝像機校準: CalibDataIDset_calib_data_calib_objectset_calib_data_cam_paramfind_calib_objectCalibDataIDcalibrate_hand_eye
set_calib_data(CalibDataID,'camera','general','excluded_settings','params')。相反,對于SCARA,機器人始終假定提供的攝像機參數已經過校準。因此,在這種情況下,永遠不會在手眼校準之前自動執行內部攝像機校準。這是因為如果不將校準板相對于攝像機大幅傾斜,則無法可靠地校準內部攝像機參數。對于手眼校準,校準板通常大致平行于像平面。因此,對于SCARA機器人,所有攝像機姿態都近似平行。因此,必須事先使用一組不同的校準圖像對相機進行校準。 calibrate_hand_eye
在機器人基礎坐標中指定工具的姿勢。對于攝像機坐標系中校準對象的每個姿態,必須由操作員設置機器人基礎坐標系中工具的相應姿態
set_calib_data(CalibDataID,'tool',PoseNumber,'tool_in_base_pose',ToolInBasePose)執行實際的手眼校準
操作員可以兩種不同方式執行校準。在這兩種情況下,所有提供的校準對象在相機坐標中的姿態以及工具在機器人基礎坐標中的相應姿態都用于校準。用指定的方法。 calibrate_hand_eyeset_calib_data
對于參數組合 DataName= 'optimization_method’和 DataValue= ‘linear’,使用線性算法執行校準,該算法速度很快,但在許多實際情況下不夠準確。
對于參數 DataName= “ optimization_method”和 DataValue= “ nonlinear”,使用非線性算法執行校準,這將導致最準確的校準姿勢,因此是選擇的方法。
檢查校準是否成功
運算符返回中的完整變換鏈的姿態誤差。更確切地說,返回具有四個元素的元組,其中第一個元素是平移部分的均方根誤差,第二個元素是旋轉部分的均方根誤差,第三個元素是最大平移誤差,第四個元素是最大旋轉誤差。使用這些錯誤度量,可以確定校準是否成功。 calibrate_hand_eyeErrors
的是在將輸入的姿勢分別給予,即,相同的單元返回時,平移誤差以米給出典型和旋轉誤差總是以度表示。 Errors
獲取校準結果
可以使用來查詢由運算符計算出的姿勢。對于移動攝像機場景,可以獲得攝像機坐標系中工具的3D姿態(‘tool_in_cam_pose’)和機器人基礎坐標系中的校準對象的3D姿態(‘obj_in_base_pose’)。對于固定攝像機場景,可以獲得攝像機坐標系中機器人基座的3D姿態(‘base_in_cam_pose’)和工具坐標系中校準對象的3D姿態(‘obj_in_tool_pose’)。 calibrate_hand_eyeget_calib_data
查詢輸入數據
如果使用來計算校準對象相對于相機的姿態,則對于鉸接式(即非SCARA)機器人,它們將在手眼校準之前用于內部相機校準步驟中,并且也要進行校準??梢允褂?參數= 'calib_obj_pose’查詢校準的3D姿勢。如果使用通用3D傳感器觀察到校準對象的姿勢,則無法對其進行校準,并通過進行設置??梢允褂脕聿樵冞@些原始的3D姿勢。可以使用來查詢工具在機器人基座坐標系中的相應3D姿勢。 find_calib_objectget_calib_dataItemTypeset_calib_data_observ_poseget_calib_data_observ_poseget_calib_data
獲取一組合適的觀察結果
應考慮以下條件,尤其是在使用標準校準板的情況下:
校準對象的位置(移動攝像機:相對于機器人的底座;固定攝像機:相對于機器人的工具)和攝像機的位置(移動攝像機:相對于機器人的工具;固定攝像機:相對于機器人的底座)不得在校準姿勢之間更改。
即使理論上可以達到三個校準對象姿態的下限,也建議獲取10個或更多姿態,其中相機或機械手的姿態足夠不同。
對于鉸接式(即非SCARA)機器人,校準對象姿態之間的旋轉量至關重要,并且至少應為30度或更好的60度。姿勢之間的旋轉必須顯示至少兩個不同的旋轉軸。非常不同的方向可導致手眼校準的結果更加精確。對于SCARA機器人,只有一個旋轉軸。圖像之間的旋轉量也應該很大。
對于攝像機,在校準期間和之后,內部攝像機參數必須恒定。請注意,圖像尺寸,焦距,光圈或焦點的變化會導致內部相機參數的變化。
如上所述,在獲取單個圖像之間不得修改相機。請確保焦距足以滿足相機到標定板距離的預期變化。因此,校準板的明亮照明條件很重要,因為這樣您就可以使用較小的光圈,從而獲得更大的聚焦深度。
獲取機器人工具的姿勢
我們建議在單獨的程序中創建機器人姿勢,并使用將其保存在文件中。然后,您可以在校準程序中將它們導入并在校準數據模型中進行設置。 write_poseCalibDataID
通常,通過機器人的笛卡爾界面,您可以在機器人基本坐標中以與代碼0或2(= ‘gba’或’abg’,請參見)
表示的姿勢表示形式相對應的方式獲得工具的姿勢。在這種情況下,您可以直接使用從機器人獲得的姿勢值作為的輸入 。 OrderOfRotationcreate_posecreate_pose
如果你的機器人的笛卡爾接口描述了不同的方式,例如方位,以表示ZYZ( ),
您可以創建一個步驟中使用的運營商相應的齊次變換矩陣的步驟和然后將所得的矩陣轉換成使用姿勢。
以下示例代碼根據上述ZYZ表示創建一個姿勢:
hom_mat3d_rotatehom_mat3d_translatehom_mat3d_to_pose
hom_mat3d_identity(HomMat3DIdent)
hom_mat3d_rotate(HomMat3DIdent,phi3,‘z’,0,0,0,HomMat3DRotZ)
hom_mat3d_rotate(HomMat3DRotZ,phi2,‘y’,0,0,0,0_0,Y_Date(),HomMat3 0、0、0,HomMat3DRotZYZ)
hom_mat3d_translate(HomMat3DRotZYZ,Tx,Ty,Tz,base_H_tool)
hom_mat3d_to_pose(base_H_tool,RobPose)
請注意,手眼校準僅在高精度指定機器人基礎坐標中工具的姿勢時才有效!
總結
以上是生活随笔為你收集整理的halcon手眼标定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SM3算法的编程实现
- 下一篇: c语言题目详解——打印3的倍数的数