ros的手眼标定精度不高
·
推测是ARmark包的识别有一定问题,所以将这一步替换成用matlab标定工具获取相机和标定板的RT,然后用opencv函数来求解。
matlabR2010b部分:
第一步Camera cailbrator app(注意版本,matllab手眼标定矩阵格式app有更新):

第二步app标定,傻瓜操作参看:
手把手教会你双目摄像头Matlab参数定标_python_脚本之家
并注意返回矩阵到底是相机到靶标还是靶标到相机,我们需要用到的是((上标)靶标R相机(下标))如果相反需要求逆。

这里的返回矩阵R需要求逆
第三步,调用opencv的API进行求解(为啥不用opencv进行外参解算呢,因为不好用)
opencv 求解部分:
R_all_end_to_base_1=[],R_all_chess_to_cam_1=[]建议12组以上。
import cv2
import numpy as np
import glob
from math import *
import pandas as pd
import os
import scipy.io as sio
from scipy.io import loadmat
from scipy.spatial.transform import Rotation as R
import pandas as pd
from scipy.io import savemat
R_Q = np.zeros([15,4])
R_matrix = np.zeros([15,3,3])
T_all_end_to_base_1 = np.zeros([15,3])
'''末端到基座,ros记录'''
ur5_data =pd.read_excel('UR5_25MM.xlsx')
R_Q[:,0:3] = ur5_data.values[:,1:4]
R_Q[:,3] = ur5_data.values[:,0]
for i in range(0,15):
R_matrix[i,:,:]=R.from_quat(R_Q[i,:]).as_matrix()
T_all_end_to_base_1 = ur5_data.values[:,4:7]
# savemat('R_matrix.mat', {'R_matrix':R_matrix.reshape(15,-1)})
# savemat('T_all_end_to_base_1.mat', {'T_all_end_to_base_1':T_all_end_to_base_1.reshape(15,-1)})
'''相机到靶标,matlab导出'''
mat_R = loadmat('calibar_R.mat')
mat_T = loadmat('calibar_T.mat')
# RT=np.column_stack((mat_R['RotationMatrices_save'],mat_T['RotationTranslationVectors_save']))
# RT = np.row_stack((RT, np.array([0, 0, 0, 1])))#即为cam to end变换矩阵
"手末端到base的R,动捕下:相机上把标点相对于动捕世界坐标系的R"
R_all_end_to_base_1=R_matrix
"手末端到base的T,动捕下:相机上把标点相对于动捕世界坐标系的T"
T_all_end_to_base_1=T_all_end_to_base_1
"相机与标定板的R"
R_all_chess_to_cam_1=mat_R['RotationMatrices_save'].reshape(15,3,3).transpose(0,2,1)
"相机与标定板的T"
T_all_chess_to_cam_1=mat_T['RotationTranslationVectors_save']/1000
"""
手眼标定
"""
k=14#使用图的数量
R_,T=cv2.calibrateHandEye(R_all_end_to_base_1[:k,:,:],T_all_end_to_base_1[:k,:],R_all_chess_to_cam_1[:k,:,:],T_all_chess_to_cam_1[:k,:])#手眼标定
RT=np.column_stack((R_,T))
RT = np.row_stack((RT, np.array([0, 0, 0, 1])))#即为cam to end变换矩阵
print('相机相对于末端的变换矩阵为:')
print(RT)
#---------------标定结束---------------------#
'''d435模型urdf坐标变换'''
RT_c = R.from_euler('xyz',[1.5707963267948966,-1.5707963267948966,0]).as_matrix()
print(R.from_matrix(RT_c@R_).as_euler('xyz'))
效果图:

数据和源码打包:
更多推荐
所有评论(0)