推测是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'))

效果图:

数据和源码打包:

https://download.csdn.net/download/qq_41673009/89511206

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐