【仿真】UR机器人手眼标定与实时视觉追踪(单目)

news2024/12/23 17:06:30

c565f3a591a95aa227708cc334d7abe5.png

这段代码实现了一个机器人视觉引导系统,主要功能包括:

  1. 连接仿真环境,控制UR机器人。

  2. 相机标定:

  • 使用棋盘格图案进行相机内参标定

  • 通过移动机器人采集多组图像

  • 使用calibrateCamera函数计算相机内参

手眼标定:

  • 采集机器人末端位姿和对应的棋盘格图像

  • 使用calibrateHandEye函数计算相机相对机器人末端的变换矩阵

视觉引导:

  • 实时检测棋盘格位置

  • 计算棋盘格相对相机的位姿

  • 结合手眼标定结果,计算机器人末端目标位置

  • 控制机器人移动到目标位置

交互式跟踪:

  • 在仿真器中实时检测棋盘格

  • 控制机器人末端跟随棋盘格移动

主要使用了OpenCV进行图像处理和位姿估计,scipy进行旋转矩阵计算,以及仿真环境的API进行机器人控制。

这个系统展示了如何将机器视觉与机器人控制结合,实现基于视觉的机器人引导。它涵盖了相机标定、手眼标定、视觉检测和机器人控制等机器人视觉系统的核心组件。

仿真脚本分析

这些脚本包含了 机器人控制、相机设置以及深度图像处理的功能。每个脚本都有其特定的用途,如机器人运动控制、视觉处理和深度图像处理。

1. 机械臂线程脚本lua

移动回调函数:用于设置机器人关节的位置。-- 如果关节是动态启用的,设置目标位置 -- 否则,直接设置关节位置。

移动到指定配置的函数:-- 获取当前关节位置-- 使用 sim.moveToConfig 函数进行运动规划。

线程主函数:-- 获取机器人的 6 个关节句柄,-- 设置运动参数(速度、加速度、跃度);-- 将角度值转换为弧度。

2. 机械臂自定义脚本python

仿真开始时初始化:导入必要的模块, 在 IK 插件环境中基于场景中机器人的运动学构建运动链和两个 IK 组(无阻尼和有阻尼){获取场景中的对象[基座 末端 目标],创建IK环境,创建无阻尼 IK 组,创建有阻尼 IK 组}

动作:IK求解器将机器人关节的运动与物理世界仿真同步。

3. 相机脚本lua

初始化:-- 获取深度相机对象,-- 添加深度视图,-- 获取彩色相机对象, -- 添加彩色视图.

4. 深度相机脚本

视觉传感器的回调函数,当有图像数据时被调用:-- 初始化返回值,-- 默认不触发其他处理,-- 初始化返回的数据包为空。-- 将深度图转换为工作图像,-- 对工作图像进行强度缩放{在保持图像最亮和最暗点不变的情况下,对图像进行均匀的强度调整,且这种调整不依赖于像素的深度信息。这通常用于简单的图像亮度标准化,以便后续的图像处理步骤(如特征检测、边缘识别等)能在更统一的条件下进行。},- 将处理后的工作图像应用回视觉传感器图像。

手眼标定程序

函数

1. 连接到仿真器

创建远程API实例,获取仿真器sim接口,在加载场景前停止当前模拟(前提已打开仿真器),加载场景,开始模拟。返回客户端和sim实例。

2. 获取对象句柄

获取机器人基座句柄,获取机器人末端执行器句柄,获取摄像头的彩色图句柄,获取深度图句柄,获取机器人目标点句柄。返回以上句柄。

3. 将摄像头的彩色图转换为opencv的图像格式

从摄像头获取图像(返回图像和分辨率),将获取的图像数据转换为numpy数组(分辨率x,分辨率y,3),将图像上下翻转以符合OpenCV的图像表示方式

4. 设置对象的位姿矩阵

5. 获取对象的位姿矩阵

创建一个4x4的单位矩阵,获取并设置对象的位姿矩阵,返回位姿矩阵。

6. 计算位姿误差

计算平移误差,计算转转矩阵之间的误差,将旋转误差转换为角度,返回旋转误差和平移误差。

7. 等待机器人移动到位(目标点,获取位姿函数,获取线速度和角速度函数)

记录开始时间,初始化旋转误差和平移误差为无穷大。进入循环:{计算已经过去的事件,检查是否超时如果超时返回失败和上一误差记录,等待一段时间,获取当前位姿,获取线速度和角速度,计算线速度的平均值,计算角速度的平均值,计算当前位姿和目标位姿之间的误差。如果旋转误差平移误差和速度都小于预设的阈值,则返回成功}

8. 设置目标位姿并等待移动到位

设置目标位姿,等待机器人移动到目标位姿并返回结果。

主程序

设置numpy打印选项,保留小数点后三位,不使用科学计数法

指定场景文件路径

设置 等待间隔时间、超时时间、接受的旋转误差范围、接受的平移误差范围、接受的停止速度

---------- 连接仿真器

连接到仿真器

获取句柄

---------- 设置视觉参数,例如停止条件、棋盘格大小等,并且执行了棋盘格角点的检测和显示结果

设置寻找角点的终止条件

设置相机校正的标志

设置棋盘格大小为10x7  

设置棋盘格大小 0.025米

创建存放对象点的数组 10x7x3

设置对象点的x和y坐标 70x2,z为0

---------- 获取相机的彩色图像,并转换为灰度图,然后检测棋盘格角点,并显示检测结果

获取彩色图像,获取图像的高度和宽度,将彩色图转换为灰度图,检测棋盘格角点,优化角点的位置。显示检测到的棋盘格角点。

cd7231b418b125ac2928e8bde40bf618.png

---------- 获取机器人末端执行器和摄像头当前的位姿,并且执行了位姿的调整与更新,展示了调整后的图像

获取机器人末端执行器当前的位姿,打印当前位姿,定义位姿的调整参数并进行位姿调整{定义平移调整参数 z移动负值,绕x旋转小角度},创建平移矩阵,计算旋转矩阵,更新位姿变换矩阵并计算末端目标位姿,设置机器人的目标位姿并等待直到达到目标位姿。

43829fddd8284a193e5d8e0139ddfec6.png

获取BGR图片反转RGB并显示

a514e9f1328ca5e40bb0577ab21c7891.png

重置机器人到初始位姿,再次获取BGR图片翻转为RGB并显示

8a877ac53c0cbfb12fcd9e12ae514cae.png03c5a9d5a399902da7e6aee5a95965f1.png

---------- 生成的变换矩阵

定义变换范围:x轴、y轴、z轴平移范围、绕x、y轴旋转的角度范围,z轴设置不旋转。

定义存储生成的矩阵列表,遍历平移范围和角度范围所有的可能组合{ 定义平移4X4矩阵,定义旋转4X4矩阵,根据欧拉角设置旋转矩阵的R[:3,:3],合并旋转和平移矩阵,添加到变换矩阵列表}

---------- 每个位姿变换矩阵尝试获取相应的图像并进行处理

初始化用于相机标定的列表:存储图像中检测到的角点,存储对象的世界坐标系中的点,存储末端执行器的位姿,存储捕获的图像。

遍历每个位姿变换矩阵尝试获取相应图像并进行处理

计算目标变换,设置模拟环境中的位姿并等待运动完成,如果没有返回值继续执行下一位姿。 获取当前摄像机BGR图像,获取末端执行器的位姿,将图像转换为灰度图,检测棋盘角点(如果没返回值继续下一位姿),打印位移和旋转误差,精确化角点位置,在图像中绘制检测到的角点并将BGR转换为RGB以显示。储存数据(图像中检测到的角点加入列表,对象在世界坐标系中的点加入列表,末端执行器位姿加入列表,BGR图像加入列表)

位移和旋转误差及图像

 0.0 6.4243363e-06

d76eb8877ca232a0e972252726c63eb1.png3b83a15b1d5b6f62408f73fab0ec57c4.png

0.0 3.3219899e-06

2d7635e603806ac00d87d89911e8b962.pnge2792e9455d59626d7e559521470dc7a.png

…… 很多图(略)

0.0 1.6598583e-06

c2f6089fb79e6bd898178c01ff4e1b5f.png2040005a5a43cd2d09a94245c0b5f7d3.png

---------- 根据收集的数据进行相机标定

输出相机的内参矩阵 

输出相机的畸变系数

---------- 初始化用于手眼标定的列表

对每个标定点,计算解算体位姿,并准备进行手眼标定:

使用solvePnP求解相机位姿,如果求解成功(绘制并显示坐标轴,计算目标相对于相机的位姿变换矩阵,将这次的位姿变换加入手眼标定的列表中

列表包括:

机器人手爪(或末端执行器)相对于机器人基座的旋转矩阵的集合。每个矩阵代表在不同的手爪位置或姿态下,手爪相对于基座的旋转关系。

机器人手爪相对于机器人基座的平移向量的集合。与旋转矩阵集合对应,每个向量代表在不同的手爪位置或姿态下,手爪相对于基座的平移关系。

目标物体(通常是一个已知图案,如棋盘格)相对于相机的旋转矩阵的集合。每个矩阵代表在不同的相机位置或姿态下,目标物体相对于相机的旋转关系。

目标物体相对于相机的平移向量的集合。与旋转矩阵集合对应,每个向量代表在不同的相机位置或姿态下,目标物体相对于相机的平移关系。

bca832aaad2defb6ca12ea221d33f9f1.pngbce016edebaa4d27892d493522263470.png5a669be8cb1247dc9b815edf3568ac14.png

4bf3b019c09713c50aa845e59f50a43e.png27028db593e989592b3b66857a950b4d.png6ea4cf833a2bdb77f2135ab8f92c6a50.png

……

(很多图)略

b13a466666a83d669eaea87a28f5006e.png

利用前面求得的各个位姿数据,通过cv2.calibrateHandEye函数计算工具末端点(Tool Center Point, TCP)在相机标系中的位姿。cv2.calibrateHandEye函数通过分析机器人手爪与标定物在机器人基座和相机视野中的多个不同位置和姿态下的相对变换,然后求解得到一个从相机坐标系到机器人手爪坐标系(或反向)的稳定且准确的空间变换关系,使得在执行精确任务(如精准抓取、目标跟踪等)时能够有效地利用视觉信息。

4473d035e0993364ea946b7fd246114f.png

将位姿从OpenGL坐标系转换到OpenCV坐标系。定义从opengl坐标系到opencv坐标系的变换矩阵,从仿真场景中获取并输出从机械臂末端到相机的位姿变换矩阵。

------------初始化另一系列位姿变换矩阵用于进一步的实验

定义平移和旋转范围,x,y的平移,z平移设定为0,绕x、y、z轴的旋转角度范围,初始化变换矩阵列表。根据范围生成所有可能得变换矩阵(创建平移矩阵,初始化旋转矩阵为单位矩阵,设置旋转矩阵的前三行三列为由欧拉角zyx构成的旋转矩阵,计算最终的变换矩阵,实现旋转后平移的效果。将变换矩阵添加到列表中)

定义两个特定的变换矩阵:定义棋盘坐标系向棋盘中心平移的变换矩阵、定义向后(z负向)平移的变换矩阵

获取初始目标框架位置:获取棋盘格基座句柄,获取棋盘格基坐标系相对机器人基座的位姿记为目标框架初始位姿。重置机器人末端执行器和棋盘初始位姿。

-----------对每一个位姿变换矩阵,尝试移动棋盘并获取图像

尝试移动棋盘到新的位姿,如果设置失败则跳过此次循环。获取相机图像,转换为灰度图,寻找棋盘格角点,如果未找到角点跳过此次循环。打印旋转和平移误差,对角点进行亚像素级精细化,使用solvePnP求解相机位姿,如果失败则跳过此次循环。 构造世界到相机的变换矩阵(初始化4x4齐次矩阵,设置旋转部分,设置平移部分,进一步调整至中心位置),可视化并显示结果。

计算新的末端执行器位置(从场景获取末端执行器在机器人基座标系下的位姿X相机在末端执行器下的位姿X棋盘格中心坐标系在相机坐标系下的位姿X向后移动的平移矩阵X相机坐标系在棋盘格中心坐标系下的位姿)

移动机器人末端执行器到新的计算位置。实现实时跟踪

获取并显示移动后的图像

1a3bfdad317a02507f1db750943766c9.png

重置机器人臂和棋盘到初始位姿

----------- 交互式跟踪棋盘仿真器中棋盘的动作

获取摄像机当前的BGR图像,将BGR图像转换为灰度图像,寻找棋盘格角点,如果没有找到角点,继续下一次循环,对角点坐标进行精细化,使用solvePnP求解相机位姿,如果求解失败,继续下一次循环,根据求解结果构造从世界坐标系到相机坐标系的变换矩阵,计算棋盘中心到棋盘原点的位姿变换,获取机械臂末端相对于基座的当前位姿,计算新的机器人臂位姿,使摄像头对准棋盘中心,设置机器人臂到新的位姿并等待移动完成。

fea5df7a665a158cb0c2abd46f9f2c41.png

交互式实时追踪棋盘格

实现了在仿真环境中对棋盘进行实时追踪的功能。通过不断捕获摄像头的图像,并识别出棋盘格角点的位置,进而计算出棋盘相对于摄像头的位姿变换。此后,根据预先通过手眼标定计算得到的机器人末端执行器到相机的变换关系,以及棋盘中心相对于世界坐标系的位姿变换,计算出机器人末端执行器应该达到的新位姿,并通过仿真器的API命令机器人移动到这个新位姿。通过这样的过程,机器人末端的摄像头能实时调整位置以紧随棋盘移动,实现了对棋盘的动态追踪。


作者陈晓永:智能装备专业高级工程师,软件工程师。机器人自动化产线仿真动画制作 

The End

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

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

相关文章

外汇的基本面分析需要关注什么?

外汇基本面分析的核心在于关注可能影响单一货币供求及国家货币价值的经济、社会和地缘政治事件与趋势。但值得注意的是,这些事件和因素往往具有更广泛的影响力,不仅限于单一国家。它们可能是影响整个地区或国家集团的重要事件,甚至一些事件&a…

植物大战僵尸杂交版技巧大全(附下载攻略)

《植物大战僵尸杂交版》为策略游戏爱好者带来了全新的挑战和乐趣。如果你是新手玩家,可能会对游戏中的植物和僵尸感到困惑。以下是一些实用的技巧,帮助你快速掌握游戏并享受其中的乐趣。 技巧一:熟悉基本玩法 游戏的基本玩法与原版相似&…

大自然高清风景视频无水印素材在哪下载?下载视频素材网分享

在视频创作领域,一段高清的风景视频可以极大地提升你的作品质感。无论是作为背景、过渡片段还是主要内容,优质的风景视频素材都是必不可少的。然而,寻找既高清又无水印的风景视频素材并非易事。为了帮助大家轻松获取这类素材,我整…

七天速通javaSE:第四天 递归算法

文章目录 前言一、递归的介绍二、递归模型(n!)1 阶乘的定义:2. 阶乘的递归代码实现3. 递推与回归的内部逻辑三、练习 前言 本文将学习递归算法。在计算机科学中,递归算法是一种将问题不断分解 为同一类子问题来解决问题的方法。递…

网站推广如何做?这七个方法要知道

在出海独立站商家中,推广是必不可少的环节。在你完成网站的搭建,产品的上架,以及网站的运营和优化后,你就可以开始着手推广你的网站了。你的网站是承载你的品牌和产品的主要平台,因此,你需要根据你的品牌和…

Python+Vue+Springboot实现电脑端微信好友导入导出

主要实现思路是使用python的自动化库uiautomation进行客户端抓取联系人,vue做管理界面,springboot做后端服务。 截图如下 登录: 首页 好友导出 不足之处就是只有windows版本,mac上还不行 而且谷歌和edge浏览器的效果是最好的&a…

【C++】红黑树及其实现

目录 一、红黑树的定义1.为什么提出红黑树?2.红黑树的概念3.红黑树的性质 二、红黑树的实现1.红黑树的结构2.红黑树的插入2.1 uncle为红色2.2 uncle为黑色,且是grandfather的右孩子2.3 uncle为黑色,且是grandfather的左孩子 3.红黑树的验证 4…

PTL系统电子标签让工厂仓储出入库管理更高效

在现代工厂的运营中,仓储管理的效率直接影响着整个生产流程的顺畅与企业的竞争力。PTL 系统(Pick-to-Light)的应用,为工厂仓储的出入库管理带来了革命性的变化,使其更加高效、精准和智能化。 一、仓库安装使用PTL系统电…

TF-IDF、BM25传统算法总结

1. TF-IDF算法 F-IDF(词频-逆文档频率)是一种用于衡量文本中词语重要性的方法,特别适用于信息检索和文本挖掘任务。下面会拆分为两部分深入讲解TF-IDF的计算过程,以便更好地理解。 TF-IDF的计算过程可以分为两个主要部分&#xf…

2.移植freertos到stm32f103c8t6

目录 1.步骤 2.freertos配置时常见的选项卡意思 1.步骤 2.freertos配置时常见的选项卡意思

typescript学习回顾(三)

今天继续来分享ts的相关概念,枚举,ts模块化,接口和类型兼容性 ts的扩展类型:类型别名,枚举,接口和类 枚举 基础概念 枚举通常用于约束某个变量的取值范围。当然字面量和联合类型配合使用,也可…

动态规划——123. 买卖股票的最佳时机 III

目录 1、题目链接 2、题目分析 1.状态表示 2.状态转移方程 3.初始化 4.填表 5.返回值 3、代码解析 1、题目链接 123. 买卖股票的最佳时机 III 2、题目分析 1.状态表示 由题目可知,我们分为两种状态,买入和卖出,又因为只能完成两次交易…

如何从iPhone恢复错误删除的照片

嘿,iPhone 用户!作为一名苹果专业人士,我见过相当多的“哎呀,我删除了它!”的时刻。今天,我在这里指导您完成从iPhone中恢复那些珍贵的,错误删除的照片的迷宫。坐下来,拿起你的设备&…

【2020-2023】Transformer在小目标检测领域的应用与发展综述

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

std::enable_if和std::is_base_of

std::enable_if,其主要为了完成模板特偏化,有两个参数,第一个为布尔值类型,第二个如果布尔值为true,其为默认空值,如果已经赋值,则为对应的类型。 std::is_base_of,其一共存在两个参数&#xff…

windows10/win11截图快捷键 和 剪贴板历史记录 快捷键

后知后觉的我今天又学了两招: windows10/win11截图快捷键 按 Windows 徽标键‌ Shift S。 选择屏幕截图的区域时,桌面将变暗。 默认情况下,选择“矩形模式”。 可以通过在工具栏中选择以下选项之一来更改截图的形状:“矩形模式”…

【每日刷题】Day76

【每日刷题】Day76 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 561. 数组拆分 - 力扣(LeetCode) 2. 删除有序链表中重复的元素-II_牛客题霸…

多接口分线盒在工业自动化中的重要性与应用

简介 多接口分线盒是现代工业自动化中不可或缺的一个组成部分,它主要用于简化复杂的接线系统,提高效率和可靠性。本文将详细探讨多接口分线盒的定义、功能、以及在工业自动化中的应用情况。 无源多接口分线盒 多接口分线盒的定义与功能 多接口分线盒是…

vue draggable

一、安装&#xff1a; npm i -S vuedraggablenext 二、代码 <draggable :list"projectOptions" item-key"name" class"w-25" ghost-class"ghost"chosen-class"chosen" update"updateSort" animation"3…

Ubuntu系统安装软件---以安装QQ为例

以安装QQ为例&#xff0c;首先你的Ubuntu系统需要连上网&#xff0c;连上网的网络状态如下图所示。 在ubuntu系统的网页中搜索QQ&#xff0c;如下图所示。 进入QQ官网&#xff0c;点击Linux&#xff0c;如下图所示。 随后会让你选择什么架构的版本&#xff0c;如何查看自己的是…