Files
AutoControlSystem-git/Trace/handeye_calibration
2024-09-03 02:22:01 +00:00

97 lines
2.9 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import numpy as np
rotation = R_matrix()#张啸给我的值填这里
def flip_coefficient_if_positive(coefficient):
# 检查 coefficient[2] 是否大于0
if coefficient[2] > 0:
# 取反所有分量
coefficient = [-x for x in coefficient]
print("翻转:\n")
return coefficient
def vec2ola(coefficient):#首先是相机到法兰的转换之后是法兰到新坐标系的转换新坐标系就是与Z轴与法向量一致的坐标系)
#如果不转换坐标轴,
coefficient_raw = flip_coefficient_if_positive(coefficient)
coefficient = coefficient_raw.reshape(-1)
curZ = np.array(coefficient)# 定义 Z 方向的向量
# print(curZ)
curX = np.array([1, 1, 0],dtype=np.float64)# 定义初始 X 方向的向量
curX /= np.linalg.norm(curX) # 归一化 X 向量
curY = np.cross(curZ, curX)# 计算 Y 方向的向量
curY /= np.linalg.norm(curY) # 归一化 Y 向量
curX = np.cross(curY, curZ)# 重新计算 X 方向的向量
curX /= np.linalg.norm(curX) # 归一化 X 向量
# 创建旋转矩阵
rotM = np.array([
[curX[0], curY[0], curZ[0]],
[curX[1], curY[1], curZ[1]],
[curX[2], curY[2], curZ[2]]
])
# 打印旋转矩阵
# print("Rotation Matrix:")
# print(rotM)
# 计算欧拉角XYZ顺序并转换为度
r = R.from_matrix(rotM)
euler_angles = r.as_euler('xyz', degrees=True)#或者是zxy
# print("Euler Angles (degrees):")
# print(euler_angles)
return euler_angles
#张啸给我的xyzuvw
def R_matrix(x,y,z,u,v,w):
rx = np.radians(u)
ry = np.radians(v)
rz = np.radians(w)
# 定义绕 X, Y, Z 轴的旋转矩阵
R_x = np.array([
[1, 0, 0],
[0, np.cos(rx), -np.sin(rx)],
[0, np.sin(rx), np.cos(rx)]
])
R_y = np.array([
[np.cos(ry), 0, np.sin(ry)],
[0, 1, 0],
[-np.sin(ry), 0, np.cos(ry)]
])
R_z = np.array([
[np.cos(rz), -np.sin(rz), 0],
[np.sin(rz), np.cos(rz), 0],
[0, 0, 1]
])
R = R_z @ R_y @ R_x
T = np.array([x, y, z])
# 构建齐次变换矩阵
transformation_matrix = np.eye(4)
transformation_matrix[:3, :3] = R
transformation_matrix[:3, 3] = T
return transformation_matrix
# 黄老师给我的xyz和法向量
def getPosition(x,y,z,a,b,c):
target = np.asarray([x, y, z,1])
camera2robot = np.loadtxt('D:\BaiduNetdiskDownload\机械臂\GRCNN\\real\cam_pose.txt', delimiter=' ')
robot2base = rotation
camera2base = robot2base @ camera2robot
target_position = np.dot(camera2base, target)
rpy = vec2ola(a, b, c)
r, p, y = rpy[0], rpy[1], rpy[2] # r表示u,p表示vy表示w
target_angle_raw = np.asarray([r, p, y])
target_angle = np.dot(camera2robot[0:3, 0:3], target_angle_raw)
print(target_position, target_angle)
return target_position,target_angle