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

文章目录

      • 一、问题概述
        • 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、相机模型其实也不是标准的小孔模型,像素坐标与空间坐标之间其实是非线性的对应关系

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年中国条装漱口水市场发展趋势分析: 便携式条装漱口水发展势头强劲[图]

漱口水已在欧美发达国家流行多年,可能和社交生活礼仪有很大关系。近年来,由于市场竞争激烈,漱口水除了使口气清新,以及宣称可消除口臭的细菌,着重强调其预防和治疗牙齿及口腔疾病,增进口腔健康的功能的产品…

Mysql第四篇---数据库索引优化与查询优化

文章目录 数据库索引优化与查询优化索引失效案例数据准备1. 全值匹配2 最佳左前缀法则(联合索引)主键插入顺序4 计算、函数导致索引失效5 类型转换(自动或手动)导致索引失效6 范围条件右边的列索引失效7 不等于(!或者<>)索引失效8 is null可以使用索引, is not null无法使…

工程管理系统简介 工程管理系统源码 java工程管理系统 工程管理系统功能设计

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

机器学习(新手入门)-线性回归 #房价预测

题目&#xff1a;给定数据集dataSet&#xff0c;每一行代表一组数据记录,每组数据记录中&#xff0c;第一个值为房屋面积&#xff08;单位&#xff1a;平方英尺&#xff09;&#xff0c;第二个值为房屋中的房间数&#xff0c;第三个值为房价&#xff08;单位&#xff1a;千美元…

Ai写作创作系统ChatGPT网站源码+图文搭建教程+支持GPT4.0+支持ai绘画(Midjourney)/支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

SpringBoot 实体参数(用于请求参数比较多时使用)

字段必须和传参时一致&#xff0c;否则为null&#xff0c; 使用AITINS可以快速生成&#xff0c;SET GET方法 public class User {//字段必须和传参时一致&#xff0c;否则为nullprivate String user;private String password;public String getUser() {return user;}public vo…

openGauss学习笔记-108 openGauss 数据库管理-管理用户及权限-用户

文章目录 openGauss学习笔记-108 openGauss 数据库管理-管理用户及权限-用户108.1 创建、修改和删除用户108.2 私有用户108.3 永久用户108.4 用户认证优先规则 openGauss学习笔记-108 openGauss 数据库管理-管理用户及权限-用户 使用CREATE USER和ALTER USER可以创建和管理数据…

DLT645转modbus协议网关采集电表的数据方法

DLT645有两个版本分别是DLT645-97和DLT645-07&#xff0c;该协议主要用于电表抄表&#xff0c;采用为主-从结构的半双工通讯模式&#xff0c;硬件接口使用RS-485今天我们来看下&#xff0c;用远创智控YC-645-TCP网关如何采集电表的数据 1&#xff0c;首先&#xff0c;我们需要…

安科瑞余压监控系统

安科瑞 崔丽洁 机械加压送风系统中为什么要设计旁通阀控制加压送风的正压值&#xff1f;火灾发生后&#xff0c;又能起到什么作用呢&#xff1f; 发生火灾时&#xff0c;绝大多数的人员伤亡不是因为火&#xff0c;而是烟气&#xff0c;随着可燃物的燃烧产生大量的高温烟气&…

Java CC 解析 SQL 语法示例

示例&#xff1a;SimpleSelectParser 解析 select 11; 输出 2&#xff1b; 0&#xff09;总结 编写 JavaCC 模板&#xff0c;*.jj 文件。 编译生成代码文件。 移动代码文件到对应的包下。 调用生成的代码文件。 1&#xff09;JavaCC 模板 main/javacc/SimpleSelectParse…

vue3根据数据取消el-table选中状态获取到最新数据

原始数据&#xff1a; //el-table点击复选框事件 function getSelected(selection, row){//判断是否是已选过数据 0为没有选&#xff0c;>0有选过if(initial.value>0 ){let isCheck false //是否取消 true取消 false不取消//循环判断已选的数据是否包含当前点击获取到的…

折纸问题

折纸的次数 —— 从上到下的折痕 本质上是中序遍历的问题&#xff0c;因为每一次在已有的折痕后折的时候&#xff0c;当前折痕上的折痕一定为凹&#xff0c;当前折痕下的折痕一定为凸 。实际模拟了一个不存在的二叉树结构的中序遍历。 注&#xff1a;折纸折几次整颗二叉树就有…

(三)(Driver)驱动开发之双机调试环境搭建及内核驱动的运行

文章目录 1. 驱动开发环境搭建2. 驱动开发新建项目及项目属性配置和编译3. 双机调试环境搭建3.1 安装虚拟机VMware3.2 配置Dbgview.exe工具3.3 基于Windbg的双机调试 4. 内核驱动的运行4.1 临时关闭系统驱动签名校验4.2 加载驱动 1. 驱动开发环境搭建 请参考另一篇:https://bl…

rstudio server 服务器卡死了怎么办

欢迎关注weixin:生信小博士 #rstudio 卡死了怎么办 cd ~/.local/share/ ls rm -fr rstudio.old mv ~/.rstudio ~/.rstudio.oldcd ~/.config/ rm -fr .rstudio.old mv ~/.config/rstudio/ ~/.config/rstudio.oldps -ef|grep t040413 |grep rsession |awk {print $2}| xarg…

音乐制作软件 Studio One 6 mac中文版软件特点

Studio One mac是一款专业的音乐制作软件&#xff0c;该软件提供了全面的音频编辑和混音功能&#xff0c;包括录制、编曲、合成、采样等多种工具&#xff0c;可用于制作各种类型的音乐&#xff0c;如流行音乐、电子音乐、摇滚乐等。 Studio One mac软件特点 1. 直观易用的界面&…

开源博客项目Blog .NET Core源码学习(4:生成验证码)

开源博客项目Blog中的后台管理登录界面中支持输入验证码&#xff08;如下图所示&#xff09;&#xff0c;本文学习并记录项目中验证码的生成及调用方式。   博客项目中调用VerifyCode类生成验证码&#xff0c;该类位于App.Framwork项目中&#xff0c;命名空间为App.Framwork…

算法通过村第十六关-滑动窗口|白银笔记|经典题目讲解

文章目录 前言最长字串专场无重复字符的最长字串至多包含两个不同字串的最长子串至多包含K个不同字串的最长子串 长度最小的子数组盛水最多的容器寻找字串异位词(排序)字符串的排序找到字符串中所有字母异位 总结 前言 提示&#xff1a;所有的话语都颇为类似&#xff0c;而沉默…

36 机器学习(四):异常值检测|线性回归|逻辑回归|聚类算法|集成学习

文章目录 异常值检测箱线图z-score 保存模型 与 使用模型回归的性能评估线性回归正规方程的线性回归梯度下降的线性回归原理介绍L1 和 L2 正则化的介绍api介绍------LinearRegressionapi介绍------SGDRegressor 岭回归 和 Lasso 回归 逻辑回归基本使用原理介绍正向原理介绍损失…

Web前端接入Microsoft Azure AI文本翻译

Azure 文本翻译是 Azure AI 翻译服务的一项基于云的 REST API 功能。 文本翻译 API 支持实时快速准确地进行源到目标文本翻译。 文本翻译软件开发工具包 (SDK) 是一组库和工具&#xff0c;可用于轻松地将文本翻译 REST API 功能集成到应用程序中。 文本翻译 SDK 可跨 C#/.NET、…