[Halcon3D] 3D手眼标定理论与示例解析

news/2024/2/28 0:06:16
  • 📢博客主页:https://loewen.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉
  • 📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨

文章预览:

      • 一. 3D手眼标定理论基础
      • 二. 3D手眼标定流程(eye-to-hand)
        • 1、创建标准件的点云模型
        • 2、创建手眼标定模型、多角度匹配标准件的实例点云数据
        • 3、开始手眼标定
        • 4、获得各坐标系之间的姿态关系
        • 5、物体在机器人基础坐标系下的姿态求解


一. 3D手眼标定理论基础

因为3D相机知道的是点云坐标,机械手是空间坐标系,分为基础(底座)坐标系和工具(末端)坐标系,手眼标定目的就是将相机的图像坐标系的坐标和机械手的基础坐标系的坐标进行相互转化即求空间变换矩阵)。

在实际控制中,3D相机对场景中的物体扫描,并进行「三维匹配」,获取到物体的「姿态Pose」后,以3D点云的形式交给机械臂,通过标定好的坐标转换矩阵将相机获取到的3D点云坐标变换到机械手的基础坐标系中,然后根据机械手坐标系计算出各个电机该如何运动,从而控制机械手到达指定位置,可以用于物体抓取、无序分拣、装配、打磨等工作。

注:

1、如果是直接购买市面上的3D相机使用,在其生成对象的点云数据时,其内部已经完成了图像坐标系到世界坐标系的标定转换,所以需要我们做的就变成了求对象所在的世界坐标系(传感器坐标系)和机械手所在的基础坐标系之间的转换矩阵本文默认相机内部已经完成图像坐标系到世界坐标系的标定,即相机坐标系(传感器坐标系)等价于世界坐标系
2、若机械手中心不在法兰中心,需要做TCP(Tool Center Point)标定,得到机械手中心和法兰中心之间的相对位置关系,有四点法、六点法等。

场景示意图:

在这里插入图片描述

2D标定一样,根据相机的装载位置分为两种情况:

  • eye-to-hand(眼在手外):相机固定在一个地方,机械手的运动不会带着相机一起移动;
    在这里插入图片描述

  • eye-in-hand(眼在手上):相机安装在机械手上,随着机械手一起移动;
    在这里插入图片描述

本质都是为了在机器人基础坐标系下,获取物体的姿态Pose情况(注意区分:2D手眼标定得到的是XY坐标位置和角度),便于机械手完成抓取等任务。本文主要介绍的是eye-to-hand


二. 3D手眼标定流程(eye-to-hand)

参考示例:`分类 — 方法 — 三维匹配(基于表面)` —— `calibrate hand eye stationary 3d sensor.hdev`

1、创建标准件的点云模型

* 1.读入点云以及创建模型
read_object_model_3d ('handeye/robot_gripper_3d_model.om3', 1, [], [], OM3DModel, Status)
create_surface_model (OM3DModel, 0.03, [], [], SurfaceModelID) //0.03代表采样距离在点云最小外界球体直径所占的比例
* 简化点云(针对散点),提高匹配速度
sample_object_model_3d (OM3DModel, 'fast', 0.0009, [], [], SampledObjectModel3D) //0.0009代表采样距离

PS:

  • simplify_object model_3d:也是简化点云,和上面sample_object_model_3d算子区别是它针对三角化之后的点云进行简化。
  • create_surface_model:创建点云模板,算子各个参数的含义:传送门。

读取的点云模型如图所示:

在这里插入图片描述


2、创建手眼标定模型、多角度匹配标准件的实例点云数据

流程梳理

  1. 获取tool_in_base_pose,即工具坐标系相对于机器人基础坐标系下的姿态Pose —可从机器人示教器上读取到;
    PS:可通过write_pose将机器人工具坐标系的默认姿态通过机器人示教器获取到,然后保存至本地,最后通过read_pose读取出来即可。
  2. 匹配标准件的实例点云数据,获取标准件的姿态Pose
  3. 将步骤1和步骤2获取到的姿态Pose,设置进标定模型中;

代码展示

* 2.创建手眼标定模型
create_calib_data ('hand_eye_stationary_cam', 0, 0, HECCalibDataID)
for I := 1 to 15 by 1* 读取工具坐标系相对于机器人基础坐标系下的姿态read_pose ('tool_in_base_pose_' + I$'02d' + '.dat', ToolInBasePose)* 重新读取物体三维点云模型呢,通过对物体进行三维匹配获得其相对于世界坐标系(或传感器坐标系)下的姿态filename := 'handeye/robot_gripper_3d_scene_' + I$'02d'read_object_model_3d (filename, 1, [], [], OM3DScene, Status1)* 0.05也是一个比例,因为前面我们创建模板的时候对采样点进行了缩减,所以这里在重新读取一个点云模型时,也适当忽略一些点进行匹配* 输出获取匹配对象的姿态ObjInCamPosefind_surface_model (SurfaceModelID, OM3DScene, 0.05, 1, 0, 'false', [], [], ObjInCamPose, Score, SurfaceMatchingResultID)* 判断模型是否被找到if (|Score|)* 将上面的工具坐标系相对于基础坐标系的姿态以及匹配对象的姿态设置到标定模型中set_calib_data (HECCalibDataID, 'tool', I, 'tool_in_base_pose', ToolInBasePose)set_calib_data_observ_pose (HECCalibDataID, 0, 0, I, ObjInCamPose)endifclear_object_model_3d (OM3DScene)
endfor

3、开始手眼标定

 * 3.开始手眼标定
calibrate_hand_eye (HECCalibDataID, HECPoseError)

标定完之后:

  • 可以获得世界坐标系(传感器坐标系)相对于机器人基础坐标系下的姿态;
  • 又已知工具坐标系相对于机器人基础坐标系下的姿态;

所以可知工具坐标系相对于世界坐标系(传感器坐标系) 下的姿态,从而完成机器手的抓取


4、获得各坐标系之间的姿态关系

* ⑴机器人基础坐标系相对于相机(传感器)坐标系的姿态 
get_calib_data (HECCalibDataID, 'camera', 0, 'base_in_cam_pose', BaseInSensorPose)
* ⑵物体所在的世界坐标系相对于工具坐标系的姿态
get_calib_data (HECCalibDataID, 'calib_obj', 0, 'obj_in_tool_pose', ObjInToolPose)

5、物体在机器人基础坐标系下的姿态求解

步骤:

  1. 对物体进行三维点云匹配获取物体相对于传感器的姿态ObjInCamPose
  2. 对标定得到的基础坐标系相对于传感器坐标系的姿态BaseInSensorPose进行翻转,获取传感器坐标系相对于基础坐标系的姿态SensorInBasePose
  3. SensorInBasePose联合的三维匹配得到的物体相对于传感器的姿态ObjInCamPose,最终求出物体在机器人基础坐标系下的姿态ObjInBasePose
  4. 最终将物体相对于机器人基础坐标系下的姿态信息通过通讯传给机器人,从而命令其完成相关指令;

代码:

* 1.相机3D扫描,获取物体点云数据
read_object_model_3d (filename, 1, [], [], OM3DScene, Status1)
*   对物体进行3D点云匹配,获取物体在传感器坐标系下的姿态ObjInCamPose
find_surface_model (SurfaceModelID, OM3DScene, 0.05, 1, 0, 'false', [], [], ObjInCamPose, Score, SurfaceMatchingResultID)
* 2.物体在机器人基础坐标系下的姿态求解
*   翻转标定得到的基础坐标系相对于传感器坐标系下的姿态BaseInSensorPose,获得SensorInBasePose
pose_invert (BaseInSensorPose,SensorInBasePose)  
*   SensorInBasePose联合ObjInCamPose,求解物体在机器人基础坐标系下的姿态
pose_compose (SensorInBasePose, ObjInCamPose, ObjInBasePose)

下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。

http://www.ppmy.cn/news/887374.html

相关文章

Spring Cloud Hystrix简单实用

文章目录 一、简介二、快速开始1、pom依赖2、启动类注解3、服务降级配置HystrixCommand4、配置熔断策略5、测试 三、原理分析四、实际使用 一、简介 Hystrix,英文意思是豪猪,全身是刺,刺是一种保护机制。Hystrix也是Netflflix公司的一款组件。…

小米2+android版本,小米2/2S Android 4.4.2刷机详细教程

小米2/2S作为小米前年的旗舰设备,虽然硬件水平上已经和如今各家旗舰拉开差距,但系统更新上却丝毫不落下脚本。近日,小米推出最终版小米2/2S Android 4.4.2 ROM更新。与之前的MIUI系列不同,此次小米2/2S Android 4.4.2 版本采用安卓…

小米系列手机MIUI12系统升级详细教程

小米系列手机MIUI12系统升级详细教程 以下列出符合升级系统的手机名字 具体安装步骤 1、下载链接 https://hugeota.d.miui.com/V12.0.1.0.QEACNXM/miui_MI8_V12.0.1.0.QEACNXM_a855357838_10.0.zip 2、设置点击 点击屏幕的MIUI 11,据说要点击11下,哈哈…

小米2S 中文和英文支持TWRP,真实双系统支持

经过我几天的努力小米2S的TWRP 的功能已经完美了。 支持功能 : 中文和英文显示能相互切换 真实双系统功能已经完成95%。 刷入手机方法。由于时间原因我只制作了img文件。没有制作成卡刷包格式。 刷入方法用 Fastboot 命令: fastboot flash recovery reco…

HTML+CSS复习第二天

小米商城的案例&#xff0c;使用伪元素在图片周围加上边框线 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

Redis高级篇(一)

分布式缓存 -- 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 1.Redis持久化 Redis有两种持久化方案&#xff1a;RDB持久化、AOF持久化 1.1.RDB持久化 什么是RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&am…

微x怎么设置主题_苹果x前置呼吸灯怎么设置

很多朋友发现别人再使用苹果手机有短信或是电话进来的时候&#xff0c;手机的前置呼吸灯会亮起来&#xff0c;这样不但能很好的提醒还看起来很漂亮&#xff0c;因此很多人都想把苹果x前置呼吸灯打开&#xff0c;那么苹果x前置呼吸灯怎么设置?下面就来简单介绍一下。 苹果x前置…

React 之 JSX

一、我们写的 JSX 终将变成什么 万物始于 jsx&#xff0c;想要深入学习 react &#xff0c;就应该从 jsx 入手。弄清楚 jsx &#xff0c;方便学习掌握以下内容&#xff1a; 了解常用的元素会被 React 处理成什么&#xff0c;有利于后续理解 react fiber 类型&#xff1b;理解…

Vue组件(一) - 二次封装ElementUI实现tree树形组件

文章目录 功能描述代码base-tree.vue:treeDemo.vue: 功能描述 基础功能同el-tree 代码 base-tree.vue: <!--* Description: 公共树组件* Author: HMM* Date: 2021-01-11 16:23:23* FilePath: base-tree.vue 变量&#xff1a;expandNode&#xff1a;是否展开所有节点isSho…

vue利用key重新渲染组件

给要重新渲染的组件提供一个key属性&#xff0c;以便 Vue 知道特定的组件与特定的数据片段相关联。如果key保持不变&#xff0c;则不会更改组件&#xff0c;但是如果key发生更改&#xff0c;Vue 就会删除旧组件并创建新组件。 <v-card :key"reload">{{this.me…

【REACT全家桶-02JSX】

React完全利用JS语言自身的能力来编写UI&#xff0c;而不是增强HTML功能 一、基本使用 1.1注意&#xff1a; JSX不是ES的标准语法&#xff0c;它是ES的语法拓展 需要使用bable编译处理后才能在浏览器环境中使用 编译JSX的包&#xff1a;bable/preset-react React元素的属…

Vue3+webpack项目的vuex封装

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库。 它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 简单解释就是它是用来放项目所有组件都能共享的数据用的。 首先安装vuex&#xff1a; npm i vuex -s …

记一次 React 老项目升级改造

关注公粽号『 前端我废了 』&#xff0c;查看更多文章&#xff01;&#xff01;&#xff01; 项目背景 目的是需要改造优化一个 React 老项目本地开发启动、热更新及打包速度。背景是部门老大有天找我说有个 React 老项目本地开发启动太慢了&#xff0c;每次启动和热更新都要…

Apache新建站点,设置端口转发和访问密码

目标&#xff1a; 新建一个站点&#xff0c;域名为chat.example.com将80端口转发到127.0.0.1:1338设置访问密码 就是要简单粗暴&#xff0c;什么LNMP太麻烦。 然后&#xff0c;懂的都懂。&#x1f603; 假设Apache2已经安装好了。 1. 安装相关软件并配置proxy sudo apt inst…

leetcode-541. 反转字符串 II

leetcode-541. 反转字符串 II 文章目录 leetcode-541. 反转字符串 II一.题目描述二.第1次提交(for循环&#xff0c;std::reverse)三.第2次提交四.第3次提交五.第4次提交六.代码随想录解答一七.代码随想录解答二八.代码随想录解答三 一.题目描述 二.第1次提交(for循环&#xff0…

C++计算对数函数

综述 c计算对数函数&#xff0c;简单记录一下。 代码 #include<iostream> #include<cmath> using namespace std; int main() {double a2; //以2为底cout << log(4)/log(a)<<endl;return 0; }

excel自然对数函数

首先让我们打开一个样表作为例子。 excel自然对数函数 插入exp函数&#xff0c;函数的格式是Exp( number )&#xff0c;number参数是底数e的指数。 插入ln函数&#xff0c;函数的格式是ln&#xff08;number&#xff09;&#xff0c;number参数是想要计算其自然对数的正实数。…

取对数!取对数?

全文阅读&#xff1a;https://www.lianxh.cn/news/feb8ffdcb6a87.html 1. 引言 变量到底取不取对数&#xff1f;取对数又意味着什么&#xff1f;这看似是一个经验问题。 本文主要依据知乎“在设计计量经济学模型时&#xff0c;怎么判断是否应该对变量取对数&#xff1f;”的讨…

数学中 对数log 指数

数学中 对数log 指数 如果a的x次方等于N&#xff08;a>0&#xff0c;且a≠1&#xff09;&#xff0c;那么数x叫做以a为底N的对数&#xff08;logarithm&#xff09;&#xff0c;记作xloga N。其中&#xff0c;a叫做对数的底数&#xff0c;N叫做真数。 log函数就是次方函数…

C语言对数函数log

log10 函数名: log10 功 能: 对数函数log 用 法: double log10(double x); 程序例: #include <math.h> #include <stdio.h> int main(void) { double result; double x 800.6872; result log10(x); printf("The common log of %lf is %lf\n", x, resul…
最新文章