【MachineVision】Hand-Eye-Calibration

1. 眼在手上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f3x0NGxY-1627030706044)(机器人手眼标定.assets/image-20210722104049527.png)]

标定过程

标定板放置在固定位置,机器人变换不同的姿态,相机获取不同姿态下标定板图像
目标
上图中描述了闭环的坐标系空间关系,包含以下部分:

  • b a s e H t o o l ^{base}H_{tool} baseHtool​​​​​ 机器人末端的工具坐标系到机器人基坐标系的变换矩阵​。
    可变量
  • c a m H t o o l ^{cam}H_{tool} camHtool 机器人末端的工具坐标系相机坐标系的变换矩阵。
    不变量
  • c a m H c a l ^{cam}H_{cal} camHcal​​​​​ 标定板坐标系相机坐标系的变换矩阵。
    可变量
  • b a s e H c a l ^{base}H_{cal} baseHcal​​ 标定板坐标系到机器人基坐标系的变换矩阵。
    不变量

闭环关系
t o o l H c a m = t o o l H b a s e ∗ b a s e H c a l ∗ c a l H c a m \large \begin{aligned} ^{tool}H_{cam} = ^{tool}H_{base} * ^{base}H_{cal} * ^{cal}H_{cam} \end{aligned} toolHcam=toolHbasebaseHcalcalHcam

机器人每移动一个位姿,就能得到一个上述的闭环关系,又由于 b a s e H c a l ^{base}H_{cal} baseHcal​是不变量,可在多个姿态下得到的关系中任选两个将其消除。这里选择相邻的两次。
b a s e H c a l = t o o l H b a s e − 1 ∗ t o o l H c a m ∗ c a l H c a m − 1 = b a s e H t o o l ∗ t o o l H c a m ∗ c a m H c a l \large \begin{aligned} ^{base}H_{cal} &= ^{tool}H_{base}^{-1} * ^{tool}H_{cam} * ^{cal}H_{cam}^{-1}\\ &= ^{base}H_{tool}* ^{tool}H_{cam} * ^{cam}H_{cal} \end{aligned} baseHcal=toolHbase1toolHcamcalHcam1=baseHtooltoolHcamcamHcal
相邻两次对 b a s e H c a l ^{base}H_{cal} baseHcal​进行消除:
b a s e H t o o l 0 ∗ t o o l H c a m 0 ∗ c a m H c a l 0 = b a s e H t o o l 1 ∗ t o o l H c a m 1 ∗ c a m H c a l 1 \large ^{base}H_{tool}^0* {\color{Red}^{tool}H_{cam}^0} * ^{cam}H_{cal}^0 = ^{base}H_{tool}^1* {\color{Red}^{tool}H_{cam}^1} * ^{cam}H_{cal}^1 baseHtool0toolHcam0camHcal0=baseHtool1toolHcam1camHcal1
由于 t o o l H c a m ^{tool}H_{cam} toolHcam​​是不变的
t o o l H c a m 0 = t o o l H c a m 1 = t o o l H c a m \large ^{tool}H_{cam}^0 =^{tool}H_{cam}^1=^{tool}H_{cam} toolHcam0=toolHcam1=toolHcam

b a s e H t o o l 0 ∗ t o o l H c a m ∗ c a m H c a l 0 = b a s e H t o o l 1 ∗ t o o l H c a m ∗ c a m H c a l 1 \large ^{base}H_{tool}^0* {\color{Red}^{tool}H_{cam}} * ^{cam}H_{cal}^0 = ^{base}H_{tool}^1* {\color{Red}^{tool}H_{cam}} * ^{cam}H_{cal}^1 baseHtool0toolHcamcamHcal0=baseHtool1toolHcamcamHcal1

等式两边分别左乘 b a s e H t o o l 1 − 1 {^{base}H_{tool}^1}^{-1} baseHtool11与右乘 c a m H c a l 0 − 1 {^{cam}H_{cal}^0}^{-1} camHcal01
b a s e H t o o l 1 − 1 ∗ b a s e H t o o l 0 ∗ t o o l H c a m = t o o l H c a m ∗ c a m H c a l 1 ∗ c a m H c a l 0 − 1 \large {^{base}H_{tool}^1}^{-1} * ^{base}H_{tool}^0* {\color{Red}^{tool}H_{cam}} = {\color{Red}^{tool}H_{cam}} * ^{cam}H_{cal}^1 * {^{cam}H_{cal}^0}^{-1} baseHtool11baseHtool0toolHcam=toolHcamcamHcal1camHcal01
转换成
A X = X B \large AX=XB AX=XB
其中:
A = b a s e H t o o l 1 − 1 ∗ b a s e H t o o l 0 B = c a m H c a l 1 ∗ c a m H c a l 0 − 1 X = t o o l H c a m \large \begin{aligned} A&={^{base}H_{tool}^1}^{-1} * ^{base}H_{tool}^0\\ B&=^{cam}H_{cal}^1 * {^{cam}H_{cal}^0}^{-1}\\ X&=^{tool}H_{cam} \end{aligned} ABX=baseHtool11baseHtool0=camHcal1camHcal01=toolHcam

2. 眼在手外

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVTOoPLu-1627030706046)(机器人手眼标定.assets/image-20210722113841958.png)]

标定过程

相机安装在机械手外的固定位置标定板安装在机器人末端位置,标定过程中机器人变换不同的位姿,相机分别拍摄在不同位姿下的标定板图像
目标
在下图中描述了闭环的坐标系空间关系,包含以下部分:

  • b a s e H t o o l ^{base}H_{tool} baseHtool​​​​​​ 机器人末端的工具坐标系到机器人基坐标系的变换矩阵​。
    可变量
  • t o o l H c a l ^{tool}H_{cal} toolHcal​​ 标定板坐标系到机器人末端的工具坐标系的变换矩阵。
    不变量
  • c a l H c a m ^{cal}H_{cam} calHcam​​​​​​​​ 相机坐标系到标定板坐标系的变换矩阵。
    可变量
  • c a m H b a s e ^{cam}H_{base} camHbase​​​​​​​​ 机器人基坐标系到相机坐标系的变换矩阵。
    不变量

闭环关系
b a s e H c a m = b a s e H t o o l ∗ t o o l H c a l ∗ c a l H c a m \large ^{base}H_{cam} = ^{base}H_{tool} * ^{tool}H_{cal} * ^{cal}H_{cam} baseHcam=baseHtooltoolHcalcalHcam

由于$ ^{tool}H_{cal}$是不变量,可通过前后两次姿态的结果对其进行消除。
t o o l H c a l = b a s e H t o o l − 1 ∗ b a s e H c a m ∗ c a l H c a m − 1 \large ^{tool}H_{cal} = ^{base}H_{tool}^{-1} * ^{base}H_{cam} * ^{cal}H_{cam}^{-1} toolHcal=baseHtool1baseHcamcalHcam1
等价于
t o o l H c a l = t o o l H b a s e ∗ b a s e H c a m ∗ c a m H c a l \large ^{tool}H_{cal} = ^{tool}H_{base} * ^{base}H_{cam} * ^{cam}H_{cal} toolHcal=toolHbasebaseHcamcamHcal
相邻两次消除 t o o l H c a l ^{tool}H_{cal} toolHcal
t o o l H b a s e 0 ∗ b a s e H c a m 0 ∗ c a m H c a l 0 = t o o l H b a s e 1 ∗ b a s e H c a m 1 ∗ c a m H c a l 1 \large ^{tool}H_{base}^0 * {\color{red}^{base}H_{cam}^0} * ^{cam}H_{cal}^0 = ^{tool}H_{base}^1 * {\color{red}^{base}H_{cam}^1} * ^{cam}H_{cal}^1 toolHbase0baseHcam0camHcal0=toolHbase1baseHcam1camHcal1

等价于
t o o l H b a s e 0 ∗ b a s e H c a m ∗ c a m H c a l 0 = t o o l H b a s e 1 ∗ b a s e H c a m ∗ c a m H c a l 1 \large ^{tool}H_{base}^0 * {\color{red}^{base}H_{cam}} * ^{cam}H_{cal}^0 = ^{tool}H_{base}^1 * {\color{red}^{base}H_{cam}} * ^{cam}H_{cal}^1 toolHbase0baseHcamcamHcal0=toolHbase1baseHcamcamHcal1
等价于
t o o l H b a s e 1 − 1 ∗ t o o l H b a s e 0 ∗ b a s e H c a m = b a s e H c a m ∗ c a m H c a l 1 ∗ c a m H c a l 0 − 1 \large {^{tool}H_{base}^1}^{-1} * ^{tool}H_{base}^0 * {\color{red}^{base}H_{cam}} = {\color{red}^{base}H_{cam}} * ^{cam}H_{cal}^1 * {^{cam}H_{cal}^0}^{-1} toolHbase11toolHbase0baseHcam=baseHcamcamHcal1camHcal01
等价于
A X = X B \large AX = XB AX=XB
其中
A = t o o l H b a s e 1 − 1 ∗ t o o l H b a s e 0 B = c a m H c a l 1 ∗ c a m H c a l 0 − 1 X = b a s e H c a m \large \begin{aligned} A&={^{tool}H_{base}^1}^{-1} * ^{tool}H_{base}^0\\ B&=^{cam}H_{cal}^1 * {^{cam}H_{cal}^0}^{-1}\\ X&=^{base}H_{cam} \end{aligned} ABX=toolHbase11toolHbase0=camHcal1camHcal01=baseHcam

3. OpenCV

根据以上分析,无论是眼在手上还是眼在手外,都最终转换成对方程AX=BX的求解。OpenCV提供了手眼标定求解的算子calibrateHandEye

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)	
  • 眼在手上

    这种情况下,算子参数名称的描述与真实输入相对应。

    void
    cv::calibrateHandEye(InputArrayOfArrays 	R_gripper2base, // <=> R_tool2base
                         InputArrayOfArrays 	t_gripper2base, // <=> T_tool2base
                         InputArrayOfArrays 	R_target2cam,	// <=> R_cal2cam
                         InputArrayOfArrays 	t_target2cam,	// <=> T_cam2cam
                         OutputArray 	        R_cam2gripper,	// <=> R_cam2tool
                         OutputArray 	        t_cam2gripper, 	// <=> T_cam2tool
                         HandEyeCalibrationMethod method = CALIB_HAND_EYE_TSAI)	
    

b a s e H t o o l 1 − 1 ∗ b a s e H t o o l 0 ∗ t o o l H c a m = t o o l H c a m ∗ c a m H c a l 1 ∗ c a m H c a l 0 − 1 \large {^{base}H_{tool}^1}^{-1} * ^{base}H_{tool}^0* {\color{Red}^{tool}H_{cam}} = {\color{Red}^{tool}H_{cam}} * ^{cam}H_{cal}^1 * {^{cam}H_{cal}^0}^{-1} baseHtool11baseHtool0toolHcam=toolHcamcamHcal1camHcal01

  • 眼在手外

    这种情况下,算子参数名称的描述与真实输入有所不同

    void
    cv::calibrateHandEye(InputArrayOfArrays 	R_gripper2base,	// <=> R_base2tool
                         InputArrayOfArrays 	t_gripper2base,	// <=> T_base2tool
                         InputArrayOfArrays 	R_target2cam,	// <=> R_cal2cam
                         InputArrayOfArrays 	t_target2cam,	// <=> T_cam2cam
                         OutputArray 	        R_cam2gripper,	// <=> R_cam2base
                         OutputArray 	        t_cam2gripper,	// <=> T_cam2base
                         HandEyeCalibrationMethod method = CALIB_HAND_EYE_TSAI)	
    

t o o l H b a s e 1 − 1 ∗ t o o l H b a s e 0 ∗ b a s e H c a m = b a s e H c a m ∗ c a m H c a l 1 ∗ c a m H c a l 0 − 1 \large {^{tool}H_{base}^1}^{-1} * ^{tool}H_{base}^0 * {\color{red}^{base}H_{cam}} = {\color{red}^{base}H_{cam}} * ^{cam}H_{cal}^1 * {^{cam}H_{cal}^0}^{-1} toolHbase11toolHbase0baseHcam=baseHcamcamHcal1camHcal01

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
在OpenCV中,眼在手外手眼标定是一种通过求解方程AX=BX来确定手眼关系的方法。其中,A是机械臂末端到基点的变换矩阵,可以通过示教器或者在ROS直接订阅相关tf获取;B是标定板到相机的变换矩阵,可以使用pnp算法求解得到。OpenCV提供了一个名为calibrateHandEye的算子来实现手眼标定。该算子的输入参数包括R_gripper2base和t_gripper2base,表示机械臂末端到基点的多个旋转矩阵和平移向量;R_target2cam和t_target2cam,表示标定板到相机的多个旋转矩阵和平移向量。算子的输出参数包括R_cam2gripper和t_cam2gripper,分别代表相机到机械臂末端的旋转矩阵和平移向量。使用该算子可以得到眼在手外的手眼标定结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [3D视觉工坊-手眼标定(附opencv实现代码)](https://blog.csdn.net/z504727099/article/details/115494147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [【MachineVisionHand-Eye-Calibration](https://blog.csdn.net/zhy29563/article/details/119039831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhy29563

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值