十、工业相机与SCARA机械臂的坐标系标定

2023-10-26

注:感谢固高长江研究院徐工程师的技术讲解,以及matlab程序,机器人系统程序的提供。

在工业现场当中,相机拍摄到的图像有一个相机坐标系,而机器人自身也有一个机器人自身的坐标系,两者互相独立;当我们通过相机进行对物体进行拍摄,通过模式识别得到了目标物体在相机坐标系下的坐标位置,那么如何通过计算来让机器人知道目标物体在机器人坐标系的位置,以便机器人进行抓取操作呢?

这一章,首先进行标定原理的讲解,然后通过程序进行实现;最后,以洛阳理工学院实验室的固高工业智能相机及SCARA机械手为硬件基础,进行实验验证。

10.1 标定原理

如图10-1所示,OXY为机器人坐标系,O’X’Y’是相机坐标系。

 

10-1 机器人坐标系与相机坐标系示意图

当相机获取目标物体在相机坐标系下的坐标(imageP3.x,imageP3.y)时,如何进行计算得到对应在机器人坐标系下的坐标(robotP3.x,robotP3.y)呢?

(为了对应后面程序,所以坐标名称直接使用下文中的程序变量名)

 

首先,需要通过两个已知坐标点进行标定。P1点在机器人坐标系下和相机坐标系下的坐标为(imageP1.x,imageP1.y)(robotP1.x,robotP1.y)P2点在机器人坐标系下和相机坐标系下的坐标为(imageP2.x,imageP2.y)(robotP2.x,robotP2.y)

求得机器人坐标系下的向量robotP1P2以及相机坐标系下的向量imageP1P2:

imageP1P2.x = imageP2.x - imageP1.x

imageP1P2.y = imageP2.y - imageP1.y

robotP1P2.x = robotP2.x - robotP1.x

robotP1P2.y = robotP2.y - robotP1.y

 

然后,根据这两个坐标点求得现实距离与图像像素之间的比例系数factor以及两个坐标系之间的偏转角thetaRI

factor = sqrt(robotP1P2.x*robotP1P2.x + robotP1P2.y*robotP1P2.y)/ sqrt(imageP1P2.x*imageP1P2.x + imageP1P2.y*imageP1P2.x)

偏转角thetaRI的求取:如图10-2所示。

 

10-2 偏转角求取示意图

先求得机器人坐标系下向量robotP1P2相对于x轴的偏转角thetaR,然后求得相机坐标系下的向量imageP1P2相对于x轴的偏转角thetaI;最后两者相减就是两个坐标系的偏转角thetaR

thetaR = atan2((robotP2.y - robotP1.y) ,(robotP2.x - robotP1.x))

thetaI = atan2((imageP2.y - imageP1.y) , (imageP2.x - imageP1.x))

thetaRI = thetaR - thetaI

 

最后,根据比例系数factor以及偏转角thetaRI就可以对相机坐标系内的任意一个坐标进行机器人坐标系坐标转换。原理图如图10-3所示。

 

10-3 坐标转换示意图

相机坐标系下的坐标(imageP3.x,imageP3.y),那么相机坐标系下的向量imageP1P3

imageP1P3.x = imageP3.x - imageP1.x

imageP1P3.y = imageP3.y - imageP1.y

还需要求得相机坐标系下的相对于x轴偏转角thetaN = atan2(imageP1P3.y, imageP1P3.x)。这样通过图10-3中的原理就可以得出机器人坐标系下的坐标了。

robotP3.x = factor*sqrt(imageP1P3.x*imageP1P3.x + imageP1P3.y*imageP1P3.y)* cos(thetaN + thetaRI) + robotP1.x

robotP3.y = factor*sqrt(imageP1P3.x*imageP1P3.x + imageP1P3.y*imageP1P3.y)* sin(thetaN + thetaRI) + robotP1.y

 

得到最终的robotP3坐标就可以通信给机器人让机器人移动到该座标下,也就是目标物体的位置处。

10.2 标定程序实现

完整的程序实现如下所示:

/*
机器人坐标系与相机坐标系转换程序
第一步:记录A点的机器人坐标系下坐标以及图像坐标系下坐标,记录B点的机器人坐标系下坐标以及图像坐标系下坐标;
第二步:计算得到现实距离与图像像素之间的比例系数,以及两坐标系的偏转角;
前两步完成后,即完成了标定过程,接下来就可以根据一个新的点的图像坐标系下的坐标,求得该点的机器人坐标点;
第三步:输入一个图像坐标系下的点,程序自动得到机器人坐标下的点。
*/

#include<iostream>
#include<cmath>
using namespace std;

struct position {
	double x;
	double y;
};

struct vector {
	double x;
	double y;
};

int main()
{
	//1 input the positions in the camera coodinate and robot coodinate
	position imageP1, imageP2, robotP1, robotP2;
	cout << "请输入相机坐标系下的坐标" << endl;
	cin >> imageP1.x >> imageP1.y >> imageP2.x >> imageP2.y;
	cout << "请输入机器人坐标系下的坐标" << endl;
	cin >> robotP1.x >> robotP1.y >> robotP2.x >> robotP2.y;

	//2 caculate the factor and tangle
	vector imageP1P2, robotP1P2;
	imageP1P2.x = imageP2.x - imageP1.x;
	imageP1P2.y = imageP2.y - imageP1.y;
	robotP1P2.x = robotP2.x - robotP1.x;
	robotP1P2.y = robotP2.y - robotP1.y;

	double factor, thetaI, thetaR, thetaRI;
	factor = sqrt(robotP1P2.x*robotP1P2.x + robotP1P2.y*robotP1P2.y)/ sqrt(imageP1P2.x*imageP1P2.x + imageP1P2.y*imageP1P2.x);
	thetaR = atan2((robotP2.y - robotP1.y) ,(robotP2.x - robotP1.x));
	thetaI = atan2((imageP2.y - imageP1.y) , (imageP2.x - imageP1.x));
	thetaRI = thetaR - thetaI;
	cout <<"两坐标系的弧度偏离角为"<< thetaRI << endl;
	

	//3 input a new postion in the camera coodinate, computer will caculate the postion information in the robot coodinate
	position imageP3,robotP3;
	cout << "请输入一个新的图像坐标系点" << endl;
	cin >> imageP3.x >> imageP3.y;
	vector imageP1P3;
	imageP1P3.x = imageP3.x - imageP1.x;
	imageP1P3.y = imageP3.y - imageP1.y;
	double thetaN;
	thetaN = atan2(imageP1P3.y, imageP1P3.x);

	robotP3.x = factor*sqrt(imageP1P3.x*imageP1P3.x + imageP1P3.y*imageP1P3.y)* cos(thetaN + thetaRI) + robotP1.x;
	robotP3.y = factor*sqrt(imageP1P3.x*imageP1P3.x + imageP1P3.y*imageP1P3.y)*	sin(thetaN + thetaRI) + robotP1.y;

	cout << "机器人坐标系下的该点坐标为:" << endl;
	cout << robotP3.x << "," << robotP3.y << endl;

	system("pause");
	return 0;
}

 matlab计算程序如下:

clear; clc; close all;

Ar = [411.428 16.614]; % point A in robot coordinate
Br = [403.211 -109.381]; % point B in robot coordinate

Ai = [947 90]; % point A in image coordinate
Bi = [525 70]; % point B in image coordinate

AiBi = Bi - Ai
ArBr = Br - Ar

% calculate mm and pixel        coefficient
MM_PER_PIXEL = norm(ArBr) / norm(AiBi)

% swap image coordinate xi and yi
theta_i = atan2d( AiBi(1), AiBi(2) )
% theta_i = atan2d( AiBi(2), AiBi(1) )
theta_r = atan2d( ArBr(2), ArBr(1) )

THETA_IR = theta_r - theta_i

%%
Ni = [627 333]; % new point in image coordinate
AiNi = Ni - Ai;
theta_ni = atan2d(AiNi(1),AiNi(2));

Nrx = MM_PER_PIXEL*norm(AiNi)*cosd(theta_ni+THETA_IR) + Ar(1);
Nry = MM_PER_PIXEL*norm(AiNi)*sind(theta_ni+THETA_IR) + Ar(2);

Nr = [Nrx Nry]



% robot = [428.8647 59.8150]
% z = 227.8875


10.3 工业智能相机与SCARA机械手坐标系的标定实例

硬件设备为固高智能相机以及固高系统的SCARA机械手,该实例演示整个标定过程并验证标定效果。

以一枚硬币作为目标物体,分别从放置P1点与P2点,分别得到两个坐标点在相机坐标系以及机器人坐标系下的位置,通过路由器将三者连接起来,并通过ping来测试三者是否通信顺畅。如图10-4所示。

 

   



10-4 机器人,相机以及PC机连接示意图

物体在相机坐标系的坐标信息从固高智能相机软件中找到,如图10-5a所示;

 

10-5 相机坐标系下的坐标获取

 

物体在机器人坐标系的坐标信息需要移动机器人至物体上方,然后从示教器界面中查看位置信息,如图10-6所示;

 

  

10-6 机器人坐标系下的坐标获取

通过两个点的不同坐标系的坐标信息输入,计算得到了比例系数和偏转角,最后放置目标物体在一个新的位置,输入物体在相机坐标系的坐标,获得物体在机器人坐标系下的坐标,如图10-7所示。注意:相机坐标系输入坐标的时候,需要将xy坐标对调,因为机器人坐标系的z轴是向上的,根据右手定则相机坐标系的z轴向下,所以相机坐标系中软件显示的x坐标实为y坐标,y坐标实为x坐标。

 

10-7 坐标求取结果示意图

根据10-7所示,机器人坐标系下该点坐标应该为441.261,28.5031;然后,可以通过示教器直接进行点位移动来验证。当然,更好的方式是通过示教编程,因为只有弄懂了示教编程,才能进行下一步的相机进行模式识别,然后将坐标传送给计算机,计算机通过软件进行计算并把机器人坐标系下的坐标信息发送回机器人,机器人进行自动化跟踪抓取。

示教程序如下:

 

NOP

MOVJ P87 V=20% BL=0 VBL=0

SET STR=7

SOCKCLOSE str2

SOCKOPEN str2 type=SERVER

TIMER T=10000ms

SOCKRECV str2 str7 I1

STRSPLIT DELIM=, str7 str8 N=1

STRSPLIT DELIM=, str7 str9 N=2

STR2REAL str8 R8

STR2REAL str9 R9

SETE P88.1 R8

SETE P88.2 R9

MOVJ P88 V=20% BL=0 VBL=0

NOP

 

 

程序解释如下:首先将机器人移动至P87点(可随意选取,主要是为了观察机器人是否正常和接下来移动方便),使用str7来存储441.261,28.5031;接下来就要建立通信连接,str2存储的字符为pcpc在通信设置中设置的是电脑端的IP地址等信息;如图10-8所示。

 

10-8 数值型变量字符型界面示意图

在机器人等待接受数据的10秒间隔期间,将机器人坐标系下的位置信息通过TCP调试助手发送给机器人,保存在str7中,然后将str7中的字符进行分割,分割的标志为“,”,“,”前面的分割存入str8,“,”后面的分割存入str9,然后将其转换为实型变量,并将其复制给P88点,然后让机器人移动至P88点——即(441.261,28.5031)。具体的机器人编程请看《工业机器人控制系统用户手册.pdf》。

 

程序编写完成后,打开PC机的网络调试助手,并输入机器人端的IP地址以及端口号,以及待发送的内容,如图10-9所示。

 

10-9 网络调试助手通信示意图

观察发现机器人移动至物体上方,如图10-10所示,验证完成。

 

10-10 机器人移动结果示意图

观察发现机器人与目标物体的位置间有小的偏差,原因一是在于机器人未进行精准的零位标定(主要原因);二是因为对物体的坐标选取都为目测得到。


 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

十、工业相机与SCARA机械臂的坐标系标定 的相关文章

  • c++面试记录

    1 数组与指针区别 数组 数组是用于储存多个相同类型数据的集合 指针 指针是一个变量 但是它和普通变量不一样 它存放的是其它变量在内存中的地址 赋值 数组 只能一个一个元素的赋值或拷贝 指针 指针变量可以相互赋值 表示范围 数组有效范围就是
  • flink table 使用Kafka Connector处理嵌套json

    使用flink table api 连接kafka 处理json类型数据 单层json处理比较简单 官方或网上都有很多例子 处理嵌套的json数据没什么介绍 处理嵌套json数据主要是schema定义 StreamExecutionEnvi
  • Linux系统之使用yum安装Redis数据库

    Linux系统之使用yum安装Redis数据库 一 redis介绍 1 redis解释 2 redis特点 3 redis使用场景 二 检查系统版本 1 检查系统版本 2 检查内核版本 三 检查yum仓库状态 四 查看系统默认提供的redi
  • mysql数据恢复,使用binlog配置恢复未备份数据

    使用mysqlbinlog配置 恢复数据库 什么是mysqlbinlog binlog是记录所有数据库表结构变更 例如CREATE ALTER TABLE 以及表数据修改 INSERT UPDATE DELETE 的二进制日志 binlog
  • 命令行参数设计

    1 目的 众多通用的小功能 制作为一个小工具 然后通过命令行来进行交互 使用非常的简便 本规范是为了统一命令行参数的设计 使得大家在制作或使用命令行工具时 能够更加有共享 进行会更加方便 2 适用范围 所有命令行工具参数的设计 3 基本原则
  • #SATA# SATA 实际管脚接线图

    前言 概述 实际接线管脚图 PATA 接口 M 2 U 2 AHCI NVMe 概述 SATA是Serial ATA的缩写 即串行ATA 它是一种电脑总线 主要功能是用作主板和大量存储设备 如硬盘及光盘驱动器 之间的数据传输 这是一种完全不
  • 迁移学习:他山之石,可以攻玉【VALSE Webinar】Panel实录

    编者按 迁移学习是机器学习与计算机视觉中的重要研究问题之一 旨在研究如何将一个领域的知识迁移到另外的领域 具有重要的研究意义与应用价值 但迁移学习又会存在哪些局限性 在实际应用中的价值是什么 未来的发展方向在哪里 为此 VALSE Webi
  • docker 数据持久化

    文章目录 定制镜像持久化 需求 实现 数据卷持久化 数据卷简介 数据卷的特性 创建读写数据卷 停止容器后的操作 查看数据卷详情 创建只写数据卷 查看数据卷详情 创建共享数据卷 Dockerfile持久化 创建Dockerfile 构建和运行
  • 大二上学期数据结构课程设计

    1 报数问题 问题描述 有n个小朋友围成一圈玩游戏 小朋友从1至n编号 2号小朋友坐在1号小朋友的顺时针方向 3号小朋友坐在2号小朋友的顺时针方向 1号小朋友坐在n号小朋友的顺时针方向 游戏开始 从1号小朋友开始顺时针报数 接下来每个小朋友
  • 安装TensorFlow遇到no module named ‘tensorflow’问题解决方法

    按照这个博客https blog csdn net qq 16633405 article details 79941696里的步骤安装TensorFlow时遇到no module named tensorflow 虽然作者给出了一个解决方
  • 文本多分类之Doc2Vec实战篇

    本文链接 https blog csdn net weixin 42608414 article details 88391760 版权 在我之前的几篇博客中 我介绍了两种文档向量化的表示方法 如Sklearn的CountVectorize
  • 1.3. 分治法—最近点对问题

    1 问题描述 给定平面S上n个点 找其中的一对点 使得在n个点组成的所有点对中 该点对间的距离最小 2 求解过程 划分 将集合S分成两个大小基本相等的子集 S 1 S 1 S1 和 S
  • linux 基础知识考试试题,Linux常识型试题

    Linux常识型试题 发布时间 2011 06 06 18 11 10来源 红联作者 lijiang i s 本帖最后由 lijiang 于 2011 10 22 17 51 编辑 i 一 填空题 1 链接分为 和 2 安装Linux系统对
  • 解决Linux界面显示问号字符?与Failed to set locale, defaulting to C报错

    解决方法 暂时性处理 export LC ALL zh CN UTF 8 一劳永逸 vim etc bashrc 然后在最后一行写入 export LC ALL zh CN UTF 8 问题复现 解析 当输入 locale 会得到如下结果
  • 数据结构----利用栈实现表达式的计算

    利用栈实现表达式的计算 例如 12 5 6 9 7 8 5 6 8 5 6 12 要解决的问题主要有两个 和 的运算顺序的处理问题 括号内的表达式优先运算问题 这里利用栈来解决这两个问题 首先我们设置两个栈 一个符号栈 一个数字栈 下面我们
  • Novell数据备份

    从昨天下午到现在 才搞定 关总不提示的情况下 我一直认为xvRf是更新备份数据 cvRf是全部备份 其实则不然 关总告诉我 xvRf是导入数据 而cvRf才是备份数据 如果网络成功链接的话 那NDS服务器的数据就会被老数据覆盖了 幸好幸好
  • Android Studio day_01 初识线性布局和相对布局还有按钮

    序章 今天学习了线性布局 LinearLayout 和相对布局 RelativeLayout 还有Button按钮 布局是要用和进行结束的 至于Botton按钮嘛 使用 gt 结束就好啦 相对布局 RelativeLayout 相对布局我理
  • 卸载npm和安装npm_使用`npm uninstall`卸载npm软件包

    卸载npm和安装npm To uninstall a package you have previously installed locally using npm install

随机推荐

  • 激光雷达对植被冠层结构和SIF同时探测展望

    前言 陆表植被在全球碳循环中起着不可替代的作用 但现阶段 人们对气候变化与植被生态理化功能的关系的研究还不够完善 为了提高气候预测以及缓解气候恶化的速率 对植被参数比如 叶面积指数 leaf 植被冠层结构 canopy 和生态系统以及区域尺
  • Linux服务器程序规范

    Linux服务器程序规范 Linux服务器程序一般都是以后台进程形式运行 后台进程又称为守护进程 daemon 其没有控制终端 不会意外接收到用户输入 守护进程的父进程通常是init进程 PID为1的进程 Linux服务器程序通常有一套日志
  • Tomcat启动不了报 java.net.BindException “Address already in use: NET_Bind“这个异常

    Tomcat在IDEA运行报以下错误 启动不了Tomcat Error running Tomcat 8 5 57开关 Unable to open debugger port 127 0 0 1 63840 java net BindEx
  • Hive文件格式

    文章目录 1 概述 1 1 行存储 列存储 2 TEXTFILE 3 SEQUENCEFILE 3 RCFILE 4 ORCFILE 5 Parquet 8 区别 8 1 空间对比 磁盘空间占用大小比较 8 2 查询语句运行时间大小比较 9
  • socket链接检测超时时间过短导致的问题

    新增了另外一个区域的代理 跨州 原来的代理可达性检测只有50ms 就不够了 导致大量报错 更换为1000毫秒后 就正常了 需要注意网络中几个连接超时时间的设置问题 1 链接超时时间 一般是1 5秒 全内网服务器 可以设置得更短一些 2 等待
  • 《消息队列高手课》 消息积压了该如何处理?

    据我了解 在使用消息队列遇到的问题中 消息积压这个问题 应该是最常遇到的问题了 并且 这个问题还不太好解决 我们都知道 消息积压的直接原因 一定是系统中的某个部分出现了性能问题 来不及处理上游发送的消息 才会导致消息积压 所以 我们先来分析
  • CSS背景属性Background详解

    本文详解了CSS的背景属性Background 包括CSS3中新增的背景属性 如果你是个CSS初学者 还可以查看之前介绍的CSS浮动属性和CSS透明属性详解 css2 中的背景 background CSS2 中有5个主要的背景 backg
  • Maven详解之仓库------本地仓库、远程仓库

    Dragon s Life 坚持 完成每一个目标 目录视图 摘要视图 订阅 征文 从高考 到程序员 深度学习与TensorFlow入门一课搞定 每周荐书 Web扫描 HTML 5 Python 评论送书 Maven详解之仓库 本地仓库 远程
  • Python+Selenium-5-driver.page_source获取页面源码

    driver page source selenium的page source方法可以获取到页面源码 跟爬虫有点相似 获取到页面资源 提取出我们需要的信息 案例 以煎蛋网为例 获取首页的全部title 获取页面源码 使用re正则提取需要的t
  • SpringBoot自定义工厂类读取yml配置文件&&SpringBoot轻松读取properties文件

    PropertySource指定文件地址 ConfigurationProperties指定前缀 第一次 SpringBoot 读取配置文件 demo如下 designers yml文件 designer owner openids 8hV
  • IDEA导入lib目录下的jar包

    https blog csdn net u010286027 article details 85248719 ops request misc request id biz id 102 utm term idea E6 96 B0 E5
  • LeetCode【114】二叉树展开为链表

    题目 给定一个二叉树 原地将它展开为链表 例如 给定二叉树 将其展开为 最终转化完 pre节点只有right 没有left TreeNode pre null public void flatten TreeNode root if roo
  • 【Mariadb高可用MHA】

    目录 一 概述 1 概念 2 组成 3 特点 4 工作原理 二 案例介绍 1 192 168 42 3 2 192 168 42 4 3 192 168 42 5 4 192 168 42 6 三 实际构建MHA 1 ssh免密登录 1 1
  • openshift搭建Istio

    本文档覆盖了官方文档的Setup的所有章节 一 安装Istio 本次安装的Istio版本为1 7 0 环境为openshift 4 3 注 不建议使用openshift 1 11 即kubernetes 3 11 安装istio 可能会出现
  • HBase简介(很好的梳理资料)

    http jiajun iteye com blog 899632 一 简介 history started by chad walters and jim 2006 11 G release paper on BigTable 2007
  • 腾讯云如何修改域名DNS服务器

    当你在腾讯云购买域名后 如果 DNS 服务器不正确 要把域名 DNS 修改为提示的 DNS 地址 解析后才生效 下面老魏说下操作步骤 一 通过以下步骤查看 DNS 服务器是否正确 登录腾讯云控制台 选择 云产品 gt 域名与网站 gt 云解
  • 短视频seo矩阵系统源码开发与部署全解析

    在这个数字化快速发展的时代 短视频已经成为人们获取娱乐 学习 商业信息的主要途径之一 对于企业来说 利用短视频矩阵进行高效且精准的营销推广 无疑是一个重要的战略方向 本文将详细介绍如何进行短视频矩阵源码的开发与部署 一 开发篇 短视频矩阵源
  • linux 常用语句 grep、awk、sed

    复习资料 一 find grep 管道符 1 find 路径 name 文件名 查找文件 2 grep sex true 文本包含sex true 的行显示出来 3 grep sex true grep o age 18 对grep sex
  • 【Kettle】将【MySQL表按字段同步、更新】【脚本运行】

    前提数据 转换 1 表输入设置 2 插入 更新设置 作业 模块设置 SQL设置 手动输入脚本内容 每次运行都会运行此脚本
  • 十、工业相机与SCARA机械臂的坐标系标定

    注 感谢固高长江研究院徐工程师的技术讲解 以及matlab程序 机器人系统程序的提供 在工业现场当中 相机拍摄到的图像有一个相机坐标系 而机器人自身也有一个机器人自身的坐标系 两者互相独立 当我们通过相机进行对物体进行拍摄 通过模式识别得到