- 机械臂标定原理
- 眼在手上
- 使用opencv进行手眼标定
**
眼在手上
推导过程如下:
可推出如下公式:
c
a
m
t
o
o
l
H
=
b
a
s
e
t
o
o
l
H
∗
c
a
l
b
a
s
e
H
∗
c
a
m
c
a
l
H
^{tool}_{cam}H = ^{tool}_{base}H * ^{base}_{cal}H * ^{cal}_{cam}H
camtoolH=basetoolH∗calbaseH∗camcalH
其中:
c
a
m
t
o
o
l
H
^{tool}_{cam}H
camtoolH为从机械臂末端到相机坐标系的变换矩阵(个人习惯这么说),实际代表相机坐标系在机械臂末端坐标系下的位姿。
b
a
s
e
t
o
o
l
H
^{tool}_{base}H
basetoolH为从机械臂末端到机械臂基坐标系的变换矩阵。
c
a
l
b
a
s
e
H
^{base}_{cal}H
calbaseH为从机械臂基坐标系到标定板坐标系的变换矩阵。
c
a
m
c
a
l
H
^{cal}_{cam}H
camcalH为从标定板坐标系到相机坐标系的变换矩阵。
在进行眼在手上的标定过程中,需要保持 c a l b a s e H ^{base}_{cal}H calbaseH的变换相对不变,也就是说机械臂的基坐标系和标定板保持不变,当然这是因为该值我们无法直接准确的测量,因此保持其每次相机采集时相对不变,用于方程式求解过程中将其消除。
该部分推导如下:
c
a
l
b
a
s
e
H
=
t
o
o
l
b
a
s
e
H
∗
c
a
m
t
o
o
l
H
∗
c
a
l
c
a
m
H
^{base}_{cal}H = _{tool}^{base}H * ^{tool}_{cam}H * ^{cam}_{cal}H
calbaseH=toolbaseH∗camtoolH∗calcamH
此时根据采集的多次机械臂位姿进行求解,其中
t
o
o
l
b
a
s
e
H
_{tool}^{base}H
toolbaseH通过直接读取机械臂相对于基坐标系位姿得到,
c
a
m
t
o
o
l
H
^{tool}_{cam}H
camtoolH为手眼标定的待求解,
c
a
l
c
a
m
H
^{cam}_{cal}H
calcamH为标定板坐标系相对于相机坐标系的位姿。
采用相邻的两次数据采集的结果进行求解,
c
a
l
b
a
s
e
H
^{base}_{cal}H
calbaseH不变:
t
o
o
l
b
a
s
e
H
0
∗
c
a
m
t
o
o
l
H
0
∗
c
a
l
c
a
m
H
0
=
t
o
o
l
b
a
s
e
H
1
∗
c
a
m
t
o
o
l
H
1
∗
c
a
l
c
a
m
H
1
_{tool}^{base}H^0 * ^{tool}_{cam}H^0 * ^{cam}_{cal}H^0=_{tool}^{base}H^1 * ^{tool}_{cam}H^1 * ^{cam}_{cal}H^1
toolbaseH0∗camtoolH0∗calcamH0=toolbaseH1∗camtoolH1∗calcamH1
由于
c
a
m
t
o
o
l
H
^{tool}_{cam}H
camtoolH保持不变,因此
t
o
o
l
b
a
s
e
H
0
∗
c
a
m
t
o
o
l
H
∗
c
a
l
c
a
m
H
0
=
t
o
o
l
b
a
s
e
H
1
∗
c
a
m
t
o
o
l
H
∗
c
a
l
c
a
m
H
1
_{tool}^{base}H^0 * ^{tool}_{cam}H * ^{cam}_{cal}H^0=_{tool}^{base}H^1 * ^{tool}_{cam}H * ^{cam}_{cal}H^1
toolbaseH0∗camtoolH∗calcamH0=toolbaseH1∗camtoolH∗calcamH1
进行化简:
(
t
o
o
l
b
a
s
e
H
1
)
−
1
∗
t
o
o
l
b
a
s
e
H
0
∗
c
a
m
t
o
o
l
H
=
c
a
m
t
o
o
l
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 * ^{tool}_{cam}H = ^{tool}_{cam}H *_{cal}^{cam}H^1 *(^{cam}_{cal}H^0)^{-1}
(toolbaseH1)−1∗toolbaseH0∗camtoolH=camtoolH∗calcamH1∗(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:从末端坐标系到相机坐标系的平移向量
注意:本文中的坐标系描述语言和其他描述存在出入,具体参照上述内容进行理解,如本人描述有误请提醒改正,共勉。



