嚼一嚼Halcon中的3D手眼标定

news2024/9/29 5:38:37

文章目录

      • 一、问题概述
        • 1、何为手眼标定?
        • 2、手眼标定的2种形式
          • 1)眼在手上(eye in hand):即相机固定在机械臂末端
          • 2)眼在手外(eye to hand):即相机固定在机械臂以外的地方
        • 3、手眼标定公式推导
      • 二、Halcon例程解读
        • 1、初始化
          • 1)初始化显示参数
          • 2)初始化三维坐标系
          • 3)初始化标定模型
        • 2、构建坐标系
          • 1)构建标定板坐标系
          • 2)构建机器人基座坐标系与夹具坐标系
        • 3、执行手眼标定
          • 1)检查用于手眼标定的位姿是否一致
          • 2)进行手眼标定并保存相关参数
          • 3)显示标定误差
        • 4、显示标定后的三维模型
          • 1)计算姿态指标和标定对象指标
          • 2)可视化
        • 5、得到标定结果
      • 三、如何实操
        • 1、准备标定板
        • 2、相机标定
        • 3、手眼标定
        • 整体流程梳理如下:
      • 四、关键点梳理
        • 1、tool-base
        • 2、cam-obj
        • 3、求解AX=XB
      • 五、后续的思考

一、问题概述

1、何为手眼标定?

要让机器人的手抓住杯子,就必须知道杯子跟手的相对位置关系,而杯子的位置则是通过机器人的眼睛看见的,所以,我们只需要知道机器人的手和眼睛的转换关系,就可以随时抓取机器人眼睛所看到的物体了。

在这里插入图片描述

2、手眼标定的2种形式
1)眼在手上(eye in hand):即相机固定在机械臂末端

在这里插入图片描述

手眼标定的目的是确定两个未知量

  • 标定板相对于机器人基座的位姿(CalObjInBasePose)

  • 机械手末端相对于相机的位姿(ToolInCamPose

2)眼在手外(eye to hand):即相机固定在机械臂以外的地方

在这里插入图片描述

手眼标定的目的是确定两个未知量

  • 机器人基座相对于相机的位姿(BaseInSensorPose

  • 标定板相对于机械手末端的位姿(CalObjInToolPose)

3、手眼标定公式推导

对原理有兴趣的小伙伴请参看:手眼标定公式推导

二、Halcon例程解读

主要是参考 hand_eye_movingcam_calibration.hdev

1、初始化

这一部分的工作中,需要完成对显示参数的初始化(主要包括2D图像的显示以及3D模型的显示),以及用于标定的模型的初始化(利用已获得的相机内参与标定板参数,同时还可以指定进行标定的方法)

1)初始化显示参数

在这里插入图片描述

2)初始化三维坐标系

一个是以机械手夹具中心点为原点的三维坐标系,另一个是机器人基座的三维坐标系。

在这里插入图片描述

3)初始化标定模型

初始化一个用于标定的模型 CalibDataID。需要通过标定文件相机初始内参以及用于进行标定的方法进行初始化。

在这里插入图片描述

这里的标定方法是用的非线性优化。

2、构建坐标系
1)构建标定板坐标系

根据之前创建的标定模型CalibDataID在图像中寻找相应的标定板图像,获取标定板的轮廓与其中的角点,并在其中心根据相机内参以及标定板位姿初始化一个标定板坐标系。

在这里插入图片描述

  • 在输入的图像中根据之前初始化的标定模型,寻找标定板
  • 提取标定板的轮廓
  • 通过提取标定板中的点,来获取标定板的位姿
2)构建机器人基座坐标系与夹具坐标系

根据保存的机器人工具坐标系到机器人基座坐标系下的转换矩阵,将原有的机器人夹具坐标系转换至基座坐标系下,显示这两个坐标系并将转换关系保存在CalibDataID所指向的模型对象中。

在这里插入图片描述

  • 读取机械手在机器人基座坐标系下的位姿
  • 根据机械手在机器人基座坐标系下的转换矩阵,将机械手坐标系转换至基座坐标系
  • 保存机械手坐标系到基座坐标系的转换关系至标定模型CalibDataID
3、执行手眼标定
1)检查用于手眼标定的位姿是否一致

在这里插入图片描述

2)进行手眼标定并保存相关参数

在这里插入图片描述

3)显示标定误差

在这里插入图片描述

4、显示标定后的三维模型
1)计算姿态指标和标定对象指标

在这里插入图片描述

2)可视化

在这里插入图片描述

  • 获取标定模型CalibDataID中的数据坐标
  • 根据坐标数据初始化标定块
  • 根据标定块在基座坐标系下的转换矩阵对标定块进行转换
5、得到标定结果

3D姿态中的7个参数代表的意义:[0,0,0,0,0,0,0]前六个代表平移和旋转量,最后一个代表OrderOfTransform, OrderOfRotform, ViewOfTransform的组合类型。

在这里插入图片描述

  • OrderOfTransform:旋转和平移的顺序
  • OrderOfRotform:旋转值的含义
  • ViewOfTransform:变换视角

在这里插入图片描述

三、如何实操

1、准备标定板

窗口–打开算子窗口–gen_caltab

  • 设置XNum,YNum—圆点个数,X和Y方向圆点个数

  • 设置圆点直径,MarkDist × DiameterRatio

  • 设置间距MarkDist(单位为米)

caltab.descry是标定板描述文件,caltab.ps为标定板生成文件,没有psAdobe PDF打开就能看到如下图1-2所示的标定板,可以直接打印。

在这里插入图片描述

2、相机标定

助手–打开新的 Calibration

  • 在描述文件地方插入刚刚生成的caltab.descry

  • 点击标定

  • 结果中摄像机参数需要记录下来,之后会用到,摄像机位姿需要点击“保存”保存成 .dat 格式的文件

在这里插入图片描述

3、手眼标定

标定板不动,移动机械臂,拍摄15+张图片,覆盖多个位姿,并记录每张图片拍摄时机械臂的位姿(包括 X , Y , Z , R X , R Y , R Z X,Y,Z,R_X,R_Y,R_Z X,Y,Z,RX,RY,RZ 六个)

在这里插入图片描述

整体流程梳理如下:
  • 初始化相应的参数:二维图像输出窗口,三维坐标系的坐标轴与窗口,用于进行手眼标定的对象CalibDataID

  • 根据手眼标定的对象,在输入的图像中寻找相应的标定板,并建立坐标系;

  • 创建base与tool的三维坐标系,并根据输入的转换关系信息进行显示;

  • 进行手眼标定,输出并保存相关参数;

  • 根据标定后的转换关系,创建base、tool、cam与obj的三维坐标系,并进行显示;

  • 输出相应的转换关系

四、关键点梳理

1、tool-base

机械臂末端在机器人基座坐标系下的位姿,其实就是机器人学里面最基础的运动学正解。

在这里插入图片描述

DH 矩阵等方法来计算机器人运动学正解:只要知道机器人在当前状态下每个关节的角度,就可以得到tool—base之间的变换。

2、cam-obj

相机在标定板坐标系下的位姿,即相机的外参

在这里插入图片描述

在这里插入图片描述

根据相机模型,先确定内参矩阵,然后根据不同时刻拍摄的标定板图片来求取外参矩阵:也即相机在世界坐标系下的变换关系

3、求解AX=XB

在这里插入图片描述

文献3采用的是李群的理论,将AX=XB转化成最小二乘问题

文献4采用的是对偶四元数的知识,用对偶四元数表达旋转和平移,从而进行统一计算;

四种方法精度接近,最后一种 Dual Quaternions 的方法会稍微比其他算法好一点。

五、后续的思考

机器人领域基本上所有用到的模型都只是「近似模型」。也就是说,上面说的每一步,都有改进空间。

1、直接使用的机器人运动学模型是认为机器人加工、装配、控制无误差的情况

实际上这种假设是不成立的。也就是说,我们只拿到每个关节角度,计算的末端位姿是存在误差的。可以从机器人运动学参数辨识等方面入手提高最后的标定精度;

2、相机模型其实也不是标准的小孔模型,像素坐标与空间坐标之间其实是非线性的对应关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1130040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JVM】类的生命周期

【JVM】类的生命周期 文章目录 【JVM】类的生命周期1. 生命周期概述2. 加载阶段3. 连接阶段3.1 验证3.2 准备3.3 解析 4. 初始化阶段4.1 触发初始化的方式4.2 clinit不存在的情况4.3 多个类的初始化 5. 总结 1. 生命周期概述 类的生命周期分为5/7个阶段: 加载(Loa…

MSQL系列(八) Mysql实战-SQL存储引擎

Mysql实战-SQL存储引擎 前面我们讲解了索引的存储结构,BTree的索引结构,我们一般都知道Mysql的存储引擎有两种,MyISAM和InnoDB,今天我们来详细讲解下Mysql的存储引擎 文章目录 Mysql实战-SQL存储引擎1.存储引擎2.MyISAM的特点3. InnoDB的特…

面向小白vim使用手册

撤回上一步 按 "u" 注释多段 1:选择开始注释的地方,在命令模式下按 ctrv进入可视化模式。 2:鼠标向下滑动,选中要注释的段落:3:进入大写锁定,按"i"键进入插入模式: 4:输…

vue3 + ant design vue项目svg格式的background-image使用配置

直接使用的时候会报错: 图片解析不出来还是svg源文件代码 项目启动报错 vue3使用的时候普通配置会出现this.getOptions is not function错误( Webpack 版本升级引起的,在较新的 Webpack 版本中,this.getOptions 方法已被移除。)…

小知识(6) el-table表格选中行和回显行(vue3)

el-table表格选中行和回显行 官方文档说明 https://element-plus.org/zh-CN/component/table.html#table-%E6%96%B9%E6%B3%95 环境&#xff1a;vue3element-plus 选中行selection <el-table ref"baseTableRef" row-key"id" border :selection"tr…

支持多校 微信课表小程序源码 排课小程序源码 支持导入课表 情侣课表 背景设置

练手Lab课程表小程序源码是一个基于thinkphp系统进行开发的前后端分离系统。 源码功能介绍 1、情侣功能 2、情侣间留言 3、情侣间互相设置课程表背景 4、自己日、周课程表背景设置 5、教务系统课程表导入 6、导入别人分享的课表 7、导入别人分享的单课 8、多校支持 9…

25装饰器2

有一个比较绕的地方&#xff0c;但是我相信我能理解透彻这个里面的逻辑还有原理 def check(func):print(登录验证)def inner():func()return innerdef fss():print(发说说)fss check(fss) fss()这里的fss check(fss)还有后面的fss()什么意思&#xff1f;怎么理解呢&#xff…

Qt之彻底解决QSpinBox限定范围无效的问题

QSpinBox有个比较啃爹的问题,不管取值范围设置为多少,都能一直输入0,如下图所示: 当取值范围包含负数时,负号后也可以一直输入0,如下图所示: 还有就是当取值范围设置为10以上时,比如10~100,却可以输入1~9 虽然上述非法输入最终都未生效,当QSpinBox失去焦点时会显示为…

【iOS逆向与安全】某音App直播间自动发666 和 懒人自动看视频

1.目标 由于看直播的时候主播叫我发 666&#xff0c;支持他&#xff0c;我肯定支持他呀&#xff0c;就一直发&#xff0c;可是后来发现太浪费时间了&#xff0c;能不能做一个直播间自动发 666 呢&#xff1f;于是就花了几分钟做了一个。 2.操作环境 越狱iPhone一台 frida m…

如何使用 JMeter 进行 HTTPS 请求测试?

本文将介绍如何使用 JMeter 测试 HTTPS 请求&#xff0c;并提供相关的技巧和注意事项。 在进行性能测试时&#xff0c;很多网站都采用了 HTTPS 协议。当我们测试 HTTPS 请求&#xff0c;如果服务端开启了双向认证&#xff0c;则需要客户端发送请求时带上证书。本文介绍如何在 …

机器学习-模型评估与选择

文章目录 评估方法留出法交叉验证自助法 性能的衡量回归问题分类问题查准率、查全率与F1ROC与AUC 在机器学习中&#xff0c;我们通常面临两个主要问题&#xff1a;欠拟合和过拟合。欠拟合指模型无法在训练数据上获得足够低的误差&#xff0c;通常是因为模型太简单&#xff0c;无…

从另外一个进程中读取数据

从另外一个进程中读取数据&#xff0c;其实就注入线程&#xff0c;寻址&#xff0c;解析内存&#xff0c;处理数据。例如这个就是从另外一个正在运行的进程中&#xff0c;读取数据并保存。实时性还可以。

C/C++新冠疫情死亡率 2020年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C新冠疫情死亡率 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C新冠疫情死亡率 2020年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 2020年全世界爆发了新冠疫情&#xff0c;请…

openEuler 22.03 LTS 安装 Docker CE 和 Dcoker Compose

openEuler 使用 DNF 安装 Docker CE 1024&#xff0c;节日快乐&#xff01;回归正题&#xff0c;DNF 安装 DockerOS 系统环境准备安装 docker-ce 步骤1、更新系统2、安装必要的软件包3、添加 Docker CE 存储库4、更新索引缓存并安装 Docker CE5、启动 Docker 服务6、查看 Docke…

当前JavaEE初阶的阶段知识总结

当前JavaEE初阶的阶段知识总结 多线程 文件IO 文件系统操作 ~~ File类. 文件内容操作 ~~ 读文件,写文件. IO 流对象. 流(Stream),形象的比喻,读取文件,就像水流一样,读写文件的时候,和水流类似,读100字节,可以一次读1个字节,100次完成;也可以一次读10个字节,10次完成…… 在…

用户案例 | 珍岛集团基于 Apache DolphinScheduler 打造智能营销云平台

珍岛集团致力于打造全球领先的智能营销云平台&#xff0c;在国内率先推出的Marketingforce&#xff08;营销力&#xff09;平台&#xff0c;专注于人工智能、大数据、云计算在数字营销及企业数字化智能化领域的创新与实践&#xff0c;面向全球企业提供营销力软件及服务&#xf…

python轻量规则引擎rule-engine入门与应用实践

rule-engine是一种轻量级、可选类型的表达式语言&#xff0c;具有用于匹配任意 Python 对象的自定义语法&#xff0c;使用python语言开发。 规则引擎表达式用自己的语言编写&#xff0c;在 Python 中定义为字符串。其语法与 Python 最相似&#xff0c;但也受到 Ruby 的一些启发…

Centos8 降低gcc版本至gcc-7.3

1 首先卸载系统中的gcc sudo yum remove gcc 2 重新安装gcc-7.3 sudo dnf group install “Development Tools” 然后再次卸载gcc sudo yum remove gcc 然后发现centos-release-scl-rh已经安装了 sudo yum install centos-release-scl-rh yum -y install devtoolset-7-gcc dev…

SCAU 编译原理 实验1 词法分析实验

实验内容&#xff1a;参考附录C.1 设计一个简单语言的词法分析程序&#xff0c;要求能够正确处理关键字、运算符&#xff08;单个符号的和复合的运算符如>、>&#xff09;、分界符、标识符、常数等单词&#xff0c;以及不是单词的换行回车、注释。 #include<stdio.h&…

【自然语言处理】理解词向量、CBOW与Skip-Gram模型

文章目录 一、词向量基础知识1.1 One-hot表示1.2 Distributed表示 二、word2vec基础知识2.1 CBOW和Skip-gram 三、基于Hierarchical Softmax的 CBOW 模型和 Skip-gram 模型3.1 CBOW 模型3.2 Skip-gram 模型 参考资料 由于计算机不能直接对各种字符进行运算&#xff0c;为此需要…