OpenCV相机标定与3D重建(11)机器人世界手眼标定函数calibrateRobotWorldHandEye()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

计算机器人世界/手眼标定: w T b _{}^{w}\textrm{T}_b wTb c T g _{}^{c}\textrm{T}_g cTg
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.mzph.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;我将会分享操作系统面试中常见的面试题给大家~ ❤️…