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

79 lines
2.2 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 os
import numpy as np
from scipy.spatial.transform import Rotation as R
def vec2rpy(normal):#首先是相机到法兰的转换之后是法兰到新坐标系的转换新坐标系就是与Z轴与法向量一致的坐标系)
# 将法向量作为机械臂末端执行器的新X轴
x_axis = normal / np.linalg.norm(normal) # 归一化
# 选择一个合适的Y轴方向尽量避免与X轴共线
if abs(x_axis[2]) != 1:
y_axis = np.array([0, 1, 0])
else:
y_axis = np.array([0, 0, 1])
y_axis = y_axis - np.dot(y_axis, x_axis) * x_axis # 投影到垂直于x轴的平面
y_axis = y_axis / np.linalg.norm(y_axis)
# 计算Z轴方向确保它与X轴和Y轴正交
z_axis = np.cross(x_axis, y_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):
target = np.asarray([x, y, z,1])
camera2robot = np.loadtxt('./cam_pose.txt', delimiter='') #相对目录且分隔符采用os.sep
robot2base = rotation
camera2base = robot2base @ camera2robot
target_position = np.dot(camera2base, target)
angle = np.asarray([a,b,c])
noraml = camera2base[:3, :3]@angle
noraml_base = vec2rpy(noraml)
print(target_position, noraml_base)
return target_position,noraml_base