|
@@ -5,95 +5,15 @@ from scipy.spatial import KDTree
|
|
|
import tf.transformations as tft
|
|
|
import os
|
|
|
import rospy
|
|
|
-from math import acos,tan,atan,degrees,sqrt
|
|
|
+from math import acos,tan,atan,degrees,sqrt,sin,cos
|
|
|
|
|
|
-def corner_angle_discrimination(point,data,fangxiang):
|
|
|
- # 构建KDTree索引
|
|
|
- tree = KDTree(data)
|
|
|
- indices = np.array(tree.query_ball_point(point, r=30, p=2)) # 返回这些点的索引数组
|
|
|
- distances = np.array([np.linalg.norm(point - data[index]) for index in indices])
|
|
|
- distance_filter = distances >= 10
|
|
|
- filtered_indices = indices[distance_filter]
|
|
|
- data_circular = data[filtered_indices]
|
|
|
+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]
|
|
|
|
|
|
- # 可视化
|
|
|
- # pt_cloud_circular = o3d.geometry.PointCloud()
|
|
|
- # pt_cloud_circular.points = o3d.utility.Vector3dVector(data_circular)
|
|
|
- # o3d.visualization.draw_geometries([pt_cloud_circular])
|
|
|
-
|
|
|
- # 获取与方向向量相似的点云
|
|
|
- data_similar = []
|
|
|
- for i in range(len(data_circular)):
|
|
|
- v = np.array(data_circular[i]) - point
|
|
|
- angle = acos(np.dot(v, fangxiang) / (np.linalg.norm(v) * np.linalg.norm(fangxiang)))
|
|
|
- angle_deg = degrees(angle)
|
|
|
- if angle_deg <= 15:
|
|
|
- data_similar.append(data_circular[i])
|
|
|
-
|
|
|
- if len(data_similar) >= 1:
|
|
|
- corner = True
|
|
|
- else:
|
|
|
- corner = False
|
|
|
- return corner
|
|
|
-def set_yaw_angle(R_mat,yaw):
|
|
|
- pz1 = np.array([[1, 0, 0],
|
|
|
- [0, np.cos(yaw), -np.sin(yaw)],
|
|
|
- [0, np.sin(yaw), np.cos(yaw)]])
|
|
|
- Z_PI = np.array([[np.cos(np.pi), -np.sin(np.pi), 0],
|
|
|
- [np.sin(np.pi), np.cos(np.pi), 0],
|
|
|
- [0, 0, 1]])
|
|
|
- R1_mat = np.matmul(R_mat,pz1)
|
|
|
-
|
|
|
- sign = check_x_axis_direction(R1_mat)
|
|
|
- if sign == 1:
|
|
|
- pass
|
|
|
- elif sign == -1:
|
|
|
- R1_mat = np.matmul(R1_mat, Z_PI)
|
|
|
-
|
|
|
- q = R.from_matrix(R1_mat).as_quat()
|
|
|
- q = q.tolist() # 将NumPy数组转换为列表
|
|
|
- return q
|
|
|
-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 check_x_axis_direction(rotation_matrix):
|
|
|
- # 提取旋转后的 x 轴方向向量
|
|
|
- x_prime = rotation_matrix[:, 0]
|
|
|
- # 检查 x 轴的 z 分量
|
|
|
- if x_prime[2] > 0:
|
|
|
- return 1
|
|
|
- elif x_prime[2] < 0:
|
|
|
- return -1
|
|
|
- else:
|
|
|
- return 0
|
|
|
-def load_point_cloud_from_txt(file_path):
|
|
|
- """导入点云数据"""
|
|
|
- points = []
|
|
|
- with open(file_path, 'r') as file:
|
|
|
- for line in file:
|
|
|
- # 假设每一行是“x y z”格式,没有多余空格
|
|
|
- coordinates = line.strip().split()
|
|
|
- if len(coordinates) == 3: # 检查是否为有效的三维点
|
|
|
- point = [float(coord) for coord in coordinates]
|
|
|
- points.append(point)
|
|
|
-
|
|
|
- return np.array(points)
|
|
|
-def load_point_cloud_from_binary_txt(file_path):
|
|
|
- with open(file_path, 'rb') as f:
|
|
|
- binary_data = f.read()
|
|
|
-
|
|
|
- # 将二进制数据转换为 NumPy 数组
|
|
|
- point_cloud = np.frombuffer(binary_data, dtype=np.float64).reshape(-1, 3)
|
|
|
- return point_cloud
|
|
|
|
|
|
def get_hanfeng(file_path):
|
|
|
"""从文件中读取焊缝起点、终点和中间点,并计算两点构成的向量"""
|
|
@@ -124,322 +44,37 @@ def get_hanfeng(file_path):
|
|
|
|
|
|
return start_points, end_points, midpoints, hanfeng
|
|
|
|
|
|
-def compute_Rc2w_tc2w(file_path_Tw2c):
|
|
|
- """相机和基底坐标系的转换关系"""
|
|
|
- # 读取文件
|
|
|
- with open(file_path_Tw2c, 'r') as file:
|
|
|
- lines = file.readlines()
|
|
|
-
|
|
|
- lines = [line.strip().replace('[', '').replace(']', '').split() for line in lines]
|
|
|
- data = [[float(num) for num in line] for line in lines]
|
|
|
- data = np.array(data)
|
|
|
- # 提取Rw2c和tw2c
|
|
|
- Rw2c = data[:3,:3]
|
|
|
- tw2c = data[:3,-1]
|
|
|
-
|
|
|
- Rc2w = Rw2c.T
|
|
|
- tc2w = -np.matmul(Rc2w, tw2c)
|
|
|
- return Rc2w,tc2w
|
|
|
-
|
|
|
-def compute_pose_R(fangxiang, hanfeng,start_point, end_point):
|
|
|
- """根据计算出的焊接时z轴负方向的向量和由起(fangxiang)点指向终点的向量(hanfeng)计算旋转矩阵"""
|
|
|
- x, y, z = fangxiang
|
|
|
-
|
|
|
- # 计算旋转角度
|
|
|
- rotx = -np.arctan2(y, z)
|
|
|
- roty = np.arctan2(x, np.sqrt(y**2 + z**2))
|
|
|
-
|
|
|
- # 构造旋转矩阵
|
|
|
- A = np.array([[1, 0, 0],
|
|
|
- [0, np.cos(rotx), -np.sin(rotx)],
|
|
|
- [0, np.sin(rotx), np.cos(rotx)]])
|
|
|
- B = np.array([[np.cos(roty), 0, np.sin(roty)],
|
|
|
- [0, 1, 0],
|
|
|
- [-np.sin(roty), 0, np.cos(roty)]])
|
|
|
- bb = np.matmul(hanfeng, np.matmul(A, B))
|
|
|
- # 区分平缝竖缝
|
|
|
- angle = calculate_angle_with_xy_plane(start_point,end_point)
|
|
|
- ispingfeng = abs(angle) < 30
|
|
|
- if ispingfeng:
|
|
|
- rotz = np.arctan2(bb[0], -bb[1])
|
|
|
- else:
|
|
|
- rotz = np.arctan2(bb[1], bb[0])
|
|
|
-
|
|
|
- C = np.array([[np.cos(rotz), -np.sin(rotz), 0],
|
|
|
- [np.sin(rotz), np.cos(rotz), 0],
|
|
|
- [0, 0, 1]])
|
|
|
- D = np.array([[1, 0, 0],
|
|
|
- [0, np.cos(np.pi), -np.sin(np.pi)],
|
|
|
- [0, np.sin(np.pi), np.cos(np.pi)]])
|
|
|
-
|
|
|
- R_mat = np.matmul(A, np.matmul(B, np.matmul(C, D)))
|
|
|
-
|
|
|
- return R_mat, ispingfeng
|
|
|
-
|
|
|
-def get_quaternion(data, midpoint, hanfeng, start_point, end_point,result_ping,result_shu,result_wai,file_path_Tw2c):
|
|
|
-
|
|
|
- # 构建KDTree索引
|
|
|
- tree = KDTree(data)
|
|
|
- # 查询半径范围内的点,找出"data"中所有距离"midpoint"点在r以内的点,这里使用的是欧几里得距离(由p=2表示)
|
|
|
- indices = np.array(tree.query_ball_point(midpoint, r=30, p=2)) # 返回这些点的索引数组
|
|
|
- distances = np.array([np.linalg.norm(midpoint - data[index]) for index in indices])
|
|
|
- # 对numpy数组进行布尔索引
|
|
|
- # distance_filter = np.logical_and(distances >= 10, distances <= 50)
|
|
|
- distance_filter = distances >= 10
|
|
|
- # 使用布尔索引过滤出符合条件的索引
|
|
|
- filtered_indices = indices[distance_filter]
|
|
|
- # 提取符合条件的点
|
|
|
- data_circular = data[filtered_indices]
|
|
|
-
|
|
|
- # 可视化
|
|
|
- # pt_cloud_circular = o3d.geometry.PointCloud()
|
|
|
- # pt_cloud_circular.points = o3d.utility.Vector3dVector(data_circular)
|
|
|
- # o3d.visualization.draw_geometries([pt_cloud_circular])
|
|
|
-
|
|
|
- # 获取竖直方向上的点云
|
|
|
- data_shu = []
|
|
|
- for i in range(len(data_circular)):
|
|
|
- P = np.array(data_circular[i])
|
|
|
- v = P - midpoint
|
|
|
- anglecos = np.dot(v, hanfeng) / (np.linalg.norm(v) * np.linalg.norm(hanfeng))
|
|
|
-
|
|
|
- if abs(anglecos) <= 0.015:
|
|
|
- # print(anglecos)
|
|
|
- data_shu.append(P)
|
|
|
- data_shu = np.array(data_shu)
|
|
|
- # # 可视化
|
|
|
- # pt_cloud_shu = o3d.geometry.PointCloud()
|
|
|
- # pt_cloud_shu.points = o3d.utility.Vector3dVector(np.array(data_shu))
|
|
|
- # o3d.visualization.draw_geometries([pt_cloud_shu])
|
|
|
-
|
|
|
- ##################################################
|
|
|
- ##################################################
|
|
|
- random_point = data_shu[np.random.randint(0, len(data_shu))]
|
|
|
- # 与midpoint一起定义直线向量
|
|
|
- nohanfeng = random_point - midpoint #data_shu中任意一点midpoint构成的向量,计算所有点和该向量的距离判断是否是外缝(只拍到一面)
|
|
|
-
|
|
|
- distances_to_line = []
|
|
|
-
|
|
|
- for i in range(data_shu.shape[0]): # 遍历每一个点 P
|
|
|
- P = data_shu[i]
|
|
|
- A = midpoint
|
|
|
- u = nohanfeng
|
|
|
- v = P - A
|
|
|
- distance = np.linalg.norm(np.cross(u, v)) / np.linalg.norm(u)
|
|
|
- distances_to_line.append(distance)
|
|
|
-
|
|
|
- distances_to_line = np.array(distances_to_line)
|
|
|
-
|
|
|
- all_distances_less_than_10 = np.all(distances_to_line < 5)#都小于10为true,也就是data_shu只有一列,侧着拍得外缝
|
|
|
-
|
|
|
- if all_distances_less_than_10:
|
|
|
-
|
|
|
- # 随机选取data_shu中的第一个点
|
|
|
- random_index = np.random.randint(0, data_shu.shape[0])
|
|
|
- vector1 = data_shu[random_index] - midpoint
|
|
|
- vector1 /= np.linalg.norm(vector1) # 单位化vector1
|
|
|
- fa_xian = np.cross(vector1, hanfeng)
|
|
|
- fa_xian /= np.linalg.norm(fa_xian)
|
|
|
-
|
|
|
- point = []
|
|
|
- point1 = midpoint + 50 * fa_xian
|
|
|
- point2 = midpoint - 50 * fa_xian
|
|
|
-
|
|
|
- Rc2w,tc2w = compute_Rc2w_tc2w(file_path_Tw2c)
|
|
|
-
|
|
|
- point1_c = np.matmul(Rc2w, point1) + tc2w
|
|
|
- point2_c = np.matmul(Rc2w, point2) + tc2w
|
|
|
- a = np.linalg.norm(point1_c)
|
|
|
- b = np.linalg.norm(point2_c)
|
|
|
-
|
|
|
- if a < b:
|
|
|
- point = point1
|
|
|
- else:
|
|
|
- point = point2
|
|
|
-
|
|
|
- faxian = point - midpoint
|
|
|
- vector2 = faxian / np.linalg.norm(faxian) # 单位化vector2
|
|
|
-
|
|
|
- fangxiang = vector1 + vector2*1.2
|
|
|
-
|
|
|
- R_mat, ispingfeng = compute_pose_R(fangxiang, hanfeng, start_point, end_point)
|
|
|
- if ispingfeng:
|
|
|
- ##偏转##
|
|
|
- pz1 = np.array([[1, 0, 0],
|
|
|
- [0, np.cos(yaw), -np.sin(yaw)],
|
|
|
- [0, np.sin(yaw), np.cos(yaw)]])
|
|
|
- pz2 = np.array([[1, 0, 0],
|
|
|
- [0, np.cos(-yaw), -np.sin(-yaw)],
|
|
|
- [0, np.sin(-yaw), np.cos(-yaw)]])
|
|
|
- Z_PI = np.array([[np.cos(np.pi), -np.sin(np.pi), 0],
|
|
|
- [np.sin(np.pi), np.cos(np.pi), 0],
|
|
|
- [0, 0, 1]])
|
|
|
- R1_mat = np.matmul(R_mat,pz1)
|
|
|
- R2_mat = np.matmul(R_mat,pz2)
|
|
|
-
|
|
|
- sign = check_x_axis_direction(R1_mat)
|
|
|
- if sign == 1:
|
|
|
- pass
|
|
|
- elif sign == -1:
|
|
|
- R1_mat = np.matmul(R1_mat, Z_PI)
|
|
|
- R2_mat = np.matmul(R2_mat, Z_PI)
|
|
|
-
|
|
|
- q1 = R.from_matrix(R1_mat).as_quat()
|
|
|
- q2 = R.from_matrix(R2_mat).as_quat()
|
|
|
- q1 = q1.tolist() # 将NumPy数组转换为列表
|
|
|
- q2 = q2.tolist()
|
|
|
- # print("一个点云面的平外缝")
|
|
|
- # print(q1,q2)
|
|
|
- result_ping.append(("pw", start_point, end_point, q1, q2))
|
|
|
-
|
|
|
- return result_ping,result_shu,result_wai
|
|
|
- else:
|
|
|
- ##偏转##
|
|
|
- E = np.array([[np.cos(-pitch_of_Verticalweld), 0, np.sin(-pitch_of_Verticalweld)],
|
|
|
- [0, 1, 0],
|
|
|
- [-np.sin(-pitch_of_Verticalweld), 0, np.cos(-pitch_of_Verticalweld)]])
|
|
|
-
|
|
|
- R_mat = np.matmul(R_mat,E)
|
|
|
-
|
|
|
- q1 = R.from_matrix(R_mat).as_quat()
|
|
|
- q2 = R.from_matrix(R_mat).as_quat()
|
|
|
- q1 = q1.tolist() # 将NumPy数组转换为列表
|
|
|
- q2 = q2.tolist()
|
|
|
- # print("即一个点云面的竖外缝")
|
|
|
- # print(q1,q2)
|
|
|
- result_wai.append(("sw", start_point, end_point, q1, q2))
|
|
|
- return result_ping,result_shu,result_wai
|
|
|
-
|
|
|
- else:
|
|
|
- # 选择位于平面两侧的点
|
|
|
- # 随机选取data_shu中的第一个点
|
|
|
- random_index = np.random.randint(0, data_shu.shape[0])
|
|
|
- vector1 = data_shu[random_index] - midpoint
|
|
|
- vector1 /= np.linalg.norm(vector1) # 单位化vector1
|
|
|
-
|
|
|
- # 随机选取下一个点,直到找到与vector1夹角大于10度的向量
|
|
|
- found = False
|
|
|
- while not found:
|
|
|
- random_index = np.random.randint(0, data_shu.shape[0])
|
|
|
- random_point = data_shu[random_index] - midpoint
|
|
|
- vector2 = random_point / np.linalg.norm(random_point) # 单位化vector2
|
|
|
-
|
|
|
- # 计算两个向量之间的夹角(弧度)
|
|
|
- dot_product = np.dot(vector1, vector2)
|
|
|
- angle_rad = np.arccos(dot_product)
|
|
|
-
|
|
|
- # 判断角度是否大于10度(转换为弧度)
|
|
|
- if angle_rad > np.deg2rad(20) and angle_rad < np.deg2rad(180):
|
|
|
- found = True
|
|
|
- # 如果找到了,则保存vector2
|
|
|
- else:
|
|
|
- continue
|
|
|
-
|
|
|
- # 计算并保存最终的fangxiang向量, vector1与vector2均为单位向量
|
|
|
- vector1_sim_to_z = np.dot(vector1, [0,0,1]) / (np.linalg.norm(vector1))
|
|
|
- vector2_sim_to_z = np.dot(vector2, [0,0,1]) / (np.linalg.norm(vector2))
|
|
|
- if vector1_sim_to_z > vector2_sim_to_z:
|
|
|
- vector_shu = vector1
|
|
|
- vector_ping = vector2
|
|
|
- else:
|
|
|
- vector_shu = vector2
|
|
|
- vector_ping = vector1
|
|
|
- fangxiang = vector_ping + vector_shu*tan(pitch_of_Horizontalweld)
|
|
|
- # fangxiang = vector1 + vector2
|
|
|
- fangxiang /= np.linalg.norm(fangxiang) # 单位化fangxiang
|
|
|
-
|
|
|
- #########################################根据vector1和vector2判断内缝外缝#########################################
|
|
|
- point1 = midpoint + 50 * fangxiang
|
|
|
- point2 = midpoint - 50 * fangxiang
|
|
|
-
|
|
|
- Rc2w,tc2w = compute_Rc2w_tc2w(file_path_Tw2c)
|
|
|
-
|
|
|
- point1_c = np.matmul(Rc2w, point1) + tc2w
|
|
|
- point2_c = np.matmul(Rc2w, point2) + tc2w
|
|
|
- a = np.linalg.norm(point1_c)
|
|
|
- b = np.linalg.norm(point2_c)
|
|
|
-
|
|
|
- if a < b: # 内缝
|
|
|
- # print("两个点云面的内缝")
|
|
|
- fangxiang = fangxiang
|
|
|
- else: # 外缝
|
|
|
- # print("两个点云面的外缝")
|
|
|
- fangxiang = -fangxiang
|
|
|
-
|
|
|
- R_mat, ispingfeng = compute_pose_R(fangxiang, hanfeng, start_point, end_point)
|
|
|
- if ispingfeng:
|
|
|
- ##偏转##
|
|
|
- corner_of_start_point = corner_angle_discrimination(start_point,data,fangxiang)
|
|
|
- corner_of_end_point = corner_angle_discrimination(end_point,data,fangxiang)
|
|
|
- pi4_pz = atan(1 / (sqrt(2) * tan(np.pi/4)))#CL公式
|
|
|
- yaw_pz =atan(1 / (sqrt(2) * tan(yaw)))
|
|
|
- if corner_of_start_point:
|
|
|
- q1 = set_yaw_angle(R_mat,pi4_pz)
|
|
|
- if not corner_of_end_point:
|
|
|
- len_hanfeng = np.linalg.norm(hanfeng)
|
|
|
- angle = pi4_pz-(pi4_pz)*len_hanfeng/yaw_rate
|
|
|
- if angle < -yaw_pz:
|
|
|
- angle =-yaw_pz
|
|
|
- q2 = set_yaw_angle(R_mat,angle)
|
|
|
- if corner_of_end_point:
|
|
|
- q2 = set_yaw_angle(R_mat,-pi4_pz)
|
|
|
- if not corner_of_start_point:
|
|
|
- len_hanfeng = np.linalg.norm(hanfeng)
|
|
|
- angle = -pi4_pz+(pi4_pz)*len_hanfeng/yaw_rate
|
|
|
- if angle > yaw_pz:
|
|
|
- angle = yaw_pz
|
|
|
- q1 = set_yaw_angle(R_mat,angle)
|
|
|
- if not corner_of_start_point and not corner_of_end_point:
|
|
|
- q1 = set_yaw_angle(R_mat,yaw_pz)
|
|
|
- len_hanfeng = np.linalg.norm(hanfeng)
|
|
|
- angle = yaw_pz-(pi4_pz)*len_hanfeng/yaw_rate
|
|
|
- if angle < -yaw_pz:
|
|
|
- angle =-yaw_pz
|
|
|
- q2 = set_yaw_angle(R_mat,angle)
|
|
|
-
|
|
|
- result_ping.append(("p", start_point, end_point, q1, q2))
|
|
|
-
|
|
|
- return result_ping,result_shu,result_wai
|
|
|
- else:
|
|
|
- ##偏转##
|
|
|
- E = np.array([[np.cos(-pitch_of_Verticalweld), 0, np.sin(-pitch_of_Verticalweld)],
|
|
|
- [0, 1, 0],
|
|
|
- [-np.sin(-pitch_of_Verticalweld), 0, np.cos(-pitch_of_Verticalweld)]])
|
|
|
+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)
|
|
|
|
|
|
- R_mat = np.matmul(R_mat,E)
|
|
|
-
|
|
|
- q1 = R.from_matrix(R_mat).as_quat()
|
|
|
- q2 = R.from_matrix(R_mat).as_quat()
|
|
|
- q1 = q1.tolist() # 将NumPy数组转换为列表
|
|
|
- q2 = q2.tolist()
|
|
|
- # print(q1,q2)
|
|
|
- result_wai.append(("s", start_point, end_point, q1, q2))
|
|
|
- return result_ping,result_shu,result_wai
|
|
|
+ return angle_deg
|
|
|
|
|
|
def run():
|
|
|
- global yaw,yaw_rate,pitch_of_Horizontalweld,pitch_of_Verticalweld
|
|
|
- # yaw = np.pi/8
|
|
|
- yaw = np.pi/2-rospy.get_param("yaw")
|
|
|
- pitch_of_Verticalweld = rospy.get_param("pitch_of_Verticalweld")
|
|
|
- pitch_of_Horizontalweld = rospy.get_param("pitch_of_Horizontalweld")
|
|
|
- yaw_rate = rospy.get_param("yaw_rate")
|
|
|
file_path = rospy.get_param("folder_path")
|
|
|
- # file_path = ('/home/chen/catkin_ws/data/0603')
|
|
|
- file_path_pointcloud = os.path.join(file_path, 'pointcloud.txt')
|
|
|
file_path_points = os.path.join(file_path, 'points_guihua.txt')
|
|
|
file_path_result = os.path.join(file_path, 'result.txt')
|
|
|
- file_path_Tw2c = os.path.join(file_path, 'Tw2c.txt')
|
|
|
|
|
|
- # 获取数据
|
|
|
- data = load_point_cloud_from_binary_txt(file_path_pointcloud)
|
|
|
+ result=[]
|
|
|
start_points, end_points, midpoints, hanfeng = get_hanfeng(file_path_points)
|
|
|
-
|
|
|
# 计算位姿
|
|
|
- result_ping,result_shu,result_wai = [],[],[]
|
|
|
- for i in range(len(midpoints)):
|
|
|
- result_ping,result_shu,result_wai = get_quaternion(data, midpoints[i], hanfeng[i], start_points[i], end_points[i],result_ping,result_shu,result_wai, file_path_Tw2c)
|
|
|
- # print(q1," ",q2)
|
|
|
- result = result_ping + result_shu + result_wai
|
|
|
+ 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:
|