Files
AutoControlSystem-git/Trace/handeye_calibration.py
2024-09-18 18:36:04 +08:00

78 lines
2.4 KiB
Python
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
from scipy.spatial.transform import Rotation as R
def vec2rpy(normal,long_edge_direction):
# 将法向量的反方向作为机械臂末端执行器的新Z轴
z_axis = -normal / np.linalg.norm(normal) # 归一化并取反向作为Z轴
x_axis = long_edge_direction/np.linalg.norm(long_edge_direction)
x_axis = x_axis-np.dot(x_axis,z_axis)*z_axis
x_axis = x_axis/np.linalg.norm(x_axis)
y_axis = np.cross(z_axis,x_axis)
# 构造旋转矩阵
rotation_matrix = np.vstack([x_axis, y_axis, z_axis]).T
# 将旋转矩阵转换为RPYroll, pitch, yaw
rpy = R.from_matrix(rotation_matrix).as_euler('xyz', degrees=True)
return rpy
#张啸给我的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,rotation,points):
target = np.asarray([x, y, z,1])
camera2robot = np.loadtxt('./Trace/com_pose.txt', delimiter=' ') #相对目录且分隔符采用os.sep
robot2base = rotation
camera2base = robot2base @ camera2robot
target_position = np.dot(camera2base, target)
corner_points_camera = np.asarray(points)
corner_points_base = np.dot(camera2base[:3, :3], corner_points_camera.T).T + camera2base[:3, 3]
edges = np.array([corner_points_base[i] - corner_points_base[i - 1] for i in range(len(corner_points_base))])
edge_lengths = np.linalg.norm(edges, axis=1)
max_edge_idx = np.argmax(edge_lengths)
long_edge_direction = edges[max_edge_idx] / edge_lengths[max_edge_idx] # 单位化方向向量
angle = np.asarray([a,b,c])
noraml = camera2base[:3, :3]@angle
noraml_base = vec2rpy(noraml,long_edge_direction)
print(target_position, noraml_base)
return target_position,noraml_base