【仿真】UR机器人相机标定、立体标定、手眼标定、视觉追踪(双目)

c3fca9e46c71f83da48fce2bf1b079ee.png

实现在CoppeliaSim环境中进行手眼标定和目标追踪的一个例子。它主要涉及到机器人、机器视觉和控制算法的编程,使用了Python语言。接下来对该代码的主要类和方法进行解析:

1. 导入相关库

  • 用于与CoppeliaSim模拟器通过ZeroMQ接口通信。

  • 包含Rotation类,用于执行各种旋转和方向变换操作。

  • OpenCV库,用于执行各种图像处理和计算机视觉任务。

  • 用于执行各种数学和矩阵运算。

  • 用于进行图像和数据的可视化。

  • 用于创建和操作迭代对象的库。

  • 用于实现与时间相关的功能。

2. 定义全局变量

  • 分别用于定义场景路径、等待间隔、超时时间、接受的旋转误差、接受的平移误差、接受的停止速度阈值。

3. 定义主要的方法和步骤

  • 连接到CoppeliaSim模拟器。

  • 获取模拟器中对象的句柄。

  •  从摄像头获取图像,并将其转换为OpenCV的BGR格式。

  • 设置从一个坐标帧到另一个坐标帧的变换矩阵。

  • 获取从一个坐标帧到另一个坐标帧的变换矩阵。

  • 计算实际位姿与目标位姿之间的误差。

  • 等待机器人移动到目标位姿,直到误差足够小或超时。

  • 设置目标位姿并等待机器人移动完成。

4. 实施手眼标定和目标追踪

  • 使用二维码检测来定位目标,然后进行相机标定和手眼标定计算。

  • 计算机器人末端和摄像头之间的相对位姿。

  • 实现了一系列的图像获取和处理,利用OpenCV库进行棋盘角点的提取。

  • 通过实验获取数据,计算相机内部参数和两个相机之间的位姿。

  • 实现了基于不同位姿下的图像集合进行手眼标定。

  • 完成了在模拟器中交互式地跟踪目标的过程。

5. 保存与加载数据

  • 使用方法来压缩和保存相关数据,以便后续的分析和使用。

本代码的特点在于它结合了机器人控制、图像处理、手眼标定和交互式目标追踪等多个领域的技术,是一套完整的解决方案。

视频演示


源码解析

函数

1. 通过ZeroMQ远程API连接到CoppeliaSim:创建客户端实例,获取CoppeliaSim API的实例,停止当前模拟,加载模拟场景,开始模拟,返回客户端和sim实例

2. 获取对象句柄: 获取机器人基座的句柄,获取机器人末端执行器的句柄,获取第一个相机的句柄,获取第二个相机的句柄,获取目标球的句柄

3. 定义从CoppeliaSim视觉传感器获取图像并转换为OpenCV格式的BGR图像的函数:从指定相机获取图像数据,将获取的图像数据转换为NumPy数组并重塑为正确的形状,将图像在垂直方向上翻转,以符合OpenCV的图像显示方式

4. 定义设置给定对象在某个参考框架下的位姿(位置和姿态)的函数:设置对象的变换矩阵,以定义其位置和方向

5. 定义获取给定对象在某个参考框架下的位姿的函数:初始化为4x4的单位矩阵,获取对象的变换矩阵并重塑,组成位姿矩阵

6. 定义计算两个位姿之间误差的函数:计算平移误差,计算旋转误差,将旋转误差转换为角度

7.定义等待机器人移动到目标位姿的函数:记录开始时间,初始化误差值为无穷大,计算已经经过的时间,如果超时则返回失败,等待一定时间,获取当前位姿,获取当前速度,计算线速度均值,计算角速度均值,计算误差,如果误差小于阈值且速度接近零,则返回成功

8. 定义设置目标位姿并等待机器人移动完成的函数:设置目标位姿,等待机器人移动到目标位姿并返回结果

主程序

########## 定义场景路径、等待间隔、超时时间以及接受的误差

设置NumPy打印选项 

定义场景路径 

定义等待时间间隔,单位秒   

定义超时时间,单位秒

接受的旋转误差阈值

接受的平移误差阈值

接受的停止速度阈值

连接到CoppeliaSim并开始模拟

获取必要的句柄

########### 设置图像的检测、摄像机标定参数,并检测棋盘格角点

初始化棋盘格检测所需的终止条件:设置寻找亚像素角点的精确度和最大迭代次数,设置相机标定时需要固定的参数

设置棋盘格的尺寸和单位长度:棋盘格的行和列,示例尺寸,根据实际需要调整,单位长度,以米为单位,初始化棋盘格的三维坐标,设置棋盘格上每个点的x,y坐标,z坐标默认为0

从第一个相机获取BGR图像

获取图像的高度和宽度

将图像从BGR转换为灰度图

寻找棋盘格角点

对角点坐标进行精确化

在图像上绘制并显示棋盘格角点

获取机器人末端执行器的原始位姿

定义平移和旋转参数

构建平移和旋转矩阵

设置末端执行器到目标位姿并等待动作完成

显示相机1获取的图像

将末端执行器复位到原始位姿

显示相机1获取的图像

显示相机2获取的图像

########### 构建多个位姿变换矩阵,以便在手眼标定实验中使用

定义平移和旋转的范围

根据定义的范围生成一系列变换矩阵

计算生成的变换矩阵数量

########### 使用生成的位姿变换矩阵收集用于手眼标定的数据

初始化相机1、2图像点和对象点的列表,用于相机标定

定义机器人末端执行器的位姿列表、相机1拍摄的图像列表、相机2拍摄的图像列表

遍历所有预设的变换矩阵:{计算目标位姿,移动机器人末端执行器到目标位姿,如果移动失败,则跳过此次循环。获取当前机器人末端执行器的位姿,从相机1获取图像,并找到棋盘格角点,显示找到的角点,从相机2获取图像,并找到棋盘格角点,显示找到的角点,将找到的角点和对应的对象点分别存入列表,将图像存入相应列表}

计算成功捕获棋盘格角点的图像数量

########### 对两个相机分别进行标定获取内参和畸变系数

分别对两个相机进行标定,获取相机内参矩阵和畸变系数

输出相机内参矩阵和畸变系数

########### 进行立体标定获取两相机之间的旋转和平移矩阵

进行立体标定,获取两个相机间的相对位姿关系()

919cdb1a160e4a6d29f4597afadf6ecf.png

从仿真场景获取两个相机间的位姿关系

########### 初始化手眼标定所需的矩阵列表

初始化手眼标定所需的数据结构:{机器人夹持器到基座的旋转矩阵列表, 标定板到相机的旋转矩阵列表,机器人夹持器到基座的平移向量列表,标定板到相机的平移向量列表  }

############ 遍历采集的相机1每个图像点、对象点、末端执行器位姿以及图像

遍历每组图像点、对象点、末端执行器位姿以及图像:{ 使用solvePnP求解标定板相对于相机的位姿,在图像中绘制坐标轴并显示,构造标定板到相机的变换矩阵,将求解得到的旋转矩阵和平移向量添加到列表中 }

使用cv2.calibrateHandEye进行相机1手眼标定,求解夹持器到相机1的变换矩阵

c01c241146588afa416514bfe117ab35.png

输出夹持器到相机1的变换矩阵

定义OpenGL到OpenCV的坐标系统转换矩阵

从场景获取末端执行器到相机1的位姿,并进行坐标系统转换

根据立体标定结果计算夹持器到第二个相机的变换矩阵

从场景获取末端执行器到相机2的位姿,并进行opengl到opencv坐标系统转换

将所有标定数据保存到压缩文件中,以备后用

########### 为机器人对目标进行跟踪做准备

定义一系列位姿变换,用于测试不同的目标位姿

定于存储所有生成的变换矩阵列表

根据上述定义的范围生成一系列变换矩阵

向棋盘格中心的位姿变换

向后(z负向)的位姿变换

棋盘格基座的获取

获取并输出棋盘格的原始位姿

将机器人末端执行器和棋盘格复位到原始位姿

将棋盘格复位到原始位姿

########### 在相机1视角下,机器人对目标进行跟踪

初始化变换矩阵和图像列表,用于存储相机1当前位姿、下一位姿和各位姿对应的图像:存储当前机器人末端执行器的位姿、存储计算得到的下一步的机器人末端执行器位姿、存储相机1拍摄的图像列表

遍历所有预先定义的位姿变换矩阵【实现了在相机1视角下对棋盘格位姿跟踪和视觉处理的自动化实验,为机器人视觉系统的测试和校准提供了重要的数据支持】:{ 计算目标物体(棋盘格)的新位姿,移动棋盘格到新位姿、如果移动失败,则跳过此次循环,获取相机1图像并转换为灰度图像,寻找棋盘格角点,打印旋转和平移误差。精细化角点位置,使用solvePnP求解物体位姿,计算棋盘基座到相机的变换矩阵,应用向目标中心的位姿变换得到棋盘中心到相机的变换矩阵,可视化并显示旋转轴。获取机器人末端执行器当前位姿,计算新的末端执行器位姿,以便于下一次移动,添加当前末端执行器位姿到列表,添加计算得到的下一步位姿到列表,添加图像到列表,移动机器人末端执行器到新的位姿,拍摄并显示移动后的图像}

将机器人末端执行器和棋盘格复位到原始位姿

########### 在相机2视角下,机器人对目标进行跟踪

初始化变换矩阵和图像列表,用于存储相机2当前位姿、下一位姿和各位姿对应的图像:存储当前机器人末端执行器的位姿、存储计算得到的下一步的机器人末端执行器位姿、存储相机2拍摄的图像列表

遍历所有预先定义的位姿变换矩阵【实现了在相机2视角下对机器人位姿跟踪和视觉处理的自动化实验,为机器人视觉系统的测试和校准提供了重要的数据支持】:{计算目标物体(棋盘格)的新位姿、移动棋盘格到新位姿、如果移动失败,则跳过此次循环、获取相机2的图像、转换为灰度图像、寻找棋盘格角点、打印旋转和平移误差、精细化角点位置、使用solvePnP求解物体位姿、计算物体到相机的变换矩阵、应用向目标中心的位姿变换、可视化并显示旋转轴、获取机器人末端执行器当前位姿、计算新的末端执行器位姿,以便于下一次移动、添加当前末端执行器位姿到列表、添加计算得到的下一步位姿到列表、添加图像到列表、移动机器人末端执行器到新的位姿、拍摄并显示移动后的图像}

将收集的位姿和图像数据存储为压缩文件,方便后续使用

将机器人末端执行器和棋盘格复位到原始位姿

########### 在相机2视角下,机器人对目标进行交互式跟踪模拟

交互式跟踪模拟:{从相机2获取BGR图像、将图像转换为灰度图、

检测棋盘格角点、如果没有找到角点,继续下一次循环、通过子像素角点检测精细化角点位置、使用solvePnP算法求解物体位姿、如果solvePnP求解失败,继续下一次循环、初始化物体到相机的变换矩阵、根据旋转向量更新旋转矩阵、更新平移向量、应用向目标中心的位姿变换、获取当前机器人末端执行器的位姿、根据得到的相机位姿计算新的机器人末端执行器位姿、将机器人末端执行器移动到新的位姿}

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

The End

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

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

相关文章

SF-YOLOv5——基于改进的特征融合模式的轻量级小目标检测算法

概述 提出了一种改进的YOLOv5模型,名为Small-Fast-YOLOv5 (SF-YOLOv5),专门用于小目标检测。通过合理裁剪大目标检测层的特征图输出,显著减少了模型所需的计算资源,使模型变得更加轻量级。 还提出了一种改进的特征融合方法&#…

CV每日论文--2024.6.24

1、Whiteboard-of-Thought: Thinking Step-by-Step Across Modalities 中文标题:思维白板:跨模式逐步思考 简介:这段话描述了一种利用思维白板提示来增强大型语言模型在视觉推理任务中的性能的方法。 人类在解决需要视觉思考的问题时,通常会…

英语口语练习评测的开发实现

英语口语评测是一个复杂的系统,需要综合考虑语音识别、语音评测、自然语言处理等多种技术。以下是一些常见的英语口语评测开发框架。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 基于语音识别的口语评测框架这种框架主要…

第28课 绘制原理图——绘制导线

概述 放置完元器件之后,接着就要用导线将元器件的管脚一个一个连起来了。 绘制导线的方法 点击快速工具条上的“线”命令,进入绘制导线的过程。 点击选择某个管脚或电源端口,作为导线的起始端。 再点击选择另一个管脚或电源端口&#xff0c…

React@16.x(40)路由v5.x(5)常见应用场景(2)- 实现类似 vue 的路由模式

目录 1,vue-router2,React 模拟实现 1,vue-router vue 的路由配置文件, // src/router/index.ts const routes [{path: "/news",children: [{ path: "", component: NewsView },{ path: "detail"…

瞄准Windows的新兴僵尸网络:Kraken

2021 年 10 月,ZeroFox Intelligence 披露了名为 Kraken 的僵尸网络。Kraken 通过 SmokeLoader 进行传播,每次更新攻击基础设施时都会扩大规模。尽管与 2008 年发现的 Kraken 僵尸网络同名,但二者并没有其他共同点。 功能 自从 2021 年 10 …

养殖自动化通风系统:未来畜牧业的智能守护者

在现代畜牧业中,养殖环境的控制对于动物的健康成长和养殖业者的成功至关重要。养殖自动化通风系统凭借其先进技术和精密设备,实现了对养殖场内环境条件的精准调控,显著提升了养殖效率和动物福利。本文将深入探讨养殖自动化通风系统的必要性、…

Talking Web

1. curl 1.1 http curl http://127.0.0.1:80 向目标主机端口发送http请求 1.2 httphead curl -H “Host: 18ed3df584cd48328b5839443aa7b42b” http://127.0.0.1:80 1.3 httppath curl http://127.0.0.1:80/853c64cd218f80d0a59665666fb2ab80 1.4 URL编码路径 &#xff0…

天天大爆推文玩法营销号软件下载地址

天天大爆推文玩法营销号软件下载地址 天天大爆推文玩法营销号是一种营销策略,通过在社交媒体上发布频繁的推文来吸引关注和增加品牌曝光度。以下是一些可以用于天天大爆推文玩法营销号的策略: 营销号工具使用教程:https://iimenvrieak.feis…

数据结构之前缀树

写在前面 源码 。 前缀树,又叫做trie树,字典树,是一种多叉的树,一般用于单词前缀匹配的相关场景中,比如: 本文看下使用Java如何来实现这种数据结构。 1:基本介绍 思想:空间换时…

C++基础编程100题-014 OpenJudge-1.3-12 计算球的体积

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0103/12/ 描述 对于半径为r的球,其体积的计算公式为$ V4/3*πr^3 $,这里取π 3.14。 现给定r,求V。 输入 输入为一个不超过100的非负实数,即球半径&#xff0…

FL Studio 21 集成了音频剪辑和增益控制,你可以更快、更精确地控制音频电平,包括自动交叉淡入淡出及更多功能

以通过控制色调、饱和度、亮度、文本、仪表和步进序列器的颜色来改变你的DAW外观, DAW“情绪主题”控制,水果编曲将变得与众不同。 更快的音频编辑 FL Studio 21 集成了音频剪辑包络和增益控制,你可以更快、更精确地控制音频电平&#xff0c…

aws的alb,多个域名绑定多个网站实践

例如首次创建的alb负载均衡只有www.xxx.com 需要添加 负载 test2.xxx.com aws的Route 53产品解析到负载均衡 www.xxx.com 添加CNAME,到负载均衡的dns字段axx test2.xxx.com 添加CNAME,到负载均衡的dns字段axx 主要介绍目标组和规则 创建alb就不介…

Spring底层原理之FactoryBean Bean工厂 单例对象 多例对象

FactoryBean 在 Spring Framework 中,FactoryBean 是一个用于创建其他 Bean 实例的特殊工厂 Bean。它允许开发者自定义 Bean 的创建逻辑,从而更加灵活地管理和配置 Bean 的实例化过程。 FactoryBean 接口 FactoryBean 接口是 Spring 框架中的一个重要…

推送电子邮箱与其他营销手段如何有效结合?

推送电子邮箱的效果如何?怎么优化邮件推送的策略? 将推送电子邮箱与其他营销手段有效结合,可以显著提升营销效果和用户体验。AokSend将探讨如何将推送电子邮箱与社交媒体营销、内容营销、搜索引擎优化(SEO)等手段相结…

ArkTS自定义组件

一、自定义组件基本结构 // 定义自定义组件 ButtonCom.ets Component export struct BtnCom{State msg: string "按钮";build() {Row(){Text(this.msg).onClick(() > {this.msg "测试"})}} } // 引入自定义组件 import {BtnCom} from "./Butto…

动物常见图像的图像分类数据集

常见动物图像分类数据集 数据集: 链接:https://pan.baidu.com/s/1zZnCUZuNlX6MjuZImlDjTw?pwd03b9 提取码:03b9 数据集信息介绍: 文件夹 大象 中的图片数量: 1446 文件夹 松鼠 中的图片数量: 1862 文件夹 河马 中的图片数量:…

理解和处理不同类型的上下文的新型的语言模型ReALM

在人类的日常交流中,模糊的代词如“他们”或“那个”常常出现,它们的意义通常依赖于上下文才能明确。这种上下文的理解对于对话助手来说至关重要,因为它们旨在提供一种自然的交流体验。然而,现有的对话助手在处理这类模糊引用时往…

SAP查看接口日志

大部分SAP项目都会与其他外围系统进行集成,那么日常工作中,如果遇到接口传输问题,我们应该怎样查询呢? 也许这篇文章可以稍微解答一些基础的内容。 1、事务代码SXI_MONITOR检查接口日志: 执行的起止日期默认带出&…

oracle11g rac静默dbca创建实例反复报监听问题

问题 处理方法 手动创建监听程序 重新静默dbca建库