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

news2024/12/23 5:17:50

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.coloradmin.cn/o/1860273.html

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

相关文章

stm32单片机程序烧写方式ISP和IAP区别

在线编程目前有两种实现方法:在系统编程(ISP)和在应用编程(IAP)。 ISP一般是通过单片机专用的串行编程接口对单片机内部的Flash存储器进行编程,而IAP技术是从结构上将Flash存储器映射为两个存储体&#xf…

生鲜水果行业wordpress主题

水果蔬菜wordpress外贸自建站模板 水果、脐橙、牛油果、菠萝、凤梨、鲜枣、苹果、芒果、瓜果、百香果wordpress外贸独立站模板。 https://www.jianzhanpress.com/?p3932 生鲜wordpress外贸出口网站模板 水果、蔬菜、肉蛋奶、水产、干货等生鲜产品wordpress外贸出口公司网站…

手把手教你SpringBoot整合日志框架,并附录Log4j2的常用标签大全

前言: 日志是平时在项目中必不可少的东西,下面是SpringBoot3整合日志框架的一些基本要领,主要分为一下几步: 导入日志相关依赖配置日志相关功能实际使用日志 导入日志相关依赖 如果是SpringBoot项目,只要导入 spring-…

Elasticsearch的快照

ES的快照是什么? snapshot是一个ES集群或者某个指定索引的备份,快照一般用在 不停机的状态下对ES集群进行备份当硬件故障时恢复集群数据用于跨集群的数据迁移对冷数据或冻结数据做快照以降低存储成本,依赖于可搜索的快照。-收费功能 一个快…

CRMEB 多门店后台登录入口地址修改(默认admin)

一、>2.4版本 1、修改后端 config/admin.php 配置文件,为自定义的后缀 2、修改 平台后台前端源码中 view/admin/src/settings.js 文件,修改为和上面一样的配置 3、修改后重新打包前端代码,并且覆盖到后端的 public 目录下&#xff1a;打包方法 4、重启swoole 二、<2.4版…

如何评估LabVIEW需求中功能的必要性和可行性

评估LabVIEW需求中功能的必要性和可行性涉及多个方面的分析&#xff0c;包括需求的重要性、技术可行性、资源需求以及潜在风险。以下是一个详细的评估方法&#xff1a; ​ 一、功能必要性评估 需求来源和目的&#xff1a; 来源&#xff1a;需求来自哪里&#xff1f;是客户、市…

HR3.0时代,人力资本效能如何进化?| 易搭云DHR

宏观经济增速放缓、市场竞争激烈&#xff0c;对各行各业、各种岗位都面临更大挑战&#xff0c;如何降本增效还是每个企业主的关注焦点。 企业的主要支出往往是员工成本&#xff0c;总体上超过企业总开支的75%&#xff0c;轻资产类型的企业甚至可能超80%&#xff0c;但裁员、加班…

监督学习(二)线性分类

每个样本都有标签的机器学习称为监督学习。根据标签数值类型的不同&#xff0c;监督学习又可以分为回归问题和分类问题。分类和回归是监督学习的核心问题。 回归(regression)问题中的标签是连续值。分类(classification)问题中的标签是离散值。分类问题根据其类别数量又可分为…

紧贴国家大战略需求,聚焦当前行业热点-海云安D10入选第四届香蜜湖金融科技创新奖拟奖项目

近日&#xff0c;第四届香蜜湖金融科技创新奖终审总结会在深圳市福田区湾区国际金融科技城成功举办&#xff0c;活动现场&#xff0c;专家评审委员会最终揭晓25个拟奖项目。海云安“开发者安全助手系统”项目&#xff0c;实力入选第四届香蜜湖金融科技创新奖-优秀项目奖。 1、香…

电源集成:智能真无线耳机设计中的通信接口

真无线耳机&#xff08;TWS 耳机&#xff09;由于电池寿命更长、功能更强大、设计更吸引人以及价格更优惠&#xff0c;因此继续变得更具吸引力。随着耳机制造商专注于小型化和设计改进&#xff0c;并迅速采用功能来增强用户体验&#xff0c;他们能够在强大且竞争激烈的市场中吸…

Swift Combine — Debounce和Throttle的理解与使用

Debounce 和 Throttle 是两种常用的操作符&#xff0c;用于控制数据流的频率和处理延迟。但它们的实现方式略有不同。理解这些差异对于在Combine代码中做出正确选择至关重要。 Debounce Debounce 操作符用于限制数据流的频率&#xff0c;只有在指定的时间间隔内没有新数据到达…

项目管理的六个核心内容

项目管理是一个系统性和综合性的过程&#xff0c;涉及多个核心内容的协同管理&#xff0c;以确保项目能够按时、按预算、高质量的完成&#xff0c;以下是项目管理的六个核心内容&#xff1a; 一、项目目标与范围 项目目标与范围是项目管理的起点和基础&#xff0c;在项目启动…

【linux网络(六)】IP协议详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. IP协议报…

AI大模型企业应用实战(23)-Langchain中的Agents如何实现?

0 前言 这将所有可用的代理按照几个维度进行分类。 预期模型类型 用于聊天模型&#xff08;接收信息&#xff0c;输出信息&#xff09;或 LLM&#xff08;接收字符串&#xff0c;输出字符串&#xff09;。这主要影响所使用的提示策略。 支持聊天历史记录 这些代理类型是否…

Cesium--旋转3dtiles

以下代码来自Cesium 论坛&#xff1a;3DTileset rotation - CesiumJS - Cesium Community 在1.118中测试可行&#xff0c;可直接在Sandcastle中运行&#xff1a; const viewer new Cesium.Viewer("cesiumContainer", {terrain: Cesium.Terrain.fromWorldTerrain()…

零基础小白应该如何安装Python?(包含Windows、MacOS、Linux)

1. 安装前的准备工作 在安装Python之前&#xff0c;我们需要了解以下几个问题&#xff1a; 确保计算机连接到互联网确认操作系统版本&#xff08;Windows、MacOS、Linux&#xff09;决定安装Python的版本&#xff08;建议安装最新的稳定版本&#xff09; 2. 在Windows上安装…

docker技术的说明

根据学习网站整理&#xff1a;Docker 10分钟快速入门_哔哩哔哩_bilibili 小白也能看懂的容器科普说明_哔哩哔哩_bilibili 1.虚拟机&#xff0c;需要模拟硬件系统、运行整个操作系统&#xff0c;但体积臃肿&#xff0c;内存占用较高&#xff0c;程序的性能也会受到影响。 2.…

无中心化崛起:Web3对传统互联网的冲击与重构

随着Web3技术的兴起&#xff0c;传统互联网面临着前所未有的挑战和重构。本文将深入探讨Web3的无中心化特性如何对传统互联网产生冲击&#xff0c;以及其可能带来的重大影响和未来发展趋势。 1. 传统互联网的局限与问题 传统互联网&#xff0c;通常称为Web2&#xff0c;主要依…

Go 如何使用指针灵活操作内存

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Vue3整合Tailwindcss实现渲染动态类

创建项目 pnpm create vite整合Tailwindcss 安装依赖&#xff1a; pnpm install -D tailwindcss postcss autoprefixer生成配置文件&#xff1a; npx tailwindcss initpostcss.config.js export default {plugins: {tailwindcss: {},autoprefixer: {},}}tailwind.config.j…