This commit is contained in:
ChK
2026-03-30 20:33:15 +02:00
parent ca8e87ef22
commit 06cf2966ab
22 changed files with 5463 additions and 19 deletions

4604
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,11 @@
"start": "node server/server.js",
"dev": "nodemon server/server.js",
"postinstall": "node scripts/generate-certs.js || true",
"create": "node scripts/generate-certs.js"
"create": "node scripts/generate-certs.js",
"test": "jest"
},
"jest": {
"testEnvironment": "jsdom"
},
"dependencies": {
"dotenv": "^16.4.5",
@@ -17,6 +21,8 @@
"ws": "^8.18.0"
},
"devDependencies": {
"jest": "^30.3.0",
"jest-environment-jsdom": "^30.3.0",
"nodemon": "^3.0.2"
}
}
}

View File

@@ -124,8 +124,8 @@ async function calculate() {
const row229 = rows.find(r => r.id == 229 && r.seen_by == 3)
if(row229){
angleY += await calculateAngleFromPosition(row229, shoulderAxisY, shoulderAxisZ, 250, 35);
angleY +=calculateAngleFromRollColumn(row229, 0, 0, 0);
angleYcount+=2;
//angleY +=calculateAngleFromRollColumn(row229, 0, 0, 0); // Roll ist extrem unzuverlässig
angleYcount+=1;
}
console.log(angleY, angleYcount);
const row198 = rows.find(r => r.id == 198 && r.seen_by == 3)
@@ -140,6 +140,13 @@ async function calculate() {
angleYcount += 3;
}
const row197 = rows.find(r => r.id == 197)
if(row197){
var angleDeg = 90 - row197.pitch_deg;
var angleRad = angleDeg * Math.PI / 180;
appendToAnalysis(`(yMotor = ${angleDeg.toFixed(2)}° = ${angleRad.toFixed(4)} rad ) aus Pitch von ${row197.id}`);
}
// Unterarm:
// 218 und 219, wenn die sichtbar sind, ist auch die Schulter eindeutig definiert
@@ -161,15 +168,95 @@ async function calculate() {
console.log("z", angleZ);
if(angleYcount > 0 && angleYcount > 0){
// appendToAnalysis(`Suggestion: G92 y${(angleY/angleYcount).toFixed(3)} z${(angleZ/angleZcount).toFixed(3)} (Set to coordinats. Angles in rad)`);
strActionOptionA = `G92 y${(angleY*180/(angleYcount*Math.PI)).toFixed(1)} z${(angleZ*180/(Math.PI*angleZcount)).toFixed(1)} (Set Coord. Angles in deg)`;
strActionOptionB = `M92 y${(angleY/(angleYcount)).toFixed(3)} z${(angleZ/(angleZcount)).toFixed(3)} (Set Coord. Angles in rad)`;
appendToAnalysis(`Suggestion: ${strActionOptionA}`);
appendToAnalysis(`Suggestion: ${strActionOptionB}`);
// ToDo: Change
}
// Ellbow
const row242 = rows.find(r => r.id == 242 && r.seen_by == 3)
const row200 = rows.find(r => r.id == 200 && r.seen_by == 3)
const row204 = rows.find(r => r.id == 204 && r.seen_by == 3)
// Ellenbogen-Rotation aus x-Position 218 219
// dazu brauche ich genaue x-Position von 226
if(row226 || row229 || row198 || row243 || row242 || row200 || row200){
var x226 = 0;
var xCount = 0;
if(row226){
x226 += row226.x_mm * 5;
xCount += 5;
}
if(row229){
x226 += row229.x_mm + 90;
xCount += 1;
}
if(row198){
x226 += row198.x_mm + 90;
xCount += 1;
}
if(row243){
x226 += row243.x_mm + 90;
xCount += 1;
}
if(row242){
x226 += row242.x_mm + 90;
xCount += 1;
}
if(row200){
x226 += row200.x_mm + 154;
xCount += 1;
}
if(row204){
x226 += row204.x_mm + 160;
xCount += 1;
}
x226 = x226 / xCount;
appendToAnalysis(`Ellebogen x226=${x226}`)
// Wenn 218 und/oder 219 sicher gesehen wird, kann ich daraus x-pos bestimmen
if(row218 || row219){
var x219 = 0;
xCount = 0;
if(row218){
x219 += row218.x_mm;
xCount += 1;
}
if(row219){
x219 += row219.x_mm;
xCount += 1;
}
x219 = x219 / xCount;
appendToAnalysis(`Ellebogen x219=${x219}`)
var xDelta = x219 - x226;
if(Math.abs(xDelta) < 35){
appendToAnalysis(`Ellebogen xDelta / 35=${xDelta / 35}`)
var angleRad = Math.asin(xDelta / 35)
var angleDeg = 90 -angleRad*180/Math.PI;
appendToAnalysis(`(xEllbow = ${angleDeg.toFixed(2)}° = ${angleRad.toFixed(4)} rad ) aus x von 218 bzw. 219`);
}
}
}
}
if (typeof module !== 'undefined') {
module.exports = {
calculateAngleFromPosition,
calculateAngleFromRollColumn,
calculateAngleFromRelativePosition,
calculate
};
}
// Export für Module, falls benötigt
// export { fetchCSV, calculate };

View File

@@ -0,0 +1,52 @@
/**
* @jest-environment jsdom
*/
const fs = require('fs');
const path = require('path');
describe("calculate() Snapshot-Test Fetch", () => {
let calculate;
beforeEach(() => {
// DOM vorbereiten
document.body.innerHTML = `
<textarea id="analysis-log"></textarea>
`;
// Fetch mocken, aber so, dass die CSV real geladen wird
global.fetch = jest.fn(async () => {
const csvPath = path.join(
__dirname,
"./snapshots/snapshot_video0_1774805028717_two_cam.csv"
);
const csvContent = fs.readFileSync(csvPath, "utf8");
return {
ok: true,
headers: {
get: () => "text/csv"
},
text: async () => csvContent
};
});
// Modul *nach* DOMMock laden!
({ calculate } = require("../public/calculateActions.js"));
});
test("calculate() lädt Snapshot über fetch()", async () => {
await calculate(); // 👉 Aufruf, fetch wird getriggert
// Nur erster Check: wurde fetch überhaupt aufgerufen?
expect(global.fetch).toHaveBeenCalledWith("/api/latest-snapshot");
// Und die Log-Ausgabe wurde befüllt?
const logValue = document.getElementById("analysis-log").value;
expect(logValue).toMatch(/Starte Berechnung/);
});
});

View File

@@ -0,0 +1,69 @@
/**
* @jest-environment jsdom
*/
const fs = require("fs");
const path = require("path");
describe("calculate() Snapshot Tests", () => {
let calculate;
let snapshotFile;
beforeEach(() => {
// Standard: irgendeine Datei setzen, falls Test nichts setzt
snapshotFile = "snapshot_default.csv";
// DOM erzeugen
document.body.innerHTML = `
<textarea id="analysis-log"></textarea>
`;
// Fetch dynamisch mocken
global.fetch = jest.fn(async () => {
const csvPath = path.join(__dirname, "snapshots", snapshotFile);
const csvContent = fs.readFileSync(csvPath, "utf8");
return {
ok: true,
headers: { get: () => "text/csv" },
text: async () => csvContent
};
});
// Modul erst JETZT laden (DOM existiert)
({ calculate } = require("../public/calculateActions.js"));
});
// ✅ Beispiel 1: Die Datei aus deiner Frage
test("Snapshot 1774805028717 wird korrekt geladen", async () => {
snapshotFile = "snapshot_video0_1774805028717_two_cam.csv";
await calculate();
expect(global.fetch).toHaveBeenCalledWith("/api/latest-snapshot");
const logValue = document.getElementById("analysis-log").value;
expect(logValue).toMatch(/Starte Berechnung/);
expect(logValue).toMatch(/CSV-Daten geladen/);
});
test("Snapshot 1774805028717 wird korrekt geladen", async () => {
snapshotFile = "snapshot_video0_1774805686335_two_cam.csv";
await calculate();
expect(global.fetch).toHaveBeenCalledWith("/api/latest-snapshot");
const logValue = document.getElementById("analysis-log").value;
console.log("Log Value:", logValue);
//expect(logValue).toMatch(/Starte Berechnung/);
//expect(logValue).toMatch(/CSV-Daten geladen/);
});
});

11
test/script.app.test.js Executable file
View File

@@ -0,0 +1,11 @@
const Robot = require('../public/calculateActions.js');
test('Initialisiere den Robot', () => {
expect(1).toBeCloseTo(1,0.002);
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

View File

@@ -0,0 +1,23 @@
id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg,seen_by
camera 0,-198.55,-574.88,605.48,-119.998,-3.362,-46.065
camera 1,439.54,-251.14,1221.89,-169.082,-0.086,12.553
0,421.50,-55.57,-46.63,-1.001,-1.439,-0.785,1
197,299.45,-54.50,238.41,89.394,46.246,-92.119,1
198,334.04,37.19,170.91,-47.532,-1.029,-2.059,2
200,306.82,20.89,79.86,-2.041,-1.266,-1.456,1
201,232.21,50.96,108.11,89.248,0.519,-89.480,1
204,270.03,127.66,127.64,-2.061,1.052,-3.064,3
205,832.06,-81.54,-51.73,11.882,-33.965,-4.934,2
207,828.10,12.10,-39.10,-6.647,-8.281,-0.602,2
208,499.74,-90.28,-0.04,-3.040,-0.827,-2.241,3
210,-3.26,-1.32,0.71,-2.059,-0.430,-0.987,3
211,200.17,0.67,-0.99,1.422,0.160,0.337,3
212,424.55,-285.94,138.04,-10.919,-15.734,95.257,1
214,430.34,23.67,-25.81,-3.547,-1.249,-3.148,1
215,199.29,-89.75,-0.84,0.737,-0.157,-0.372,3
217,615.81,16.20,-60.07,0.672,-9.464,-2.941,2
218,425.58,-181.47,241.75,15.496,-0.251,-4.328,3
219,424.57,-285.12,211.11,122.813,-50.892,-106.050,3
226,430.02,-72.04,274.33,14.302,2.141,-3.323,3
229,338.53,-38.42,277.31,-48.735,-1.345,-1.155,2
243,337.27,-87.10,267.97,97.379,-32.331,-83.485,3
1 id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg,seen_by
2 camera 0,-198.55,-574.88,605.48,-119.998,-3.362,-46.065
3 camera 1,439.54,-251.14,1221.89,-169.082,-0.086,12.553
4 0,421.50,-55.57,-46.63,-1.001,-1.439,-0.785,1
5 197,299.45,-54.50,238.41,89.394,46.246,-92.119,1
6 198,334.04,37.19,170.91,-47.532,-1.029,-2.059,2
7 200,306.82,20.89,79.86,-2.041,-1.266,-1.456,1
8 201,232.21,50.96,108.11,89.248,0.519,-89.480,1
9 204,270.03,127.66,127.64,-2.061,1.052,-3.064,3
10 205,832.06,-81.54,-51.73,11.882,-33.965,-4.934,2
11 207,828.10,12.10,-39.10,-6.647,-8.281,-0.602,2
12 208,499.74,-90.28,-0.04,-3.040,-0.827,-2.241,3
13 210,-3.26,-1.32,0.71,-2.059,-0.430,-0.987,3
14 211,200.17,0.67,-0.99,1.422,0.160,0.337,3
15 212,424.55,-285.94,138.04,-10.919,-15.734,95.257,1
16 214,430.34,23.67,-25.81,-3.547,-1.249,-3.148,1
17 215,199.29,-89.75,-0.84,0.737,-0.157,-0.372,3
18 217,615.81,16.20,-60.07,0.672,-9.464,-2.941,2
19 218,425.58,-181.47,241.75,15.496,-0.251,-4.328,3
20 219,424.57,-285.12,211.11,122.813,-50.892,-106.050,3
21 226,430.02,-72.04,274.33,14.302,2.141,-3.323,3
22 229,338.53,-38.42,277.31,-48.735,-1.345,-1.155,2
23 243,337.27,-87.10,267.97,97.379,-32.331,-83.485,3

View File

@@ -0,0 +1,306 @@
{
"metadata": {
"timestamp": "2026-03-29 17:23:48",
"reference_markers": [
210,
211,
215,
208
],
"dict": "DICT_4X4_250",
"marker_size_mm": 25.0,
"rms_refs_px_cam1": 3.1483856128639642,
"rms_refs_px_cam2": 2.2950821261825323,
"description": "Two-camera joint optimization with triangulation"
},
"cameras": [
{
"id": "camera1",
"position_mm": [
-198.5534591078992,
-574.8837317531312,
605.4764136901209
],
"orientation_deg": {
"roll": -119.9979221455135,
"pitch": -3.361954832012296,
"yaw": -46.064929340376
}
},
{
"id": "camera2",
"position_mm": [
439.53733389783616,
-251.13843656526464,
1221.8883528434949
],
"orientation_deg": {
"roll": -169.08213944509615,
"pitch": -0.08578717176474643,
"yaw": 12.552633762458909
}
}
],
"markers": [
{
"id": 0,
"position_mm": [
421.497570192294,
-55.57206425763417,
-46.62650021879844
],
"orientation_deg": {
"roll": -1.0011695823129092,
"pitch": -1.4385005382491167,
"yaw": -0.7852029124331451
}
},
{
"id": 197,
"position_mm": [
299.4535676953293,
-54.49889795245322,
238.40646915423125
],
"orientation_deg": {
"roll": 89.39394128440566,
"pitch": 46.24596088146432,
"yaw": -92.11915884598805
}
},
{
"id": 198,
"position_mm": [
334.03526806440357,
37.18945399399215,
170.91390948544705
],
"orientation_deg": {
"roll": -47.53205606713346,
"pitch": -1.028881043591787,
"yaw": -2.059171917635105
}
},
{
"id": 200,
"position_mm": [
306.82491872539794,
20.89370950041736,
79.86468986642149
],
"orientation_deg": {
"roll": -2.0413392455149677,
"pitch": -1.2658978174261546,
"yaw": -1.4562090601035258
}
},
{
"id": 201,
"position_mm": [
232.21088939431485,
50.958311249231556,
108.10540186805451
],
"orientation_deg": {
"roll": 89.24788985873607,
"pitch": 0.518506929474415,
"yaw": -89.48009707792058
}
},
{
"id": 204,
"position_mm": [
270.0261535644531,
127.65538787841797,
127.64105224609375
],
"orientation_deg": {
"roll": -2.0605971334171604,
"pitch": 1.0515252790646048,
"yaw": -3.063585358089787
}
},
{
"id": 205,
"position_mm": [
832.0550981037926,
-81.54454317181408,
-51.73260223730281
],
"orientation_deg": {
"roll": 11.882327259987818,
"pitch": -33.96488300167612,
"yaw": -4.93443853686945
}
},
{
"id": 207,
"position_mm": [
828.100422905748,
12.102493324081308,
-39.098605699220634
],
"orientation_deg": {
"roll": -6.646870371262248,
"pitch": -8.28133094834541,
"yaw": -0.6017318938035872
}
},
{
"id": 208,
"position_mm": [
499.7449035644531,
-90.2832260131836,
-0.04276130720973015
],
"orientation_deg": {
"roll": -3.0396356969473004,
"pitch": -0.8267615007277012,
"yaw": -2.2413316533442433
}
},
{
"id": 210,
"position_mm": [
-3.26405930519104,
-1.319172739982605,
0.7130338549613953
],
"orientation_deg": {
"roll": -2.0591435666988205,
"pitch": -0.43045369795049543,
"yaw": -0.9868936242600147
}
},
{
"id": 211,
"position_mm": [
200.1726531982422,
0.6733449697494507,
-0.9862672090530396
],
"orientation_deg": {
"roll": 1.4215428496562512,
"pitch": 0.15965239351235874,
"yaw": 0.33664325294552827
}
},
{
"id": 212,
"position_mm": [
424.550989840629,
-285.94308325374857,
138.04419220989095
],
"orientation_deg": {
"roll": -10.918607351995336,
"pitch": -15.733978052340113,
"yaw": 95.256846374067
}
},
{
"id": 214,
"position_mm": [
430.3419627953026,
23.67400821444532,
-25.806163858915543
],
"orientation_deg": {
"roll": -3.5468569803712295,
"pitch": -1.2485049099791372,
"yaw": -3.1483385783624764
}
},
{
"id": 215,
"position_mm": [
199.28892517089844,
-89.74830627441406,
-0.8404992818832397
],
"orientation_deg": {
"roll": 0.737387143866972,
"pitch": -0.15724191017801245,
"yaw": -0.371839082482268
}
},
{
"id": 217,
"position_mm": [
615.8130774181891,
16.20446254259722,
-60.06662726295375
],
"orientation_deg": {
"roll": 0.6717936238384021,
"pitch": -9.46376021014515,
"yaw": -2.9413945791573384
}
},
{
"id": 218,
"position_mm": [
425.58099365234375,
-181.46868896484375,
241.7543487548828
],
"orientation_deg": {
"roll": 15.495591743273698,
"pitch": -0.2514514448527122,
"yaw": -4.3283770612790695
}
},
{
"id": 219,
"position_mm": [
424.5723876953125,
-285.1210021972656,
211.11253356933594
],
"orientation_deg": {
"roll": 122.81265946195276,
"pitch": -50.8921992151385,
"yaw": -106.05002135249786
}
},
{
"id": 226,
"position_mm": [
430.0244140625,
-72.04154205322266,
274.3302001953125
],
"orientation_deg": {
"roll": 14.302011026913553,
"pitch": 2.1412609563541465,
"yaw": -3.3233859905698604
}
},
{
"id": 229,
"position_mm": [
338.5275592571014,
-38.416705349163024,
277.31203539654547
],
"orientation_deg": {
"roll": -48.73538297260418,
"pitch": -1.3454103063815392,
"yaw": -1.1550554551861798
}
},
{
"id": 243,
"position_mm": [
337.2650146484375,
-87.10299682617188,
267.9662170410156
],
"orientation_deg": {
"roll": 97.37931808647662,
"pitch": -32.33084315486534,
"yaw": -83.48522327067147
}
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

View File

@@ -0,0 +1,22 @@
id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg,seen_by
camera 0,-185.40,-581.99,603.87,-120.131,-2.626,-45.383
camera 1,467.51,-292.61,1191.24,-166.730,0.915,12.565
0,398.53,-70.91,-26.66,111.188,-45.942,-62.166,1
197,304.96,-50.57,233.61,87.898,46.199,-91.087,1
198,333.30,36.74,145.52,-45.643,0.998,-0.162,2
200,290.89,3.22,94.98,-1.210,0.027,0.407,1
201,248.13,75.85,88.30,85.853,0.649,-89.866,1
204,269.72,123.85,127.19,-2.695,2.024,-0.930,3
205,830.60,-74.35,-98.17,-0.513,-9.166,-0.176,2
207,825.39,17.97,-75.50,-4.443,-3.238,-0.202,2
208,496.76,-79.84,-70.67,-6.074,-4.507,1.479,2
210,-3.01,-0.68,0.45,2.414,0.181,-0.341,3
211,199.46,0.21,-0.79,-1.120,1.447,-0.774,3
212,439.16,-277.25,123.68,-93.841,-23.505,106.089,1
215,199.39,-90.08,-0.81,-4.815,2.300,-0.118,3
217,600.14,1.60,-1.38,-0.707,-2.122,-4.921,3
218,427.06,-186.07,238.99,123.420,-38.993,-95.203,3
219,426.11,-287.37,207.85,17.079,-1.184,-2.408,3
226,431.41,-78.67,271.60,15.767,2.478,-1.405,3
229,342.96,-47.89,265.05,-46.281,0.813,-0.173,2
243,340.07,-93.67,265.75,45.757,2.099,0.088,3
1 id,x_mm,y_mm,z_mm,roll_deg,pitch_deg,yaw_deg,seen_by
2 camera 0,-185.40,-581.99,603.87,-120.131,-2.626,-45.383
3 camera 1,467.51,-292.61,1191.24,-166.730,0.915,12.565
4 0,398.53,-70.91,-26.66,111.188,-45.942,-62.166,1
5 197,304.96,-50.57,233.61,87.898,46.199,-91.087,1
6 198,333.30,36.74,145.52,-45.643,0.998,-0.162,2
7 200,290.89,3.22,94.98,-1.210,0.027,0.407,1
8 201,248.13,75.85,88.30,85.853,0.649,-89.866,1
9 204,269.72,123.85,127.19,-2.695,2.024,-0.930,3
10 205,830.60,-74.35,-98.17,-0.513,-9.166,-0.176,2
11 207,825.39,17.97,-75.50,-4.443,-3.238,-0.202,2
12 208,496.76,-79.84,-70.67,-6.074,-4.507,1.479,2
13 210,-3.01,-0.68,0.45,2.414,0.181,-0.341,3
14 211,199.46,0.21,-0.79,-1.120,1.447,-0.774,3
15 212,439.16,-277.25,123.68,-93.841,-23.505,106.089,1
16 215,199.39,-90.08,-0.81,-4.815,2.300,-0.118,3
17 217,600.14,1.60,-1.38,-0.707,-2.122,-4.921,3
18 218,427.06,-186.07,238.99,123.420,-38.993,-95.203,3
19 219,426.11,-287.37,207.85,17.079,-1.184,-2.408,3
20 226,431.41,-78.67,271.60,15.767,2.478,-1.405,3
21 229,342.96,-47.89,265.05,-46.281,0.813,-0.173,2
22 243,340.07,-93.67,265.75,45.757,2.099,0.088,3

View File

@@ -0,0 +1,292 @@
{
"metadata": {
"timestamp": "2026-03-29 17:34:46",
"reference_markers": [
210,
211,
215
],
"dict": "DICT_4X4_250",
"marker_size_mm": 25.0,
"rms_refs_px_cam1": 3.41007001464858,
"rms_refs_px_cam2": 2.385150259058859,
"description": "Two-camera joint optimization with triangulation"
},
"cameras": [
{
"id": "camera1",
"position_mm": [
-185.40187218036752,
-581.9944282864382,
603.8667104404894
],
"orientation_deg": {
"roll": -120.13121852727805,
"pitch": -2.6261270533805434,
"yaw": -45.383124607048785
}
},
{
"id": "camera2",
"position_mm": [
467.5130086931513,
-292.6077318399514,
1191.2416834181959
],
"orientation_deg": {
"roll": -166.72976006250673,
"pitch": 0.9152774108444052,
"yaw": 12.56459592314977
}
}
],
"markers": [
{
"id": 0,
"position_mm": [
398.5318175160789,
-70.91489527107908,
-26.659229208852775
],
"orientation_deg": {
"roll": 111.18758158679404,
"pitch": -45.94173410048127,
"yaw": -62.165896812131365
}
},
{
"id": 197,
"position_mm": [
304.9640907573614,
-50.57430819811848,
233.60632196604885
],
"orientation_deg": {
"roll": 87.89756819345294,
"pitch": 46.19937783422541,
"yaw": -91.08749493800813
}
},
{
"id": 198,
"position_mm": [
333.3034713399685,
36.73693669807787,
145.5217396529158
],
"orientation_deg": {
"roll": -45.64303480135925,
"pitch": 0.9979071119875171,
"yaw": -0.16240772042941656
}
},
{
"id": 200,
"position_mm": [
290.89499328426916,
3.2223893473424248,
94.97812649281046
],
"orientation_deg": {
"roll": -1.2100602060927768,
"pitch": 0.026551533654704255,
"yaw": 0.40658831973457815
}
},
{
"id": 201,
"position_mm": [
248.13348964322145,
75.84598171122636,
88.299101303411
],
"orientation_deg": {
"roll": 85.85335072850049,
"pitch": 0.64922594274481,
"yaw": -89.86614370597515
}
},
{
"id": 204,
"position_mm": [
269.7163391113281,
123.84618377685547,
127.19367218017578
],
"orientation_deg": {
"roll": -2.6954436134109825,
"pitch": 2.0244839660111547,
"yaw": -0.9299069778014554
}
},
{
"id": 205,
"position_mm": [
830.6007069844993,
-74.34605580833342,
-98.17264139464
],
"orientation_deg": {
"roll": -0.5130781560504438,
"pitch": -9.166300522203352,
"yaw": -0.17584024311263521
}
},
{
"id": 207,
"position_mm": [
825.3874424189697,
17.96879847969968,
-75.49809573698707
],
"orientation_deg": {
"roll": -4.44327897845073,
"pitch": -3.238111308510186,
"yaw": -0.20160606142268056
}
},
{
"id": 208,
"position_mm": [
496.75959160074103,
-79.84127487562107,
-70.66775488245102
],
"orientation_deg": {
"roll": -6.073632283820795,
"pitch": -4.507425132564154,
"yaw": 1.4792269994598706
}
},
{
"id": 210,
"position_mm": [
-3.0138065814971924,
-0.678738534450531,
0.45043471455574036
],
"orientation_deg": {
"roll": 2.414449169602765,
"pitch": 0.1809737107910865,
"yaw": -0.3414386863951135
}
},
{
"id": 211,
"position_mm": [
199.4597930908203,
0.21385280787944794,
-0.7928330302238464
],
"orientation_deg": {
"roll": -1.119893404388961,
"pitch": 1.4474597648072751,
"yaw": -0.7742016884447679
}
},
{
"id": 212,
"position_mm": [
439.1649778866701,
-277.25357777266765,
123.68324860605401
],
"orientation_deg": {
"roll": -93.84074184130749,
"pitch": -23.5054055358065,
"yaw": 106.08926278915582
}
},
{
"id": 215,
"position_mm": [
199.39073181152344,
-90.08377838134766,
-0.809878408908844
],
"orientation_deg": {
"roll": -4.814693827078688,
"pitch": 2.299599571500613,
"yaw": -0.11785288901288943
}
},
{
"id": 217,
"position_mm": [
600.1417846679688,
1.5975708961486816,
-1.3759942054748535
],
"orientation_deg": {
"roll": -0.7071546421106334,
"pitch": -2.122329324581887,
"yaw": -4.920889252430072
}
},
{
"id": 218,
"position_mm": [
427.06304931640625,
-186.07424926757812,
238.98736572265625
],
"orientation_deg": {
"roll": 123.41956369599184,
"pitch": -38.992806364448,
"yaw": -95.20312117684792
}
},
{
"id": 219,
"position_mm": [
426.1131896972656,
-287.3703308105469,
207.84825134277344
],
"orientation_deg": {
"roll": 17.07868628969044,
"pitch": -1.1839097705529142,
"yaw": -2.4082096021343276
}
},
{
"id": 226,
"position_mm": [
431.4140319824219,
-78.66934204101562,
271.60076904296875
],
"orientation_deg": {
"roll": 15.767130467572532,
"pitch": 2.4775797959852417,
"yaw": -1.4048573574098884
}
},
{
"id": 229,
"position_mm": [
342.95897889479266,
-47.89148521151937,
265.0497038286498
],
"orientation_deg": {
"roll": -46.280927697563094,
"pitch": 0.8131470064933919,
"yaw": -0.17279246998694386
}
},
{
"id": 243,
"position_mm": [
340.0707702636719,
-93.67367553710938,
265.75042724609375
],
"orientation_deg": {
"roll": 45.75661125155785,
"pitch": 2.099169532534845,
"yaw": 0.08824090290907403
}
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB