平常我在做手眼标定时,一般都是通过OpenCV的
cv::calibrateHandEye
函数进行求解,需要输入多组不同的机械臂位姿。今天遇到了一款舵机机器人,只能获取位置,得不到姿态信息,想着那就把姿态都设为0,结果求不出来。。。
目录
- 1.cv::calibrateHandEye函数说明
- 2.只给出位置信息的测试结果
- 3.问题原因排查
1.cv::calibrateHandEye函数说明
CV_EXPORTS_W void calibrateHandEye( InputArrayOfArrays R_gripper2base, InputArrayOfArrays t_gripper2base,
InputArrayOfArrays R_target2cam, InputArrayOfArrays t_target2cam,
OutputArray R_cam2gripper, OutputArray t_cam2gripper,
HandEyeCalibrationMethod method=CALIB_HAND_EYE_TSAI );
- 输入参数:
R_gripper2base:从将夹爪坐标系下的点转换到机器人基坐标系(robot base frame)的齐次矩阵中提取的旋转部分,是一个vector类型,包含所有从夹爪坐标系到机器人基坐标系变换的(3x3)旋转矩阵或(3x1)旋转向量。
t_gripper2base:从上述齐次矩阵中提取的平移部分,是vector类型,包含所有从夹爪坐标系到机器人基坐标系变换的(3x1)平移向量。
R_target2cam:从将目标坐标系(target frame)下的点转换到相机坐标系的齐次矩阵中提取的旋转部分,是vector类型,包含所有从标定目标坐标系到相机坐标系变换的(3x3)旋转矩阵或(3x1)旋转向量。
t_target2cam:从上述齐次矩阵中提取的平移部分,是vector类型,包含所有从标定目标坐标系到相机坐标系变换的(3x1)平移向量。
method:指定使用的手眼标定方法,可选择的方法包括先估计旋转再估计平移的可分离解法(如 Tsai 和 Lenz 的方法、Park 和 Martin 的方法、Horaud 和 Dornaika 的方法),以及同时估计旋转和平移的联立解法(如 Andreff、Horaud 和 Espiau 的在线手眼标定方法,Daniilidis 使用对偶四元数的手眼标定方法)。 - 输出参数:
R_cam2gripper:估计得到的从相机坐标系到夹爪坐标系的齐次变换矩阵中的(3x3)旋转部分。
t_cam2gripper:估计得到的从相机坐标系到夹爪坐标系的齐次变换矩阵中的(3x1)平移部分。
2.只给出位置信息的测试结果
- 1.因为
cv::calibrateHandEye
函数需要R_gripper2base和R_target2cam,考虑到只有机械臂的位置信息,最终需要求得的也是t_cam2gripper
,那就默认旋转矩阵都是单位矩阵,即没有姿态偏差,欧拉角都是0(rx,ry,ry都是0)。 - 2.结果输入实际得到的
R_cam2gripper
和t_cam2gripper
如下:
3.问题原因排查
主要与手眼标定的原理和算法的数学特性有关,下面详细分析其原因:
-
手眼标定的原理:
-
1. 缺乏运动信息
-
2. 方程求解的奇异性
矩阵的奇异性通常是指矩阵不可逆的性质,也就是说矩阵没有逆矩阵。
奇异矩阵是行列式为零的矩阵,即不可逆矩阵。
奇异矩阵不能用于求解唯一解的线性方程组,会导致数值不稳定性。
-
3. 平移部分的影响
对于平移部分,由于旋转部分无法正确求解,导致整个变换矩阵的求解缺乏有效的约束。在没有足够旋转信息的情况下,算法无法准确地确定相机和夹爪之间的相对平移关系,因此通常会将平移部分的解置为 0。 -
总结
手眼标定需要机械臂的不同姿态来提供足够的运动信息,以确保方程有唯一解,当R_gripper2base
全为单位矩阵时,缺乏旋转运动信息,导致方程求解出现奇异性,无法得到有效的旋转和平移变换矩阵,最终得到R_cam2gripper
为nan,t_cam2gripper
为 0 的结果。为了得到准确的手眼标定结果,需要确保机械臂有足够的不同姿态变化。
根据上面总结可知如果通过OpenCV的
cv::calibrateHandEye
函数进行求解,需要机械臂的不同姿态来提供足够的运动信息,以确保方程有唯一解。
那对于只有位置信息的机械臂,还有别的方法标定相机和机械臂的位置关系吗?
如有大佬知道请指导解答。