我是靠谱客的博主 机智舞蹈,最近开发中收集的这篇文章主要介绍相机机械臂手眼标定-眼在手外(二),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

相机机械臂手眼标定-眼在手外(二)

    • 眼在手外标定原理

眼在手外标定原理

在这里插入图片描述
公式推导如下
可推出如下公式: c a m b a s e H = t o o l b a s e H ∗ c a l t o o l H ∗ c a m c a l H ^{base}_{cam}H = ^{base}_{tool}H * ^{tool}_{cal}H * ^{cal}_{cam}H cambaseH=toolbaseHcaltoolHcamcalH
其中:
c a m b a s e H ^{base}_{cam}H cambaseH:从机械臂基座标系到相机坐标系的变换矩阵(个人习惯这么说),实际代表相机坐标系在机械臂基坐标系下的位姿。
t o o l b a s e H ^{base}_{tool}H toolbaseH: 从机械臂基坐标系到机械臂末端坐标系的变换矩阵。
c a l t o o l H ^{tool}_{cal}H caltoolH: 从机械臂末端坐标系到标定板坐标系的变换矩阵。
c a m c a l H ^{cal}_{cam}H camcalH: 从标定板坐标系到相机坐标系的变换矩阵。

在进行眼在手外的标定过程中,需要保持 c a l t o o l H ^{tool}_{cal}H caltoolH 的变换相对不变,也就是说机械臂的末端坐标系和标定板保持不变,当然这是因为该值我们无法直接准确的测量,因此保持其每次相机采集时相对不变,用于方程式求解过程中将其消除。(在标定过程中,标定板固定在机械臂末端)

进一步公式推导:
c a l t o o l H = b a s e t o o l H ∗ c a m b a s e H ∗ c a l c a m H ^{tool}_{cal}H = ^{tool}_{base}H * ^{base}_{cam}H * ^{cam}_{cal}H caltoolH=basetoolHcambaseHcalcamH

此时根据采集的多次机械臂位姿进行求解
其中 $ _{base}^{tool}H$ 通过读取机械臂相对于基坐标系位姿,然后在进行矩阵求逆得到
c a m b a s e H ^{base}_{cam}H cambaseH 为手眼标定的待求解。
c a l c a m H ^{cam}_{cal}H calcamH 为标定板坐标系相对于相机坐标系的位姿。通过opencv获得。
采用相邻的两次数据采集的结果进行求解
其中 c a l t o o l H ^{tool}_{cal}H caltoolH 保持不变不变:
b a s e t o o l H 0 ∗ c a m b a s e H 0 ∗ c a l c a m H 0 = b a s e t o o l H 1 ∗ c a m b a s e H 1 ∗ c a l c a m H 1 ^{tool}_{base}H^0 * ^{base}_{cam}H^0 * ^{cam}_{cal}H^0=^{tool}_{base}H^1 * ^{base}_{cam}H^1 * ^{cam}_{cal}H^1 basetoolH0cambaseH0calcamH0=basetoolH1cambaseH1calcamH1
由于 c a m b a s e H ^{base}_{cam}H cambaseH保持不变,因此
b a s e t o o l H 0 ∗ c a m b a s e H ∗ c a l c a m H 0 = b a s e t o o l H 1 ∗ c a m b a s e H ∗ c a l c a m H 1 ^{tool}_{base}H^0 * ^{base}_{cam}H * ^{cam}_{cal}H^0=^{tool}_{base}H^1 * ^{base}_{cam}H * ^{cam}_{cal}H^1 basetoolH0cambaseHcalcamH0=basetoolH1cambaseHcalcamH1

进行化简:
( b a s e t o o l H 1 ) − 1 ∗ b a s e t o o l H 0 ∗ c a m b a s e H = c a m b a s e H ∗ c a l c a m H 1 ∗ ( c a l c a m H 0 ) − 1 (_{base}^{tool}H^1)^{-1}*^{tool}_{base}H^0 * ^{base}_{cam}H = ^{base}_{cam}H *_{cal}^{cam}H^1 *(^{cam}_{cal}H^0)^{-1} (basetoolH1)1basetoolH0cambaseH=cambaseHcalcamH1(calcamH0)1

转换为AX = XB的形式,求解出X即可

在计算 c a l c a m H _{cal}^{cam}H calcamH 时,使用api

void solvePnP(InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec, bool useExtrinsicGuess=false, int flags = CV_ITERATIVE)

objectPoints - 世界坐标系下的棋盘点的坐标(这里世界坐标系与棋盘坐标系的原点重合)
imagePoints - 在图像坐标系下对应的像素点的坐标
cameraMatrix - 相机的内参矩阵
distCoeffs - 相机的畸变系数
以上两个参数通过相机标定可以得到。相机的内参数的标定参见:

rvec - 输出的旋转向量。从相机坐标系到棋盘坐标系的旋转矩阵
tvec - 输出的平移向量。从相机坐标系到棋盘坐标系的平移向量
flags - 默认使用CV_ITERATIV迭代法

通过将rvec和tvec转换为变换矩阵,便可以算出 c a l c a m H _{cal}^{cam}H calcamH

求解最终的X,也就是 c a m t o o l H ^{tool}_{cam}H camtoolH 时使用api

void
cv::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:从机械臂末端坐标系到机械臂基坐标系的旋转矩阵
t_gripper2base:从机械臂末端坐标系到机械臂基坐标系的平移向量
R_target2cam: 从相机坐标系到标定板棋盘格坐标系的旋转矩阵
t_target2cam: 从相机坐标系到标定板棋盘格坐标系的平移向量
R_cam2gripper:从机械臂基坐标系到相机坐标系的旋转矩阵
t_cam2gripper:从机械臂基坐标系到相机坐标系的平移向量

注意:本文中的坐标系描述语言和其他描述存在出入,具体参照上述内容进行理解,如本人描述有误请提醒改正,共勉。

最后

以上就是机智舞蹈为你收集整理的相机机械臂手眼标定-眼在手外(二)的全部内容,希望文章能够帮你解决相机机械臂手眼标定-眼在手外(二)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部