专业的编程技术博客社区

网站首页 > 博客文章 正文

3D视觉 | 机器人3D手眼标定实验(上)

baijin 2024-10-14 08:22:03 博客文章 10 ℃ 0 评论


3D视觉 | 机器人3D手眼标定实验


复现Cognex VisionPro 3D的大部分内容,涵盖眼在手外、眼在手上,包括相机标定、手眼标定、3D定位计算位移偏差。最后的位移偏差与Cognex的结果在1mm左右。


— Edited By Hugo


# 1

用python实现原型验证算法,再移植成C++编译为dll,供C#调用。
python的库主要用到:cv2、numpy。
C++的库主要用到:OpenCV、Eigen。


复现的VisionPro 3D函数:




封装成dll的函数接口:



函数接口:


1.void getMatsEth(int* other_info, char* point3d_str, char* point2d_str, char* robot_str, double* mtx33_l, double* mtx33_r, double* mtx44_l, double* mtx44_r)


2.void getMatsEih(int* other_info, char* point3d_str, char* point2d_str, char* robot_str, double* mtx33_l, double* mtx33_r, double* mtx44_l, double* mtx44_r)


3.void calc_ImageToWorld(double* _mtx44_cam3dToPhy3d_l, double* _mtx33_camIntrin_l, double* _mtx44_cam3dToPhy3d_r, double* _mtx33_camIntrin_r, double* _Point_Cl, double* _Point_Cr, double* params)


4.void calc_Excursion(int pointNum, double* _Point_Model_3D, double* _Point_Now_3D, double* _res_excursion)





# 2





总体步骤:


1.相机标定

2.手眼标定

3.计算偏移


坐标系转换:


1.左右相机通过特征提取,得到Raw2D下的特征点坐,通过相机内参,将特征点转到Camera2D下。


2.把未知高度作为未知数,将特征点转到Camera3D下,通过手眼矩阵,将特征点转到Hand3D下


3.通过示教器读取的机械手位姿,将特征点转到RobotBase3D下


# 3

方程求解,代入数据:


最终共有6个方程,即左右相机各3个方程(x、y、z),但6个方程中只有5个未知数,即RobotBase3D下的X、Y、Z、Camera3D下的左右相机的z,一般做法,用优化方法解超定方程即可。


3D视觉基础知识:


位姿,刚体在坐标系中用位姿描述,位姿 = 位置(position) + 姿态(orientation)。


一般地,位置和姿态各用3个值表示,位置用x、y、z表示偏移,姿态用rx、ry、rz表示欧拉角旋转。


标定板:


工业常用标定板分两大类:实心圆阵列(Halcon)、棋盘格(VisionPro、OpenCV、Matlab),非精确制造的标定板会导致不好的标定结果,比如激光/喷墨打印机打印的标定板。


康耐视的棋盘格(Cognex checkerboard)包含标准的基准标识,能够做到不必在一张图片内拍摄整张棋盘格。



篇幅有限,下一篇继续分享:


1.相机标定

2.姿态评估

3.手眼标定

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表