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

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


一. 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也是一个比例,因为前面我们创建模板的时候对采样点进行了缩减,所以这里在重新读取一个点云模型时,也适当忽略一些点进行匹配
    * 输出获取匹配对象的姿态ObjInCamPose
    find_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)
    endif
    clear_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)

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

《cpolar内网穿透》外网SSH远程连接linux(CentOS)服务器

本次教程我们来实现如何在外公网环境下,SSH远程连接家里/公司的LinuxCentOS服务器,无需公网IP,也不需要设置路由器。视频教程[video(video-jrpesBrv-1680147672481)(type-csdn)(url-CSDN直播https://live-file.csdnimg.cn/relea

【Java和C++】什么是多态

2023年9月20日,周三上午今天写作业的时候遇到了多态,但我感觉自己多多态还是不够理解,于是又深入研究了一下。不过,我觉得我写的这篇文章还不够完整,比如说没提到什么时候适合使用多态,以后有空再写上吧。目录什么是多态Java方法重写(MethodOverriding)接口(Interface)抽象类(AbstractC

三、支持向量机算法(SVC,Support Vector Classification)(有监督学习)

支持向量机SupportVectorMachine,就是所谓的SVM,它指的是一系列的机器学习算法,根据解决问题的不同,分为SVC(分类)和SVR(回归)SVC,SupportVectorClassification,其本质也是支持向量机supportvector,只不过是用于分类classification任务SVR

【实战】Streamlit+ECharts绘制多图表可视化大屏,超级实用

实战项目背景介绍当我们提到数据可视化,常常会想到众多的工具和库,如Matplotlib、Seaborn甚至于D3.js等。但是,有一个特定的组合正在快速走红:Streamlit和ECharts。Streamlit,作为一个轻量级的Python工具,允许数据科学家和工程师轻而易举地创建交互式的web应用。而ECharts

网络安全(黑客)自学

前言首先我谈下对黑客&网络安全的认知,其实最重要的是兴趣热爱,不同于网络安全工程师,他们大都是培训机构培训出来的,具备的基本都是防御和白帽子技能,他们绝大多数的人看的是工资,他们是为了就业而学习,为了走捷径才去参加培训。而我进大厂主要是靠自学内推进来是,当时我才20岁,基于对脚本小子的热爱,我每次工作做完了,就天天抱着

vue如何实现多页面应用网页

Vue通常用于构建单页面应用(SPA),但是如果你需要构建多页面应用的话,也可以使用Vue。以下是实现多页面应用的一些建议:创建多个Vue实例为每个页面创建一个Vue实例,这样每个页面都可以拥有自己独立的Vue实例,它们之间不会相互影响。在每个页面上,你可以使用Vue组件来组织和管理该页面的所有逻辑。使用路由管理多页面

【吴恩达】prompt engineering(原则 迭代 文本概括 推断、订餐机器人)

简介Introduction基础的LLM训练的模型,问法国的首都什么,可能会将答案预测为“法国最大的城市是什么,法国的人口是多少”许多LLMs的研究和实践的动力正在指令调整的LLMs上。指令调整的LLMs已经被训练来遵循指令。因此,如果你问它,“法国的首都是什么?”,它更有可能输出“法国的首都是巴黎”。指令调整的LLM

设计模式-命令模式

“小度,小度,热死了请打开空调~”,“小度,小度,主人回家了~”,“小度,小度,播放一首炸雷~”,像小度类似的智能产品正在逐步改善我们的生活,只要我们一声令下,产品立马执行,毫不拖延。就如同老板的命令一样,系统需接收到命令后经过一系列分析后,会自动选择执行哪些命令,而发令者完全不关心内部是执行了哪些动作以及哪个具体方法

【校招VIP】排序算法之高级排序

考点介绍:在校招面试中,排序算法是经常被问到的。排序算法又比较多,很容易遗忘和混淆。有相当同学校招卡在排序的实现上,要么是核心代码实现不了,要么是实现方法串台。大厂的考察重点在快速排序等高级排序上。排序算法之高级排序-相关题目及解析内容可点击文章末尾链接查看!一、考点试题1.以下哪种不是非稳定排序算法A.归并排序B.快

分库分表知识点

分库分表专题1.概述1.1分库分表是什么小明是一家初创电商平台的开发人员,他负责卖家模块的功能开发,其中涉及了店铺、商品的相关业务,设计如下数据库:通过以下SQL能够获取到商品相关的店铺信息、地理区域信息SELECTp.*,r.[地理区域名称],s.[店铺名称],s.[信誉]FROM[商品信息]pLEFTJOIN[地理

【论文解读】Faster sorting algorithm

一、简要介绍基本的算法,如排序或哈希,在任何一天都被使用数万亿次。随着对计算需求的增长,这些算法的性能变得至关重要。尽管在过去的2年中已经取得了显著的进展,但进一步改进这些现有的算法路线的有效性对人类科学家和计算方法都是一个挑战。在这里,论文展示了人工智能是如何通过发现迄今为止未知的算法路线来超越目前的最先进的方法。为

热文推荐