7:點云處理—眼在手外標定

1.制作模板

dev_update_off ()dev_set_color ('green')dev_close_window ()WindowHeight:=740WindowWidth :=740dev_open_window(0, 0, 540, 540, 'black', WindowHandle)Instruction := ['Rotate: Left button','Zoom:   Shift + left button','Move:   Ctrl  + left button']read_object_model_3d('./model/modelcalib3.om3','mm', [], [],ObjectModel3D, Status)triangulate_object_model_3d(ObjectModel3D, 'greedy', [], [], \Tri3D, Information)create_surface_model (Tri3D,  0.02, [], [], SurfaceModelID)Message := 'Surface model to be searched'pra_name:=['color_0','point_size_0','disp_pose']pra_value:=['magenta',1.0,'true']visualize_object_model_3d (WindowHandle, Tri3D, [], [], pra_name,pra_value, Message, [], Instruction, PoseOut)NumCalibrationScenes := 20

2.模板匹配

20組左右

dev_update_off ()dev_set_color ('green')dev_close_window ()WindowHeight:=740WindowWidth :=740dev_open_window(0, 0, 540, 540, 'black', WindowHandle)Instruction := ['Rotate: Left button','Zoom:   Shift + left button','Move:   Ctrl  + left button']read_object_model_3d('./model/modelcalib3.om3','mm', [], [],ObjectModel3D, Status)triangulate_object_model_3d(ObjectModel3D, 'greedy', [], [], \Tri3D, Information)create_surface_model (Tri3D,  0.02, [], [], SurfaceModelID)Message := 'Surface model to be searched'pra_name:=['color_0','point_size_0','disp_pose']pra_value:=['magenta',1.0,'true']
*     visualize_object_model_3d (WindowHandle, Tri3D, [], [], pra_name,pra_value, Message, [], Instruction, PoseOut)NumCalibrationScenes := 20ObjInCamPose5:=[]ObjInCamPose6:=[]ObjInCamPose7:=[]ObjInCamPose8:=[]ObjInCamPose9:=[]for I := 0 to 20 by 1read_object_model_3d('./scene/calib_scene/Object'+I, 'm', \[], [], ObjectScene, Status1)select_points_object_model_3d(ObjectScene, 'point_coord_z', \0.5, 700, ObjectZ)*         find_surface_model(SurfaceModelID, ObjectZ, 0.02, 0.3, 0.6,\'false', [], [], ObjInCamPose, Score, SurfaceMatchingResultID)if(|Score|>=1)rigid_trans_object_model_3d(ObjectModel3D, ObjInCamPose, ObjectdTrans)pra_name:=['color_0','color_1','point_size_0','disp_pose']pra_value:=['green','magenta',1.0,'true']Message:=I+'/20'visualize_object_model_3d (WindowHandle, [ObjectZ,ObjectdTrans], [], [], \pra_name,pra_value, Message, [], Instruction, PoseOut)write_pose(ObjInCamPose, './calib/ObjInCamPose/ObjInCamPose'+I+'.dat')endif*         stop()endfor

3.標定

dev_update_off ()dev_get_window(WindowHandle)* The number of files. 不要低于16, 低于16達不到精度NumCalibrationScenes :=20* 創建句柄  HECCalibDataID占內存,最終要銷毀create_calib_data ('hand_eye_stationary_cam', 0, 0, HECCalibDataID)*設置標定句柄的初始參數set_calib_data (HECCalibDataID, 'model', 'general', \'optimization_method', 'nonlinear')for I := 1 to 20 by 1*1.寫數據進入到標定句柄try*拍照點坐標Filename :='./calib/handeye/Pose' + (I)$'01d' + '.dat'read_pose (Filename, ToolInBasePose)ToolInBasePose[6]:=2convert_pose_type(ToolInBasePose, 'Rp+T', 'gba', 'point',ToolInBasePose1)*匹配點坐標read_pose('./calib/ObjInCamPose/ObjInCamPose' + I$'01d' + '.dat',ObjInCamPose)*兩個pose  都扔到句柄里面去,扔20次    機器人的歐拉角 轉換為 halcon 格式的歐拉角set_calib_data (HECCalibDataID, 'tool', I, 'tool_in_base_pose', ToolInBasePose)set_calib_data_observ_pose (HECCalibDataID, 0, 0, I, ObjInCamPose)catch (Exception)message:='第'+I+'個數據不存在'disp_message(WindowHandle, message, 'window', 12, 12, 'black', 'true')endtryendfor
stop()*2. 循環20次  分別向標定句柄 存放 ToolInBasePose和ObjInCamPose,20次, 注意一一對應關系,*ToolInBasePose*匹配全部結束  了  ,終于拿到了句柄HECCalibDataID!dev_clear_window ()disp_message (WindowHandle, 'Performing the hand-eye calibration', 'window', -1, -1, 'black', 'true')*3.計算標定*拍照點           ToolInBasePose1*工件在相機的坐標  ObjInCamPosecalibrate_hand_eye (HECCalibDataID, HECPoseError)*4.1獲取結果-兩個pose的保存get_calib_data (HECCalibDataID, 'camera', 0, 'base_in_cam_pose', BaseInCamPose)get_calib_data (HECCalibDataID, 'calib_obj', 0, 'obj_in_tool_pose',ObjInToolPose)*測試 ---動的pose是 計算不出來!*標定的結果,  通過20組  移動的ToolInBasePose,ObjInCamPose 標定出*兩個相對 不動的  BaseInCamPose  ,0bjInToolPosewrite_pose(BaseInCamPose, './calib/BaseInCamPose.dat')write_pose(ObjInToolPose, './calib/ObjInToolPose.dat')*4.2 打印出來標定精度 誤差多少,量化的一個結果dev_clear_window ()Message := 'Quality of the results:'Message[1] := ' 'Message[2] := 'Translation errors in mm: 'MeanTransError := HECPoseError[0]MaxTransError := HECPoseError[2]MeanHECPoseError:=HECPoseError[1]MaxHECPoseError:=HECPoseError[3]Message[3] := 'root mean square    ' + MeanTransError$'6.4f'Message[4] := 'maximum             ' + MaxTransError$'6.4f'Message[5] := ' 'Message[6] := 'Rotation error in degrees:        'Message[7] := 'root mean square    ' + HECPoseError[1]$'6.4f'Message[8] := 'maximum             ' + HECPoseError[3]$'6.4f'stop ()disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')disp_continue_message (WindowHandle, 'black', 'true')query_calib_data_observ_indices (HECCalibDataID, 'camera', 0, CalibObjIdx, PoseIds)stop() 

4.走點

* 使用  標定的時候  第一個點云*先得到點云  +匹配 read_pose('calib/ObjInCamPose/ObjInCamPose1.dat', ObjInCamPose)*固定拍照點*調取 兩個標定結果姿態read_pose('./calib/BaseInCamPose.dat', BaseInCamPose)
read_pose('./calib/ObjInToolPose.dat', ObjInToolPose)pose_invert(BaseInCamPose, CamInBasePose)
pose_invert(ObjInToolPose, ToolInObjPose)pose_compose(ObjInCamPose,ToolInObjPose,ToolInCamPose)
pose_compose(CamInBasePose, ToolInCamPose,ToolInBasePose)
*ToolInBasePose---  驗證  旋轉軸是0  
*換算成為機器人坐標系
convert_pose_type(ToolInBasePose, 'Rp+T', 'abg', 'point',ToolInBasePose2)if(ToolInBasePose2[3]>180)ToolInBasePose2[3]:=ToolInBasePose2[3]-360
endif
if(ToolInBasePose2[4]>180)ToolInBasePose2[4]:=ToolInBasePose2[4]-360
endif
if(ToolInBasePose2[5]>180)ToolInBasePose2[5]:=ToolInBasePose2[5]-360
endifstop()*[-264.325, -521.181, 138.24, -161.487, -1.92762, -167.703, 2]
*[-263.446, -521.104, 138.067, -161.598, -1.86336, -167.656, 2]*拍照值  
read_pose('calib/handeye/Pose1.dat', CapToolInBasePose)*計算出抓取點


眼在手外:相機固定不動,機械臂夾住標定板來回變換

機械臂拍照點ToolInBasePose1

匹配點ObjInCamPose

通過手眼標定文件,找出兩個不動的點??? BaseInCamPose 和 0bjInToolPose

最后給出匹配點,通過兩個不動的點

求解出機械臂抓取點 ToolInBasePose2

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904805.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904805.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904805.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI賦能智能客服革新:R2AIN SUITE 如何破解醫療行業服務難題?

一、什么是智能客服? 智能客服是基于人工智能技術(AI)的客戶服務解決方案,通過自然語言處理(NLP)、機器學習、大模型等核心技術,實現多模態交互、自動化應答、知識庫管理、流程優化等功能。其核…

(undone) MIT6.S081 Lec17 VM for APP 學習筆記

url: https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/lec17-virtual-memory-for-applications-frans/17.1-ying-yong-cheng-xu-shi-yong-xu-ni-nei-cun-suo-xu-yao-de-te-xing 17.1 應用程序使用虛擬內存所需要的特性 今天的話題是用戶應用程序使用的虛擬內存…

使用 OpenSSL 吊銷 Kubernetes(k8s)的 kubeconfig 里的用戶證書

一.用 OpenSSL 依據已有的自簽名 CA 注銷簽發的證書的步驟 1. 準備工作 你得有自簽名 CA 的私鑰(通常是 .key 文件)、CA 證書(通常是 .crt 文件)以及證書吊銷列表(CRL)文件。若還沒有 CRL 文件&#xff0c…

循環卷積(Circular Convolutions)

最近看論文發現了一個叫循環卷積的東西,這里學習并記錄一下,方便以后查閱。 循環卷積(Circular Convolutions) 循環卷積(Circular Convolutions)1. 什么是循環卷積2. 數學定義關鍵點 3. 循環卷積與線性卷積…

【計算機視覺】Car-Plate-Detection-OpenCV-TesseractOCR:車牌檢測與識別

Car-Plate-Detection-OpenCV-TesseractOCR:車牌檢測與識別技術深度解析 在計算機視覺領域,車牌檢測與識別(License Plate Detection and Recognition, LPDR)是一個極具實用價值的研究方向,廣泛應用于智能交通系統、安…

MATLAB制作柱狀圖與條圖:數據可視化的基礎利器

一、什么是柱狀圖與條圖? 柱狀圖和條圖都是用來表示分類數據的常見圖表形式,它們的核心目的是通過矩形的長度來比較各類別的數值大小。條圖其實就是“橫著的柱狀圖”,它們的本質是一樣的:用矩形的長度表示數值大小,不同…

[計算機科學#13]:算法

【核知坊】:釋放青春想象,碼動全新視野。 我們希望使用精簡的信息傳達知識的骨架,啟發創造者開啟創造之路!!! 內容摘要: 算法是解決問題的系統化步驟,不同的問題…

HTTP傳輸大文件的方法、連接管理以及重定向

目錄 1. HTTP傳輸大文件的方法 1.1. 數據壓縮 1.2. 分塊傳輸 1.3. 范圍請求 1.4. 多段數據 2. HTTP的連接管理 2.1. 短連接 2.2. 長連接 2.3. 隊頭阻塞 3. HTTP的重定向和跳轉 3.1. 重定向的過程 3.2. 重定向狀態碼 3.3. 重定向的應用場景 3.4. 重定向的相關問題…

PostgreSQL 18 Beta 1發布,有哪些功能亮點?

PostgreSQL 全球開發組于 2025 年 5 月 8 日發布了第一個 PostgreSQL 18 Beta 版本,現已開放下載。雖然細節可能會有所改變,但是該版本包含了 PostgreSQL 18 最終正式版中所有新功能的預覽。 以下是 PostgreSQL 18 引入的部分關鍵功能亮點。 性能優化 …

vue dev-tools插件

背景 在項目上用到vue技術,在bilibili上學習vue,期間老師推薦使用vue dev-tools調試神器,所以過來安轉和使用了,用了感覺不錯,希望給大家帶來效率的提升。 定義 Vue DevTools 是一款旨在增強 Vue 開發者體驗的工具&am…

單片機-FLASH軟件模擬EEPROM,提升flash保存重要參數的使用壽命

目錄 1. FLASH和EEPROM讀寫數據的對比 ??2. FLASH模擬EEPROM的原理 ??3. FLASH模擬EEPROM的優點 ??4. 實戰項目工程代碼 1. FLASH和EEPROM讀寫數據的對比 1.1 擦除操作 EEPROM通常支持按單字節擦除和寫入,這一特性使其非常適合需要頻繁更新小量數據的應…

探索Stream流:高效數據處理的秘密武器

不可變集合 stream流 Stream流的使用步驟: 先得到一條Stream流(流水線),并把數據放上去 使用中間方法對流水線上的數據進行操作 使用終結方法對流水線上的數據進行操作 Stream流的中間方法 注意1:中間方法&#xff0…

vue3筆記(自存)

1. Vue3簡介 2020年9月18日,Vue.js發布版3.0版本,代號:One Piece(n 經歷了:4800次提交、40個RFC、600次PR、300貢獻者 官方發版地址:Release v3.0.0 One Piece vuejs/core 截止2023年10月,最…

實驗4 mySQL查詢和視圖

一、實驗目的 掌握SELECT語句的基本語法多表連接查詢GROUP BY的使用方法。ORDER BY的使用方法。 二、實驗步驟、內容、結果 實驗內容: 實驗4.1數據庫的查詢 目的與要求 (1)掌握SELECT語句的基本語法。 (2)掌握子查詢的表示。 (3)掌握連接查詢的表示。 (4)掌…

【bug】fused_bias_act_kernel.cu卡住沒反應

簡述 在推理人臉修復face restoration算法 GPEN的時候,發現有時候fused_bias_act_kernel.cu卡住沒反應。 解決 清理下緩存,讓程序自己再編譯下

.net/C#進程間通信技術方案總結

C# 應用進程間通信(IPC)技術方案 進程間通信(Inter-Process Communication, IPC)是不同進程之間交換數據和消息的機制。以下是C#中常用的IPC技術方案: 1. 命名管道(Named Pipes) 適用于本地機器上的進程通信,支持雙向通信。 ??服務端示例??&…

阿里云服務器數據庫故障排查指南?

阿里云服務器數據庫故障排查指南? 以下是針對阿里云服務器(如ECS自建數據庫或阿里云RDS等托管數據庫)的故障排查指南,涵蓋常見問題的定位與解決方案: 一、數據庫連接失敗 檢查網絡連通性 ECS自建數據庫 確認安全組規則放行數據庫…

深度學習 ———— 遷移學習

遷移學習原理 什么是遷移學習? 遷移學習利用在大規模數據集(如ImageNet)上預訓練的模型,改裝小數據集(如CIFAR-10)。優勢: 減少訓練時間:預訓練模型已學習通用特征(如邊…

單調棧模版型題目(3)

單調棧型題目貢獻法 基本模版 這是數組a中的 首先我們要明白什么叫做貢獻,在一個數組b{1,3,5}中,連續包含1的連續子數組為{1},{1,3},{1,3,5},一共有三個,這三個數一共能組成6個連續子數組,而其…

日常知識點之隨手問題整理(思考單播,組播,廣播哪個更省帶寬)

新入職的公司在某些場景下無腦使用組播技術,自己突然就意識到一個問題:單播,組播,廣播,哪個更省帶寬? 有所收獲,做點筆記,僅僅是個人理解~ 1:簡單理解 單播&#xff1…