当前位置: 首页 > news >正文

手眼标定眼在手上

1、为什么要用手眼标定

参考手眼标定特别是眼在手上在网上的文章很多,但很多在实际中调试不通。在定位时候,往往希望相机能返回的是机械的世界坐标,而不是相机的的图像坐标。从而间接计算出相机坐标系与机械坐标世界坐标转换矩阵,以镜头中心为参考点。

2、手眼标定的实现

 stp1:移动模组3*3 ,3行3列,分别模组走一个点(Bx,By),相机拍照获取一张图片Mark的坐标(Ax,Ay)的坐标。

*已知相机的9个点
Ax:=[825.505,1116.06,1405.89,830.793,1121.89,1412.44,836.321,1127.35,1417.95]
Ay:=[1413.87,1419.22,1423.91,1122.52,1128.24,1133.46,830.913,836.734,842.063]

*分别对应相机Mark点的模组获取的坐标
Bx:=[-152.7289,-153.7289,-154.7289,-152.7289,-153.7289,-154.7289,-152.7289,-153.7289,-154.7289]
By:=[-92.8409,-92.8409,-92.8409,-93.8409,-93.8409,-93.8409,-94.8409,-94.8409,-94.8409]

stp2:仿射变换求出仿射矩阵HomMat2D

vector_to_hom_mat2d ( Ax, Ay, Bx, By,HomMat2D)

stp3:求世界坐标

手眼标定,以相机中心

1、求出base,以图像dqx1, dqy1(0,0)为参考点

affine_trans_point_2d (HomMat2D, 0, 0, dqx1, dqy1)

2、求出图像Mark坐标(pixx:=1417.95,pixy:=842.063)到图像中心点坐标的世界坐标(标定时候的)中心点(1024,1224)

dpix:=1024-pixx
dpiy:=1224-pixy

affine_trans_point_2d (HomMat2D, dpix, dpiy, dqx, dqy)

3、求出偏差Offset   dqx2,dqy2   

dqx2:=dqx-dqx1
dqy2:=dqy-dqy1

4、模组获取反馈的运动控制的坐标realx,raaly,求出镜头中心实际坐标realx3,realy3

realx3:=realx+dqx2
realy3:=raaly+dqy2

read_image(Image, 'printer_chip/printer_chip_01')
*已知A坐标系的9个点
Ax:=[825.505,1116.06,1405.89,830.793,1121.89,1412.44,836.321,1127.35,1417.95]
Ay:=[1413.87,1419.22,1423.91,1122.52,1128.24,1133.46,830.913,836.734,842.063]*待识别的B坐标点,和上面的A坐标系点一一对应
Bx:=[-152.7289,-153.7289,-154.7289,-152.7289,-153.7289,-154.7289,-152.7289,-153.7289,-154.7289]
By:=[-92.8409,-92.8409,-92.8409,-93.8409,-93.8409,-93.8409,-94.8409,-94.8409,-94.8409]
* for Index := 1 to 9 by 1
*     dev_display (Image)* 以下过程为在B坐标系找A中的9个点
*     draw_rectangle1 (200000, Row1, Column1, Row2, Column2)
*     gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
*     reduce_domain (Image, Rectangle, ImageReduced)
*     binary_threshold (ImageReduced, Region, 'max_separability', 'light', UsedThreshold)
*     connection (Region, ConnectedRegions)
*     select_shape (ConnectedRegions, SelectedRegions, 'roundness', 'and', 0.7, 1)
*     select_shape (SelectedRegions, SelectedRegion2, 'rb', 'and', 32, 100)
*     fill_up (SelectedRegions, RegionFillUp)*找到了B坐标系的点(Row,Column)
*     area_center (RegionFillUp, Area, Row, Column)
*     Bx:=[Bx,Column]
*     By:=[By,Row]
* endfor
*得到目标变换矩阵HomMat2Dvector_to_hom_mat2d ( Ax, Ay, Bx, By,HomMat2D)vector_to_hom_mat2d ( Bx, By, Ax, Ay,HomMat2DINV)********new realx raaly机械反馈的坐标
realx:=-154.7289
raaly:=-94.8409
pixx:=1417.95
pixy:=842.063
dpix:=1024-pixx
dpiy:=1224-pixy
affine_trans_point_2d (HomMat2D, dpix, dpiy, dqx, dqy)
affine_trans_point_2d (HomMat2D, 0, 0, dqx1, dqy1)dqx2:=dqx-dqx1
dqy2:=dqy-dqy1realx3:=realx+dqx2
realy3:=raaly+dqy2

http://www.lryc.cn/news/119563.html

相关文章:

  • 【数据结构】初始二叉树
  • 创建和使用角色(RHCE)
  • Leetcode 583 两个字符串的删除操作(经典)
  • c#实现工厂模式
  • c#在设计时调试自定义 Windows 窗体控件
  • Ajax 笔记(二)—— Ajax 案例
  • 微信小程序隐私协议模板
  • Three.js WebXR沉浸式渲染简明教程
  • flask使用cookie (设置cookie与查看cookie内容)
  • 信息学奥赛一本通——1281:最长上升子序列
  • vue3+antv x6自定义节点样式
  • Arcgis中直接通过sde更新sqlserver空间数据库失败
  • 使用gewe框架进行微信群组管理(一)
  • 【Linux】UDP协议——传输层
  • 【Linux进阶之路】进程(上)
  • 爬虫018_urllib库_cookie反爬_post请求百度翻译获取百分翻译内容_以及详细翻译内容---python工作笔记037
  • 【Nginx】Nginx网站服务
  • go语言从0基础到安全项目开发实战
  • Kubernetes Service 工作原理
  • 面部表情识别4:C++实现表情识别(含源码,可实时检测)
  • 提升Element UI分页查询用户体验与交互:实现修改未保存提示
  • UML-时序图
  • Seata - 入门笔记
  • springboot使用aop排除某些方法,更新从另外一张表,从另外一张表批量插入
  • Go 语言面试题(二):实现原理
  • SAP MM学习笔记16-在库品目评价
  • Azure通过自动化账户实现对资源变更
  • 使用luarocks安装cjson并使用cjson
  • 【已解决】mac端 sourceTree 解决remote: HTTP Basic: Access denied报错
  • javaee dom4j读取xml文件