如何完成一个三维引导项目:第一步 手眼标定(眼在手外)

如何完成一个三维引导项目:第一步 手眼标定(眼在手外)

主要使用算子:

*从点对应近似一个三维变换
vector_to_hom_mat3d 

*对点应用任意仿射3D变换
affine_trans_point_3d 


前言

今天分享的是空间N点标定法:
该方法无论是理论还是实践都是简单暴力的。
基础知识:对于两个三维坐标系A和B,空间中有N个点,已知这些点在坐标系A下的三维坐标,并知这些点在坐标系B下的三维坐标。则可以建立N组P_A=T_C^A 〖*P〗_C方程。那么,就可以直接求取T_C^A了。
图1eye-to-hand标定B方法原理图

在实际操作中,一种方式是使用标记物标记机械臂末端点,则空间坐标点在机械臂基座坐标系下的位置已知(读取机械臂末端坐标),在相机三维坐标系下的位置可以通过在图像中定位该标记物,并基于图像坐标映射,获取该点在相机三维坐标系下的三维位置。这些点必须保证是非共面的,且这些点应尽可能散布在工作区域下。


前期准备

halcon任一版本(我使用19.11)、相机坐标系与机器人坐标系下对应点坐标值。

整体代码

所有的代码:

*相机坐标系与机器人坐标系下对应点坐标值
inputImageX:=[1,2,3]
inputImageY:=[1,2,3]
inputImageZ:=[1,1,1]
inputRobotX:=[3,4,5]
inputRobotY:=[3,4,5]
inputRobotZ:=[1,1,1]

inputTransformationType:='rigid'

*List of values: 'affine', 'projective', 'rigid', 'similarity'
*'rigid':刚性的3D变换(一个旋转和一个平移) 3组数据
*'affine':通用的仿射3D变换 4组数据
*'projective':投影3D变换 5组数据
*'similarity':3D相似变换(统一缩放、旋转和平移) 3组数据
*从点对应近似一个三维变换,获得变换矩阵
vector_to_hom_mat3d (inputTransformationType, inputImageX, inputImageY, inputImageZ, inputRobotX, inputRobotY, inputRobotZ, outputHomMat3D)
*通过变换矩阵 准备计算重投影误差数据
affine_trans_point_3d (outputHomMat3D, inputImageX, inputImageY, inputImageZ, robotPointsX, robotPointsY,robotPointsZ)

*计算重投影误差
err2 := []
for Index := 0 to |robotPointsX|-1 by 1
*空间中点欧氏距离
    err2 := [err2, sqrt(pow(robotPointsX[Index]-inputRobotX[Index], 2) + pow(robotPointsY[Index]-robotPointsY[Index],2)) +pow(robotPointsZ[Index]-robotPointsZ[Index],2)]
endfor
outputErrMean := mean(err2)
outputErrMax  := max(err2)
*保存
write_tuple (outputHomMat3D, 'outputHomMat3D.txt')

总结

以上就是在Halcon中使用空间N点标定法完成(眼在手上)手眼标定的所有代码,下篇文章介绍如何使用手眼标定的结果。

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值