赞
踩
主要使用算子:
*从点对应近似一个三维变换
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了。
在实际操作中,一种方式是使用标记物标记机械臂末端点,则空间坐标点在机械臂基座坐标系下的位置已知(读取机械臂末端坐标),在相机三维坐标系下的位置可以通过在图像中定位该标记物,并基于图像坐标映射,获取该点在相机三维坐标系下的三维位置。这些点必须保证是非共面的,且这些点应尽可能散布在工作区域下。
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点标定法完成(眼在手上)手眼标定的所有代码,下篇文章介绍如何使用手眼标定的结果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。