首页 > 其他分享 >2D机械手手眼标定

2D机械手手眼标定

时间:2023-05-18 22:22:31浏览次数:27  
标签:begin right end 2D 机械手 pmatrix theta 手眼 left

2D情况下机械手手眼标定就是计算机械手坐标和图像坐标之间的仿射变换。如果机械手坐标平面和图像坐标平面不平行的话还会有透视变换,也叫单应性变换,但这里不考虑透视的情况。在标定的时候机械手坐标是机械手系统返回的坐标;而图像坐标一般是基于模板的定位算法返回的坐标。二者的坐标是确定的,但是它们的旋转中心(机械手旋转轴和模板定位算法的中心)却不相同。因此需要把它们的旋转中心转换到同一个中心上才能做仿射变换。本文下方的公式是把机械手旋转轴转换到模板定位算法的中心再做仿射变换的。下面是一个示意图。图中灰色图形代表物体;S是机械手旋转轴;T是模板定位算法的中心;${ R_{\theta} }$是机械手的方向,角度逆时针旋转为正;${ h_{l} }$是S、T之间的距离;${ h_{\theta} }$是一个角度补偿量:

从上图可得出机械手坐标${ \left( R_{x},R_{y},R_{\theta} \right) }$和图像坐标${ \left( I_{x},I_{y},I_{\theta} \right) }$之间的变换关系如下:

$${ \begin{equation} \begin{pmatrix} R_{x}+h_{l}cos \left( R_{\theta} + h_{\theta} \right) \\ R_{y}+h_{l} sin \left( R_{\theta} + h_{\theta} \right) \\ R_{\theta} \\ 1 \end{pmatrix} = \begin{pmatrix} a & b & 0 & d_{x} \\ c & d & 0 & d_{y} \\ 0 & 0 & k & d_{\theta} \\ 0 & 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} I_{x} \\ I_{y} \\ I_{\theta} \\ 1 \end{pmatrix} \end{equation} }$$

此方程共有10个未知数,每组坐标产生3个方程,最少需要4组坐标方程可解。它支持坐标的平移、旋转、缩放、切变和镜像。亦可以明显地看出来它不是线性方程组,不能用最小二乘法求解。但是它的非线性参数只有${ h_{\theta} }$一个,所以可以对${ h_{\theta} }$应用梯度下降法,而其它参数使用最小二乘法。现在我们对收集到的N组坐标构造如下误差函数:

$${ \begin{align*} e=&\sum_{i=1}^{N}\left[ R_{x,i}+h_{l}cos \left( R_{\theta,i} + h_{\theta} \right)-\left( aI_{x,i}+bI_{y,i}+d_{x} \right) \right]^{2}+ \\ &\sum_{i=1}^{N}\left[ R_{y,i}+h_{l}sin \left( R_{\theta,i} + h_{\theta} \right)-\left( cI_{x,i}+dI_{y,i}+d_{y} \right) \right]^{2}+ \\ &\sum_{i=1}^{N}\left[ R_{\theta,i}-\left( kI_{\theta,i}+d_{\theta} \right) \right]^{2} \end{align*} }$$

对${ h_{\theta} }$求偏导数:

$${ \begin{equation} \begin{split} \frac{\partial e}{\partial h_{\theta}}=-2&\sum_{i=1}^{N}h_{l}sin \left( R_{\theta,i} + h_{\theta} \right) \left[ R_{x,i}+h_{l}cos \left( R_{\theta,i} + h_{\theta} \right)-\left( aI_{x,i}+bI_{y,i}+d_{x} \right) \right]+ \\ 2&\sum_{i=1}^{N}h_{l}cos \left( R_{\theta,i} + h_{\theta} \right)\left[ R_{y,i}+h_{l}sin \left( R_{\theta,i} + h_{\theta} \right)-\left( cI_{x,i}+dI_{y,i}+d_{y} \right) \right] \\ =-2&\sum_{i=1}^{N}h_{l}sin \left( R_{\theta,i} + h_{\theta} \right) \left[ R_{x,i}-\left( aI_{x,i}+bI_{y,i}+d_{x} \right) \right]+ \\ 2&\sum_{i=1}^{N}h_{l}cos \left( R_{\theta,i} + h_{\theta} \right)\left[ R_{y,i}-\left( cI_{x,i}+dI_{y,i}+d_{y} \right) \right] \end{split} \end{equation} }$$

对另外9个未知数使用最小二乘法求解。我们把(1)式整理成${ \mathbf{X}\mathbf{K}=\mathbf{Y} }$的形式。矩阵${ \mathbf{K} }$代表待求的9个未知数,后续都用它表示:

$${ \begin{equation} \begin{pmatrix} I_{x} & I_{y} & 1 & 0 & 0 & 0 & 0 & 0 & -cos \left( R_{\theta} + h_{\theta} \right) \\ 0 & 0 & 0 & I_{x} & I_{y} & 1 & 0 & 0 & -sin \left( R_{\theta} + h_{\theta} \right) \\ 0 & 0 & 0 & 0 & 0 & 0 & I_{\theta} & 1 & 0 \end{pmatrix} \begin{pmatrix} a \\ b \\ d_{x} \\ c \\ d \\ d_{y} \\ k \\ d_{\theta} \\ h_{l} \end{pmatrix}=\begin{pmatrix} R_{x} \\ R_{y} \\ R_{\theta} \end{pmatrix} \end{equation} }$$

这里不再赘述最小二乘法的推导过程。可以用OpenCV中的cv::solve(...)函数求解。那么对(1)式求解的流程如下:

已知条件 ${ \left(R_{x,i},R_{y,i},R_{\theta,i} | I_{x,i},I_{y,i},I_{\theta,i} \right),i=1,2,...,N }$
流程
  1. 确定常数${ C }$的值。随机选择一个${ h_{\theta} \in [0,2\pi) }$;
  2. 判断是否满足结束条件。满足则跳至第5步,否则执行下一步。结束条件可以是达到指定循环次数,或优化结果连续数次变化量小于指定的误差等;
  3. 将${ h_{\theta} }$视为已知量,使用(3)式求解得到${ \mathbf{K} }$。保存结果${ \left( {\mathbf{K},h_{\theta}} \right) }$;
  4. 使用公式${ h_{\theta}=h_{\theta} - \left. \frac{\partial e}{\partial h_{\theta}} \right|_{\mathbf{K},h_{\theta}} \cdot C }$更新${ h_{\theta} }$,偏导数公式见(2)式。然后返回第2步;
  5. 输出10个待求未知数最新值:${ \left( {\mathbf{K},h_{\theta}} \right) }$。
说明 第1步中随机选择${ h_{\theta} }$经过测试在某些情况下难以收敛到最优解。鉴于${ h_{\theta} }$取值范围有限是${ [0,2\pi) }$,所以可以直接遍历区间${ [0,2\pi) }$,比如每隔1°计算一次拟合误差,取拟合误差最小的${ h_{\theta} }$作为迭代起始值。

声明:多年以前我曾看过一篇康耐视的专利描述了2D手眼标定的方法,具体内容我记不清了。大概跟本文方法相似,所以本文内容仅供研究学习只用,勿用于商业。

标签:begin,right,end,2D,机械手,pmatrix,theta,手眼,left
From: https://www.cnblogs.com/mengxiangdu/p/17403774.html

相关文章

  • R2DBC配置与使用
    依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>io.r2dbc</groupId><artifactId&g......
  • 【Cocos2d游戏开发之四】独自收集Cocos2d提供的字体!共57种(有对照的字体图)...
     很多游戏中,便于开发就会直接采用Cocos2d提供的字体库来使用,但是因为提供的种类很多,那么Himi利用一些时间整理了57种字体样式,这些我想足够你用了;不多说下面一起来看看吧:(每张图对应11种样式的字体,字体的名字就是其样式的名字)   ---------------1------------------CCLabelTTF*myLabel=[CCLabelTTFlabelWithS......
  • 【Cocos2d游戏开发之七】添加/删除系统组件,并解决View设置透明会影响View中的其他组件
    好像有段时间没有更新了,主要项目比较着急,不过现在cocos2d基本算是全拿下了,进展很顺利,那么在这里主要给大家介绍下一些Himi遇到的问题;本章介绍两个知识点:        1.在Cocos2d中添加系统组件;(本例中添加UIView并嵌套一些View)  “   如何把背景图片设置为半透明......
  • 【Cocos2d游戏开发之九】CCSpriteBatchNode与"pvr.ccz","plist"精灵优化及注意事项
     首先对于使用过精灵的童鞋很熟悉CCSpriteBatchNode,至少大家都会知道它能优化精灵,但是至于优化原理这里简单说下:      一般使用精灵CCSprite的时候,都是直接使用[CCLayer*addChild:CCSprite*];,假设我们创建一百个精灵,那么当前的CCLayer会为100个精灵单独绘制;  ......
  • Unity 角色移动2D动画模块
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;[RequireComponent(typeof(SpriteRenderer))]publicclassSpriteAnimator:MonoBehaviour{privateSpriteRendererspriteRenderer;[SerializeField]privateSpriteid......
  • FactoryIO十字机械手组装工作站仿真实验程序 【程序原创】使用简单的梯形
    FactoryIO十字机械手组装工作站仿真实验程序【程序原创】使用简单的梯形图编写,逻辑清晰,通俗易懂,写有详细注释,起到抛砖引玉的作用,比较适合有动手能力的入门初学者。加工中心的机器人不是真正的机器人,是仿真软件的一个部件,通过简单的IO控制,机器人执行固定的动作。软件环境:1、西门子......
  • 机械手程序,六轴程序用信捷XD5和威纶触摸屏编写。 此程序已经
    机械手程序,六轴程序用信捷XD5和威纶触摸屏编写。此程序已经实际设备上批量应用,程序成熟可靠,借鉴价值高,程序有注释。YID:138662483310125......
  • 双头双Y自动锁螺丝机带压壳和下料机械手程序,采用显控触摸屏和台达PLC,用PLC做配方保存
    双头双Y自动锁螺丝机带压壳和下料机械手程序,采用显控触摸屏和台达PLC,用PLC做配方保存产品参数。单独用可以做三轴带下料机械手螺丝机,连机用便是双头双Y待下架机械手自动锁螺丝。下料机械手是横向的,即只用一个电机,左边打就去左边取,右边打就去右边取。卸料位置统一在同一个地方。可......
  • 如何利用Spine制作简单的2D骨骼动画(附软件下载)
    在2D游戏中,我们经常看到各种各样的角色动画。动画能给游戏带来生机和灵气。创作一段美妙的动画,不仅需要强大的软件工具,更需要一套完善的工作流程。Spine就是一款针对游戏开发的2D骨骼动画编辑工具。Spine可以提供更高效和简洁的工作流程,以创建游戏所需的动画。下载Spine3.8.7......
  • 创建自己的色板,适用于 PS/CSP/GIMP/Krita/Pencil2D 等软件
    ​ 在数字创意的时代,调色板成为了设计师不可或缺的工具。一个好的调色板可以让设计更加有吸引力和协调性。如果你正在寻找一款优秀的调色板软件,那就试试焰火十二卷吧!焰火十二卷具有多种配色功能,适用于多种场景。它可以帮助你从色轮或者其他地方生成一组和谐的色彩。你可以将这些......