Flip B
This commit is contained in:
91
test/fkStateToDriverG92.test.js
Normal file
91
test/fkStateToDriverG92.test.js
Normal file
@@ -0,0 +1,91 @@
|
||||
/**
|
||||
* 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);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user