Die Phase-2-Umstellung (Commits549d10b,2197a89) war falsch: sie machte gerade Hand = b=0. Hardware-Daten zeigen aber gerade = B~180 (z.B. G92 ... B179.20). Folge: G28 fuhr nach b=0 -> ~179 Grad Einklappen -> Hand schlug in den Arm (Crash). Zurueck auf den verifizierten Stand933a017: - IK: this.b = Math.acos(cosB) - FK: rotateAroundAxis(vecUnterarm, n, this.b) - G28: robot.b = Math.PI Verifiziert mit echten Daten: G92 B179.20 -> b=179.20; G28 -> b=180 (Weg 0.8 Grad, kein Slam); IK-Round-Trip exakt; 452/452 Tests gruen. Logs nicht enthalten. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
139 lines
3.7 KiB
JavaScript
139 lines
3.7 KiB
JavaScript
const GCode = require('../robot/GCode')
|
||
const createDummyRobot = require('./helpers/createDummyRobot')
|
||
|
||
describe('GCode.receiveGCode', () => {
|
||
|
||
test('G90 setzt Absolutmodus', () => {
|
||
const robot = createDummyRobot()
|
||
|
||
robot.moveRelative = true
|
||
|
||
GCode.receiveGCode(robot, 'G90')
|
||
|
||
expect(robot.moveRelative).toBe(false)
|
||
expect(robot.calculateAngles3D).not.toHaveBeenCalled()
|
||
expect(robot.sendCommand).not.toHaveBeenCalled()
|
||
})
|
||
|
||
test('G91 setzt Relativmodus', () => {
|
||
const robot = createDummyRobot()
|
||
|
||
GCode.receiveGCode(robot, 'G91')
|
||
|
||
expect(robot.moveRelative).toBe(true)
|
||
})
|
||
|
||
test('G1 absolut setzt Koordinaten', () => {
|
||
const robot = createDummyRobot()
|
||
|
||
GCode.receiveGCode(robot, 'G90 G1 X10 Y20 Z30')
|
||
|
||
expect(robot.x).toBe(10)
|
||
expect(robot.y).toBe(20)
|
||
expect(robot.z).toBe(30)
|
||
|
||
expect(robot.calculateAngles3D).toHaveBeenCalledTimes(1)
|
||
expect(robot.sendCommand).toHaveBeenCalledTimes(1)
|
||
})
|
||
|
||
test('G1 relativ addiert Koordinaten', () => {
|
||
const robot = createDummyRobot()
|
||
robot.moveRelative = true
|
||
robot.x = 5
|
||
robot.y = 5
|
||
|
||
GCode.receiveGCode(robot, 'G1 X2 Y3')
|
||
|
||
expect(robot.x).toBe(7)
|
||
expect(robot.y).toBe(8)
|
||
})
|
||
|
||
test('G1 ignore Jogg', () => {
|
||
const robot = createDummyRobot()
|
||
robot.moveRelative = true
|
||
robot.x = 5
|
||
robot.y = 5
|
||
|
||
GCode.receiveGCode(robot, '$J=G91 G1 X2 Y3')
|
||
|
||
expect(robot.x).toBe(7)
|
||
expect(robot.y).toBe(8)
|
||
})
|
||
|
||
test('G1 ignore Jogg absolute, G21 = mm ist OK', () => {
|
||
const robot = createDummyRobot()
|
||
robot.moveRelative = true
|
||
robot.x = 5
|
||
robot.y = 5
|
||
|
||
GCode.receiveGCode(robot, '$J=G90 G21 G1 X20 Y30')
|
||
|
||
expect(robot.x).toBe(20)
|
||
expect(robot.y).toBe(30)
|
||
})
|
||
|
||
test('M1 relativ verändert Motorwerte', () => {
|
||
const robot = createDummyRobot()
|
||
robot.moveRelative = true
|
||
|
||
GCode.receiveGCode(robot, 'M1 X10 Y20 Z30 A1 B2 C3')
|
||
|
||
expect(robot.xMotor).toBe(10)
|
||
expect(robot.alpha).toBe(20)
|
||
expect(robot.beta).toBe(30)
|
||
|
||
expect(robot.a).toBe(1)
|
||
expect(robot.b).toBe(2)
|
||
expect(robot.c).toBe(3)
|
||
|
||
expect(robot.calculatePositionFromMotorAngles).toHaveBeenCalled()
|
||
expect(robot.sendCommand).toHaveBeenCalled()
|
||
})
|
||
|
||
test('G28 setzt Home-Motorwerte direkt (Singularität), lässt aber den Greifer unangetastet', () => {
|
||
const robot = createDummyRobot()
|
||
robot.e = 7 // vorher gesetzte Greifer-Öffnung ...
|
||
robot.eMotor = 3 // ... darf von G28 NICHT bewegt werden (sonst e−b−c-Slam bei b=π)
|
||
|
||
GCode.receiveGCode(robot, 'G28')
|
||
|
||
// Voll ausgestreckt = Handgelenk-Singularität -> Arm-Motorwerte DIREKT, dann FK (nicht IK).
|
||
expect(robot.xMotor).toBe(0)
|
||
expect(robot.alpha).toBe(0)
|
||
expect(robot.beta).toBe(0)
|
||
expect(robot.a).toBe(0)
|
||
expect(robot.b).toBe(Math.PI) // gerade Hand (Phase-1-Konvention)
|
||
expect(robot.c).toBe(0)
|
||
// Greifer unverändert -> kein Finger-Slam am Anschlag
|
||
expect(robot.e).toBe(7)
|
||
expect(robot.eMotor).toBe(3)
|
||
expect(robot.calculateAngles3D).not.toHaveBeenCalled()
|
||
expect(robot.calculatePositionFromMotorAngles).toHaveBeenCalledTimes(1)
|
||
expect(robot.sendCommand).toHaveBeenCalledTimes(1)
|
||
})
|
||
|
||
test('Sende falsches Format', () =>{
|
||
const robot = createDummyRobot();
|
||
GCode.receiveGCode(robot, 'X324');
|
||
})
|
||
|
||
|
||
test('receiveGCode verarbeitet Buffer korrekt (UTF-8)', () => {
|
||
const robot = createDummyRobot()
|
||
|
||
const buffer = Buffer.from('G90 G1 X12 Y34 Z56', 'utf8')
|
||
|
||
GCode.receiveGCode(robot, buffer)
|
||
|
||
expect(robot.moveRelative).toBe(false)
|
||
|
||
expect(robot.x).toBe(12)
|
||
expect(robot.y).toBe(34)
|
||
expect(robot.z).toBe(56)
|
||
|
||
expect(robot.calculateAngles3D).toHaveBeenCalledTimes(1)
|
||
expect(robot.sendCommand).toHaveBeenCalledTimes(1)
|
||
})
|
||
|
||
|
||
}) |