import numpy as np from scipy.spatial.transform import Rotation as R import open3d as o3d from scipy.spatial import KDTree import tf.transformations as tft import os import rospy from math import acos,tan,atan,degrees,sqrt,sin,cos def rpy2quaternion(roll, pitch, yaw):#zyx x=sin(roll/2)*cos(pitch/2)*cos(yaw/2)-cos(roll/2)*sin(pitch/2)*sin(yaw/2) y=cos(roll/2)*sin(pitch/2)*cos(yaw/2)+sin(roll/2)*cos(pitch/2)*sin(yaw/2) z=cos(roll/2)*cos(pitch/2)*sin(yaw/2)-sin(roll/2)*sin(pitch/2)*cos(yaw/2) w=cos(roll/2)*cos(pitch/2)*cos(yaw/2)+sin(roll/2)*sin(pitch/2)*sin(yaw/2) return [x, y, z, w] def get_hanfeng(file_path): """从文件中读取焊缝起点、终点和中间点,并计算两点构成的向量""" with open(file_path, 'r') as file: # 逐行读取文件内容 lines = file.readlines() start_points, end_points, midpoints , hanfeng = [],[],[],[] for line in lines: # 去除行尾的换行符并按'/'分割每一行 points_str = line.strip().split('/') # 确保每一行都正确地分为两部分 if len(points_str) == 2: point1_str = points_str[0].split(',') point2_str = points_str[1].split(',') # 转换字符串为浮点数列表,构造三维点 point1 = [float(coord) for coord in point1_str] point2 = [float(coord) for coord in point2_str] midpoint = [(p2 + p1)/2 for p1, p2 in zip(point1, point2)] vector = [p2 - p1 for p1, p2 in zip(point1, point2)] start_points.append(point1) end_points.append(point2) midpoints.append(midpoint) hanfeng.append(vector) return start_points, end_points, midpoints, hanfeng def calculate_angle_with_xy_plane(point1,point2): # 计算方向向量 dir_vector = np.array([point2[0] - point1[0], point2[1] - point1[1], point2[2] - point1[2]]) # 计算方向向量在 xy 平面上的投影 proj_vector = np.array([point2[0] - point1[0], point2[1] - point1[1], 0]) # 计算夹角 angle = acos(np.dot(dir_vector, proj_vector) / (np.linalg.norm(dir_vector) * np.linalg.norm(proj_vector))) angle_deg = degrees(angle) return angle_deg def run(): file_path = rospy.get_param("folder_path") file_path_points = os.path.join(file_path, 'points_guihua.txt') file_path_result = os.path.join(file_path, 'result.txt') result=[] start_points, end_points, midpoints, hanfeng = get_hanfeng(file_path_points) # 计算位姿 for i in range(len(hanfeng)): if(calculate_angle_with_xy_plane(start_points[i], end_points[i])<45):#平缝 q1 = rpy2quaternion(0,np.pi,0) q2 = rpy2quaternion(0,np.pi,0) result.append(("s", start_points[i], end_points[i], q1, q2)) else: q1 = rpy2quaternion(0,np.pi,0) q2 = rpy2quaternion(0,np.pi,0) result.append(("s", start_points[i], end_points[i], q1, q2)) # 打开文件准备写入 with open(file_path_result, "w") as file: for group in result: # 对于每个数据组,将每个部分用逗号连接,然后在各部分间插入斜杠 line = "/".join([",".join(map(str, sublist)) for sublist in group]) + "\n" file.write(line) rospy.loginfo("Welding Angle calculation completed") if __name__ == '__main__': run()