基于OpenCv的机器人手眼标定(九点标定法)

对于初学者而言,对相机的标定经常模糊不清。不知道机器坐标与相机坐标如何转换,两个坐标系又是如何建立?
我们通常是利用张氏标定法,针对于相机的畸变进行标定,利用校正得到的参数对图形进行处理后再呈现出来。这个方法网上用的人很多,资料也较为全面。这里就不做说明了。本文主要是针对机械手的手眼标定,一般而言目前相机的畸变较小,精度也较为准确,使用该方法进行标定也能得到较好的效果。
首先,对于九点标定而言。我们使用到的是OpenCv中的estimateRigidTransform 函数。
函数定义如下:
Mat estimateRigidTransform(InputArraysrc,InputArraydst,boolfullAffine)
前两个参数,可以是 :src=srcImage (变换之前的图片Mat) dst=transImage(变换之后的图片Mat)
也可以: src=array(变换之前的关键点Array) dst=array(变换之后的关键点Array)
第三个参数: 1(全仿射变换,包括:rotation, translation, scaling,shearing,reflection)

其主要原理为:如果我们有一个点变换之前是[x,y,1],变换后是[x’,y’,1] 则fullAffine表示如下:

在这里插入图片描述

TX=Y
在这里插入图片描述

展开后表示

在这里插入图片描述

如果我们想求这【a-f】 6个变量需要有6个方程,也就是3组点。但是比三个点多呢?
比如:20个点。那就是用最小方差。
在这里插入图片描述
标定步骤
1、首先我们需要准备一块,标定板。如果条件不足,可以使用白纸画上九个圆进行代替。
在这里插入图片描述
2、相机位置,机械手位置全部固定好,标定针固定在机械手上,固定好后不能够再移动。标定针的位置一定要与夹手或吸盘之内的工具同一位置高度。
3、将标定板放到相机下方,位置区域要与机械手工作的区域一样,包括高度必须尽量一致,这是标定准确度的关键。
4、调整好相机焦距,拍照,然后识别9个圆圆心的坐标并进行记录。关于如何找圆,可以参考我的上一篇博文,对于圆形的查找十分精准。
5、将机械手依次移动到9个圆的圆心位置,记下机械手坐标

做完以上五步,我们会得到两个点集。一个为9个圆圆心坐标(points_camera),一个为9个圆心对应的机械手坐标(points_robot)。

	Mat warpMat;
	vector<Point2f>points_camera;
	vector<Point2f>points_robot;`
	vector<Point2f>points_camera;
	vector<Point2f>points_robot;
	warpMat =estimateRigidTransform(points_camera, points_robot, true);
	 A = warpMat.ptr<double>(0)[0];
	 B = warpMat.ptr<double>(0)[1];
	 C = warpMat.ptr<double>(0)[2];
	 D = warpMat.ptr<double>(1)[0];
	 E = warpMat.ptr<double>(1)[1];
	 F = warpMat.ptr<double>(1)[2];

得出来的6个double类型的参数,就是我们此次标定最终得到的标定参数了。
之后我们把检测得到的图像坐标(t_px,t_py)代入,就可以得到与之相对应的机械手坐标(t_rx,t_ry)
t_rx= (A * t_px) + B * t_py + C);
t_ry= (D * t_px) + E * t_py+ F);
至此标定结束,我们可以控制相机拍照进行定位,然后转换成机械手坐标,指哪打哪了。希望对初学者有所帮助,转载请注明出处。

Python 和 OpenCV(Open Source Computer Vision Library)结合常用于机器人视觉和机器臂应用中,包括手眼标定(Hand-Eye Calibration),这是一个关键步骤,用于同步机械臂末端执行器(如摄像头或传感器)和相机系统的位置。手眼标定有助于确保机械臂能准确地根据从摄像头捕获的图像来定位物体。 具体流程如下: 1. **安装依赖**:首先确保已安装 Python、OpenCV、NumPy 和相关库(如Scikit-image等)。 ```python pip install opencv-python numpy matplotlib ``` 2. **数据收集**:在实际环境中,让机械臂移动到固定位置,并在每个位置抓取一张目点清晰的照片。这些照片将作为校准输入。 3. **特征检测**:使用 OpenCV 提供的关键点检测算法(如 SIFT, SURF 或 ORB)提取图像中的兴趣点。 ```python import cv2 orb = cv2.ORB_create() keypoints, descriptors = orb.detectAndCompute(image, None) ``` 4. **记坐**:为每个特征点记真实世界的位置。这通常通过外部传感器(如激光测距仪或运动捕捉设备)完成。 5. **拍摄对应视图**:在相同的世界坐系下,让机械臂模仿这些记位置并再次拍照。 6. **匹配关键点**:通过比对两组图片的关键点描述符找到配对。 7. **拟合变换矩阵**:利用特征匹配计算出机械臂端部坐与相机坐之间的关系矩阵,通常是旋转和平移矩阵。 8. **验证标定结果**:在不同角度和姿态下重复上述步骤,检查校准是否稳定。 9. **保存和使用**:将校准参数存储起来,后续使用时可以通过读取参数直接调整机械臂的动作。 相关问题: 1. 手眼标定的具体应用场景有哪些? 2. 如何评估机械臂手眼标定的精度? 3. 在实际操作中如何处理手眼标定过程中可能出现的噪声或异常?
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值