Files
appRobotHoming/test/fkStateToDriverG92.test.js
2026-06-26 22:01:02 +02:00

92 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* fkStateToDriverG92.test.js
* Unit-Tests für server/fkStateToDriverG92.cjs
*
* Sichert ab, dass der FK-State korrekt in die Driver-G92-Konvention umgerechnet
* wird — insbesondere B = 180 + b (nicht 180 b, was Hand in die falsche
* Richtung knickt, siehe doc/Homing_8_G92_B_Flip.md).
*/
const { fkStateToDriverG92 } = require('../server/fkStateToDriverG92.cjs');
describe('fkStateToDriverG92', () => {
describe('B-Achse (Hand-Knick)', () => {
test('gerade Hand (b=0) → B = 180', () => {
expect(fkStateToDriverG92({ b: 0 }).b).toBeCloseTo(180, 5);
});
test('b=70.14° → B = 109.86° (Beweis aus doc: Hand nach oben)', () => {
// Beweisdaten aus Homing_8_G92_B_Flip.md: falsch wäre 250.14, richtig 109.86
expect(fkStateToDriverG92({ b: -70.14 }).b).toBeCloseTo(109.86, 2);
});
test('b=8.16° → B ≈ 171.84° (Gegenprobe mit realem Driver-IK-Wert 170.78°)', () => {
// Driver-IK lieferte 170.78° für dieselbe Pose; 180 + (8.16) = 171.84 ≈ 170.78 ✓
expect(fkStateToDriverG92({ b: -8.16 }).b).toBeCloseTo(171.84, 2);
});
test('b fehlt (null) → b wird nicht gesetzt', () => {
const result = fkStateToDriverG92({ b: null, x: 10 });
expect(result.b).toBeNull();
expect(result.x).toBe(10);
});
test('b fehlt (undefined) → b bleibt undefined', () => {
const result = fkStateToDriverG92({ x: 5 });
expect(result.b).toBeUndefined();
});
});
describe('C-Achse (Palm-Roll)', () => {
test('c=0 (neutral) → C = 90', () => {
expect(fkStateToDriverG92({ c: 0 }).c).toBeCloseTo(90, 5);
});
test('c=64.9° → C ≈ 25.1°', () => {
expect(fkStateToDriverG92({ c: -64.9 }).c).toBeCloseTo(25.1, 1);
});
test('c fehlt (null) → c wird nicht verändert', () => {
expect(fkStateToDriverG92({ c: null }).c).toBeNull();
});
});
describe('Z-Achse (Ellbogen, relativ → absolut)', () => {
test('y + z ergibt absoluten Beta-Winkel', () => {
expect(fkStateToDriverG92({ y: 35, z: -30 }).z).toBeCloseTo(5, 5);
});
test('z fehlt (null) → z wird nicht umgerechnet', () => {
const result = fkStateToDriverG92({ y: 35, z: null });
expect(result.z).toBeNull();
});
test('y fehlt → z wird nicht umgerechnet', () => {
const result = fkStateToDriverG92({ z: -30 });
expect(result.z).toBe(-30);
});
});
describe('Alle Achsen kombiniert (typischer 4b-State)', () => {
test('vollständiger State mit allen Konvertierungen', () => {
const input = { x: 192.73, y: 35.99, z: -30.88, a: -1.70, b: 12.34 };
const result = fkStateToDriverG92(input);
expect(result.x).toBeCloseTo(192.73, 2);
expect(result.y).toBeCloseTo(35.99, 2);
expect(result.z).toBeCloseTo(35.99 + (-30.88), 2); // absolut
expect(result.a).toBeCloseTo(-1.70, 2);
expect(result.b).toBeCloseTo(180 + 12.34, 2); // 192.34
});
test('Input-Objekt bleibt unverändert (kein Seiteneffekt)', () => {
const input = { b: -70, c: 0, y: 10, z: -5 };
fkStateToDriverG92(input);
expect(input.b).toBe(-70);
expect(input.c).toBe(0);
expect(input.z).toBe(-5);
});
});
});