535 lines
22 KiB
Python
535 lines
22 KiB
Python
# -- coding: utf-8 --
|
||
import aurco_3d_detect as aurco3d
|
||
import cloud_3d_detect as cloud3d
|
||
import svd
|
||
import utils
|
||
import os
|
||
import sys
|
||
from utils import Log
|
||
from config import *
|
||
|
||
|
||
CAMERA_FILE = os.path.dirname(__file__) + "\\samples\\1\\output.png"
|
||
LIDAR_FILE = os.path.dirname(__file__) + "\\samples\\1\\output.ply"
|
||
sys.path.append(r"./")
|
||
|
||
|
||
_dict = [
|
||
"LEFT",
|
||
"TOP",
|
||
"RIGHT",
|
||
"BOTTOM",
|
||
]
|
||
|
||
|
||
def do_calibration_with_one_sample(camera_file_path = CAMERA_FILE, lidar_file_path = LIDAR_FILE):
|
||
global CAMERA_FILE, LIDAR_FILE
|
||
if CAMERA_FILE != camera_file_path :
|
||
CAMERA_FILE = camera_file_path
|
||
if LIDAR_FILE != lidar_file_path :
|
||
LIDAR_FILE = lidar_file_path
|
||
|
||
frame, aurco_marks_conners = aurco3d.cal_camera_marks_3d_conners(CAMERA_FILE)
|
||
|
||
# 分割标定板
|
||
marks_pcd = cloud3d.seg_mark_cloud(LIDAR_FILE, kk, show=False)
|
||
if len(marks_pcd) != MARK_COUNT:
|
||
return -1, None, None
|
||
pcd_marks_conners = cloud3d.cal_marks_3d_conners(show=False)
|
||
|
||
pcd_marks_conners_new = []
|
||
for i in range(4):
|
||
tmmp = []
|
||
for j in range(4):
|
||
tmmp.append(pcd_marks_conners[i].points[j])
|
||
pcd_marks_conners_new.append(tmmp)
|
||
|
||
# 排除异常点
|
||
__exclude = []
|
||
while True:
|
||
__max = 0
|
||
__min = 10
|
||
__mean = 0
|
||
__cnt = 0
|
||
__conner_mean = 0
|
||
__conner_cnt = 0
|
||
__conners_mean_distance = []
|
||
for i in range(16):
|
||
src_aruco_mark_conner = aurco_marks_conners[int(i/4)][i%4]
|
||
src_cloud_mark_conner = pcd_marks_conners_new[int(i/4)][i%4]
|
||
for j in range(16):
|
||
if i in __exclude or j in __exclude:
|
||
continue
|
||
dst_aruco_mark_conner = aurco_marks_conners[int(j/4)][j%4]
|
||
dst_cloud_mark_conner = pcd_marks_conners_new[int(j/4)][j%4]
|
||
aurco_distance = np.linalg.norm(src_aruco_mark_conner - dst_aruco_mark_conner)
|
||
lidar_distance = np.linalg.norm(src_cloud_mark_conner - dst_cloud_mark_conner)
|
||
diff_distance = abs(aurco_distance - lidar_distance)
|
||
if diff_distance > __max:
|
||
__max = diff_distance
|
||
if diff_distance < __min:
|
||
__min = diff_distance
|
||
__cnt += 1
|
||
__mean += diff_distance
|
||
__conner_cnt += 1
|
||
__conner_mean += diff_distance
|
||
# print(str(int(i/4)) + "-" + _dict[i%4] + " : " + str(int(j/4)) + "-" + _dict[j%4]
|
||
# + " = " + str(diff_distance))
|
||
if __conner_cnt == 0: tmp=0
|
||
else : tmp = __conner_mean/__conner_cnt
|
||
__conners_mean_distance.append(tmp)
|
||
__conner_cnt = 0
|
||
__conner_mean = 0
|
||
__mean = __mean/__cnt
|
||
Log.info("16点对比结果")
|
||
print("__max:" + str(__max))
|
||
print("__min:" + str(__min))
|
||
print("__cnt:" + str(__cnt))
|
||
print("__mean:" + str(__mean))
|
||
print("__conners_mean_distance:")
|
||
|
||
# for test
|
||
# for i in range(len(__conners_mean_distance)):
|
||
# print(__conners_mean_distance[i])
|
||
|
||
max_index = max(enumerate(__conners_mean_distance), key=lambda x: x[1])[0]
|
||
if len(__exclude) < conf_max_exclude_num:
|
||
__exclude.append(max_index)
|
||
else:
|
||
break
|
||
|
||
# 初始化SVD数据
|
||
list_marks_aurco = []
|
||
list_marks_pcd = []
|
||
for i in range(16):
|
||
# for test
|
||
print(aurco_marks_conners[int(i/4)][i%4][0] - pcd_marks_conners_new[int(i/4)][i%4][0],
|
||
aurco_marks_conners[int(i/4)][i%4][1] - pcd_marks_conners_new[int(i/4)][i%4][1],
|
||
aurco_marks_conners[int(i/4)][i%4][2] - pcd_marks_conners_new[int(i/4)][i%4][2])
|
||
if i in __exclude:
|
||
continue
|
||
list_marks_aurco.append(aurco_marks_conners[int(i/4)][i%4])
|
||
list_marks_pcd.append(pcd_marks_conners_new[int(i/4)][i%4])
|
||
|
||
# SVD 分解得到 RT
|
||
_R, _t, _ ,_ = svd.scipy_svd(np.asarray(list_marks_pcd), np.asarray(list_marks_aurco))
|
||
# _r, _p, _y = utils.rotation_matrix_to_euler_angles(_R)
|
||
_r, _p, _y = utils.rotation_matrix_to_rpy(_R)
|
||
print(_R)
|
||
print(_t)
|
||
print(_r, _p, _y)
|
||
|
||
return 0, [_t[0],_t[1],_t[2]], [_r, _p, _y], __mean
|
||
|
||
g_marks_pcd = []
|
||
def step1_get_aruco_and_lidar_marks_and_conners(
|
||
camera_file_path = CAMERA_FILE,
|
||
lidar_file_path = LIDAR_FILE,
|
||
times = 1,
|
||
simple=True):
|
||
|
||
global CAMERA_FILE, LIDAR_FILE, g_marks_pcd
|
||
if CAMERA_FILE != camera_file_path :
|
||
CAMERA_FILE = camera_file_path
|
||
if LIDAR_FILE != lidar_file_path :
|
||
LIDAR_FILE = lidar_file_path
|
||
|
||
frame, aurco_marks_conners = aurco3d.cal_camera_marks_3d_conners(CAMERA_FILE)
|
||
|
||
if simple:
|
||
# 分割标定板
|
||
if times == 1: # 第一次执行时分割
|
||
g_marks_pcd = cloud3d.seg_mark_cloud_simple(LIDAR_FILE, kk, show=False)
|
||
if len(g_marks_pcd) != MARK_COUNT:
|
||
return None, None
|
||
pcd_marks_conners = cloud3d.cal_marks_3d_conners_simple(g_marks_pcd, show=False)
|
||
else:
|
||
# 分割标定板
|
||
if times == 1: # 第一次执行时分割
|
||
g_marks_pcd = cloud3d.seg_mark_cloud(LIDAR_FILE, kk, show=False)
|
||
if len(g_marks_pcd) != MARK_COUNT:
|
||
return None, None
|
||
pcd_marks_conners = cloud3d.cal_marks_3d_conners(show=False)
|
||
|
||
pcd_marks_conners_new = []
|
||
for i in range(4):
|
||
tmmp = []
|
||
for j in range(4):
|
||
tmmp.append(pcd_marks_conners[i].points[j])
|
||
pcd_marks_conners_new.append(tmmp)
|
||
|
||
return aurco_marks_conners, pcd_marks_conners_new
|
||
|
||
def step1_get_aruco_and_lidar_marks_and_conners_v2(
|
||
camera_file_path = CAMERA_FILE,
|
||
lidar_file_path = LIDAR_FILE,
|
||
times = 1,
|
||
simple=True):
|
||
|
||
global CAMERA_FILE, LIDAR_FILE, g_marks_pcd
|
||
if CAMERA_FILE != camera_file_path :
|
||
CAMERA_FILE = camera_file_path
|
||
if LIDAR_FILE != lidar_file_path :
|
||
LIDAR_FILE = lidar_file_path
|
||
|
||
frame, aurco_marks_conners = aurco3d.cal_camera_marks_3d_conners_v2(CAMERA_FILE)
|
||
frame, pcd_marks_conners = aurco3d.cal_lidar_marks_3d_conner_v2(LIDAR_FILE)
|
||
|
||
pcd_marks_conners_new = []
|
||
for i in range(4):
|
||
tmmp = []
|
||
for j in range(4):
|
||
tmmp.append(pcd_marks_conners[i][j])
|
||
pcd_marks_conners_new.append(tmmp)
|
||
|
||
return aurco_marks_conners, pcd_marks_conners_new
|
||
|
||
def step2_exclude_bad_conners(aurco_marks_conners, pcd_marks_conners):
|
||
# 排除异常点
|
||
__exclude = []
|
||
while True:
|
||
__max = 0
|
||
__min = 10
|
||
__mean = 0
|
||
__cnt = 0
|
||
__conner_mean = 0
|
||
__conner_cnt = 0
|
||
__conners_mean_distance = []
|
||
for i in range(16):
|
||
src_aruco_mark_conner = aurco_marks_conners[int(i/4)][i%4]
|
||
src_cloud_mark_conner = pcd_marks_conners[int(i/4)][i%4]
|
||
for j in range(16):
|
||
if i in __exclude or j in __exclude:
|
||
continue
|
||
dst_aruco_mark_conner = aurco_marks_conners[int(j/4)][j%4]
|
||
dst_cloud_mark_conner = pcd_marks_conners[int(j/4)][j%4]
|
||
aurco_distance = np.linalg.norm(src_aruco_mark_conner - dst_aruco_mark_conner)
|
||
lidar_distance = np.linalg.norm(src_cloud_mark_conner - dst_cloud_mark_conner)
|
||
diff_distance = abs(aurco_distance - lidar_distance)
|
||
if diff_distance > __max:
|
||
__max = diff_distance
|
||
if diff_distance < __min:
|
||
__min = diff_distance
|
||
__cnt += 1
|
||
__mean += diff_distance
|
||
__conner_cnt += 1
|
||
__conner_mean += diff_distance
|
||
# print(str(int(i/4)) + "-" + _dict[i%4] + " : " + str(int(j/4)) + "-" + _dict[j%4]
|
||
# + " = " + str(diff_distance))
|
||
if __conner_cnt == 0: tmp=0
|
||
else : tmp = __conner_mean/__conner_cnt
|
||
__conners_mean_distance.append(tmp)
|
||
__conner_cnt = 0
|
||
__conner_mean = 0
|
||
__mean = __mean/__cnt
|
||
Log.info("16点对比结果")
|
||
print("__max:" + str(__max))
|
||
print("__min:" + str(__min))
|
||
print("__cnt:" + str(__cnt))
|
||
print("__mean:" + str(__mean))
|
||
print("__conners_mean_distance:")
|
||
|
||
# for test
|
||
# for i in range(len(__conners_mean_distance)):
|
||
# print(__conners_mean_distance[i])
|
||
|
||
max_index = max(enumerate(__conners_mean_distance), key=lambda x: x[1])[0]
|
||
if len(__exclude) < conf_max_exclude_num:
|
||
__exclude.append(max_index)
|
||
else:
|
||
break
|
||
|
||
# 初始化SVD数据
|
||
list_marks_aurco = []
|
||
list_marks_pcd = []
|
||
for i in range(16):
|
||
# for test
|
||
print(aurco_marks_conners[int(i/4)][i%4][0] - pcd_marks_conners[int(i/4)][i%4][0],
|
||
aurco_marks_conners[int(i/4)][i%4][1] - pcd_marks_conners[int(i/4)][i%4][1],
|
||
aurco_marks_conners[int(i/4)][i%4][2] - pcd_marks_conners[int(i/4)][i%4][2])
|
||
if i in __exclude:
|
||
continue
|
||
list_marks_aurco.append(aurco_marks_conners[int(i/4)][i%4])
|
||
list_marks_pcd.append(pcd_marks_conners[int(i/4)][i%4])
|
||
|
||
return list_marks_aurco, list_marks_pcd, __mean
|
||
|
||
def step2_exclude_bad_conners_v2(aurco_marks_conners, pcd_marks_conners):
|
||
# 排除异常点
|
||
__exclude = []
|
||
while True:
|
||
__max = 0
|
||
__min = 10
|
||
__mean = 0
|
||
__cnt = 0
|
||
__conner_mean = 0
|
||
__conner_cnt = 0
|
||
__conners_mean_distance = []
|
||
for i in range(16):
|
||
src_aruco_mark_conner = aurco_marks_conners[int(i/4)][i%4]
|
||
src_cloud_mark_conner = pcd_marks_conners[int(i/4)][i%4]
|
||
for j in range(16):
|
||
if i in __exclude or j in __exclude:
|
||
continue
|
||
dst_aruco_mark_conner = aurco_marks_conners[int(j/4)][j%4]
|
||
dst_cloud_mark_conner = pcd_marks_conners[int(j/4)][j%4]
|
||
aurco_distance = np.linalg.norm(src_aruco_mark_conner - dst_aruco_mark_conner)
|
||
lidar_distance = np.linalg.norm(src_cloud_mark_conner - dst_cloud_mark_conner)
|
||
diff_distance = abs(aurco_distance - lidar_distance)
|
||
if diff_distance > __max:
|
||
__max = diff_distance
|
||
if diff_distance < __min:
|
||
__min = diff_distance
|
||
__cnt += 1
|
||
__mean += diff_distance
|
||
__conner_cnt += 1
|
||
__conner_mean += diff_distance
|
||
# print(str(int(i/4)) + "-" + _dict[i%4] + " : " + str(int(j/4)) + "-" + _dict[j%4]
|
||
# + " = " + str(diff_distance))
|
||
if __conner_cnt == 0: tmp=0
|
||
else : tmp = __conner_mean/__conner_cnt
|
||
__conners_mean_distance.append(tmp)
|
||
__conner_cnt = 0
|
||
__conner_mean = 0
|
||
__mean = __mean/__cnt
|
||
Log.info("16点对比结果")
|
||
print("__max:" + str(__max))
|
||
print("__min:" + str(__min))
|
||
print("__cnt:" + str(__cnt))
|
||
print("__mean:" + str(__mean))
|
||
print("__conners_mean_distance:")
|
||
|
||
# for test
|
||
# for i in range(len(__conners_mean_distance)):
|
||
# print(__conners_mean_distance[i])
|
||
|
||
max_index = max(enumerate(__conners_mean_distance), key=lambda x: x[1])[0]
|
||
if len(__exclude) < conf_max_exclude_num:
|
||
__exclude.append(max_index)
|
||
else:
|
||
break
|
||
|
||
# 初始化SVD数据
|
||
list_marks_aurco = []
|
||
list_marks_pcd = []
|
||
Log.info("16点对比结果")
|
||
for i in range(16):
|
||
# for test
|
||
print(aurco_marks_conners[int(i/4)][i%4][0] - pcd_marks_conners[int(i/4)][i%4][0],
|
||
aurco_marks_conners[int(i/4)][i%4][1] - pcd_marks_conners[int(i/4)][i%4][1],
|
||
aurco_marks_conners[int(i/4)][i%4][2] - pcd_marks_conners[int(i/4)][i%4][2])
|
||
list_marks_aurco.append(aurco_marks_conners[int(i/4)][i%4])
|
||
list_marks_pcd.append(pcd_marks_conners[int(i/4)][i%4])
|
||
|
||
return list_marks_aurco, list_marks_pcd, __mean
|
||
|
||
import open3d as o3d
|
||
def create_spheres(points, sizes=None, color=[0, 0.706, 1]):
|
||
"""
|
||
创建一系列球体以替代点云中的点,允许每个点有不同的大小。
|
||
|
||
参数:
|
||
points: N x 3 数组,表示N个点的位置。
|
||
sizes: N维数组或列表,表示对应点的半径大小。如果为None,则所有球体大小相同。
|
||
color: RGB颜色值,默认是橙色。
|
||
|
||
返回:
|
||
spheres: 包含所有球体的Open3D几何对象列表。
|
||
"""
|
||
spheres = []
|
||
if sizes is None:
|
||
sizes = [0.006] * len(points) # 如果没有提供大小,则默认所有球体大小相同
|
||
for i, point in enumerate(points):
|
||
sphere = o3d.geometry.TriangleMesh.create_sphere(radius=sizes[i])
|
||
sphere.translate(point) # 将球体移动到点的位置
|
||
sphere.paint_uniform_color(color)
|
||
spheres.append(sphere)
|
||
return spheres
|
||
|
||
def step3_cal_aruco_and_lidar_marks_rt(aurco_marks_conners, pcd_marks_conners):
|
||
# SVD 分解得到 RT
|
||
array_aurco_marks_conners = np.asarray(aurco_marks_conners)
|
||
array_pcd_marks_conners = np.asarray(pcd_marks_conners)
|
||
_R, _t, _ ,_ = svd.scipy_svd(array_pcd_marks_conners, array_aurco_marks_conners)
|
||
# _r, _p, _y = utils.rotation_matrix_to_euler_angles(_R)
|
||
_r, _p, _y = utils.rotation_matrix_to_rpy(_R)
|
||
print(_R)
|
||
print(_t)
|
||
print(_r, _p, _y)
|
||
|
||
# for test
|
||
_pdc_rt = (_R @ np.asarray(array_pcd_marks_conners).T).T + _t
|
||
if True:
|
||
# 角点显示的圆球半径,单位(米)
|
||
spheres_2d = create_spheres(array_aurco_marks_conners[:16], None, color=[0, 0.706, 1])
|
||
spheres_3d = create_spheres(_pdc_rt[:16], None, color=[0, 0, 0])
|
||
points_list = []
|
||
for i in range(len(array_aurco_marks_conners[:16])):
|
||
points_list.append(spheres_2d[i])
|
||
points_list.append(spheres_3d[i])
|
||
# o3d.visualization.draw_geometries(points_list)
|
||
return 0, [_t[0],_t[1],_t[2]], [_r, _p, _y]
|
||
|
||
def calibration_by_one_samples_points():
|
||
calibration_result = []
|
||
bad_samples = []
|
||
samples_path_root = os.path.dirname(__file__) + "\\samples\\calibration"
|
||
|
||
# 标定使用的样本数量
|
||
samples_size = 1
|
||
# 每个样本执行的次数
|
||
times_per_one_sample = 2
|
||
for subdir in utils.list_subdirs(samples_path_root):
|
||
paths = utils.traverse_folder(samples_path_root + "\\" + subdir)
|
||
if len(paths) != 2:
|
||
print("[ERROR]\t Data Error Path : " + paths)
|
||
times = 0
|
||
while times < times_per_one_sample:
|
||
times += 1
|
||
ret, _t, _rpy, __mean = do_calibration_with_one_sample(paths[1], paths[0]) # 0 png, 1 ply
|
||
if ret != 0:
|
||
bad_samples.append(subdir)
|
||
continue
|
||
# 合并得到最终得旋转角
|
||
_new_rpy = utils.combine_rpy(roll, pitch, yaw, _rpy[0], _rpy[1], _rpy[2])
|
||
calibration_result.append([subdir, str(times), __mean, _t, _rpy, _new_rpy])
|
||
samples_size -= 1
|
||
if samples_size == 0:
|
||
break
|
||
for i in range(len(calibration_result)):
|
||
str_mean = str(calibration_result[i][2])
|
||
str_t = str(calibration_result[i][3])
|
||
str_ypr = str(calibration_result[i][4])
|
||
str_new_rpy = str(calibration_result[i][5])
|
||
print(calibration_result[i][0], calibration_result[i][1], str_mean, str_t, str_ypr, str_new_rpy)
|
||
for i in range(len(bad_samples)):
|
||
print(bad_samples[i])
|
||
utils.save_to_json(os.path.dirname(__file__) + '\\record\\record.json', calibration_result)
|
||
|
||
|
||
def calibration_by_all_samples_points(samples_path_root, samples_size=1, times_per_one_sample=2):
|
||
calibration_result = []
|
||
bad_samples = []
|
||
all_points = []
|
||
|
||
# 定义总体的 aurco_marks_conners, pcd_marks_conners
|
||
aurco_marks_conners_all = []
|
||
pcd_marks_conners_all = []
|
||
for subdir in utils.list_subdirs(samples_path_root):
|
||
paths = utils.traverse_folder(samples_path_root + "\\" + subdir)
|
||
if len(paths) != 2:
|
||
print("[ERROR]\t Data Error Path : " + paths)
|
||
times = 0
|
||
while times < times_per_one_sample:
|
||
times += 1
|
||
aurco_marks_conners, pcd_marks_conners = \
|
||
step1_get_aruco_and_lidar_marks_and_conners(paths[1], paths[0], times) # 0 png, 1 ply
|
||
if aurco_marks_conners is None:
|
||
Log.error("subdir is " + subdir + " aurco_marks_conners has ERROR")
|
||
break
|
||
aurco_marks_conners, pcd_marks_conners, __mean = \
|
||
step2_exclude_bad_conners(aurco_marks_conners, pcd_marks_conners)
|
||
_, _t, _rpy = step3_cal_aruco_and_lidar_marks_rt(aurco_marks_conners, pcd_marks_conners)
|
||
_new_rpy = utils.combine_rpy(roll, pitch, yaw, _rpy[0], _rpy[1], _rpy[2])
|
||
calibration_result.append([subdir, str(times), __mean, _t, _rpy, _new_rpy])
|
||
|
||
for it in range(len(aurco_marks_conners)):
|
||
aurco_marks_conners_all.append(aurco_marks_conners[it].tolist())
|
||
pcd_marks_conners_all.append(pcd_marks_conners[it].tolist())
|
||
samples_size -= 1
|
||
if samples_size == 0:
|
||
break
|
||
|
||
# 将多样本多次计算的综合点统一进行SVD分解
|
||
if len(aurco_marks_conners_all) == 0:
|
||
return -1, None, None, None
|
||
_, _t, _rpy = step3_cal_aruco_and_lidar_marks_rt(aurco_marks_conners_all, pcd_marks_conners_all)
|
||
#
|
||
_new_rpy = utils.combine_rpy(roll, pitch, yaw, _rpy[0], _rpy[1], _rpy[2])
|
||
calibration_result.append(["all", str(len(aurco_marks_conners_all)) + " & " + str(len(pcd_marks_conners_all)), \
|
||
__mean, _t, _rpy, _new_rpy])
|
||
|
||
for i in range(len(calibration_result)):
|
||
str_mean = str(calibration_result[i][2])
|
||
str_t = str(calibration_result[i][3])
|
||
str_ypr = str(calibration_result[i][4])
|
||
str_new_rpy = str(calibration_result[i][5])
|
||
print(calibration_result[i][0], calibration_result[i][1], str_mean, str_t, str_ypr, str_new_rpy)
|
||
for i in range(len(bad_samples)):
|
||
print(bad_samples[i])
|
||
utils.save_to_json(os.path.dirname(__file__) + '\\record\\record.json', calibration_result)
|
||
|
||
all_points.append(aurco_marks_conners_all)
|
||
all_points.append(pcd_marks_conners_all)
|
||
utils.save_to_json(os.path.dirname(__file__) + '\\record\\points.json', all_points)
|
||
|
||
return 0, _t, _rpy, __mean
|
||
|
||
def calibration_by_all_samples_points_v2(samples_path_root, samples_size=1, times_per_one_sample=2):
|
||
calibration_result = []
|
||
bad_samples = []
|
||
all_points = []
|
||
|
||
# 定义总体的 aurco_marks_conners, pcd_marks_conners
|
||
aurco_marks_conners_all = []
|
||
pcd_marks_conners_all = []
|
||
for subdir in utils.list_subdirs(samples_path_root):
|
||
paths = utils.traverse_folder(samples_path_root + "\\" + subdir)
|
||
if len(paths) != 2:
|
||
print("[ERROR]\t Data Error Path : " + paths)
|
||
times = 0
|
||
while times < times_per_one_sample:
|
||
times += 1
|
||
aurco_marks_conners, pcd_marks_conners = \
|
||
step1_get_aruco_and_lidar_marks_and_conners_v2(paths[1], paths[0], times) # 0 png, 1 ply
|
||
if aurco_marks_conners is None:
|
||
Log.error("subdir is " + subdir + " aurco_marks_conners has ERROR")
|
||
break
|
||
aurco_marks_conners, pcd_marks_conners, __mean = \
|
||
step2_exclude_bad_conners(aurco_marks_conners, pcd_marks_conners)
|
||
_, _t, _rpy = step3_cal_aruco_and_lidar_marks_rt(aurco_marks_conners, pcd_marks_conners)
|
||
_new_rpy = utils.combine_rpy(roll, pitch, yaw, _rpy[0], _rpy[1], _rpy[2])
|
||
calibration_result.append([subdir, str(times), __mean, _t, _rpy, _new_rpy])
|
||
|
||
for it in range(len(aurco_marks_conners)):
|
||
aurco_marks_conners_all.append(aurco_marks_conners[it].tolist())
|
||
pcd_marks_conners_all.append(pcd_marks_conners[it].tolist())
|
||
samples_size -= 1
|
||
if samples_size == 0:
|
||
break
|
||
|
||
# 将多样本多次计算的综合点统一进行SVD分解
|
||
if len(aurco_marks_conners_all) == 0:
|
||
return -1, None, None, None
|
||
_, _t, _rpy = step3_cal_aruco_and_lidar_marks_rt(aurco_marks_conners_all, pcd_marks_conners_all)
|
||
_new_rpy = utils.combine_rpy(roll, pitch, yaw, _rpy[0], _rpy[1], _rpy[2])
|
||
calibration_result.append(["all", str(len(aurco_marks_conners_all)) + " & " + str(len(pcd_marks_conners_all)), \
|
||
__mean, _t, _rpy, _new_rpy])
|
||
|
||
for i in range(len(calibration_result)):
|
||
str_mean = str(calibration_result[i][2])
|
||
str_t = str(calibration_result[i][3])
|
||
str_ypr = str(calibration_result[i][4])
|
||
str_new_rpy = str(calibration_result[i][5])
|
||
print(calibration_result[i][0], calibration_result[i][1], str_mean, str_t, str_ypr, str_new_rpy)
|
||
for i in range(len(bad_samples)):
|
||
print(bad_samples[i])
|
||
utils.save_to_json(os.path.dirname(__file__) + '\\record\\record.json', calibration_result)
|
||
|
||
all_points.append(aurco_marks_conners_all)
|
||
all_points.append(pcd_marks_conners_all)
|
||
utils.save_to_json(os.path.dirname(__file__) + '\\record\\points.json', all_points)
|
||
|
||
return 0, _t, _rpy, __mean
|
||
|
||
|
||
if __name__ == '__main__':
|
||
# calibration_by_one_samples_points()
|
||
samples_size = 5
|
||
times_per_one_sample = 1
|
||
# samples_path_root = os.path.dirname(__file__) + "\\ssh_tmp"
|
||
samples_path_root = os.path.dirname(__file__) + "\\samples\\20250214"
|
||
ret, _t, _rpy, __mean = calibration_by_all_samples_points(samples_path_root, samples_size, times_per_one_sample)
|
||
# ret, _t, _rpy, __mean = calibration_by_all_samples_points_v2(samples_path_root, samples_size, times_per_one_sample)
|
||
# rt = utils.read_from_json(os.path.dirname(__file__) + '\\record\\record.json')
|
||
# print(rt) |