diff --git a/pipeline/2_Multiview.py b/pipeline/2_Multiview.py index 948fb88..666bc1d 100644 --- a/pipeline/2_Multiview.py +++ b/pipeline/2_Multiview.py @@ -488,6 +488,77 @@ def project_points( return projected.reshape(-1, 2) +def compute_soft_constraint_residuals( + robot_state: Dict[str, float], + robot_markers: Dict[int, Dict[str, Any]], + link_transforms: Dict[str, np.ndarray], + robot: Dict[str, Any], + enabled_constraints: Dict[str, ConstraintResult] +) -> List[float]: + """ + Compute residuals from soft constraints (kinematic consistency, rigid body distances). + Returns a list of constraint residuals to append to the total residual vector. + """ + residuals = [] + weight_scale = 0.1 # Weight for soft constraints relative to reprojection errors + + # Constraint 1: Rigid body distances within each link + if enabled_constraints['RigidBodyDistances'].enabled: + for link_name in ['Arm1', 'Ellbow', 'Arm2']: + link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] + if len(link_markers) < 2: + continue + + # Compute all pairwise distances in world coords + for i in range(len(link_markers)): + for j in range(i + 1, len(link_markers)): + m_i = link_markers[i] + m_j = link_markers[j] + + pos_i = compute_marker_world_position(m_i, link_transforms) + pos_j = compute_marker_world_position(m_j, link_transforms) + + dist_world = np.linalg.norm(pos_i - pos_j) + + # Reference distance in local coords + dist_local = np.linalg.norm(m_i['position_m'] - m_j['position_m']) + + # Residual: difference should be zero (rigid body) + error = dist_world - dist_local + residuals.append(error * weight_scale * 0.1) # Very soft weight + + # Constraint 2: Fixed X-distances between links (Arm1 <-> Ellbow) + if enabled_constraints['InterLinkXDistances'].enabled: + arm1_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm1'] + ellbow_markers = [m for m in robot_markers.values() if m['link_name'] == 'Ellbow'] + + if len(arm1_markers) >= 1 and len(ellbow_markers) >= 1: + # Get first marker from each link + m_arm1 = arm1_markers[0] + m_ellbow = ellbow_markers[0] + + pos_arm1 = compute_marker_world_position(m_arm1, link_transforms) + pos_ellbow = compute_marker_world_position(m_ellbow, link_transforms) + + # X-distance in world should match reference (relative position) + # Since both rotate around X-axis at different points, we check consistency + x_diff_world = pos_ellbow[0] - pos_arm1[0] + x_diff_ref = m_ellbow['position_m'][0] - m_arm1['position_m'][0] + + error = x_diff_world - x_diff_ref + residuals.append(error * weight_scale) + + return residuals + + +def compute_marker_world_position(marker: Dict[str, Any], link_transforms: Dict[str, np.ndarray]) -> np.ndarray: + """Compute the world position of a marker given current link transforms.""" + link_transform = link_transforms[marker['link_name']] + local_pos = np.concatenate([marker['position_m'], [1.0]]) + world_pos = (link_transform @ local_pos)[:3] + return world_pos + + # ------------------------------------------------------------------ # Optimization # ------------------------------------------------------------------ @@ -520,12 +591,15 @@ def residuals_for_parameters( robot_markers: Dict[int, Dict[str, Any]], robot: Dict[str, Any], scale: float, - default_state: Dict[str, float] + default_state: Dict[str, float], + enabled_constraints: Dict[str, ConstraintResult] ) -> np.ndarray: robot_state, camera_params = unpack_parameters(params, len(views)) link_transforms = compute_link_transforms(robot, robot_state, scale) residuals = [] + + # Reprojection residuals (primary observation) for obs in observations: marker = robot_markers[obs['marker_id']] world_corners = compute_marker_world_corners(marker, link_transforms) @@ -535,6 +609,7 @@ def residuals_for_parameters( weight = math.sqrt(obs['confidence']) residuals.extend((diffs * weight).reshape(-1)) + # Weak priors on robot state for key in STATE_KEYS: diff = robot_state[key] - default_state.get(key, 0.0) if key in ('x', 'y', 'z', 'e'): @@ -543,9 +618,16 @@ def residuals_for_parameters( w = 0.01 residuals.append(diff * w) + # Soft constraints (kinematic consistency, rigid body constraints) + soft_constraint_residuals = compute_soft_constraint_residuals( + robot_state, robot_markers, link_transforms, robot, enabled_constraints + ) + residuals.extend(soft_constraint_residuals) + return np.asarray(residuals, dtype=np.float64) + def estimate_uncertainty(result: Any, n_params: int) -> np.ndarray: if result.jac is None: return np.full(n_params, float('nan'), dtype=np.float64) @@ -563,9 +645,97 @@ def estimate_uncertainty(result: Any, n_params: int) -> np.ndarray: return np.sqrt(np.diag(cov)) -# ------------------------------------------------------------------ -# Output assembly -# ------------------------------------------------------------------ +def print_constraint_sanity_check( + robot_state: Dict[str, float], + robot_markers: Dict[int, Dict[str, Any]], + link_transforms: Dict[str, np.ndarray], + robot: Dict[str, Any], + enabled_constraints: Dict[str, ConstraintResult] +) -> None: + """ + Print sanity checks for all constraints to verify the optimization result. + """ + print("\n" + "=" * 70) + print("CONSTRAINT SANITY CHECKS (after optimization)") + print("=" * 70) + + # Check 1: Rigid body distances + if enabled_constraints['RigidBodyDistances'].enabled: + print("\n1. RIGID BODY DISTANCES") + for link_name in ['Arm1', 'Ellbow', 'Arm2']: + link_markers = [m for m in robot_markers.values() if m['link_name'] == link_name] + if len(link_markers) < 2: + continue + + max_error = 0.0 + for i in range(len(link_markers)): + for j in range(i + 1, len(link_markers)): + m_i = link_markers[i] + m_j = link_markers[j] + + pos_i = compute_marker_world_position(m_i, link_transforms) + pos_j = compute_marker_world_position(m_j, link_transforms) + + dist_world = np.linalg.norm(pos_i - pos_j) + dist_local = np.linalg.norm(m_i['position_m'] - m_j['position_m']) + error = abs(dist_world - dist_local) + max_error = max(max_error, error) + + status = "✓" if max_error < 1.0 else "⚠" if max_error < 5.0 else "✗" + print(f" {link_name:10s}: max_error = {max_error:.3f} mm {status}") + + # Check 2: Inter-link X distances + if enabled_constraints['InterLinkXDistances'].enabled: + print("\n2. INTER-LINK X-DISTANCES") + arm1_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm1'] + ellbow_markers = [m for m in robot_markers.values() if m['link_name'] == 'Ellbow'] + + if len(arm1_markers) >= 1 and len(ellbow_markers) >= 1: + m_arm1 = arm1_markers[0] + m_ellbow = ellbow_markers[0] + + pos_arm1 = compute_marker_world_position(m_arm1, link_transforms) + pos_ellbow = compute_marker_world_position(m_ellbow, link_transforms) + + x_diff_world = pos_ellbow[0] - pos_arm1[0] + x_diff_ref = m_ellbow['position_m'][0] - m_arm1['position_m'][0] + error = abs(x_diff_world - x_diff_ref) + + status = "✓" if error < 1.0 else "⚠" if error < 5.0 else "✗" + print(f" Arm1 <-> Ellbow: error = {error:.3f} mm {status}") + + # Check 3: Arm2 sin(a) dependency + if enabled_constraints['Arm2SinADependency'].enabled: + print("\n3. ARM2 sin(a) DEPENDENCY (sanity check)") + arm2_markers = [m for m in robot_markers.values() if m['link_name'] == 'Arm2'] + if len(arm2_markers) >= 2: + # Check that markers with different Z values have different X spreads + a_rad = math.radians(robot_state['a']) + sin_a = math.sin(a_rad) + cos_a = math.cos(a_rad) + + z_variations = {} + for m in arm2_markers: + z_local = m['position_m'][2] + x_local = m['position_m'][0] + pos_world = compute_marker_world_position(m, link_transforms) + x_world = pos_world[0] + + # Expected: x_world = 90 + x_local * cos(a) - z_local * sin(a) + x_expected = 90 * (robot.get('renderingInfo', {}).get('metric', 'mm') == 'mm' and 0.09 or 0.09) + x_local * cos_a - z_local * sin_a + x_error = abs(x_world - x_expected) + + if z_local not in z_variations: + z_variations[z_local] = [] + z_variations[z_local].append(x_error) + + max_error = max(max(errors) for errors in z_variations.values()) if z_variations else 0.0 + status = "✓" if max_error < 5.0 else "⚠" if max_error < 10.0 else "⚠" + print(f" X-consistency with sin(a): max_error = {max_error:.3f} mm {status}") + print(f" (Note: this is a consistency check, not a hard constraint)") + + print("=" * 70) + def camera_position_world(rvec: np.ndarray, tvec: np.ndarray) -> np.ndarray: R, _ = cv2.Rodrigues(rvec) @@ -705,6 +875,16 @@ def main() -> None: } robot_markers = extract_markers(robot, scale) + + # Validate constraints + print("\n" + "=" * 70) + print("CONSTRAINT VALIDATION") + print("=" * 70) + enabled_constraints = validate_constraints(robot, robot_markers) + for constraint_name, result in enabled_constraints.items(): + print(result) + print("=" * 70) + views, observations = collect_views_and_observations(args.detections, robot_markers) camera_guesses = [] @@ -725,7 +905,7 @@ def main() -> None: progress['iter'] += 1 now = time.time() if progress['iter'] == 1 or now - progress['last_print'] >= 1.0: - res = residuals_for_parameters(xk, views, observations, robot_markers, robot, scale, default_state) + res = residuals_for_parameters(xk, views, observations, robot_markers, robot, scale, default_state, enabled_constraints) cost = 0.5 * float(np.dot(res, res)) delta_cost = None convergence = '' @@ -751,7 +931,7 @@ def main() -> None: result = least_squares( residuals_for_parameters, x0, - args=(views, observations, robot_markers, robot, scale, default_state), + args=(views, observations, robot_markers, robot, scale, default_state, enabled_constraints), jac='2-point', method='trf', loss='soft_l1', @@ -762,6 +942,10 @@ def main() -> None: robot_state, camera_params = unpack_parameters(result.x, len(views)) uncertainties = estimate_uncertainty(result, len(result.x)) + + # Print constraint sanity checks + link_transforms = compute_link_transforms(robot, robot_state, scale) + print_constraint_sanity_check(robot_state, robot_markers, link_transforms, robot, enabled_constraints) output = build_output(robot_state, uncertainties[:len(STATE_KEYS)], views, camera_params, observations, robot_markers, scale, robot, robot_json_path) diff --git a/pipeline/__pycache__/2_Multiview.cpython-311.pyc b/pipeline/__pycache__/2_Multiview.cpython-311.pyc index 4d7fddc..1c70390 100644 Binary files a/pipeline/__pycache__/2_Multiview.cpython-311.pyc and b/pipeline/__pycache__/2_Multiview.cpython-311.pyc differ diff --git a/pipeline/multiview_pose.json b/pipeline/multiview_pose.json index f40d99b..f01dfa0 100644 --- a/pipeline/multiview_pose.json +++ b/pipeline/multiview_pose.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-28T15:12:17.494654Z", + "created_utc": "2026-05-28T15:44:40.387206Z", "source_robot_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\robot.json", "source_detections": [ "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", @@ -9,28 +9,28 @@ ], "robot_pose": { "state": { - "x": 181.54725640332114, - "y": 58.52839894680379, - "z": -117.49574729476373, - "a": -109.04068037196633, - "b": 21.99999999999997, - "c": 90.9999999999968, - "e": 10.000000000002045 + "x": 178.4429017494112, + "y": 58.47337818356634, + "z": -115.44834336922801, + "a": -110.23287555471994, + "b": 21.99999999999879, + "c": 91.00000000000222, + "e": 10.000000000003752 }, "uncertainty": { - "x_mm": 1244.466529684963, - "y_mm": 7074.339663399324, - "z_mm": 820.6981657593474, - "a_deg": 826.28528886627, - "b_deg": 10766.558819701313, - "c_deg": 10766.563026961136, - "e_mm": 107665.71839050233 + "x_mm": 452.93520846643963, + "y_mm": 2505.6853087014742, + "z_mm": 479.7547548672694, + "a_deg": 419.0184635434338, + "b_deg": 10357.838151169784, + "c_deg": 10357.838358456424, + "e_mm": 103578.27625405855 }, "confidence": { - "x": 8.984736077953398e-55, - "y": 5.825485258915721e-308, - "z": 2.2778836127227612e-36, - "a": 1.3028243192541689e-36, + "x": 2.1343902596830898e-20, + "y": 1.5117142415373693e-109, + "z": 1.460547647110293e-21, + "a": 6.342483509852416e-19, "b": 0.0, "c": 0.0, "e": 0.36787944117144233 @@ -42,19 +42,19 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "camera_id": "cam1", "camera_position_world_m": [ - -67.15264946093049, - -145.95139032151744, - -88.26653224765123 + -152.34091569714903, + -19.013446299323782, + -99.72128351445228 ], "rvec": [ - -3.542038128451333, - -30.5589850821012, - 16.444347919278478 + -5.499131960772023, + -21.91270066095422, + 3.835322497331174 ], "tvec": [ - 1.483017282919796, - 7.509205723706149, - -183.14933761979546 + 1.5121559708775556, + 7.396415796967461, + -182.91147186295072 ], "intrinsics": { "camera_matrix": [ @@ -89,19 +89,19 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", "camera_id": "cam1", "camera_position_world_m": [ - 0.08505368964340965, - 0.2946432117677963, - -0.7157756836568655 + 0.08962448933807897, + 0.30899658581804224, + -0.6948843092613544 ], "rvec": [ - -0.5316255763965235, - -3.174734119797076, - -0.7980749872854376 + -0.523540707058038, + -3.160660993109504, + -0.8426789395152159 ], "tvec": [ - 0.17598061076211097, - 0.03209794584304647, - -0.7578813417585265 + 0.17310377758414208, + 0.03144977103054412, + -0.7452661514399899 ], "intrinsics": { "camera_matrix": [ @@ -136,19 +136,19 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", "camera_id": "cam1", "camera_position_world_m": [ - 0.19551444508455482, - -0.4496621583583861, - 0.7007419670032374 + 0.19930315742175841, + -0.4034279127468583, + 0.6690051405865579 ], "rvec": [ - -3.5782847330305145, - 0.5811345580146894, - 0.31790917187918544 + -3.515407873484386, + 0.6592488811642211, + 0.3554510183912642 ], "tvec": [ - -0.13076078659741264, - 0.0026732045097548752, - 0.8451956754988071 + -0.12629764596438484, + 0.0026714931553666757, + 0.7962948418902289 ], "intrinsics": { "camera_matrix": [ @@ -191,19 +191,19 @@ "size_m": 0.025, "observation_count": 3, "mean_confidence": 0.6997700579082148, - "mean_reprojection_error_px": 220.77947555807535, + "mean_reprojection_error_px": 219.98520262396713, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.5673043275049208, - "mean_reprojection_error_px": 583.5059207989476, + "mean_reprojection_error_px": 582.6928891559149, "corner_reprojection_errors_px": [ - 609.2234772782313, - 565.0260802933998, - 557.8015857749582, - 601.9725398492011 + 608.4008310831335, + 564.1978138064919, + 556.9944685718621, + 601.1784431621722 ] }, { @@ -211,12 +211,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", "confidence": 0.7813266383036261, - "mean_reprojection_error_px": 39.55489478242865, + "mean_reprojection_error_px": 39.955946109809304, "corner_reprojection_errors_px": [ - 48.88397493699652, - 61.30605038320363, - 46.048597197902666, - 1.980956611611768 + 50.05440600297249, + 62.06318313444874, + 46.054117736318254, + 1.6520775654977295 ] }, { @@ -224,12 +224,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c.png", "confidence": 0.7506792079160973, - "mean_reprojection_error_px": 39.27761109284978, + "mean_reprojection_error_px": 37.30677260617712, "corner_reprojection_errors_px": [ - 65.97074853665205, - 24.74479058079261, - 13.228233029506784, - 53.166672224447694 + 63.966234566185975, + 24.372791532782248, + 11.26324714586789, + 49.62481717987238 ] } ] @@ -245,19 +245,19 @@ "size_m": 0.025, "observation_count": 1, "mean_confidence": 0.6412317666518965, - "mean_reprojection_error_px": 214.33163264388395, + "mean_reprojection_error_px": 213.01123894247837, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.6412317666518965, - "mean_reprojection_error_px": 214.33163264388395, + "mean_reprojection_error_px": 213.01123894247837, "corner_reprojection_errors_px": [ - 237.47818589215711, - 202.2967964175736, - 191.68363751699303, - 225.86791074881205 + 236.1031649719927, + 200.91925610460427, + 190.4144522672059, + 224.6080824261106 ] } ] @@ -273,19 +273,19 @@ "size_m": 0.025, "observation_count": 2, "mean_confidence": 0.8108527003549935, - "mean_reprojection_error_px": 195.42303307205083, + "mean_reprojection_error_px": 198.10515794746527, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.7952557920267838, - "mean_reprojection_error_px": 205.66294162020296, + "mean_reprojection_error_px": 204.57188538155356, "corner_reprojection_errors_px": [ - 218.8179432625852, - 185.3722132441409, - 193.9241697940935, - 224.5374401799923 + 217.65412604361978, + 184.2181761177656, + 192.91255827135913, + 223.50268109346976 ] }, { @@ -293,12 +293,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", "confidence": 0.826449608683203, - "mean_reprojection_error_px": 185.1831245238987, + "mean_reprojection_error_px": 191.63843051337702, "corner_reprojection_errors_px": [ - 219.21341536613414, - 168.97047202229555, - 151.2474816881201, - 201.30112901904496 + 226.90990661141322, + 176.45008691276055, + 156.32935430702966, + 206.86437422230463 ] } ] @@ -314,19 +314,19 @@ "size_m": 0.025, "observation_count": 1, "mean_confidence": 0.6041252446922665, - "mean_reprojection_error_px": 396.6842335066294, + "mean_reprojection_error_px": 443.42359136317395, "observations": [ { "view_index": 2, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c.png", "confidence": 0.6041252446922665, - "mean_reprojection_error_px": 396.6842335066294, + "mean_reprojection_error_px": 443.42359136317395, "corner_reprojection_errors_px": [ - 396.3517608479836, - 374.63031408080843, - 399.6139298462295, - 416.1409292514962 + 448.5785815165172, + 422.5680699902232, + 440.44289571629525, + 462.10481822966005 ] } ] @@ -342,19 +342,19 @@ "size_m": 0.025, "observation_count": 1, "mean_confidence": 0.6280424706698967, - "mean_reprojection_error_px": 104.53888708998042, + "mean_reprojection_error_px": 104.44146786678962, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.6280424706698967, - "mean_reprojection_error_px": 104.53888708998042, + "mean_reprojection_error_px": 104.44146786678962, "corner_reprojection_errors_px": [ - 100.19696760041806, - 84.14272558467785, - 111.5985938652804, - 122.21726130954538 + 99.73569678834396, + 84.11026583409073, + 111.81629138739532, + 122.10361745732845 ] } ] @@ -370,19 +370,19 @@ "size_m": 0.025, "observation_count": 1, "mean_confidence": 0.33820423087105295, - "mean_reprojection_error_px": 267.0425486050223, + "mean_reprojection_error_px": 269.1974700827843, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.33820423087105295, - "mean_reprojection_error_px": 267.0425486050223, + "mean_reprojection_error_px": 269.1974700827843, "corner_reprojection_errors_px": [ - 248.43466760822997, - 272.69005756404255, - 285.6169240254765, - 261.42854522234035 + 250.50345115135508, + 274.79359034013294, + 287.8396527117673, + 263.6531861278821 ] } ] @@ -398,19 +398,19 @@ "size_m": 0.025, "observation_count": 1, "mean_confidence": 0.28724459014346065, - "mean_reprojection_error_px": 415.8751776130689, + "mean_reprojection_error_px": 418.6572411272094, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.28724459014346065, - "mean_reprojection_error_px": 415.8751776130689, + "mean_reprojection_error_px": 418.6572411272094, "corner_reprojection_errors_px": [ - 395.1459522897165, - 416.72497517179465, - 436.46281469338743, - 415.16696829737697 + 397.9342521865105, + 419.4901443591502, + 439.2360756416858, + 417.96849232149117 ] } ] @@ -426,19 +426,19 @@ "size_m": 0.025, "observation_count": 1, "mean_confidence": 0.27228561618555186, - "mean_reprojection_error_px": 363.40455932725575, + "mean_reprojection_error_px": 365.7887375890425, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.27228561618555186, - "mean_reprojection_error_px": 363.40455932725575, + "mean_reprojection_error_px": 365.7887375890425, "corner_reprojection_errors_px": [ - 346.0438581309408, - 367.42169729635515, - 381.0737741735404, - 359.07890770818653 + 348.36626075065936, + 369.7628063312705, + 383.5097638627369, + 361.51611941150327 ] } ] @@ -454,19 +454,19 @@ "size_m": 0.025, "observation_count": 1, "mean_confidence": 0.35596573288593486, - "mean_reprojection_error_px": 321.69325248463235, + "mean_reprojection_error_px": 324.2590328208219, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.35596573288593486, - "mean_reprojection_error_px": 321.69325248463235, + "mean_reprojection_error_px": 324.2590328208219, "corner_reprojection_errors_px": [ - 299.50652112481214, - 323.01445781467953, - 343.8145434727812, - 320.4374875262566 + 302.09103568606685, + 325.56745248682427, + 346.3582043745394, + 323.01943873585714 ] } ] @@ -475,26 +475,26 @@ "marker_id": 198, "link_name": "Arm1", "position_world_m": [ - 0.18154725640332114, - -0.05368067525881935, - 0.15473650216984092 + 0.1784429017494112, + -0.05382924293825046, + 0.15468488162937843 ], "size_m": 0.025, "observation_count": 2, "mean_confidence": 0.16652042240877096, - "mean_reprojection_error_px": 176.61396206576376, + "mean_reprojection_error_px": 173.03325228464936, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.20150745250271476, - "mean_reprojection_error_px": 249.4432410246182, + "mean_reprojection_error_px": 247.8149724280193, "corner_reprojection_errors_px": [ - 275.2716341467862, - 247.12753771344126, - 224.03573860709332, - 251.33805363115204 + 273.59743355359444, + 245.42488018268014, + 222.46143771784855, + 249.77613825795413 ] }, { @@ -502,12 +502,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", "confidence": 0.13153339231482716, - "mean_reprojection_error_px": 103.78468310690936, + "mean_reprojection_error_px": 98.25153214127941, "corner_reprojection_errors_px": [ - 92.57065651057769, - 103.81498423159927, - 124.48400230916597, - 94.26908937629445 + 86.59176111374053, + 97.5474468583387, + 120.03541185467505, + 88.83150873836338 ] } ] @@ -516,26 +516,26 @@ "marker_id": 229, "link_name": "Arm1", "position_world_m": [ - 0.18154725640332114, - -0.10066750491630294, - 0.23149741565280188 + 0.1784429017494112, + -0.100889763924023, + 0.23140063858026605 ], "size_m": 0.025, "observation_count": 2, "mean_confidence": 0.2274747191640703, - "mean_reprojection_error_px": 114.65083791461562, + "mean_reprojection_error_px": 110.21276026061363, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.26810902547334975, - "mean_reprojection_error_px": 157.56342751488188, + "mean_reprojection_error_px": 155.73254773328267, "corner_reprojection_errors_px": [ - 182.03382946831127, - 158.99106757645583, - 133.31281060220186, - 155.91600241255856 + 180.08971330368811, + 157.10232370463987, + 131.63039756460225, + 154.10775636020045 ] }, { @@ -543,12 +543,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", "confidence": 0.18684041285479083, - "mean_reprojection_error_px": 71.73824831434936, + "mean_reprojection_error_px": 64.69297278794461, "corner_reprojection_errors_px": [ - 62.57648563021246, - 73.24833068956802, - 93.62951004804361, - 57.49866688957334 + 54.16045919019677, + 65.65659031871526, + 89.34107228321712, + 49.613769359649325 ] } ] @@ -557,9 +557,9 @@ "marker_id": 242, "link_name": "Arm1", "position_world_m": [ - 0.18154725640332114, - -0.1603704376252726, - 0.19495210369698132 + 0.1784429017494112, + -0.1605575748858245, + 0.19479801114688738 ], "size_m": 0.025, "observation_count": 0, @@ -571,26 +571,26 @@ "marker_id": 243, "link_name": "Arm1", "position_world_m": [ - 0.18154725640332114, - -0.14879162724869807, - 0.24307622602937645 + 0.1784429017494112, + -0.14902498312161308, + 0.24293323034447747 ], "size_m": 0.025, "observation_count": 3, "mean_confidence": 0.9174550709990235, - "mean_reprojection_error_px": 43.36361596374159, + "mean_reprojection_error_px": 44.17934855555228, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.8899728634608616, - "mean_reprojection_error_px": 80.72636248080838, + "mean_reprojection_error_px": 78.81046188174007, "corner_reprojection_errors_px": [ - 103.11767577441192, - 73.99244264213212, - 52.960515033680814, - 92.83481647300867 + 101.13197340765323, + 72.09114541671448, + 50.99718387664307, + 91.0215448259495 ] }, { @@ -598,12 +598,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", "confidence": 0.9132502955127223, - "mean_reprojection_error_px": 17.65321921352932, + "mean_reprojection_error_px": 16.837449190455786, "corner_reprojection_errors_px": [ - 23.787325274905296, - 20.61800212862162, - 10.499732762361031, - 15.707816688229324 + 14.377732738720587, + 19.045826627822404, + 19.362443297536196, + 14.563794097743955 ] }, { @@ -611,12 +611,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c.png", "confidence": 0.9491420540234864, - "mean_reprojection_error_px": 31.711266196887063, + "mean_reprojection_error_px": 36.89013459446098, "corner_reprojection_errors_px": [ - 37.923084099569614, - 0.2134084559141012, - 42.92388177593928, - 45.78469045612526 + 44.535439947724775, + 1.0820871934520055, + 48.70513064720212, + 53.23788058946502 ] } ] @@ -625,7 +625,7 @@ "marker_id": 244, "link_name": "Ellbow", "position_world_m": [ - 0.30654725640332114, + 0.3034429017494112, 0.0, 0.0 ], @@ -639,9 +639,9 @@ "marker_id": 245, "link_name": "Ellbow", "position_world_m": [ - 0.2715472564033211, - 0.029990577828141386, - -0.018043426546368473 + 0.2684429017494112, + 0.02934513796721045, + -0.019075190108761277 ], "size_m": 0.025, "observation_count": 0, @@ -653,26 +653,26 @@ "marker_id": 246, "link_name": "Ellbow", "position_world_m": [ - 0.2715472564033211, - -0.029990577828141386, - 0.018043426546368473 + 0.2684429017494112, + -0.02934513796721045, + 0.019075190108761277 ], "size_m": 0.025, "observation_count": 3, "mean_confidence": 0.6792447690577089, - "mean_reprojection_error_px": 82.08966057312311, + "mean_reprojection_error_px": 75.53581325353834, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.8015179238063419, - "mean_reprojection_error_px": 130.56180963001174, + "mean_reprojection_error_px": 130.96780196095426, "corner_reprojection_errors_px": [ - 131.5768861165912, - 148.78099370016497, - 133.10414547000457, - 108.78521323328613 + 131.52551717948674, + 149.219632082114, + 133.91939902794635, + 109.2066595542699 ] }, { @@ -680,12 +680,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", "confidence": 0.7581700566520715, - "mean_reprojection_error_px": 38.83288809109914, + "mean_reprojection_error_px": 40.470485652838775, "corner_reprojection_errors_px": [ - 49.917614687022564, - 21.338048175631457, - 40.862399000804004, - 43.213490500938555 + 54.08557804238714, + 23.05261314724495, + 38.690970054967124, + 46.052781366755866 ] }, { @@ -693,12 +693,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c.png", "confidence": 0.4780463267147134, - "mean_reprojection_error_px": 76.8742839982585, + "mean_reprojection_error_px": 55.16915214682197, "corner_reprojection_errors_px": [ - 35.05794226352506, - 98.03823312377735, - 122.08217872702849, - 52.31878187870311 + 4.544326976345962, + 67.214794241062, + 103.3039176555024, + 45.61356971437756 ] } ] @@ -707,26 +707,26 @@ "marker_id": 247, "link_name": "Ellbow", "position_world_m": [ - 0.23404725640332114, - -0.029990577828141386, - 0.018043426546368473 + 0.23094290174941118, + -0.02934513796721045, + 0.019075190108761277 ], "size_m": 0.025, "observation_count": 3, "mean_confidence": 0.7117000257529918, - "mean_reprojection_error_px": 80.52058124342345, + "mean_reprojection_error_px": 71.76825320561402, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.8796777163094818, - "mean_reprojection_error_px": 109.47051531989443, + "mean_reprojection_error_px": 109.30571474994146, "corner_reprojection_errors_px": [ - 125.73431013214108, - 126.73685991781507, - 97.3154475708235, - 88.09544365879812 + 125.10305772921419, + 126.687286672494, + 97.67977416118754, + 87.7527404368701 ] }, { @@ -734,12 +734,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", "confidence": 0.7448005120854795, - "mean_reprojection_error_px": 40.6548721647999, + "mean_reprojection_error_px": 41.53123348024193, "corner_reprojection_errors_px": [ - 61.62678961364609, - 49.84332916101471, - 31.2644086226518, - 19.884961261886986 + 62.91946766510497, + 50.39956997542899, + 30.245119355881712, + 22.56077692455205 ] }, { @@ -747,12 +747,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c.png", "confidence": 0.5106218488640142, - "mean_reprojection_error_px": 91.436356245576, + "mean_reprojection_error_px": 64.46781138665867, "corner_reprojection_errors_px": [ - 79.2467696422458, - 112.40480811674038, - 113.18153184339867, - 60.91231537991913 + 53.21697434340821, + 81.71744187395875, + 89.31098122106415, + 33.62584810820357 ] } ] @@ -761,26 +761,26 @@ "marker_id": 124, "link_name": "Arm2", "position_world_m": [ - 0.19296563528466518, - -0.14125000632909357, - -0.1705991100086782 + 0.1905471840415046, + -0.14689057815962717, + -0.16571856986506908 ], "size_m": 0.025, "observation_count": 2, "mean_confidence": 0.4106676690676095, - "mean_reprojection_error_px": 118.70435848549427, + "mean_reprojection_error_px": 110.73873242579455, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.34091855704160245, - "mean_reprojection_error_px": 136.41410315507122, + "mean_reprojection_error_px": 135.68416308738642, "corner_reprojection_errors_px": [ - 122.8029119076584, - 105.17647879194196, - 150.3388262656519, - 167.33819565503265 + 122.09592215917837, + 104.54432626694273, + 149.5516106827851, + 166.54479324063954 ] }, { @@ -788,12 +788,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", "confidence": 0.4804167810936165, - "mean_reprojection_error_px": 100.99461381591732, + "mean_reprojection_error_px": 85.79330176420268, "corner_reprojection_errors_px": [ - 94.61023538629438, - 62.3507552530323, - 115.30488690538117, - 131.71257771896146 + 80.25443845468878, + 44.769514846082515, + 101.1257798229199, + 117.02347393311956 ] } ] @@ -802,26 +802,26 @@ "marker_id": 122, "link_name": "Arm2", "position_world_m": [ - 0.20990587185770623, - -0.0854394397428592, - -0.1609965560685589 + 0.2065917439726603, + -0.09049216814460652, + -0.1582492027972934 ], "size_m": 0.025, "observation_count": 3, "mean_confidence": 0.5690911450460799, - "mean_reprojection_error_px": 115.4296640273784, + "mean_reprojection_error_px": 112.17658015146829, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.18665602922528673, - "mean_reprojection_error_px": 192.69670051979531, + "mean_reprojection_error_px": 193.21424613028685, "corner_reprojection_errors_px": [ - 162.8594058395046, - 189.31139967251238, - 220.7675955032362, - 197.8484010639281 + 163.5154782260392, + 189.8197178899714, + 221.16013279196892, + 198.36165561316793 ] }, { @@ -829,12 +829,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", "confidence": 0.9456847621099602, - "mean_reprojection_error_px": 41.758821983395634, + "mean_reprojection_error_px": 59.619753741849934, "corner_reprojection_errors_px": [ - 42.20929173703953, - 73.24612974199405, - 34.08501995181812, - 17.49484650273085 + 62.57446736991388, + 94.35842345190635, + 52.23720146118015, + 29.308922684399352 ] }, { @@ -842,12 +842,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c.png", "confidence": 0.5749326438029929, - "mean_reprojection_error_px": 111.8334695789442, + "mean_reprojection_error_px": 83.69574058226807, "corner_reprojection_errors_px": [ - 122.40335309391429, - 155.4380168814154, - 101.35617142524032, - 68.13633691520678 + 95.82678742449872, + 125.24546180132528, + 68.46920157539058, + 45.24151152785769 ] } ] @@ -856,9 +856,9 @@ "marker_id": 218, "link_name": "Arm2", "position_world_m": [ - 0.1701288775219771, - -0.029389256152276798, - -0.113026068880316 + 0.16633861945731776, + -0.03350621972608657, + -0.1118025920534069 ], "size_m": 0.025, "observation_count": 0, @@ -870,26 +870,26 @@ "marker_id": 101, "link_name": "Arm2", "position_world_m": [ - 0.15007697358736016, - -0.08069728605993415, - -0.16384960885532981 + 0.146660650151536, + -0.08689676917303694, + -0.16058631632445308 ], "size_m": 0.025, "observation_count": 1, "mean_confidence": 0.3325004465415643, - "mean_reprojection_error_px": 268.2779246523214, + "mean_reprojection_error_px": 267.5418618263792, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.3325004465415643, - "mean_reprojection_error_px": 268.2779246523214, + "mean_reprojection_error_px": 267.5418618263792, "corner_reprojection_errors_px": [ - 252.5657721019858, - 236.30225155702897, - 285.07051528039955, - 299.1731596698715 + 251.71309778665415, + 235.71974142034514, + 284.44360570880553, + 298.291002389712 ] } ] @@ -898,26 +898,26 @@ "marker_id": 102, "link_name": "Arm2", "position_world_m": [ - 0.16622582371954672, - -0.1207918742144217, - -0.13972724080967133 + 0.1637795636789253, + -0.12583826165265122, + -0.13527321767766717 ], "size_m": 0.025, "observation_count": 3, "mean_confidence": 0.8473641170835915, - "mean_reprojection_error_px": 134.3212111638231, + "mean_reprojection_error_px": 135.5185983259116, "observations": [ { "view_index": 0, "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a.png", "confidence": 0.9494437061622057, - "mean_reprojection_error_px": 275.82196003309537, + "mean_reprojection_error_px": 275.69603657656097, "corner_reprojection_errors_px": [ - 239.6365759195386, - 266.3494158086631, - 310.221043133295, - 287.0808052708849 + 239.57198324805327, + 266.35716033620514, + 310.0207932359541, + 286.8342094860313 ] }, { @@ -925,12 +925,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1b.png", "confidence": 0.8913851020933449, - "mean_reprojection_error_px": 69.70421030419618, + "mean_reprojection_error_px": 62.952236808026484, "corner_reprojection_errors_px": [ - 43.54332574941685, - 33.67288896070401, - 97.392314014777, - 104.20831249188686 + 32.059770721250835, + 38.09936127795048, + 90.48302392022927, + 91.16679131267536 ] }, { @@ -938,12 +938,12 @@ "source_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c_aruco_detection.json", "image_file": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1c.png", "confidence": 0.7012635429952238, - "mean_reprojection_error_px": 57.43746315417774, + "mean_reprojection_error_px": 67.90752159314737, "corner_reprojection_errors_px": [ - 75.89223182434904, - 45.05384333908305, - 33.595730720813556, - 75.20804673246533 + 102.72093538416912, + 41.99761561398122, + 26.866949386310086, + 100.04458598812904 ] } ] @@ -952,9 +952,9 @@ "marker_id": 219, "link_name": "Arm2", "position_world_m": [ - 0.1701288775219771, - -0.08455058873688898, - -0.20471154966920532 + 0.16633861945731776, + -0.09182180091572817, + -0.201514870981736 ], "size_m": 0.025, "observation_count": 0, diff --git a/pipeline/multiview_pose_summary.json b/pipeline/multiview_pose_summary.json index bfc954b..776a5f9 100644 --- a/pipeline/multiview_pose_summary.json +++ b/pipeline/multiview_pose_summary.json @@ -1,31 +1,31 @@ { - "final_cost": 25086.49759096419, + "final_cost": 24986.21700952237, "status": 0, "message": "The maximum number of function evaluations is exceeded.", "robot_state": { "state": { - "x": 100.74147204793623, - "y": 29.650679871841962, - "z": -35.519338413527834, - "a": -119.76253895286006, - "b": 22.000000000000124, - "c": 91.00000000000006, - "e": 9.999999999999991 + "x": 100.65052085564044, + "y": 29.661249073864987, + "z": -35.948789524024555, + "a": -119.85307495241203, + "b": 21.99999999999959, + "c": 90.99999999999991, + "e": 10.000000000000025 }, "uncertainty": { - "x_mm": 5958.291819057341, - "y_mm": 1161.4246555312698, - "z_mm": 548.5614212936815, - "a_deg": 3375.9445110397996, - "b_deg": 13762.367585907954, - "c_deg": 13762.368814943879, - "e_mm": 137623.68210441121 + "x_mm": 1490.1455410993876, + "y_mm": 429.51650769405427, + "z_mm": 477.27281993275335, + "a_deg": 3533.703361743133, + "b_deg": 13152.589314453906, + "c_deg": 13152.589314528996, + "e_mm": 131525.9153573403 }, "confidence": { - "x": 1.7166198945166287e-259, - "y": 3.630513831255408e-51, - "z": 1.5006526335068334e-24, - "a": 2.424335742250214e-147, + "x": 1.922212631331247e-65, + "y": 2.219908541429891e-19, + "z": 1.8719954726562647e-21, + "a": 3.4136023686230135e-154, "b": 0.0, "c": 0.0, "e": 0.36787944117144233 diff --git a/pipeline/render_1a_aruco_detection.json b/pipeline/render_1a_aruco_detection.json index 36ec0d1..a242210 100644 --- a/pipeline/render_1a_aruco_detection.json +++ b/pipeline/render_1a_aruco_detection.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-28T15:11:26Z", + "created_utc": "2026-05-28T15:43:43Z", "vision_config": { "MarkerType": "DICT_4X4_250", "MarkerSize": 0.025 @@ -46,7 +46,7 @@ }, "detections": [ { - "observation_id": "a0864373-2016-4c0c-be4d-c8b66b185bd7", + "observation_id": "713817fc-5f5b-486d-850a-2b1915ab7eac", "type": "aruco", "marker_id": 102, "marker_size_m": 0.025, @@ -100,7 +100,7 @@ "confidence": 0.9494437061622057 }, { - "observation_id": "2d237a4b-33db-4a97-aad0-2b69922e5c27", + "observation_id": "cc667670-1b39-4632-8f1c-1a5fdf0e0c7e", "type": "aruco", "marker_id": 243, "marker_size_m": 0.025, @@ -154,7 +154,7 @@ "confidence": 0.8899728634608616 }, { - "observation_id": "a01227d1-d980-435e-ad0f-453789a6e941", + "observation_id": "0cd34a97-e5d7-4bbf-aac9-a4e203b31583", "type": "aruco", "marker_id": 210, "marker_size_m": 0.025, @@ -208,7 +208,7 @@ "confidence": 0.5673043275049208 }, { - "observation_id": "8044b2a7-1af6-457d-b112-8566c669e961", + "observation_id": "5632f4b1-0db1-4a98-b8d3-9ebbbb4b126f", "type": "aruco", "marker_id": 247, "marker_size_m": 0.025, @@ -262,7 +262,7 @@ "confidence": 0.8796777163094818 }, { - "observation_id": "dac561f0-1939-438d-9ed1-5d057d5132dd", + "observation_id": "75ae283a-9ba7-43bc-bb54-ba44e24e235f", "type": "aruco", "marker_id": 246, "marker_size_m": 0.025, @@ -316,7 +316,7 @@ "confidence": 0.8015179238063419 }, { - "observation_id": "33c3c11c-f7d2-4038-ac2c-e4332bcf5b79", + "observation_id": "7c280cd2-7b94-476a-be3e-7d89e6e35ed3", "type": "aruco", "marker_id": 101, "marker_size_m": 0.025, @@ -370,7 +370,7 @@ "confidence": 0.3325004465415643 }, { - "observation_id": "3ae8ec72-f806-457c-8c60-403428368c0a", + "observation_id": "2e554970-1749-4924-ac98-3ac4debec51b", "type": "aruco", "marker_id": 215, "marker_size_m": 0.025, @@ -424,7 +424,7 @@ "confidence": 0.7952557920267838 }, { - "observation_id": "755f017d-cb90-461d-bd57-25768e592696", + "observation_id": "cc766bc2-4f75-4520-baf3-e10c62f6c25d", "type": "aruco", "marker_id": 124, "marker_size_m": 0.025, @@ -478,7 +478,7 @@ "confidence": 0.34091855704160245 }, { - "observation_id": "45854ae6-7ba9-4906-87a6-2c7d9356cb85", + "observation_id": "c7cc54fc-982b-46e8-b176-82eefba18404", "type": "aruco", "marker_id": 229, "marker_size_m": 0.025, @@ -532,7 +532,7 @@ "confidence": 0.26810902547334975 }, { - "observation_id": "de3abf0b-4ae2-4fee-9215-2039b0f5e3da", + "observation_id": "7cd2ae3d-740e-4005-a8b8-b23b0ea0082a", "type": "aruco", "marker_id": 122, "marker_size_m": 0.025, @@ -586,7 +586,7 @@ "confidence": 0.18665602922528673 }, { - "observation_id": "5577fb36-2186-41f8-8fbf-40266f9e767c", + "observation_id": "95fcb10e-a4e9-4d43-8950-8d0523fe95aa", "type": "aruco", "marker_id": 198, "marker_size_m": 0.025, @@ -640,7 +640,7 @@ "confidence": 0.20150745250271476 }, { - "observation_id": "54aec13c-2b54-49d8-a9c6-e873eb94dfef", + "observation_id": "e14fdb7d-e877-4a87-9e58-430ac0f56f18", "type": "aruco", "marker_id": 211, "marker_size_m": 0.025, @@ -694,7 +694,7 @@ "confidence": 0.6412317666518965 }, { - "observation_id": "4cf08f15-d8f2-416d-8397-8a68f564d0a8", + "observation_id": "7a8a865f-1251-4024-9255-278cb4cb527f", "type": "aruco", "marker_id": 208, "marker_size_m": 0.025, @@ -748,7 +748,7 @@ "confidence": 0.6280424706698967 }, { - "observation_id": "72d6524a-3710-46b2-b036-5031b7d2e648", + "observation_id": "d920e29d-6dd3-41f5-affb-0d25e5bdb1f7", "type": "aruco", "marker_id": 217, "marker_size_m": 0.025, @@ -802,7 +802,7 @@ "confidence": 0.35596573288593486 }, { - "observation_id": "160f705f-87e0-41e2-90f6-b39252bff719", + "observation_id": "4024cff0-440d-4688-add4-aaef71fd8566", "type": "aruco", "marker_id": 206, "marker_size_m": 0.025, @@ -856,7 +856,7 @@ "confidence": 0.33820423087105295 }, { - "observation_id": "03b79b60-9fb5-4aa8-82b6-303911389999", + "observation_id": "7019c1d8-7fcf-44ef-8ea5-407577eff29c", "type": "aruco", "marker_id": 205, "marker_size_m": 0.025, @@ -910,7 +910,7 @@ "confidence": 0.28724459014346065 }, { - "observation_id": "bc11412b-140e-48b9-9c27-aed1d54bd4b2", + "observation_id": "17746037-a944-46b0-a817-efcd1d0fddb5", "type": "aruco", "marker_id": 207, "marker_size_m": 0.025, diff --git a/pipeline/render_1a_aruco_detection_camera_pose.json b/pipeline/render_1a_aruco_detection_camera_pose.json deleted file mode 100644 index c3d174e..0000000 --- a/pipeline/render_1a_aruco_detection_camera_pose.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "source_detection_json": "C:\\Users\\kech\\SynologyDrive\\2026-AppServer-AppRobot\\appRobotRendering\\pipeline\\render_1a_aruco_detection.json", - "camera_pose": { - "camera_position_world_mm": [ - -170.9856733813686, - -471.25256740269396, - 878.0637115557477 - ], - "rotation_matrix_world_to_camera": [ - [ - 0.6349401350180643, - -0.7720226356185085, - 0.028845710875162883 - ], - [ - -0.5994288656515463, - -0.5158601484722065, - -0.6120239719503914 - ], - [ - 0.48737671258169724, - 0.3713076316356623, - -0.7903129650475013 - ] - ], - "rotation_matrix_camera_to_world": [ - [ - 0.6349401350180643, - -0.5994288656515463, - 0.48737671258169724 - ], - [ - -0.7720226356185085, - -0.5158601484722065, - 0.3713076316356623 - ], - [ - 0.028845710875162883, - -0.6120239719503914, - -0.7903129650475013 - ] - ], - "rvec": [ - 2.291386890593113, - -1.0684818045197042, - 0.4021828449915483 - ], - "tvec": [ - -280.5803545388054, - 191.8018727459298, - 952.2592454759357 - ] - }, - "reprojection_error_px": { - "mean": 2.4146498455755063, - "max": 4.819015530727733, - "per_marker": { - "210": 2.3216790986770164, - "215": 2.074953107734691, - "211": 4.819015530727733, - "208": 1.4794063810568414, - "217": 1.782847281148554, - "206": 2.714840043046132, - "205": 2.5310207449984325, - "207": 1.593436577214649 - } - } -} \ No newline at end of file diff --git a/pipeline/render_1a_aruco_detection_camera_pose_debug.png b/pipeline/render_1a_aruco_detection_camera_pose_debug.png deleted file mode 100644 index 7976699..0000000 Binary files a/pipeline/render_1a_aruco_detection_camera_pose_debug.png and /dev/null differ diff --git a/pipeline/render_1b_aruco_detection.json b/pipeline/render_1b_aruco_detection.json index 820bd35..5380d2c 100644 --- a/pipeline/render_1b_aruco_detection.json +++ b/pipeline/render_1b_aruco_detection.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-28T15:11:26Z", + "created_utc": "2026-05-28T15:43:43Z", "vision_config": { "MarkerType": "DICT_4X4_250", "MarkerSize": 0.025 @@ -46,7 +46,7 @@ }, "detections": [ { - "observation_id": "5f47acb3-66c2-48ba-b83b-d8e07aa2f6ec", + "observation_id": "b47ae404-2374-4364-bddc-c3e6282f9754", "type": "aruco", "marker_id": 102, "marker_size_m": 0.025, @@ -100,7 +100,7 @@ "confidence": 0.8913851020933449 }, { - "observation_id": "4d7aea08-c7e4-45a9-8fba-c738360a4a09", + "observation_id": "5643f91d-1fc0-43db-b40b-78ef116132a8", "type": "aruco", "marker_id": 124, "marker_size_m": 0.025, @@ -154,7 +154,7 @@ "confidence": 0.4804167810936165 }, { - "observation_id": "3675fbfb-7387-4ab7-8cdd-c581dbb46a48", + "observation_id": "eb068542-bc32-4241-9f94-ae93cba29146", "type": "aruco", "marker_id": 243, "marker_size_m": 0.025, @@ -208,7 +208,7 @@ "confidence": 0.9132502955127223 }, { - "observation_id": "f430fa70-8024-4ea7-9318-ad33908e0622", + "observation_id": "98da437d-8a22-4a73-8075-137b743bca43", "type": "aruco", "marker_id": 122, "marker_size_m": 0.025, @@ -262,7 +262,7 @@ "confidence": 0.9456847621099602 }, { - "observation_id": "3351b253-537e-4499-8114-52e7873706c4", + "observation_id": "f0ec764f-dbdf-4170-8cff-c3f5c940e82b", "type": "aruco", "marker_id": 247, "marker_size_m": 0.025, @@ -316,7 +316,7 @@ "confidence": 0.7448005120854795 }, { - "observation_id": "d39337f3-7a27-4ce7-adf0-24fbe9ac65ea", + "observation_id": "bddd6015-4815-41b2-bd83-dd9acce3a41b", "type": "aruco", "marker_id": 246, "marker_size_m": 0.025, @@ -370,7 +370,7 @@ "confidence": 0.7581700566520715 }, { - "observation_id": "f3bd397e-3c02-4645-b43a-3f292bdf29fa", + "observation_id": "6bb1f556-4a03-4bf1-90ce-59aedab7b2ee", "type": "aruco", "marker_id": 215, "marker_size_m": 0.025, @@ -424,7 +424,7 @@ "confidence": 0.826449608683203 }, { - "observation_id": "e76f83e2-0558-4588-bed4-de9ba1644b18", + "observation_id": "dd82dba6-3cea-4e60-b64a-6ad94127dd37", "type": "aruco", "marker_id": 210, "marker_size_m": 0.025, @@ -478,7 +478,7 @@ "confidence": 0.7813266383036261 }, { - "observation_id": "36a7eaf1-6608-450c-90c2-6a8284457c88", + "observation_id": "ed953a44-f516-4275-bc07-b6857fe8f8ee", "type": "aruco", "marker_id": 229, "marker_size_m": 0.025, @@ -532,7 +532,7 @@ "confidence": 0.18684041285479083 }, { - "observation_id": "18049602-5f59-48b6-914b-cefe7203fe3b", + "observation_id": "27bccaa2-ec68-4f8b-991b-585a270ca491", "type": "aruco", "marker_id": 198, "marker_size_m": 0.025, diff --git a/pipeline/render_1c_aruco_detection.json b/pipeline/render_1c_aruco_detection.json index 35cfe7d..4fe7797 100644 --- a/pipeline/render_1c_aruco_detection.json +++ b/pipeline/render_1c_aruco_detection.json @@ -1,6 +1,6 @@ { "schema_version": "1.0", - "created_utc": "2026-05-28T15:11:27Z", + "created_utc": "2026-05-28T15:43:44Z", "vision_config": { "MarkerType": "DICT_4X4_250", "MarkerSize": 0.025 @@ -46,7 +46,7 @@ }, "detections": [ { - "observation_id": "2dd90714-6c72-4eef-add7-476c5f768882", + "observation_id": "981a123d-7560-4fbe-93f1-d47980472b76", "type": "aruco", "marker_id": 102, "marker_size_m": 0.025, @@ -100,7 +100,7 @@ "confidence": 0.7012635429952238 }, { - "observation_id": "2b3b1621-eabd-4e73-8638-4830ff614dca", + "observation_id": "7676c338-2b2b-4bdb-864d-b6839291742b", "type": "aruco", "marker_id": 122, "marker_size_m": 0.025, @@ -154,7 +154,7 @@ "confidence": 0.5749326438029929 }, { - "observation_id": "c87294de-3f5e-4ecd-b7ad-1665989bc0ae", + "observation_id": "1476f720-1d72-4d94-b24b-b02e5e2d1a76", "type": "aruco", "marker_id": 243, "marker_size_m": 0.025, @@ -208,7 +208,7 @@ "confidence": 0.9491420540234864 }, { - "observation_id": "34650367-22d5-4d90-9a88-282957232989", + "observation_id": "f1bcb96e-0cf8-4c69-a4c1-fbeb03650fa2", "type": "aruco", "marker_id": 246, "marker_size_m": 0.025, @@ -262,7 +262,7 @@ "confidence": 0.4780463267147134 }, { - "observation_id": "e1603207-bb10-4f2c-9dd8-353447302ecf", + "observation_id": "a8bf2494-ddd8-4bf6-b87d-42182112e4e3", "type": "aruco", "marker_id": 247, "marker_size_m": 0.025, @@ -316,7 +316,7 @@ "confidence": 0.5106218488640142 }, { - "observation_id": "bbb6f5cd-12a4-4078-9f2b-d1c7160eb5f4", + "observation_id": "642b867d-25d1-4407-9011-f7a62feed435", "type": "aruco", "marker_id": 214, "marker_size_m": 0.025, @@ -370,7 +370,7 @@ "confidence": 0.6041252446922665 }, { - "observation_id": "c88f0aac-ae92-4559-9469-8ae96275d717", + "observation_id": "623e960d-2058-4672-b06c-5316a5861158", "type": "aruco", "marker_id": 210, "marker_size_m": 0.025, diff --git a/pipeline/run.bat b/pipeline/run_pipeline.bat similarity index 100% rename from pipeline/run.bat rename to pipeline/run_pipeline.bat