OpenCV相機標定與3D重建(11)機器人世界手眼標定函數calibrateRobotWorldHandEye()的使用

  • 操作系統:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 編程語言:C++11

算法描述

計算機器人世界/手眼標定: w T b _{}^{w}\textrm{T}_b w?Tb? c T g _{}^{c}\textrm{T}_g c?Tg?
cv::calibrateRobotWorldHandEye 是 OpenCV 中用于機器人世界手眼標定的函數。該函數通過已知的世界坐標系(world)、相機坐標系(cam)、基座坐標系(base)和平板坐標系(gripper)的姿態來計算基座相對于世界的姿態以及末端執行器相對于相機的姿態。

函數原型

void cv::calibrateRobotWorldHandEye
(InputArrayOfArrays 	R_world2cam,InputArrayOfArrays 	t_world2cam,InputArrayOfArrays 	R_base2gripper,InputArrayOfArrays 	t_base2gripper,OutputArray 	R_base2world,OutputArray 	t_base2world,OutputArray 	R_gripper2cam,OutputArray 	t_gripper2cam,RobotWorldHandEyeCalibrationMethod 	method = CALIB_ROBOT_WORLD_HAND_EYE_SHAH 
)	

參數

  • 參數R_world2cam: 從世界坐標系(world)到相機坐標系(camera)的齊次矩陣中提取的旋轉部分 (cTw)。這是一個包含所有從世界坐標系到相機坐標系變換的旋轉矩陣 (3x3) 或旋轉向量 (3x1) 的向量 (vector)。
  • 參數t_world2cam: 從世界坐標系(world)到相機坐標系(camera)的齊次矩陣中提取的平移部分 (cTw)。這是一個包含所有從世界坐標系到相機坐標系變換的平移向量 (3x1) 的向量 (vector)。
  • 參數R_base2gripper: 從機器人基座坐標系(base)到末端執行器坐標系(gripper)的齊次矩陣中提取的旋轉部分 (gTb)。這是一個包含所有從機器人基座坐標系到末端執行器坐標系變換的旋轉矩陣 (3x3) 或旋轉向量 (3x1) 的向量 (vector)。
  • 參數t_base2gripper: 從機器人基座坐標系(base)到末端執行器坐標系(gripper)的齊次矩陣中提取的平移部分 (gTb)。這是一個包含所有從機器人基座坐標系到末端執行器坐標系變換的平移向量 (3x1) 的向量 (vector)。
  • 參數R_base2world: 估計的從機器人基座坐標系(base)到世界坐標系(world)的齊次矩陣中提取的旋轉部分 (wTb),即 (3x3) 旋轉矩陣。
  • 參數t_base2world: 估計的從機器人基座坐標系(base)到世界坐標系(world)的齊次矩陣中提取的平移部分 (wTb),即 (3x1) 平移向量。
  • 參數R_gripper2cam: 估計的從末端執行器坐標系(gripper)到相機坐標系(camera)的齊次矩陣中提取的旋轉部分 (cTg),即 (3x3) 旋轉矩陣。
  • 參數t_gripper2cam: 估計的從末端執行器坐標系(gripper)到相機坐標系(camera)的齊次矩陣中提取的平移部分 (cTg),即 (3x1) 平移向量。
  • 參數method: 實現的機器人世界/手眼標定方法之一,參見 cv::RobotWorldHandEyeCalibrationMethod。

代碼示例


#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>using namespace cv;
using namespace std;int main()
{// 假設我們有四組數據,分別對應不同的抓取位置int num_poses = 4;// 從 world 到 cam 的旋轉矩陣和位移向量vector< Mat > R_world2cam( num_poses );vector< Mat > t_world2cam( num_poses );// 從 base 到 gripper 的旋轉矩陣和位移向量vector< Mat > R_base2gripper( num_poses );vector< Mat > t_base2gripper( num_poses );// 初始化示例數據R_world2cam[ 0 ] = ( Mat_< double >( 3, 3 ) << 1, 0, 0, 0, 1, 0, 0, 0, 1 );t_world2cam[ 0 ] = ( Mat_< double >( 3, 1 ) << 0.1, 0.2, 0.3 );R_world2cam[ 1 ] = ( Mat_< double >( 3, 3 ) << 0, -1, 0, 1, 0, 0, 0, 0, 1 );t_world2cam[ 1 ] = ( Mat_< double >( 3, 1 ) << 0.4, 0.5, 0.6 );R_world2cam[ 2 ] = ( Mat_< double >( 3, 3 ) << 0, 0, -1, 0, 1, 0, 1, 0, 0 );t_world2cam[ 2 ] = ( Mat_< double >( 3, 1 ) << 0.7, 0.8, 0.9 );R_world2cam[ 3 ] = ( Mat_< double >( 3, 3 ) << 0, 0, 1, 0, 1, 0, -1, 0, 0 );t_world2cam[ 3 ] = ( Mat_< double >( 3, 1 ) << 1.0, 1.1, 1.2 );R_base2gripper[ 0 ] = ( Mat_< double >( 3, 3 ) << 1, 0, 0, 0, 1, 0, 0, 0, 1 );t_base2gripper[ 0 ] = ( Mat_< double >( 3, 1 ) << 0.3, 0.4, 0.5 );R_base2gripper[ 1 ] = ( Mat_< double >( 3, 3 ) << 0, -1, 0, 1, 0, 0, 0, 0, 1 );t_base2gripper[ 1 ] = ( Mat_< double >( 3, 1 ) << 0.6, 0.7, 0.8 );R_base2gripper[ 2 ] = ( Mat_< double >( 3, 3 ) << 0, 0, -1, 0, 1, 0, 1, 0, 0 );t_base2gripper[ 2 ] = ( Mat_< double >( 3, 1 ) << 0.9, 1.0, 1.1 );R_base2gripper[ 3 ] = ( Mat_< double >( 3, 3 ) << 0, 0, 1, 0, 1, 0, -1, 0, 0 );t_base2gripper[ 3 ] = ( Mat_< double >( 3, 1 ) << 1.2, 1.3, 1.4 );// 輸出變量Mat R_base2world, t_base2world;Mat R_gripper2cam, t_gripper2cam;// 執行機器人世界手眼標定calibrateRobotWorldHandEye( R_world2cam, t_world2cam, R_base2gripper, t_base2gripper, R_base2world, t_base2world, R_gripper2cam, t_gripper2cam, CALIB_ROBOT_WORLD_HAND_EYE_SHAH );// 輸出結果cout << "Rotation matrix from base to world:\n" << R_base2world << endl;cout << "Translation vector from base to world:\n" << t_base2world << endl;cout << "Rotation matrix from gripper to camera:\n" << R_gripper2cam << endl;cout << "Translation vector from gripper to camera:\n" << t_gripper2cam << endl;return 0;
}

運行結果

Rotation matrix from base to world:
[1, 0, 0;0, 1, 0;0, 0, 1]
Translation vector from base to world:
[4.163336342344337e-17;9.71445146547012e-17;1.387778780781446e-17]
Rotation matrix from gripper to camera:
[1, 0, 0;0, 1, 0;0, 0, 1]
Translation vector from gripper to camera:
[-0.2;-0.1999999999999999;-0.2000000000000001]

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

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

相關文章

GPT系列模型簡要概述

GPT-1&#xff1a;&#xff08;0.117B參數量&#xff0c;0.8B words預訓練數據) 動機&#xff1a; 在RNN和Transformer之間&#xff0c;選擇了后者。 和《All your need is Attention》翻譯模型的Encoder-Decoder架構相比&#xff0c;只保留Decoder&#xff0c;因此去掉了Cross…

汽車升級到底應不應該設置“可取消“功能

最近&#xff0c;汽車OTA&#xff08;Over-the-Air&#xff09;升級頻頻成為車主討論的熱點。有些車主反映&#xff0c;一些升級增加了實用功能&#xff0c;而另一些卻讓體驗變得復雜甚至帶來不便。于是&#xff0c;大家不禁發問&#xff1a;汽車升級功能究竟應不應該允許“可取…

單片機 PCB 設計要點

一、引言 單片機作為現代科技的重要組成部分&#xff0c;其 PCB 設計至關重要。本文將詳細介紹單片機 PCB 設計的要點和流程&#xff0c;幫助讀者更好地掌握這一關鍵技術。 在電子世界的浩瀚星海中&#xff0c;單片機無疑是現代科技中一顆閃爍的明珠。作為掌握嵌入式系統的基…

Django+Apscheduler 開發定時任務模塊【六】

目錄 回顧 前五個文章講述了django-autojob的部分代碼和執行邏輯 【DjangoApscheduler 開發定時任務模塊】【一】 【DjangoApscheduler 開發定時任務模塊】【二】 【DjangoApscheduler 開發定時任務模塊】【三】 【DjangoApscheduler 開發定時任務模塊】【四】 【DjangoApsch…

Ubuntu中配置交叉編譯工具的三條命令的詳細研究

關于該把下面的三條交叉編譯配置語句加到哪里&#xff0c;詳情見 https://blog.csdn.net/wenhao_ir/article/details/144326545 的第2點。 現在試解釋下面三條交叉編譯配置語句&#xff1a; export ARCHarm export CROSS_COMPILEarm-buildroot-linux-gnueabihf- export PATH$…

wlanapi.dll丟失怎么辦?有沒有什么靠譜的修復wlanapi.dll方法

在遇到各種系統文件錯誤當中&#xff0c;其中之一就是“wlanapi.dll文件丟失”的問題。這種問題通常發生在Windows操作系統上&#xff0c;特別是當系統試圖執行與無線網絡相關的任務時。wlanapi.dll是一個重要的系統文件&#xff0c;它負責處理Windows無線網絡服務的許多功能。…

利用ipmi工具設置ip、用戶等設置

#打開交互模式 ipmitool -I open shell #切換管理端口為lom1&#xff0c;即共享em1/eth0 delloem lan set shared with lom1 #設置ip、mask、gateway lan set 1 ipaddr 10.0.0.250 lan set 1 netmask 10.0.0.250 lan set 1 defgw ipaddr 10.0.0.250 #查看用戶名 user list 1 …

Python之因子分析詳細步驟

1.數學原理 1.1數學模型 1.2正交因子模型假設 注意&#xff1a;下面的推導都是基于這一假設。因此&#xff0c;這里的模型都是屬于正交因子模型。 1.3正交因子模型的協方差結構 1.4各類方差貢獻的介紹 在1.3正交因子模型的協方差結構中&#xff0c;我們介紹了“方差貢獻”&…

unity3d—demo(2d人物左右移動發射子彈)

目錄 人物代碼示例&#xff1a; 子彈代碼示例&#xff1a; 總結上面代碼&#xff1a; 注意點&#xff1a; 人物代碼示例&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public class PlayerTiao : MonoBehaviour {public f…

linux之vim

一、模式轉換命令 vim主要有三種模式&#xff1a;命令模式&#xff08;Normal Mode&#xff09;、輸入模式&#xff08;Insert Mode&#xff09;和底線命令模式&#xff08;Command-Line Mode&#xff09;。 從命令模式切換到輸入模式&#xff1a;i&#xff1a;在當前光標所在…

顯存和GPU之間的通信;GPUDirect P2P,NVLink,NCCL;聚合通信和點對點通信

目錄 顯存和GPU之間的分配 顯存和GPU之間的通信 原語是什么,簡單舉例說明 GPUDirect P2P,NVLink,NCCL的全稱及解釋 聚合通信和點對點通信 聚合通信(Collective Communication) 點對點通信(Point-to-Point Communication) 為什么使用GPUDirect P2P,NVLink,NCCL…

Mysql 的 B+ 樹是否包含行數據?

在 MySQL 中&#xff0c;是否在 B樹 的葉子節點上存儲完整的行數據&#xff0c;取決于使用的 存儲引擎 和 索引類型&#xff1a; 聚簇索引 (Clustered Index) 葉子節點包含完整的行數據。 適用場景&#xff1a;MySQL InnoDB 存儲引擎的主鍵索引&#xff08;或聚簇索引&#xf…

【記錄】用JUnit 4的@Test注解時報錯java.lang.NullPointerException的原因與解決方法

項目場景&#xff1a; 在練習黑馬點評的邏輯過期解決緩存擊穿時&#xff0c;編寫了一個預熱緩存數據的單元測試 SpringBootTest public class HmDianPingApplicationTests {Resourceprivate ShopServiceImpl shopService;Testpublic void testSaveShop() throws InterruptedE…

echarts使用整理

4、條形分區統計 <div ref"chartsVal1" class"chartsline-div"></div> const chartsVal1 ref(null); const chartsVal1Title ref(運行時間統計);drewCharts2(chartsVal1, chartsVal1Title.value);function drewCharts2(id, title) {const m…

【八股】HTTP

瀏覽器輸入URL之后發生的過程 瀏覽器解析URL中的協議&#xff0c;主機&#xff0c;端口&#xff0c;路徑參數等DNS域名解析得到對應的IP地址通過IP和PORT對服務器發送TCP三次握手建立連接瀏覽器發送請求服務器接受請求&#xff0c;處理并響應瀏覽器得到HTTP響應&#xff0c;對…

torch.optim.lr_scheduler.ReduceLROnPlateau

torch.optim.lr_scheduler.ReduceLROnPlateau 是 PyTorch 中的一種學習率調度器&#xff0c;主要用于在模型訓練過程中根據某些指標&#xff08;如驗證損失&#xff09;動態調整學習率。它是一種基于性能指標動態調整學習率的策略&#xff0c;而不是預定義的固定時間調整。 主要…

ubuntu下的chattts 學習6:音色固定的學習

魔搭社區 該區提供了隨機種子級音樂的試聽與下載。 spk torch.load(<PT-FILE-PATH>) params_infer_code {spk_emb: spk, } 略 測試過程&#xff1a; 1.先建一個文件夾&#xff1a;然后從上面的網站上下載了兩個。放在里面測試 2 2.測試代碼 import ChatTTS impo…

數據集的重要性:如何構建AIGC訓練集

文章目錄 一、為什么數據集對AIGC如此重要&#xff1f;1. 數據決定模型的知識邊界2. 數據質量直接影響生成效果3. 數據集多樣性提升模型魯棒性 二、構建AIGC訓練集的關鍵步驟1. 明確目標任務和生成需求2. 數據源的選擇3. 數據清洗與預處理4. 數據標注5. 數據增強 三、針對不同類…

47 基于單片機的書庫環境監測

目錄 一、主要功能 二、硬件資源 三、程序編程 四、實現現象 一、主要功能 基于51單片機&#xff0c;采用DHT11濕度傳感器檢測濕度&#xff0c;DS18B20溫度傳感器檢測溫度&#xff0c; 采用滑動變阻器連接數模轉換器模擬二氧化碳和氧氣濃度檢測&#xff0c;各項數值通過lc…

【操作系統】每日 3 題(五十五)

?個人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;專欄地址&#xff1a;https://blog.csdn.net/newin2020/category_12820365.html &#x1f4da;專欄簡介&#xff1a;在這個專欄中&#xff0c;我將會分享操作系統面試中常見的面試題給大家~ ??…