From f7358cea8db792ea1db61137672394e95aa4c72a Mon Sep 17 00:00:00 2001 From: chk <79915315+ChKendel@users.noreply.github.com> Date: Thu, 4 Jun 2026 13:54:02 +0200 Subject: [PATCH] vor dem Start von callibrate --- data/robot/robot.json | 2438 +++---------------------------- doc/callibrate_scene_roadmap.md | 220 +++ 2 files changed, 452 insertions(+), 2206 deletions(-) create mode 100644 doc/callibrate_scene_roadmap.md diff --git a/data/robot/robot.json b/data/robot/robot.json index b9b760c..ac293ab 100644 --- a/data/robot/robot.json +++ b/data/robot/robot.json @@ -1,94 +1,27 @@ { - "coordinateSystem": { - "handedness": "right", - "x": "right", - "y": "backward", - "z": "up" - }, - "units": { - "length": "mm", - "rotation": "degree" - }, - "vision_config": { - "MarkerType": "DICT_4X4_250", - "MarkerSize": 0.025 - }, + "coordinateSystem": {"handedness": "right", "x": "right", "y": "backward", "z": "up"}, + "units": {"length": "mm", "rotation": "degree"}, + "vision_config": {"MarkerType": "DICT_4X4_250", "MarkerSize": 0.025}, "renderingInfo": { "width": 1280, "height": 720, - "renderDefaults": { - "width": 1280, - "height": 720, - "dofFStop": 11 - }, - "cameraPosition__1": [ - -10, - -800, - 500 - ], - "cameraPosition__2": [ - -500, - 300, - 1200 - ], - "cameraPosition__3": [ - -200, - -900, - 200 - ], - "cameraPosition__4": [ - 1200, - 200, - 300 - ], - "cameraPosition_a": [ - -300, - -800, - 500 - ], - "cameraPosition": [ - -200, - 200, - 1400 - ], - "cameraPosition_c": [ - 600, - -500, - 600 - ], - "cameraTarget": [ - 200, - -200, - 180 - ], - "cameraUpVector": [ - 0, - 0, - 1 - ], - "lightPosition": [ - -500, - -500, - 500 - ], - "lightTarget": [ - 0, - 0, - 0 - ], - "lightUpVector": [ - 0, - 0, - 1 - ], + "renderDefaults": {"width": 1280, "height": 720, "dofFStop": 11}, + "cameraPosition__1": [-10, -800, 500], + "cameraPosition__2": [-500, 300, 1200], + "cameraPosition__3": [-200, -900, 200], + "cameraPosition__4": [1200, 200, 300], + "cameraPosition_a": [-300, -800, 500], + "cameraPosition": [-200, 200, 1400], + "cameraPosition_c": [600, -500, 600], + "cameraTarget": [200, -200, 180], + "cameraUpVector": [0, 0, 1], + "lightPosition": [-500, -500, 500], + "lightTarget": [0, 0, 0], + "lightUpVector": [0, 0, 1], "metric": "mm", "showSkeleton": true, "showMarkers": true, - "backgroundColor": [ - 0.7, - 0.85, - 1.0 - ], + "backgroundColor": [0.7, 0.85, 1.0], "backgroundStrength": 0.2, "sunEnergy": 0.35, "areaEnergy": 120, @@ -106,10 +39,7 @@ "motionBlurMaxPx": 5.5, "focalErrorPct": 0.5, "principalErrorPx": 3.0, - "residualDistortion": [ - 0.02, - -0.01 - ], + "residualDistortion": [0.02, -0.01], "localizedBlur": false, "localizedBlurStrength": 0.15, "vignette": true, @@ -119,149 +49,28 @@ "lensDistortion": true, "lensDistortionStrength": 0.002, "materials": { - "wood": { - "baseColor": [ - 0.72, - 0.52, - 0.33 - ], - "roughness": 0.85, - "metallic": 0.0 - }, - "plaWhite": { - "baseColor": [ - 0.95, - 0.95, - 0.95 - ], - "roughness": 0.45, - "metallic": 0.0 - }, - "steel": { - "baseColor": [ - 0.72, - 0.72, - 0.75 - ], - "roughness": 0.25, - "metallic": 1.0 - }, - "powderCoatBlue": { - "baseColor": [ - 0.15, - 0.25, - 0.7 - ], - "roughness": 0.55, - "metallic": 0.0 - }, - "defaultPlastic": { - "baseColor": [ - 0.95, - 0.95, - 0.95 - ], - "roughness": 0.4, - "metallic": 0.0 - }, - "skeletonRed": { - "baseColor": [ - 0.85, - 0.2, - 0.2 - ], - "roughness": 0.35, - "metallic": 0.0 - }, - "markerBlack": { - "baseColor": [ - 0.04, - 0.04, - 0.04 - ], - "roughness": 0.8, - "metallic": 0.0 - } + "wood": {"baseColor": [0.72, 0.52, 0.33], "roughness": 0.85, "metallic": 0.0}, + "plaWhite": {"baseColor": [0.95, 0.95, 0.95], "roughness": 0.45, "metallic": 0.0}, + "steel": {"baseColor": [0.72, 0.72, 0.75], "roughness": 0.25, "metallic": 1.0}, + "powderCoatBlue": {"baseColor": [0.15, 0.25, 0.7], "roughness": 0.55, "metallic": 0.0}, + "defaultPlastic": {"baseColor": [0.95, 0.95, 0.95], "roughness": 0.4, "metallic": 0.0}, + "skeletonRed": {"baseColor": [0.85, 0.2, 0.2], "roughness": 0.35, "metallic": 0.0}, + "markerBlack": {"baseColor": [0.04, 0.04, 0.04], "roughness": 0.8, "metallic": 0.0} }, - "skeletonDefaults": { - "radius": 4, - "color": [ - 0.85, - 0.2, - 0.2 - ] - }, - "markerDefaults": { - "size": 25, - "thickness": 1, - "color": [ - 0.04, - 0.04, - 0.04 - ] - }, - "defaultPosition": { - "x": 80, - "y": 20, - "z": 80, - "a": -120, - "b": 23, - "c": 9, - "e": 3 - } - }, - "defaultPosition__": { - "x": 10, - "y": 4, - "z": 20, - "a": 10, - "b": 2, - "c": 9, - "e": 1 - }, - "defaultPosition": { - "x": 50, - "y": 4, - "z": 176, - "a": 20, - "b": 60, - "c": 9, - "e": 5 - }, - "recognized": { - "x": null, - "y": null, - "z": null, - "a": null, - "b": null, - "c": null, - "e": null + "skeletonDefaults": {"radius": 4, "color": [0.85, 0.2, 0.2]}, + "markerDefaults": {"size": 25, "thickness": 1, "color": [0.04, 0.04, 0.04]}, + "defaultPosition": {"x": 80, "y": 20, "z": 80, "a": -120, "b": 23, "c": 9, "e": 3} }, + "defaultPosition__": {"x": 10, "y": 4, "z": 20, "a": 10, "b": 2, "c": 9, "e": 1}, + "defaultPosition": {"x": 50, "y": 4, "z": 176, "a": 20, "b": 60, "c": 9, "e": 5}, + "recognized": {"x": null, "y": null, "z": null, "a": null, "b": null, "c": null, "e": null}, "constraint_rules": { - "rigid_distance": { - "enabled": true, - "mode": "mst", - "weight": 1.0 - }, - "joint_axis_projection": { - "enabled": true, - "max_pairs": 2, - "weight": 0.35 - }, - "chain_axis_projection": { - "enabled": false, - "max_depth": 3, - "max_pairs": 2, - "weight": 0.15 - }, + "rigid_distance": {"enabled": true, "mode": "mst", "weight": 1.0}, + "joint_axis_projection": {"enabled": true, "max_pairs": 2, "weight": 0.35}, + "chain_axis_projection": {"enabled": false, "max_depth": 3, "max_pairs": 2, "weight": 0.15}, "axis_alignment_threshold": 0.95 }, - "observation_weighting": { - "enabled": true, - "distance_weight": true, - "marker_size_weight": true, - "view_angle_weight": true - }, + "observation_weighting": {"enabled": true, "distance_weight": true, "marker_size_weight": true, "view_angle_weight": true}, "multiview_calculation": { "combine_mode": "mean", "size_ref_px": 50.0, @@ -288,68 +97,16 @@ "huber_delta_mm": 8.0, "max_iterations": 200, "min_cameras_per_marker": 2, - "finger_block_joints": [ - "b", - "c", - "e" - ], + "finger_block_joints": ["b", "c", "e"], "per_link_method": {} }, "robot_test_poses": { - "4": { - "x": 70, - "y": 50, - "z": -70, - "a": 120, - "b": 50, - "c": 30, - "e": 20 - }, - "5": { - "x": 180, - "y": 86, - "z": -120, - "a": -60, - "b": 22, - "c": 91, - "e": 10 - }, - "6": { - "x": 80, - "y": 20, - "z": 80, - "a": -120, - "b": 23, - "c": 9, - "e": 3 - }, - "7": { - "x": 30, - "y": -2, - "z": 95, - "a": 20, - "b": 23, - "c": 9, - "e": 9 - }, - "8": { - "x": 50, - "y": -2, - "z": 95, - "a": 20, - "b": 60, - "c": 9, - "e": 3 - }, - "9": { - "x": 60, - "y": -2, - "z": 95, - "a": 200, - "b": 60, - "c": 9, - "e": 8 - }, + "4": {"x": 70, "y": 50, "z": -70, "a": 120, "b": 50, "c": 30, "e": 20}, + "5": {"x": 180, "y": 86, "z": -120, "a": -60, "b": 22, "c": 91, "e": 10}, + "6": {"x": 80, "y": 20, "z": 80, "a": -120, "b": 23, "c": 9, "e": 3}, + "7": {"x": 30, "y": -2, "z": 95, "a": 20, "b": 23, "c": 9, "e": 9}, + "8": {"x": 50, "y": -2, "z": 95, "a": 20, "b": 60, "c": 9, "e": 3}, + "9": {"x": 60, "y": -2, "z": 95, "a": 200, "b": 60, "c": 9, "e": 8}, "9a": { "x": 60, "y": -2, @@ -358,11 +115,7 @@ "b": 60, "c": 9, "e": 8, - "rendering": { - "width": 1440, - "height": 1080, - "dofFStop": 11 - } + "rendering": {"width": 1440, "height": 1080, "dofFStop": 11} }, "9b": { "x": 60, @@ -372,123 +125,31 @@ "b": 60, "c": 9, "e": 8, - "rendering": { - "width": 4896, - "height": 3264, - "dofFStop": 5.6 - } + "rendering": {"width": 4896, "height": 3264, "dofFStop": 5.6} }, - "10": { - "x": 120, - "y": 60, - "z": -110, - "a": 20, - "b": 30, - "c": 180, - "e": 4 - }, - "11": { - "x": 50, - "y": 4, - "z": 176, - "a": 20, - "b": 60, - "c": 9, - "e": 5 - }, - "12": { - "x": 50, - "y": 0, - "z": 178, - "a": 210, - "b": 80, - "c": 90, - "e": 6 - } + "10": {"x": 120, "y": 60, "z": -110, "a": 20, "b": 30, "c": 180, "e": 4}, + "11": {"x": 50, "y": 4, "z": 176, "a": 20, "b": 60, "c": 9, "e": 5}, + "12": {"x": 50, "y": 0, "z": 178, "a": 210, "b": 80, "c": 90, "e": 6} }, "test_camera_positions": { - "a": [ - -300, - -800, - 800 - ], - "b": [ - 300, - -900, - 1200 - ], - "c": [ - 300, - -900, - 400 - ], - "d": [ - 700, - -800, - 400 - ], - "e": [ - 1200, - -900, - 400 - ], - "f": [ - 500, - -300, - 1400 - ], - "g": [ - -200, - 200, - 1400 - ] + "a": [-300, -800, 800], + "b": [300, -900, 1200], + "c": [300, -900, 400], + "d": [700, -800, 400], + "e": [1200, -900, 400], + "f": [500, -300, 1400], + "g": [-200, 200, 1400] }, "test_camera_targets": { - "a": [ - 210, - -100, - 180 - ], - "b": [ - 310, - -80, - 180 - ], - "c": [ - 210, - -100, - 150 - ], - "d": [ - 210, - -100, - 150 - ], - "e": [ - 210, - -100, - 50 - ], - "f": [ - 200, - -200, - 180 - ], - "g": [ - 200, - -200, - 180 - ] - }, - "movements": { - "x": null, - "y": null, - "z": null, - "a": null, - "b": null, - "c": null, - "e": null + "a": [210, -100, 180], + "b": [310, -80, 180], + "c": [210, -100, 150], + "d": [210, -100, 150], + "e": [210, -100, 50], + "f": [200, -200, 180], + "g": [200, -200, 180] }, + "movements": {"x": null, "y": null, "z": null, "a": null, "b": null, "c": null, "e": null}, "state_pose_params": { "numbers_of_Elements_to_consider_start": 3, "numbers_of_Elements_to_consider_final": 5, @@ -504,1938 +165,303 @@ "links": { "Board": { "parent": null, - "size": [ - 1000, - 200, - 25 - ], - "mountPosition": [ - 0, - 0, - 0 - ], - "mountRotation": [ - 0, - 0, - 0 - ], - "skeleton": { - "from": [ - 0, - 0, - 16 - ], - "to": [ - 1000, - 0, - 16 - ], - "radius": 4, - "color": [ - 0.85, - 0.2, - 0.2 - ] - }, + "size": [1000, 200, 25], + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], + "skeleton": {"from": [0, 0, 16], "to": [1000, 0, 16], "radius": 4, "color": [0.85, 0.2, 0.2]}, "markers": [ - { - "id": 210, - "position": [ - 20, - -20, - 0.3 - ], - "normal": [ - 0, - 0, - 1 - ] - }, - { - "id": 211, - "position": [ - 250, - -10, - 0.3 - ], - "normal": [ - 0, - 0, - 1 - ] - }, - { - "id": 215, - "position": [ - 250, - -90, - 0.3 - ], - "normal": [ - 0, - 0, - 1 - ] - }, - { - "id": 214, - "position": [ - 350, - -10, - 0.3 - ], - "normal": [ - 0, - 0, - 1 - ] - }, - { - "id": 208, - "position": [ - 350, - -90, - 0.3 - ], - "normal": [ - 0, - 0, - 1 - ] - }, - { - "id": 206, - "position": [ - 650, - -10, - 0.3 - ], - "normal": [ - 0, - 0, - 1 - ] - }, - { - "id": 205, - "position": [ - 750, - -90, - 0.3 - ], - "normal": [ - 0, - 0, - 1 - ] - }, - { - "id": 207, - "position": [ - 750, - -10, - 0.3 - ], - "normal": [ - 0, - 0, - 1 - ] - }, - { - "id": 217, - "position": [ - 650, - -90, - 0.3 - ], - "normal": [ - 0, - 0, - 1 - ] - }, + {"id": 210, "position": [20, -20, 0.3], "normal": [0, 0, 1]}, + {"id": 211, "position": [250, -10, 0.3], "normal": [0, 0, 1]}, + {"id": 215, "position": [250, -90, 0.3], "normal": [0, 0, 1]}, + {"id": 214, "position": [350, -10, 0.3], "normal": [0, 0, 1]}, + {"id": 208, "position": [350, -90, 0.3], "normal": [0, 0, 1]}, + {"id": 206, "position": [650, -10, 0.3], "normal": [0, 0, 1]}, + {"id": 205, "position": [750, -90, 0.3], "normal": [0, 0, 1]}, + {"id": 207, "position": [750, -10, 0.3], "normal": [0, 0, 1]}, + {"id": 217, "position": [650, -90, 0.3], "normal": [0, 0, 1]}, { "id": 46, - "position": [ - 536.71, - 185.44, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], + "position": [536.71, 185.44, -27.3], + "normal": [0, 0, 1], "spin": 90, "info": "is placed on a white paper, A0_60Arucos_25mm_Seet223.pdf, with the following marker placements:" }, - { - "id": 47, - "position": [ - 344.23, - -286.54, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 48, - "position": [ - 688.69, - -320.72, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 49, - "position": [ - 1006.0, - 158.33, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 50, - "position": [ - 573.41, - 211.86, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 51, - "position": [ - 167.8, - -172.08, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 52, - "position": [ - 94.68, - 208.66, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 53, - "position": [ - 486.25, - 212.24, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 54, - "position": [ - 342.27, - -330.59, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 55, - "position": [ - 283.72, - -262.58, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 56, - "position": [ - 498.68, - 168.67, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 57, - "position": [ - 602.86, - -364.05, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 58, - "position": [ - 50.09, - -218.11, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 59, - "position": [ - 626.21, - -278.75, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 60, - "position": [ - 434.36, - 283.81, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 61, - "position": [ - -22.42, - 335.83, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 62, - "position": [ - 404.7, - -175.1, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 63, - "position": [ - 777.4, - -236.15, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 64, - "position": [ - -21.27, - -188.23, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 65, - "position": [ - 803.39, - -297.37, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 66, - "position": [ - 209.75, - -363.23, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 67, - "position": [ - 523.07, - 267.04, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 68, - "position": [ - 573.73, - 170.64, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 69, - "position": [ - 7.61, - -281.21, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 70, - "position": [ - 601.87, - 300.33, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 71, - "position": [ - 749.75, - -284.01, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 72, - "position": [ - 440.99, - 194.32, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 73, - "position": [ - 221.73, - 333.11, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 74, - "position": [ - 93.78, - 144.5, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 75, - "position": [ - -25.7, - 194.58, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 76, - "position": [ - 685.21, - 166.8, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 77, - "position": [ - 18.19, - 191.57, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 78, - "position": [ - 823.11, - -344.38, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 79, - "position": [ - 312.3, - -159.11, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 80, - "position": [ - 863.59, - -335.92, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 81, - "position": [ - 132.14, - 169.03, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 82, - "position": [ - 219.16, - 297.24, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 83, - "position": [ - 44.16, - 339.22, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 84, - "position": [ - 407.49, - 258.42, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 85, - "position": [ - 504.58, - -312.75, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 86, - "position": [ - 362.89, - 292.01, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 87, - "position": [ - 943.63, - -245.76, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 88, - "position": [ - 765.87, - 316.04, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 89, - "position": [ - 988.02, - -369.14, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 90, - "position": [ - 643.17, - 316.43, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 91, - "position": [ - 723.35, - 328.05, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 92, - "position": [ - 645.09, - -184.84, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 93, - "position": [ - 934.88, - 143.6, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 94, - "position": [ - 875.7, - 173.65, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 95, - "position": [ - 186.04, - -274.07, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 96, - "position": [ - 369.77, - -186.49, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 97, - "position": [ - 304.35, - -359.67, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 98, - "position": [ - 575.27, - 315.06, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 99, - "position": [ - 959.16, - -321.55, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 100, - "position": [ - 803.25, - 172.36, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 101, - "position": [ - 117.7, - 298.66, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 102, - "position": [ - 649.69, - -223.0, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 103, - "position": [ - 105.71, - -187.71, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 104, - "position": [ - 826.71, - 239.16, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - }, - { - "id": 105, - "position": [ - 524.84, - -266.25, - -27.3 - ], - "normal": [ - 0, - 0, - 1 - ], - "spin": 90 - } + {"id": 47, "position": [344.23, -286.54, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 48, "position": [688.69, -320.72, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 49, "position": [1006.0, 158.33, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 50, "position": [573.41, 211.86, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 51, "position": [167.8, -172.08, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 52, "position": [94.68, 208.66, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 53, "position": [486.25, 212.24, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 54, "position": [342.27, -330.59, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 55, "position": [283.72, -262.58, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 56, "position": [498.68, 168.67, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 57, "position": [602.86, -364.05, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 58, "position": [50.09, -218.11, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 59, "position": [626.21, -278.75, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 60, "position": [434.36, 283.81, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 61, "position": [-22.42, 335.83, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 62, "position": [404.7, -175.1, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 63, "position": [777.4, -236.15, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 64, "position": [-21.27, -188.23, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 65, "position": [803.39, -297.37, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 66, "position": [209.75, -363.23, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 67, "position": [523.07, 267.04, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 68, "position": [573.73, 170.64, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 69, "position": [7.61, -281.21, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 70, "position": [601.87, 300.33, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 71, "position": [749.75, -284.01, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 72, "position": [440.99, 194.32, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 73, "position": [221.73, 333.11, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 74, "position": [93.78, 144.5, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 75, "position": [-25.7, 194.58, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 76, "position": [685.21, 166.8, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 77, "position": [18.19, 191.57, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 78, "position": [823.11, -344.38, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 79, "position": [312.3, -159.11, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 80, "position": [863.59, -335.92, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 81, "position": [132.14, 169.03, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 82, "position": [219.16, 297.24, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 83, "position": [44.16, 339.22, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 84, "position": [407.49, 258.42, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 85, "position": [504.58, -312.75, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 86, "position": [362.89, 292.01, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 87, "position": [943.63, -245.76, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 88, "position": [765.87, 316.04, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 89, "position": [988.02, -369.14, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 90, "position": [643.17, 316.43, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 91, "position": [723.35, 328.05, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 92, "position": [645.09, -184.84, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 93, "position": [934.88, 143.6, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 94, "position": [875.7, 173.65, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 95, "position": [186.04, -274.07, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 96, "position": [369.77, -186.49, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 97, "position": [304.35, -359.67, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 98, "position": [575.27, 315.06, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 99, "position": [959.16, -321.55, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 100, "position": [803.25, 172.36, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 101, "position": [117.7, 298.66, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 102, "position": [649.69, -223.0, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 103, "position": [105.71, -187.71, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 104, "position": [826.71, 239.16, -27.3], "normal": [0, 0, 1], "spin": 90}, + {"id": 105, "position": [524.84, -266.25, -27.3], "normal": [0, 0, 1], "spin": 90} ], "model": [ { "stlFile": "surfaces/Board.stl", - "originOfModel": [ - 0, - 0, - 0 - ], - "rotationOfModelDegree": [ - 0, - 0, - -90 - ], + "originOfModel": [0, 0, 0], + "rotationOfModelDegree": [0, 0, -90], "material": "wood" }, { "stlFile": "surfaces/BoardRail.stl", - "originOfModel": [ - 0, - 0, - 0 - ], - "rotationOfModelDegree": [ - 0, - 0, - -90 - ], + "originOfModel": [0, 0, 0], + "rotationOfModelDegree": [0, 0, -90], "material": "steel" } ] }, "Base": { "parent": "Board", - "size": [ - 150, - 200, - 150 - ], - "mountPosition": [ - 0, - 0, - 0 - ], - "mountRotation": [ - 0, - 0, - 0 - ], + "size": [150, 200, 150], + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], "jointToParent": { "name": "Slider", "type": "linear", - "axis": [ - 1, - 0, - 0 - ], - "origin": [ - 0, - 0, - 16 - ], - "rotation": [ - 0, - 0, - 0 - ], + "axis": [1, 0, 0], + "origin": [0, 0, 16], + "rotation": [0, 0, 0], "variable": "x" }, - "skeleton": { - "from": [ - 0, - 108, - 45 - ], - "to": [ - 110, - 108, - 45 - ], - "radius": 4, - "color": [ - 0.2, - 0.8, - 0.2 - ] - }, + "skeleton": {"from": [0, 108, 45], "to": [110, 108, 45], "radius": 4, "color": [0.2, 0.8, 0.2]}, "markers": [], "model": [ { "stlFile": "surfaces/Base.stl", - "originOfModel": [ - -30, - 0, - -35 - ], - "rotationOfModelDegree": [ - 0, - 0, - 0 - ], + "originOfModel": [-30, 0, -35], + "rotationOfModelDegree": [0, 0, 0], "material": "plaWhite" } ] }, "Arm1": { "parent": "Base", - "size": [ - 70, - 250, - 70 - ], - "mountPosition": [ - 0, - 0, - 0 - ], - "mountRotation": [ - 0, - 0, - 0 - ], + "size": [70, 250, 70], + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], "jointToParent": { "name": "Joint1", "type": "revolute", - "axis": [ - -1, - 0, - 0 - ], - "origin": [ - 110, - 108, - 45 - ], - "rotation": [ - 0, - 0, - 0 - ], + "axis": [-1, 0, 0], + "origin": [110, 108, 45], + "rotation": [0, 0, 0], "variable": "y" }, - "skeleton": { - "from": [ - 0, - 0, - 0 - ], - "to": [ - 0, - -250, - 0 - ], - "radius": 4, - "color": [ - 0.2, - 0.2, - 0.9 - ] - }, + "skeleton": {"from": [0, 0, 0], "to": [0, -250, 0], "radius": 4, "color": [0.2, 0.2, 0.9]}, "markers": [ - { - "id": 198, - "name": "aruco_198", - "position": [ - 0, - -160, - 35 - ], - "normal": [ - 0, - 0, - 1 - ], - "size": 25, - "spin": 0 - }, - { - "id": 229, - "name": "aruco_229", - "position": [ - 0, - -250, - 35 - ], - "normal": [ - 0, - 0, - 1 - ], - "size": 25, - "spin": 0 - }, - { - "id": 242, - "name": "aruco_242", - "position": [ - 0, - -250, - -35 - ], - "normal": [ - 0, - 0, - -1 - ], - "size": 25, - "spin": 0 - }, - { - "id": 243, - "name": "aruco_243", - "position": [ - 0, - -285, - 0 - ], - "normal": [ - 0, - -1, - 0 - ], - "size": 25, - "spin": 0 - } + {"id": 198, "name": "aruco_198", "position": [0, -160, 35], "normal": [0, 0, 1], "size": 25, "spin": 0}, + {"id": 229, "name": "aruco_229", "position": [0, -250, 35], "normal": [0, 0, 1], "size": 25, "spin": 0}, + {"id": 242, "name": "aruco_242", "position": [0, -250, -35], "normal": [0, 0, -1], "size": 25, "spin": 0}, + {"id": 243, "name": "aruco_243", "position": [0, -285, 0], "normal": [0, -1, 0], "size": 25, "spin": 0} ], "model": [ { "stlFile": "surfaces/Holm.stl", - "originOfModel__": [ - -25, - 29, - -28.5 - ], - "originOfModel": [ - -29, - 25, - 28.5 - ], - "rotationOfModelDegree__": [ - 0, - 0, - 0 - ], - "rotationOfModelDegree": [ - 180, - 0, - -90 - ], + "originOfModel__": [-25, 29, -28.5], + "originOfModel": [-29, 25, 28.5], + "rotationOfModelDegree__": [0, 0, 0], + "rotationOfModelDegree": [180, 0, -90], "material": "powderCoatBlue" } ] }, "Ellbow": { "parent": "Arm1", - "mountPosition": [ - 0, - 0, - 0 - ], - "mountRotation": [ - 0, - 0, - 0 - ], + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], "jointToParent": { "name": "Joint2", "type": "revolute", - "axis": [ - -1, - 0, - 0 - ], - "origin": [ - 0, - -250, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], + "axis": [-1, 0, 0], + "origin": [0, -250, 0], + "rotation": [0, 0, 0], "variable": "z" }, - "skeleton": { - "from": [ - 0, - 0, - 0 - ], - "to": [ - 90, - 0, - 0 - ], - "radius": 4, - "color": [ - 0.9, - 0.2, - 0.2 - ] - }, + "skeleton": {"from": [0, 0, 0], "to": [90, 0, 0], "radius": 4, "color": [0.9, 0.2, 0.2]}, "model": [ { "stlFile": "surfaces/Ellebogen.stl", - "originOfModel": [ - 90, - 0, - 0 - ], - "rotationOfModelDegree": [ - 0, - -90, - -90 - ], + "originOfModel": [90, 0, 0], + "rotationOfModelDegree": [0, -90, -90], "material": "defaultPlastic" } ], "markers": [ - { - "id": 244, - "name": "aruco_244", - "position": [ - 125, - 0, - 0 - ], - "normal": [ - 1, - 0, - 0 - ], - "size": 25, - "spin": 0 - }, - { - "id": 245, - "name": "aruco_245", - "position": [ - 90, - 0, - -35 - ], - "normal": [ - 0, - 0, - -1 - ], - "size": 25, - "spin": 0 - }, - { - "id": 246, - "name": "aruco_246", - "position": [ - 90, - 0, - 35 - ], - "normal": [ - 0, - 0, - 1 - ], - "size": 25 - }, - { - "id": 247, - "name": "aruco_247", - "position": [ - 52.5, - 0, - 35 - ], - "normal": [ - 0, - 0, - 1 - ], - "size": 25 - }, - { - "id": 248, - "name": "aruco_248", - "position": [ - 52.5, - 0, - -35 - ], - "normal": [ - 0, - 0, - -1 - ], - "size": 25 - }, - { - "id": 232, - "name": "aruco_232", - "position": [ - 90, - 24.75, - -24.75 - ], - "normal": [ - 0, - 1, - -1 - ], - "size": 25 - }, - { - "id": 231, - "name": "aruco_231", - "position": [ - 90, - 24.75, - 24.75 - ], - "normal": [ - 0, - 1, - 1 - ], - "size": 25 - } + {"id": 244, "name": "aruco_244", "position": [125, 0, 0], "normal": [1, 0, 0], "size": 25, "spin": 0}, + {"id": 245, "name": "aruco_245", "position": [90, 0, -35], "normal": [0, 0, -1], "size": 25, "spin": 0}, + {"id": 246, "name": "aruco_246", "position": [90, 0, 35], "normal": [0, 0, 1], "size": 25}, + {"id": 247, "name": "aruco_247", "position": [52.5, 0, 35], "normal": [0, 0, 1], "size": 25}, + {"id": 248, "name": "aruco_248", "position": [52.5, 0, -35], "normal": [0, 0, -1], "size": 25}, + {"id": 232, "name": "aruco_232", "position": [90, 24.75, -24.75], "normal": [0, 1, -1], "size": 25}, + {"id": 231, "name": "aruco_231", "position": [90, 24.75, 24.75], "normal": [0, 1, 1], "size": 25} ] }, "Arm2": { "parent": "Ellbow", - "mountPosition": [ - 0, - 0, - 0 - ], - "mountRotation": [ - 0, - 0, - 0 - ], + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], "jointToParent": { "name": "Joint3", "type": "revolute", - "axis": [ - 0, - -1, - 0 - ], - "origin": [ - 90, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], + "axis": [0, -1, 0], + "origin": [90, 0, 0], + "rotation": [0, 0, 0], "variable": "a" }, - "skeleton": { - "from": [ - 0, - 0, - 0 - ], - "to": [ - 0, - -250, - 0 - ], - "radius": 4, - "color": [ - 0.95, - 0.85, - 0.2 - ] - }, + "skeleton": {"from": [0, 0, 0], "to": [0, -250, 0], "radius": 4, "color": [0.95, 0.85, 0.2]}, "model": [ { "stlFile": "surfaces/Unterarm.stl", - "originOfModel": [ - 0, - -250, - 0 - ], - "rotationOfModelDegree": [ - 180, - 0, - -90 - ], + "originOfModel": [0, -250, 0], + "rotationOfModelDegree": [180, 0, -90], "material": "defaultPlastic" } ], "markers": [ - { - "id": 120, - "position": [ - 24.75, - -112, - -24.75 - ], - "normal": [ - 1, - 0, - -1 - ] - }, - { - "id": 122, - "name": "aruco_122", - "position": [ - -35, - -112, - 0 - ], - "normal": [ - -1, - 0, - 0 - ] - }, - { - "id": 218, - "name": "aruco_218", - "position": [ - 35, - -112, - 0 - ], - "normal": [ - 1, - 0, - 0 - ] - }, - { - "id": 113, - "name": "aruco_113", - "position": [ - 0, - -182, - 30 - ], - "normal": [ - 0, - 0, - 1 - ] - }, - { - "id": 114, - "name": "aruco_114", - "position": [ - 24.75, - -182, - -24.75 - ], - "normal": [ - 1, - 0, - -1 - ] - }, - { - "id": 115, - "name": "aruco_115", - "position": [ - -24.75, - -182, - -24.75 - ], - "normal": [ - -1, - 0, - -1 - ] - }, - { - "id": 124, - "name": "aruco_124", - "position": [ - -35, - -219, - 0 - ], - "normal": [ - -1, - 0, - 0 - ] - }, - { - "id": 219, - "name": "aruco_219", - "position": [ - 35, - -219, - 0 - ], - "normal": [ - 1, - 0, - 0 - ] - } + {"id": 120, "position": [24.75, -112, -24.75], "normal": [1, 0, -1]}, + {"id": 122, "name": "aruco_122", "position": [-35, -112, 0], "normal": [-1, 0, 0]}, + {"id": 218, "name": "aruco_218", "position": [35, -112, 0], "normal": [1, 0, 0]}, + {"id": 113, "name": "aruco_113", "position": [0, -182, 30], "normal": [0, 0, 1]}, + {"id": 114, "name": "aruco_114", "position": [24.75, -182, -24.75], "normal": [1, 0, -1]}, + {"id": 115, "name": "aruco_115", "position": [-24.75, -182, -24.75], "normal": [-1, 0, -1]}, + {"id": 124, "name": "aruco_124", "position": [-35, -219, 0], "normal": [-1, 0, 0]}, + {"id": 219, "name": "aruco_219", "position": [35, -219, 0], "normal": [1, 0, 0]} ] }, "Hand": { "parent": "Arm2", - "mountPosition": [ - 0, - 0, - 0 - ], - "mountRotation": [ - 0, - 0, - 0 - ], + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], "jointToParent": { "name": "Joint4", "type": "revolute", - "axis": [ - 1, - 0, - 0 - ], - "origin": [ - 0, - -250, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], + "axis": [1, 0, 0], + "origin": [0, -250, 0], + "rotation": [0, 0, 0], "variable": "b" }, - "skeleton": { - "from": [ - 0, - 0, - 0 - ], - "to": [ - 0, - -35, - 0 - ], - "radius": 4, - "color": [ - 0.95, - 0.55, - 0.15 - ] - } + "skeleton": {"from": [0, 0, 0], "to": [0, -35, 0], "radius": 4, "color": [0.95, 0.55, 0.15]} }, "Palm": { "parent": "Hand", - "mountPosition": [ - 0, - 0, - 0 - ], - "mountRotation": [ - 0, - 0, - 0 - ], + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], "jointToParent": { "name": "Joint3", "type": "revolute", - "axis": [ - 0, - -1, - 0 - ], - "origin": [ - 0, - 0, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], + "axis": [0, -1, 0], + "origin": [0, 0, 0], + "rotation": [0, 0, 0], "variable": "c" }, - "skeleton": { - "from": [ - -50, - -35, - 0 - ], - "to": [ - 50, - -35, - 0 - ], - "radius": 7, - "color": [ - 0.95, - 0.2, - 0.2 - ] - } + "skeleton": {"from": [-50, -35, 0], "to": [50, -35, 0], "radius": 7, "color": [0.95, 0.2, 0.2]} }, "FingerA": { "parent": "Palm", - "size": [ - 80, - 60, - 20 - ], - "mountPosition": [ - 0, - 0, - 0 - ], - "mountRotation": [ - 0, - 0, - 0 - ], + "size": [80, 60, 20], + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], "jointToParent": { "name": "Slider", "type": "linear", - "axis": [ - 1, - 0, - 0 - ], - "origin": [ - 4, - -35, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], + "axis": [1, 0, 0], + "origin": [4, -35, 0], + "rotation": [0, 0, 0], "variable": "e" }, - "skeleton": { - "from": [ - 0, - 0, - 0 - ], - "to": [ - 0, - -60, - 0 - ], - "radius": 4, - "color": [ - 0.2, - 0.8, - 0.2 - ] - }, + "skeleton": {"from": [0, 0, 0], "to": [0, -60, 0], "radius": 4, "color": [0.2, 0.8, 0.2]}, "markers": [ - { - "id": 40, - "position": [ - 12, - -24, - -17.1 - ], - "normal": [ - -10.98, - 0, - -23.56 - ] - }, - { - "id": 41, - "position": [ - 1.5, - -2.2, - 25.8 - ], - "normal": [ - 0, - -25.6, - 9.5 - ] - }, - { - "id": 42, - "position": [ - 13.9, - -40, - 0 - ], - "normal": [ - 1, - -0.35, - 0.4 - ], - "spin": 27 - } + {"id": 40, "position": [12, -24, -17.1], "normal": [-10.98, 0, -23.56]}, + {"id": 41, "position": [1.5, -2.2, 25.8], "normal": [0, -25.6, 9.5]}, + {"id": 42, "position": [13.9, -40, 0], "normal": [1, -0.35, 0.4], "spin": 27} ], "model": [ { "stlFile": "surfaces/Finger.stl", - "originOfModel": [ - 24, - 0, - -9.1 - ], - "rotationOfModelDegree": [ - 90, - -90, - 0 - ], + "originOfModel": [24, 0, -9.1], + "rotationOfModelDegree": [90, -90, 0], "material": "defaultPlastic" } ] }, "FingerB": { "parent": "Palm", - "size": [ - 80, - 60, - 20 - ], - "mountPosition": [ - 0, - 0, - 0 - ], - "mountRotation": [ - 0, - 0, - 0 - ], + "size": [80, 60, 20], + "mountPosition": [0, 0, 0], + "mountRotation": [0, 0, 0], "jointToParent": { "name": "Slider", "type": "linear", - "axis": [ - -1, - 0, - 0 - ], - "origin": [ - -4, - -35, - 0 - ], - "rotation": [ - 0, - 0, - 0 - ], + "axis": [-1, 0, 0], + "origin": [-4, -35, 0], + "rotation": [0, 0, 0], "variable": "e" }, - "skeleton": { - "from": [ - 0, - 0, - 0 - ], - "to": [ - 0, - -60, - 0 - ], - "radius": 4, - "color": [ - 0.2, - 0.8, - 0.2 - ] - }, + "skeleton": {"from": [0, 0, 0], "to": [0, -60, 0], "radius": 4, "color": [0.2, 0.8, 0.2]}, "markers": [ - { - "id": 43, - "position": [ - -12, - -24, - 17.1 - ], - "normal": [ - 10.98, - 0, - 23.56 - ], - "spin": 90 - }, - { - "id": 44, - "position": [ - -1.5, - -2.2, - -25.8 - ], - "normal": [ - 0, - -25.6, - -9.5 - ], - "spin": 90 - }, - { - "id": 45, - "position": [ - -13.9, - -40, - 0 - ], - "normal": [ - -1, - -0.35, - -0.4 - ], - "spin": -27 - } + {"id": 43, "position": [-12, -24, 17.1], "normal": [10.98, 0, 23.56], "spin": 90}, + {"id": 44, "position": [-1.5, -2.2, -25.8], "normal": [0, -25.6, -9.5], "spin": 90}, + {"id": 45, "position": [-13.9, -40, 0], "normal": [-1, -0.35, -0.4], "spin": -27} ], "model": [ { "stlFile": "surfaces/Finger.stl", - "originOfModel": [ - -24, - 0, - 9.1 - ], - "rotationOfModelDegree": [ - 90, - 90, - 0 - ], + "originOfModel": [-24, 0, 9.1], + "rotationOfModelDegree": [90, 90, 0], "material": "defaultPlastic" } ] } } -} \ No newline at end of file +} diff --git a/doc/callibrate_scene_roadmap.md b/doc/callibrate_scene_roadmap.md new file mode 100644 index 0000000..df70ef9 --- /dev/null +++ b/doc/callibrate_scene_roadmap.md @@ -0,0 +1,220 @@ +# Roadmap: Szenen-Kalibrierung der Board-/Loose-Marker (`callibrate_scene`) + +Status: **Vorschlag / zur Abstimmung** +Ort der Arbeit: `pipeline/` (nicht `approbot-pipeline/`, das bleibt die eingefrorene Kopie) +Datum: 2026-06-04 + +> Eingearbeitete Entscheidungen: +> 1. **Gelenkzustand UNBEKANNT** → wird mitgeschätzt (kein FK-Welt-Anker a priori). +> 2. **Set-Definition direkt in `robot.json`** über ein optionales `"set"`-Feld je Marker. +> Marker bleiben im bisherigen Format an ihrem Link. Gleiches `set` = ein starr zusammenhängendes +> Objekt mit **fixen relativen Bezügen**. **Kein `set` = loser Marker** (fix, aber Lage z.Zt. unbekannt). +> 3. **Welt = Roboter (Konvention 2)**, Roboter steht *nicht* bei 0/0/0. +> 4. **Primär eine Aufnahme (7 Bilder)**, *ohne* zusätzliche Base-Marker; mehrere Posen als Fallback. +> 5. **Ausgabe vorerst `robot.calibrated.json`** (Debugging); später in-place nach `robot.json`. + +--- + +## 0. Machbarkeit — Kurzurteil + +**Ja, machbar** — die anspruchsvollere Variante, weil der Gelenkzustand mitgeschätzt wird und es +keinen a-priori Welt-Anker gibt (weder Board noch Arm). Vorgehen: + +> **Erst ankerlos rekonstruieren** (metrisch, aus der bekannten Marker-Größe), **dann den Roboter +> in die Rekonstruktion einpassen** — der eingepasste Roboter definiert die Welt — **dann die Sets +> einpassen** und die Marker-Positionen aktualisieren. + +Bausteine im Bestand: Per-Marker-PnP (`solve_single_marker_pose`), Eck-Triangulation +(`3b_corner_marker_poses.py`), Bündelausgleichung (`3_multiview_bundle_adjustment_v5...`), +FK + θ-Schätzung (`pose_estimation.py`, `robot_fk.py`), Kabsch-Fit (`rigid_transform_no_scale`). + +**Ein Beobachtbarkeits-Knackpunkt** für „eine Aufnahme genügt ohne Base-Marker" steht in §7 — er ist +beherrschbar, aber bewusst zu entscheiden. + +--- + +## 1. Problem & Zielbild + +**Realität:** Höhe/Orientierung zwischen Board und Arm sind ungenau. Marker ~20–105 liegen fix, +aber unbekannt: teils Board-Platte, teils darunterliegendes A0-Blatt, teils einzeln aufgeklebt. + +**Vertrauenswürdig:** die *interne Geometrie* der Roboter-Links und die *relativen Bezüge innerhalb +jedes Sets* (beide in `robot.json` hinterlegt), sowie die *Marker-Kantenlänge* (25 mm → Maßstab). +**Unbekannt:** Gelenkwinkel, Kamera-Posen, Platzierung jedes Sets, Lage jedes losen Markers. + +**Ziel:** Nach der Kalibrierung hat jedes Set (als starres Objekt korrekt platziert) und jeder lose +Marker (einzeln vermessen) eine korrekte Pose in einem roboter-verankerten Weltsystem. + +### Marker-Klassen (aus dem `set`-Feld abgeleitet) + +| Klasse | Erkennung | bekannt | zu schätzen | +|---|---|---|---| +| **Arm-Marker** (Roboter) | liegen an Arm-Links (Arm1…Finger) | Lage je Link | — definieren via Fit die Welt | +| **Set-Marker** (starr) | `"set": "A0"`, `"set":"Brett"`, … | interne Relativlage (fix) | 6-DoF-Platzierung je Set | +| **Lose Marker** | **kein** `set`-Feld | nur „fix vorhanden" | je Marker eigene 6-DoF-Pose | + +--- + +## 2. Set-Definition: `set`-Feld am Marker (kein Strukturumbau) + +Marker bleiben **wie bisher** in der `markers`-Liste ihres Links. Ein optionales `"set"` gruppiert sie: + +```jsonc +"Board": { + "parent": null, "mountPosition": [0,0,0], "mountRotation": [0,0,0], + "markers": [ + { "id": 210, "position": [ 20,-20,0.3], "normal": [0,0,1], "set": "A0" }, + { "id": 211, "position": [250,-10,0.3], "normal": [0,0,1], "set": "A0" }, + { "id": 215, "position": [250,-90,0.3], "normal": [0,0,1], "set": "Brett" }, + { "id": 208, "position": [350,-90,0.3], "normal": [0,0,1], "set": "Brett" }, + { "id": 205, "position": [750,-90,0.3], "normal": [0,0,1] } // kein set -> lose + ] +} +``` + +- **Gleiches `set` ⇒ ein starres Objekt.** Die relativen Bezüge der Marker im Set gelten als **fix**; + die Kalibrierung bestimmt nur die 6-DoF-Platzierung des ganzen Sets und schreibt die daraus + resultierenden Positionen zurück (Format unverändert, relative Anordnung erhalten). +- **Kein `set` ⇒ loser Marker.** Wird einzeln (Position + Normale + ggf. Spin) vermessen. +- **Arm-Marker** brauchen kein `set`: ihr Link ist bereits ein starrer Körper und dient als + Roboter-Referenz (sie werden *nicht* kalibriert, sondern definieren die Welt). +- **Auto-Discovery** (Projekt-Konvention): Sets ergeben sich aus den `set`-Werten, nichts hartkodiert. + +Hinweis: `robot_fk.py` / `all_markers_world()` bleiben unverändert — das `set`-Feld ist reine +Zusatzinfo, die nur der Kalibrier-Treiber auswertet. + +--- + +## 3. Algorithmus (Gelenkzustand unbekannt) + +### Phase A — Ankerlose, metrische Rekonstruktion +1. **Detektion** (Schritt 1) → Ecken je Kamera. +2. **Per-Marker-PnP** je Kamera aus der bekannten Marker-Größe (`SOLVEPNP_IPPE_SQUARE`) → volle + Marker-Pose *relativ zur Kamera*. Kein Welt-Anker nötig. +3. **Relativer Posen-Graph:** gemeinsam gesehene Marker verknüpfen Kamerapaare → Init aller Kamera- + und Marker-Posen in einem *beliebigen* Szenen-Frame `S`. +4. **Globale Bündelausgleichung** (scipy `least_squares`, Huber): verfeinert alle Kamera- und + Marker-Posen über die Reprojektion aller Ecken. Maßstab fix durch Marker-Größe. + +→ konsistente, metrische 3D-Szene (Arm- **und** Set-/Loose-Marker) in `S`. + +### Phase B — Roboter einpassen = Welt definieren +5. Arm-Marker per ID → Link zuordnen. **Fit** von Gelenkwinkeln θ **und** der Platzierung der + FK-Wurzel in `S`, sodass `FK(θ)` der Arm-Marker die rekonstruierten Arm-Positionen trifft + (erweitert `pose_estimation.py` um eine freie Wurzel-Platzierung statt fixer Identität). +6. In das Weltsystem rücktransformieren. Welt-Ursprung = FK-Wurzel-Frame (= heutiges „Board"-Frame), + Roboter sitzt mit dem fertigen θ darin — *nicht* bei 0/0/0 (§6). + +### Phase C — Set-Fit & Rückschreiben +7. **Set-Marker (pro `set`):** Kabsch (`rigid_transform_no_scale`) bildet die **fixe interne Lage** + auf die rekonstruierten Welt-Positionen ab → 6-DoF-Set-Platzierung → aktualisierte Positionen + (= Platzierung ∘ interne Lage). Auch nicht gesehene Set-Marker erhalten so eine Position, sofern + das Set über ≥3 nicht-kollineare Marker bestimmt ist. + **Lose Marker:** triangulierte Pose direkt übernehmen. +8. **Rückschreiben** nach `robot.calibrated.json` (Marker-Format unverändert, `set`-Felder erhalten) + + `calibration_report.json` (je Set die explizite Verschiebung/Verdrehung + RMS; je Marker Status). + Nicht beobachtbare Größen → **`null`** (nie 0). + +### Fallback — mehrere Posen (statische Kameras) +Mehrere Gelenkzustände bei festen Kameras: Kamera-Posen + Set-/Loose-Posen + Wurzel-Platzierung sind +**geteilte** Unbekannte, je Pose ein eigener θ-Satz. Löst die §7-Schwächen vollständig auf. + +--- + +## 4. Eingaben & Ausgaben + +**Eingaben:** `robot.json` (Arm-Geometrie + `set`-Felder + fixe interne Set-Lagen); +Szenen-Ordner mit `render_*.png` **oder** vorhandene `*_aruco_detection.json`. +(Gelenkzustand wird NICHT benötigt.) + +**Ausgaben:** `robot.calibrated.json` (aktualisierte Marker-Positionen, Format wie bisher); +`calibration_report.json` (je Set: Verschiebung/Verdrehung, RMS, #Kameras/#Marker, Status; +je losem Marker: Pose oder `null`). Optional Viewer-Overlay Soll↔kalibriert. + +--- + +## 5. Neue / geänderte Dateien + +| Datei | Art | Inhalt | +|---|---|---| +| `pipeline/calibrate_scene.py` | **neu** | Treiber: Auto-Discovery Kameras+Sets, Phase A→B→C, schreibt `robot.calibrated.json`+Report | +| `pipeline/scene_reconstruct.py` | **neu** | Phase A: Per-Marker-PnP, Posen-Graph, globale BA (ankerlos) | +| `pipeline/robot_register.py` | **neu** | Phase B: Fit θ + freie Wurzel-Platzierung (nutzt `robot_fk`) | +| `pipeline/marker_sets.py` | **neu** | liest `set`-Felder aus `robot.json`; Klassifizierung Arm/Set/Lose | +| `3b_corner_marker_poses.py` | **erweitern** | volle Marker-**Rotation** (Normale + Spin) aus 4 Ecken | +| `pose_estimation.py` | **erweitern** | optionale freie Wurzel-Platzierung (für Phase B wiederverwendbar) | + +`2_estimate_camera_from_observations.py` / `robot_fk.py`: voraussichtlich **unverändert**. + +--- + +## 6. Weltursprung (Konvention 2, Roboter nicht bei 0/0/0) + +- Ursprung = FK-Wurzel-Frame (heute „Board"). Der Roboter sitzt mit seinem modellierten Versatz + (`Base.jointToParent.origin` + Slider `x`) darin → **nicht** bei 0/0/0. Das deckt den Wunsch ab. +- „Welt durch Roboter definiert" wird dadurch realisiert, dass die **Kalibrierung am Roboter + verankert** (Fit θ + Wurzel-Platzierung über Arm-Marker), statt den Board-Markern zu vertrauen. + Die Board-Positionen werden konsistent *neu* abgeleitet. +- Der Kinematik-Baum bleibt unverändert. (Optionaler späterer Umbau „Base = Wurzel" möglich, aber + für die Kalibrierung nicht nötig.) + +--- + +## 7. Beobachtbarkeit — Einzelaufnahme ohne Base-Marker (wichtig) + +Verifiziert an `robot.json`: `Base`, `Hand`, `Palm` haben **keine** Marker; erster markierter Link +ist `Arm1`. Daraus folgt für EINE Pose mit unbekannten Gelenkwinkeln: + +- **Slider `x` und `Joint1 y` sind nicht von der absoluten Roboter-Platzierung trennbar** (2-DoF- + Gauge-Freiheit): eine Verschiebung entlang der Schiene ≙ Änderung von `x`; eine Drehung um die + `Joint1`-Achse ≙ Änderung von `y`. Die Set-/Loose-Marker erben diese 2 Freiheitsgrade. +- **Gut bestimmt aus einer Pose:** `z, a, b, c, e` und damit die gesamte Szene *relativ*. + +Da Base-Marker mechanisch unerwünscht sind, der empfohlene Weg: + +- **Gauge per Konvention fixieren** (Default für Einzelaufnahme): `x`,`y` auf die gefittete + Konfiguration / nominale Schienen-Null setzen und die Welt so definieren. Ergebnis ist + **in sich konsistent** → für künftige Pose-Schätzung (Board als Anker) voll nutzbar; lediglich + der *absolute* Schienen-Nullpunkt und die `Joint1`-Null sind dann Konvention, kein Messwert. +- **Mehrere Posen** (Fallback), wenn die absolute Basis-Lage / absolute `x`,`y` wirklich gebraucht + werden — das löst die 2 Freiheitsgrade vollständig auf. +- *(optional, falls je möglich:* ein einzelner Base-/Schlitten-Marker würde Einzelaufnahme voll + beobachtbar machen — derzeit zurückgestellt.)* + +QA: Reprojektions-RMS je Kamera; Set-Fit-Residuum (mm); Co-Visibility-Graph zusammenhängend?; +≥3 nicht-kollineare Marker je Set; ≥2 Kameras je losem Marker (sonst Status `partial`/`unobserved`). + +--- + +## 8. Validierung (Sim zuerst) + +`pose.json` liefert in der Simulation GT-Gelenkwinkel **und** Kamera-Pos/Targets: +1. Bekannte Sets künstlich verschieben/verdrehen → kalibrieren → Rück-Transform gegen Soll. +2. Gefittete θ gegen GT-θ; gefittete Kamera-Posen gegen GT. +3. Einzelaufnahme- vs. Mehrfach-Posen-Genauigkeit quantifizieren (belegt §7). +4. Erst danach `data/recorded/`-Szenen. + +--- + +## 9. Phasen / Meilensteine + +- **P0 — `set`-Felder & Parser:** `set`-Felder in `robot.json` ergänzen; `marker_sets.py` + (Arm/Set/Lose-Klassifizierung); FK-Welt-Positionen unverändert verifizieren. +- **P1 — Ankerlose Rekonstruktion (Phase A):** Per-Marker-PnP + Posen-Graph + globale BA; gegen + GT-Kamera-Posen (Sim) prüfen. +- **P2 — Roboter-Registrierung (Phase B):** Fit θ + freie Wurzel-Platzierung; gegen GT-θ; §7-Gauge. +- **P3 — Set-Fit & Rückschreiben (Phase C):** Kabsch + Loose → `robot.calibrated.json` + Report; + Sim-Validierung mit künstlichem Offset. +- **P4 — Mehrfach-Posen-Fallback.** +- **P5 — Reale Szenen + Viewer-Overlay; danach in-place nach `robot.json`.** + +--- + +## 10. Verbleibende kleinere Punkte + +1. **Gauge-Konvention für Einzelaufnahme** (§7): `x`,`y` = gefittet, oder Schiene/`Joint1` auf + nominal? (Beeinflusst nur den absoluten Nullpunkt, nicht die Set-Relativlagen.) +2. **Set-Namensraum:** sind `set`-Namen global eindeutig oder pro Link? (Vorschlag: global, z.B. + „A0", „Brett" — ein Set = ein physisches Objekt.) +3. **Lose-Marker-Orientierung:** reicht Position + Normale, oder wird der Spin (Drehung um die + Normale) gebraucht? (Bestimmt die nötige Genauigkeit von Phase C / 3b.)