利用OpenCV进行3d相机手眼标定(眼在手上/眼在手外)

文章目录

0.函数原型

本文提到的3d相机,指的是RGBD相机,因为必须需要用RGB来拍摄标定板(目前我们使用RGBD相机来测试)。3d线扫相机可能得用其他方式,也有可能用这个,因为这个函数需要你传入的是变换矩阵,RGBD相机和线扫相机得各自采用自己的方式得到变换矩阵。

在opencv中有一个函数,calibrateHandEye,他是用来进行眼在手上(相机在机械臂上)的标定。

cpp 复制代码
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 );

其中各个形参的意义为:

注意,前面四个参数都是InputArrayOfArrays的形式,这是因为我们要传入机械在多组姿态数据(而姿态数据本身又是一个矩阵、arrays),所以这个就是一个array of arrays的形式。

参数 意义
R_gripper2base 机械臂末端法兰(初始工具)坐标系到机械臂基坐标系的旋转变换
t_gripper2base 机械臂末端法兰(初始工具)坐标系到机械臂基坐标系的平移变换
R_target2cam 标定板坐标系到相机坐标系的旋转变换
t_target2cam 标定板坐标系到相机坐标系的平移变换
R_cam2gripper 得到的相机坐标系到法兰(初始工具)坐标系的旋转变换
t_cam2gripper 得到的相机坐标系到法兰(初始工具)坐标系的平移变换
CALIB_HAND_EYE_TSAI 求解AXXB的算法

opncv官方提供这个函数的本意是只支持眼在手上这种方式的标定,但是,其实我们只要稍微修改一下输入的矩阵,就可以实现眼在手外的标定。

推导过程如下:

1.眼在手上

因为眼在手上时,相机到法兰的坐标(图中的B)变换是固定的,也是我们要求解的,因此我们让X就为相机到法兰的变换矩阵,也就是

X = g T c X = ^gT{_c} X=gTc

那么机械臂在两个不同的姿态 ij 下,存在这么一个等式(calibrateHandEye就是按照这个等式来求解的)

b T g i X c T t i = b T g j X c T t j ^bT_{g_i} X ^cT_{t_i} = ^bT_{g_j} X ^cT_{t_j} bTgiXcTti=bTgjXcTtj

代入X后也就是

b T g i g i T c c T t i = b T g j g j T c c T t j ^bT_{g_i} ^{g_i}T{c} ^cT{t_i} = ^bT_{g_j} ^{g_j}T{c} ^cT{t_j} bTgigiTccTti=bTgjgjTccTtj

也就是物理链是这样的 标定板--》相机--》法兰--》到基座,也就是标定板到基座的变换。这是一个固定值,这个值我们不用求,他只是用来构建等式,我们真正要求的是X。上面的X求出来后,我们在使用时,也就是将3d相机得到的点云P(此时是相机坐标系下的)经过变换矩阵变换到机械臂的基坐标系下,也就是

P b = b T g g T c P c P_{b} = ^bT_{g} ^gT_{c} P_{c} Pb=bTggTcPc

其中 b T g ^bT_{g} bTg是可以实时从机械臂中读取的

2.眼在手外

我们让X为相机到基坐标的变换,也就是

X = b T c X = ^bT{_c} X=bTc

然后将原本形参中的gripper2base改成 base2gripper, 代入calibrateHandEye中的求解等式,就可以得到这么一条等式

g i T b X c T t i = g j T b X c T t j ^{g_i}T_{b} X ^cT_{t_i} = ^{g_j}T_{b} X ^cT_{t_j} giTbXcTti=gjTbXcTtj

把X代入,可以等到

g i T b b T c c T t i = g j T b b T c c T t j ^{g_i}T_{b} ^bT{c} ^cT{t_i} = ^{g_j}T_{b} ^bT{c} ^cT{t_j} giTbbTccTti=gjTbbTccTtj

标定板--》相机--》基座--》法兰,也就是标定板到法兰的变换,因为标定板是固定在法兰上的,显然这个是个定值,也就是说上述等式是成立的。

完美,只需要将 gripper2base求个逆,就可以利用calibrateHandEye实现眼在手外的标定。


参考:

【3D 视觉之手眼标定】

相关推荐
欧特克_Glodon5 小时前
OpenCV计算机视觉开发入门与实践<十四>:基础几何图形绘制
人工智能·opencv·计算机视觉
欧特克_Glodon5 小时前
OpenCV计算机视觉开发入门与实践<十六>:图像边框和图像轮廓
c++·人工智能·opencv·计算机视觉
kolyle18 小时前
Hi3D V3.0 2048³精度+48小时免费体验:3D生成模型的工程拐点与企业落地
3d·3d生成·企业ai·多模态ai·多模型路由·hi3d v3.0·极智词元
W_326001 天前
Python-OpenCV 轮廓进阶:旋转最小外接矩形、图像矩求质心、嵌套层级 hierarchy、轮廓形状匹配
图像处理·python·opencv·机器学习·计算机视觉
牧羊人.3331 天前
计算机视觉基础 第 9 章|实战:银行卡号识别
图像处理·人工智能·opencv·计算机视觉·图搜索算法
欧特克_Glodon1 天前
OpenCV计算机视觉开发入门与实践<十三>:图像转换之灰度图、二值图
c++·人工智能·opencv·计算机视觉
AndrewHZ1 天前
图像处理入门010 | Pillow 与 OpenCV 对比:双库图像读写实战
图像处理·opencv·计算机视觉·pillow
欧特克_Glodon1 天前
OpenCV计算机视觉开发入门与实践<十二>:XML 和 YAML 文件读写
xml·c++·opencv·计算机视觉
杀生丸学AI1 天前
【三维重建】QuerySplat:在 3DGS 预测中解耦几何与外观表征
人工智能·3d·三维重建·扩散模型·高斯泼溅·空间智能·室内重建
杀生丸学AI2 天前
【世界模型】Lyra 2.0:可探索的生成式3D世界(NVIDIA)
人工智能·深度学习·3d·数据挖掘·transformer·世界模型·高斯泼溅